From 52e0ac85db1b1bc7f2670498d019cf982c16d413 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 22 Jun 2011 22:58:51 +0000 Subject: NEVERHOOD: First code with basic detection, nothing else so far --- base/plugins.cpp | 3 + configure | 1 + engines/engines.mk | 5 + engines/neverhood/detection.cpp | 285 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/module.mk | 13 ++ engines/neverhood/neverhood.cpp | 113 ++++++++++++++++ engines/neverhood/neverhood.h | 111 ++++++++++++++++ 7 files changed, 531 insertions(+) create mode 100644 engines/neverhood/detection.cpp create mode 100644 engines/neverhood/module.mk create mode 100644 engines/neverhood/neverhood.cpp create mode 100644 engines/neverhood/neverhood.h diff --git a/base/plugins.cpp b/base/plugins.cpp index 4c2fd2cffc..261ae4ca59 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -136,6 +136,9 @@ public: #if PLUGIN_ENABLED_STATIC(MOHAWK) LINK_PLUGIN(MOHAWK) #endif + #if PLUGIN_ENABLED_STATIC(NEVERHOOD) + LINK_PLUGIN(NEVERHOOD) + #endif #if PLUGIN_ENABLED_STATIC(PARALLACTION) LINK_PLUGIN(PARALLACTION) #endif diff --git a/configure b/configure index 04ca85ffb6..fb3e86927e 100755 --- a/configure +++ b/configure @@ -102,6 +102,7 @@ add_engine mohawk "Mohawk" yes "cstime myst riven" add_engine cstime "Where in Time is Carmen Sandiego?" no add_engine riven "Riven: The Sequel to Myst" no add_engine myst "Myst" no +add_engine neverhood "Neverhood" no add_engine parallaction "Parallaction" yes add_engine queen "Flight of the Amazon Queen" yes add_engine saga "SAGA" yes "ihnm saga2" diff --git a/engines/engines.mk b/engines/engines.mk index dc09fbd54e..fb754ef104 100644 --- a/engines/engines.mk +++ b/engines/engines.mk @@ -116,6 +116,11 @@ DEFINES += -DENABLE_RIVEN endif endif +ifdef ENABLE_NEVERHOOD +DEFINES += -DENABLE_NEVERHOOD=$(ENABLE_NEVERHOOD) +MODULES += engines/neverhood +endif + ifdef ENABLE_PARALLACTION DEFINES += -DENABLE_PARALLACTION=$(ENABLE_PARALLACTION) MODULES += engines/parallaction diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp new file mode 100644 index 0000000000..b80379bc2d --- /dev/null +++ b/engines/neverhood/detection.cpp @@ -0,0 +1,285 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "base/plugins.h" + +#include "engines/advancedDetector.h" +#include "common/file.h" + +#include "neverhood/neverhood.h" + + +namespace Neverhood { + +struct NeverhoodGameDescription { + ADGameDescription desc; + + int gameID; + int gameType; + uint32 features; + uint16 version; +}; + +const char *NeverhoodEngine::getGameId() const { + return _gameDescription->desc.gameid; +} + +uint32 NeverhoodEngine::getFeatures() const { + return _gameDescription->features; +} + +Common::Platform NeverhoodEngine::getPlatform() const { + return _gameDescription->desc.platform; +} + +uint16 NeverhoodEngine::getVersion() const { + return _gameDescription->version; +} + +} + +static const PlainGameDescriptor neverhoodGames[] = { + {"neverhood", "The Neverhood Chronicles"}, + {0, 0} +}; + +namespace Neverhood { + +using Common::GUIO_NONE; +using Common::GUIO_NOSPEECH; + +static const NeverhoodGameDescription gameDescriptions[] = { + + { + // Neverhood English version + // TODO: Maybe additional files are needed to properly detect different versions + { + "neverhood", + 0, + AD_ENTRY1s("hd.blb", "22958d968458c9ff221aee38577bb2b2", 4279716), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_NO_FLAGS, + GUIO_NONE + }, + 0, + 0, + 0, + 0, + }, + + { AD_TABLE_END_MARKER, 0, 0, 0, 0 } +}; + +/** + * The fallback game descriptor used by the Neverhood engine's fallbackDetector. + * Contents of this struct are to be overwritten by the fallbackDetector. + */ +static NeverhoodGameDescription g_fallbackDesc = { + { + "", + "", + AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor + Common::UNK_LANG, + Common::kPlatformPC, + ADGF_NO_FLAGS, + GUIO_NONE + }, + 0, + 0, + 0, + 0, +}; + +} // End of namespace Neverhood + +class NeverhoodMetaEngine : public AdvancedMetaEngine { +public: + NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) { + _singleid = "neverhood"; + } + + virtual const char *getName() const { + return "Neverhood Engine"; + } + + virtual const char *getOriginalCopyright() const { + return "Neverhood Engine (C) Infogrames"; + } + + virtual bool hasFeature(MetaEngineFeature f) const; + virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; + +#if 0 // Not used yet but let's keep it for later when it is + SaveStateList listSaves(const char *target) const; + virtual int getMaximumSaveSlot() const; + void removeSaveState(const char *target, int slot) const; + SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; +#endif + + const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const; + +}; + +bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const { + return + false; // Nothing yet :( +// (f == kSupportsListSaves) || +// (f == kSupportsLoadingDuringStartup) || +// (f == kSupportsDeleteSave) || +// (f == kSavesSupportMetaInfo) || +// (f == kSavesSupportThumbnail); +} + +bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const { + return + false; // Nothing yet :( +// (f == kSupportsRTL) || // TODO: Not yet... +// (f == kSupportsLoadingDuringRuntime) || +// (f == kSupportsSavingDuringRuntime); +} + +bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { + const Neverhood::NeverhoodGameDescription *gd = (const Neverhood::NeverhoodGameDescription *)desc; + if (gd) { + *engine = new Neverhood::NeverhoodEngine(syst, gd); + } + return gd != 0; +} + +const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSList &fslist) const { + // Set the default values for the fallback descriptor's ADGameDescription part. + Neverhood::g_fallbackDesc.desc.language = Common::UNK_LANG; + Neverhood::g_fallbackDesc.desc.platform = Common::kPlatformPC; + Neverhood::g_fallbackDesc.desc.flags = ADGF_NO_FLAGS; + + // Set default values for the fallback descriptor's NeverhoodGameDescription part. + Neverhood::g_fallbackDesc.gameID = 0; + Neverhood::g_fallbackDesc.features = 0; + Neverhood::g_fallbackDesc.version = 3; + + return NULL; +} + +#if 0 // Not used yet but let's keep it for later when it is + +SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Neverhood::NeverhoodEngine::SaveHeader header; + Common::String pattern = target; + pattern += ".???"; + + Common::StringArray filenames; + filenames = saveFileMan->listSavefiles(pattern.c_str()); + Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) + + SaveStateList saveList; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) { + // Obtain the last 3 digits of the filename, since they correspond to the save slot + int slotNum = atoi(file->c_str() + file->size() - 3); + + if (slotNum >= 0 && slotNum <= 999) { + Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); + if (in) { + if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) { + saveList.push_back(SaveStateDescriptor(slotNum, header.description)); + } + delete in; + } + } + } + + return saveList; +} + +int NeverhoodMetaEngine::getMaximumSaveSlot() const { + return 999; +} + +void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const { + // Slot 0 can't be deleted, it's for restarting the game(s) + if (slot == 0) + return; + + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot); + + saveFileMan->removeSavefile(filename.c_str()); + + Common::StringArray filenames; + Common::String pattern = target; + pattern += ".???"; + filenames = saveFileMan->listSavefiles(pattern.c_str()); + Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) + + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { + // Obtain the last 3 digits of the filename, since they correspond to the save slot + int slotNum = atoi(file->c_str() + file->size() - 3); + + // Rename every slot greater than the deleted slot, + // Also do not rename quicksaves. + if (slotNum > slot && slotNum < 990) { + // FIXME: Our savefile renaming done here is inconsitent with what we do in + // GUI_v2::deleteMenu. While here we rename every slot with a greater equal + // number of the deleted slot to deleted slot, deleted slot + 1 etc., + // we only rename the following slots in GUI_v2::deleteMenu until a slot + // is missing. + saveFileMan->renameSavefile(file->c_str(), filename.c_str()); + + filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot); + } + } + +} + +SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, int slot) const { + Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot); + Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(filename.c_str()); + + if (in) { + Neverhood::NeverhoodEngine::SaveHeader header; + Neverhood::NeverhoodEngine::kReadSaveHeaderError error; + + error = Neverhood::NeverhoodEngine::readSaveHeader(in, true, header); + delete in; + + if (error == Neverhood::NeverhoodEngine::kRSHENoError) { + SaveStateDescriptor desc(slot, header.description); + + desc.setDeletableFlag(false); + desc.setWriteProtectedFlag(false); + desc.setThumbnail(header.thumbnail); + + return desc; + } + } + + return SaveStateDescriptor(); +} + +#endif + +#if PLUGIN_ENABLED_DYNAMIC(NEVERHOOD) + REGISTER_PLUGIN_DYNAMIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine); +#else + REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine); +#endif diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk new file mode 100644 index 0000000000..d46d6a67ba --- /dev/null +++ b/engines/neverhood/module.mk @@ -0,0 +1,13 @@ +MODULE := engines/neverhood + +MODULE_OBJS = \ + detection.o \ + neverhood.o + +# This module can be built as a plugin +ifdef BUILD_PLUGINS +PLUGIN := 1 +endif + +# Include common rules +include $(srcdir)/rules.mk diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp new file mode 100644 index 0000000000..9c464b9a83 --- /dev/null +++ b/engines/neverhood/neverhood.cpp @@ -0,0 +1,113 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/algorithm.h" +#include "common/events.h" +#include "common/keyboard.h" +#include "common/file.h" +#include "common/random.h" +#include "common/savefile.h" +#include "common/config-manager.h" + +#include "base/plugins.h" +#include "base/version.h" + +#include "graphics/cursorman.h" + +#include "engines/util.h" + +#include "audio/mididrv.h" +#include "audio/mixer.h" + +#include "neverhood/neverhood.h" + +namespace Neverhood { + +NeverhoodEngine::NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc) : Engine(syst), _gameDescription(gameDesc) { + // Setup mixer + if (!_mixer->isReady()) { + warning("Sound initialization failed."); + } + + _mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume")); + _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume")); + + _rnd = new Common::RandomSource("neverhood"); + +} + +NeverhoodEngine::~NeverhoodEngine() { + delete _rnd; +} + +Common::Error NeverhoodEngine::run() { + // Initialize backend + _system->beginGFXTransaction(); + initCommonGFX(false); + _system->initSize(640, 480); + _system->endGFXTransaction(); + + _isSaveAllowed = false; + + return Common::kNoError; +} + +void NeverhoodEngine::updateEvents() { + Common::Event event; + Common::EventManager *eventMan = _system->getEventManager(); + + while (eventMan->pollEvent(event)) { + switch (event.type) { + case Common::EVENT_KEYDOWN: + _keyState = event.kbd.keycode; + break; + case Common::EVENT_KEYUP: + _keyState = Common::KEYCODE_INVALID; + break; + case Common::EVENT_MOUSEMOVE: + _mouseX = event.mouse.x; + _mouseY = event.mouse.y; + break; + /* + case Common::EVENT_LBUTTONDOWN: + _buttonState |= kLeftButton; + break; + case Common::EVENT_LBUTTONUP: + _buttonState &= ~kLeftButton; + break; + case Common::EVENT_RBUTTONDOWN: + _buttonState |= kRightButton; + break; + case Common::EVENT_RBUTTONUP: + _buttonState &= ~kRightButton; + break; + case Common::EVENT_QUIT: + _system->quit(); + break; + */ + default: + break; + } + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h new file mode 100644 index 0000000000..c17116d2dd --- /dev/null +++ b/engines/neverhood/neverhood.h @@ -0,0 +1,111 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_H +#define NEVERHOOD_H + +#include "common/scummsys.h" +#include "common/events.h" +#include "common/keyboard.h" +#include "common/random.h" +#include "common/savefile.h" +#include "common/system.h" + +#include "audio/mixer.h" + +#include "graphics/surface.h" + +#include "engines/engine.h" + +namespace Neverhood { + +enum NeverhoodGameFeatures { +}; + +struct NeverhoodGameDescription; + +class NeverhoodEngine : public ::Engine { +protected: + + Common::Error run(); + +public: + NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc); + virtual ~NeverhoodEngine(); + + // Detection related functions + const NeverhoodGameDescription *_gameDescription; + const char *getGameId() const; + uint32 getFeatures() const; + uint16 getVersion() const; + Common::Platform getPlatform() const; + bool hasFeature(EngineFeature f) const; + + Common::RandomSource *_rnd; + + int _mouseX, _mouseY; + Common::KeyCode _keyState; + uint16 _buttonState; + + void updateEvents(); + +public: + + /* Save/load */ + + enum kReadSaveHeaderError { + kRSHENoError = 0, + kRSHEInvalidType = 1, + kRSHEInvalidVersion = 2, + kRSHEIoError = 3 + }; + + struct SaveHeader { + Common::String description; + uint32 version; + byte gameID; + uint32 flags; + Graphics::Surface *thumbnail; + }; + + bool _isSaveAllowed; + + bool canLoadGameStateCurrently() { return _isSaveAllowed; } + bool canSaveGameStateCurrently() { return _isSaveAllowed; } + +#if 0 // Not used yet but let's keep it for later when it is + Common::Error loadGameState(int slot); + Common::Error saveGameState(int slot, const Common::String &description); + void savegame(const char *filename, const char *description); + void loadgame(const char *filename); + const char *getSavegameFilename(int num); + static Common::String getSavegameFilename(const Common::String &target, int num); + static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header); +#endif + +public: + +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_H */ -- cgit v1.2.3 From 3b00cfa669a94490e727b065f14fb9216d43351c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 24 Jun 2011 13:12:42 +0000 Subject: NEVERHOOD: Start with the blb archive class --- engines/neverhood/blbarchive.cpp | 107 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/blbarchive.h | 66 ++++++++++++++++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/neverhood.cpp | 9 +++- engines/neverhood/neverhood.h | 2 +- 5 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 engines/neverhood/blbarchive.cpp create mode 100644 engines/neverhood/blbarchive.h diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp new file mode 100644 index 0000000000..48452efa8b --- /dev/null +++ b/engines/neverhood/blbarchive.cpp @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "common/dcl.h" +#include "neverhood/blbarchive.h" + +namespace Neverhood { + +BlbArchive::BlbArchive() : _extData(NULL) { +} + +BlbArchive::~BlbArchive() { + delete[] _extData; +} + +void BlbArchive::open(const Common::String &filename) { + BlbHeader header; + + _entries.clear(); + + if (!_fd.open(filename)) + error("BlbArchive::open() Could not open %s", filename.c_str()); + + header.id1 = _fd.readUint32LE(); + header.id2 = _fd.readUint16LE(); + header.extDataSize = _fd.readUint16LE(); + header.fileSize = _fd.readUint32LE(); + header.fileCount = _fd.readUint32LE(); + + if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size()) + error("BlbArchive::open() %s seems to be corrupt", filename.c_str()); + + debug("fileCount = %d", header.fileCount); + + _entries.reserve(header.fileCount); + + // Load file hashes + for (uint i = 0; i < header.fileCount; i++) { + BlbArchiveEntry entry; + entry.fileHash = _fd.readUint32LE(); + _entries.push_back(entry); + } + + // Load file records + for (uint i = 0; i < header.fileCount; i++) { + BlbArchiveEntry &entry = _entries[i]; + entry.type = _fd.readByte(); + entry.comprType = _fd.readByte(); + entry.extDataOfs = _fd.readUint16LE(); + entry.timeStamp = _fd.readUint32LE(); + entry.offset = _fd.readUint32LE(); + entry.diskSize = _fd.readUint32LE(); + entry.size = _fd.readUint32LE(); + debug("%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X", + entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp, + entry.offset, entry.diskSize, entry.size); + } + + // Load ext data + if (header.extDataSize > 0) { + _extData = new byte[header.extDataSize]; + _fd.read(_extData, header.extDataSize); + } + +} + +void BlbArchive::load(uint index, byte *buffer, uint32 size) { + + BlbArchiveEntry &entry = _entries[index]; + + _fd.seek(entry.offset); + + switch (entry.comprType) { + case 1: // Uncompressed + if (size == 0) + size = entry.diskSize; + _fd.read(buffer, size); + break; + case 3: // DCL-compressed + Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size); + break; + default: + ; + } + +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h new file mode 100644 index 0000000000..7fc54d90a7 --- /dev/null +++ b/engines/neverhood/blbarchive.h @@ -0,0 +1,66 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_BLBARCHIVE_H +#define NEVERHOOD_BLBARCHIVE_H + +#include "common/array.h" +#include "common/file.h" +#include "neverhood/neverhood.h" + +namespace Neverhood { + +struct BlbHeader { + uint32 id1; + uint16 id2; + uint16 extDataSize; + int32 fileSize; + uint32 fileCount; +}; + +struct BlbArchiveEntry { + uint32 fileHash; + byte type; + byte comprType; + uint16 extDataOfs; + uint32 timeStamp; + uint32 offset; + uint32 diskSize; + uint32 size; +}; + +class BlbArchive { +public: + BlbArchive(); + ~BlbArchive(); + void open(const Common::String &filename); + void load(uint index, byte *buffer, uint32 size); + uint32 getSize(uint index) { return _entries[index].size; } +private: + Common::File _fd; + Common::Array _entries; + byte *_extData; +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_BLBARCHIVE_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index d46d6a67ba..0601f54d82 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -1,6 +1,7 @@ MODULE := engines/neverhood MODULE_OBJS = \ + blbarchive.o \ detection.o \ neverhood.o diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 9c464b9a83..873d7ff8ed 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -20,7 +20,6 @@ * */ -#include "common/algorithm.h" #include "common/events.h" #include "common/keyboard.h" #include "common/file.h" @@ -35,10 +34,10 @@ #include "engines/util.h" -#include "audio/mididrv.h" #include "audio/mixer.h" #include "neverhood/neverhood.h" +#include "neverhood/blbarchive.h" namespace Neverhood { @@ -68,6 +67,12 @@ Common::Error NeverhoodEngine::run() { _isSaveAllowed = false; + + BlbArchive *blb = new BlbArchive(); + blb->open("m.blb"); + + delete blb; + return Common::kNoError; } diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index c17116d2dd..63862dde54 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -66,7 +66,7 @@ public: Common::KeyCode _keyState; uint16 _buttonState; - void updateEvents(); + void updateEvents(); public: -- cgit v1.2.3 From 70d20096c16b983d254366b82e725ce14e5b195c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 24 Jun 2011 15:36:35 +0000 Subject: NEVERHOOD: Start with the resource manager --- engines/neverhood/blbarchive.cpp | 10 ++- engines/neverhood/blbarchive.h | 3 + engines/neverhood/module.mk | 3 +- engines/neverhood/neverhood.cpp | 19 ++++- engines/neverhood/resourceman.cpp | 167 ++++++++++++++++++++++++++++++++++++++ engines/neverhood/resourceman.h | 78 ++++++++++++++++++ 6 files changed, 274 insertions(+), 6 deletions(-) create mode 100644 engines/neverhood/resourceman.cpp create mode 100644 engines/neverhood/resourceman.h diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 48452efa8b..4259be33f7 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -49,7 +49,7 @@ void BlbArchive::open(const Common::String &filename) { if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size()) error("BlbArchive::open() %s seems to be corrupt", filename.c_str()); - debug("fileCount = %d", header.fileCount); + debug(2, "fileCount = %d", header.fileCount); _entries.reserve(header.fileCount); @@ -70,7 +70,7 @@ void BlbArchive::open(const Common::String &filename) { entry.offset = _fd.readUint32LE(); entry.diskSize = _fd.readUint32LE(); entry.size = _fd.readUint32LE(); - debug("%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X", + debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X", entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp, entry.offset, entry.diskSize, entry.size); } @@ -84,7 +84,6 @@ void BlbArchive::open(const Common::String &filename) { } void BlbArchive::load(uint index, byte *buffer, uint32 size) { - BlbArchiveEntry &entry = _entries[index]; _fd.seek(entry.offset); @@ -104,4 +103,9 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) { } +byte *BlbArchive::getEntryExtData(uint index) { + BlbArchiveEntry &entry = _entries[index]; + return _extData && entry.extDataOfs != 0 ? &_extData[entry.extDataOfs - 1] : NULL; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h index 7fc54d90a7..3c373ccc96 100644 --- a/engines/neverhood/blbarchive.h +++ b/engines/neverhood/blbarchive.h @@ -54,7 +54,10 @@ public: ~BlbArchive(); void open(const Common::String &filename); void load(uint index, byte *buffer, uint32 size); + byte *getEntryExtData(uint index); uint32 getSize(uint index) { return _entries[index].size; } + BlbArchiveEntry *getEntry(uint index) { return &_entries[index]; } + uint getCount() { return _entries.size(); } private: Common::File _fd; Common::Array _entries; diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 0601f54d82..bdb6d8684e 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -3,7 +3,8 @@ MODULE := engines/neverhood MODULE_OBJS = \ blbarchive.o \ detection.o \ - neverhood.o + neverhood.o \ + resourceman.o # This module can be built as a plugin ifdef BUILD_PLUGINS diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 873d7ff8ed..9254f886c0 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -38,6 +38,7 @@ #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" +#include "neverhood/resourceman.h" namespace Neverhood { @@ -67,11 +68,25 @@ Common::Error NeverhoodEngine::run() { _isSaveAllowed = false; - +#if 0 BlbArchive *blb = new BlbArchive(); blb->open("m.blb"); - delete blb; +#endif + +#if 1 + ResourceMan *res = new ResourceMan(); + res->addArchive("a.blb"); + res->addArchive("c.blb"); + res->addArchive("hd.blb"); + res->addArchive("i.blb"); + res->addArchive("m.blb"); + res->addArchive("s.blb"); + res->addArchive("t.blb"); + + ResourceFileEntry *r = res->findEntry(0x50A80517); + +#endif return Common::kNoError; } diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp new file mode 100644 index 0000000000..59e3fad14a --- /dev/null +++ b/engines/neverhood/resourceman.cpp @@ -0,0 +1,167 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/resourceman.h" + +namespace Neverhood { + +ResourceMan::ResourceMan() { +} + +ResourceMan::~ResourceMan() { +} + +void ResourceMan::addArchive(const Common::String &filename) { + BlbArchive *archive = new BlbArchive(); + uint archiveIndex = _archives.size(); + archive->open(filename); + _archives.push_back(archive); + debug("ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount()); + _entries.reserve(_entries.size() + archive->getCount()); + for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) { + BlbArchiveEntry *archiveEntry = archive->getEntry(archiveEntryIndex); + ResourceFileEntry *entry = findEntrySimple(archiveEntry->fileHash); + if (entry) { + if (archiveEntry->timeStamp > _archives[entry->archiveIndex]->getEntry(entry->entryIndex)->timeStamp) { + entry->archiveIndex = archiveIndex; + entry->entryIndex = archiveEntryIndex; + } + } else { + ResourceFileEntry newEntry; + newEntry.fileHash = archiveEntry->fileHash; + newEntry.resourceHandle = -1; + newEntry.archiveIndex = archiveIndex; + newEntry.entryIndex = archiveEntryIndex; + _entries.push_back(newEntry); + } + } +} + +ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) { + for (uint i = 0; i < _entries.size(); i++) { + if (_entries[i].fileHash == fileHash) + return &_entries[i]; + } + return NULL; +} + +ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) { + ResourceFileEntry *entry = findEntrySimple(fileHash); + for (; entry && getArchiveEntry(entry)->comprType == 0x65; fileHash = getArchiveEntry(entry)->diskSize) + entry = findEntrySimple(fileHash); + return entry; +} + +BlbArchiveEntry *ResourceMan::getArchiveEntry(ResourceFileEntry *entry) const { + return _archives[entry->archiveIndex]->getEntry(entry->entryIndex); +} + +int ResourceMan::useResource(uint32 fileHash) { + ResourceFileEntry *entry = findEntry(fileHash); + if (entry->resourceHandle != -1) { + _resources[entry->resourceHandle]->useRefCount++; + } else { + Resource *resource = new Resource(); + resource->fileHash = entry->fileHash; + resource->archiveIndex = entry->archiveIndex; + resource->entryIndex = entry->entryIndex; + resource->data = NULL; + resource->dataRefCount = 0; + resource->useRefCount = 1; + entry->resourceHandle = (int)_resources.size(); + _resources.push_back(resource); + } + return entry->resourceHandle; +} + +void ResourceMan::unuseResource(int resourceHandle) { + Resource *resource = _resources[resourceHandle]; + if (resource->useRefCount > 0) + resource->useRefCount--; +} + +void ResourceMan::unuseResourceByHash(uint32 fileHash) { + ResourceFileEntry *entry = findEntry(fileHash); + if (entry->resourceHandle != -1) + unuseResource(entry->resourceHandle); +} + +int ResourceMan::getResourceHandleByHash(uint32 fileHash) { + ResourceFileEntry *entry = findEntry(fileHash); + return entry->resourceHandle; +} + +bool ResourceMan::isResourceDataValid(int resourceHandle) const { + return _resources[resourceHandle]->data != NULL; +} + +uint32 ResourceMan::getResourceSize(int resourceHandle) const { + Resource *resource = _resources[resourceHandle]; + return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->size; +} + +byte ResourceMan::getResourceType(int resourceHandle) { + Resource *resource = _resources[resourceHandle]; + return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->type; +} + +byte ResourceMan::getResourceTypeByHash(uint32 fileHash) { + ResourceFileEntry *entry = findEntry(fileHash); + return getArchiveEntry(entry)->type; +} + +byte *ResourceMan::getResourceExtData(int resourceHandle) { + Resource *resource = _resources[resourceHandle]; + return _archives[resource->archiveIndex]->getEntryExtData(resource->entryIndex); +} + +byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) { + ResourceFileEntry *entry = findEntry(fileHash); + return _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex); +} + +byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) { + Resource *resource = _resources[resourceHandle]; + if (resource->data != NULL) { + resource->dataRefCount++; + } else { + BlbArchive *archive = _archives[resource->archiveIndex]; + BlbArchiveEntry *archiveEntry = archive->getEntry(resource->entryIndex); + resource->data = new byte[archiveEntry->size]; + archive->load(resource->entryIndex, resource->data, 0); + resource->dataRefCount = 1; + } + return resource->data; +} + +void ResourceMan::unloadResource(int resourceHandle) { + Resource *resource = _resources[resourceHandle]; + if (resource->dataRefCount > 0) + resource->dataRefCount--; +} + +void ResourceMan::freeResource(Resource *resource) { + delete[] resource->data; + resource->data = NULL; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h new file mode 100644 index 0000000000..0dd70e13a2 --- /dev/null +++ b/engines/neverhood/resourceman.h @@ -0,0 +1,78 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_RESOURCEMAN_H +#define NEVERHOOD_RESOURCEMAN_H + +#include "common/array.h" +#include "common/file.h" +#include "neverhood/neverhood.h" +#include "neverhood/blbarchive.h" + +namespace Neverhood { + +struct ResourceFileEntry { + uint32 fileHash; + int resourceHandle; + uint archiveIndex; + uint entryIndex; +}; + +struct Resource { + uint32 fileHash; + uint archiveIndex; + uint entryIndex; + byte *data; + int dataRefCount; + int useRefCount; +}; + +class ResourceMan { +public: + ResourceMan(); + ~ResourceMan(); + void addArchive(const Common::String &filename); + ResourceFileEntry *findEntrySimple(uint32 fileHash); + ResourceFileEntry *findEntry(uint32 fileHash); + BlbArchiveEntry *getArchiveEntry(ResourceFileEntry *entry) const; + int useResource(uint32 fileHash); + void unuseResource(int resourceHandle); + void unuseResourceByHash(uint32 fileHash); + int getResourceHandleByHash(uint32 fileHash); + bool isResourceDataValid(int resourceHandle) const; + uint32 getResourceSize(int resourceHandle) const; + byte getResourceType(int resourceHandle); + byte getResourceTypeByHash(uint32 fileHash); + byte *getResourceExtData(int resourceHandle); + byte *getResourceExtDataByHash(uint32 fileHash); + byte *loadResource(int resourceHandle, bool moveToFront = false); + void unloadResource(int resourceHandle); + void freeResource(Resource *resource); +private: + Common::Array _archives; + Common::Array _entries; + Common::Array _resources; +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_RESOURCEMAN_H */ -- cgit v1.2.3 From 7d5d5f139f5d2ac747f1440171f4cc42735541a7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 24 Jun 2011 23:25:01 +0000 Subject: NEVERHOOD: Start with graphics code (bitmap parsing and rle decompression) --- engines/neverhood/graphics.cpp | 108 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/graphics.h | 45 +++++++++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/neverhood.cpp | 49 +++++++++++++----- engines/neverhood/neverhood.h | 4 ++ 5 files changed, 195 insertions(+), 12 deletions(-) create mode 100644 engines/neverhood/graphics.cpp create mode 100644 engines/neverhood/graphics.h diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp new file mode 100644 index 0000000000..8f8849be41 --- /dev/null +++ b/engines/neverhood/graphics.cpp @@ -0,0 +1,108 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/graphics.h" + +namespace Neverhood { + +void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) { + + uint16 flags; + + flags = READ_LE_UINT16(sprite); + sprite += 2; + + if (rle) + *rle = flags & 1; + + if (flags & 2) { + if (dimensions) { + dimensions->width = READ_LE_UINT16(sprite); + dimensions->height = READ_LE_UINT16(sprite + 2); + } + sprite += 4; + } else if (dimensions) { + dimensions->width = 1; + dimensions->height = 1; + } + + if (flags & 4) { + if (unknown) { + unknown->unk1 = READ_LE_UINT16(sprite); + unknown->unk2 = READ_LE_UINT16(sprite + 2); + } + sprite += 4; + } else if (unknown) { + unknown->unk1 = 0; + unknown->unk2 = 0; + } + + if (flags & 8) { + if (palette) + *palette = sprite; + sprite += 1024; + } else if (palette) + *palette = NULL; + + if (flags & 0x10) { + if (pixels) + *pixels = sprite; + } else if (pixels) + *pixels = NULL; + +} + +void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { + + // TODO: Flip + + int16 rows, chunks; + int16 skip, copy; + + rows = READ_LE_UINT16(source); + chunks = READ_LE_UINT16(source + 2); + source += 4; + + do { + if (chunks == 0) { + dest += rows * destPitch; + } else { + while (rows-- > 0) { + uint16 rowChunks = chunks; + while (rowChunks-- > 0) { + skip = READ_LE_UINT16(source); + copy = READ_LE_UINT16(source + 2); + source += 4; + memcpy(dest + skip, source, copy); + source += copy; + } + dest += destPitch; + } + } + rows = READ_LE_UINT16(source); + chunks = READ_LE_UINT16(source + 2); + source += 4; + } while (rows > 0); + +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h new file mode 100644 index 0000000000..8cac5a5af0 --- /dev/null +++ b/engines/neverhood/graphics.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_GRAPHICS_H +#define NEVERHOOD_GRAPHICS_H + +#include "common/array.h" +#include "common/file.h" +#include "neverhood/neverhood.h" + +namespace Neverhood { + +struct NDimensions { + int16 width, height; +}; + +struct NUnknown { + int16 unk1, unk2; +}; + +void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels); +void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_GRAPHICS_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index bdb6d8684e..57491e6b72 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -3,6 +3,7 @@ MODULE := engines/neverhood MODULE_OBJS = \ blbarchive.o \ detection.o \ + graphics.o \ neverhood.o \ resourceman.o diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 9254f886c0..fa781fba1e 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -38,6 +38,7 @@ #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" +#include "neverhood/graphics.h" #include "neverhood/resourceman.h" namespace Neverhood { @@ -68,26 +69,50 @@ Common::Error NeverhoodEngine::run() { _isSaveAllowed = false; + _res = new ResourceMan(); + _res->addArchive("a.blb"); + _res->addArchive("c.blb"); + _res->addArchive("hd.blb"); + _res->addArchive("i.blb"); + _res->addArchive("m.blb"); + _res->addArchive("s.blb"); + _res->addArchive("t.blb"); + #if 0 BlbArchive *blb = new BlbArchive(); blb->open("m.blb"); delete blb; #endif -#if 1 - ResourceMan *res = new ResourceMan(); - res->addArchive("a.blb"); - res->addArchive("c.blb"); - res->addArchive("hd.blb"); - res->addArchive("i.blb"); - res->addArchive("m.blb"); - res->addArchive("s.blb"); - res->addArchive("t.blb"); - - ResourceFileEntry *r = res->findEntry(0x50A80517); - +#if 0 + ResourceFileEntry *r = _res->findEntry(0x50A80517); #endif +#if 0 + int resourceHandle = _res->useResource(0x0CA04202); + debug("resourceHandle = %d", resourceHandle); + byte *data = _res->loadResource(resourceHandle); + bool rle; + NDimensions dimensions; + NUnknown unknown; + byte *palette, *pixels; + parseBitmapResource(data, &rle, &dimensions, &unknown, &palette, &pixels); + debug("%d, %d", dimensions.width, dimensions.height); + byte *rawpixels = new byte[dimensions.width * dimensions.height]; + memset(rawpixels, 0, dimensions.width * dimensions.height); + debug("rle = %d", rle); + unpackSpriteRle(pixels, dimensions.width, dimensions.height, rawpixels, dimensions.width, false, false); + Common::DumpFile d; + d.open("dump.0"); + d.write(rawpixels, dimensions.width * dimensions.height); + d.close(); + delete[] rawpixels; + _res->unloadResource(resourceHandle); + _res->unuseResource(resourceHandle); +#endif + + delete _res; + return Common::kNoError; } diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 63862dde54..956880fcca 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -43,6 +43,8 @@ enum NeverhoodGameFeatures { struct NeverhoodGameDescription; +class ResourceMan; + class NeverhoodEngine : public ::Engine { protected: @@ -66,6 +68,8 @@ public: Common::KeyCode _keyState; uint16 _buttonState; + ResourceMan *_res; + void updateEvents(); public: -- cgit v1.2.3 From a262055df25b0b00fcb0fe9e7919153f5089d615 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 26 Jun 2011 18:08:18 +0000 Subject: NEVERHOOD: Start with the BaseSurface class (doesn't do much yet) --- engines/neverhood/graphics.cpp | 33 +++++++++++++++++++++++++++++++++ engines/neverhood/graphics.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 8f8849be41..fb8ec4ad72 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -24,6 +24,39 @@ namespace Neverhood { +BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height) + : _vm(vm), _priority(priority), _visible(true) { + + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = width; + _drawRect.height = height; + _sysRect.x = 0; + _sysRect.y = 0; + _sysRect.width = (width + 3) & 0xFFFC; // align by 4 bytes + _sysRect.height = height; + _clipRect.x1 = 0; + _clipRect.y1 = 0; + _clipRect.x2 = 640; + _clipRect.y2 = 480; + _surface = new Graphics::Surface(); + _surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); +} + +BaseSurface::~BaseSurface() { + delete _surface; +} + +void BaseSurface::draw() { + // TODO +} + +void BaseSurface::addDirtyRect() { + // TODO +} + +// Misc + void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) { uint16 flags; diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 8cac5a5af0..bc592870d3 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -25,6 +25,7 @@ #include "common/array.h" #include "common/file.h" +#include "graphics/surface.h" #include "neverhood/neverhood.h" namespace Neverhood { @@ -37,6 +38,36 @@ struct NUnknown { int16 unk1, unk2; }; +struct NRect { + int16 x1, y1, x2, y2; + NRect() : x1(0), y1(0), x2(0), y2(0) {} +}; + +struct NDrawRect { + int16 x, y, width, height; + NDrawRect() : x(0), y(0), width(0), height(0) {} +}; + +// NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific + +class BaseSurface { +public: + BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height); + virtual ~BaseSurface(); + virtual void draw(); + virtual void addDirtyRect(); +protected: + NeverhoodEngine *_vm; + int _priority; + bool _visible; + Graphics::Surface *_surface; + NDrawRect _drawRect; + NDrawRect _sysRect; + NRect _clipRect; +}; + +// Misc + void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels); void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); -- cgit v1.2.3 From 108368e9b5282a72d0f582e89803f5ee099baa94 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 27 Jun 2011 11:06:40 +0000 Subject: NEVERHOOD: Add more - SpriteResource and PaletteResource resource classes - Extend BaseSurface to be able to draw SpriteResources onto it - Implement Entity base class (this may need some work concerning the update/message callbacks later since I'm not sure if the way it's done now is portable) --- engines/neverhood/entity.cpp | 27 ++++++++ engines/neverhood/entity.h | 64 +++++++++++++++++++ engines/neverhood/graphics.cpp | 27 ++++++++ engines/neverhood/graphics.h | 15 +++++ engines/neverhood/module.mk | 3 + engines/neverhood/neverhood.cpp | 12 ++++ engines/neverhood/palette.cpp | 44 +++++++++++++ engines/neverhood/palette.h | 44 +++++++++++++ engines/neverhood/resource.cpp | 137 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/resource.h | 64 +++++++++++++++++++ 10 files changed, 437 insertions(+) create mode 100644 engines/neverhood/entity.cpp create mode 100644 engines/neverhood/entity.h create mode 100644 engines/neverhood/palette.cpp create mode 100644 engines/neverhood/palette.h create mode 100644 engines/neverhood/resource.cpp create mode 100644 engines/neverhood/resource.h diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp new file mode 100644 index 0000000000..9070d5c8c4 --- /dev/null +++ b/engines/neverhood/entity.cpp @@ -0,0 +1,27 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/entity.h" + +namespace Neverhood { + +} // End of namespace Neverhood diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h new file mode 100644 index 0000000000..b7ebdd1486 --- /dev/null +++ b/engines/neverhood/entity.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_ENTITY_H +#define NEVERHOOD_ENTITY_H + +#include "neverhood/neverhood.h" + +namespace Neverhood { + +struct MessageParam { + union { + uint32 _integer; + // TODO: Other types... + }; + // TODO: Constructors for the param types... +}; + +#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler) +#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler) + +class Entity { +public: + Entity(NeverhoodEngine *vm, int priority) + : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority) { + } + ~Entity() { + } + void handleUpdate() { + if (_updateHandlerCb) + (this->*_updateHandlerCb)(); + } + uint32 handleMessage(int messageNum, MessageParam ¶m, Entity *sender) { + return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; + } +protected: + void (Entity::*_updateHandlerCb)(); + uint32 (Entity::*_messageHandlerCb)(int messageNum, MessageParam ¶m, Entity *sender); + NeverhoodEngine *_vm; + int _priority; +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_ENTITY_H */ diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index fb8ec4ad72..315c62dbec 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/graphics.h" +#include "neverhood/resource.h" namespace Neverhood { @@ -55,6 +56,18 @@ void BaseSurface::addDirtyRect() { // TODO } +void BaseSurface::clear() { + _surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), 0); +} + +void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { + if (spriteResource.dimensions().width <= _drawRect.width && + spriteResource.dimensions().height <= _drawRect.height) { + clear(); + spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false); + } +} + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) { @@ -138,4 +151,18 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi } +void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { + + // TODO: Flip + + int sourcePitch = (width + 3) & 0xFFFC; + + while (height-- > 0) { + memcpy(dest, source, width); + source += sourcePitch; + dest += destPitch; + } + +} + } // End of namespace Neverhood diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index bc592870d3..27ef6cdee6 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -48,6 +48,8 @@ struct NDrawRect { NDrawRect() : x(0), y(0), width(0), height(0) {} }; +class SpriteResource; + // NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific class BaseSurface { @@ -56,6 +58,8 @@ public: virtual ~BaseSurface(); virtual void draw(); virtual void addDirtyRect(); + void clear(); + void drawSpriteResource(SpriteResource &spriteResource); protected: NeverhoodEngine *_vm; int _priority; @@ -66,10 +70,21 @@ protected: NRect _clipRect; }; +/* +class Palette { +public: + Palette(); + ~Palette(); +protected: + +}; +*/ + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels); void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); +void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); } // End of namespace Neverhood diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 57491e6b72..d70c4a96af 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -3,8 +3,11 @@ MODULE := engines/neverhood MODULE_OBJS = \ blbarchive.o \ detection.o \ + entity.o \ graphics.o \ neverhood.o \ + palette.o \ + resource.o \ resourceman.o # This module can be built as a plugin diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index fa781fba1e..f7bf0327d4 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -40,6 +40,7 @@ #include "neverhood/blbarchive.h" #include "neverhood/graphics.h" #include "neverhood/resourceman.h" +#include "neverhood/resource.h" namespace Neverhood { @@ -111,6 +112,17 @@ Common::Error NeverhoodEngine::run() { _res->unuseResource(resourceHandle); #endif +#if 1 + { // Create a new scope + SpriteResource r(this); + BaseSurface *surf = new BaseSurface(this, 0, 640, 480); + r.load(0x0CA04202); + debug("r: width = %d; height = %d", r.dimensions().width, r.dimensions().height); + surf->drawSpriteResource(r); + delete surf; + } +#endif + delete _res; return Common::kNoError; diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp new file mode 100644 index 0000000000..385cadeef8 --- /dev/null +++ b/engines/neverhood/palette.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/palette.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) { + _status = 0; + _palette = new byte[1024]; + memset(_palette, 0, 1024); + SetUpdateHandler(&Palette::update); +} + +Palette::~Palette() { + // TODO: _vm->_screen->unsetPaletteData(_palette); + delete[] _palette; +} + +void Palette::update() { + // TODO +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h new file mode 100644 index 0000000000..961b4ac909 --- /dev/null +++ b/engines/neverhood/palette.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_PALETTE_H +#define NEVERHOOD_PALETTE_H + +#include "neverhood/neverhood.h" +#include "neverhood/entity.h" + +namespace Neverhood { + +class Palette : public Entity { +public: + // Default constructor with black palette + Palette(NeverhoodEngine *vm); + ~Palette(); +protected: + int _status; + byte *_palette; + void update(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_PALETTE_H */ diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp new file mode 100644 index 0000000000..6c77c48fb7 --- /dev/null +++ b/engines/neverhood/resource.cpp @@ -0,0 +1,137 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/resource.h" +#include "neverhood/resourceman.h" + +namespace Neverhood { + +SpriteResource::SpriteResource(NeverhoodEngine *vm) + : _vm(vm), _resourceHandle(-1), _pixels(NULL) { +} + +SpriteResource::~SpriteResource() { + unload(); +} + +void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) { + if (_pixels) { + if (_rle) { + unpackSpriteRle(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY); + } else { + unpackSpriteNormal(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY); + } + } +} + +bool SpriteResource::load(uint32 fileHash) { + // TODO: Later merge with load2 and make the mode a parameter + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + debug("SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle); + if (_resourceHandle != -1) { + if (_vm->_res->getResourceType(_resourceHandle) == 2) { + byte *spriteData = _vm->_res->loadResource(_resourceHandle, true); + parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels); + } else { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + } + } + return _pixels != NULL; +} + +bool SpriteResource::load2(uint32 fileHash) { + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle != -1) { + if (_vm->_res->getResourceType(_resourceHandle) == 2) { + byte *spriteData = _vm->_res->loadResource(_resourceHandle, true); + parseBitmapResource(spriteData, &_rle, &_dimensions, &_unknown, NULL, &_pixels); + } else { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + } + } + return _pixels != NULL; +} + +void SpriteResource::unload() { + if (_resourceHandle != -1) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + } else { + delete[] _pixels; + } + _pixels = NULL; + _rle = false; +} + +PaletteResource::PaletteResource(NeverhoodEngine *vm) + : _vm(vm), _resourceHandle(-1), _palette(NULL) { +} + +PaletteResource::~PaletteResource() { + unload(); +} + +bool PaletteResource::load(uint32 fileHash) { + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle != -1) { + _palette = _vm->_res->loadResource(_resourceHandle, true); + switch (_vm->_res->getResourceType(_resourceHandle)) { + case 2: + // Palette is stored in a bitmap + parseBitmapResource(_palette, NULL, NULL, NULL, &_palette, NULL); + break; + case 3: + // _palette already points to the correct data + break; + default: + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + break; + } + } + return _palette != NULL; +} + +void PaletteResource::unload() { + if (_resourceHandle != -1) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + _palette = NULL; + } +} + +void PaletteResource::getPalette(byte *palette) { + if (_palette) { + memcpy(palette, _palette, 1024); + } else { + // TODO?: buildDefaultPalette(palette); + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h new file mode 100644 index 0000000000..7f61af660a --- /dev/null +++ b/engines/neverhood/resource.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_RESOURCE_H +#define NEVERHOOD_RESOURCE_H + +#include "neverhood/neverhood.h" +#include "neverhood/graphics.h" + +namespace Neverhood { + +class SpriteResource { +public: + SpriteResource(NeverhoodEngine *vm); + ~SpriteResource(); + void draw(byte *dest, int destPitch, bool flipX, bool flipY); + bool load(uint32 fileHash); + bool load2(uint32 fileHash); + void unload(); + const NDimensions& dimensions() { return _dimensions; }; +protected: + NeverhoodEngine *_vm; + int _resourceHandle; + NDimensions _dimensions; + NUnknown _unknown; + byte *_pixels; + bool _rle; +}; + +class PaletteResource { +public: + PaletteResource(NeverhoodEngine *vm); + ~PaletteResource(); + bool load(uint32 fileHash); + void unload(); + void getPalette(byte *palette); +protected: + NeverhoodEngine *_vm; + int _resourceHandle; + byte *_palette; +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_RESOURCE_H */ -- cgit v1.2.3 From eb5ab30ce0ca0cfb58eed5a434f2252afc9718f7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 27 Jun 2011 13:39:29 +0000 Subject: NEVERHOOD: More work on the Palette class --- engines/neverhood/palette.cpp | 83 +++++++++++++++++++++++++++++++++++++++++- engines/neverhood/palette.h | 15 ++++++++ engines/neverhood/resource.cpp | 4 +- engines/neverhood/resource.h | 3 +- 4 files changed, 101 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index 385cadeef8..b45f8eeb78 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -32,13 +32,94 @@ Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) { SetUpdateHandler(&Palette::update); } +Palette::Palette(NeverhoodEngine *vm, byte *palette) : Entity(vm, 0) { + _status = 0; + _palette = new byte[1024]; + memcpy(_palette, palette, 1024); + SetUpdateHandler(&Palette::update); +} + +Palette::Palette(NeverhoodEngine *vm, const char *filename) : Entity(vm, 0) { + PaletteResource paletteResource(_vm); + _status = 0; + _palette = new byte[1024]; + // TODO: paletteResource.load(calcHash(filename)); + // paletteResource.copyPalette(_palette); + SetUpdateHandler(&Palette::update); +} + +Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) { + PaletteResource paletteResource(_vm); + _status = 0; + _palette = new byte[1024]; + paletteResource.load(fileHash); + paletteResource.copyPalette(_palette); + SetUpdateHandler(&Palette::update); +} + Palette::~Palette() { // TODO: _vm->_screen->unsetPaletteData(_palette); delete[] _palette; } +void Palette::usePalette() { + // TODO: _vm->_screen->setPaletteData(_palette); +} + +void Palette::addPalette(const char *filename, int toIndex, int count, int fromIndex) { + // TODO: addPalette(calcHash(filename), toIndex, count, fromIndex); +} + +void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) { + PaletteResource paletteResource(_vm); + if (toIndex + count > 256) + count = 256 - toIndex; + paletteResource.load(fileHash); + memcpy(_palette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4); + // TODO: _vm->_screen->testPalette(_palette); +} + +void Palette::startFadeToBlack(int counter) { + if (counter == 0) + counter = 1; + _fadeToR = 0; + _fadeToG = 0; + _fadeToB = 0; + _palCounter = counter; + _fadeStep = 255 / counter; + _status = 1; +} + +void Palette::startFadeToWhite(int counter) { + if (counter == 0) + counter = 1; + _fadeToR = 255; + _fadeToG = 255; + _fadeToB = 255; + _palCounter = counter; + _fadeStep = 255 / counter; + _status = 1; +} + void Palette::update() { - // TODO + if (_status == 1) { + memset(_palette, 0, 1024); + _status = 0; + } else { + for (int i = 0; i < 256; i++) { + fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB); + } + // TODO: _vm->_screen->testPalette(_palette); + _palCounter--; + } +} + +void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) { + #define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep) + FADE(rgb[0], toR); + FADE(rgb[1], toG); + FADE(rgb[2], toB); + #undef FADE } } // End of namespace Neverhood diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 961b4ac909..b29d77181b 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -32,11 +32,26 @@ class Palette : public Entity { public: // Default constructor with black palette Palette(NeverhoodEngine *vm); + // Create from existing palette + Palette(NeverhoodEngine *vm, byte *palette); + // Create from resource with filename + Palette(NeverhoodEngine *vm, const char *filename); + // Create from resource with fileHash + Palette(NeverhoodEngine *vm, uint32 fileHash); ~Palette(); + void usePalette(); + void addPalette(const char *filename, int toIndex, int count, int fromIndex); + void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); + void startFadeToBlack(int counter); + void startFadeToWhite(int counter); protected: int _status; byte *_palette; + int _palCounter; + byte _fadeToR, _fadeToG, _fadeToB; + int _fadeStep; void update(); + void fadeColor(byte *rgb, byte toR, byte toG, byte toB); }; } // End of namespace Neverhood diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 6c77c48fb7..2dd919c087 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -126,9 +126,9 @@ void PaletteResource::unload() { } } -void PaletteResource::getPalette(byte *palette) { +void PaletteResource::copyPalette(byte *destPalette) { if (_palette) { - memcpy(palette, _palette, 1024); + memcpy(destPalette, _palette, 1024); } else { // TODO?: buildDefaultPalette(palette); } diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 7f61af660a..7f699c54df 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -52,7 +52,8 @@ public: ~PaletteResource(); bool load(uint32 fileHash); void unload(); - void getPalette(byte *palette); + void copyPalette(byte *destPalette); + byte *palette() { return _palette; } protected: NeverhoodEngine *_vm; int _resourceHandle; -- cgit v1.2.3 From 4a01a69e37633aad402cea8477d812df4391a84d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 27 Jun 2011 17:09:55 +0000 Subject: NEVERHOOD: Start with Module and GameModule classes --- engines/neverhood/entity.h | 15 ++++-- engines/neverhood/gamemodule.cpp | 98 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/gamemodule.h | 56 +++++++++++++++++++++++ engines/neverhood/module.cpp | 75 ++++++++++++++++++++++++++++++ engines/neverhood/module.h | 49 ++++++++++++++++++++ engines/neverhood/module.mk | 2 + engines/neverhood/neverhood.h | 5 ++ 7 files changed, 296 insertions(+), 4 deletions(-) create mode 100644 engines/neverhood/gamemodule.cpp create mode 100644 engines/neverhood/gamemodule.h create mode 100644 engines/neverhood/module.cpp create mode 100644 engines/neverhood/module.h diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index b7ebdd1486..0b0fc74e19 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -32,29 +32,36 @@ struct MessageParam { uint32 _integer; // TODO: Other types... }; + MessageParam(uint32 value) { _integer = value; } // TODO: Constructors for the param types... }; #define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler) -#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler) +#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler) class Entity { public: Entity(NeverhoodEngine *vm, int priority) : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority) { } - ~Entity() { + virtual ~Entity() { + } + virtual void draw() { } void handleUpdate() { if (_updateHandlerCb) (this->*_updateHandlerCb)(); } - uint32 handleMessage(int messageNum, MessageParam ¶m, Entity *sender) { + uint32 sendMessage(int messageNum, const MessageParam ¶m, Entity *sender) { return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; } + // Overloaded for various message parameter types + uint32 sendMessage(int messageNum, uint32 param, Entity *sender) { + return sendMessage(messageNum, MessageParam(param), sender); + } protected: void (Entity::*_updateHandlerCb)(); - uint32 (Entity::*_messageHandlerCb)(int messageNum, MessageParam ¶m, Entity *sender); + uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); NeverhoodEngine *_vm; int _priority; }; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp new file mode 100644 index 0000000000..887ff3d37a --- /dev/null +++ b/engines/neverhood/gamemodule.cpp @@ -0,0 +1,98 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/gamemodule.h" + +namespace Neverhood { + +GameModule::GameModule(NeverhoodEngine *vm) + : Module(_vm, NULL) { + + // Other initializations moved to actual engine class + + // TODO .text:0048AD96 + + // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); + + + + SetMessageHandler(&GameModule::handleMessage); + +} + +GameModule::~GameModule() { + + // TODO Sound1ChList_sub_407AF0(0x2D0031); + + delete _childObject; + _childObject = NULL; + + // TODO: Set palette to black but probably not neccessary + + // TODO Sound1ChList_sub_408480(); + +} + +uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0800: + _someFlag1 = true; + return messageResult; + case 0x1009: + _field24 = -1; + _field26 = -1; + _field28 = -1; + _field20 = param._integer; + _done = true; + return messageResult; + case 0x100A: + _field24 = (int16)param._integer; + return messageResult; + case 0x101F: + _field2C = true; + return messageResult; + case 0x1023: + _field26 = (int16)param._integer; + return messageResult; + } + return messageResult; +} + +void GameModule::startup() { + // TODO: Displaying of error text probably not needed in ScummVM + createModule1500(0); +} + +void GameModule::createModule1500(int which) { + // TODO + _someFlag1 = false; + // TODO *getGlobalGameVarValuePtr(0x91080831) = 0x0F10114; + // TODO _childObject = new Module1500(this, which, true); + SetUpdateHandler(&GameModule::updateModule1500); +} + +void GameModule::updateModule1500() { + // TODO +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h new file mode 100644 index 0000000000..6f47fb6f65 --- /dev/null +++ b/engines/neverhood/gamemodule.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// TODO: I couldn't come up with a better name than 'Module' so far + +#ifndef NEVERHOOD_GAMEMODULE_H +#define NEVERHOOD_GAMEMODULE_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" + +namespace Neverhood { + +class GameModule : public Module { +public: + GameModule(NeverhoodEngine *vm); + virtual ~GameModule(); +protected: + Entity *_prevChildObject; + bool _someFlag1; + bool _field2C; + uint32 _counter; + /* TODO + ResourceTable _resourceTable1; + ResourceTable _resourceTable2; + ResourceTable _resourceTable3; + ResourceTable _resourceTable4; + */ + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void startup(); + void createModule1500(int which); + void updateModule1500(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE_H */ diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp new file mode 100644 index 0000000000..1aa1203885 --- /dev/null +++ b/engines/neverhood/module.cpp @@ -0,0 +1,75 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module.h" + +namespace Neverhood { + +Module::Module(NeverhoodEngine *vm, Module *parentModule) + : Entity(_vm, 0), _parentModule(parentModule), _childObject(NULL), + _done(false), _field24(-1), _field26(-1), _field28(-1) { + + SetMessageHandler(&Module::handleMessage); + +} + +Module::~Module() { + delete _childObject; +} + +void Module::draw() { + if (_childObject) + _childObject->draw(); +} + +uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + + switch (messageNum) { + case 0x0008: + if (_parentModule) + _parentModule->sendMessage(8, 0, this); + return 0; + case 0x1009: + _field24 = -1; + _field26 = -1; + _field28 = -1; + _field20 = param._integer; + _done = true; + return 0; + case 0x100A: + _field24 = (int16)param._integer; + return 0; + case 0x1023: + _field26 = (int16)param._integer; + return 0; + case 0x1024: + _field28 = (int16)param._integer; + return 0; + default: + if (_childObject && sender == _parentModule) + return _childObject->sendMessage(messageNum, param, sender); + } + + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h new file mode 100644 index 0000000000..432a04c043 --- /dev/null +++ b/engines/neverhood/module.h @@ -0,0 +1,49 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// TODO: I couldn't come up with a better name than 'Module' so far + +#ifndef NEVERHOOD_MODULE_H +#define NEVERHOOD_MODULE_H + +#include "neverhood/neverhood.h" +#include "neverhood/entity.h" + +namespace Neverhood { + +class Module : public Entity { +public: + Module(NeverhoodEngine *vm, Module *parentModule); + virtual ~Module(); + virtual void draw(); +protected: + Module *_parentModule; + Entity *_childObject; + bool _done; + int16 _field24, _field26, _field28; + uint32 _field20; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index d70c4a96af..ef6caba6dd 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -4,7 +4,9 @@ MODULE_OBJS = \ blbarchive.o \ detection.o \ entity.o \ + gamemodule.o \ graphics.o \ + module.o \ neverhood.o \ palette.o \ resource.o \ diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 956880fcca..edbf165654 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -45,6 +45,10 @@ struct NeverhoodGameDescription; class ResourceMan; +struct GameState { + int field1; +}; + class NeverhoodEngine : public ::Engine { protected: @@ -68,6 +72,7 @@ public: Common::KeyCode _keyState; uint16 _buttonState; + GameState _gameState; ResourceMan *_res; void updateEvents(); -- cgit v1.2.3 From ce4ef688b3c52016f31e02c2cf3f2fc6703343ba Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 28 Jun 2011 09:37:15 +0000 Subject: NEVERHOOD: Add skeleton for Module1500 (the intro module) --- engines/neverhood/entity.h | 1 + engines/neverhood/module.mk | 1 + engines/neverhood/module1500.cpp | 93 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1500.h | 47 ++++++++++++++++++++ engines/neverhood/neverhood.h | 4 +- 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 engines/neverhood/module1500.cpp create mode 100644 engines/neverhood/module1500.h diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 0b0fc74e19..fe5d07e585 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -52,6 +52,7 @@ public: if (_updateHandlerCb) (this->*_updateHandlerCb)(); } + bool hasMessageHandler() const { return _messageHandlerCb != NULL; } uint32 sendMessage(int messageNum, const MessageParam ¶m, Entity *sender) { return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; } diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index ef6caba6dd..97ad70e654 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -7,6 +7,7 @@ MODULE_OBJS = \ gamemodule.o \ graphics.o \ module.o \ + module1500.o \ neverhood.o \ palette.o \ resource.o \ diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp new file mode 100644 index 0000000000..05a3bec907 --- /dev/null +++ b/engines/neverhood/module1500.cpp @@ -0,0 +1,93 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1500.h" + +namespace Neverhood { + +Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag) + : Module(vm, parentModule), _flag(flag) { + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 1: + createScene1502(); + break; + case 2: + createScene1503(); + break; + case 3: + createScene1504(); + break; + default: + createScene1501(); + } + } else { + createScene1504(); + } + +} + +void Module1500::update() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + switch (_vm->gameState().sceneNum) { + case 0: + createScene1502(); + break; + case 1: + if (_flag) { + createScene1503(); + } else { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 3: + createScene1501(); + break; + default: + _parentModule->sendMessage(0x1009, 0, this); + break; + } + } +} + +void Module1500::createScene1501() { + // TODO +} + +void Module1500::createScene1502() { + // TODO +} + +void Module1500::createScene1503() { + // TODO +} + +void Module1500::createScene1504() { + // TODO +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h new file mode 100644 index 0000000000..d4a4310cdc --- /dev/null +++ b/engines/neverhood/module1500.h @@ -0,0 +1,47 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// TODO: I couldn't come up with a better name than 'Module' so far + +#ifndef NEVERHOOD_MODULE1500_H +#define NEVERHOOD_MODULE1500_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" + +namespace Neverhood { + +class Module1500 : public Module { +public: + Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag); +protected: + bool _flag; + void update(); + void createScene1501(); + void createScene1502(); + void createScene1503(); + void createScene1504(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1500_H */ diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index edbf165654..8a95b05f94 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -46,7 +46,7 @@ struct NeverhoodGameDescription; class ResourceMan; struct GameState { - int field1; + int sceneNum; }; class NeverhoodEngine : public ::Engine { @@ -111,6 +111,8 @@ public: static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header); #endif + GameState& gameState() { return _gameState; } + public: }; -- cgit v1.2.3 From aded2a104b35320951fae30f6b6c4aa18887a4f5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 30 Jun 2011 09:55:59 +0000 Subject: NEVERHOOD: Start with Scene and Sprite classes --- engines/neverhood/entity.h | 7 + engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/graphics.cpp | 18 +-- engines/neverhood/graphics.h | 22 +-- engines/neverhood/module.mk | 4 +- engines/neverhood/neverhood.cpp | 2 +- engines/neverhood/resource.cpp | 2 +- engines/neverhood/resource.h | 5 +- engines/neverhood/scene.cpp | 307 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/scene.h | 100 +++++++++++++ engines/neverhood/sprite.cpp | 179 +++++++++++++++++++++++ engines/neverhood/sprite.h | 90 ++++++++++++ 12 files changed, 708 insertions(+), 30 deletions(-) create mode 100644 engines/neverhood/scene.cpp create mode 100644 engines/neverhood/scene.h create mode 100644 engines/neverhood/sprite.cpp create mode 100644 engines/neverhood/sprite.h diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index fe5d07e585..bbe67a187c 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -24,15 +24,18 @@ #define NEVERHOOD_ENTITY_H #include "neverhood/neverhood.h" +#include "neverhood/graphics.h" namespace Neverhood { struct MessageParam { union { uint32 _integer; + NPoint _point; // TODO: Other types... }; MessageParam(uint32 value) { _integer = value; } + MessageParam(NPoint value) { _point = value; } // TODO: Constructors for the param types... }; @@ -60,6 +63,10 @@ public: uint32 sendMessage(int messageNum, uint32 param, Entity *sender) { return sendMessage(messageNum, MessageParam(param), sender); } + uint32 sendMessage(int messageNum, NPoint param, Entity *sender) { + return sendMessage(messageNum, MessageParam(param), sender); + } + int getPriority() const { return _priority; } protected: void (Entity::*_updateHandlerCb)(); uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 887ff3d37a..09046cfa3e 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -29,7 +29,7 @@ GameModule::GameModule(NeverhoodEngine *vm) // Other initializations moved to actual engine class - // TODO .text:0048AD96 + // TODO // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 315c62dbec..d7c1064948 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -61,8 +61,8 @@ void BaseSurface::clear() { } void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { - if (spriteResource.dimensions().width <= _drawRect.width && - spriteResource.dimensions().height <= _drawRect.height) { + if (spriteResource.getDimensions().width <= _drawRect.width && + spriteResource.getDimensions().height <= _drawRect.height) { clear(); spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false); } @@ -70,7 +70,7 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { // Misc -void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels) { +void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { uint16 flags; @@ -92,14 +92,14 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnkn } if (flags & 4) { - if (unknown) { - unknown->unk1 = READ_LE_UINT16(sprite); - unknown->unk2 = READ_LE_UINT16(sprite + 2); + if (position) { + position->x = READ_LE_UINT16(sprite); + position->y = READ_LE_UINT16(sprite + 2); } sprite += 4; - } else if (unknown) { - unknown->unk1 = 0; - unknown->unk2 = 0; + } else if (position) { + position->x = 0; + position->y = 0; } if (flags & 8) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 27ef6cdee6..68ff84dc25 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -30,12 +30,12 @@ namespace Neverhood { -struct NDimensions { - int16 width, height; +struct NPoint { + int16 x, y; }; -struct NUnknown { - int16 unk1, unk2; +struct NDimensions { + int16 width, height; }; struct NRect { @@ -60,6 +60,8 @@ public: virtual void addDirtyRect(); void clear(); void drawSpriteResource(SpriteResource &spriteResource); + int getPriority() const { return _priority; } + void setPriority(int priority) { _priority = priority; } protected: NeverhoodEngine *_vm; int _priority; @@ -70,19 +72,9 @@ protected: NRect _clipRect; }; -/* -class Palette { -public: - Palette(); - ~Palette(); -protected: - -}; -*/ - // Misc -void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NUnknown *unknown, byte **palette, byte **pixels); +void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels); void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 97ad70e654..709538e565 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -11,7 +11,9 @@ MODULE_OBJS = \ neverhood.o \ palette.o \ resource.o \ - resourceman.o + resourceman.o \ + scene.o \ + sprite.o # This module can be built as a plugin ifdef BUILD_PLUGINS diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index f7bf0327d4..d4418cb8cd 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -117,7 +117,7 @@ Common::Error NeverhoodEngine::run() { SpriteResource r(this); BaseSurface *surf = new BaseSurface(this, 0, 640, 480); r.load(0x0CA04202); - debug("r: width = %d; height = %d", r.dimensions().width, r.dimensions().height); + debug("r: width = %d; height = %d", r.getDimensions().width, r.getDimensions().height); surf->drawSpriteResource(r); delete surf; } diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 2dd919c087..4dcbd838fe 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -66,7 +66,7 @@ bool SpriteResource::load2(uint32 fileHash) { if (_resourceHandle != -1) { if (_vm->_res->getResourceType(_resourceHandle) == 2) { byte *spriteData = _vm->_res->loadResource(_resourceHandle, true); - parseBitmapResource(spriteData, &_rle, &_dimensions, &_unknown, NULL, &_pixels); + parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels); } else { _vm->_res->unuseResource(_resourceHandle); _resourceHandle = -1; diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 7f699c54df..5a30d1292d 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -36,12 +36,13 @@ public: bool load(uint32 fileHash); bool load2(uint32 fileHash); void unload(); - const NDimensions& dimensions() { return _dimensions; }; + const NDimensions& getDimensions() { return _dimensions; } + const NPoint& getPosition() { return _position; } protected: NeverhoodEngine *_vm; int _resourceHandle; NDimensions _dimensions; - NUnknown _unknown; + NPoint _position; byte *_pixels; bool _rle; }; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp new file mode 100644 index 0000000000..ccdae3a287 --- /dev/null +++ b/engines/neverhood/scene.cpp @@ -0,0 +1,307 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/scene.h" + +namespace Neverhood { + +Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) + : Entity(vm, 0), _parentModule(parentModule) { + + _messageListFlag1 = false; + _systemCallbackFlag = false; + _messageList = NULL; + // TODO _rectType = 0; + _mouseClickPos.x = 0; + _mouseClickPos.y = 0; + _mouseClicked = false; + // TODO _rectList = NULL; + // TODO _someRects = NULL; + // TODO _playerSprite = NULL; + // TODO _mouseSprite = NULL; + _palette = NULL; + // TODO _class300 = NULL; + // TODO _field_8E = -1; + if (clearHitRects) { + // TODO g_Class700->setHitRects(NULL, 0); + // TODO g_Class700->clear(); + } + // TODO g_screen->setFps(24); + // TODO g_screen->hSmack = NULL; + // TODO g_screen->field_24 = 0; + // TODO g_screen->field_26 = 0; + // TODO g_screen->resetDirtyRects(); + _messageListFlag = true; + _surfaceFlag = false; + _messageList2 = NULL; + // TODO _smackerPlayer = NULL; + _smkFileHash = 0; + _messageListFlag2 = false; + _messageValue = -1; + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&Scene::handleMessage); +} + +Scene::~Scene() { + + if (_palette) { + removeEntity(_palette); + delete _palette; + } + + // Delete all entities + for (Common::Array::iterator iter = _entities.begin(); iter != _entities.end(); iter++) + delete *iter; + + // Don't delete surfaces since they always belong to an entity + +} + +void Scene::draw() { + //**ALL TODO +#if 0 + if (_smackerPlayer) { + if (_surfaceFlag) { + g_screen->resetDirtyRects(); + g_screen->copyDirtyRects(); + g_screen->addDirtyRects(); + } + _smackerPlayer->_surface->draw(); + } else { + if (_surfaceFlag) { + g_screen->copyDirtyRects(); + for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) + (*iter)->addDirtyRect(); + g_screen->addDirtyRects(); + } + for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) + (*iter)->draw(); + } +#endif +} + +void Scene::addEntity(Entity *entity) { + int index = 0, insertIndex = -1; + for (Common::Array::iterator iter = _entities.begin(); iter != _entities.end(); iter++) { + if ((*iter)->getPriority() > entity->getPriority()) { + insertIndex = index; + break; + } + index++; + } + if (insertIndex >= 0) + _entities.insert_at(insertIndex, entity); + else + _entities.push_back(entity); +} + +bool Scene::removeEntity(Entity *entity) { + for (uint index = 0; index < _entities.size(); index++) { + if (_entities[index] == entity) { + _entities.remove_at(index); + return true; + } + } + return false; +} + +void Scene::addSurface(BaseSurface *surface) { + int index = 0, insertIndex = -1; + for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { + if ((*iter)->getPriority() > surface->getPriority()) { + insertIndex = index; + break; + } + index++; + } + if (insertIndex >= 0) + _surfaces.insert_at(insertIndex, surface); + else + _surfaces.push_back(surface); +} + +bool Scene::removeSurface(BaseSurface *surface) { + for (uint index = 0; index < _surfaces.size(); index++) { + if (_surfaces[index] == surface) { + _surfaces.remove_at(index); + return true; + } + } + return false; +} + +Sprite *Scene::addSprite(Sprite *sprite) { + addEntity(sprite); + addSurface(sprite->getSurface()); + return sprite; +} + +void Scene::setSurfacePriority(BaseSurface *surface, int priority) { + surface->setPriority(priority); + if (removeSurface(surface)) + addSurface(surface); +} + +void Scene::deleteSprite(Sprite **sprite) { + // TODO g_Class700->removeSprite(*sprite); + removeSurface((*sprite)->getSurface()); + removeEntity(*sprite); + delete *sprite; + *sprite = NULL; +} + +void Scene::update() { + + if (_smkFileHash != 0) { + // TODO + //**** ALL TODO + //_smackerPlayer = new SmackerPlayer(this, _smkFileHash, true, 0); + _savedUpdateHandlerCb = _updateHandlerCb; + _savedMessageHandlerCb = _messageHandlerCb; + SetUpdateHandler(&Scene::smackerUpdate); + SetMessageHandler(&Scene::smackerHandleMessage); + _smackerDone = false; + // smackerUpdate(); + // g_screen->smackerPlayer = _smackerPlayer; + _smkFileHash = 0; + } else { + if (_mouseClicked) { + //** ALL TODO +#if 0 + if (_playerSprite) { + // TODO: Merge later + if (_playerSprite->hasMessageHandler() && + _playerSprite->sendMessage(0x1008, 0, this) != 0 && + _messageListFlag && + queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) { + _mouseClicked = false; + } else if (_playerSprite->hasMessageHandler() && + _playerSprite->sendMessage(0x1008, 0, this) != 0 && + _messageListFlag) { + _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); + } + } else if (queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) { + _mouseClicked = false; + } +#endif + } + + // TODO runMessageList(); + + // Update all entities + for (Common::Array::iterator iter = _entities.begin(); iter != _entities.end(); iter++) + (*iter)->handleUpdate(); + + } + +} + +uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + // TODO +#if 0 + switch (messageNum) { + case 0: // mouse moved + if (_mouseSprite && _mouseSprite->hasMessageHandler()) + _mouseSprite->sendMessage(0x4002, param, this); + queryPositionSomeRects(param._point.x, param._point.y); + break; + case 1: // mouse clicked + _mouseClicked = true; + _mouseClickPos = param._point; + break; + /* ORIGINAL DEBUG + case 3: + drawSurfaceRects(); + break; + */ + /* ORIGINAL DEBUG + case 4: + drawRectListRects(); + break; + */ + case 5: + broadcastObjectMessage5(); + break; + case 6: + _parentModule->sendMessage(0x1009, param, this); + break; + case 0x1006: + if (_messageListFlag1) { + _messageListFlag1 = false; + if (_messageListIndex == _messageListCount) + _playerSprite->sendMessage(0x4004, 0, this); + else + runMessageList(); + } + break; + case 0x1007: + if (_messageListFlag1) { + _messageListFlag1 = false; + _messageList = NULL; + _playerSprite->sendMessage(0x4004, 0, this); + } + break; + case 0x101D: + if (_mouseSprite) { + _prevVisible = _mouseSprite->_drawSurface->_visible; + _mouseSprite->_drawSurface->_visible = false; + } + break; + case 0x101E: + if (_prevVisible && _mouseSprite) { + _mouseSprite->_drawSurface->_visible = true; + _mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this); + } + break; + case 0x1022: + setSurfacePriority(((Sprite*)sender)->_surface, param._integer); + break; + } +#endif + return 0; +} + +void Scene::smackerUpdate() { + //**ALL TODO +#if 0 + _smackerPlayer->handleUpdate(); + if (_smackerDone) { + delete _smackerPlayer; + _smackerPlayer = NULL; + _updateHandlerCb = _savedUpdateHandlerCb; + _messageHandlerCb = _savedMessageHandlerCb; + if (_palette) + _palette->usePalette(); + // TODO class300->restore(); + // TODO g_screen->smackerPlayer = NULL; + } +#endif +} + +uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + if (messageNum == 0x3002) + _smackerDone = true; + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h new file mode 100644 index 0000000000..3532a43b0b --- /dev/null +++ b/engines/neverhood/scene.h @@ -0,0 +1,100 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_SCENE_H +#define NEVERHOOD_SCENE_H + +#include "common/array.h" +#include "neverhood/neverhood.h" +#include "neverhood/entity.h" +#include "neverhood/graphics.h" +#include "neverhood/module.h" +#include "neverhood/palette.h" +#include "neverhood/sprite.h" + +namespace Neverhood { + +struct MessageListItem { + uint32 messageNum; + uint32 messageValue; +}; + +class Scene : public Entity { +public: + Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); + virtual ~Scene(); + virtual void draw(); + void addEntity(Entity *entity); + bool removeEntity(Entity *entity); + void addSurface(BaseSurface *surface); + bool removeSurface(BaseSurface *surface); + Sprite *addSprite(Sprite *sprite); + void setSurfacePriority(BaseSurface *surface, int priority); + void deleteSprite(Sprite **sprite); +protected: + Module *_parentModule; + Common::Array _entities; + Common::Array _surfaces; + bool _systemCallbackFlag; + MessageListItem *_messageList; + int _messageListIndex; + int _messageListCount; + bool _messageListFlag1; + NPoint _mouseClickPos; + bool _mouseClicked; + // TODO RectResource _rectResource; + // TODO 00000080 rectList dd ? + // TODO 00000084 rectType dw ? + // TODO 00000086 rectListCount dw ? + // TODO 00000088 someRects dd ? + // TODO 0000008C someRectsCount dw ? + // TODO 0000008E field_8E dw ? + // TODO 00000090 playerSprite dd ? + // TODO 00000094 mouseSprite dd ? + Palette *_palette; + // TODO 0000009C class300 dd ? + bool _surfaceFlag; + bool _messageListFlag; + MessageListItem *_messageList2; + int _messageListStatus; + // TODO 000000B0 smackerPlayer dd ? + void (Entity::*_savedUpdateHandlerCb)(); + uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); + bool _smackerDone; + // TODO 000000BD field_BD db ? + // TODO 000000BE field_BE db ? + // TODO 000000BF field_BF db ? + uint32 _smkFileHash; + // TODO 000000C4 hitArray dd ? + bool _messageListFlag2; + bool _prevVisible; + int _messageValue; + // TODO 000000CF field_CF db ? + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void smackerUpdate(); + uint32 smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_SCENE_H */ diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp new file mode 100644 index 0000000000..6ee0a6633c --- /dev/null +++ b/engines/neverhood/sprite.cpp @@ -0,0 +1,179 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/sprite.h" + +namespace Neverhood { + +// Sprite + +Sprite::Sprite(NeverhoodEngine *vm, int objectPriority) + : Entity(vm, objectPriority), _x(0), _y(0), + _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), + _doDeltaX(false), _doDeltaY(false), _needRedraw(false), + _deltaX1(0), _deltaY1(0), _deltaX2(0), _deltaY2(0), + _flags(0) { + + SetMessageHandler(&Sprite::handleMessage); + +} + +Sprite::~Sprite() { + delete _surface; +} + +void Sprite::processDelta() { + if (_doDeltaX) { + _rect.x1 = _x - _deltaX1 - _deltaX2 + 1; + _rect.x2 = _x - _deltaX1; + } else { + _rect.x1 = _x + _deltaX1; + _rect.x2 = _x + _deltaX1 + _deltaX2 - 1; + } + if (_doDeltaY) { + _rect.y1 = _y - _deltaY1 - _deltaY2 + 1; + _rect.y2 = _y - _deltaY1; + } else { + _rect.y1 = _y + _deltaY1; + _rect.y2 = _y + _deltaY1 + _deltaY2 - 1; + } +} + +void Sprite::setDoDeltaX(int type) { + // Clear, set or toggle + _doDeltaX = type == 2 ? !_doDeltaX : type == 1; +} + +void Sprite::setDoDeltaY(int type) { + // Clear, set or toggle + _doDeltaY = type == 2 ? !_doDeltaY : type == 1; +} + +bool Sprite::isPointInside(int16 x, int16 y) { + return x >= _rect.x1 && x <= _rect.x2 && y >= _rect.y1 && y <= _rect.y2; +} + +uint32 Sprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + if (messageNum == 5) { + // TODO: Draw debug marker (?) + // TODO g_Screen->drawLine(_x - 5, _y, _x + 6, _y); + // TODO g_Screen->drawLine(_x, _y - 5, _x, _y + 6); + } + return 0; +} + +void Sprite::createSurface(int surfacePriority, int16 width, int16 height) { + _surface = new BaseSurface(_vm, surfacePriority, width, height); +} + +// StaticSprite + +StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) + : Sprite(vm, objectPriority), _spriteResource(vm) { + +} + +StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height) + : Sprite(vm, 0), _spriteResource(vm) { + + // TODO init(calcHash(filename), surfacePriority, x, y, width, height); + +} + +StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) + : Sprite(vm, 0), _spriteResource(vm) { + + init(fileHash, surfacePriority, x, y, width, height); + +} + +void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) { + + _spriteResource.load2(fileHash); + + if (width == 0) + width = _spriteResource.getDimensions().width; + + if (height == 0) + height = _spriteResource.getDimensions().height; + + createSurface(surfacePriority, width, height); + + _x = x == kDefPosition ? _spriteResource.getPosition().x : x; + _y = y == kDefPosition ? _spriteResource.getPosition().y : y; + + _rect1.x1 = 0; + _rect1.y1 = 0; + _rect1.x2 = width; + _rect1.y2 = height; + + _needRedraw = true; + + update(); + +} + +void StaticSprite::update() { + + if (!_surface) + return; + + if (_doDeltaX) { + _x = filterX(_x - _rect1.x1 - _rect1.x2 + 1); + } else { + _x = filterX(_x + _rect1.x1); + } + + if (_doDeltaY) { + _y = filterY(_y - _rect1.y1 - _rect1.y2 + 1); + } else { + _y = filterY(_y + _rect1.y1); + } + + if (_needRedraw) { + // TODO _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2); + _needRedraw = false; + } + +} + +void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { + + _spriteResource.load2(fileHash); + + if (dimensions) { + _rect1.x1 = 0; + _rect1.y1 = 0; + _rect1.x2 = _spriteResource.getDimensions().width; + _rect1.y2 = _spriteResource.getDimensions().height; + } + + if (position) { + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + } + + _needRedraw = true; + +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h new file mode 100644 index 0000000000..5c08e3c66f --- /dev/null +++ b/engines/neverhood/sprite.h @@ -0,0 +1,90 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_SPRITE_H +#define NEVERHOOD_SPRITE_H + +#include "neverhood/neverhood.h" +#include "neverhood/entity.h" +#include "neverhood/graphics.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +#define SetSpriteCallback(callback) _spriteCallbackCb = static_cast (callback) +#define SetFilterX(callback) _filterXCb = static_cast (callback) +#define SetFilterY(callback) _filterYCb = static_cast (callback) + +const int16 kDefPosition = -32768; + +class Sprite : public Entity { +public: + Sprite(NeverhoodEngine *vm, int objectPriority); + ~Sprite(); + BaseSurface *getSurface() { return _surface; } + void processDelta(); + void setDoDeltaX(int type); + void setDoDeltaY(int type); + bool isPointInside(int16 x, int16 y); +protected: + void (Sprite::*_spriteUpdateCb)(); + int16 (Sprite::*_filterXCb)(int16); + int16 (Sprite::*_filterYCb)(int16); + BaseSurface *_surface; + int16 _x, _y; + bool _doDeltaX, _doDeltaY; + bool _needRedraw; + //0000002B field_2B db ? + //0000002C field2C dd ? // unused + NRect _rect1; + int16 _deltaX1, _deltaY1; + int16 _deltaX2, _deltaY2; + NRect _rect; + uint16 _flags; + //0000004A field4A dw ? // seems to be unused except in ctor + //0000004C rectResource RectResource ? + //void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createSurface(int surfacePriority, int16 width, int16 height); + int16 filterX(int16 x) { + return _filterXCb ? (this->*_filterXCb)(x) : x; + } + int16 filterY(int16 y) { + return _filterYCb ? (this->*_filterYCb)(y) : y; + } +}; + +class StaticSprite : public Sprite { +public: + StaticSprite(NeverhoodEngine *vm, int objectPriority); + StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height); + StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height); + void load(uint32 fileHash, bool dimensions, bool position); +protected: + SpriteResource _spriteResource; + void init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height); + void update(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_SPRITE_H */ -- cgit v1.2.3 From 0614b288cfc38180eddd90a41cf726718d823e13 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 30 Jun 2011 10:08:47 +0000 Subject: NEVERHOOD: Add default parameters to StaticSprite constructors --- engines/neverhood/sprite.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 5c08e3c66f..c2ed720fb0 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -76,8 +76,8 @@ protected: class StaticSprite : public Sprite { public: StaticSprite(NeverhoodEngine *vm, int objectPriority); - StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height); - StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height); + StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); + StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); void load(uint32 fileHash, bool dimensions, bool position); protected: SpriteResource _spriteResource; -- cgit v1.2.3 From f01f9343c831cda618dabd2dcda7be77b2948ecc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 1 Jul 2011 10:25:55 +0000 Subject: NEVERHOOD: Start with AnimatedSprite and AnimResource --- engines/neverhood/graphics.h | 3 + engines/neverhood/neverhood.cpp | 9 +- engines/neverhood/resource.cpp | 153 +++++++++++++++++++++ engines/neverhood/resource.h | 38 ++++++ engines/neverhood/sprite.cpp | 287 ++++++++++++++++++++++++++++++++++++++-- engines/neverhood/sprite.h | 55 +++++++- 6 files changed, 533 insertions(+), 12 deletions(-) diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 68ff84dc25..cb7474c78d 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -62,6 +62,9 @@ public: void drawSpriteResource(SpriteResource &spriteResource); int getPriority() const { return _priority; } void setPriority(int priority) { _priority = priority; } + NDrawRect& getDrawRect() { return _drawRect; } + NDrawRect& getSysRect() { return _sysRect; } + NRect& getClipRect() { return _clipRect; } protected: NeverhoodEngine *_vm; int _priority; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index d4418cb8cd..2f27fca2df 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -112,7 +112,7 @@ Common::Error NeverhoodEngine::run() { _res->unuseResource(resourceHandle); #endif -#if 1 +#if 0 { // Create a new scope SpriteResource r(this); BaseSurface *surf = new BaseSurface(this, 0, 640, 480); @@ -123,6 +123,13 @@ Common::Error NeverhoodEngine::run() { } #endif +#if 1 + { // Create a new scope + AnimResource r(this); + r.load(0x000540B0); + } +#endif + delete _res; return Common::kNoError; diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 4dcbd838fe..84eab7fe0e 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -25,6 +25,8 @@ namespace Neverhood { +// SpriteResource + SpriteResource::SpriteResource(NeverhoodEngine *vm) : _vm(vm), _resourceHandle(-1), _pixels(NULL) { } @@ -87,6 +89,8 @@ void SpriteResource::unload() { _rle = false; } +// PaletteResource + PaletteResource::PaletteResource(NeverhoodEngine *vm) : _vm(vm), _resourceHandle(-1), _palette(NULL) { } @@ -134,4 +138,153 @@ void PaletteResource::copyPalette(byte *destPalette) { } } +// AnimResource + +AnimResource::AnimResource(NeverhoodEngine *vm) + : _vm(vm), _width(0), _height(0), _currSpriteData(NULL) { + + clear(); + clear2(); +} + +AnimResource::~AnimResource() { + unloadInternal(); +} + +bool AnimResource::load(uint32 fileHash) { + + if (fileHash == _fileHash) + return true; + + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle == -1) + return false; + + byte *resourceData, *animList, *frameList; + uint16 animInfoStartOfs, animListIndex, animListCount; + uint16 frameListStartOfs, frameCount; + uint32 spriteDataOfs, paletteDataOfs; + + if (_vm->_res->getResourceType(_resourceHandle) != 4) { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + return false; + } + + resourceData = _vm->_res->loadResource(_resourceHandle); + if (!resourceData) { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + return false; + } + + animListCount = READ_LE_UINT16(resourceData); + animInfoStartOfs = READ_LE_UINT16(resourceData + 2); + spriteDataOfs = READ_LE_UINT32(resourceData + 4); + paletteDataOfs = READ_LE_UINT32(resourceData + 8); + + animList = resourceData + 12; + for (animListIndex = 0; animListIndex < animListCount; animListIndex++) { + debug("hash: %08X", READ_LE_UINT32(animList)); + if (READ_LE_UINT32(animList) == fileHash) + break; + animList += 8; + } + + if (animListIndex >= animListCount) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + return false; + } + + _spriteData = resourceData + spriteDataOfs; + if (paletteDataOfs > 0) + _paletteData = resourceData + paletteDataOfs; + + frameCount = READ_LE_UINT16(animList + 4); + frameListStartOfs = READ_LE_UINT16(animList + 6); + + debug("frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs); + + frameList = resourceData + animInfoStartOfs + frameListStartOfs; + + _frames.clear(); + _frames.reserve(frameCount); + + for (uint16 frameIndex = 0; frameIndex < frameCount; frameIndex++) { + AnimFrameInfo frameInfo; + frameInfo.frameHash = READ_LE_UINT32(frameList); + frameInfo.counter = READ_LE_UINT16(frameList + 4); + frameInfo.rect.x1 = READ_LE_UINT16(frameList + 6); + frameInfo.rect.y1 = READ_LE_UINT16(frameList + 8); + frameInfo.rect.x2 = READ_LE_UINT16(frameList + 10); + frameInfo.rect.y2 = READ_LE_UINT16(frameList + 12); + frameInfo.deltaX = READ_LE_UINT16(frameList + 14); + frameInfo.deltaY = READ_LE_UINT16(frameList + 16); + frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); + frameInfo.deltaRect.y = READ_LE_UINT16(frameList + 20); + frameInfo.deltaRect.width = READ_LE_UINT16(frameList + 22); + frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24); + frameInfo.field_1A = READ_LE_UINT16(frameList + 26); + frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28); + debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", + frameInfo.frameHash, frameInfo.counter, + frameInfo.rect.x1, frameInfo.rect.y1, frameInfo.rect.x2, frameInfo.rect.y2, + frameInfo.deltaX, frameInfo.deltaY, + frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height, + frameInfo.field_1A, frameInfo.spriteDataOffs); + frameList += 32; + _frames.push_back(frameInfo); + } + + _fileHash = fileHash; + + return true; + +} + +void AnimResource::unload() { + if (_resourceHandle != -1) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + clear(); + } +} + +void AnimResource::clear() { + _resourceHandle = -1; + // _count = 0; + // _infoStructs = NULL; + _currSpriteData = NULL; + _fileHash = 0; + _paletteData = NULL; + _spriteData = NULL; +} + +void AnimResource::clear2() { + clear(); + _replEnabled = true; + _replOldByte = 0; + _replNewByte = 0; +} + +bool AnimResource::loadInternal(uint32 fileHash) { + unloadInternal(); + return load(fileHash); +} + +void AnimResource::unloadInternal() { + unload(); + clear2(); +} + +int16 AnimResource::getFrameIndex(uint32 frameHash) { + for (uint i = 0; i < _frames.size(); i++) + if (_frames[i].frameHash == frameHash) + return (int16)i; + return -1; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 5a30d1292d..8cab1eb565 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -61,6 +61,44 @@ protected: byte *_palette; }; +struct AnimFrameInfo { + uint32 frameHash; + int16 counter; + NRect rect; + int16 deltaX, deltaY; + NDrawRect deltaRect; + uint16 field_1A; + uint32 spriteDataOffs; +}; + +class AnimResource { +public: + AnimResource(NeverhoodEngine *vm); + ~AnimResource(); + bool load(uint32 fileHash); + void unload(); + void clear(); + void clear2(); + bool loadInternal(uint32 fileHash); + void unloadInternal(); + uint getFrameCount() const { return _frames.size(); } + const AnimFrameInfo& getFrameInfo(int16 index) const { return _frames[index]; } + int16 getFrameIndex(uint32 frameHash); +protected: + NeverhoodEngine *_vm; + int _resourceHandle; + int16 _width, _height; + byte *_currSpriteData; + uint32 _fileHash; + byte *_paletteData; + byte *_spriteData; + bool _replEnabled; + byte _replOldByte; + byte _replNewByte; + Common::Array _frames; +}; + + } // End of namespace Neverhood #endif /* NEVERHOOD_RESOURCE_H */ diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 6ee0a6633c..0157673250 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -30,7 +30,6 @@ Sprite::Sprite(NeverhoodEngine *vm, int objectPriority) : Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), _doDeltaX(false), _doDeltaY(false), _needRedraw(false), - _deltaX1(0), _deltaY1(0), _deltaX2(0), _deltaY2(0), _flags(0) { SetMessageHandler(&Sprite::handleMessage); @@ -43,18 +42,18 @@ Sprite::~Sprite() { void Sprite::processDelta() { if (_doDeltaX) { - _rect.x1 = _x - _deltaX1 - _deltaX2 + 1; - _rect.x2 = _x - _deltaX1; + _rect.x1 = _x - _deltaRect.x - _deltaRect.width + 1; + _rect.x2 = _x - _deltaRect.x; } else { - _rect.x1 = _x + _deltaX1; - _rect.x2 = _x + _deltaX1 + _deltaX2 - 1; + _rect.x1 = _x + _deltaRect.x; + _rect.x2 = _x + _deltaRect.x + _deltaRect.width - 1; } if (_doDeltaY) { - _rect.y1 = _y - _deltaY1 - _deltaY2 + 1; - _rect.y2 = _y - _deltaY1; + _rect.y1 = _y - _deltaRect.y - _deltaRect.height + 1; + _rect.y2 = _y - _deltaRect.y; } else { - _rect.y1 = _y + _deltaY1; - _rect.y2 = _y + _deltaY1 + _deltaY2 - 1; + _rect.y1 = _y + _deltaRect.y; + _rect.y2 = _y + _deltaRect.y + _deltaRect.height - 1; } } @@ -176,4 +175,274 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { } +// AnimatedSprite + +AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, int objectPriority) + : Sprite(vm, objectPriority), _animResource(vm) { + + init(); +} + +AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y) + : Sprite(vm, 1100), _animResource(vm) { + + init(); + SetUpdateHandler(&AnimatedSprite::update); + createSurface1(fileHash, surfacePriority); + _x = x; + _y = y; + setFileHash(fileHash, 0, -1); + +} + +void AnimatedSprite::init() { + _counter = 0; + _fileHash1 = 0; + _deltaX = 0; + _deltaY = 0; + _fileHash2 = 0; + // TODO _callbackList = 0; + _frameIndex3 = 0; + // TODO _callback3 = 0; + _frameIndex = 0; + _hashListIndex = -1; + // TODO _callback2 = 0; + _newHashListIndex = -1; + // TODO _callback1 = 0; + _fileHash4 = 0; + _flag = false; + _replOldByte = 0; + _replNewByte = 0; + // TODO _animResource.replEnabled = 0; + _playBackwards = 0; +} + +void AnimatedSprite::update() { + updateAnim(); + handleSpriteUpdate(); + updatePosition(); +} + +void AnimatedSprite::updateDeltaXY() { + if (_doDeltaX) { + _x -= _deltaX; + } else { + _x += _deltaX; + } + if (_doDeltaY) { + _y -= _deltaY; + } else { + _y += _deltaY; + } + _deltaX = 0; + _deltaY = 0; + processDelta(); +} + +void AnimatedSprite::updateAnim() { + + _flag = false; + + if (_fileHash1 == 0) { + if (_newHashListIndex != -1) { + _hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex; + _newHashListIndex = -1; + } else if (_fileHash4 != 0) { + _hashListIndex = MAX(0, _animResource.getFrameIndex(_fileHash4)); + _fileHash4 = 0; + } + if (_fileHash1 == 0 && _frameIndex != _hashListIndex) { + if (_counter != 0) + _counter--; + if (_counter == 0 && _animResource.getFrameCount() != 0) { + + if (_fileHash2 != 0) { + if (_animResource.loadInternal(_fileHash2)) { + _fileHash3 = _fileHash2; + } else { + // TODO _animResource.loadInternal(calcHash("sqDefault")); + _fileHash3 = 0; + } + // loc_43831D + if (_replNewByte != _replOldByte) { + // TODO _animResource.setRepl(_replOldByte, _replNewByte); + } + _fileHash2 = 0; + if (_status != 0) { + _frameIndex = _fileHash6 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash6)) : 0; + _frameIndex2 = _fileHash5 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1; + } else { + _frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1; + _frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; + } + } else { + // TODO updateFrameIndex(); + } + if (_fileHash1 == 0) + updateFrameInfo(); + } + } + } + + if (_fileHash1 != 0) { + if (_status == 2) { + _hashListIndex = _frameIndex; + } else { + if (_status == 1) { + if (_animResource.loadInternal(_fileHash1)) { + _fileHash3 = _fileHash1; + } else { + // TODO _animResource.loadInternal(calcHash("sqDefault")); + _fileHash3 = 0; + } + if (_replNewByte != _replOldByte) { + // TODO _animResource.setRepl(_replOldByte, _replNewByte); + } + _fileHash1 = 0; + _frameIndex = _fileHash6 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash6)) : 0; + _frameIndex2 = _fileHash5 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1; + } else { + if (_animResource.loadInternal(_fileHash1)) { + _fileHash3 = _fileHash1; + } else { + // TODO _animResource.loadInternal(calcHash("sqDefault")); + _fileHash3 = 0; + } + if (_replNewByte != _replOldByte) { + // TODO _animResource.setRepl(_replOldByte, _replNewByte); + } + _fileHash1 = 0; + _frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1; + _frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; + } + updateFrameInfo(); + } + + if (_newHashListIndex != -1) { + _hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex; + _newHashListIndex = -1; + } else if (_fileHash4 != 0) { + _hashListIndex = MAX(0, _animResource.getFrameIndex(_fileHash4)); + _fileHash4 = 0; + } + + } + +} + +void AnimatedSprite::updatePosition() { + + if (!_surface) + return; + + if (_doDeltaX) { + _surface->getDrawRect().x = filterX(_x - _rect1.x1 - _rect1.x2 + 1); + } else { + _surface->getDrawRect().x = filterX(_x + _rect1.x1); + } + + if (_doDeltaY) { + _surface->getDrawRect().y = filterY(_y - _rect1.y1 - _rect1.y2 + 1); + } else { + _surface->getDrawRect().y = filterY(_y + _rect1.y1); + } + + if (_needRedraw) { + // TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2); + _needRedraw = false; + } + +} + +void AnimatedSprite::updateFrameIndex() { + if (!_playBackwards) { + if (_frameIndex < _frameIndex2) { + _frameIndex++; + } else { + // Inform self about end of current animation + // The caller can then e.g. set a new animation fileHash + sendMessage(0x3002, 0, this); + if (_fileHash1 == 0) + _frameIndex = 0; + } + } else { + if (_frameIndex > 0) { + _frameIndex--; + } else { + sendMessage(0x3002, 0, this); + if (_fileHash1 == 0) + _frameIndex = _frameIndex2; + } + } +} + +void AnimatedSprite::updateFrameInfo() { + + const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex); + + _flag = true; + _rect1 = frameInfo.rect; + _deltaX = frameInfo.deltaX; + _deltaY = frameInfo.deltaY; + _deltaRect = frameInfo.deltaRect; + _counter = frameInfo.counter; + + processDelta(); + + _needRedraw = true; + + if (frameInfo.frameHash != 0) { + sendMessage(0x100D, frameInfo.frameHash, this); + } + +} + +void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { + NDimensions dimensions; + // TODO dimensions = getAnimatedSpriteDimensions(fileHash); + dimensions.width = 640; + dimensions.height = 480; + _surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height); +} + +void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) { + _fileHash1 = fileHash; + _frameIndex3 = frameIndex3; + _frameIndex4 = frameIndex4; + _fileHash4 = 0; + _status = 0; + _playBackwards = false; + _newHashListIndex = -1; + _hashListIndex = -1; +} + +void AnimatedSprite::setFileHash1() { + _fileHash1 = 1; + _status = 2; +} + +void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) { + _fileHash1 = fileHash; + _fileHash6 = fileHash6; + _fileHash5 = fileHash5; + _fileHash4 = 0; + _status = 1; + _playBackwards = false; + _newHashListIndex = -1; + _hashListIndex = -1; +} + +void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5) { + _fileHash2 = fileHash2; + _fileHash6 = fileHash6; + _fileHash5 = fileHash5; + _fileHash4 = 0; + _status = 1; + _playBackwards = false; + _newHashListIndex = -1; + _hashListIndex = -1; +} + + + } // End of namespace Neverhood diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index c2ed720fb0..708228ca2f 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -56,8 +56,7 @@ protected: //0000002B field_2B db ? //0000002C field2C dd ? // unused NRect _rect1; - int16 _deltaX1, _deltaY1; - int16 _deltaX2, _deltaY2; + NDrawRect _deltaRect; NRect _rect; uint16 _flags; //0000004A field4A dw ? // seems to be unused except in ctor @@ -65,6 +64,10 @@ protected: //void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createSurface(int surfacePriority, int16 width, int16 height); + void handleSpriteUpdate() { + if (_spriteUpdateCb) + (this->*_spriteUpdateCb)(); + } int16 filterX(int16 x) { return _filterXCb ? (this->*_filterXCb)(x) : x; } @@ -85,6 +88,54 @@ protected: void update(); }; +class AnimatedSprite : public Sprite { +public: + AnimatedSprite(NeverhoodEngine *vm, int objectPriority); + AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y); +protected: + AnimResource _animResource; + uint32 _fileHash1; + uint32 _fileHash2; + uint32 _fileHash3; + int16 _frameIndex; + int16 _frameIndex3; + int16 _frameIndex2; + int16 _frameIndex4; + uint32 _fileHash6; + uint32 _fileHash5; + int16 _status; + int16 _counter; + int _hashListIndex; + int _newHashListIndex; + uint32 _fileHash4; + int16 _deltaX, _deltaY; + byte _replOldByte; + byte _replNewByte; + bool _playBackwards; + bool _flag; + /* TODO + callbackListIndex dw ? + callbackListCount dw ? + callbackList dd ? + callback3 dd ? + callback2 dd ? + callback1 dd ? + */ + void init(); + void update(); + void updateDeltaXY(); + void updateAnim(); + void updatePosition(); + void updateFrameIndex(); + void updateFrameInfo(); + void createSurface1(uint32 fileHash, int surfacePriority); + void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4); + void setFileHash1(); + void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5); + void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); + int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!! +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_SPRITE_H */ -- cgit v1.2.3 From 3c82668fe4267b34a9e3c7fe88f0d2a0fcfc4c4b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 1 Jul 2011 13:20:46 +0000 Subject: NEVERHOOD: More work on Module1500 - Implement Scene1501 (with yet unimpelemented stuff commented out) - Add preliminary main loop to test stuff/updates - Add dummy SoundResource - And fix a mean bug/typo in some initializer lists... (The intro now "runs" but doesn't show anything yet since the actual display code and other classes are not yet implemented yet.) --- engines/neverhood/gamemodule.cpp | 25 ++++++++--- engines/neverhood/module.cpp | 2 +- engines/neverhood/module1500.cpp | 91 ++++++++++++++++++++++++++++++++++++++-- engines/neverhood/module1500.h | 16 +++++++ engines/neverhood/neverhood.cpp | 91 ++++++++++++++++++++++------------------ engines/neverhood/neverhood.h | 4 +- engines/neverhood/resource.h | 9 ++++ engines/neverhood/scene.h | 2 +- 8 files changed, 186 insertions(+), 54 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 09046cfa3e..e46d23c420 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -22,20 +22,22 @@ #include "neverhood/gamemodule.h" +#include "neverhood/module1500.h" + namespace Neverhood { GameModule::GameModule(NeverhoodEngine *vm) - : Module(_vm, NULL) { + : Module(vm, NULL) { // Other initializations moved to actual engine class // TODO // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); - - SetMessageHandler(&GameModule::handleMessage); + + startup(); } @@ -49,6 +51,8 @@ GameModule::~GameModule() { // TODO: Set palette to black but probably not neccessary // TODO Sound1ChList_sub_408480(); + + // TODO Set debug vars (maybe) } @@ -84,15 +88,24 @@ void GameModule::startup() { } void GameModule::createModule1500(int which) { - // TODO _someFlag1 = false; // TODO *getGlobalGameVarValuePtr(0x91080831) = 0x0F10114; - // TODO _childObject = new Module1500(this, which, true); + _childObject = new Module1500(_vm, this, which, true); SetUpdateHandler(&GameModule::updateModule1500); } void GameModule::updateModule1500() { - // TODO + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + debug("Done..."); + // TODO createModule1000(); + // TODO _childObject->handleUpdate(); + } } } // End of namespace Neverhood diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 1aa1203885..c46aa79ea2 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -25,7 +25,7 @@ namespace Neverhood { Module::Module(NeverhoodEngine *vm, Module *parentModule) - : Entity(_vm, 0), _parentModule(parentModule), _childObject(NULL), + : Entity(vm, 0), _parentModule(parentModule), _childObject(NULL), _done(false), _field24(-1), _field26(-1), _field28(-1) { SetMessageHandler(&Module::handleMessage); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 05a3bec907..f4c77948b4 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -26,6 +26,8 @@ namespace Neverhood { Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag) : Module(vm, parentModule), _flag(flag) { + + debug("Create Module1500(%d)", which); if (which < 0) { switch (_vm->gameState().sceneNum) { @@ -75,19 +77,100 @@ void Module1500::update() { } void Module1500::createScene1501() { - // TODO + debug("createScene1501"); + _vm->gameState().sceneNum = 0; + _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); + SetUpdateHandler(&Module1500::update); } void Module1500::createScene1502() { - // TODO + debug("createScene1502"); + _vm->gameState().sceneNum = 1; + _childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48); + SetUpdateHandler(&Module1500::update); } void Module1500::createScene1503() { - // TODO + debug("createScene1503"); + // TODO: This uses the MultiSmackerPlayer + // Game will crash now... } void Module1500::createScene1504() { - // TODO + debug("createScene1504"); + _vm->gameState().sceneNum = 3; + _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); + SetUpdateHandler(&Module1500::update); +} + +// Scene1501 + +Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) + : Scene(vm, parentModule, true), _soundResource(vm), + _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) { + + debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3); + + SetUpdateHandler(&Scene1501::update); + SetMessageHandler(&Scene1501::handleMessage); + + _surfaceFlag = true; + + _palette = new Palette(_vm);//DUMMY! + + /* TODO + + _background = addBackground(new Class301(_vm, backgroundFileHash, 0, 0)); + + _palette = new Palette2(_vm); + _palette->usePalette(); + addEntity(_palette); + Palette2_sub_47BF00(backgroundFileHash, 0, 256, 0); + Palette2_sub_47C060(12); + + if (soundFileHash != 0) { + _soundResource.set(soundFileHash); + _soundResource.load(); + _soundResource.play(); + } + */ + +} + +void Scene1501::update() { + + Scene::update(); + + // TODO: Since these countdowns are used a lot, maybe these can be wrapped in a class/struct + // so the code gets a little cleaner. + + if (_countdown1 != 0) { + _countdown1--; + if (_countdown1 == 0) { + // TODO g_screen->clear(0); + _parentModule->sendMessage(0x1009, 0, this); + } + } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !_soundResource.isPlaying()) { + _countdown1 = 12; + _palette->startFadeToBlack(11); + } + + if (_countdown3 != 0) + _countdown3--; + + if (_countdown3 == 0 && _flag && _countdown1 == 0) { + _countdown1 = 12; + _palette->startFadeToBlack(11); + } + +} + +uint32 Scene1501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + if (messageNum == 0x0009) { + _flag = true; + } + return messageResult; } } // End of namespace Neverhood diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h index d4a4310cdc..66eef59073 100644 --- a/engines/neverhood/module1500.h +++ b/engines/neverhood/module1500.h @@ -27,6 +27,9 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/graphics.h" +#include "neverhood/palette.h" namespace Neverhood { @@ -42,6 +45,19 @@ protected: void createScene1504(); }; +class Scene1501 : public Scene { +public: + Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3); +protected: + SoundResource _soundResource; + int _countdown1; + int _countdown2; + int _countdown3; + bool _flag; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1500_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 2f27fca2df..ac89a3e658 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -38,6 +38,7 @@ #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" +#include "neverhood/gamemodule.h" #include "neverhood/graphics.h" #include "neverhood/resourceman.h" #include "neverhood/resource.h" @@ -123,55 +124,65 @@ Common::Error NeverhoodEngine::run() { } #endif -#if 1 +#if 0 { // Create a new scope AnimResource r(this); r.load(0x000540B0); } #endif - - delete _res; - return Common::kNoError; -} + _gameModule = new GameModule(this); -void NeverhoodEngine::updateEvents() { - Common::Event event; - Common::EventManager *eventMan = _system->getEventManager(); - - while (eventMan->pollEvent(event)) { - switch (event.type) { - case Common::EVENT_KEYDOWN: - _keyState = event.kbd.keycode; - break; - case Common::EVENT_KEYUP: - _keyState = Common::KEYCODE_INVALID; - break; - case Common::EVENT_MOUSEMOVE: - _mouseX = event.mouse.x; - _mouseY = event.mouse.y; - break; - /* - case Common::EVENT_LBUTTONDOWN: - _buttonState |= kLeftButton; - break; - case Common::EVENT_LBUTTONUP: - _buttonState &= ~kLeftButton; - break; - case Common::EVENT_RBUTTONDOWN: - _buttonState |= kRightButton; - break; - case Common::EVENT_RBUTTONUP: - _buttonState &= ~kRightButton; - break; - case Common::EVENT_QUIT: - _system->quit(); - break; - */ - default: - break; + while (1) { + Common::Event event; + Common::EventManager *eventMan = _system->getEventManager(); + + while (eventMan->pollEvent(event)) { + switch (event.type) { + case Common::EVENT_KEYDOWN: + _keyState = event.kbd.keycode; + break; + case Common::EVENT_KEYUP: + _keyState = Common::KEYCODE_INVALID; + break; + case Common::EVENT_MOUSEMOVE: + _mouseX = event.mouse.x; + _mouseY = event.mouse.y; + break; + /* + case Common::EVENT_LBUTTONDOWN: + _buttonState |= kLeftButton; + break; + case Common::EVENT_LBUTTONUP: + _buttonState &= ~kLeftButton; + break; + case Common::EVENT_RBUTTONDOWN: + _buttonState |= kRightButton; + break; + case Common::EVENT_RBUTTONUP: + _buttonState &= ~kRightButton; + break; + case Common::EVENT_QUIT: + _system->quit(); + break; + */ + default: + break; + } } + + _gameModule->handleUpdate(); + _system->updateScreen(); + } + + delete _gameModule; + + delete _res; + + debug("Ok."); + + return Common::kNoError; } } // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 8a95b05f94..b261a087f0 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -44,6 +44,7 @@ enum NeverhoodGameFeatures { struct NeverhoodGameDescription; class ResourceMan; +class GameModule; struct GameState { int sceneNum; @@ -74,8 +75,7 @@ public: GameState _gameState; ResourceMan *_res; - - void updateEvents(); + GameModule *_gameModule; public: diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 8cab1eb565..6a76a73a64 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -98,6 +98,15 @@ protected: Common::Array _frames; }; +// TODO: Dummy class atm + +class SoundResource { +public: + SoundResource(NeverhoodEngine *vm) : _vm(vm) {} + bool isPlaying() const { return false; } +protected: + NeverhoodEngine *_vm; +}; } // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 3532a43b0b..e5a3d0ecee 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -71,7 +71,7 @@ protected: // TODO 00000090 playerSprite dd ? // TODO 00000094 mouseSprite dd ? Palette *_palette; - // TODO 0000009C class300 dd ? + // TODO Background *_background; bool _surfaceFlag; bool _messageListFlag; MessageListItem *_messageList2; -- cgit v1.2.3 From 44ab81eab83189bfa0693fca564543227d423799 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 3 Jul 2011 12:09:48 +0000 Subject: NEVERHOOD: Start with the Screen class, also - Move common headers used in modules to module.h so they don't have to be explicitly #included in each module header - Clean up #includes --- engines/neverhood/module.h | 3 ++ engines/neverhood/module.mk | 1 + engines/neverhood/module1500.cpp | 2 +- engines/neverhood/module1500.h | 2 - engines/neverhood/neverhood.cpp | 14 ++----- engines/neverhood/neverhood.h | 8 ++-- engines/neverhood/scene.cpp | 6 +-- engines/neverhood/screen.cpp | 88 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/screen.h | 54 ++++++++++++++++++++++++ 9 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 engines/neverhood/screen.cpp create mode 100644 engines/neverhood/screen.h diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 432a04c043..b59b532fad 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -27,6 +27,9 @@ #include "neverhood/neverhood.h" #include "neverhood/entity.h" +#include "neverhood/graphics.h" +#include "neverhood/palette.h" +#include "neverhood/screen.h" namespace Neverhood { diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 709538e565..e51565f76b 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -13,6 +13,7 @@ MODULE_OBJS = \ resource.o \ resourceman.o \ scene.o \ + screen.o \ sprite.o # This module can be built as a plugin diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index f4c77948b4..97d125a45f 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -147,7 +147,7 @@ void Scene1501::update() { if (_countdown1 != 0) { _countdown1--; if (_countdown1 == 0) { - // TODO g_screen->clear(0); + _vm->_screen->clear(); _parentModule->sendMessage(0x1009, 0, this); } } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !_soundResource.isPlaying()) { diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h index 66eef59073..e3633a0e85 100644 --- a/engines/neverhood/module1500.h +++ b/engines/neverhood/module1500.h @@ -28,8 +28,6 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" -#include "neverhood/graphics.h" -#include "neverhood/palette.h" namespace Neverhood { diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index ac89a3e658..4baff5eafa 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -20,28 +20,19 @@ * */ -#include "common/events.h" -#include "common/keyboard.h" #include "common/file.h" -#include "common/random.h" -#include "common/savefile.h" #include "common/config-manager.h" - #include "base/plugins.h" #include "base/version.h" - #include "graphics/cursorman.h" - #include "engines/util.h" - -#include "audio/mixer.h" - #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" #include "neverhood/gamemodule.h" #include "neverhood/graphics.h" #include "neverhood/resourceman.h" #include "neverhood/resource.h" +#include "neverhood/screen.h" namespace Neverhood { @@ -71,6 +62,8 @@ Common::Error NeverhoodEngine::run() { _isSaveAllowed = false; + _screen = new Screen(this); + _res = new ResourceMan(); _res->addArchive("a.blb"); _res->addArchive("c.blb"); @@ -179,6 +172,7 @@ Common::Error NeverhoodEngine::run() { delete _gameModule; delete _res; + delete _screen; debug("Ok."); diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index b261a087f0..c13ac517fb 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -29,11 +29,7 @@ #include "common/random.h" #include "common/savefile.h" #include "common/system.h" - #include "audio/mixer.h" - -#include "graphics/surface.h" - #include "engines/engine.h" namespace Neverhood { @@ -43,8 +39,9 @@ enum NeverhoodGameFeatures { struct NeverhoodGameDescription; -class ResourceMan; class GameModule; +class ResourceMan; +class Screen; struct GameState { int sceneNum; @@ -74,6 +71,7 @@ public: uint16 _buttonState; GameState _gameState; + Screen *_screen; ResourceMan *_res; GameModule *_gameModule; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index ccdae3a287..f1209318ec 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -39,13 +39,13 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) // TODO _playerSprite = NULL; // TODO _mouseSprite = NULL; _palette = NULL; - // TODO _class300 = NULL; + // TODO _background = NULL; // TODO _field_8E = -1; if (clearHitRects) { // TODO g_Class700->setHitRects(NULL, 0); // TODO g_Class700->clear(); } - // TODO g_screen->setFps(24); + _vm->_screen->setFps(24); // TODO g_screen->hSmack = NULL; // TODO g_screen->field_24 = 0; // TODO g_screen->field_26 = 0; @@ -292,7 +292,7 @@ void Scene::smackerUpdate() { _messageHandlerCb = _savedMessageHandlerCb; if (_palette) _palette->usePalette(); - // TODO class300->restore(); + // TODO _background->restore(); // TODO g_screen->smackerPlayer = NULL; } #endif diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp new file mode 100644 index 0000000000..4b531ca139 --- /dev/null +++ b/engines/neverhood/screen.cpp @@ -0,0 +1,88 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "graphics/palette.h" +#include "neverhood/screen.h" + +namespace Neverhood { + +Screen::Screen(NeverhoodEngine *vm) + : _vm(vm), _paletteData(NULL), _paletteChanged(false) { + + _ticks = _vm->_system->getMillis(); + + _backScreen = new Graphics::Surface(); + _backScreen->create(640, 480, Graphics::PixelFormat::createFormatCLUT8()); + +} + +Screen::~Screen() { + delete _backScreen; +} + +void Screen::wait() { +} + +void Screen::setFps(int fps) { + _frameDelay = 1000 / fps; +} + +int Screen::getFps() { + return 1000 / _frameDelay; +} + +void Screen::setPaletteData(byte *paletteData) { + _paletteChanged = true; + _paletteData = paletteData; +} + +void Screen::unsetPaletteData(byte *paletteData) { + if (_paletteData == paletteData) { + _paletteChanged = false; + _paletteData = NULL; + } +} + +void Screen::testPalette(byte *paletteData) { + if (_paletteData == paletteData) + _paletteChanged = true; +} + +void Screen::updatePalette() { + if (_paletteChanged && _paletteData) { + byte *tempPalette = new byte[768]; + for (int i = 0; i < 256; i++) { + tempPalette[i * 3 + 0] = _paletteData[i * 4 + 0]; + tempPalette[i * 3 + 1] = _paletteData[i * 4 + 1]; + tempPalette[i * 3 + 2] = _paletteData[i * 4 + 2]; + } + _vm->_system->getPaletteManager()->setPalette(tempPalette, 0, 256); + delete[] tempPalette; + _paletteChanged = false; + } +} + +void Screen::clear() { + memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h new file mode 100644 index 0000000000..0e7ce3d7d6 --- /dev/null +++ b/engines/neverhood/screen.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_SCREEN_H +#define NEVERHOOD_SCREEN_H + +#include "graphics/surface.h" +#include "neverhood/neverhood.h" + +namespace Neverhood { + +class Screen { +public: + Screen(NeverhoodEngine *vm); + ~Screen(); + void wait(); + void setFps(int fps); + int getFps(); + void setPaletteData(byte *paletteData); + void unsetPaletteData(byte *paletteData); + void testPalette(byte *paletteData); + void updatePalette(); + void clear(); +protected: + NeverhoodEngine *_vm; + Graphics::Surface *_backScreen; + uint32 _ticks; + uint32 _frameDelay; + byte *_paletteData; + bool _paletteChanged; +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_SCREEN_H */ -- cgit v1.2.3 From 1285b37b321850a3584ce1bbdba58462e0b8fbe3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 3 Jul 2011 19:26:27 +0000 Subject: NEVERHOOD: Start with the Background and DirtyBackground classes - Also make related changes in other code - Call the game module's draw method in the main loop - Add some more debug output in resource load functions --- engines/neverhood/background.cpp | 89 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/background.h | 56 +++++++++++++++++++++++++ engines/neverhood/graphics.cpp | 2 + engines/neverhood/module.h | 1 + engines/neverhood/module.mk | 1 + engines/neverhood/module1500.cpp | 4 +- engines/neverhood/neverhood.cpp | 2 + engines/neverhood/resource.cpp | 3 ++ engines/neverhood/resource.h | 2 +- engines/neverhood/scene.cpp | 25 ++++++----- engines/neverhood/scene.h | 9 +++- 11 files changed, 179 insertions(+), 15 deletions(-) create mode 100644 engines/neverhood/background.cpp create mode 100644 engines/neverhood/background.h diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp new file mode 100644 index 0000000000..abfa50733d --- /dev/null +++ b/engines/neverhood/background.cpp @@ -0,0 +1,89 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/background.h" + +namespace Neverhood { + +// Background + +Background::Background(NeverhoodEngine *vm, int objectPriority) + : Entity(vm, objectPriority), _surface(NULL), _spriteResource(vm) { + // Empty +} + +Background::Background(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority) + : Entity(vm, objectPriority), _surface(NULL), _spriteResource(vm) { + + _spriteResource.load(fileHash); + createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _surface->drawSpriteResource(_spriteResource); + +} + +Background::~Background() { + delete _surface; +} + +void Background::createSurface(int surfacePriority, int16 width, int16 height) { + _surface = new BaseSurface(_vm, surfacePriority, width, height); + _spriteResource.getPosition().x = width; + _spriteResource.getPosition().y = height; +} + +void Background::load(uint32 fileHash) { + _spriteResource.load(fileHash); + if (_surface) + _surface->drawSpriteResource(_spriteResource); +} + +// DirtyBackground + +DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority) + : Background(vm, objectPriority) { + + // TODO _spriteResource.load(calcHash(fileName)); + createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _surface->drawSpriteResource(_spriteResource); + +} + +DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority) + : Background(vm, objectPriority) { + + _spriteResource.load(fileHash); + createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _surface->drawSpriteResource(_spriteResource); + +} + +void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 height) { + + // TODO: Later use a DirtySurface once it is implemented + _surface = new BaseSurface(_vm, surfacePriority, width, height); + _spriteResource.getPosition().x = width; + _spriteResource.getPosition().y = height; + +} + + +} // End of namespace Neverhood diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h new file mode 100644 index 0000000000..733f80b83d --- /dev/null +++ b/engines/neverhood/background.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_BACKGROUND_H +#define NEVERHOOD_BACKGROUND_H + +#include "neverhood/neverhood.h" +#include "neverhood/entity.h" +#include "neverhood/graphics.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +class Background : public Entity { +public: + Background(NeverhoodEngine *vm, int objectPriority); + Background(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority); + virtual ~Background(); + BaseSurface *getSurface() { return _surface; } + void createSurface(int surfacePriority, int16 width, int16 height); + void load(uint32 fileHash); +protected: + BaseSurface *_surface; + SpriteResource _spriteResource; +}; + +class DirtyBackground : public Background { +public: + DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority); + DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority); + void createSurface(int surfacePriority, int16 width, int16 height); + +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_BACKGROUND_H */ diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index d7c1064948..2a86966cf5 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -32,6 +32,7 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h _drawRect.y = 0; _drawRect.width = width; _drawRect.height = height; + // TODO: Check if _sysRect is needed at all in the reimplementation... _sysRect.x = 0; _sysRect.y = 0; _sysRect.width = (width + 3) & 0xFFFC; // align by 4 bytes @@ -49,6 +50,7 @@ BaseSurface::~BaseSurface() { } void BaseSurface::draw() { + debug("BaseSurface::draw()"); // TODO } diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index b59b532fad..d3c7b69169 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -26,6 +26,7 @@ #define NEVERHOOD_MODULE_H #include "neverhood/neverhood.h" +#include "neverhood/background.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" #include "neverhood/palette.h" diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index e51565f76b..cc7f9e1d0d 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -1,6 +1,7 @@ MODULE := engines/neverhood MODULE_OBJS = \ + background.o \ blbarchive.o \ detection.o \ entity.o \ diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 97d125a45f..8c4cb9c021 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -116,12 +116,12 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun _surfaceFlag = true; + _background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0)); + _palette = new Palette(_vm);//DUMMY! /* TODO - _background = addBackground(new Class301(_vm, backgroundFileHash, 0, 0)); - _palette = new Palette2(_vm); _palette->usePalette(); addEntity(_palette); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 4baff5eafa..207bd382cf 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -126,6 +126,7 @@ Common::Error NeverhoodEngine::run() { _gameModule = new GameModule(this); + // Preliminary main loop, needs some more work but works for testing while (1) { Common::Event event; Common::EventManager *eventMan = _system->getEventManager(); @@ -165,6 +166,7 @@ Common::Error NeverhoodEngine::run() { } _gameModule->handleUpdate(); + _gameModule->draw(); _system->updateScreen(); } diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 84eab7fe0e..300cf8195a 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -46,6 +46,7 @@ void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) { } bool SpriteResource::load(uint32 fileHash) { + debug("SpriteResource::load(%08X)", fileHash); // TODO: Later merge with load2 and make the mode a parameter unload(); _resourceHandle = _vm->_res->useResource(fileHash); @@ -100,6 +101,7 @@ PaletteResource::~PaletteResource() { } bool PaletteResource::load(uint32 fileHash) { + debug("PaletteResource::load(%08X)", fileHash); unload(); _resourceHandle = _vm->_res->useResource(fileHash); if (_resourceHandle != -1) { @@ -152,6 +154,7 @@ AnimResource::~AnimResource() { } bool AnimResource::load(uint32 fileHash) { + debug("AnimResource::load(%08X)", fileHash); if (fileHash == _fileHash) return true; diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 6a76a73a64..868bafdc44 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -37,7 +37,7 @@ public: bool load2(uint32 fileHash); void unload(); const NDimensions& getDimensions() { return _dimensions; } - const NPoint& getPosition() { return _position; } + NPoint& getPosition() { return _position; } protected: NeverhoodEngine *_vm; int _resourceHandle; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index f1209318ec..6c3aae1e29 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -39,7 +39,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) // TODO _playerSprite = NULL; // TODO _mouseSprite = NULL; _palette = NULL; - // TODO _background = NULL; + _background = NULL; // TODO _field_8E = -1; if (clearHitRects) { // TODO g_Class700->setHitRects(NULL, 0); @@ -53,7 +53,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _messageListFlag = true; _surfaceFlag = false; _messageList2 = NULL; - // TODO _smackerPlayer = NULL; + _smackerPlayer = NULL; _smkFileHash = 0; _messageListFlag2 = false; _messageValue = -1; @@ -78,26 +78,25 @@ Scene::~Scene() { } void Scene::draw() { + debug("Scene::draw()"); //**ALL TODO -#if 0 if (_smackerPlayer) { if (_surfaceFlag) { - g_screen->resetDirtyRects(); - g_screen->copyDirtyRects(); - g_screen->addDirtyRects(); + // TODO g_screen->resetDirtyRects(); + // TODO g_screen->copyDirtyRects(); + // TODO g_screen->addDirtyRects(); } - _smackerPlayer->_surface->draw(); + // TODO _smackerPlayer->_surface->draw(); } else { if (_surfaceFlag) { - g_screen->copyDirtyRects(); + // TODO g_screen->copyDirtyRects(); for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) (*iter)->addDirtyRect(); - g_screen->addDirtyRects(); + // TODO g_screen->addDirtyRects(); } for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) (*iter)->draw(); } -#endif } void Scene::addEntity(Entity *entity) { @@ -170,6 +169,12 @@ void Scene::deleteSprite(Sprite **sprite) { *sprite = NULL; } +Background *Scene::addBackground(Background *background) { + addEntity(background); + addSurface(background->getSurface()); + return background; +} + void Scene::update() { if (_smkFileHash != 0) { diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index e5a3d0ecee..c64c2bfbef 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -25,6 +25,7 @@ #include "common/array.h" #include "neverhood/neverhood.h" +#include "neverhood/background.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" #include "neverhood/module.h" @@ -38,6 +39,9 @@ struct MessageListItem { uint32 messageValue; }; +class SmackerPlayer { // DUMMY! +}; + class Scene : public Entity { public: Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); @@ -50,6 +54,7 @@ public: Sprite *addSprite(Sprite *sprite); void setSurfacePriority(BaseSurface *surface, int priority); void deleteSprite(Sprite **sprite); + Background *addBackground(Background *background); protected: Module *_parentModule; Common::Array _entities; @@ -71,12 +76,12 @@ protected: // TODO 00000090 playerSprite dd ? // TODO 00000094 mouseSprite dd ? Palette *_palette; - // TODO Background *_background; + Background *_background; bool _surfaceFlag; bool _messageListFlag; MessageListItem *_messageList2; int _messageListStatus; - // TODO 000000B0 smackerPlayer dd ? + SmackerPlayer *_smackerPlayer; void (Entity::*_savedUpdateHandlerCb)(); uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); bool _smackerDone; -- cgit v1.2.3 From bd1749863e45cde53707d0ae38b28825bc0dba2e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 4 Jul 2011 10:52:07 +0000 Subject: NEVERHOOD: Start with the Palette2 class (which needs a better name later) - Implement Screen::drawSurface2 (needs color key support) - The first intro now show up, complete with fade-in and fade-out --- engines/neverhood/graphics.cpp | 6 ++- engines/neverhood/module1500.cpp | 20 +++++----- engines/neverhood/neverhood.cpp | 8 +++- engines/neverhood/palette.cpp | 82 +++++++++++++++++++++++++++++++++++----- engines/neverhood/palette.h | 13 +++++++ engines/neverhood/screen.cpp | 73 +++++++++++++++++++++++++++++++++++ engines/neverhood/screen.h | 3 ++ 7 files changed, 182 insertions(+), 23 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 2a86966cf5..fa7c15211a 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -22,6 +22,7 @@ #include "neverhood/graphics.h" #include "neverhood/resource.h" +#include "neverhood/screen.h" namespace Neverhood { @@ -51,7 +52,10 @@ BaseSurface::~BaseSurface() { void BaseSurface::draw() { debug("BaseSurface::draw()"); - // TODO + if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { + // TODO: _sysRect alternate drawing code (is that used?) + _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect); + } } void BaseSurface::addDirtyRect() { diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 8c4cb9c021..c3c0864a59 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -110,6 +110,8 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) { debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3); + + Palette2 *palette2; SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); @@ -118,16 +120,14 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun _background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0)); - _palette = new Palette(_vm);//DUMMY! - - /* TODO - - _palette = new Palette2(_vm); - _palette->usePalette(); + palette2 = new Palette2(_vm); + palette2->usePalette(); + _palette = palette2; addEntity(_palette); - Palette2_sub_47BF00(backgroundFileHash, 0, 256, 0); - Palette2_sub_47C060(12); - + palette2->addPalette(backgroundFileHash, 0, 256, 0); + palette2->startFadeToPalette(12); + + /* if (soundFileHash != 0) { _soundResource.set(soundFileHash); _soundResource.load(); @@ -150,7 +150,7 @@ void Scene1501::update() { _vm->_screen->clear(); _parentModule->sendMessage(0x1009, 0, this); } - } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !_soundResource.isPlaying()) { + } else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) { _countdown1 = 12; _palette->startFadeToBlack(11); } diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 207bd382cf..9019409193 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -164,10 +164,14 @@ Common::Error NeverhoodEngine::run() { break; } } - + + debug("millis %d", _system->getMillis()); _gameModule->handleUpdate(); _gameModule->draw(); - _system->updateScreen(); + _screen->wait(); + _screen->update(); + + debug("---------------------------------------"); } diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index b45f8eeb78..bfabf8998a 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -22,9 +22,12 @@ #include "neverhood/palette.h" #include "neverhood/resource.h" +#include "neverhood/screen.h" namespace Neverhood { +// Palette + Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) { _status = 0; _palette = new byte[1024]; @@ -58,12 +61,12 @@ Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) { } Palette::~Palette() { - // TODO: _vm->_screen->unsetPaletteData(_palette); + _vm->_screen->unsetPaletteData(_palette); delete[] _palette; } void Palette::usePalette() { - // TODO: _vm->_screen->setPaletteData(_palette); + _vm->_screen->setPaletteData(_palette); } void Palette::addPalette(const char *filename, int toIndex, int count, int fromIndex) { @@ -76,10 +79,11 @@ void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) count = 256 - toIndex; paletteResource.load(fileHash); memcpy(_palette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4); - // TODO: _vm->_screen->testPalette(_palette); + _vm->_screen->testPalette(_palette); } void Palette::startFadeToBlack(int counter) { + debug("Palette::startFadeToBlack(%d)", counter); if (counter == 0) counter = 1; _fadeToR = 0; @@ -91,6 +95,7 @@ void Palette::startFadeToBlack(int counter) { } void Palette::startFadeToWhite(int counter) { + debug("Palette::startFadeToWhite(%d)", counter); if (counter == 0) counter = 1; _fadeToR = 255; @@ -102,15 +107,18 @@ void Palette::startFadeToWhite(int counter) { } void Palette::update() { + debug("Palette::update() _status = %d", _status); if (_status == 1) { - memset(_palette, 0, 1024); - _status = 0; - } else { - for (int i = 0; i < 256; i++) { - fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB); + if (_palCounter > 1) { + for (int i = 0; i < 256; i++) { + fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB); + } + _vm->_screen->testPalette(_palette); + _palCounter--; + } else { + memset(_palette, 0, 1024); + _status = 0; } - // TODO: _vm->_screen->testPalette(_palette); - _palCounter--; } } @@ -122,4 +130,58 @@ void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) { #undef FADE } +// Palette2 + +Palette2::Palette2(NeverhoodEngine *vm) + : Palette(vm) { + _basePalette = new byte[1024]; + SetUpdateHandler(&Palette2::update); +} + +Palette2::Palette2(NeverhoodEngine *vm, uint32 fileHash) + : Palette(vm, fileHash) { + _basePalette = new byte[1024]; + SetUpdateHandler(&Palette2::update); +} + +Palette2::~Palette2() { + delete _basePalette; +} + +void Palette2::update() { + debug("Palette2::update() _status = %d", _status); + if (_status == 1) { + Palette::update(); + } else if (_status == 2) { + debug("... _palCounter = %d", _palCounter); + if (_palCounter > 1) { + for (int i = 0; i < 256; i++) { + fadeColor(_palette + i * 4, _basePalette[i * 4 + 0], _basePalette[i * 4 + 1], _basePalette[i * 4 + 2]); + } + _vm->_screen->testPalette(_palette); + _palCounter--; + } else { + memcpy(_palette, _basePalette, 256 * 4); + _status = 0; + } + } +} + +void Palette2::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) { + PaletteResource paletteResource(_vm); + if (toIndex + count > 256) + count = 256 - toIndex; + paletteResource.load(fileHash); + memcpy(_basePalette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4); +} + +void Palette2::startFadeToPalette(int counter) { + debug("Palette2::startFadeToPalette(%d)", counter); + if (counter == 0) + counter = 1; + _palCounter = counter; + _fadeStep = 255 / counter; + _status = 2; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index b29d77181b..752ae3aedb 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -54,6 +54,19 @@ protected: void fadeColor(byte *rgb, byte toR, byte toG, byte toB); }; +class Palette2 : public Palette { +public: + Palette2(NeverhoodEngine *vm); + // TODO: Other ctors + Palette2(NeverhoodEngine *vm, uint32 fileHash); + ~Palette2(); + void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); + void startFadeToPalette(int counter); +public: + byte *_basePalette; + void update(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_PALETTE_H */ diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 4b531ca139..807e241ccd 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -39,7 +39,16 @@ Screen::~Screen() { delete _backScreen; } +void Screen::update() { + updatePalette(); + // TODO: Implement actual code + _vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480); + _vm->_system->updateScreen(); +} + void Screen::wait() { + // TODO + _vm->_system->delayMillis(40); } void Screen::setFps(int fps) { @@ -69,6 +78,7 @@ void Screen::testPalette(byte *paletteData) { void Screen::updatePalette() { if (_paletteChanged && _paletteData) { + debug("Screen::updatePalette() Set palette"); byte *tempPalette = new byte[768]; for (int i = 0; i < 256; i++) { tempPalette[i * 3 + 0] = _paletteData[i * 4 + 0]; @@ -85,4 +95,67 @@ void Screen::clear() { memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); } +void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) { + + int16 destX, destY; + NRect ddRect; + + if (drawRect.x + drawRect.width >= clipRect.x2) + ddRect.x2 = clipRect.x2 - drawRect.x; + else + ddRect.x2 = drawRect.width; + + if (drawRect.x <= clipRect.x1) { + destX = clipRect.x1; + ddRect.x1 = clipRect.x1 - drawRect.x; + } else { + destX = drawRect.x; + ddRect.x1 = 0; + } + + if (drawRect.y + drawRect.height >= clipRect.y2) + ddRect.y2 = clipRect.y2 - drawRect.y; + else + ddRect.y2 = drawRect.height; + + if (drawRect.y <= clipRect.y1) { + destY = clipRect.y1; + ddRect.y1 = clipRect.y1 - drawRect.y; + } else { + destY = drawRect.y; + ddRect.y1 = 0; + } + + debug("draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); + + byte *source = (byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); + byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); + int width = ddRect.x2 - ddRect.x1; + int height = ddRect.y2 - ddRect.y1; + + while (height--) { + memcpy(dest, source, width); + source += surface->pitch; + dest += _backScreen->pitch; + } + + #if 0 + if ( ddRect.right > ddRect.left ) + { + if ( ddRect.top < ddRect.bottom ) + { + (*(int (__stdcall **)(_DWORD, _DWORD, _DWORD, LPDIRECTDRAWSURFACE, struct tagRECT *, unsigned int))(**(_DWORD **)(this + 8) + 28))( + *(_DWORD *)(this + 8), + destX, + destY, + ddSurface, + &ddRect, + blitFlags | (unsigned int)DDBLTFAST_WAIT); + } + } + #endif + +} + + } // End of namespace Neverhood diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 0e7ce3d7d6..e25b3b5dba 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -25,6 +25,7 @@ #include "graphics/surface.h" #include "neverhood/neverhood.h" +#include "neverhood/graphics.h" namespace Neverhood { @@ -32,6 +33,7 @@ class Screen { public: Screen(NeverhoodEngine *vm); ~Screen(); + void update(); void wait(); void setFps(int fps); int getFps(); @@ -40,6 +42,7 @@ public: void testPalette(byte *paletteData); void updatePalette(); void clear(); + void drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect); protected: NeverhoodEngine *_vm; Graphics::Surface *_backScreen; -- cgit v1.2.3 From 21eb88053caa4cc7167f81dba9afc7f0ef89996d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 4 Jul 2011 17:58:38 +0000 Subject: NEVERHOOD: Implement SmackerScene, SmackerPlayer and related stuff - The intro video after the logo screens is now played (still needs better sync) --- engines/neverhood/blbarchive.cpp | 5 + engines/neverhood/blbarchive.h | 3 + engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module.mk | 2 + engines/neverhood/module1500.cpp | 10 +- engines/neverhood/module1500.h | 1 + engines/neverhood/neverhood.cpp | 4 +- engines/neverhood/palette.cpp | 7 ++ engines/neverhood/palette.h | 1 + engines/neverhood/resourceman.cpp | 5 + engines/neverhood/resourceman.h | 1 + engines/neverhood/scene.cpp | 5 +- engines/neverhood/scene.h | 4 +- engines/neverhood/screen.cpp | 22 ++++- engines/neverhood/screen.h | 3 +- engines/neverhood/smackerplayer.cpp | 183 ++++++++++++++++++++++++++++++++++++ engines/neverhood/smackerplayer.h | 75 +++++++++++++++ engines/neverhood/smackerscene.cpp | 127 +++++++++++++++++++++++++ engines/neverhood/smackerscene.h | 54 +++++++++++ 19 files changed, 499 insertions(+), 15 deletions(-) create mode 100644 engines/neverhood/smackerplayer.cpp create mode 100644 engines/neverhood/smackerplayer.h create mode 100644 engines/neverhood/smackerscene.cpp create mode 100644 engines/neverhood/smackerscene.h diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 4259be33f7..3138b9102d 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -108,4 +108,9 @@ byte *BlbArchive::getEntryExtData(uint index) { return _extData && entry.extDataOfs != 0 ? &_extData[entry.extDataOfs - 1] : NULL; } +Common::SeekableReadStream *BlbArchive::createStream(uint index) { + const BlbArchiveEntry &entry = _entries[index]; + return new Common::SeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h index 3c373ccc96..ddb3f0196b 100644 --- a/engines/neverhood/blbarchive.h +++ b/engines/neverhood/blbarchive.h @@ -25,6 +25,8 @@ #include "common/array.h" #include "common/file.h" +#include "common/stream.h" +#include "common/substream.h" #include "neverhood/neverhood.h" namespace Neverhood { @@ -58,6 +60,7 @@ public: uint32 getSize(uint index) { return _entries[index].size; } BlbArchiveEntry *getEntry(uint index) { return &_entries[index]; } uint getCount() { return _entries.size(); } + Common::SeekableReadStream *createStream(uint index); private: Common::File _fd; Common::Array _entries; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e46d23c420..3f4ad4b536 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -102,7 +102,7 @@ void GameModule::updateModule1500() { _done = false; delete _childObject; _childObject = NULL; - debug("Done..."); + error("Done..."); // TODO createModule1000(); // TODO _childObject->handleUpdate(); } diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index cc7f9e1d0d..8eb1951543 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -15,6 +15,8 @@ MODULE_OBJS = \ resourceman.o \ scene.o \ screen.o \ + smackerscene.o \ + smackerplayer.o \ sprite.o # This module can be built as a plugin diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index c3c0864a59..95b3925245 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -92,8 +92,14 @@ void Module1500::createScene1502() { void Module1500::createScene1503() { debug("createScene1503"); - // TODO: This uses the MultiSmackerPlayer - // Game will crash now... + SmackerScene *smackerScene; + _parentModule->sendMessage(0x0800, 0, this); + _vm->gameState().sceneNum = 2; + smackerScene = new SmackerScene(_vm, this, true, true, true); + smackerScene->setFileHash(0x001A0005); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1500::update); } void Module1500::createScene1504() { diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h index e3633a0e85..87b2a0b9ae 100644 --- a/engines/neverhood/module1500.h +++ b/engines/neverhood/module1500.h @@ -28,6 +28,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/smackerscene.h" namespace Neverhood { diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 9019409193..650681289a 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -165,13 +165,13 @@ Common::Error NeverhoodEngine::run() { } } - debug("millis %d", _system->getMillis()); + //debug("millis %d", _system->getMillis()); _gameModule->handleUpdate(); _gameModule->draw(); _screen->wait(); _screen->update(); - debug("---------------------------------------"); + //debug("---------------------------------------"); } diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index bfabf8998a..e186d3814f 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -82,6 +82,13 @@ void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) _vm->_screen->testPalette(_palette); } +void Palette::copyPalette(const byte *palette, int toIndex, int count, int fromIndex) { + if (toIndex + count > 256) + count = 256 - toIndex; + memcpy(_palette + toIndex * 4, palette + fromIndex * 4, count * 4); + _vm->_screen->testPalette(_palette); +} + void Palette::startFadeToBlack(int counter) { debug("Palette::startFadeToBlack(%d)", counter); if (counter == 0) diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 752ae3aedb..e3d95aa7f6 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -42,6 +42,7 @@ public: void usePalette(); void addPalette(const char *filename, int toIndex, int count, int fromIndex); void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); + void copyPalette(const byte *palette, int toIndex, int count, int fromIndex); void startFadeToBlack(int counter); void startFadeToWhite(int counter); protected: diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 59e3fad14a..28f0994cb1 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -164,4 +164,9 @@ void ResourceMan::freeResource(Resource *resource) { resource->data = NULL; } +Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) { + ResourceFileEntry *entry = findEntry(fileHash); + return _archives[entry->archiveIndex]->createStream(entry->entryIndex); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index 0dd70e13a2..22614401f8 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -67,6 +67,7 @@ public: byte *loadResource(int resourceHandle, bool moveToFront = false); void unloadResource(int resourceHandle); void freeResource(Resource *resource); + Common::SeekableReadStream *createStream(uint32 fileHash); private: Common::Array _archives; Common::Array _entries; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 6c3aae1e29..a73b45b9f7 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -78,15 +78,14 @@ Scene::~Scene() { } void Scene::draw() { - debug("Scene::draw()"); - //**ALL TODO if (_smackerPlayer) { if (_surfaceFlag) { // TODO g_screen->resetDirtyRects(); // TODO g_screen->copyDirtyRects(); // TODO g_screen->addDirtyRects(); } - // TODO _smackerPlayer->_surface->draw(); + if (_smackerPlayer->getSurface()) + _smackerPlayer->getSurface()->draw(); } else { if (_surfaceFlag) { // TODO g_screen->copyDirtyRects(); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index c64c2bfbef..405a528143 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -30,6 +30,7 @@ #include "neverhood/graphics.h" #include "neverhood/module.h" #include "neverhood/palette.h" +#include "neverhood/smackerplayer.h" #include "neverhood/sprite.h" namespace Neverhood { @@ -39,9 +40,6 @@ struct MessageListItem { uint32 messageValue; }; -class SmackerPlayer { // DUMMY! -}; - class Scene : public Entity { public: Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 807e241ccd..68f611050d 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -78,7 +78,6 @@ void Screen::testPalette(byte *paletteData) { void Screen::updatePalette() { if (_paletteChanged && _paletteData) { - debug("Screen::updatePalette() Set palette"); byte *tempPalette = new byte[768]; for (int i = 0; i < 256; i++) { tempPalette[i * 3 + 0] = _paletteData[i * 4 + 0]; @@ -95,7 +94,7 @@ void Screen::clear() { memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); } -void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) { +void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) { int16 destX, destY; NRect ddRect; @@ -128,7 +127,7 @@ void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect debug("draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); - byte *source = (byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); + const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); int width = ddRect.x2 - ddRect.x1; int height = ddRect.y2 - ddRect.y1; @@ -157,5 +156,22 @@ void Screen::drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect } +void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) { + + const byte *source = (const byte*)surface->getBasePtr(0, 0); + byte *dest = (byte*)_backScreen->getBasePtr(drawRect.x, drawRect.y); + + for (int16 yc = 0; yc < surface->h; yc++) { + byte *row = dest; + for (int16 xc = 0; xc < surface->w; xc++) { + *row++ = *source; + *row++ = *source++; + } + memcpy(dest + _backScreen->pitch, dest, surface->w * 2); + dest += _backScreen->pitch; + dest += _backScreen->pitch; + } + +} } // End of namespace Neverhood diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index e25b3b5dba..fc56a18ea6 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -42,7 +42,8 @@ public: void testPalette(byte *paletteData); void updatePalette(); void clear(); - void drawSurface2(Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect); + void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect); + void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); protected: NeverhoodEngine *_vm; Graphics::Surface *_backScreen; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp new file mode 100644 index 0000000000..c914b42482 --- /dev/null +++ b/engines/neverhood/smackerplayer.cpp @@ -0,0 +1,183 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/smackerplayer.h" +#include "neverhood/palette.h" +#include "neverhood/resourceman.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// SmackerSurface + +SmackerSurface::SmackerSurface(NeverhoodEngine *vm) + : BaseSurface(vm, 0, 0, 0), _smackerFrame(NULL) { +} + +void SmackerSurface::draw() { + if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) { + _vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect); + } +} + +void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) { + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = smackerFrame->w; + _drawRect.height = smackerFrame->h; + // TODO: Check if _sysRect is needed at all in the reimplementation... + _sysRect.x = 0; + _sysRect.y = 0; + _sysRect.width = (smackerFrame->w + 3) & 0xFFFC; // align by 4 bytes + _sysRect.height = smackerFrame->h; + _smackerFrame = smackerFrame; +} + +// SmackerDoubleSurface + +SmackerDoubleSurface::SmackerDoubleSurface(NeverhoodEngine *vm) + : SmackerSurface(vm) { +} + +void SmackerDoubleSurface::draw() { + if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) { + _vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect); + } +} + +// SmackerPlayer + +SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag) + : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false), + _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL) { + + SetUpdateHandler(&SmackerPlayer::update); + open(fileHash, flag); +} + +SmackerPlayer::~SmackerPlayer() { + close(); +} + +void SmackerPlayer::open(uint32 fileHash, bool flag1) { + debug("SmackerPlayer::open(%08X)", fileHash); + + _flag1 = flag1; + + close(); + + _stream = _vm->_res->createStream(fileHash); + + // TODO: _flag1 stuff + + _smackerDecoder = new Video::SmackerDecoder(_vm->_mixer); + _smackerDecoder->loadStream(_stream); + + _palette = new Palette(_vm); + _palette->usePalette(); + +} + +void SmackerPlayer::close() { + delete _smackerDecoder; + delete _palette; + // NOTE: The SmackerDecoder deletes the _stream + delete _smackerSurface; + _smackerDecoder = NULL; + _palette = NULL; + _stream = NULL; + _smackerSurface = NULL; +} + +void SmackerPlayer::gotoFrame(uint frameNumber) { +} + +uint SmackerPlayer::getStatus() { + return 0; +} + +void SmackerPlayer::update() { + + if (!_smackerDecoder) + return; + + if (_dirtyFlag) { + // TODO _vm->_screen->resetDirtyRects(); + _dirtyFlag = false; + } + + if (!_smackerDecoder->endOfVideo()) { + + const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame(); + + if (!_smackerSurface) { + if (_doubleSurface) { + // TODO: Use SmackerDoubleSurface + _smackerSurface = new SmackerDoubleSurface(_vm); + _smackerSurface->getDrawRect().x = 320 - _smackerDecoder->getWidth(); + _smackerSurface->getDrawRect().y = 240 - _smackerDecoder->getHeight(); + // TODO DoubleDrawSurface.field_28 = false; + _smackerSurface->setSmackerFrame(smackerFrame); + } else { + _smackerSurface = new SmackerSurface(_vm); + _smackerSurface->getDrawRect().x = (640 - _smackerDecoder->getWidth()) / 2; + _smackerSurface->getDrawRect().y = (480 - _smackerDecoder->getHeight()) / 2; + _smackerSurface->setSmackerFrame(smackerFrame); + } + } + + if (_doubleSurface) { + // TODO + } + + // TODO _vm->_screen->_skipUpdate = true; + _dirtyFlag = true; + + if (_smackerDecoder->hasDirtyPalette()) { + updatePalette(); + } + + if (_smackerDecoder->endOfVideo() && !_flag1) { + if (_scene) { + _scene->sendMessage(0x3002, 0, this); + } + _flag2 = true; + } else { + _flag2 = false; + } + + } + +} + +void SmackerPlayer::updatePalette() { + byte tempPalette[1024]; + const byte *smackerPalette = _smackerDecoder->getPalette(); + for (int i = 0; i < 256; i++) { + tempPalette[i * 4 + 0] = smackerPalette[i * 3 + 0]; + tempPalette[i * 4 + 1] = smackerPalette[i * 3 + 1]; + tempPalette[i * 4 + 2] = smackerPalette[i * 3 + 2]; + } + _palette->copyPalette(tempPalette, 0, 256, 0); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h new file mode 100644 index 0000000000..d923bbdf6b --- /dev/null +++ b/engines/neverhood/smackerplayer.h @@ -0,0 +1,75 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_SMACKERPLAYER_H +#define NEVERHOOD_SMACKERPLAYER_H + +#include "video/smk_decoder.h" +#include "neverhood/neverhood.h" +#include "neverhood/entity.h" + +namespace Neverhood { + +class Scene; +class Palette; + +class SmackerSurface : public BaseSurface { +public: + SmackerSurface(NeverhoodEngine *vm); + virtual void draw(); + void setSmackerFrame(const Graphics::Surface *smackerFrame); +protected: + const Graphics::Surface *_smackerFrame; +}; + +class SmackerDoubleSurface : public SmackerSurface { +public: + SmackerDoubleSurface(NeverhoodEngine *vm); + virtual void draw(); +}; + +class SmackerPlayer : public Entity { +public: + SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag); + ~SmackerPlayer(); + BaseSurface *getSurface() { return _smackerSurface; } + void open(uint32 fileHash, bool flag1); + void close(); + void gotoFrame(uint frameNumber); + uint getStatus(); +protected: + Scene *_scene; + Palette *_palette; + Video::SmackerDecoder *_smackerDecoder; + SmackerSurface *_smackerSurface; + bool _doubleSurface; + Common::SeekableReadStream *_stream; + bool _flag1; + bool _flag2; + bool _dirtyFlag; + void update(); + void updatePalette(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_SMACKERPLAYER_H */ diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp new file mode 100644 index 0000000000..f3ee5775bc --- /dev/null +++ b/engines/neverhood/smackerscene.cpp @@ -0,0 +1,127 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort) + : Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _fieldDF(false), + _fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) { + + debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort); + + // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) + + /* TODO + if (_vm->getGlobalVarValue(0x06C02850)) { + _flag1 = true; + _canAbort = true; + } + */ + + if (_doubleSurface) { + _vm->_screen->clear(); + } + + _fileHash[0] = 0; + _fileHash[1] = 0; + + SetUpdateHandler(&SmackerScene::update); + SetMessageHandler(&SmackerScene::handleMessage); + +} + +SmackerScene::~SmackerScene() { + +} + +void SmackerScene::setFileHash(uint32 fileHash) { + debug("SmackerScene::setFileHash(%08X)", fileHash); + _fileHash[0] = fileHash; + _fileHashList = _fileHash; +} + +void SmackerScene::setFileHashList(uint32 *fileHashList) { + debug("SmackerScene::setFileHashList(...)"); + _fileHashList = fileHashList; +} + +void SmackerScene::nextVideo() { + debug("SmackerScene::nextVideo()"); + + _fileHashListIndex++; + + if (_fileHashList && _fileHashList[_fileHashListIndex] != 0) { + uint32 smackerFileHash = _fileHashList[_fileHashListIndex]; + if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) { + // Not a Smacker file + _parentModule->sendMessage(0x1009, 0, this); + return; + } + // TODO _fieldDF = getGlobalSubVarValue(0x00800410, smackerFileHash); + if (!_fieldDF) { + // TODO setGlobalSubVarValue(0x00800410, smackerFileHash) = 1; + } + if (_fileHashListIndex == 0) { + _smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false); + addEntity(_smackerPlayer); + addSurface(_smackerPlayer->getSurface()); + // TODO? Screen.hSmack = _smackerPlayer; + } else { + _smackerPlayer->open(smackerFileHash, false); + } + } else { + _parentModule->sendMessage(0x1009, 0, this); + } + + +} + +void SmackerScene::update() { + if (_playNextVideoFlag) { + nextVideo(); + _playNextVideoFlag = false; + } + Scene::update(); +} + +uint32 SmackerScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0009: + if ((_fieldDF && _flag1) || (_canAbort && _flag1)) + _playNextVideoFlag = true; + break; + case 0x000C: + if (_canAbort) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x3002: + _playNextVideoFlag = true; + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h new file mode 100644 index 0000000000..b3c354c44a --- /dev/null +++ b/engines/neverhood/smackerscene.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_SMACKERSCENE_H +#define NEVERHOOD_SMACKERSCENE_H + +#include "neverhood/neverhood.h" +#include "neverhood/resourceman.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class SmackerScene : public Scene { +public: + SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort); + virtual ~SmackerScene(); + void setFileHash(uint32 fileHash); + void setFileHashList(uint32 *fileHashList); + void nextVideo(); +protected: + bool _doubleSurface; + bool _flag1; + bool _canAbort; + bool _fieldDF; + bool _playNextVideoFlag; + int _fileHashListIndex; + uint32 *_fileHashList; + uint32 _fileHash[2]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_SMACKERSCENE_H */ -- cgit v1.2.3 From 9d0e90bcd2fc392a66d213b64dc07ccd32d438b4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 5 Jul 2011 13:28:43 +0000 Subject: NEVERHOOD: Add skeleton for Module1000 - Add dummies for game variable access --- engines/neverhood/gamemodule.cpp | 29 +++++++++- engines/neverhood/gamemodule.h | 2 + engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 116 +++++++++++++++++++++++++++++++++++++ engines/neverhood/module1000.h | 71 +++++++++++++++++++++++ engines/neverhood/neverhood.cpp | 18 ++++++ engines/neverhood/neverhood.h | 4 ++ engines/neverhood/smackerscene.cpp | 8 +-- 8 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 engines/neverhood/module1000.cpp create mode 100644 engines/neverhood/module1000.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 3f4ad4b536..93687f9866 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -22,6 +22,7 @@ #include "neverhood/gamemodule.h" +#include "neverhood/module1000.h" #include "neverhood/module1500.h" namespace Neverhood { @@ -84,12 +85,14 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM - createModule1500(0); +// createModule1500(0); // Logos and intro video + + createModule1000(0); } void GameModule::createModule1500(int which) { _someFlag1 = false; - // TODO *getGlobalGameVarValuePtr(0x91080831) = 0x0F10114; + _vm->setGlobalVar(0x91080831, 0x00F10114); _childObject = new Module1500(_vm, this, which, true); SetUpdateHandler(&GameModule::updateModule1500); } @@ -102,8 +105,28 @@ void GameModule::updateModule1500() { _done = false; delete _childObject; _childObject = NULL; + createModule1000(0); + _childObject->handleUpdate(); + } +} + +void GameModule::createModule1000(int which) { + _vm->setGlobalVar(0x91080831, 0x03294419); + _childObject = new Module1000(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1000); +} + +void GameModule::updateModule1000() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + // TODO _resourceTable3.load(); + delete _childObject; + _childObject = NULL; error("Done..."); - // TODO createModule1000(); + // TODO createModule2300(); // TODO _childObject->handleUpdate(); } } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 6f47fb6f65..6d65895ef7 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -49,6 +49,8 @@ protected: void startup(); void createModule1500(int which); void updateModule1500(); + void createModule1000(int which); + void updateModule1000(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 8eb1951543..fe0f7de60c 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -8,6 +8,7 @@ MODULE_OBJS = \ gamemodule.o \ graphics.o \ module.o \ + module1000.o \ module1500.o \ neverhood.o \ palette.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp new file mode 100644 index 0000000000..d1403b9307 --- /dev/null +++ b/engines/neverhood/module1000.cpp @@ -0,0 +1,116 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1000.h" + +namespace Neverhood { + +Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module1000(%d)", which); + + _musicFileHash = _vm->getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144; + + // TODO Music18hList_add(0x03294419, 0x061880C6); + // TODO Music18hList_add(0x03294419, _musicFileHash); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 0: + createScene1001(-1); + break; + case 1: + createScene1002(-1); + break; + case 2: + createScene1003(-1); + break; + case 3: + createScene1004(-1); + break; + case 4: + createScene1005(-1); + break; + } + } else if (which == 0) { + createScene1001(0); + } else if (which == 1) { + createScene1002(1); + } + +} + +Module1000::~Module1000() { + // TODO Music18hList_deleteGroup(0x03294419); +} + +void Module1000::createScene1001(int which) { + debug("createScene1501"); + _vm->gameState().sceneNum = 0; + _childObject = new Scene1001(_vm, this, which); + // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3); + // TODO Music18hList_play(0x061880C6, 0, 0, 1); + SetUpdateHandler(&Module1000::updateScene1001); +} + +void Module1000::createScene1002(int which) { +} + +void Module1000::createScene1003(int which) { +} + +void Module1000::createScene1004(int which) { +} + +void Module1000::createScene1005(int which) { +} + +void Module1000::updateScene1001() { +} + +void Module1000::updateScene1002() { +} + +void Module1000::updateScene1003() { +} + +void Module1000::updateScene1004() { +} + +void Module1000::updateScene1005() { +} + +// Scene1001 + +Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { +} + +void Scene1001::update() { +} + +uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h new file mode 100644 index 0000000000..935a8be020 --- /dev/null +++ b/engines/neverhood/module1000.h @@ -0,0 +1,71 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1000_H +#define NEVERHOOD_MODULE1000_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class Module1000 : public Module { +public: + Module1000(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1000(); +protected: + uint32 _musicFileHash; + // TODO ResourceTable _resourceTable1; + // TODO ResourceTable _resourceTable2; + // TODO ResourceTable _resourceTable3; + // TODO ResourceTable _resourceTable4; + void createScene1001(int which); + void createScene1002(int which); + void createScene1003(int which); + void createScene1004(int which); + void createScene1005(int which); + void updateScene1001(); + void updateScene1002(); + void updateScene1003(); + void updateScene1004(); + void updateScene1005(); +}; + +class Scene1001 : public Scene { +public: + Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_class511; + Sprite *_class508; + Sprite *_class509; + Sprite *_class608; + Sprite *_class510; + int16 _fieldE4; + int16 _fieldE6; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1000_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 650681289a..b61f65ca77 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -185,4 +185,22 @@ Common::Error NeverhoodEngine::run() { return Common::kNoError; } +uint32 NeverhoodEngine::getGlobalVar(uint32 nameHash) { + // TODO + return 0; +} + +void NeverhoodEngine::setGlobalVar(uint32 nameHash, uint32 value) { + // TODO +} + +uint32 NeverhoodEngine::getSubVar(uint32 nameHash, uint32 subNameHash) { + // TODO + return 0; +} + +void NeverhoodEngine::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { + // TODO +} + } // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index c13ac517fb..dddec472b9 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -110,6 +110,10 @@ public: #endif GameState& gameState() { return _gameState; } + uint32 getGlobalVar(uint32 nameHash); + void setGlobalVar(uint32 nameHash, uint32 value); + uint32 getSubVar(uint32 nameHash, uint32 subNameHash); + void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value); public: diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index f3ee5775bc..d47dbb0394 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -32,12 +32,10 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) - /* TODO - if (_vm->getGlobalVarValue(0x06C02850)) { + if (_vm->getGlobalVar(0x06C02850)) { _flag1 = true; _canAbort = true; } - */ if (_doubleSurface) { _vm->_screen->clear(); @@ -78,9 +76,9 @@ void SmackerScene::nextVideo() { _parentModule->sendMessage(0x1009, 0, this); return; } - // TODO _fieldDF = getGlobalSubVarValue(0x00800410, smackerFileHash); + _fieldDF = _vm->getSubVar(0x00800410, smackerFileHash); if (!_fieldDF) { - // TODO setGlobalSubVarValue(0x00800410, smackerFileHash) = 1; + _vm->setSubVar(0x00800410, smackerFileHash, 1); } if (_fileHashListIndex == 0) { _smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false); -- cgit v1.2.3 From ae4ef4e66dc69a9d60b44261596860fcc4518de9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 5 Jul 2011 14:22:18 +0000 Subject: NEVERHOOD: Add StaticData class --- engines/neverhood/module.mk | 3 +- engines/neverhood/neverhood.cpp | 7 ++- engines/neverhood/neverhood.h | 2 + engines/neverhood/scene.h | 10 +--- engines/neverhood/staticdata.cpp | 121 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/staticdata.h | 75 ++++++++++++++++++++++++ 6 files changed, 209 insertions(+), 9 deletions(-) create mode 100644 engines/neverhood/staticdata.cpp create mode 100644 engines/neverhood/staticdata.h diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index fe0f7de60c..8a25e25bab 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -18,7 +18,8 @@ MODULE_OBJS = \ screen.o \ smackerscene.o \ smackerplayer.o \ - sprite.o + sprite.o \ + staticdata.o # This module can be built as a plugin ifdef BUILD_PLUGINS diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index b61f65ca77..24033f0fd1 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -33,6 +33,7 @@ #include "neverhood/resourceman.h" #include "neverhood/resource.h" #include "neverhood/screen.h" +#include "neverhood/staticdata.h" namespace Neverhood { @@ -62,6 +63,9 @@ Common::Error NeverhoodEngine::run() { _isSaveAllowed = false; + _staticData = new StaticData(); + _staticData->load("neverhood.dat"); + _screen = new Screen(this); _res = new ResourceMan(); @@ -176,9 +180,10 @@ Common::Error NeverhoodEngine::run() { } delete _gameModule; - delete _res; delete _screen; + + delete _staticData; debug("Ok."); diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index dddec472b9..b2ba5f7ff0 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -42,6 +42,7 @@ struct NeverhoodGameDescription; class GameModule; class ResourceMan; class Screen; +class StaticData; struct GameState { int sceneNum; @@ -74,6 +75,7 @@ public: Screen *_screen; ResourceMan *_res; GameModule *_gameModule; + StaticData *_staticData; public: diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 405a528143..108adba83b 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -32,14 +32,10 @@ #include "neverhood/palette.h" #include "neverhood/smackerplayer.h" #include "neverhood/sprite.h" +#include "neverhood/staticdata.h" namespace Neverhood { -struct MessageListItem { - uint32 messageNum; - uint32 messageValue; -}; - class Scene : public Entity { public: Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); @@ -58,7 +54,7 @@ protected: Common::Array _entities; Common::Array _surfaces; bool _systemCallbackFlag; - MessageListItem *_messageList; + MessageList *_messageList; int _messageListIndex; int _messageListCount; bool _messageListFlag1; @@ -77,7 +73,7 @@ protected: Background *_background; bool _surfaceFlag; bool _messageListFlag; - MessageListItem *_messageList2; + MessageList *_messageList2; int _messageListStatus; SmackerPlayer *_smackerPlayer; void (Entity::*_savedUpdateHandlerCb)(); diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp new file mode 100644 index 0000000000..4cd1d30251 --- /dev/null +++ b/engines/neverhood/staticdata.cpp @@ -0,0 +1,121 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/staticdata.h" + +namespace Neverhood { + +StaticData::StaticData() { +} + +StaticData::~StaticData() { +} + +void StaticData::load(const char *filename) { + + Common::File fd; + + if (!fd.open(filename)) + error("StaticData::load() Could not open %s", filename); + + fd.readUint32LE(); // magic + fd.readUint32LE(); // version + + // Load message lists + uint32 messageListsCount = fd.readUint32LE(); + debug("messageListsCount: %d", messageListsCount); + for (uint32 i = 0; i < messageListsCount; i++) { + MessageList *messageList = new MessageList(); + uint32 id = fd.readUint32LE(); + uint32 itemCount = fd.readUint32LE(); + for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) { + MessageItem messageItem; + messageItem.messageNum = fd.readUint16LE(); + messageItem.messageValue = fd.readUint32LE(); + messageList->push_back(messageItem); + } + _messageLists[id] = messageList; + } + + // Load rect lists + uint32 rectListsCount = fd.readUint32LE(); + debug("rectListsCount: %d", rectListsCount); + for (uint32 i = 0; i < rectListsCount; i++) { + RectList *rectList = new RectList(); + uint32 id = fd.readUint32LE(); + uint32 itemCount = fd.readUint32LE(); + for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) { + RectItem rectItem; + rectItem.rect.x1 = fd.readUint16LE(); + rectItem.rect.y1 = fd.readUint16LE(); + rectItem.rect.x2 = fd.readUint16LE(); + rectItem.rect.y2 = fd.readUint16LE(); + uint32 subItemCount = fd.readUint32LE(); + rectItem.subRects.reserve(subItemCount); + for (uint32 subItemIndex = 0; subItemIndex < subItemCount; subItemIndex++) { + SubRectItem subRectItem; + subRectItem.rect.x1 = fd.readUint16LE(); + subRectItem.rect.y1 = fd.readUint16LE(); + subRectItem.rect.x2 = fd.readUint16LE(); + subRectItem.rect.y2 = fd.readUint16LE(); + subRectItem.messageListId = fd.readUint32LE(); + rectItem.subRects.push_back(subRectItem); + } + rectList->push_back(rectItem); + } + _rectLists[id] = rectList; + } + + // Load hit rects + uint32 hitRectListsCount = fd.readUint32LE(); + debug("hitRectListsCount: %d", hitRectListsCount); + for (uint32 i = 0; i < hitRectListsCount; i++) { + HitRectList *hitRectList = new HitRectList(); + uint32 id = fd.readUint32LE(); + uint32 itemCount = fd.readUint32LE(); + for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) { + HitRect hitRect; + hitRect.rect.x1 = fd.readUint16LE(); + hitRect.rect.y1 = fd.readUint16LE(); + hitRect.rect.x2 = fd.readUint16LE(); + hitRect.rect.y2 = fd.readUint16LE(); + hitRect.type = fd.readUint16LE(); + hitRectList->push_back(hitRect); + } + _hitRectLists[id] = hitRectList; + } + +} + +HitRectList *StaticData::getHitRectList(uint32 id) { + return _hitRectLists[id]; +} + +RectList *StaticData::getRectList(uint32 id) { + return _rectLists[id]; +} + +MessageList *StaticData::getMessageList(uint32 id) { + return _messageLists[id]; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h new file mode 100644 index 0000000000..a7d8a65bdd --- /dev/null +++ b/engines/neverhood/staticdata.h @@ -0,0 +1,75 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_STATICDATA_H +#define NEVERHOOD_STATICDATA_H + +#include "common/array.h" +#include "common/hashmap.h" +#include "neverhood/neverhood.h" +#include "neverhood/graphics.h" + +namespace Neverhood { + +struct HitRect { + NRect rect; + uint16 type; +}; + +typedef Common::Array HitRectList; + +struct SubRectItem { + NRect rect; + uint32 messageListId; +}; + +struct RectItem { + NRect rect; + Common::Array subRects; +}; + +typedef Common::Array RectList; + +struct MessageItem { + uint16 messageNum; + uint32 messageValue; +}; + +typedef Common::Array MessageList; + +class StaticData { +public: + StaticData(); + ~StaticData(); + void load(const char *filename); + HitRectList *getHitRectList(uint32 id); + RectList *getRectList(uint32 id); + MessageList *getMessageList(uint32 id); +protected: + Common::HashMap _hitRectLists; + Common::HashMap _rectLists; + Common::HashMap _messageLists; +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_STATICDATA_H */ -- cgit v1.2.3 From 6b71d177925ff21787fb792dc05ac048eadbbca3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 5 Jul 2011 14:46:10 +0000 Subject: NEVERHOOD: Start with the CollisionMan class --- engines/neverhood/collisionman.cpp | 67 ++++++++++++++++++++++++++++++++++++++ engines/neverhood/collisionman.h | 53 ++++++++++++++++++++++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/neverhood.cpp | 4 +++ engines/neverhood/neverhood.h | 2 ++ 5 files changed, 127 insertions(+) create mode 100644 engines/neverhood/collisionman.cpp create mode 100644 engines/neverhood/collisionman.h diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp new file mode 100644 index 0000000000..cc40a47f1e --- /dev/null +++ b/engines/neverhood/collisionman.cpp @@ -0,0 +1,67 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/collisionman.h" + +namespace Neverhood { + +CollisionMan::CollisionMan(NeverhoodEngine *vm) + : _vm(vm), _hitRects(NULL) { +} + +CollisionMan::~CollisionMan() { +} + +void CollisionMan::setHitRects(uint32 id) { + setHitRects(_vm->_staticData->getHitRectList(id)); +} + +void CollisionMan::setHitRects(HitRectList *hitRects) { + _hitRects = hitRects; +} + +HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) { + // TODO + return NULL; +} + +void CollisionMan::addSprite(Sprite *sprite) { + _sprites.push_back(sprite); +} + +void CollisionMan::removeSprite(Sprite *sprite) { + // TODO +} + +void CollisionMan::clearSprites() { + _sprites.clear(); +} + +void CollisionMan::save() { + // TODO +} + +void CollisionMan::restore() { + // TODO +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h new file mode 100644 index 0000000000..cfa248ab4b --- /dev/null +++ b/engines/neverhood/collisionman.h @@ -0,0 +1,53 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_COLLISIONMAN_H +#define NEVERHOOD_COLLISIONMAN_H + +#include "neverhood/neverhood.h" +#include "neverhood/sprite.h" +#include "neverhood/staticdata.h" + +namespace Neverhood { + +class CollisionMan { +public: + CollisionMan(NeverhoodEngine *vm); + ~CollisionMan(); + void setHitRects(uint32 id); + void setHitRects(HitRectList *hitRects); + HitRect *findHitRectAtPos(int16 x, int16 y); + void addSprite(Sprite *sprite); + void removeSprite(Sprite *sprite); + void clearSprites(); + void save(); + void restore(); +protected: + NeverhoodEngine *_vm; + HitRectList *_hitRects; + Common::Array _sprites; +}; + + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_COLLISIONMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 8a25e25bab..f139268c36 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -3,6 +3,7 @@ MODULE := engines/neverhood MODULE_OBJS = \ background.o \ blbarchive.o \ + collisionman.o \ detection.o \ entity.o \ gamemodule.o \ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 24033f0fd1..8b74b6620e 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -28,6 +28,7 @@ #include "engines/util.h" #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" +#include "neverhood/collisionman.h" #include "neverhood/gamemodule.h" #include "neverhood/graphics.h" #include "neverhood/resourceman.h" @@ -128,6 +129,7 @@ Common::Error NeverhoodEngine::run() { } #endif + _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); // Preliminary main loop, needs some more work but works for testing @@ -180,6 +182,8 @@ Common::Error NeverhoodEngine::run() { } delete _gameModule; + delete _collisionMan; + delete _res; delete _screen; diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index b2ba5f7ff0..4a07d6a1be 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -39,6 +39,7 @@ enum NeverhoodGameFeatures { struct NeverhoodGameDescription; +class CollisionMan; class GameModule; class ResourceMan; class Screen; @@ -76,6 +77,7 @@ public: ResourceMan *_res; GameModule *_gameModule; StaticData *_staticData; + CollisionMan *_collisionMan; public: -- cgit v1.2.3 From 056b69f0c8b2c69f3040fa54268b22c6463627b0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 5 Jul 2011 18:19:46 +0000 Subject: NEVERHOOD: Module1000 and Scene1001 skeletons - Implement BaseSurface::drawSpriteResourceEx - Use CollisionMan in Scene - Some cleanup --- engines/neverhood/collisionman.cpp | 29 ++++++++++-- engines/neverhood/collisionman.h | 1 + engines/neverhood/graphics.cpp | 14 ++++++ engines/neverhood/graphics.h | 4 ++ engines/neverhood/module.h | 1 + engines/neverhood/module1000.cpp | 90 +++++++++++++++++++++++++++++++++++++- engines/neverhood/resource.cpp | 10 ++--- engines/neverhood/resource.h | 2 +- engines/neverhood/scene.cpp | 7 +-- engines/neverhood/sprite.cpp | 43 +++++++++--------- engines/neverhood/sprite.h | 2 +- 11 files changed, 169 insertions(+), 34 deletions(-) diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index cc40a47f1e..31bc16d23c 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -24,6 +24,8 @@ namespace Neverhood { +static HitRect defaultHitRect = {NRect(), 0x5000}; + CollisionMan::CollisionMan(NeverhoodEngine *vm) : _vm(vm), _hitRects(NULL) { } @@ -39,13 +41,34 @@ void CollisionMan::setHitRects(HitRectList *hitRects) { _hitRects = hitRects; } +void CollisionMan::clearHitRects() { + _hitRects = 0; +} + HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) { - // TODO - return NULL; + if (_hitRects) { + for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) { + HitRect *hitRect = &(*it); + if (x >= hitRect->rect.x1 && x <= hitRect->rect.x2 && y >= hitRect->rect.y1 && y <= hitRect->rect.y2) + return hitRect; + } + } + return &defaultHitRect; } void CollisionMan::addSprite(Sprite *sprite) { - _sprites.push_back(sprite); + int index = 0, insertIndex = -1; + for (Common::Array::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) { + if ((*iter)->getPriority() > sprite->getPriority()) { + insertIndex = index; + break; + } + index++; + } + if (insertIndex >= 0) + _sprites.insert_at(insertIndex, sprite); + else + _sprites.push_back(sprite); } void CollisionMan::removeSprite(Sprite *sprite) { diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h index cfa248ab4b..426dca0c95 100644 --- a/engines/neverhood/collisionman.h +++ b/engines/neverhood/collisionman.h @@ -35,6 +35,7 @@ public: ~CollisionMan(); void setHitRects(uint32 id); void setHitRects(HitRectList *hitRects); + void clearHitRects(); HitRect *findHitRectAtPos(int16 x, int16 y); void addSprite(Sprite *sprite); void removeSprite(Sprite *sprite); diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index fa7c15211a..3d21e8e7de 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -74,6 +74,20 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { } } +void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height) { + if (spriteResource.getDimensions().width <= _sysRect.width && + spriteResource.getDimensions().height <= _sysRect.height) { + if (width > 0 && width <= _sysRect.width) + _drawRect.width = width; + if (height > 0 && height <= _sysRect.height) + _drawRect.height = height; + if (_surface) { + clear(); + spriteResource.draw((byte*)_surface->pixels, _surface->pitch, flipX, flipY); + } + } +} + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index cb7474c78d..ce2be1a592 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -41,11 +41,13 @@ struct NDimensions { struct NRect { int16 x1, y1, x2, y2; NRect() : x1(0), y1(0), x2(0), y2(0) {} + NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {} }; struct NDrawRect { int16 x, y, width, height; NDrawRect() : x(0), y(0), width(0), height(0) {} + NDrawRect(int16 x0, int16 y0, int16 width0, int16 height0) : x(x0), y(y0), width(width0), height(height0) {} }; class SpriteResource; @@ -60,11 +62,13 @@ public: virtual void addDirtyRect(); void clear(); void drawSpriteResource(SpriteResource &spriteResource); + void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height); int getPriority() const { return _priority; } void setPriority(int priority) { _priority = priority; } NDrawRect& getDrawRect() { return _drawRect; } NDrawRect& getSysRect() { return _sysRect; } NRect& getClipRect() { return _clipRect; } + void setClipRect(NRect clipRect) { _clipRect = clipRect; } protected: NeverhoodEngine *_vm; int _priority; diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index d3c7b69169..7911e44072 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -27,6 +27,7 @@ #include "neverhood/neverhood.h" #include "neverhood/background.h" +#include "neverhood/collisionman.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" #include "neverhood/palette.h" diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index d1403b9307..248769ecf5 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -103,7 +103,95 @@ void Module1000::updateScene1005() { // Scene1001 Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) { + + // TODO: Implement Sprite classes + + Sprite *staticSprite1; + + SetMessageHandler(&Scene1001::handleMessage); + + _vm->_collisionMan->setHitRects(0x004B4858); + _surfaceFlag = false; + _background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0)); + _palette = new Palette(_vm, 0x4086520E); + _palette->usePalette(); + + // TODO Mouse + +#if 0 + // TODO: Player sprites... + if (which < 0) { + setRectList(0x004B49F0); + _playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000); + setMessageList(0x004B4888); + } else if (which == 1) { + setRectList(0x004B49F0); + _playerSprite = new Class572(_vm, this, 640, 433, 1000, 1000); + setMessageList(0x004B4898); + } else if (which == 2) { + setRectList(0x004B49F0); + if (_vm->getGlobalVar(0xC0418A02)) { + _playerSprite = new Class572(_vm, this, 390, 433, 1000, 1000); + _playerSprite->setDoDeltaX(1); + } else { + _playerSprite = new Class572(_vm, this, 300, 433, 1000, 1000); + } + setMessageList(0x004B4970); + } else { + setRectList(0x004B4A00); + _playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000); + setMessageList(0x004B4890); + } + addSprite(_playerSprite); +#endif + + staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300)); + +#if 0 + // TODO: This sucks somehow, find a better way + _playerSprite->getSurface()->getClipRect().x1 = 0; + _playerSprite->getSurface()->getClipRect().y1 = 0; + _playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _playerSprite->getSurface()->getClipRect().y2 = 480; + + if (_vm->getGlobalVar(0xD217189D) == 0) { + _class509 = addSprite(new Class509(_vm)); + _class509->getSurface()->getClipRect().x1 = 0; + _class509->getSurface()->getClipRect().y1 = 0; + _class509->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _class509->getSurface()->getClipRect().y2 = 480; + } else { + _class509 = NULL; + } + + _class511 = addSprite(new Class511(_vm, this, 150, 433, 1)); +#endif + + addSprite(new StaticSprite(_vm, 0x809861A6, 950)); + addSprite(new StaticSprite(_vm, 0x89C03848, 1100)); + +#if 0 + _class608 = addSprite(new Class608(_vm, 0x15288120, 100, 0)); +#endif + + if (_vm->getGlobalVar(0x03C698DA) == 0) { + staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200)); +#if 0 + _class510 = addSprite(new Class510(_vm)); + _class510->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x; + _class510->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y; + _class510->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _class510->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height; +#endif + } else { + _class510= NULL; + } + +#if 0 + _class508 = addSprite(new Class508(_vm, _class509)); +#endif + } void Scene1001::update() { diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 300cf8195a..c122ca2e5e 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -220,10 +220,10 @@ bool AnimResource::load(uint32 fileHash) { AnimFrameInfo frameInfo; frameInfo.frameHash = READ_LE_UINT32(frameList); frameInfo.counter = READ_LE_UINT16(frameList + 4); - frameInfo.rect.x1 = READ_LE_UINT16(frameList + 6); - frameInfo.rect.y1 = READ_LE_UINT16(frameList + 8); - frameInfo.rect.x2 = READ_LE_UINT16(frameList + 10); - frameInfo.rect.y2 = READ_LE_UINT16(frameList + 12); + frameInfo.rect.x = READ_LE_UINT16(frameList + 6); + frameInfo.rect.y = READ_LE_UINT16(frameList + 8); + frameInfo.rect.width = READ_LE_UINT16(frameList + 10); + frameInfo.rect.height = READ_LE_UINT16(frameList + 12); frameInfo.deltaX = READ_LE_UINT16(frameList + 14); frameInfo.deltaY = READ_LE_UINT16(frameList + 16); frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); @@ -234,7 +234,7 @@ bool AnimResource::load(uint32 fileHash) { frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28); debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", frameInfo.frameHash, frameInfo.counter, - frameInfo.rect.x1, frameInfo.rect.y1, frameInfo.rect.x2, frameInfo.rect.y2, + frameInfo.rect.x, frameInfo.rect.y, frameInfo.rect.width, frameInfo.rect.height, frameInfo.deltaX, frameInfo.deltaY, frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height, frameInfo.field_1A, frameInfo.spriteDataOffs); diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 868bafdc44..4199fe73e4 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -64,7 +64,7 @@ protected: struct AnimFrameInfo { uint32 frameHash; int16 counter; - NRect rect; + NDrawRect rect; int16 deltaX, deltaY; NDrawRect deltaRect; uint16 field_1A; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index a73b45b9f7..b06caeec14 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/scene.h" +#include "neverhood/collisionman.h" namespace Neverhood { @@ -42,8 +43,8 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _background = NULL; // TODO _field_8E = -1; if (clearHitRects) { - // TODO g_Class700->setHitRects(NULL, 0); - // TODO g_Class700->clear(); + _vm->_collisionMan->clearHitRects(); + _vm->_collisionMan->clearSprites(); } _vm->_screen->setFps(24); // TODO g_screen->hSmack = NULL; @@ -161,7 +162,7 @@ void Scene::setSurfacePriority(BaseSurface *surface, int priority) { } void Scene::deleteSprite(Sprite **sprite) { - // TODO g_Class700->removeSprite(*sprite); + _vm->_collisionMan->removeSprite(*sprite); removeSurface((*sprite)->getSurface()); removeEntity(*sprite); delete *sprite; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 0157673250..0f44110cdd 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -119,11 +119,13 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, _x = x == kDefPosition ? _spriteResource.getPosition().x : x; _y = y == kDefPosition ? _spriteResource.getPosition().y : y; + + debug("StaticSprite::init() final: x = %d; y = %d", _x, _y); - _rect1.x1 = 0; - _rect1.y1 = 0; - _rect1.x2 = width; - _rect1.y2 = height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = width; + _drawRect.width = height; _needRedraw = true; @@ -137,19 +139,19 @@ void StaticSprite::update() { return; if (_doDeltaX) { - _x = filterX(_x - _rect1.x1 - _rect1.x2 + 1); + _surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1); } else { - _x = filterX(_x + _rect1.x1); + _surface->getDrawRect().x = filterX(_x + _drawRect.x); } if (_doDeltaY) { - _y = filterY(_y - _rect1.y1 - _rect1.y2 + 1); + _surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1); } else { - _y = filterY(_y + _rect1.y1); + _surface->getDrawRect().y = filterY(_y + _drawRect.y); } if (_needRedraw) { - // TODO _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2); + _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); _needRedraw = false; } @@ -160,10 +162,10 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { _spriteResource.load2(fileHash); if (dimensions) { - _rect1.x1 = 0; - _rect1.y1 = 0; - _rect1.x2 = _spriteResource.getDimensions().width; - _rect1.y2 = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; } if (position) { @@ -276,7 +278,7 @@ void AnimatedSprite::updateAnim() { _frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; } } else { - // TODO updateFrameIndex(); + updateFrameIndex(); } if (_fileHash1 == 0) updateFrameInfo(); @@ -336,19 +338,20 @@ void AnimatedSprite::updatePosition() { return; if (_doDeltaX) { - _surface->getDrawRect().x = filterX(_x - _rect1.x1 - _rect1.x2 + 1); + _surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1); } else { - _surface->getDrawRect().x = filterX(_x + _rect1.x1); + _surface->getDrawRect().x = filterX(_x + _drawRect.x); } if (_doDeltaY) { - _surface->getDrawRect().y = filterY(_y - _rect1.y1 - _rect1.y2 + 1); + _surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1); } else { - _surface->getDrawRect().y = filterY(_y + _rect1.y1); + _surface->getDrawRect().y = filterY(_y + _drawRect.y); } if (_needRedraw) { - // TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _rect1.x2, _rect1.y2); + debug("TODO: drawAnimResource"); + // TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); _needRedraw = false; } @@ -381,7 +384,7 @@ void AnimatedSprite::updateFrameInfo() { const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex); _flag = true; - _rect1 = frameInfo.rect; + _drawRect = frameInfo.rect; _deltaX = frameInfo.deltaX; _deltaY = frameInfo.deltaY; _deltaRect = frameInfo.deltaRect; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 708228ca2f..5d013a85e4 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -55,7 +55,7 @@ protected: bool _needRedraw; //0000002B field_2B db ? //0000002C field2C dd ? // unused - NRect _rect1; + NDrawRect _drawRect; NDrawRect _deltaRect; NRect _rect; uint16 _flags; -- cgit v1.2.3 From 97f319c945baee44947d6013de2998651b79046f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 6 Jul 2011 09:15:37 +0000 Subject: NEVERHOOD: More work on Scene1001, implement Class509 (yes, will be renamed later) and AnimResource related stuff --- engines/neverhood/entity.h | 4 +- engines/neverhood/graphics.cpp | 15 +++- engines/neverhood/graphics.h | 4 ++ engines/neverhood/module1000.cpp | 146 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module1000.h | 22 +++++- engines/neverhood/neverhood.cpp | 4 ++ engines/neverhood/neverhood.h | 1 + engines/neverhood/resource.cpp | 9 +++ engines/neverhood/resource.h | 1 + engines/neverhood/screen.cpp | 2 +- engines/neverhood/sprite.cpp | 61 +++++++++++----- engines/neverhood/sprite.h | 16 +++-- 12 files changed, 255 insertions(+), 30 deletions(-) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index bbe67a187c..18b9cba793 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -44,14 +44,16 @@ struct MessageParam { class Entity { public: + Common::String _name; // Entity name for debugging purposes Entity(NeverhoodEngine *vm, int priority) - : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority) { + : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") { } virtual ~Entity() { } virtual void draw() { } void handleUpdate() { + //debug("Entity(%s).handleUpdate", _name.c_str()); if (_updateHandlerCb) (this->*_updateHandlerCb)(); } diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 3d21e8e7de..b6d883c168 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -51,7 +51,7 @@ BaseSurface::~BaseSurface() { } void BaseSurface::draw() { - debug("BaseSurface::draw()"); + debug(8, "BaseSurface::draw()"); if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { // TODO: _sysRect alternate drawing code (is that used?) _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect); @@ -88,6 +88,19 @@ void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flip } } +void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height) { + if (width > 0 && width <= _sysRect.width) + _drawRect.width = width; + if (height > 0 && height <= _sysRect.height) + _drawRect.height = height; + if (_surface) { + clear(); + if (frameIndex < animResource.getFrameCount()) { + animResource.draw(frameIndex, (byte*)_surface->pixels, _surface->pitch, flipX, flipY); + } + } +} + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index ce2be1a592..bf8333c1f5 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -50,6 +50,7 @@ struct NDrawRect { NDrawRect(int16 x0, int16 y0, int16 width0, int16 height0) : x(x0), y(y0), width(width0), height(height0) {} }; +class AnimResource; class SpriteResource; // NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific @@ -63,12 +64,15 @@ public: void clear(); void drawSpriteResource(SpriteResource &spriteResource); void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height); + void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height); int getPriority() const { return _priority; } void setPriority(int priority) { _priority = priority; } NDrawRect& getDrawRect() { return _drawRect; } NDrawRect& getSysRect() { return _sysRect; } NRect& getClipRect() { return _clipRect; } void setClipRect(NRect clipRect) { _clipRect = clipRect; } + bool getVisible() const { return _visible; } + void setVisible(bool value) { _visible = value; } protected: NeverhoodEngine *_vm; int _priority; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 248769ecf5..162618ec0b 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -86,6 +86,36 @@ void Module1000::createScene1005(int which) { } void Module1000::updateScene1001() { + _childObject->handleUpdate(); + + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 2) { + // TODO createScene1003(); + // TODO _childObject->handleUpdate(); + } else { + // TODO createScene1002(); + // TODO _childObject->handleUpdate(); + } + } + + if (_field24 >= 0) { + if (_field24 == 2) { + // TODO ResourceTable_multiLoad(&_resourceTable2, &_resourceTable1, &_resourceTable3); + _field24 = -1; + } else { + // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable1); + _field24 = -1; + } + } + + if (_field26 >= 0) { + // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3); + _field26 = -1; + } + } void Module1000::updateScene1002() { @@ -101,10 +131,121 @@ void Module1000::updateScene1005() { } // Scene1001 + +Class509::Class509(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) { + + _name = "Class509"; + + createSurface(800, 137, 242); + + _x = 726; + _y = 440; + + callback1(); + +#if 0 + _soundResource2.set(0xED403E03); + _soundResource2.load(); + _soundResource2.createSoundBuffer(); +#endif + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class509::handleMessage); + +} + +uint32 Class509::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + handleMessage2000h(); + break; + case 0x3002: + removeCallbacks(); + break; + } + return 0; +} + +void Class509::handleMessage2000h() { + + switch (_vm->getGlobalVar(0x52371C95)) { + case 0: +#if 0 + _soundResource1.set(0x65482F03); + _soundResource1.load(); + _soundResource1.play(false); +#endif + setFileHash(0x624C0498, 1, 3); + SetAnimationCallback3(&Class509::callback1); + break; + case 1: +#if 0 + _soundResource1.set(0x65482F03); + _soundResource1.load(); + _soundResource1.play(false); +#endif + setFileHash(0x624C0498, 1, 3); + SetAnimationCallback3(&Class509::callback1); + break; + case 2: +#if 0 + _soundResource2.play(false); +#endif + setFileHash(0x624C0498, 6, 6); + SetAnimationCallback3(&Class509::callback2); + break; + default: + // Nothing + break; + } + + _vm->incGlobalVar(0x52371C95, 1); + +} + +void Class509::callback1() { + switch (_vm->getGlobalVar(0x52371C95)) { + case 1: + setFileHash(0x624C0498, 4, -1); + _newHashListIndex = 4; + break; + case 2: + setFileHash(0x624C0498, 1, -1); + _newHashListIndex = 1; + break; + case 3: + setFileHash1(); + _surface->setVisible(false); + break; + default: + setFileHash(0x624C0498, 0, -1); + _newHashListIndex = 0; + break; + } +} + +void Class509::callback2() { + _vm->setGlobalVar(0xD217189D, 1); + setFileHash(0x624C0498, 6, 6); + SetAnimationCallback3(&Class509::callback3); + _x = 30; +} + +void Class509::callback3() { +#if 0 + _soundResource1.play(false); +#endif + setFileHash1(); + _surface->setVisible(false); +} Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) { + _name = "Scene1001"; + // TODO: Implement Sprite classes Sprite *staticSprite1; @@ -154,6 +295,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _playerSprite->getSurface()->getClipRect().y1 = 0; _playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; _playerSprite->getSurface()->getClipRect().y2 = 480; +#endif if (_vm->getGlobalVar(0xD217189D) == 0) { _class509 = addSprite(new Class509(_vm)); @@ -165,6 +307,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _class509 = NULL; } +#if 0 _class511 = addSprite(new Class511(_vm, this, 150, 433, 1)); #endif @@ -194,9 +337,6 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } -void Scene1001::update() { -} - uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { return 0; } diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 935a8be020..4e7b2922a3 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -29,6 +29,8 @@ namespace Neverhood { +// Module1000 + class Module1000 : public Module { public: Module1000(NeverhoodEngine *vm, Module *parentModule, int which); @@ -51,18 +53,32 @@ protected: void updateScene1005(); }; +// Scene1001 + +class Class509 : public AnimatedSprite { +public: + Class509(NeverhoodEngine *vm); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void handleMessage2000h(); + void callback1(); + void callback2(); + void callback3(); +}; + class Scene1001 : public Scene { public: Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_class511; Sprite *_class508; Sprite *_class509; - Sprite *_class608; Sprite *_class510; + Sprite *_class511; + Sprite *_class608; int16 _fieldE4; int16 _fieldE6; - void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 8b74b6620e..1ba2c98860 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -203,6 +203,10 @@ void NeverhoodEngine::setGlobalVar(uint32 nameHash, uint32 value) { // TODO } +void NeverhoodEngine::incGlobalVar(uint32 nameHash, int incrValue) { + setGlobalVar(nameHash, getGlobalVar(nameHash) - incrValue); +} + uint32 NeverhoodEngine::getSubVar(uint32 nameHash, uint32 subNameHash) { // TODO return 0; diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 4a07d6a1be..952a99d768 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -116,6 +116,7 @@ public: GameState& gameState() { return _gameState; } uint32 getGlobalVar(uint32 nameHash); void setGlobalVar(uint32 nameHash, uint32 value); + void incGlobalVar(uint32 nameHash, int incrValue); uint32 getSubVar(uint32 nameHash, uint32 subNameHash); void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index c122ca2e5e..5fc167c050 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -153,6 +153,15 @@ AnimResource::~AnimResource() { unloadInternal(); } +void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) { + const AnimFrameInfo frameInfo = _frames[frameIndex]; + _currSpriteData = _spriteData + frameInfo.spriteDataOffs; + _width = frameInfo.rect.width; + _height = frameInfo.rect.height; + // TODO: Repl stuff + unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY); +} + bool AnimResource::load(uint32 fileHash) { debug("AnimResource::load(%08X)", fileHash); diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 4199fe73e4..969f46d3e7 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -75,6 +75,7 @@ class AnimResource { public: AnimResource(NeverhoodEngine *vm); ~AnimResource(); + void draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY); bool load(uint32 fileHash); void unload(); void clear(); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 68f611050d..77e8c02693 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -125,7 +125,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, ddRect.y1 = 0; } - debug("draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); + debug(8, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 0f44110cdd..1239a301d0 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -29,9 +29,10 @@ namespace Neverhood { Sprite::Sprite(NeverhoodEngine *vm, int objectPriority) : Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), - _doDeltaX(false), _doDeltaY(false), _needRedraw(false), + _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0) { + _name = "Sprite"; SetMessageHandler(&Sprite::handleMessage); } @@ -88,12 +89,15 @@ void Sprite::createSurface(int surfacePriority, int16 width, int16 height) { StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) : Sprite(vm, objectPriority), _spriteResource(vm) { - + + _name = "StaticSprite"; + } StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height) : Sprite(vm, 0), _spriteResource(vm) { + _name = "StaticSprite"; // TODO init(calcHash(filename), surfacePriority, x, y, width, height); } @@ -101,6 +105,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) : Sprite(vm, 0), _spriteResource(vm) { + _name = "StaticSprite"; init(fileHash, surfacePriority, x, y, width, height); } @@ -127,7 +132,7 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, _drawRect.width = width; _drawRect.width = height; - _needRedraw = true; + _needRefresh = true; update(); @@ -150,9 +155,9 @@ void StaticSprite::update() { _surface->getDrawRect().y = filterY(_y + _drawRect.y); } - if (_needRedraw) { + if (_needRefresh) { _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); - _needRedraw = false; + _needRefresh = false; } } @@ -173,7 +178,7 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { _y = _spriteResource.getPosition().y; } - _needRedraw = true; + _needRefresh = true; } @@ -198,6 +203,7 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface } void AnimatedSprite::init() { + _name = "AnimatedSprite"; _counter = 0; _fileHash1 = 0; _deltaX = 0; @@ -205,18 +211,18 @@ void AnimatedSprite::init() { _fileHash2 = 0; // TODO _callbackList = 0; _frameIndex3 = 0; - // TODO _callback3 = 0; _frameIndex = 0; _hashListIndex = -1; - // TODO _callback2 = 0; + _callback1Cb = NULL; + _callback2Cb = NULL; + _callback3Cb = NULL; _newHashListIndex = -1; - // TODO _callback1 = 0; _fileHash4 = 0; _flag = false; _replOldByte = 0; _replNewByte = 0; // TODO _animResource.replEnabled = 0; - _playBackwards = 0; + _playBackwards = false; } void AnimatedSprite::update() { @@ -265,7 +271,6 @@ void AnimatedSprite::updateAnim() { // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } - // loc_43831D if (_replNewByte != _replOldByte) { // TODO _animResource.setRepl(_replOldByte, _replNewByte); } @@ -349,10 +354,9 @@ void AnimatedSprite::updatePosition() { _surface->getDrawRect().y = filterY(_y + _drawRect.y); } - if (_needRedraw) { - debug("TODO: drawAnimResource"); - // TODO _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); - _needRedraw = false; + if (_needRefresh) { + _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); + _needRefresh = false; } } @@ -380,6 +384,7 @@ void AnimatedSprite::updateFrameIndex() { } void AnimatedSprite::updateFrameInfo() { + debug("AnimatedSprite::updateFrameInfo()"); const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex); @@ -392,7 +397,7 @@ void AnimatedSprite::updateFrameInfo() { processDelta(); - _needRedraw = true; + _needRefresh = true; if (frameInfo.frameHash != 0) { sendMessage(0x100D, frameInfo.frameHash, this); @@ -409,6 +414,7 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { } void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) { + debug("AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4); _fileHash1 = fileHash; _frameIndex3 = frameIndex3; _frameIndex4 = frameIndex4; @@ -446,6 +452,29 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil _hashListIndex = -1; } +void AnimatedSprite::removeCallbacks() { + + if (_callback1Cb) { + // _callback1Cb has to be cleared before it's called + AnimationCallback cb = _callback1Cb; + _callback1Cb = NULL; + debug("Fire _callback1Cb"); + (this->*cb)(); + } + if (_callback3Cb) { + _callback2Cb = _callback3Cb; + _callback3Cb = NULL; + debug("Fire _callback3Cb"); + (this->*_callback2Cb)(); +#if 0 // TODO + } else if (_callbackList) { + removeCallbackList(); +#endif + } else { + _callback2Cb = NULL; + } + +} } // End of namespace Neverhood diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 5d013a85e4..71067fa9ec 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -52,7 +52,7 @@ protected: BaseSurface *_surface; int16 _x, _y; bool _doDeltaX, _doDeltaY; - bool _needRedraw; + bool _needRefresh; //0000002B field_2B db ? //0000002C field2C dd ? // unused NDrawRect _drawRect; @@ -88,11 +88,17 @@ protected: void update(); }; +#define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback) +#define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback) +#define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback) + class AnimatedSprite : public Sprite { public: AnimatedSprite(NeverhoodEngine *vm, int objectPriority); AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y); + void update(); protected: + typedef void (AnimatedSprite::*AnimationCallback)(); AnimResource _animResource; uint32 _fileHash1; uint32 _fileHash2; @@ -117,12 +123,11 @@ protected: callbackListIndex dw ? callbackListCount dw ? callbackList dd ? - callback3 dd ? - callback2 dd ? - callback1 dd ? */ + AnimationCallback _callback1Cb; + AnimationCallback _callback2Cb; + AnimationCallback _callback3Cb; void init(); - void update(); void updateDeltaXY(); void updateAnim(); void updatePosition(); @@ -134,6 +139,7 @@ protected: void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5); void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!! + void removeCallbacks(); }; } // End of namespace Neverhood -- cgit v1.2.3 From e6236a39781360d2d41f5818b903d215015a1829 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 6 Jul 2011 11:01:21 +0000 Subject: NEVERHOOD: Add transparency and x flipping to sprite drawing (flip y still TODO but rarely used) - Add Class511 (the lever) to Module1000 --- engines/neverhood/background.cpp | 2 ++ engines/neverhood/graphics.cpp | 35 +++++++++++++++++------- engines/neverhood/graphics.h | 2 ++ engines/neverhood/module1000.cpp | 54 ++++++++++++++++++++++++++++++++++--- engines/neverhood/module1000.h | 9 +++++++ engines/neverhood/screen.cpp | 24 ++++++++++++----- engines/neverhood/screen.h | 2 +- engines/neverhood/smackerplayer.cpp | 2 +- 8 files changed, 109 insertions(+), 21 deletions(-) diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp index abfa50733d..c47acd15a9 100644 --- a/engines/neverhood/background.cpp +++ b/engines/neverhood/background.cpp @@ -46,6 +46,7 @@ Background::~Background() { void Background::createSurface(int surfacePriority, int16 width, int16 height) { _surface = new BaseSurface(_vm, surfacePriority, width, height); + _surface->setTransparent(false); _spriteResource.getPosition().x = width; _spriteResource.getPosition().y = height; } @@ -80,6 +81,7 @@ void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 heig // TODO: Later use a DirtySurface once it is implemented _surface = new BaseSurface(_vm, surfacePriority, width, height); + _surface->setTransparent(false); _spriteResource.getPosition().x = width; _spriteResource.getPosition().y = height; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index b6d883c168..f6ae118fa6 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -27,7 +27,7 @@ namespace Neverhood { BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height) - : _vm(vm), _priority(priority), _visible(true) { + : _vm(vm), _priority(priority), _visible(true), _transparent(true) { _drawRect.x = 0; _drawRect.y = 0; @@ -54,7 +54,7 @@ void BaseSurface::draw() { debug(8, "BaseSurface::draw()"); if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { // TODO: _sysRect alternate drawing code (is that used?) - _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect); + _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent); } } @@ -152,7 +152,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { - // TODO: Flip + // TODO: Flip Y int16 rows, chunks; int16 skip, copy; @@ -171,7 +171,14 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi skip = READ_LE_UINT16(source); copy = READ_LE_UINT16(source + 2); source += 4; - memcpy(dest + skip, source, copy); + if (!flipX) + memcpy(dest + skip, source, copy); + else { + byte *flipDest = dest + width - skip - 1; + for (int xc = 0; xc < copy; xc++) { + *flipDest-- = source[xc]; + } + } source += copy; } dest += destPitch; @@ -186,14 +193,24 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { - // TODO: Flip + // TODO: Flip Y int sourcePitch = (width + 3) & 0xFFFC; - while (height-- > 0) { - memcpy(dest, source, width); - source += sourcePitch; - dest += destPitch; + if (!flipX) { + while (height-- > 0) { + memcpy(dest, source, width); + source += sourcePitch; + dest += destPitch; + } + } else { + while (height-- > 0) { + dest += width - 1; + for (int xc = 0; xc < width; xc++) + *dest-- = source[xc]; + source += sourcePitch; + dest += destPitch; + } } } diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index bf8333c1f5..59db1e5ee5 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -73,6 +73,7 @@ public: void setClipRect(NRect clipRect) { _clipRect = clipRect; } bool getVisible() const { return _visible; } void setVisible(bool value) { _visible = value; } + void setTransparent(bool value) { _transparent = value; } protected: NeverhoodEngine *_vm; int _priority; @@ -81,6 +82,7 @@ protected: NDrawRect _drawRect; NDrawRect _sysRect; NRect _clipRect; + bool _transparent; }; // Misc diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 162618ec0b..c3aa0c9ccd 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -240,7 +240,55 @@ void Class509::callback3() { setFileHash1(); _surface->setVisible(false); } - + +Class511::Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + + createSurface(1010, 71, 73); + setDoDeltaX(deltaXType); + setFileHash(0x04A98C36, 0, -1); + _newHashListIndex = 0; + _x = x; + _y = y; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class511::handleMessage); +} + +uint32 Class511::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x00C0C444) { + _parentScene->sendMessage(0x480F, 0, this); + } else if (param._integer == 0xC41A02C0) { +#if 0 + _soundResource.set(0x40581882); + _soundResource.load(); + _soundResource.play(false); +#endif + } + break; + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x3002: + setFileHash(0x04A98C36, 0, -1); + _newHashListIndex = 0; + break; + case 0x480F: + setFileHash(0x04A98C36, 0, -1); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 0x3DE, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 0x3F2, this); + break; + } + return messageResult; +} + Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) { @@ -307,9 +355,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _class509 = NULL; } -#if 0 _class511 = addSprite(new Class511(_vm, this, 150, 433, 1)); -#endif addSprite(new StaticSprite(_vm, 0x809861A6, 950)); addSprite(new StaticSprite(_vm, 0x89C03848, 1100)); @@ -335,6 +381,8 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _class508 = addSprite(new Class508(_vm, _class509)); #endif + _class511->sendMessage(0x480F, 0, this); + } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 4e7b2922a3..219448a2bf 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -68,6 +68,15 @@ protected: void callback3(); }; +class Class511 : public AnimatedSprite { +public: + Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene1001 : public Scene { public: Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 77e8c02693..db1c16a1ce 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -94,7 +94,7 @@ void Screen::clear() { memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); } -void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect) { +void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent) { int16 destX, destY; NRect ddRect; @@ -131,12 +131,22 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); int width = ddRect.x2 - ddRect.x1; int height = ddRect.y2 - ddRect.y1; - - while (height--) { - memcpy(dest, source, width); - source += surface->pitch; - dest += _backScreen->pitch; - } + + if (!transparent) { + while (height--) { + memcpy(dest, source, width); + source += surface->pitch; + dest += _backScreen->pitch; + } + } else { + while (height--) { + for (int xc = 0; xc < width; xc++) + if (source[xc] != 0) + dest[xc] = source[xc]; + source += surface->pitch; + dest += _backScreen->pitch; + } + } #if 0 if ( ddRect.right > ddRect.left ) diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index fc56a18ea6..922ad481f3 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -42,7 +42,7 @@ public: void testPalette(byte *paletteData); void updatePalette(); void clear(); - void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect); + void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent); void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); protected: NeverhoodEngine *_vm; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index c914b42482..bbb0db144c 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -35,7 +35,7 @@ SmackerSurface::SmackerSurface(NeverhoodEngine *vm) void SmackerSurface::draw() { if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) { - _vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect); + _vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false); } } -- cgit v1.2.3 From 5a34d20ec857ab6142baea9d021cb9ff84196589 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 6 Jul 2011 19:56:15 +0000 Subject: NEVERHOOD: More work on Scene1001, also give sprites classes and vars some better names --- engines/neverhood/module1000.cpp | 247 ++++++++++++++++++++++++++++++--------- engines/neverhood/module1000.h | 47 ++++++-- engines/neverhood/neverhood.cpp | 5 +- 3 files changed, 233 insertions(+), 66 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index c3aa0c9ccd..d5b7b03481 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -132,30 +132,23 @@ void Module1000::updateScene1005() { // Scene1001 -Class509::Class509(NeverhoodEngine *vm) +AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) { - _name = "Class509"; - createSurface(800, 137, 242); - _x = 726; _y = 440; - callback1(); - #if 0 _soundResource2.set(0xED403E03); _soundResource2.load(); _soundResource2.createSoundBuffer(); #endif - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class509::handleMessage); - + SetMessageHandler(&AsScene1001Door::handleMessage); } -uint32 Class509::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: @@ -168,18 +161,9 @@ uint32 Class509::handleMessage(int messageNum, const MessageParam ¶m, Entity return 0; } -void Class509::handleMessage2000h() { - +void AsScene1001Door::handleMessage2000h() { switch (_vm->getGlobalVar(0x52371C95)) { case 0: -#if 0 - _soundResource1.set(0x65482F03); - _soundResource1.load(); - _soundResource1.play(false); -#endif - setFileHash(0x624C0498, 1, 3); - SetAnimationCallback3(&Class509::callback1); - break; case 1: #if 0 _soundResource1.set(0x65482F03); @@ -187,25 +171,23 @@ void Class509::handleMessage2000h() { _soundResource1.play(false); #endif setFileHash(0x624C0498, 1, 3); - SetAnimationCallback3(&Class509::callback1); + SetAnimationCallback3(&AsScene1001Door::callback1); break; case 2: #if 0 _soundResource2.play(false); #endif setFileHash(0x624C0498, 6, 6); - SetAnimationCallback3(&Class509::callback2); + SetAnimationCallback3(&AsScene1001Door::callback2); break; default: // Nothing break; } - _vm->incGlobalVar(0x52371C95, 1); - } -void Class509::callback1() { +void AsScene1001Door::callback1() { switch (_vm->getGlobalVar(0x52371C95)) { case 1: setFileHash(0x624C0498, 4, -1); @@ -226,14 +208,14 @@ void Class509::callback1() { } } -void Class509::callback2() { +void AsScene1001Door::callback2() { _vm->setGlobalVar(0xD217189D, 1); setFileHash(0x624C0498, 6, 6); - SetAnimationCallback3(&Class509::callback3); + SetAnimationCallback3(&AsScene1001Door::callback3); _x = 30; } -void Class509::callback3() { +void AsScene1001Door::callback3() { #if 0 _soundResource1.play(false); #endif @@ -241,7 +223,84 @@ void Class509::callback3() { _surface->setVisible(false); } -Class511::Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType) +AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) + : AnimatedSprite(vm, 1100), _soundResource(vm), _asDoor(asDoor) { + + _x = 547; + _y = 206; + createSurface(900, 177, 192); + setFileHash(0x022C90D4, -1, -1); + _newHashListIndex = -2; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1001Hammer::handleMessage); +} + +uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x00352100) { + if (_asDoor) { + _asDoor->sendMessage(0x2000, 0, this); + } + } else if (param._integer == 0x0A1A0109) { +#if 0 + _soundResource.set(0x66410886); + _soundResource.load(); + _soundResource.play(false); +#endif + } + break; + case 0x2000: + setFileHash(0x022C90D4, 1, -1); +#if 0 + _soundResource.set(0xE741020A); + _soundResource.load(); + _soundResource.play(false); +#endif + _newHashListIndex = -2; + break; + } + return 0; +} + +AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _soundResource(vm) { + + _x = 320; + _y = 240; + createSurface(100, 66, 129); + setFileHash(0xC68C2299, 0, -1); + _newHashListIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1001Window::handleMessage); +} + +uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x0E0A1410) { +#if 0 + _soundResource.set(0x60803F10); + _soundResource.load(); + _soundResource.play(false); +#endif + } + break; + case 0x2001: + setFileHash(0xC68C2299, 0, -1); + break; + case 0x3002: + SetMessageHandler(NULL); + _vm->setGlobalVar(0x03C698DA, 1); + _surface->setVisible(false); + break; + } + return 0; +} + +AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType) : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { createSurface(1010, 71, 73); @@ -251,10 +310,10 @@ Class511::Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, in _x = x; _y = y; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class511::handleMessage); + SetMessageHandler(&AsScene1001Lever::handleMessage); } -uint32 Class511::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -288,7 +347,40 @@ uint32 Class511::handleMessage(int messageNum, const MessageParam ¶m, Entity } return messageResult; } - + +SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash) + : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _soundResource(vm), _countdown(0) { + + _priority = 1100; + _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; + _surface->setVisible(false); + SetUpdateHandler(&SsCommonButtonSprite::update); + SetMessageHandler(&SsCommonButtonSprite::handleMessage); +} + +void SsCommonButtonSprite::update() { + if (_countdown != 0 && (--_countdown) == 0) { + _surface->setVisible(false); + } +} + +uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480B: + _parentScene->sendMessage(0x480B, 0, this); + _surface->setVisible(true); + _countdown = 8; +#if 0 + _soundResource.set(_soundFileHash); + _soundResource.load(); + _soundResource.play(false); +#endif + break; + } + return messageResult; +} + Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) { @@ -346,47 +438,90 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) #endif if (_vm->getGlobalVar(0xD217189D) == 0) { - _class509 = addSprite(new Class509(_vm)); - _class509->getSurface()->getClipRect().x1 = 0; - _class509->getSurface()->getClipRect().y1 = 0; - _class509->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; - _class509->getSurface()->getClipRect().y2 = 480; + _asDoor = addSprite(new AsScene1001Door(_vm)); + _asDoor->getSurface()->getClipRect().x1 = 0; + _asDoor->getSurface()->getClipRect().y1 = 0; + _asDoor->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _asDoor->getSurface()->getClipRect().y2 = 480; } else { - _class509 = NULL; + _asDoor = NULL; } - _class511 = addSprite(new Class511(_vm, this, 150, 433, 1)); + _asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1)); addSprite(new StaticSprite(_vm, 0x809861A6, 950)); addSprite(new StaticSprite(_vm, 0x89C03848, 1100)); -#if 0 - _class608 = addSprite(new Class608(_vm, 0x15288120, 100, 0)); -#endif + _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0)); if (_vm->getGlobalVar(0x03C698DA) == 0) { staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200)); -#if 0 - _class510 = addSprite(new Class510(_vm)); - _class510->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x; - _class510->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y; - _class510->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; - _class510->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height; -#endif + _asWindow = addSprite(new AsScene1001Window(_vm)); + _asWindow->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x; + _asWindow->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y; + _asWindow->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _asWindow->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height; } else { - _class510= NULL; + _asWindow = NULL; } -#if 0 - _class508 = addSprite(new Class508(_vm, _class509)); -#endif - - _class511->sendMessage(0x480F, 0, this); + _asHammer = addSprite(new AsScene1001Hammer(_vm, _asDoor)); } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - return 0; + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param._point.x == 0 && _vm->getGlobalVar(0xA4014072)) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x000D: + if (param._integer == 0x188B2105) { + _parentModule->sendMessage(0x1009, 0, this); + messageResult = 1; + } + break; + case 0x100D: + if (param._integer == 0x00342624) { + // TODO _playerSprite->sendMessage(0x1014, _asLever, this); + // TODO setMessageList2(0x004B4910, true, false); + messageResult = 1; + } else if (param._integer == 0x21E64A00) { + if (_vm->getGlobalVar(0xD217189D)) { + // TODO setMessageList(0x004B48A8, true, false); + messageResult = 1; + } else { + // TODO setMessageList(0x004B48C8, true, false); + messageResult = 1; + } + } else if (param._integer == 0x040424D0) { + // TODO _playerSprite->sendMessage(0x1014, _ssButton, this); + } else if (param._integer == 0x80006358) { + if (_vm->getGlobalVar(0x03C698DA)) { + // TODO setMessageList(0x004B4938, true, false); + } else { + // TODO setMessageList(0x004B4960, true, false); + } + } + break; + case 0x2002: + // TODO setRectList(0x004B49F0); + break; + case 0x480B: + if (_asWindow) { + _asWindow->sendMessage(0x2001, 0, this); + } + break; + case 0x480F: + if (_asHammer) { + _asHammer->sendMessage(0x2000, 0, this); + } + break; + } + return messageResult; } } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 219448a2bf..82c2feab13 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -55,9 +55,9 @@ protected: // Scene1001 -class Class509 : public AnimatedSprite { +class AsScene1001Door : public AnimatedSprite { public: - Class509(NeverhoodEngine *vm); + AsScene1001Door(NeverhoodEngine *vm); protected: SoundResource _soundResource1; SoundResource _soundResource2; @@ -68,24 +68,53 @@ protected: void callback3(); }; -class Class511 : public AnimatedSprite { +class AsScene1001Hammer : public AnimatedSprite { public: - Class511(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType); + AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor); +protected: + Sprite *_asDoor; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1001Window : public AnimatedSprite { +public: + AsScene1001Window(NeverhoodEngine *vm); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1001Lever : public AnimatedSprite { +public: + AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType); protected: Scene *_parentScene; SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class SsCommonButtonSprite : public StaticSprite { +public: + SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 _soundFileHash; + int16 _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene1001 : public Scene { public: Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_class508; - Sprite *_class509; - Sprite *_class510; - Sprite *_class511; - Sprite *_class608; + Sprite *_asHammer; + Sprite *_asDoor; + Sprite *_asWindow; + Sprite *_asLever; + Sprite *_ssButton; int16 _fieldE4; int16 _fieldE6; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 1ba2c98860..4c80c40274 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -133,7 +133,7 @@ Common::Error NeverhoodEngine::run() { _gameModule = new GameModule(this); // Preliminary main loop, needs some more work but works for testing - while (1) { + while (!shouldQuit()) { Common::Event event; Common::EventManager *eventMan = _system->getEventManager(); @@ -141,6 +141,9 @@ Common::Error NeverhoodEngine::run() { switch (event.type) { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; + + // DEBUG gameModule->sendMessage(0x480F, 0, NULL); + break; case Common::EVENT_KEYUP: _keyState = Common::KEYCODE_INVALID; -- cgit v1.2.3 From 88d2759f85443541ecdd2f50bef3492a99209309 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 7 Jul 2011 17:26:22 +0000 Subject: NEVERHOOD: Start with the Klayman class (this is quite some horrible code, also, it doesn't work yet and isn't used yet) --- engines/neverhood/entity.h | 12 +- engines/neverhood/klayman.cpp | 457 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 132 +++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 4 + engines/neverhood/module1000.h | 1 + engines/neverhood/sprite.cpp | 2 +- engines/neverhood/sprite.h | 11 +- 8 files changed, 612 insertions(+), 8 deletions(-) create mode 100644 engines/neverhood/klayman.cpp create mode 100644 engines/neverhood/klayman.h diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 18b9cba793..317672c7fe 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -28,14 +28,18 @@ namespace Neverhood { +class Entity; + struct MessageParam { union { uint32 _integer; NPoint _point; + Entity *_entity; // TODO: Other types... }; MessageParam(uint32 value) { _integer = value; } MessageParam(NPoint value) { _point = value; } + MessageParam(Entity *entity) { _entity = entity; } // TODO: Constructors for the param types... }; @@ -61,13 +65,17 @@ public: uint32 sendMessage(int messageNum, const MessageParam ¶m, Entity *sender) { return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; } - // Overloaded for various message parameter types + // NOTE: These were overloaded before for the various message parameter types + // it caused some problems so each type gets its own sendMessage variant now uint32 sendMessage(int messageNum, uint32 param, Entity *sender) { return sendMessage(messageNum, MessageParam(param), sender); } - uint32 sendMessage(int messageNum, NPoint param, Entity *sender) { + uint32 sendPointMessage(int messageNum, NPoint param, Entity *sender) { return sendMessage(messageNum, MessageParam(param), sender); } + uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) { + return sendMessage(messageNum, MessageParam((Entity*)param), sender); + } int getPriority() const { return _priority; } protected: void (Entity::*_updateHandlerCb)(); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp new file mode 100644 index 0000000000..49c60932c1 --- /dev/null +++ b/engines/neverhood/klayman.cpp @@ -0,0 +1,457 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/klayman.h" +#include "neverhood/resourceman.h" + +namespace Neverhood { + +static const KlaymanTableItem klaymanTable1[] = { + {1, &Klayman::sub41FD30}, + {1, &Klayman::sub41FDA0}, + {1, &Klayman::sub41FDF0}, + {1, &Klayman::sub41FE60}, + {1, &Klayman::sub41FEB0} +}; + +static const KlaymanTableItem klaymanTable2[] = { + {1, &Klayman::sub41FD30}, + {1, &Klayman::sub41FDA0}, + {1, &Klayman::sub41FE60}, + {1, &Klayman::sub41FEB0} +}; + +#if 0 +static const KlaymanTableItem klaymanTable3[] = { + {1, &Klayman::sub421430}, + {1, &Klayman::sub421480} +}; +#endif + +Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority) + : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), + _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), + _counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false), + _status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), + _flagFA(false), _statusE0(0) /*, _field114(0)*/, _resourceHandle(-1), _soundFlag(false) { + + // TODO + createSurface(surfacePriority, 320, 200); + _x = x; + _y = y; + _x4 = x; + _y4 = y; + _flags = 2; + setKlaymanTable1(); + sub41FC80(); + SetUpdateHandler(&Klayman::update); +} + +void Klayman::xUpdate() { +} + +uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { + return 0; +} + +void Klayman::update() { +} + +void Klayman::setKlaymanTable(const KlaymanTableItem *table, int tableCount) { + _table = table; + _tableCount = tableCount; + _tableMaxValue = 0; + for (int i = 0; i < tableCount; i++) { + _tableMaxValue += table[i].value; + } +} + +void Klayman::setKlaymanTable1() { + setKlaymanTable(klaymanTable1, ARRAYSIZE(klaymanTable1)); +} + +void Klayman::setKlaymanTable2() { + setKlaymanTable(klaymanTable2, ARRAYSIZE(klaymanTable2)); +} + +void Klayman::setKlaymanTable3() { + // TODO setKlaymanTable(klaymanTable3, ARRAYSIZE(klaymanTable3)); +} + +void Klayman::sub41FD30() { + sub41D320(0x5B20C814, AnimationCallback(&Klayman::sub41FD40)); +} + +void Klayman::sub41FD40() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x5B20C814, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB10); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub41FCF0); + // TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FD90)); +} + +uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x04DBC02C) { +#if 0 + _soundResource1.set(0x44528AA1); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } + break; + } + return messageResult; +} + +void Klayman::sub41FD90() { + // TODO _soundResource1.stop(0); +} + +void Klayman::sub41FDA0() { + sub41D320(0xD122C137, AnimationCallback(&Klayman::sub41FDB0)); +} + +void Klayman::sub41FDB0() { + _status2 = 1; + _flagE5 = true; + setFileHash(0xD122C137, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E980); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub41FCF0); +} + +uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x808A0008) { +#if 0 + _soundResource1.set(0xD948A340); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } + break; + } + return messageResult; +} + +void Klayman::sub41FDF0() { + sub41D320(0x543CD054, AnimationCallback(&Klayman::sub41FE00)); +} + +void Klayman::sub41FE00() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x543CD054, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E9E0); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub41FCF0); + // TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FE50)); +} + +void Klayman::sub41FE50() { + // TODO _soundResource1.stop(0); +} + +uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x5A0F0104) { +#if 0 + _soundResource1.set(0x7970A100); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } else if (param._integer == 0x9A9A0109) { +#if 0 + _soundResource1.set(0xD170CF04); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } else if (param._integer == 0x989A2169) { +#if 0 + _soundResource1.set(0xD073CF14); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } + break; + } + return messageResult; +} + +void Klayman::sub41FE60() { + sub41D320(0x40A0C034, AnimationCallback(&Klayman::sub41FE70)); +} + +void Klayman::sub41FE70() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x40A0C034, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EF80); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub41FCF0); +} + +uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x0D2A0288) { +#if 0 + _soundResource1.set(0xD192A368); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } + break; + } + return messageResult; +} + +void Klayman::sub41FEB0() { + sub41D320(0x5120E137, AnimationCallback(&Klayman::sub41FEC0)); +} + +void Klayman::sub41FEC0() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x5120E137, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EFE0); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub41FCF0); +} + +uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0xC006000C) { +#if 0 + _soundResource1.set(0x9D406340); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } else if (param._integer == 0x2E4A2940) { +#if 0 + _soundResource1.set(0x53A4A1D4); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } else if (param._integer == 0xAA0A0860) { +#if 0 + _soundResource1.set(0x5BE0A3C6); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } else if (param._integer == 0xC0180260) { +#if 0 + _soundResource1.set(0x5D418366); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } + break; + } + return messageResult; +} + +///////////////////////////////////////////////////////////////// + +void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) { + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle != -1) { + // TODO _vm->_res->moveToFront(_resourceHandle); + SetAnimationCallback3(callback); + SetUpdateHandler(&Klayman::update41D2B0); + } +} + +void Klayman::update41D2B0() { + // TODO Check if this odd stuff is needed or just some cache optimization + if (_vm->_res->isResourceDataValid(_resourceHandle)) { + sub41C7B0(); + // TODO _vm->_res->moveToBack(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + } else { + // TODO _vm->_res->moveToFront(_resourceHandle); + } + update(); +} + +bool Klayman::sub41CF10(AnimationCb callback) { + if (_status2 != 2) + return false; + _status2 = 1; + setFileHash(0x9A7020B8, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41F140); + SetSpriteCallback(NULL); + SetAnimationCallback3(callback); + _flagE5 = false; + return true; +} + +void Klayman::sub41C7B0() { + if (_callback1Cb) { + (this->*_callback1Cb)(); + _callback1Cb = NULL; + } + if (_callback3Cb) { + AnimationCb cb = _callback3Cb; + _callback3Cb = NULL; + (this->*cb)(); +#if 0 // TODO + } else if (_callbackList) { + removeCallbackList(); +#endif + } else { + _parentScene->sendMessage(0x1006, 0, this); + } +} + +void Klayman::sub41C770() { + _flagFA = false; + _status = 1; +} + +void Klayman::sub41C790() { + if (_flagFA) + _status = 0; +} + +void Klayman::sub41FC80() { + if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) { + setFileHash(0x5420E254, 0, -1); + _counter = 0; + _counter3 = 0; + _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + SetUpdateHandler(&Klayman::update41D0F0); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(NULL); + } +} + +void Klayman::update41D0F0() { + update(); + _counter++; + if (_counter >= 720) { + _counter = 0; + if (_table) { + int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue); + for (int i = 0; i < _tableCount; i++) { + if (randomValue < _table[_tableCount].value) { + (this->*(_table[_tableCount].callback))(); + break; + } + randomValue -= _table[_tableCount].value; + } + } + } else { + _counter3++; + if (_counter3 >= _counter3Max) { + _counter3 = 0; + _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + sub41FF00(); + } + } +} + +uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + uint32 messageResult = xHandleMessage(messageNum, param); + switch (messageNum) { + case 0x1008: + messageResult = _flagE5; + break; + case 0x1014: + _attachedSprite = param._entity; + break; + case 0x1019: + sub41C7B0(); + break; + case 0x101C: + sub41C770(); + break; + case 0x1021: + sub41C790(); + break; + case 0x481C: + _status = param._integer; + _flagFA = true; + messageResult = 1; + break; + case 0x482C: + if (param._integer != 0) { + // TODO _rectResource.getRectangle2(param._integer, &_field118, &_field114,); + } else { + // TODO _field114 = 0; + } + break; + } + return messageResult; +} + +void Klayman::sub41FF00() { + setFileHash(0x5900C41E, 0, -1); + _status2 = 1; + _flagE5 = true; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub41FCF0); +} + +uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + sub41C7B0(); + break; + } + return messageResult; +} + +void Klayman::sub41FCF0() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update41D0F0); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(NULL); +} + + +} // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h new file mode 100644 index 0000000000..d953f5565f --- /dev/null +++ b/engines/neverhood/klayman.h @@ -0,0 +1,132 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_KLAYMAN_H +#define NEVERHOOD_KLAYMAN_H + +#include "neverhood/neverhood.h" +#include "neverhood/sprite.h" +#include "neverhood/graphics.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +// TODO: This code is horrible and weird and a lot of stuff needs renaming once a better name is found + +class Klayman; + +struct KlaymanTableItem { + int value; + void (Klayman::*callback)(); +}; + +class Klayman : public AnimatedSprite { +public: + Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority); + + void sub41FD30(); + void sub41FDA0(); + void sub41FDF0(); + void sub41FE60(); + void sub41FEB0(); + +protected: + Entity *_parentScene; + Entity *_attachedSprite; + int _statusE0; + bool _flagE1; + bool _flagE2; + bool _flagE3; + bool _flagE4; + bool _flagE5; + int16 _x4, _y4; + int16 _counter, _counterMax; + int16 _counter3, _counter3Max; + int16 _counter1; + int16 _counter2; + bool _flagF6; + bool _flagF7; + bool _flagF8; + int _status2; + bool _flagFA; + SoundResource _soundResource1; + SoundResource _soundResource2; + int _status; + const KlaymanTableItem *_table; + int _tableCount; + int _tableMaxValue; + /* + 00000114 field114 dd ? + 00000118 field118 dw ? + */ + bool _soundFlag; + int _resourceHandle; + virtual void xUpdate(); + virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void update(); + + void setKlaymanTable(const KlaymanTableItem *table, int tableCount); + void setKlaymanTable1(); + void setKlaymanTable2(); + void setKlaymanTable3(); + + void sub41FD40(); + void sub41FD90(); + uint32 handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41FDB0(); + uint32 handleMessage41E980(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41FE00(); + void sub41FE50(); + uint32 handleMessage41E9E0(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41FE70(); + uint32 handleMessage41EF80(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41FEC0(); + uint32 handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41D320(uint32 fileHash, AnimationCb callback); + void update41D2B0(); + + bool sub41CF10(AnimationCb callback); + void sub41C7B0(); + void sub41C770(); + void sub41C790(); + + void sub41FC80(); + void update41D0F0(); + uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41FF00(); + uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41FCF0(); + + uint32 handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender); + +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index f139268c36..2058db9e3e 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -8,6 +8,7 @@ MODULE_OBJS = \ entity.o \ gamemodule.o \ graphics.o \ + klayman.o \ module.o \ module1000.o \ module1500.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index d5b7b03481..7ee1090cb8 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -469,6 +469,10 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } +Scene1001::~Scene1001() { + // TODO _vm->setGlobalVar(0xC0418A02, _playerSprite->_doDeltaX); +} + uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 82c2feab13..21be948c41 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -109,6 +109,7 @@ protected: class Scene1001 : public Scene { public: Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1001(); protected: Sprite *_asHammer; Sprite *_asDoor; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 1239a301d0..ce21527384 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -456,7 +456,7 @@ void AnimatedSprite::removeCallbacks() { if (_callback1Cb) { // _callback1Cb has to be cleared before it's called - AnimationCallback cb = _callback1Cb; + AnimationCb cb = _callback1Cb; _callback1Cb = NULL; debug("Fire _callback1Cb"); (this->*cb)(); diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 71067fa9ec..b3809a845e 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -30,7 +30,7 @@ namespace Neverhood { -#define SetSpriteCallback(callback) _spriteCallbackCb = static_cast (callback) +#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback) #define SetFilterX(callback) _filterXCb = static_cast (callback) #define SetFilterY(callback) _filterYCb = static_cast (callback) @@ -91,6 +91,7 @@ protected: #define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback) #define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback) #define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback) +#define AnimationCallback(callback) static_cast (callback) class AnimatedSprite : public Sprite { public: @@ -98,7 +99,7 @@ public: AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y); void update(); protected: - typedef void (AnimatedSprite::*AnimationCallback)(); + typedef void (AnimatedSprite::*AnimationCb)(); AnimResource _animResource; uint32 _fileHash1; uint32 _fileHash2; @@ -124,9 +125,9 @@ protected: callbackListCount dw ? callbackList dd ? */ - AnimationCallback _callback1Cb; - AnimationCallback _callback2Cb; - AnimationCallback _callback3Cb; + AnimationCb _callback1Cb; + AnimationCb _callback2Cb; + AnimationCb _callback3Cb; void init(); void updateDeltaXY(); void updateAnim(); -- cgit v1.2.3 From 3131cc6f1899b3eaa5f234d95801a8bff77144e0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 7 Jul 2011 17:28:51 +0000 Subject: NEVERHOOD: Implement Klayman::update --- engines/neverhood/klayman.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 49c60932c1..836b2e0bb0 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -74,6 +74,8 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { } void Klayman::update() { + AnimatedSprite::update(); + xUpdate(); } void Klayman::setKlaymanTable(const KlaymanTableItem *table, int tableCount) { -- cgit v1.2.3 From c694ce8505529478c60d23603bd9dc217dd7afb0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 7 Jul 2011 20:26:12 +0000 Subject: NEVERHOOD: More work on Klayman - Rename Scene::_playerSprite to _klayman - Send mouse clicks to the scene object (has not effect yet) --- engines/neverhood/entity.h | 2 +- engines/neverhood/gamemodule.cpp | 11 +++++++ engines/neverhood/gamemodule.h | 1 + engines/neverhood/klayman.cpp | 65 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 2 ++ engines/neverhood/module1000.cpp | 32 +++++++++++--------- engines/neverhood/neverhood.cpp | 8 +++-- engines/neverhood/scene.cpp | 33 ++++++++++++-------- engines/neverhood/scene.h | 3 +- 9 files changed, 126 insertions(+), 31 deletions(-) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 317672c7fe..64c1181089 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -70,7 +70,7 @@ public: uint32 sendMessage(int messageNum, uint32 param, Entity *sender) { return sendMessage(messageNum, MessageParam(param), sender); } - uint32 sendPointMessage(int messageNum, NPoint param, Entity *sender) { + uint32 sendPointMessage(int messageNum, const NPoint ¶m, Entity *sender) { return sendMessage(messageNum, MessageParam(param), sender); } uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) { diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 93687f9866..c63131dcf3 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -22,6 +22,7 @@ #include "neverhood/gamemodule.h" +#include "neverhood/graphics.h" #include "neverhood/module1000.h" #include "neverhood/module1500.h" @@ -57,6 +58,16 @@ GameModule::~GameModule() { } +void GameModule::handleMouseDown(int16 x, int16 y) { + if (_childObject) { + NPoint mousePos; + mousePos.x = x; + mousePos.y = y; + debug("GameModule::handleMouseDown(%d, %d)", x, y); + _childObject->sendPointMessage(1, mousePos, this); + } +} + uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 6d65895ef7..7fce9ebaea 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -34,6 +34,7 @@ class GameModule : public Module { public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); + void handleMouseDown(int16 x, int16 y); protected: Entity *_prevChildObject; bool _someFlag1; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 836b2e0bb0..7a775bcf12 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -67,9 +67,22 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int } void Klayman::xUpdate() { + // Empty } uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param._point.x, false); + break; + case 0x4004: + // TODO AnimatedSprite_setCallback2(AnimationCallback(&sub41FC80)); + break; + case 0x4818: + // TODO sub41C930(_rectResource.getRectangle1(param._integer).x, false); + break; + } return 0; } @@ -455,5 +468,57 @@ void Klayman::sub41FCF0() { SetSpriteCallback(NULL); } +uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param._integer == 0x271AA210) { +#if 0 + _soundResource1.set(0x4924AAC4); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } else if (param._integer == 0x2B22AA81) { +#if 0 + _soundResource1.set(0x0A2AA8E0); + _soundResource1.load(); + _soundResource1.play(false); +#endif + } + break; + } + return messageResult; +} + + +void Klayman::sub41C930(int16 x, bool flag) { + int16 xdiff = ABS(x - _x); + if (xdiff == 0) { + _x4 = x; + if (_flagE1 || _flagE2 || _flagE3) { + // TODO AnimatedSprite_setCallback2(NULL); + sub41C7B0(); + } + } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { + _x4 = x; + // TODO AnimatedSprite_setCallback2(NULL); + sub41C7B0(); + } else if (xdiff <= 42 && _status != 3) { + if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { + _x4 = x; + } else { + _x4 = x; + // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41FB40)); + } + } else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _x4 = x; + } else if (flag) { + _x4 = x; + // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); + } else { + _x4 = x; + // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41F950)); + } +} } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index d953f5565f..69f9a34dc6 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -124,6 +124,8 @@ protected: void sub41FCF0(); uint32 handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41C930(int16 x, bool flag); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 7ee1090cb8..858062084f 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -400,41 +400,45 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Mouse + //DEBUG so he's here at least + _klayman = new Klayman(_vm, this, 200, 433, 1000, 1000); + addSprite(_klayman); + #if 0 // TODO: Player sprites... if (which < 0) { setRectList(0x004B49F0); - _playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000); + _klayman = new Class572(_vm, this, 200, 433, 1000, 1000); setMessageList(0x004B4888); } else if (which == 1) { setRectList(0x004B49F0); - _playerSprite = new Class572(_vm, this, 640, 433, 1000, 1000); + _klayman = new Class572(_vm, this, 640, 433, 1000, 1000); setMessageList(0x004B4898); } else if (which == 2) { setRectList(0x004B49F0); if (_vm->getGlobalVar(0xC0418A02)) { - _playerSprite = new Class572(_vm, this, 390, 433, 1000, 1000); - _playerSprite->setDoDeltaX(1); + _klayman = new Class572(_vm, this, 390, 433, 1000, 1000); + _klayman->setDoDeltaX(1); } else { - _playerSprite = new Class572(_vm, this, 300, 433, 1000, 1000); + _klayman = new Class572(_vm, this, 300, 433, 1000, 1000); } setMessageList(0x004B4970); } else { setRectList(0x004B4A00); - _playerSprite = new Class572(_vm, this, 200, 433, 1000, 1000); + _klayman = new Class572(_vm, this, 200, 433, 1000, 1000); setMessageList(0x004B4890); } - addSprite(_playerSprite); + addSprite(_klayman); #endif staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300)); #if 0 // TODO: This sucks somehow, find a better way - _playerSprite->getSurface()->getClipRect().x1 = 0; - _playerSprite->getSurface()->getClipRect().y1 = 0; - _playerSprite->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; - _playerSprite->getSurface()->getClipRect().y2 = 480; + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; #endif if (_vm->getGlobalVar(0xD217189D) == 0) { @@ -470,7 +474,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1001::~Scene1001() { - // TODO _vm->setGlobalVar(0xC0418A02, _playerSprite->_doDeltaX); + // TODO _vm->setGlobalVar(0xC0418A02, _klayman->_doDeltaX); } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -490,7 +494,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x100D: if (param._integer == 0x00342624) { - // TODO _playerSprite->sendMessage(0x1014, _asLever, this); + // TODO _klayman->sendMessage(0x1014, _asLever, this); // TODO setMessageList2(0x004B4910, true, false); messageResult = 1; } else if (param._integer == 0x21E64A00) { @@ -502,7 +506,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit messageResult = 1; } } else if (param._integer == 0x040424D0) { - // TODO _playerSprite->sendMessage(0x1014, _ssButton, this); + // TODO _klayman->sendMessage(0x1014, _ssButton, this); } else if (param._integer == 0x80006358) { if (_vm->getGlobalVar(0x03C698DA)) { // TODO setMessageList(0x004B4938, true, false); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 4c80c40274..73e7c5fcd6 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -152,14 +152,18 @@ Common::Error NeverhoodEngine::run() { _mouseX = event.mouse.x; _mouseY = event.mouse.y; break; - /* + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_RBUTTONDOWN: + _gameModule->handleMouseDown(event.mouse.x, event.mouse.y); + break; + + /* _buttonState |= kLeftButton; break; case Common::EVENT_LBUTTONUP: _buttonState &= ~kLeftButton; break; - case Common::EVENT_RBUTTONDOWN: _buttonState |= kRightButton; break; case Common::EVENT_RBUTTONUP: diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index b06caeec14..9b7b35d419 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -37,7 +37,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _mouseClicked = false; // TODO _rectList = NULL; // TODO _someRects = NULL; - // TODO _playerSprite = NULL; + _klayman = NULL; // TODO _mouseSprite = NULL; _palette = NULL; _background = NULL; @@ -193,15 +193,15 @@ void Scene::update() { if (_mouseClicked) { //** ALL TODO #if 0 - if (_playerSprite) { + if (_klayman) { // TODO: Merge later - if (_playerSprite->hasMessageHandler() && - _playerSprite->sendMessage(0x1008, 0, this) != 0 && + if (_klayman->hasMessageHandler() && + _klayman->sendMessage(0x1008, 0, this) != 0 && _messageListFlag && queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; - } else if (_playerSprite->hasMessageHandler() && - _playerSprite->sendMessage(0x1008, 0, this) != 0 && + } else if (_klayman->hasMessageHandler() && + _klayman->sendMessage(0x1008, 0, this) != 0 && _messageListFlag) { _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); } @@ -223,12 +223,13 @@ void Scene::update() { uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { // TODO -#if 0 switch (messageNum) { case 0: // mouse moved +#if 0 if (_mouseSprite && _mouseSprite->hasMessageHandler()) _mouseSprite->sendMessage(0x4002, param, this); queryPositionSomeRects(param._point.x, param._point.y); +#endif break; case 1: // mouse clicked _mouseClicked = true; @@ -245,7 +246,9 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s break; */ case 5: +#if 0 broadcastObjectMessage5(); +#endif break; case 6: _parentModule->sendMessage(0x1009, param, this); @@ -254,35 +257,39 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s if (_messageListFlag1) { _messageListFlag1 = false; if (_messageListIndex == _messageListCount) - _playerSprite->sendMessage(0x4004, 0, this); - else - runMessageList(); + _klayman->sendMessage(0x4004, 0, this); + else { + // TODO runMessageList(); + } } break; case 0x1007: if (_messageListFlag1) { _messageListFlag1 = false; _messageList = NULL; - _playerSprite->sendMessage(0x4004, 0, this); + _klayman->sendMessage(0x4004, 0, this); } break; case 0x101D: +#if 0 if (_mouseSprite) { _prevVisible = _mouseSprite->_drawSurface->_visible; _mouseSprite->_drawSurface->_visible = false; } +#endif break; case 0x101E: +#if 0 if (_prevVisible && _mouseSprite) { _mouseSprite->_drawSurface->_visible = true; _mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this); } +#endif break; case 0x1022: - setSurfacePriority(((Sprite*)sender)->_surface, param._integer); + setSurfacePriority(((Sprite*)sender)->getSurface(), param._integer); break; } -#endif return 0; } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 108adba83b..4928d20ae2 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -28,6 +28,7 @@ #include "neverhood/background.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" +#include "neverhood/klayman.h" #include "neverhood/module.h" #include "neverhood/palette.h" #include "neverhood/smackerplayer.h" @@ -67,8 +68,8 @@ protected: // TODO 00000088 someRects dd ? // TODO 0000008C someRectsCount dw ? // TODO 0000008E field_8E dw ? - // TODO 00000090 playerSprite dd ? // TODO 00000094 mouseSprite dd ? + Klayman *_klayman; Palette *_palette; Background *_background; bool _surfaceFlag; -- cgit v1.2.3 From 78d632b0eda3c7be13a265cfb9fa5d16c7b418eb Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 8 Jul 2011 18:20:07 +0000 Subject: NEVERHOOD: Commit of create_neverhood and neverhood.dat --- devtools/create_neverhood/create_neverhood.cpp | 257 +++++++++++++++++++++++++ devtools/create_neverhood/create_neverhood.h | 28 +++ devtools/create_neverhood/module.mk | 12 ++ devtools/create_neverhood/tables.h | 49 +++++ devtools/create_neverhood/util.cpp | 152 +++++++++++++++ devtools/create_neverhood/util.h | 57 ++++++ dists/engine-data/neverhood.dat | Bin 0 -> 494 bytes 7 files changed, 555 insertions(+) create mode 100644 devtools/create_neverhood/create_neverhood.cpp create mode 100644 devtools/create_neverhood/create_neverhood.h create mode 100644 devtools/create_neverhood/module.mk create mode 100644 devtools/create_neverhood/tables.h create mode 100644 devtools/create_neverhood/util.cpp create mode 100644 devtools/create_neverhood/util.h create mode 100644 dists/engine-data/neverhood.dat diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp new file mode 100644 index 0000000000..951a2f0ef1 --- /dev/null +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -0,0 +1,257 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// Disable symbol overrides so that we can use system headers. +#define FORBIDDEN_SYMBOL_ALLOW_ALL + + +// HACK to allow building with the SDL backend on MinGW +// see bug #1800764 "TOOLS: MinGW tools building broken" +#ifdef main +#undef main +#endif // main + +#include +#include "create_neverhood.h" +#include "tables.h" + +const int DAT_VERSION = 0; + +uint32 dataSize; +byte *data; +uint32 dataStart = 0x004AE000; +uint32 fileStart = 0x000AC600; + +void loadExe(const char *filename) { + FILE *exe = fopen(filename, "rb"); + dataSize = fileSize(exe); + data = new byte[dataSize]; + fread(data, dataSize, 1, exe); + fclose(exe); +} + +struct HitRect { + int16 x1, y1, x2, y2; + uint16 messageNum; +}; + +typedef std::vector HitRects; + +struct SubRectItem { + int16 x1, y1, x2, y2; + uint32 messageListCount; + uint32 messageListOffset; +}; + +typedef std::vector SubRectItems; + +struct RectItem { + int16 x1, y1, x2, y2; + uint32 subRectListCount; + uint32 subRectListOffset; + SubRectItems subRectItems; +}; + +typedef std::vector RectItems; + +struct MessageItem { + uint16 messageNum; + uint32 messageParam; +}; + +typedef std::vector MessageItems; + +struct HitRectList { + uint32 id; + HitRects hitRects; +}; + +struct RectList { + uint32 id; + RectItems rectItems; +}; + +struct MessageList { + uint32 id; + MessageItems messageItems; +}; + +std::vector hitRectLists; +std::vector rectLists; +std::vector messageLists; + +byte *getData(uint32 offset) { + return data + offset - dataStart + fileStart; +} + +void addHitRect(uint32 offset) { + HitRectList *hitRectList = new HitRectList(); + hitRectList->id = offset; + byte *item = getData(offset); + uint32 count = READ_LE_UINT32(item); + //printf("count = %d\n", count); + // Align to 16 bytes + item = data + ((offset + 4 + 16) & 0xFFFFFFF0) - dataStart + fileStart; + for (uint32 i = 0; i < count; i++) { + HitRect hitRect; + hitRect.x1 = READ_LE_UINT16(item + 0); + hitRect.y1 = READ_LE_UINT16(item + 2); + hitRect.x2 = READ_LE_UINT16(item + 4); + hitRect.y2 = READ_LE_UINT16(item + 6); + hitRect.messageNum = READ_LE_UINT16(item + 8); + item += 10; + //printf("(%d, %d, %d, %d) -> %04X\n", hitRect.x1, hitRect.y1, hitRect.x2, hitRect.y2, hitRect.messageNum); + hitRectList->hitRects.push_back(hitRect); + } + hitRectLists.push_back(hitRectList); +} + +void addMessage(uint32 count, uint32 offset) { + MessageList *messageList = new MessageList(); + messageList->id = offset; + byte *item = getData(offset); + for (uint32 i = 0; i < count; i++) { + MessageItem messageItem; + messageItem.messageNum = READ_LE_UINT16(item + 0); + messageItem.messageParam = READ_LE_UINT32(item + 4); + //printf("%04X, %08X\n", messageItem.messageNum, messageItem.messageParam); + item += 8; + messageList->messageItems.push_back(messageItem); + } + messageLists.push_back(messageList); +} + +void addRect(uint32 count, uint32 offset) { + RectList *rectList = new RectList(); + rectList->id = offset; + byte *item = getData(offset); + for (uint32 i = 0; i < count; i++) { + RectItem rectItem; + byte *subItem; + rectItem.x1 = READ_LE_UINT16(item + 0); + rectItem.y1 = READ_LE_UINT16(item + 2); + rectItem.x2 = READ_LE_UINT16(item + 4); + rectItem.y2 = READ_LE_UINT16(item + 6); + rectItem.subRectListCount = READ_LE_UINT32(item + 8); + rectItem.subRectListOffset = READ_LE_UINT32(item + 12); + //printf("(%d, %d, %d, %d), %d, %08X\n", rectItem.x1, rectItem.y1, rectItem.x2, rectItem.y2, rectItem.subRectListCount, rectItem.subRectListOffset); + subItem = getData(rectItem.subRectListOffset); + for (uint32 j = 0; j < rectItem.subRectListCount; j++) { + SubRectItem subRectItem; + subRectItem.x1 = READ_LE_UINT16(subItem + 0); + subRectItem.y1 = READ_LE_UINT16(subItem + 2); + subRectItem.x2 = READ_LE_UINT16(subItem + 4); + subRectItem.y2 = READ_LE_UINT16(subItem + 6); + subRectItem.messageListCount = READ_LE_UINT32(subItem + 8); + subRectItem.messageListOffset = READ_LE_UINT32(subItem + 12); + subItem += 16; + //printf("(%d, %d, %d, %d), %d, %08X\n", subRectItem.x1, subRectItem.y1, subRectItem.x2, subRectItem.y2, subRectItem.messageListCount, subRectItem.messageListOffset); + addMessage(subRectItem.messageListCount, subRectItem.messageListOffset); + rectItem.subRectItems.push_back(subRectItem); + } + item += 16; + rectList->rectItems.push_back(rectItem); + } + rectLists.push_back(rectList); +} + +int main(int argc, char *argv[]) { + + FILE *datFile; + + loadExe("nhc.exe"); + + for (int i = 0; hitRectListOffsets[i] != 0; i++) { + addHitRect(hitRectListOffsets[i]); + } + + for (int i = 0; rectListOffsets[i] != 0; i += 2) { + addRect(rectListOffsets[i], rectListOffsets[i + 1]); + } + + for (int i = 0; messageListOffsets[i] != 0; i += 2) { + addMessage(messageListOffsets[i], messageListOffsets[i + 1]); + } + + datFile = fopen("neverhood.dat", "wb"); + + writeUint32LE(datFile, 0x11223344); // Some magic + writeUint32LE(datFile, DAT_VERSION); + + // Write all message lists + writeUint32LE(datFile, messageLists.size()); + for (std::vector::iterator it = messageLists.begin(); it != messageLists.end(); it++) { + MessageList *messageList = *it; + writeUint32LE(datFile, messageList->id); + writeUint32LE(datFile, messageList->messageItems.size()); + for (uint32 i = 0; i < messageList->messageItems.size(); i++) { + writeUint16LE(datFile, messageList->messageItems[i].messageNum); + writeUint32LE(datFile, messageList->messageItems[i].messageParam); + } + } + + // Write all rect lists + writeUint32LE(datFile, rectLists.size()); + for (std::vector::iterator it = rectLists.begin(); it != rectLists.end(); it++) { + RectList *rectList = *it; + writeUint32LE(datFile, rectList->id); + writeUint32LE(datFile, rectList->rectItems.size()); + for (uint32 i = 0; i < rectList->rectItems.size(); i++) { + const RectItem &rectItem = rectList->rectItems[i]; + writeUint16LE(datFile, rectItem.x1); + writeUint16LE(datFile, rectItem.y1); + writeUint16LE(datFile, rectItem.x2); + writeUint16LE(datFile, rectItem.y2); + writeUint32LE(datFile, rectItem.subRectItems.size()); + for (uint32 j = 0; j < rectItem.subRectItems.size(); j++) { + const SubRectItem &subRectItem = rectItem.subRectItems[j]; + writeUint16LE(datFile, subRectItem.x1); + writeUint16LE(datFile, subRectItem.y1); + writeUint16LE(datFile, subRectItem.x2); + writeUint16LE(datFile, subRectItem.y2); + writeUint32LE(datFile, subRectItem.messageListOffset); + } + } + } + + // Write all hit rect lists + writeUint32LE(datFile, hitRectLists.size()); + for (std::vector::iterator it = hitRectLists.begin(); it != hitRectLists.end(); it++) { + HitRectList *hitRectList = *it; + writeUint32LE(datFile, hitRectList->id); + writeUint32LE(datFile, hitRectList->hitRects.size()); + for (uint32 i = 0; i < hitRectList->hitRects.size(); i++) { + const HitRect &hitRect = hitRectList->hitRects[i]; + writeUint16LE(datFile, hitRect.x1); + writeUint16LE(datFile, hitRect.y1); + writeUint16LE(datFile, hitRect.x2); + writeUint16LE(datFile, hitRect.y2); + writeUint16LE(datFile, hitRect.messageNum); + } + } + + fclose(datFile); + + printf("Done.\n"); + + return 0; +} diff --git a/devtools/create_neverhood/create_neverhood.h b/devtools/create_neverhood/create_neverhood.h new file mode 100644 index 0000000000..6382c87375 --- /dev/null +++ b/devtools/create_neverhood/create_neverhood.h @@ -0,0 +1,28 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef CREATE_NEVERHOOD_H +#define CREATE_NEVERHOOD_H + +#include "util.h" + +#endif diff --git a/devtools/create_neverhood/module.mk b/devtools/create_neverhood/module.mk new file mode 100644 index 0000000000..284e19105d --- /dev/null +++ b/devtools/create_neverhood/module.mk @@ -0,0 +1,12 @@ + +MODULE := devtools/create_neverhood + +MODULE_OBJS := \ + create_neverhood.o \ + util.o + +# Set the name of the executable +TOOL_EXECUTABLE := create_neverhood + +# Include common rules +include $(srcdir)/rules.mk diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h new file mode 100644 index 0000000000..6f1fc48250 --- /dev/null +++ b/devtools/create_neverhood/tables.h @@ -0,0 +1,49 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +static const uint32 hitRectListOffsets[] = { + // Scene1001 + 0x004B4858, + 0 +}; + +static const uint32 rectListOffsets[] = { + // Scene1001 + 1, 0x004B49F0, + 1, 0x004B4A00, + 0, 0 +}; + +static const uint32 messageListOffsets[] = { + // Scene1001 + 1, 0x004B4888, + 2, 0x004B4898, + 1, 0x004B4970, + 1, 0x004B4890, + 3, 0x004B4910, + 5, 0x004B4938, + 1, 0x004B4960, + 4, 0x004B48A8, + 3, 0x004B48C8, + 0, 0 +}; + diff --git a/devtools/create_neverhood/util.cpp b/devtools/create_neverhood/util.cpp new file mode 100644 index 0000000000..5ce8237b85 --- /dev/null +++ b/devtools/create_neverhood/util.cpp @@ -0,0 +1,152 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// Disable symbol overrides so that we can use system headers. +#define FORBIDDEN_SYMBOL_ALLOW_ALL + +#include "util.h" +#include + +#ifdef _MSC_VER + #define vsnprintf _vsnprintf +#endif + +void error(const char *s, ...) { + char buf[1024]; + va_list va; + + va_start(va, s); + vsnprintf(buf, 1024, s, va); + va_end(va); + + fprintf(stderr, "ERROR: %s!\n", buf); + + exit(1); +} + +void warning(const char *s, ...) { + char buf[1024]; + va_list va; + + va_start(va, s); + vsnprintf(buf, 1024, s, va); + va_end(va); + + fprintf(stderr, "WARNING: %s!\n", buf); +} + +int scumm_stricmp(const char *s1, const char *s2) { + byte l1, l2; + do { + // Don't use ++ inside tolower, in case the macro uses its + // arguments more than once. + l1 = (byte)*s1++; + l1 = tolower(l1); + l2 = (byte)*s2++; + l2 = tolower(l2); + } while (l1 == l2 && l1 != 0); + return l1 - l2; +} + +void debug(int level, const char *s, ...) { + char buf[1024]; + va_list va; + + va_start(va, s); + vsnprintf(buf, 1024, s, va); + va_end(va); + + fprintf(stderr, "DEBUG: %s!\n", buf); +} + +uint8 readByte(FILE *fp) { + return fgetc(fp); +} + +uint16 readUint16BE(FILE *fp) { + uint16 ret = 0; + ret |= fgetc(fp) << 8; + ret |= fgetc(fp); + return ret; +} + +uint16 readUint16LE(FILE *fp) { + uint16 ret = 0; + ret |= fgetc(fp); + ret |= fgetc(fp) << 8; + return ret; +} + +uint32 readUint32BE(FILE *fp) { + uint32 ret = 0; + ret |= fgetc(fp) << 24; + ret |= fgetc(fp) << 16; + ret |= fgetc(fp) << 8; + ret |= fgetc(fp); + return ret; +} + +uint32 readUint32LE(FILE *fp) { + uint32 ret = 0; + ret |= fgetc(fp); + ret |= fgetc(fp) << 8; + ret |= fgetc(fp) << 16; + ret |= fgetc(fp) << 24; + return ret; +} + +void writeByte(FILE *fp, uint8 b) { + fwrite(&b, 1, 1, fp); +} + +void writeUint16BE(FILE *fp, uint16 value) { + writeByte(fp, (uint8)(value >> 8)); + writeByte(fp, (uint8)(value)); +} + +void writeUint16LE(FILE *fp, uint16 value) { + writeByte(fp, (uint8)(value)); + writeByte(fp, (uint8)(value >> 8)); +} + +void writeUint32BE(FILE *fp, uint32 value) { + writeByte(fp, (uint8)(value >> 24)); + writeByte(fp, (uint8)(value >> 16)); + writeByte(fp, (uint8)(value >> 8)); + writeByte(fp, (uint8)(value)); +} + +void writeUint32LE(FILE *fp, uint32 value) { + writeByte(fp, (uint8)(value)); + writeByte(fp, (uint8)(value >> 8)); + writeByte(fp, (uint8)(value >> 16)); + writeByte(fp, (uint8)(value >> 24)); +} + +uint32 fileSize(FILE *fp) { + uint32 sz; + uint32 pos = ftell(fp); + fseek(fp, 0, SEEK_END); + sz = ftell(fp); + fseek(fp, pos, SEEK_SET); + return sz; +} diff --git a/devtools/create_neverhood/util.h b/devtools/create_neverhood/util.h new file mode 100644 index 0000000000..a2783cca71 --- /dev/null +++ b/devtools/create_neverhood/util.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef UTIL_H +#define UTIL_H + +#include "common/scummsys.h" +#include "common/endian.h" +#include "common/util.h" + +#ifdef WIN32 +#include +#include +#endif + + +/* File I/O */ +uint8 readByte(FILE *fp); +uint16 readUint16BE(FILE *fp); +uint16 readUint16LE(FILE *fp); +uint32 readUint32BE(FILE *fp); +uint32 readUint32LE(FILE *fp); +void writeByte(FILE *fp, uint8 b); +void writeUint16BE(FILE *fp, uint16 value); +void writeUint16LE(FILE *fp, uint16 value); +void writeUint32BE(FILE *fp, uint32 value); +void writeUint32LE(FILE *fp, uint32 value); +uint32 fileSize(FILE *fp); + +/* Misc stuff */ +void NORETURN_PRE error(const char *s, ...) NORETURN_POST; +void warning(const char *s, ...); +void debug(int level, const char *s, ...); +int scumm_stricmp(const char *s1, const char *s2); + +using namespace Common; + +#endif diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat new file mode 100644 index 0000000000..bbd7419ec8 Binary files /dev/null and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 5c69ae21ddf535f862585a4fa5892a9a1146618f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 8 Jul 2011 19:09:33 +0000 Subject: NEVERHOOD: More work on Klayman (still eye cancerous code) - Start to implement KmScene1001 - Implement queryPositionSprite and queryPositionRectList - Implement message list related code (setting and running them) - Access to message params now with accessors (so compatible types can be converted) --- engines/neverhood/collisionman.h | 2 + engines/neverhood/entity.h | 33 ++- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/klayman.cpp | 419 +++++++++++++++++++++++++++++++-------- engines/neverhood/klayman.h | 32 ++- engines/neverhood/module.cpp | 8 +- engines/neverhood/module1000.cpp | 174 +++++++++------- engines/neverhood/module1000.h | 9 + engines/neverhood/neverhood.cpp | 2 + engines/neverhood/resource.cpp | 20 +- engines/neverhood/resource.h | 6 +- engines/neverhood/scene.cpp | 204 +++++++++++++++++-- engines/neverhood/scene.h | 19 +- engines/neverhood/sprite.cpp | 30 ++- engines/neverhood/sprite.h | 6 +- 15 files changed, 770 insertions(+), 200 deletions(-) diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h index 426dca0c95..155859923b 100644 --- a/engines/neverhood/collisionman.h +++ b/engines/neverhood/collisionman.h @@ -42,6 +42,8 @@ public: void clearSprites(); void save(); void restore(); + uint getSpriteCount() const { return _sprites.size(); } + Sprite *getSprite(uint index) const { return _sprites[index]; } protected: NeverhoodEngine *_vm; HitRectList *_hitRects; diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 64c1181089..29bf6be988 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -30,16 +30,43 @@ namespace Neverhood { class Entity; +enum MessageParamType { + mptInteger, + mptPoint, + mptEntity +}; + struct MessageParam { +public: + MessageParam(uint32 value) : _type(mptInteger), _integer(value) {} + MessageParam(NPoint value) : _type(mptPoint), _point(value) {} + MessageParam(Entity *entity) : _type(mptEntity), _entity(entity) {} + uint32 asInteger() const { + assert(_type == mptInteger); + return _integer; + } + NPoint asPoint() const { + assert(_type == mptInteger || _type == mptPoint); + if (_type == mptInteger) { + NPoint pt; + pt.x = (_integer >> 16) & 0xFFFF; + pt.y = _integer & 0xFFFF; + return pt; + } + return _point; + } + Entity *asEntity() const { + assert(_type == mptEntity); + return _entity; + } +protected: union { uint32 _integer; NPoint _point; Entity *_entity; // TODO: Other types... }; - MessageParam(uint32 value) { _integer = value; } - MessageParam(NPoint value) { _point = value; } - MessageParam(Entity *entity) { _entity = entity; } + MessageParamType _type; // TODO: Constructors for the param types... }; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c63131dcf3..47fff17cda 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -78,17 +78,17 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti _field24 = -1; _field26 = -1; _field28 = -1; - _field20 = param._integer; + _field20 = param.asInteger(); _done = true; return messageResult; case 0x100A: - _field24 = (int16)param._integer; + _field24 = (int16)param.asInteger(); return messageResult; case 0x101F: _field2C = true; return messageResult; case 0x1023: - _field26 = (int16)param._integer; + _field26 = (int16)param.asInteger(); return messageResult; } return messageResult; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 7a775bcf12..eca8e02df4 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -21,7 +21,9 @@ */ #include "neverhood/klayman.h" +#include "neverhood/collisionman.h" #include "neverhood/resourceman.h" +#include "neverhood/staticdata.h" namespace Neverhood { @@ -52,7 +54,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), _counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false), _status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), - _flagFA(false), _statusE0(0) /*, _field114(0)*/, _resourceHandle(-1), _soundFlag(false) { + _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { // TODO createSurface(surfacePriority, 320, 200); @@ -74,13 +76,13 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param._point.x, false); + sub41C930(param.asPoint().x, false); break; case 0x4004: - // TODO AnimatedSprite_setCallback2(AnimationCallback(&sub41FC80)); + setCallback2(AnimationCallback(&Klayman::sub41FC80)); break; case 0x4818: - // TODO sub41C930(_rectResource.getRectangle1(param._integer).x, false); + // TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false); break; } return 0; @@ -124,19 +126,15 @@ void Klayman::sub41FD40() { SetMessageHandler(&Klayman::handleMessage41EB10); SetSpriteCallback(NULL); SetAnimationCallback3(&Klayman::sub41FCF0); - // TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FD90)); + setCallback1(AnimationCallback(&Klayman::sub41FD90)); } uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x04DBC02C) { -#if 0 - _soundResource1.set(0x44528AA1); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x04DBC02C) { + _soundResource1.play(0x44528AA1); } break; } @@ -165,12 +163,8 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x808A0008) { -#if 0 - _soundResource1.set(0xD948A340); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x808A0008) { + _soundResource1.play(0xD948A340); } break; } @@ -189,7 +183,7 @@ void Klayman::sub41FE00() { SetMessageHandler(&Klayman::handleMessage41E9E0); SetSpriteCallback(NULL); SetAnimationCallback3(&Klayman::sub41FCF0); - // TODO AnimatedSprite_setCallback1(AnimationCallback(&Klayman::sub41FE50)); + setCallback1(AnimationCallback(&Klayman::sub41FE50)); } void Klayman::sub41FE50() { @@ -200,24 +194,12 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x5A0F0104) { -#if 0 - _soundResource1.set(0x7970A100); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x9A9A0109) { -#if 0 - _soundResource1.set(0xD170CF04); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x989A2169) { -#if 0 - _soundResource1.set(0xD073CF14); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x5A0F0104) { + _soundResource1.play(0x7970A100); + } else if (param.asInteger() == 0x9A9A0109) { + _soundResource1.play(0xD170CF04); + } else if (param.asInteger() == 0x989A2169) { + _soundResource1.play(0xD073CF14); } break; } @@ -242,12 +224,8 @@ uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x0D2A0288) { -#if 0 - _soundResource1.set(0xD192A368); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x0D2A0288) { + _soundResource1.play(0xD192A368); } break; } @@ -272,30 +250,14 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0xC006000C) { -#if 0 - _soundResource1.set(0x9D406340); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x2E4A2940) { -#if 0 - _soundResource1.set(0x53A4A1D4); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0xAA0A0860) { -#if 0 - _soundResource1.set(0x5BE0A3C6); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0xC0180260) { -#if 0 - _soundResource1.set(0x5D418366); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0xC006000C) { + _soundResource1.play(0x9D406340); + } else if (param.asInteger() == 0x2E4A2940) { + _soundResource1.play(0x53A4A1D4); + } else if (param.asInteger() == 0xAA0A0860) { + _soundResource1.play(0x5BE0A3C6); + } else if (param.asInteger() == 0xC0180260) { + _soundResource1.play(0x5D418366); } break; } @@ -405,6 +367,7 @@ void Klayman::update41D0F0() { } uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41D360(%04X)", messageNum); Sprite::handleMessage(messageNum, param, sender); uint32 messageResult = xHandleMessage(messageNum, param); switch (messageNum) { @@ -412,7 +375,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E messageResult = _flagE5; break; case 0x1014: - _attachedSprite = param._entity; + _attachedSprite = param.asEntity(); break; case 0x1019: sub41C7B0(); @@ -424,13 +387,13 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E sub41C790(); break; case 0x481C: - _status = param._integer; + _status = param.asInteger(); _flagFA = true; messageResult = 1; break; case 0x482C: - if (param._integer != 0) { - // TODO _rectResource.getRectangle2(param._integer, &_field118, &_field114,); + if (param.asInteger() != 0) { + // TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,); } else { // TODO _field114 = 0; } @@ -440,9 +403,9 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FF00() { - setFileHash(0x5900C41E, 0, -1); _status2 = 1; _flagE5 = true; + setFileHash(0x5900C41E, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -472,18 +435,10 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x271AA210) { -#if 0 - _soundResource1.set(0x4924AAC4); - _soundResource1.load(); - _soundResource1.play(false); -#endif - } else if (param._integer == 0x2B22AA81) { -#if 0 - _soundResource1.set(0x0A2AA8E0); - _soundResource1.load(); - _soundResource1.play(false); -#endif + if (param.asInteger() == 0x271AA210) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x2B22AA81) { + _soundResource1.play(0x0A2AA8E0); } break; } @@ -492,33 +447,323 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { + debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); if (xdiff == 0) { _x4 = x; if (_flagE1 || _flagE2 || _flagE3) { - // TODO AnimatedSprite_setCallback2(NULL); + setCallback2(NULL); sub41C7B0(); } } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { _x4 = x; - // TODO AnimatedSprite_setCallback2(NULL); + setCallback2(NULL); sub41C7B0(); } else if (xdiff <= 42 && _status != 3) { if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { _x4 = x; } else { _x4 = x; - // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41FB40)); + setCallback2(AnimationCallback(&Klayman::sub41FB40)); } } else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { _x4 = x; } else if (flag) { _x4 = x; + debug("#### 1"); // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); } else { _x4 = x; - // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub41F950)); + setCallback2(AnimationCallback(&Klayman::sub41F950)); + } +} + +void Klayman::sub4211F0() { + _status2 = 1; + _flagE5 = false; + setFileHash(0x527AC970, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub4211B0() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x5A38C110, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E920); + SetSpriteCallback(NULL); +} + +uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x03060012) { + _soundResource1.play(0xC0238244); + } + break; + } + return messageResult; +} + +bool Klayman::sub41CEB0(AnimationCb callback3) { + if (_status2 == 1) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x5C7080D4, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41F140); + SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetAnimationCallback3(callback3); + return true; + } else { + _x = _x4; + return false; + } +} + +void Klayman::spriteUpdate41F250() { + debug("Klayman::spriteUpdate41F250()"); +} + +void Klayman::spriteUpdate41F5F0() { + debug("Klayman::spriteUpdate41F5F0()"); +} + +void Klayman::sub41FB40() { + _status2 = 1; + _flagE2 = true; + _flagE5 = true; + setDoDeltaX(_x4 < _x); + setFileHash(0x5C48C506, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DD80); + SetSpriteCallback(&Klayman::spriteUpdate41F5F0); + setCallback1(AnimationCallback(&Klayman::sub41FBB0)); +} + +void Klayman::sub41FBB0() { + _flagE2 = false; +} + +uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0A2AA8E0); + } else if (param.asInteger() == 0x32188010) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x02A2909C) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + case 0x3002: + _x = _x4; + sub41C7B0(); + break; } + return messageResult; +} + +void Klayman::sub41CD70(int16 x) { + if (x > _x) { + if (ABS(x - _x) <= 105) { + debug("// TODO sub41CAC0(x);"); + // TODO sub41CAC0(x); + } else { + sub41C930(x, false); + } + } else if (x == _x) { + _x4 = x; + setCallback2(NULL); + sub41C7B0(); + } else { + sub41C930(x, false); + } +} + +void Klayman::sub41F950() { + if (!sub41CF10(AnimationCallback(&Klayman::sub41F950))) { + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setDoDeltaX(_x4 < _x); + setFileHash(0x242C0198, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EC70); + SetSpriteCallback(&Klayman::spriteUpdate41F320); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); + SetAnimationCallback3(&Klayman::sub41F9E0); + } +} + +void Klayman::sub41FB30() { + _flagE1 = false; +} + +uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x0A2A9098) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + } + return messageResult; +} + +void Klayman::sub41F9E0() { + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); + SetAnimationCallback3(&Klayman::sub41FA40); +} + +void Klayman::spriteUpdate41F300() { + SetSpriteCallback(&Klayman::spriteUpdate41F320); + _deltaX = 0; +} + +uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x0A2A9098) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + } + return messageResult; +} + +void Klayman::sub41FA40() { + if (_status == 2) { + sub41C7B0(); + } else if (_status == 3) { + debug("// TODO sub420F20();"); + // TODO sub420F20(); + } else { + _flagE2 = true; + if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + if (_status == 0) { + _status2 = 1; + setFileHash(0xF234EE31, 0, -1); + } else { + _status2 = 2; + setFileHash(0xF135CC21, 0, -1); + } + } else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + if (_status == 0) { + _status2 = 1; + setFileHash(0x8604A152, 0, -1); + } else { + _status2 = 2; + setFileHash(0xA246A132, 0, -1); + } + } + _flagE5 = true; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DD80); + SetSpriteCallback(&Klayman::spriteUpdate41F5F0); + setCallback1(AnimationCallback(&Klayman::sub41FBB0)); + } +} + +void Klayman::spriteUpdate41F320() { + int16 xdiff = ABS(_x4 - _x); + int16 xdelta = _x4 - _x; + + if (xdelta > _deltaX) + xdelta = _deltaX; + else if (xdelta < _deltaX) + xdelta = -_deltaX; + + _deltaX = 0; + + if (xdiff == 0) { + sendMessage(0x1019, 0, this); + } else if (_status != 2 && _status != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + sendMessage(0x1019, 0, this); + } else if (_status != 2 && _status != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + sendMessage(0x1019, 0, this); + } else if (_status == 3 && xdiff < 30) { + sendMessage(0x1019, 0, this); + } else if (_status == 3 && xdiff < 150 && _frameIndex >= 6) { + sendMessage(0x1019, 0, this); + } else { + HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + _x += xdelta; + if (_field114) { + debug("_field114"); + // TODO KlaymanSprite_sub_41CF70 + } else { + HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + if (xdelta > 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (hitRectPrev->type == 0x5003) { + if (xdelta < 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (_flagF6 && xdelta != 0) { + if (hitRectNext->type == 0x5000) { + _y++; + } else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) { + _y--; + } + } + } + processDelta(); + } + } } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 69f9a34dc6..50a12ae6a4 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -41,13 +41,21 @@ struct KlaymanTableItem { class Klayman : public AnimatedSprite { public: - Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority); + Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000); + + void update(); void sub41FD30(); void sub41FDA0(); void sub41FDF0(); void sub41FE60(); void sub41FEB0(); + void sub41FC80(); + void sub4211F0(); + void sub4211B0(); + + void spriteUpdate41F250(); + void spriteUpdate41F5F0(); protected: Entity *_parentScene; @@ -74,15 +82,14 @@ protected: const KlaymanTableItem *_table; int _tableCount; int _tableMaxValue; + uint32 _field114; /* - 00000114 field114 dd ? 00000118 field118 dw ? */ bool _soundFlag; int _resourceHandle; virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void update(); void setKlaymanTable(const KlaymanTableItem *table, int tableCount); void setKlaymanTable1(); @@ -114,7 +121,6 @@ protected: void sub41C770(); void sub41C790(); - void sub41FC80(); void update41D0F0(); uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); @@ -126,6 +132,24 @@ protected: uint32 handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender); void sub41C930(int16 x, bool flag); + + uint32 handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender); + + bool sub41CEB0(AnimationCb callback3); + + void sub41FB40(); + void sub41FBB0(); + uint32 handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender); + void sub41CD70(int16 x); + void sub41F950(); + void sub41FB30(); + uint32 handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender); + void sub41F9E0(); + void spriteUpdate41F300(); + uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); + void sub41FA40(); + + void spriteUpdate41F320(); }; diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index c46aa79ea2..03109c0c86 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -52,17 +52,17 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * _field24 = -1; _field26 = -1; _field28 = -1; - _field20 = param._integer; + _field20 = param.asInteger(); _done = true; return 0; case 0x100A: - _field24 = (int16)param._integer; + _field24 = (int16)param.asInteger(); return 0; case 0x1023: - _field26 = (int16)param._integer; + _field26 = (int16)param.asInteger(); return 0; case 0x1024: - _field28 = (int16)param._integer; + _field28 = (int16)param.asInteger(); return 0; default: if (_childObject && sender == _parentModule) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 858062084f..eea0d99567 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -132,6 +132,74 @@ void Module1000::updateScene1005() { // Scene1001 +KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { +} + +uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { + debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum); + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub4211B0)); + } + break; + case 0x480D: + debug("########### A"); + // TODO setCallback2(AnimationCallback(&Klayman::sub44FA50)); + break; + case 0x4812: + debug("########### B"); + // TODO setCallback2(AnimationCallback(&Klayman::sub41FF80)); + break; + + case 0x4836: + if (param.asInteger() == 1) { + _parentScene->sendMessage(0x2002, 0, this); + setCallback2(AnimationCallback(&Klayman::sub4211F0)); + } + break; + + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + + // TODO + + return 0; +} + +void KmScene1001::sub44FA50() { + if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x00648953, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1001::handleMessage44FA00); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + } +} + +uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x480F, 0, this); + } + break; + } + return messageResult; +} + AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) { @@ -165,18 +233,12 @@ void AsScene1001Door::handleMessage2000h() { switch (_vm->getGlobalVar(0x52371C95)) { case 0: case 1: -#if 0 - _soundResource1.set(0x65482F03); - _soundResource1.load(); - _soundResource1.play(false); -#endif + _soundResource1.play(0x65482F03); setFileHash(0x624C0498, 1, 3); SetAnimationCallback3(&AsScene1001Door::callback1); break; case 2: -#if 0 - _soundResource2.play(false); -#endif + _soundResource2.play(); setFileHash(0x624C0498, 6, 6); SetAnimationCallback3(&AsScene1001Door::callback2); break; @@ -216,9 +278,7 @@ void AsScene1001Door::callback2() { } void AsScene1001Door::callback3() { -#if 0 - _soundResource1.play(false); -#endif + _soundResource1.play(); setFileHash1(); _surface->setVisible(false); } @@ -239,25 +299,17 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x00352100) { + if (param.asInteger() == 0x00352100) { if (_asDoor) { _asDoor->sendMessage(0x2000, 0, this); } - } else if (param._integer == 0x0A1A0109) { -#if 0 - _soundResource.set(0x66410886); - _soundResource.load(); - _soundResource.play(false); -#endif + } else if (param.asInteger() == 0x0A1A0109) { + _soundResource.play(0x66410886); } break; case 0x2000: setFileHash(0x022C90D4, 1, -1); -#if 0 - _soundResource.set(0xE741020A); - _soundResource.load(); - _soundResource.play(false); -#endif + _soundResource.play(0xE741020A); _newHashListIndex = -2; break; } @@ -280,12 +332,8 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x0E0A1410) { -#if 0 - _soundResource.set(0x60803F10); - _soundResource.load(); - _soundResource.play(false); -#endif + if (param.asInteger() == 0x0E0A1410) { + _soundResource.play(0x60803F10); } break; case 0x2001: @@ -317,17 +365,14 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param._integer == 0x00C0C444) { + if (param.asInteger() == 0x00C0C444) { _parentScene->sendMessage(0x480F, 0, this); - } else if (param._integer == 0xC41A02C0) { -#if 0 - _soundResource.set(0x40581882); - _soundResource.load(); - _soundResource.play(false); -#endif + } else if (param.asInteger() == 0xC41A02C0) { + _soundResource.play(0x40581882); } break; case 0x1011: + debug("Click lever"); _parentScene->sendMessage(0x4826, 0, this); messageResult = 1; break; @@ -371,11 +416,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p _parentScene->sendMessage(0x480B, 0, this); _surface->setVisible(true); _countdown = 8; -#if 0 - _soundResource.set(_soundFileHash); - _soundResource.load(); - _soundResource.play(false); -#endif + _soundResource.play(_soundFileHash); break; } return messageResult; @@ -386,8 +427,6 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _name = "Scene1001"; - // TODO: Implement Sprite classes - Sprite *staticSprite1; SetMessageHandler(&Scene1001::handleMessage); @@ -400,46 +439,37 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Mouse - //DEBUG so he's here at least - _klayman = new Klayman(_vm, this, 200, 433, 1000, 1000); - addSprite(_klayman); - -#if 0 - // TODO: Player sprites... if (which < 0) { setRectList(0x004B49F0); - _klayman = new Class572(_vm, this, 200, 433, 1000, 1000); + _klayman = new KmScene1001(_vm, this, 200, 433); setMessageList(0x004B4888); } else if (which == 1) { setRectList(0x004B49F0); - _klayman = new Class572(_vm, this, 640, 433, 1000, 1000); + _klayman = new KmScene1001(_vm, this, 640, 433); setMessageList(0x004B4898); } else if (which == 2) { setRectList(0x004B49F0); if (_vm->getGlobalVar(0xC0418A02)) { - _klayman = new Class572(_vm, this, 390, 433, 1000, 1000); + _klayman = new KmScene1001(_vm, this, 390, 433); _klayman->setDoDeltaX(1); } else { - _klayman = new Class572(_vm, this, 300, 433, 1000, 1000); + _klayman = new KmScene1001(_vm, this, 300, 433); } setMessageList(0x004B4970); } else { setRectList(0x004B4A00); - _klayman = new Class572(_vm, this, 200, 433, 1000, 1000); + _klayman = new KmScene1001(_vm, this, 200, 433); setMessageList(0x004B4890); } addSprite(_klayman); -#endif staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300)); -#if 0 // TODO: This sucks somehow, find a better way _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; _klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; -#endif if (_vm->getGlobalVar(0xD217189D) == 0) { _asDoor = addSprite(new AsScene1001Door(_vm)); @@ -478,45 +508,47 @@ Scene1001::~Scene1001() { } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Scene1001::handleMessage(%04X)", messageNum); uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param._point.x == 0 && _vm->getGlobalVar(0xA4014072)) { + if (param.asPoint().x == 0 && _vm->getGlobalVar(0xA4014072)) { _parentModule->sendMessage(0x1009, 0, this); } break; case 0x000D: - if (param._integer == 0x188B2105) { + if (param.asInteger() == 0x188B2105) { _parentModule->sendMessage(0x1009, 0, this); messageResult = 1; } break; case 0x100D: - if (param._integer == 0x00342624) { - // TODO _klayman->sendMessage(0x1014, _asLever, this); - // TODO setMessageList2(0x004B4910, true, false); + if (param.asInteger() == 0x00342624) { + _klayman->sendMessage(0x1014, _asLever, this); + setMessageList2(0x004B4910); messageResult = 1; - } else if (param._integer == 0x21E64A00) { + } else if (param.asInteger() == 0x21E64A00) { if (_vm->getGlobalVar(0xD217189D)) { - // TODO setMessageList(0x004B48A8, true, false); + setMessageList(0x004B48A8); messageResult = 1; } else { - // TODO setMessageList(0x004B48C8, true, false); + setMessageList(0x004B48C8); messageResult = 1; } - } else if (param._integer == 0x040424D0) { - // TODO _klayman->sendMessage(0x1014, _ssButton, this); - } else if (param._integer == 0x80006358) { + } else if (param.asInteger() == 0x040424D0) { + _klayman->sendMessage(0x1014, _ssButton, this); + } else if (param.asInteger() == 0x80006358) { if (_vm->getGlobalVar(0x03C698DA)) { - // TODO setMessageList(0x004B4938, true, false); + setMessageList(0x004B4938); } else { - // TODO setMessageList(0x004B4960, true, false); + setMessageList(0x004B4960); } } break; case 0x2002: - // TODO setRectList(0x004B49F0); + debug("########## setRectList(0x004B49F0);"); + setRectList(0x004B49F0); break; case 0x480B: if (_asWindow) { diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 21be948c41..d74a0e189d 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -55,6 +55,15 @@ protected: // Scene1001 +class KmScene1001 : public Klayman { +public: + KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub44FA50(); + uint32 handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class AsScene1001Door : public AnimatedSprite { public: AsScene1001Door(NeverhoodEngine *vm); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 73e7c5fcd6..0e3e0a33ea 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -78,6 +78,8 @@ Common::Error NeverhoodEngine::run() { _res->addArchive("s.blb"); _res->addArchive("t.blb"); + CursorMan.showMouse(true); + #if 0 BlbArchive *blb = new BlbArchive(); blb->open("m.blb"); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 5fc167c050..e3a29c573d 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -198,7 +198,7 @@ bool AnimResource::load(uint32 fileHash) { animList = resourceData + 12; for (animListIndex = 0; animListIndex < animListCount; animListIndex++) { - debug("hash: %08X", READ_LE_UINT32(animList)); + debug(8, "hash: %08X", READ_LE_UINT32(animList)); if (READ_LE_UINT32(animList) == fileHash) break; animList += 8; @@ -218,7 +218,7 @@ bool AnimResource::load(uint32 fileHash) { frameCount = READ_LE_UINT16(animList + 4); frameListStartOfs = READ_LE_UINT16(animList + 6); - debug("frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs); + debug(8, "frameCount = %d; frameListStartOfs = %04X; animInfoStartOfs = %04X", frameCount, frameListStartOfs, animInfoStartOfs); frameList = resourceData + animInfoStartOfs + frameListStartOfs; @@ -241,7 +241,7 @@ bool AnimResource::load(uint32 fileHash) { frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24); frameInfo.field_1A = READ_LE_UINT16(frameList + 26); frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28); - debug("frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", + debug(8, "frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", frameInfo.frameHash, frameInfo.counter, frameInfo.rect.x, frameInfo.rect.y, frameInfo.rect.width, frameInfo.rect.height, frameInfo.deltaX, frameInfo.deltaY, @@ -299,4 +299,18 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) { return -1; } +SoundResource::SoundResource(NeverhoodEngine *vm) + : _vm(vm) { +} + +bool SoundResource::isPlaying() { + return false; +} + +void SoundResource::play(uint32 fileHash, bool looping) { +} + +void SoundResource::play() { +} + } // End of namespace Neverhood diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 969f46d3e7..7540956954 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -103,8 +103,10 @@ protected: class SoundResource { public: - SoundResource(NeverhoodEngine *vm) : _vm(vm) {} - bool isPlaying() const { return false; } + SoundResource(NeverhoodEngine *vm); + bool isPlaying(); + void play(uint32 fileHash, bool looping = false); + void play(); protected: NeverhoodEngine *_vm; }; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 9b7b35d419..9d7d550c2d 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -31,11 +31,11 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _messageListFlag1 = false; _systemCallbackFlag = false; _messageList = NULL; - // TODO _rectType = 0; + _rectType = 0; _mouseClickPos.x = 0; _mouseClickPos.y = 0; _mouseClicked = false; - // TODO _rectList = NULL; + _rectList = NULL; // TODO _someRects = NULL; _klayman = NULL; // TODO _mouseSprite = NULL; @@ -191,27 +191,24 @@ void Scene::update() { _smkFileHash = 0; } else { if (_mouseClicked) { - //** ALL TODO -#if 0 if (_klayman) { // TODO: Merge later if (_klayman->hasMessageHandler() && _klayman->sendMessage(0x1008, 0, this) != 0 && _messageListFlag && - queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) { + queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; } else if (_klayman->hasMessageHandler() && _klayman->sendMessage(0x1008, 0, this) != 0 && _messageListFlag) { _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); } - } else if (queryPositionClass400(_mouseClickPos.x, _mouseClickPos.y)) { + } else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; } -#endif } - - // TODO runMessageList(); + + runMessageList(); // Update all entities for (Common::Array::iterator iter = _entities.begin(); iter != _entities.end(); iter++) @@ -228,12 +225,13 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s #if 0 if (_mouseSprite && _mouseSprite->hasMessageHandler()) _mouseSprite->sendMessage(0x4002, param, this); - queryPositionSomeRects(param._point.x, param._point.y); + queryPositionSomeRects(param.asPoint().x, param.asPoint().y); #endif break; case 1: // mouse clicked + debug("mouse clicked"); _mouseClicked = true; - _mouseClickPos = param._point; + _mouseClickPos = param.asPoint(); break; /* ORIGINAL DEBUG case 3: @@ -259,7 +257,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s if (_messageListIndex == _messageListCount) _klayman->sendMessage(0x4004, 0, this); else { - // TODO runMessageList(); + runMessageList(); } } break; @@ -287,7 +285,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s #endif break; case 0x1022: - setSurfacePriority(((Sprite*)sender)->getSurface(), param._integer); + setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger()); break; } return 0; @@ -311,9 +309,187 @@ void Scene::smackerUpdate() { } uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - if (messageNum == 0x3002) + switch (messageNum) { + case 0x3002: _smackerDone = true; + break; + } return 0; } +bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { + debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY); + for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) { + Sprite *sprite = _vm->_collisionMan->getSprite(i); + if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && + sprite->sendPointMessage(0x1011, _mouseClickPos, this) != 0) { + return true; + } + } + return false; +} + +bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { + if (_rectType == 1) { + RectList &rectList = *_rectList; + int16 klaymanX = _klayman->getX(); + int16 klaymanY = _klayman->getY(); + for (uint i = 0; i < rectList.size(); i++) { + debug("(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2); + if (klaymanX >= rectList[i].rect.x1 && klaymanX <= rectList[i].rect.x2 && + klaymanY >= rectList[i].rect.y1 && klaymanY <= rectList[i].rect.y2) { + for (uint j = 0; j < rectList[i].subRects.size(); j++) { + debug(" (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2); + if (mouseX >= rectList[i].subRects[j].rect.x1 && mouseX <= rectList[i].subRects[j].rect.x2 && + mouseY >= rectList[i].subRects[j].rect.y1 && mouseY <= rectList[i].subRects[j].rect.y2) { + debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId); + return setMessageList2(rectList[i].subRects[j].messageListId); + } + } + } + } + return true; + } + return false; +} + +void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackFlag) { + setMessageList(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag); +} + +void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { + _messageList = messageList; + _messageListCount = _messageList ? _messageList->size() : 0; + _messageListIndex = 0; + _messageListFlag1 = false; + _messageListFlag = messageListFlag; + _systemCallbackFlag = systemCallbackFlag; + _messageListStatus = 1; + _klayman->sendMessage(0x101C, 0, this); +} + +bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallbackFlag) { + return setMessageList2(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag); +} + +bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { + bool result = false; + + debug("Scene::setMessageList2(%p)", (void*)messageList); + + if (_messageListStatus == 1) { + if (messageList != _messageList2) { + if (_messageValue >= 0) { + _parentModule->sendMessage(0x1023, _messageValue, this); + _messageValue = -1; + } + _messageList2 = messageList; + setMessageList(messageList, messageListFlag, systemCallbackFlag); + result = true; + } + } else if (_messageListStatus == 2) { + if (messageList == _messageList2) { + if (_messageValue >= 0) { + _parentModule->sendMessage(0x1023, _messageValue, this); + _messageValue = -1; + } + _messageList2 = messageList; + setMessageList(messageList, messageListFlag, systemCallbackFlag); + result = true; + } + } else { + if (_messageValue >= 0) { + _parentModule->sendMessage(0x1023, _messageValue, this); + _messageValue = -1; + } + _messageList2 = messageList; + setMessageList(messageList, messageListFlag, systemCallbackFlag); + } + return result; +} + +void Scene::runMessageList() { + + //debug("_messageListFlag2 = %d", _messageListFlag2); + + if (_messageListFlag2) + return; + + _messageListFlag2 = true; + + if (_messageListFlag1) { + _messageListFlag2 = false; + return; + } + + if (!_messageList) { + _messageList2 = NULL; + _messageListStatus = 0; + } + + if (_messageList && _klayman) { + + while (_messageList && _messageListIndex < _messageListCount && !_messageListFlag1) { + int messageNum = (*_messageList)[_messageListIndex].messageNum; + uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; + + debug("$$$$$$$$$$$ Scene::runMessageList() %04X, %08X", messageNum, messageParam); + + _messageListIndex++; + if (_messageListIndex == _messageListCount) { + _klayman->sendMessage(0x1021, 0, this); + } + if (_systemCallbackFlag) { + // TODO messageNum = systemConvertMessageCb(messageNum); + } + if (messageNum != 0x4003) { + if (messageNum == 0x1009 || messageNum == 0x1024) { + _parentModule->sendMessage(messageNum, messageParam, this); + } else if (messageNum == 0x100A) { + _messageValue = messageParam; + _parentModule->sendMessage(messageNum, messageParam, this); + } else if (messageNum == 0x4001) { + _messageListFlag1 = true; + _klayman->sendPointMessage(0x4001, _mouseClickPos, this); + } else if (messageNum == 0x100D) { + if (this->hasMessageHandler() && this->sendMessage(0x100D, messageParam, this) != 0) + continue; + } else if (messageNum == 0x101A) { + _messageListStatus = 0; + } else if (messageNum == 0x101B) { + _messageListStatus = 2; + } else if (messageNum == 0x1020) { + _messageListFlag = false; + } else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) { + if (this->hasMessageHandler() && this->sendMessage(messageNum, messageParam, this) != 0) { + _messageListFlag2 = false; + return; + } + } else { + _messageListFlag1 = true; + if (_klayman->hasMessageHandler() && _klayman->sendMessage(messageNum, messageParam, this) != 0) { + _messageListFlag1 = false; + } + } + } + if (_messageListIndex == _messageListCount) { + _messageListFlag = true; + _messageList = NULL; + } + } + } + + _messageListFlag2 = false; + +} + +void Scene::setRectList(uint32 id) { + setRectList(_vm->_staticData->getRectList(id)); +} + +void Scene::setRectList(RectList *rectList) { + _rectList = rectList; + _rectType = 1; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 4928d20ae2..34f3c1e759 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -56,15 +56,15 @@ protected: Common::Array _surfaces; bool _systemCallbackFlag; MessageList *_messageList; - int _messageListIndex; - int _messageListCount; + uint _messageListCount; + uint _messageListIndex; bool _messageListFlag1; NPoint _mouseClickPos; bool _mouseClicked; // TODO RectResource _rectResource; - // TODO 00000080 rectList dd ? - // TODO 00000084 rectType dw ? - // TODO 00000086 rectListCount dw ? + RectList *_rectList; + int _rectType; + // rectListCount // TODO 00000088 someRects dd ? // TODO 0000008C someRectsCount dw ? // TODO 0000008E field_8E dw ? @@ -93,6 +93,15 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void smackerUpdate(); uint32 smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + bool queryPositionSprite(int16 mouseX, int16 mouseY); + bool queryPositionRectList(int16 mouseX, int16 mouseY); + void setMessageList(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false); + void setMessageList(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false); + bool setMessageList2(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false); + bool setMessageList2(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false); + void runMessageList(); + void setRectList(uint32 id); + void setRectList(RectList *rectList); }; } // End of namespace Neverhood diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index ce21527384..d9257502a0 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -384,7 +384,7 @@ void AnimatedSprite::updateFrameIndex() { } void AnimatedSprite::updateFrameInfo() { - debug("AnimatedSprite::updateFrameInfo()"); + debug(8, "AnimatedSprite::updateFrameInfo()"); const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex); @@ -452,20 +452,44 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil _hashListIndex = -1; } +void AnimatedSprite::setCallback1(AnimationCb callback1) { + if (_callback1Cb) { + (this->*_callback1Cb)(); + } + SetAnimationCallback1(callback1); +} + +void AnimatedSprite::setCallback2(AnimationCb callback2) { + + if (_callback1Cb) { + // _callback1Cb has to be cleared before it's called + AnimationCb cb = _callback1Cb; + _callback1Cb = NULL; + (this->*cb)(); + } + + // TODO _callbackList = NULL; + _callback3Cb = NULL; + _callback2Cb = callback2; + + if (_callback2Cb) { + (this->*_callback2Cb)(); + } + +} + void AnimatedSprite::removeCallbacks() { if (_callback1Cb) { // _callback1Cb has to be cleared before it's called AnimationCb cb = _callback1Cb; _callback1Cb = NULL; - debug("Fire _callback1Cb"); (this->*cb)(); } if (_callback3Cb) { _callback2Cb = _callback3Cb; _callback3Cb = NULL; - debug("Fire _callback3Cb"); (this->*_callback2Cb)(); #if 0 // TODO } else if (_callbackList) { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index b3809a845e..160bfe1a7f 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -45,6 +45,8 @@ public: void setDoDeltaX(int type); void setDoDeltaY(int type); bool isPointInside(int16 x, int16 y); + int16 getX() const { return _x; } + int16 getY() const { return _y; } protected: void (Sprite::*_spriteUpdateCb)(); int16 (Sprite::*_filterXCb)(int16); @@ -98,6 +100,7 @@ public: AnimatedSprite(NeverhoodEngine *vm, int objectPriority); AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y); void update(); + void updateDeltaXY(); protected: typedef void (AnimatedSprite::*AnimationCb)(); AnimResource _animResource; @@ -129,7 +132,6 @@ protected: AnimationCb _callback2Cb; AnimationCb _callback3Cb; void init(); - void updateDeltaXY(); void updateAnim(); void updatePosition(); void updateFrameIndex(); @@ -139,6 +141,8 @@ protected: void setFileHash1(); void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5); void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); + void setCallback1(AnimationCb callback1); + void setCallback2(AnimationCb callback2); int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!! void removeCallbacks(); }; -- cgit v1.2.3 From 222cd4a6513770914d09630d1001a8159ba3d0f9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 9 Jul 2011 18:45:51 +0000 Subject: NEVERHOOD: More work on Scene1001 and Klayman - Fix a bug in Klayman's walking - The lever can now be used - Other stuff is still missing - Remove entity.cpp since it's not needed --- engines/neverhood/entity.cpp | 27 ------- engines/neverhood/entity.h | 4 +- engines/neverhood/klayman.cpp | 160 +++++++++++++++++++++++++++++++-------- engines/neverhood/klayman.h | 4 +- engines/neverhood/module.mk | 1 - engines/neverhood/module1000.cpp | 19 ++--- engines/neverhood/neverhood.cpp | 10 ++- engines/neverhood/resource.cpp | 2 - engines/neverhood/scene.cpp | 29 +++---- engines/neverhood/sprite.cpp | 28 ++++--- engines/neverhood/sprite.h | 3 +- 11 files changed, 182 insertions(+), 105 deletions(-) delete mode 100644 engines/neverhood/entity.cpp diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp deleted file mode 100644 index 9070d5c8c4..0000000000 --- a/engines/neverhood/entity.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/entity.h" - -namespace Neverhood { - -} // End of namespace Neverhood diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 29bf6be988..c570084e56 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -49,8 +49,8 @@ public: assert(_type == mptInteger || _type == mptPoint); if (_type == mptInteger) { NPoint pt; - pt.x = (_integer >> 16) & 0xFFFF; - pt.y = _integer & 0xFFFF; + pt.x = _integer & 0xFFFF; + pt.y = (_integer >> 16) & 0xFFFF; return pt; } return _point; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index eca8e02df4..4a40b2f4b7 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -53,7 +53,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), _counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false), - _status(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), + _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { // TODO @@ -289,22 +289,24 @@ void Klayman::update41D2B0() { } bool Klayman::sub41CF10(AnimationCb callback) { - if (_status2 != 2) - return false; - _status2 = 1; - setFileHash(0x9A7020B8, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41F140); - SetSpriteCallback(NULL); - SetAnimationCallback3(callback); - _flagE5 = false; - return true; + if (_status2 == 2) { + _status2 = 1; + _flagE5 = false; + setFileHash(0x9A7020B8, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41F140); + SetSpriteCallback(NULL); + SetAnimationCallback3(callback); + return true; + } + return false; } -void Klayman::sub41C7B0() { + void Klayman::sub41C7B0() { if (_callback1Cb) { - (this->*_callback1Cb)(); + AnimationCb cb = _callback1Cb; _callback1Cb = NULL; + (this->*cb)(); } if (_callback3Cb) { AnimationCb cb = _callback3Cb; @@ -321,16 +323,18 @@ void Klayman::sub41C7B0() { void Klayman::sub41C770() { _flagFA = false; - _status = 1; + _status3 = 1; } void Klayman::sub41C790() { if (_flagFA) - _status = 0; + _status3 = 0; } void Klayman::sub41FC80() { if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) { + _status2 = 1; + _flagE5 = true; setFileHash(0x5420E254, 0, -1); _counter = 0; _counter3 = 0; @@ -387,7 +391,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E sub41C790(); break; case 0x481C: - _status = param.asInteger(); + _status3 = param.asInteger(); _flagFA = true; messageResult = 1; break; @@ -413,6 +417,7 @@ void Klayman::sub41FF00() { } uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41D480(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -432,6 +437,7 @@ void Klayman::sub41FCF0() { } uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41F140(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -449,9 +455,9 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); - if (xdiff == 0) { + if (x == _x) { _x4 = x; - if (_flagE1 || _flagE2 || _flagE3) { + if (!_flagE1 && !_flagE2 && !_flagE3) { setCallback2(NULL); sub41C7B0(); } @@ -459,7 +465,7 @@ void Klayman::sub41C930(int16 x, bool flag) { _x4 = x; setCallback2(NULL); sub41C7B0(); - } else if (xdiff <= 42 && _status != 3) { + } else if (xdiff <= 42 && _status3 != 3) { if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { _x4 = x; } else { @@ -470,7 +476,6 @@ void Klayman::sub41C930(int16 x, bool flag) { _x4 = x; } else if (flag) { _x4 = x; - debug("#### 1"); // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); } else { _x4 = x; @@ -497,6 +502,7 @@ void Klayman::sub4211B0() { } uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41E920(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -526,10 +532,82 @@ bool Klayman::sub41CEB0(AnimationCb callback3) { void Klayman::spriteUpdate41F250() { debug("Klayman::spriteUpdate41F250()"); + + int16 xdiff = _x4 - _x; + + if (_doDeltaX) { + _x -= _deltaX; + } else { + _x += _deltaX; + } + _deltaX = 0; + + if (_doDeltaY) { + _y -= _deltaY; + } else { + _y += _deltaY; + } + _deltaY = 0; + + if (_flag) { + if (xdiff > 6) + _x += 6; + else if (xdiff < -6) + _x -= 6; + else + _x = _x4; + } + + processDelta(); + } void Klayman::spriteUpdate41F5F0() { debug("Klayman::spriteUpdate41F5F0()"); + + int16 xdiff = _x4 - _x; + + if (_frameIndex == 9) { + if (xdiff > 26) + _deltaX += xdiff - 26; + else if (xdiff < -26) + _deltaX -= xdiff + 26; + } + + if (xdiff > _deltaX) + xdiff = _deltaX; + else if (xdiff < -_deltaX) + xdiff = -_deltaX; + _deltaX = 0; + + if (_x4 != _x) { + HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + _x += xdiff; + if (_field114) { + // TODO KlaymanSprite_sub_41CF70 + } else { + HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + if (xdiff > 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (hitRectPrev->type == 0x5003) { + if (xdiff < 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } + } + processDelta(); + } + } void Klayman::sub41FB40() { @@ -549,6 +627,7 @@ void Klayman::sub41FBB0() { } uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41DD80(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -579,6 +658,7 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, E } void Klayman::sub41CD70(int16 x) { + debug("Klayman::sub41CD70(%d)", x); if (x > _x) { if (ABS(x - _x) <= 105) { debug("// TODO sub41CAC0(x);"); @@ -615,7 +695,8 @@ void Klayman::sub41FB30() { } uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + debug("Klayman::handleMessage41EC70(%04X)", messageNum); + uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { @@ -654,6 +735,7 @@ void Klayman::spriteUpdate41F300() { } uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41EB70(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -676,15 +758,16 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FA40() { - if (_status == 2) { + if (_status3 == 2) { sub41C7B0(); - } else if (_status == 3) { - debug("// TODO sub420F20();"); + } else if (_status3 == 3) { + debug("/////////////////////////////////////////////////// TODO sub420F20();"); // TODO sub420F20(); } else { _flagE2 = true; + _flagE5 = true; if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { - if (_status == 0) { + if (_status3 == 0) { _status2 = 1; setFileHash(0xF234EE31, 0, -1); } else { @@ -692,7 +775,7 @@ void Klayman::sub41FA40() { setFileHash(0xF135CC21, 0, -1); } } else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { - if (_status == 0) { + if (_status3 == 0) { _status2 = 1; setFileHash(0x8604A152, 0, -1); } else { @@ -700,7 +783,6 @@ void Klayman::sub41FA40() { setFileHash(0xA246A132, 0, -1); } } - _flagE5 = true; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DD80); SetSpriteCallback(&Klayman::spriteUpdate41F5F0); @@ -714,20 +796,20 @@ void Klayman::spriteUpdate41F320() { if (xdelta > _deltaX) xdelta = _deltaX; - else if (xdelta < _deltaX) + else if (xdelta < -_deltaX) xdelta = -_deltaX; _deltaX = 0; if (xdiff == 0) { sendMessage(0x1019, 0, this); - } else if (_status != 2 && _status != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + } else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { sendMessage(0x1019, 0, this); - } else if (_status != 2 && _status != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + } else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { sendMessage(0x1019, 0, this); - } else if (_status == 3 && xdiff < 30) { + } else if (_status3 == 3 && xdiff < 30) { sendMessage(0x1019, 0, this); - } else if (_status == 3 && xdiff < 150 && _frameIndex >= 6) { + } else if (_status3 == 3 && xdiff < 150 && _frameIndex >= 6) { sendMessage(0x1019, 0, this); } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); @@ -766,4 +848,18 @@ void Klayman::spriteUpdate41F320() { } +uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x482A, 0, this); + } else if (param.asInteger() == 0x88001184) { + _attachedSprite->sendMessage(0x482B, 0, this); + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 50a12ae6a4..7b65e8db60 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -78,7 +78,7 @@ protected: bool _flagFA; SoundResource _soundResource1; SoundResource _soundResource2; - int _status; + int _status3; const KlaymanTableItem *_table; int _tableCount; int _tableMaxValue; @@ -151,6 +151,8 @@ protected: void spriteUpdate41F320(); + uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); + }; } // End of namespace Neverhood diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 2058db9e3e..eb656def42 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -5,7 +5,6 @@ MODULE_OBJS = \ blbarchive.o \ collisionman.o \ detection.o \ - entity.o \ gamemodule.o \ graphics.o \ klayman.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index eea0d99567..c631dc0b50 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -152,14 +152,17 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x480D: - debug("########### A"); - // TODO setCallback2(AnimationCallback(&Klayman::sub44FA50)); + setCallback2(AnimationCallback(&KmScene1001::sub44FA50)); break; case 0x4812: debug("########### B"); // TODO setCallback2(AnimationCallback(&Klayman::sub41FF80)); break; - + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x4836: if (param.asInteger() == 1) { _parentScene->sendMessage(0x2002, 0, this); @@ -169,7 +172,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4840: sub41CD70(param.asInteger()); - break; + break; } // TODO @@ -189,7 +192,8 @@ void KmScene1001::sub44FA50() { } uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage(messageNum, param, sender); + debug("KmScene1001::handleMessage44FA00(%04X)", messageNum); + uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { @@ -372,7 +376,6 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m } break; case 0x1011: - debug("Click lever"); _parentScene->sendMessage(0x4826, 0, this); messageResult = 1; break; @@ -531,11 +534,10 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x21E64A00) { if (_vm->getGlobalVar(0xD217189D)) { setMessageList(0x004B48A8); - messageResult = 1; } else { setMessageList(0x004B48C8); - messageResult = 1; } + messageResult = 1; } else if (param.asInteger() == 0x040424D0) { _klayman->sendMessage(0x1014, _ssButton, this); } else if (param.asInteger() == 0x80006358) { @@ -547,7 +549,6 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2002: - debug("########## setRectList(0x004B49F0);"); setRectList(0x004B49F0); break; case 0x480B: diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 0e3e0a33ea..9c029190cb 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -79,6 +79,11 @@ Common::Error NeverhoodEngine::run() { _res->addArchive("t.blb"); CursorMan.showMouse(true); + { + byte buffer[2*2]; + memset(buffer, 255, 4); + CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0); + } #if 0 BlbArchive *blb = new BlbArchive(); @@ -143,9 +148,6 @@ Common::Error NeverhoodEngine::run() { switch (event.type) { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; - - // DEBUG gameModule->sendMessage(0x480F, 0, NULL); - break; case Common::EVENT_KEYUP: _keyState = Common::KEYCODE_INVALID; @@ -186,7 +188,7 @@ Common::Error NeverhoodEngine::run() { _screen->wait(); _screen->update(); - //debug("---------------------------------------"); + debug("---------------------------------------"); } diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index e3a29c573d..83078afe60 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -267,8 +267,6 @@ void AnimResource::unload() { void AnimResource::clear() { _resourceHandle = -1; - // _count = 0; - // _infoStructs = NULL; _currSpriteData = NULL; _fileHash = 0; _paletteData = NULL; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 9d7d550c2d..9e1f06bf0f 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -180,13 +180,13 @@ void Scene::update() { if (_smkFileHash != 0) { // TODO //**** ALL TODO - //_smackerPlayer = new SmackerPlayer(this, _smkFileHash, true, 0); + _smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0); _savedUpdateHandlerCb = _updateHandlerCb; _savedMessageHandlerCb = _messageHandlerCb; SetUpdateHandler(&Scene::smackerUpdate); SetMessageHandler(&Scene::smackerHandleMessage); _smackerDone = false; - // smackerUpdate(); + smackerUpdate(); // g_screen->smackerPlayer = _smackerPlayer; _smkFileHash = 0; } else { @@ -219,7 +219,6 @@ void Scene::update() { } uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - // TODO switch (messageNum) { case 0: // mouse moved #if 0 @@ -348,9 +347,8 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { } } } - return true; } - return false; + return true; } void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackFlag) { @@ -358,6 +356,7 @@ void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackF } void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { + debug("Scene::setMessageList(%p)", (void*)messageList); _messageList = messageList; _messageListCount = _messageList ? _messageList->size() : 0; _messageListIndex = 0; @@ -366,6 +365,13 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool _systemCallbackFlag = systemCallbackFlag; _messageListStatus = 1; _klayman->sendMessage(0x101C, 0, this); + + // DEBUG: Show message list + for (uint i = 0; i < messageList->size(); i++) { + debug("%02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); + } + debug("================================================================"); + } bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallbackFlag) { @@ -404,24 +410,19 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool } _messageList2 = messageList; setMessageList(messageList, messageListFlag, systemCallbackFlag); + result = true; } return result; } void Scene::runMessageList() { + debug("Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1); - //debug("_messageListFlag2 = %d", _messageListFlag2); - - if (_messageListFlag2) + if (_messageListFlag2 || _messageListFlag1) return; _messageListFlag2 = true; - if (_messageListFlag1) { - _messageListFlag2 = false; - return; - } - if (!_messageList) { _messageList2 = NULL; _messageListStatus = 0; @@ -433,7 +434,7 @@ void Scene::runMessageList() { int messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; - debug("$$$$$$$$$$$ Scene::runMessageList() %04X, %08X", messageNum, messageParam); + //debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); _messageListIndex++; if (_messageListIndex == _messageListCount) { diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index d9257502a0..713bfeffe6 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -73,10 +73,12 @@ bool Sprite::isPointInside(int16 x, int16 y) { } uint32 Sprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - if (messageNum == 5) { + switch (messageNum) { + case 0x0005: // TODO: Draw debug marker (?) // TODO g_Screen->drawLine(_x - 5, _y, _x + 6, _y); // TODO g_Screen->drawLine(_x, _y - 5, _x, _y + 6); + break; } return 0; } @@ -268,14 +270,16 @@ void AnimatedSprite::updateAnim() { if (_animResource.loadInternal(_fileHash2)) { _fileHash3 = _fileHash2; } else { + debug("TODO"); // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } if (_replNewByte != _replOldByte) { + debug("TODO"); // TODO _animResource.setRepl(_replOldByte, _replNewByte); } _fileHash2 = 0; - if (_status != 0) { + if (_animStatus != 0) { _frameIndex = _fileHash6 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash6)) : 0; _frameIndex2 = _fileHash5 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1; } else { @@ -292,17 +296,19 @@ void AnimatedSprite::updateAnim() { } if (_fileHash1 != 0) { - if (_status == 2) { + if (_animStatus == 2) { _hashListIndex = _frameIndex; } else { - if (_status == 1) { + if (_animStatus == 1) { if (_animResource.loadInternal(_fileHash1)) { _fileHash3 = _fileHash1; } else { + debug("TODO"); // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } if (_replNewByte != _replOldByte) { + debug("TODO"); // TODO _animResource.setRepl(_replOldByte, _replNewByte); } _fileHash1 = 0; @@ -312,10 +318,12 @@ void AnimatedSprite::updateAnim() { if (_animResource.loadInternal(_fileHash1)) { _fileHash3 = _fileHash1; } else { + debug("TODO"); // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } if (_replNewByte != _replOldByte) { + debug("TODO"); // TODO _animResource.setRepl(_replOldByte, _replNewByte); } _fileHash1 = 0; @@ -419,7 +427,7 @@ void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frame _frameIndex3 = frameIndex3; _frameIndex4 = frameIndex4; _fileHash4 = 0; - _status = 0; + _animStatus = 0; _playBackwards = false; _newHashListIndex = -1; _hashListIndex = -1; @@ -427,7 +435,7 @@ void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frame void AnimatedSprite::setFileHash1() { _fileHash1 = 1; - _status = 2; + _animStatus = 2; } void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) { @@ -435,7 +443,7 @@ void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 file _fileHash6 = fileHash6; _fileHash5 = fileHash5; _fileHash4 = 0; - _status = 1; + _animStatus = 1; _playBackwards = false; _newHashListIndex = -1; _hashListIndex = -1; @@ -446,7 +454,7 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil _fileHash6 = fileHash6; _fileHash5 = fileHash5; _fileHash4 = 0; - _status = 1; + _animStatus = 1; _playBackwards = false; _newHashListIndex = -1; _hashListIndex = -1; @@ -456,13 +464,12 @@ void AnimatedSprite::setCallback1(AnimationCb callback1) { if (_callback1Cb) { (this->*_callback1Cb)(); } - SetAnimationCallback1(callback1); + _callback1Cb = callback1; } void AnimatedSprite::setCallback2(AnimationCb callback2) { if (_callback1Cb) { - // _callback1Cb has to be cleared before it's called AnimationCb cb = _callback1Cb; _callback1Cb = NULL; (this->*cb)(); @@ -481,7 +488,6 @@ void AnimatedSprite::setCallback2(AnimationCb callback2) { void AnimatedSprite::removeCallbacks() { if (_callback1Cb) { - // _callback1Cb has to be cleared before it's called AnimationCb cb = _callback1Cb; _callback1Cb = NULL; (this->*cb)(); diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 160bfe1a7f..16f741afaa 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -113,7 +113,7 @@ protected: int16 _frameIndex4; uint32 _fileHash6; uint32 _fileHash5; - int16 _status; + int16 _animStatus; int16 _counter; int _hashListIndex; int _newHashListIndex; @@ -143,7 +143,6 @@ protected: void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); void setCallback1(AnimationCb callback1); void setCallback2(AnimationCb callback2); - int16 getHashListIndex(uint32 fileHash) { return 0; } // TODO !!! void removeCallbacks(); }; -- cgit v1.2.3 From ed863b65b506fac9b55b83a4afa0a30c4bb8da8a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 10 Jul 2011 18:21:48 +0000 Subject: NEVERHOOD: More work on Scene1001/Klayman - The button can now be used, but looking at the open window doesn't work yet since game variables aren't implemented yet. --- engines/neverhood/klayman.cpp | 246 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/klayman.h | 17 +++ engines/neverhood/module1000.cpp | 26 ++++- engines/neverhood/scene.cpp | 10 +- 4 files changed, 292 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 4a40b2f4b7..a256495da5 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -476,6 +476,7 @@ void Klayman::sub41C930(int16 x, bool flag) { _x4 = x; } else if (flag) { _x4 = x; + error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));"); // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); } else { _x4 = x; @@ -661,8 +662,7 @@ void Klayman::sub41CD70(int16 x) { debug("Klayman::sub41CD70(%d)", x); if (x > _x) { if (ABS(x - _x) <= 105) { - debug("// TODO sub41CAC0(x);"); - // TODO sub41CAC0(x); + sub41CAC0(x); } else { sub41C930(x, false); } @@ -761,7 +761,7 @@ void Klayman::sub41FA40() { if (_status3 == 2) { sub41C7B0(); } else if (_status3 == 3) { - debug("/////////////////////////////////////////////////// TODO sub420F20();"); + error("// TODO sub420F20();"); // TODO sub420F20(); } else { _flagE2 = true; @@ -862,4 +862,244 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub41FF80() { + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x); + if (!sub41CEB0(AnimationCallback(&Klayman::sub41FF80))) { + _status2 = 1; + _flagE5 = false; + setFileHash(0x1C28C178, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D4C0); + SetSpriteCallback(NULL); + } +} + +uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41D4C0(%04X)", messageNum); + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC1380080) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x4806, 0, this); + } + _soundResource1.play(0x40208200); + } else if (param.asInteger() == 0x02B20220) { + _soundResource1.play(0xC5408620); + } else if (param.asInteger() == 0x03020231) { + _soundResource1.play(0xD4C08010); + } else if (param.asInteger() == 0x67221A03) { + _soundResource1.play(0x44051000); + } else if (param.asInteger() == 0x2EAE0303) { + _soundResource1.play(0x03630300); + } else if (param.asInteger() == 0x61CE4467) { + _soundResource1.play(0x03630300); + } + break; + } + return messageResult; + +} + +void Klayman::sub420120() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420120))) { + _status2 = 2; + _flagE5 = true; + setFileHash(0x1C02B03D, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DAD0); + SetSpriteCallback(NULL); + } +} + +uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41DAD0(%04X)", messageNum); + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0D01B294) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x480B, 0, this); + } + } else if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0A2AA8E0); + } + break; + } + return messageResult; +} + +void Klayman::sub420170() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420170))) { + _status2 = 2; + _flagE5 = true; + setFileHash(0x1C16B033, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DAD0); + SetSpriteCallback(NULL); + } +} + +void Klayman::sub4200D0() { + if (!sub41CF10(AnimationCallback(&Klayman::sub4200D0))) { + _status2 = 1; + _flagE5 = true; + setFileHash(0x1CD89029, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DAD0); + SetSpriteCallback(&Klayman::spriteUpdate41F250); + } +} + +void Klayman::sub41CD00(int16 x) { + if (_x > x) { + if (_x - x <= 105) { + sub41CAC0(x); + } else { + sub41C930(x, false); + } + } else if (_x < x) { + sub41C930(x, false); + } else { + _x4 = x; + setCallback2(NULL); + sub41C7B0(); + } +} + +void Klayman::sub41CC40(int16 x1, int16 x2) { + if (_x > x1) { + if (_x == x1 + x2) { + _x4 = x1 + x2; + setCallback2(NULL); + sub41C7B0(); + } else if (_x < x1 + x2) { + sub41CAC0(x1 + x2); + } else { + sub41C930(x1 + x2, false); + } + } else { + if (_x == x1 - x2) { + _x4 = x1 - x2; + setCallback2(NULL); + sub41C7B0(); + } else if (_x > x1 - x2) { + sub41CAC0(x1 - x2); + } else { + sub41C930(x1 - x2, false); + } + } +} + +void Klayman::sub41CAC0(int16 x) { + debug("Klayman::sub41CAC0(%d)", x); + int16 xdiff = ABS(x - _x); + if (x == _x) { + _x4 = x; + if (!_flagE1 && !_flagE2 && !_flagE3) { + setCallback2(NULL); + sub41C7B0(); + } + } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { + _x4 = x; + setCallback2(NULL); + sub41C7B0(); + } else if (xdiff <= 42 && _status3 != 3) { + if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { + _x4 = x; + } else { + _x4 = x; + setCallback2(AnimationCallback(&Klayman::sub41FB40)); + } + } else if (_flagE3 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _x4 = x; + } else { + _x4 = x; + setCallback2(AnimationCallback(&Klayman::sub41FBC0)); + } +} + +void Klayman::sub41FBC0() { + _status2 = 2; + _flagE3 = true; + _flagE5 = true; + setDoDeltaX(_x4 >= _x); + setFileHash(0x08B28116, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DF10); + SetSpriteCallback(&Klayman::spriteUpdate41F780); + setCallback1(AnimationCallback(&Klayman::sub41FC30)); +} + +void Klayman::sub41FC30() { + _flagE3 = false; +} + +void Klayman::spriteUpdate41F780() { + int16 xdiff = _x4 - _x; + + if (_doDeltaX) { + _deltaX = -_deltaX; + } + + if (_frameIndex == 7) { + _deltaX = xdiff; + } + + if ((xdiff > 0 && xdiff > _deltaX) || (xdiff < 0 && xdiff < _deltaX)) + xdiff = _deltaX; + + _deltaX = 0; + + if (_x != _x4) { + HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + _x += xdiff; + if (_field114) { + debug("// TODO KlaymanSprite_sub_41CF70();"); + // TODO KlaymanSprite_sub_41CF70(); + } else { + HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + if (xdiff > 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (hitRectPrev->type == 0x5003) { + if (xdiff < 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } + } + processDelta(); + } +} + +uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41DF10(%04X)", messageNum); + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0A2AA8E0); + } + break; + case 0x3002: + _x = _x4; + sub41C7B0(); + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7b65e8db60..860368a764 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -53,9 +53,15 @@ public: void sub41FC80(); void sub4211F0(); void sub4211B0(); + void sub41FF80(); + void sub420120(); + void sub420170(); + void sub4200D0(); + void sub41FBC0(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); + void spriteUpdate41F780(); protected: Entity *_parentScene; @@ -152,6 +158,17 @@ protected: void spriteUpdate41F320(); uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); + + uint32 handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender); + + uint32 handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub41CD00(int16 x); + void sub41CC40(int16 x1, int16 x2); + void sub41CAC0(int16 x); + void sub41FC30(); + + uint32 handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index c631dc0b50..0d727bac8c 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -155,14 +155,32 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&KmScene1001::sub44FA50)); break; case 0x4812: - debug("########### B"); - // TODO setCallback2(AnimationCallback(&Klayman::sub41FF80)); + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + }else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } break; case 0x4817: setDoDeltaX(param.asInteger()); sub41C7B0(); break; + case 0x481B: + // TODO: It's not really a point but an x1/x2 pair + if (param.asPoint().x != 0) { + sub41CC40(param.asPoint().x, param.asPoint().y); + } else { + error("// TODO sub41CCE0(param.asPoint().y);"); + // TODO sub41CCE0(param.asPoint().y); + } + break; + case 0x4836: if (param.asInteger() == 1) { _parentScene->sendMessage(0x2002, 0, this); @@ -170,6 +188,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: sub41CD70(param.asInteger()); break; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 9e1f06bf0f..ebf92d8b63 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -368,9 +368,9 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool // DEBUG: Show message list for (uint i = 0; i < messageList->size(); i++) { - debug("%02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); + debug("A: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); } - debug("================================================================"); + debug("A: ================================================================"); } @@ -382,6 +382,12 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool bool result = false; debug("Scene::setMessageList2(%p)", (void*)messageList); + + // DEBUG: Show message list + for (uint i = 0; i < messageList->size(); i++) { + debug("B: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); + } + debug("B: ================================================================"); if (_messageListStatus == 1) { if (messageList != _messageList2) { -- cgit v1.2.3 From 6d81ef0199e3213a97c4ff8856322341ac231022 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 08:25:24 +0000 Subject: NEVERHOOD: Implement game vars --- engines/neverhood/entity.h | 17 ++++++ engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/gamevars.cpp | 105 +++++++++++++++++++++++++++++++++++++ engines/neverhood/gamevars.h | 57 ++++++++++++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 26 ++++----- engines/neverhood/neverhood.cpp | 26 ++------- engines/neverhood/neverhood.h | 7 +-- engines/neverhood/smackerscene.cpp | 6 +-- 9 files changed, 204 insertions(+), 45 deletions(-) create mode 100644 engines/neverhood/gamevars.cpp create mode 100644 engines/neverhood/gamevars.h diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index c570084e56..7538b36ce2 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -24,6 +24,7 @@ #define NEVERHOOD_ENTITY_H #include "neverhood/neverhood.h" +#include "neverhood/gamevars.h" #include "neverhood/graphics.h" namespace Neverhood { @@ -104,6 +105,22 @@ public: return sendMessage(messageNum, MessageParam((Entity*)param), sender); } int getPriority() const { return _priority; } + // Shortcuts for game variable access + uint32 getGlobalVar(uint32 nameHash) { + return _vm->_gameVars->getGlobalVar(nameHash); + } + void setGlobalVar(uint32 nameHash, uint32 value) { + _vm->_gameVars->setGlobalVar(nameHash, value); + } + uint32 getSubVar(uint32 nameHash, uint32 subNameHash) { + return _vm->_gameVars->getSubVar(nameHash, subNameHash); + } + void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { + _vm->_gameVars->setSubVar(nameHash, subNameHash, value); + } + void incGlobalVar(uint32 nameHash, int incrValue) { + setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue); + } protected: void (Entity::*_updateHandlerCb)(); uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 47fff17cda..9989bba727 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -103,7 +103,7 @@ void GameModule::startup() { void GameModule::createModule1500(int which) { _someFlag1 = false; - _vm->setGlobalVar(0x91080831, 0x00F10114); + setGlobalVar(0x91080831, 0x00F10114); _childObject = new Module1500(_vm, this, which, true); SetUpdateHandler(&GameModule::updateModule1500); } @@ -122,7 +122,7 @@ void GameModule::updateModule1500() { } void GameModule::createModule1000(int which) { - _vm->setGlobalVar(0x91080831, 0x03294419); + setGlobalVar(0x91080831, 0x03294419); _childObject = new Module1000(_vm, this, which); SetUpdateHandler(&GameModule::updateModule1000); } diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp new file mode 100644 index 0000000000..98ae709cfd --- /dev/null +++ b/engines/neverhood/gamevars.cpp @@ -0,0 +1,105 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/gamevars.h" + +namespace Neverhood { + +GameVars::GameVars() { + addVar(0, 0); +} + +GameVars::~GameVars() { +} + +uint32 GameVars::getGlobalVar(uint32 nameHash) { + debug("GameVars::getGlobalVar(%08X)", nameHash); + int16 varIndex = findSubVarIndex(0, nameHash); + return varIndex != -1 ? _vars[varIndex].value : 0; +} + +void GameVars::setGlobalVar(uint32 nameHash, uint32 value) { + debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value); + _vars[getSubVarIndex(0, nameHash)].value = value; +} + +uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) { + debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash); + uint32 value = 0; + int16 varIndex = findSubVarIndex(0, nameHash); + if (varIndex != -1) { + int16 subVarIndex = findSubVarIndex(varIndex, subNameHash); + if (subVarIndex != -1) { + value = _vars[subVarIndex].value; + } + } + return value; +} + +void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { + debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value); + _vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value; +} + +int16 GameVars::addVar(uint32 nameHash, uint32 value) { + debug("GameVars::addVar(%08X, %d)", nameHash, value); + GameVar gameVar; + gameVar.nameHash = nameHash; + gameVar.value = value; + gameVar.firstIndex = -1; + gameVar.nextIndex = -1; + _vars.push_back(gameVar); + return _vars.size() - 1; +} + +int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) { + debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash); + for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) { + if (_vars[nextIndex].nameHash == subNameHash) + return nextIndex; + } + return -1; +} + +int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) { + debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value); + int16 nextIndex = _vars[varIndex].firstIndex; + if (nextIndex == -1) { + _vars[varIndex].firstIndex = addVar(subNameHash, value); + return _vars[varIndex].firstIndex; + } else { + while (_vars[nextIndex].nextIndex != -1) + nextIndex = _vars[nextIndex].nextIndex; + _vars[nextIndex].nextIndex = addVar(subNameHash, value); + return _vars[nextIndex].nextIndex; + } +} + +int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) { + debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash); + int16 subVarIndex = findSubVarIndex(varIndex, subNameHash); + if (subVarIndex == -1) + subVarIndex = addSubVar(varIndex, subNameHash, 0); + return subVarIndex; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h new file mode 100644 index 0000000000..863aa1b2c1 --- /dev/null +++ b/engines/neverhood/gamevars.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_GAMEVARS_H +#define NEVERHOOD_GAMEVARS_H + +#include "common/array.h" +#include "neverhood/neverhood.h" + +namespace Neverhood { + +struct GameVar { + uint32 nameHash; + uint32 value; + int16 firstIndex, nextIndex; +}; + +class GameVars { +public: + GameVars(); + ~GameVars(); + // TODO void load(???); + // TODO void save(???); + uint32 getGlobalVar(uint32 nameHash); + void setGlobalVar(uint32 nameHash, uint32 value); + uint32 getSubVar(uint32 nameHash, uint32 subNameHash); + void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value); +protected: + Common::Array _vars; + int16 addVar(uint32 nameHash, uint32 value); + int16 findSubVarIndex(int16 varIndex, uint32 subNameHash); + int16 addSubVar(int16 varIndex, uint32 subNameHash, uint32 value); + int16 getSubVarIndex(int16 varIndex, uint32 subNameHash); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_GAMEVARS_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index eb656def42..7961bc9a2a 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -6,6 +6,7 @@ MODULE_OBJS = \ collisionman.o \ detection.o \ gamemodule.o \ + gamevars.o \ graphics.o \ klayman.o \ module.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 0d727bac8c..b3c07c9b51 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -29,7 +29,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) debug("Create Module1000(%d)", which); - _musicFileHash = _vm->getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144; + _musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144; // TODO Music18hList_add(0x03294419, 0x061880C6); // TODO Music18hList_add(0x03294419, _musicFileHash); @@ -256,7 +256,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, } void AsScene1001Door::handleMessage2000h() { - switch (_vm->getGlobalVar(0x52371C95)) { + switch (getGlobalVar(0x52371C95)) { case 0: case 1: _soundResource1.play(0x65482F03); @@ -272,11 +272,11 @@ void AsScene1001Door::handleMessage2000h() { // Nothing break; } - _vm->incGlobalVar(0x52371C95, 1); + incGlobalVar(0x52371C95, 1); } void AsScene1001Door::callback1() { - switch (_vm->getGlobalVar(0x52371C95)) { + switch (getGlobalVar(0x52371C95)) { case 1: setFileHash(0x624C0498, 4, -1); _newHashListIndex = 4; @@ -297,7 +297,7 @@ void AsScene1001Door::callback1() { } void AsScene1001Door::callback2() { - _vm->setGlobalVar(0xD217189D, 1); + setGlobalVar(0xD217189D, 1); setFileHash(0x624C0498, 6, 6); SetAnimationCallback3(&AsScene1001Door::callback3); _x = 30; @@ -367,7 +367,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ break; case 0x3002: SetMessageHandler(NULL); - _vm->setGlobalVar(0x03C698DA, 1); + setGlobalVar(0x03C698DA, 1); _surface->setVisible(false); break; } @@ -474,7 +474,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B4898); } else if (which == 2) { setRectList(0x004B49F0); - if (_vm->getGlobalVar(0xC0418A02)) { + if (getGlobalVar(0xC0418A02)) { _klayman = new KmScene1001(_vm, this, 390, 433); _klayman->setDoDeltaX(1); } else { @@ -496,7 +496,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; - if (_vm->getGlobalVar(0xD217189D) == 0) { + if (getGlobalVar(0xD217189D) == 0) { _asDoor = addSprite(new AsScene1001Door(_vm)); _asDoor->getSurface()->getClipRect().x1 = 0; _asDoor->getSurface()->getClipRect().y1 = 0; @@ -513,7 +513,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0)); - if (_vm->getGlobalVar(0x03C698DA) == 0) { + if (getGlobalVar(0x03C698DA) == 0) { staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200)); _asWindow = addSprite(new AsScene1001Window(_vm)); _asWindow->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x; @@ -529,7 +529,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1001::~Scene1001() { - // TODO _vm->setGlobalVar(0xC0418A02, _klayman->_doDeltaX); + // TODO setGlobalVar(0xC0418A02, _klayman->_doDeltaX); } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -538,7 +538,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x == 0 && _vm->getGlobalVar(0xA4014072)) { + if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { _parentModule->sendMessage(0x1009, 0, this); } break; @@ -554,7 +554,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList2(0x004B4910); messageResult = 1; } else if (param.asInteger() == 0x21E64A00) { - if (_vm->getGlobalVar(0xD217189D)) { + if (getGlobalVar(0xD217189D)) { setMessageList(0x004B48A8); } else { setMessageList(0x004B48C8); @@ -563,7 +563,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x040424D0) { _klayman->sendMessage(0x1014, _ssButton, this); } else if (param.asInteger() == 0x80006358) { - if (_vm->getGlobalVar(0x03C698DA)) { + if (getGlobalVar(0x03C698DA)) { setMessageList(0x004B4938); } else { setMessageList(0x004B4960); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 9c029190cb..77483c52ca 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -30,6 +30,7 @@ #include "neverhood/blbarchive.h" #include "neverhood/collisionman.h" #include "neverhood/gamemodule.h" +#include "neverhood/gamevars.h" #include "neverhood/graphics.h" #include "neverhood/resourceman.h" #include "neverhood/resource.h" @@ -67,6 +68,8 @@ Common::Error NeverhoodEngine::run() { _staticData = new StaticData(); _staticData->load("neverhood.dat"); + _gameVars = new GameVars(); + _screen = new Screen(this); _res = new ResourceMan(); @@ -198,6 +201,7 @@ Common::Error NeverhoodEngine::run() { delete _res; delete _screen; + delete _gameVars; delete _staticData; debug("Ok."); @@ -205,26 +209,4 @@ Common::Error NeverhoodEngine::run() { return Common::kNoError; } -uint32 NeverhoodEngine::getGlobalVar(uint32 nameHash) { - // TODO - return 0; -} - -void NeverhoodEngine::setGlobalVar(uint32 nameHash, uint32 value) { - // TODO -} - -void NeverhoodEngine::incGlobalVar(uint32 nameHash, int incrValue) { - setGlobalVar(nameHash, getGlobalVar(nameHash) - incrValue); -} - -uint32 NeverhoodEngine::getSubVar(uint32 nameHash, uint32 subNameHash) { - // TODO - return 0; -} - -void NeverhoodEngine::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { - // TODO -} - } // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 952a99d768..0070f0867e 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -41,6 +41,7 @@ struct NeverhoodGameDescription; class CollisionMan; class GameModule; +class GameVars; class ResourceMan; class Screen; class StaticData; @@ -73,6 +74,7 @@ public: uint16 _buttonState; GameState _gameState; + GameVars *_gameVars; Screen *_screen; ResourceMan *_res; GameModule *_gameModule; @@ -114,11 +116,6 @@ public: #endif GameState& gameState() { return _gameState; } - uint32 getGlobalVar(uint32 nameHash); - void setGlobalVar(uint32 nameHash, uint32 value); - void incGlobalVar(uint32 nameHash, int incrValue); - uint32 getSubVar(uint32 nameHash, uint32 subNameHash); - void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value); public: diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index d47dbb0394..1584ac32d9 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -32,7 +32,7 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) - if (_vm->getGlobalVar(0x06C02850)) { + if (getGlobalVar(0x06C02850)) { _flag1 = true; _canAbort = true; } @@ -76,9 +76,9 @@ void SmackerScene::nextVideo() { _parentModule->sendMessage(0x1009, 0, this); return; } - _fieldDF = _vm->getSubVar(0x00800410, smackerFileHash); + _fieldDF = getSubVar(0x00800410, smackerFileHash); if (!_fieldDF) { - _vm->setSubVar(0x00800410, smackerFileHash, 1); + setSubVar(0x00800410, smackerFileHash, 1); } if (_fileHashListIndex == 0) { _smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false); -- cgit v1.2.3 From c39fb81951dd1a442c9811ba7ce202fa3619be70 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 09:37:00 +0000 Subject: NEVERHOOD: More work on Scene1001/Klayman - Looking through the open window now works (mostly). --- engines/neverhood/klayman.cpp | 60 +++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 7 ++++ engines/neverhood/module1000.cpp | 72 ++++++++++++++++++++++++++++++++++++---- engines/neverhood/module1000.h | 12 +++++++ 4 files changed, 144 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index a256495da5..db88daf7ae 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -1102,4 +1102,64 @@ uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub420870() { + _status2 = 0; + _flagE5 = true; + setFileHash(0xD820A114, 0, 10); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub4208B0() { + _status2 = 1; + _flagE5 = true; + setFileHash(0xD820A114, 30, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub4208F0() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x9B250AD2, 0, 7); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EEF0); + SetSpriteCallback(NULL); +} + +uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Klayman::handleMessage41EEF0(%04X)", messageNum); + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0A2AA8E0); + } + break; + } + return messageResult; +} + +void Klayman::sub420930() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x98F88391, 4, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EEF0); + SetSpriteCallback(NULL); +} + +void Klayman::sub420830() { + _status2 = 1; + _flagE5 = true; + setFileHash(0xD820A114, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 860368a764..4d883c3462 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -58,6 +58,11 @@ public: void sub420170(); void sub4200D0(); void sub41FBC0(); + void sub420870(); + void sub4208B0(); + void sub4208F0(); + void sub420930(); + void sub420830(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -170,6 +175,8 @@ protected: uint32 handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender); + }; } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index b3c07c9b51..d31044c517 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -65,7 +65,6 @@ Module1000::~Module1000() { } void Module1000::createScene1001(int which) { - debug("createScene1501"); _vm->gameState().sceneNum = 0; _childObject = new Scene1001(_vm, this, which); // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3); @@ -77,6 +76,10 @@ void Module1000::createScene1002(int which) { } void Module1000::createScene1003(int which) { + _vm->gameState().sceneNum = 2; + _childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00); + SetUpdateHandler(&Module1000::updateScene1003); + // TODO Music18hList_play(0x061880C6, 0, 0); } void Module1000::createScene1004(int which) { @@ -89,12 +92,15 @@ void Module1000::updateScene1001() { _childObject->handleUpdate(); if (_done) { + + debug("SCENE 1001 DONE; _field20 = %d", _field20); + _done = false; delete _childObject; _childObject = NULL; if (_field20 == 2) { - // TODO createScene1003(); - // TODO _childObject->handleUpdate(); + createScene1003(0); + _childObject->handleUpdate(); } else { // TODO createScene1002(); // TODO _childObject->handleUpdate(); @@ -122,6 +128,14 @@ void Module1000::updateScene1002() { } void Module1000::updateScene1003() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1001(2); + _childObject->handleUpdate(); + } } void Module1000::updateScene1004() { @@ -181,6 +195,25 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; + case 0x481F: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger()); + sub41C7B0(); + break; + case 0x4836: if (param.asInteger() == 1) { _parentScene->sendMessage(0x2002, 0, this); @@ -197,8 +230,6 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; } - // TODO - return 0; } @@ -461,9 +492,8 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0)); _palette = new Palette(_vm, 0x4086520E); _palette->usePalette(); + // TODO _mouseCursor = addSprite(new Class433(_vm, 6520A400, 0)); - // TODO Mouse - if (which < 0) { setRectList(0x004B49F0); _klayman = new KmScene1001(_vm, this, 200, 433); @@ -587,4 +617,32 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +// Class152 + +Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) + : Scene(vm, parentModule, true), _fieldD0(-1), _fieldD2(-1) { + + _surfaceFlag = false; + + SetMessageHandler(&Class152::handleMessage); + + _background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0)); + _palette = new Palette(_vm, backgroundFileHash); + _palette->usePalette(); + // TODO _mouseCursor = addSprite(new Class435(_vm, cursorFileHash, 20, 620)); + +} + +uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index d74a0e189d..c1c7c8e4a0 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -130,6 +130,18 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// TODO: Move this to some common file since it's used several times + +class Class152 : public Scene { +public: + Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash); +protected: + // TODO: Are these used? + int16 _fieldD0; + int16 _fieldD2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1000_H */ -- cgit v1.2.3 From 9f6e6c6f7fde2e1c927deee732cb03cf34d18455 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 12:21:56 +0000 Subject: NEVERHOOD: Implement MouseCursorResource and Mouse433 mouse cursor --- engines/neverhood/gamemodule.cpp | 10 +++ engines/neverhood/gamemodule.h | 1 + engines/neverhood/graphics.cpp | 6 ++ engines/neverhood/graphics.h | 2 + engines/neverhood/module.h | 1 + engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 2 +- engines/neverhood/mouse.cpp | 131 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/mouse.h | 48 ++++++++++++++ engines/neverhood/neverhood.cpp | 1 + engines/neverhood/neverhood.h | 4 +- engines/neverhood/resource.cpp | 52 ++++++++++++++++ engines/neverhood/resource.h | 18 ++++++ engines/neverhood/scene.cpp | 26 +++----- engines/neverhood/scene.h | 2 +- 15 files changed, 286 insertions(+), 19 deletions(-) create mode 100644 engines/neverhood/mouse.cpp create mode 100644 engines/neverhood/mouse.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 9989bba727..c2d3e6d887 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -58,6 +58,16 @@ GameModule::~GameModule() { } +void GameModule::handleMouseMove(int16 x, int16 y) { + if (_childObject) { + NPoint mousePos; + mousePos.x = x; + mousePos.y = y; + debug("GameModule::handleMouseMove(%d, %d)", x, y); + _childObject->sendPointMessage(0, mousePos, this); + } +} + void GameModule::handleMouseDown(int16 x, int16 y) { if (_childObject) { NPoint mousePos; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 7fce9ebaea..876506ce0c 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -34,6 +34,7 @@ class GameModule : public Module { public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); + void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); protected: Entity *_prevChildObject; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index f6ae118fa6..68134bda97 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -101,6 +101,12 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, } } +void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum) { + if (frameNum < 3) { + mouseCursorResource.draw(frameNum, (byte*)_surface->pixels, _surface->pitch); + } +} + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 59db1e5ee5..2bddea3156 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -52,6 +52,7 @@ struct NDrawRect { class AnimResource; class SpriteResource; +class MouseCursorResource; // NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific @@ -65,6 +66,7 @@ public: void drawSpriteResource(SpriteResource &spriteResource); void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height); void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height); + void drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum); int getPriority() const { return _priority; } void setPriority(int priority) { _priority = priority; } NDrawRect& getDrawRect() { return _drawRect; } diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 7911e44072..790130a3e4 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -30,6 +30,7 @@ #include "neverhood/collisionman.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" +#include "neverhood/mouse.h" #include "neverhood/palette.h" #include "neverhood/screen.h" diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 7961bc9a2a..e39041e24d 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS = \ module.o \ module1000.o \ module1500.o \ + mouse.o \ neverhood.o \ palette.o \ resource.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index d31044c517..547f8c1ee0 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -492,7 +492,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0)); _palette = new Palette(_vm, 0x4086520E); _palette->usePalette(); - // TODO _mouseCursor = addSprite(new Class433(_vm, 6520A400, 0)); + _mouseCursor = addSprite(new Mouse433(_vm, 0x6520A400, NULL)); if (which < 0) { setRectList(0x004B49F0); diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp new file mode 100644 index 0000000000..5693048ed5 --- /dev/null +++ b/engines/neverhood/mouse.cpp @@ -0,0 +1,131 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/mouse.h" + +namespace Neverhood { + +// TODO: Use CursorMan + +Mouse433::Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect) + : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0) { + + debug("Mouse433::Mouse433(%08X)", fileHash); + + if (mouseRect) { + _mouseRect = *mouseRect; + } else { + _mouseRect.x1 = -1; + _mouseRect.y1 = -1; + _mouseRect.x2 = -1; + _mouseRect.y2 = -1; + } + _mouseCursorResource.load(fileHash); + _x = _vm->getMouseX(); + _y = _vm->getMouseY(); + if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 && + _y >= _mouseRect.y1 && _y <= _mouseRect.y2) { + _mouseCursorResource.setCursorNum(1); + } else { + _mouseCursorResource.setCursorNum(4); + } + createSurface(2000, 32, 32); + SetUpdateHandler(&Mouse433::update); + SetMessageHandler(&Mouse433::handleMessage); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = 32; + _drawRect.height = 32; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = 32; + _deltaRect.height = 32; + processDelta(); + _needRefresh = true; + updateCursor(); +} + +void Mouse433::load(uint32 fileHash) { + _mouseCursorResource.load(fileHash); + _needRefresh = true; +} + +void Mouse433::update() { + debug("Mouse433::update()"); + updateCursor(); + _frameNum++; + if (_frameNum >= 6) + _frameNum = 0; + _needRefresh = _frameNum % 2 == 0; +} + +uint32 Mouse433::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Mouse433::handleMessage(%04X)", messageNum); + uint32 messageResult = 0; + if (messageNum != 5) { + messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4002: + _x = param.asPoint().x; + _y = param.asPoint().y; + if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 && + _y >= _mouseRect.y1 && _y <= _mouseRect.y2) { + _mouseCursorResource.setCursorNum(1); + } else { + _mouseCursorResource.setCursorNum(4); + } + processDelta(); + break; + } + } else { + // TODO: Debug stuff + } + return messageResult; +} + +void Mouse433::updateCursor() { + debug("Mouse433::updateCursor()"); + + if (!_surface) + return; + + if (_doDeltaX) { + _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); + } else { + _surface->getDrawRect().x = filterX(_x + _drawRect.x); + } + + if (_doDeltaY) { + _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); + } else { + _surface->getDrawRect().y = filterY(_y + _drawRect.y); + } + + if (_needRefresh) { + _needRefresh = false; + _drawRect = _mouseCursorResource.getRect(); + _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); + } + +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h new file mode 100644 index 0000000000..d03588f4e0 --- /dev/null +++ b/engines/neverhood/mouse.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MOUSE_H +#define NEVERHOOD_MOUSE_H + +#include "neverhood/neverhood.h" +#include "neverhood/sprite.h" +#include "neverhood/graphics.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +class Mouse433 : public StaticSprite { +public: + Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect); + void load(uint32 fileHash); +protected: + MouseCursorResource _mouseCursorResource; + int _frameNum; + NRect _mouseRect; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void updateCursor(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MOUSE_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 77483c52ca..ab3cdc6a8f 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -158,6 +158,7 @@ Common::Error NeverhoodEngine::run() { case Common::EVENT_MOUSEMOVE: _mouseX = event.mouse.x; _mouseY = event.mouse.y; + _gameModule->handleMouseMove(event.mouse.x, event.mouse.y); break; case Common::EVENT_LBUTTONDOWN: diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 0070f0867e..4f6131a746 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -69,7 +69,7 @@ public: Common::RandomSource *_rnd; - int _mouseX, _mouseY; + int16 _mouseX, _mouseY; Common::KeyCode _keyState; uint16 _buttonState; @@ -116,6 +116,8 @@ public: #endif GameState& gameState() { return _gameState; } + int16 getMouseX() const { return _mouseX; } + int16 getMouseY() const { return _mouseY; } public: diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 83078afe60..841827a4bd 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -297,6 +297,58 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) { return -1; } +MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) + : _cursorSprite(vm), _cursorNum(4), _currFileHash(0) { + + _rect.width = 32; + _rect.height = 32; +} + +void MouseCursorResource::load(uint32 fileHash) { + if (_currFileHash != fileHash) { + if (_cursorSprite.load(fileHash) && !_cursorSprite.isRle() && + _cursorSprite.getDimensions().width == 96 && _cursorSprite.getDimensions().height == 224) { + debug("load ok"); + _currFileHash = fileHash; + } else { + unload(); + } + } +} + +void MouseCursorResource::unload() { + _cursorSprite.unload(); + _currFileHash = 0; + _cursorNum = 4; +} + +NDrawRect& MouseCursorResource::getRect() { + static const NPoint kCursorHotSpots[] = { + {-15, -5}, + {-17, -25}, + {-17, -30}, + {-14, -1}, + {-3, -7}, + {-30, -18}, + {-1, -18} + }; + _rect.x = kCursorHotSpots[_cursorNum].x; + _rect.y = kCursorHotSpots[_cursorNum].y; + return _rect; +} + +void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) { + if (_cursorSprite.getPixels()) { + int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment + byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32; + for (int16 yc = 0; yc < 32; yc++) { + memcpy(dest, source, 32); + source += sourcePitch; + dest += destPitch; + } + } +} + SoundResource::SoundResource(NeverhoodEngine *vm) : _vm(vm) { } diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 7540956954..b2a98c7670 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -38,6 +38,8 @@ public: void unload(); const NDimensions& getDimensions() { return _dimensions; } NPoint& getPosition() { return _position; } + bool isRle() const { return _rle; } + byte *getPixels() const { return _pixels; } protected: NeverhoodEngine *_vm; int _resourceHandle; @@ -99,6 +101,22 @@ protected: Common::Array _frames; }; +class MouseCursorResource { +public: + MouseCursorResource(NeverhoodEngine *vm); + void load(uint32 fileHash); + void unload(); + NDrawRect& getRect(); + void draw(int frameNum, byte *dest, int destPitch); + int getCursorNum() const { return _cursorNum; } + void setCursorNum(int value) { _cursorNum = value; } +protected: + int _cursorNum; + SpriteResource _cursorSprite; + NDrawRect _rect; + uint32 _currFileHash; +}; + // TODO: Dummy class atm class SoundResource { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index ebf92d8b63..3851cfa3ad 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -38,7 +38,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _rectList = NULL; // TODO _someRects = NULL; _klayman = NULL; - // TODO _mouseSprite = NULL; + _mouseCursor = NULL; _palette = NULL; _background = NULL; // TODO _field_8E = -1; @@ -221,11 +221,9 @@ void Scene::update() { uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0: // mouse moved -#if 0 - if (_mouseSprite && _mouseSprite->hasMessageHandler()) - _mouseSprite->sendMessage(0x4002, param, this); - queryPositionSomeRects(param.asPoint().x, param.asPoint().y); -#endif + if (_mouseCursor && _mouseCursor->hasMessageHandler()) + _mouseCursor->sendMessage(0x4002, param, this); + // TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y); break; case 1: // mouse clicked debug("mouse clicked"); @@ -268,20 +266,16 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s } break; case 0x101D: -#if 0 - if (_mouseSprite) { - _prevVisible = _mouseSprite->_drawSurface->_visible; - _mouseSprite->_drawSurface->_visible = false; + if (_mouseCursor) { + _prevVisible = _mouseCursor->getSurface()->getVisible(); + _mouseCursor->getSurface()->setVisible(false); } -#endif break; case 0x101E: -#if 0 - if (_prevVisible && _mouseSprite) { - _mouseSprite->_drawSurface->_visible = true; - _mouseSprite->sendMessage(0x4002, g_Screen->_mousePos, this); + if (_prevVisible && _mouseCursor) { + _mouseCursor->getSurface()->setVisible(false); + // TODO _mouseCursor->sendMessage(0x4002, g_Screen->_mousePos, this); } -#endif break; case 0x1022: setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger()); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 34f3c1e759..0878380ccd 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -68,7 +68,7 @@ protected: // TODO 00000088 someRects dd ? // TODO 0000008C someRectsCount dw ? // TODO 0000008E field_8E dw ? - // TODO 00000094 mouseSprite dd ? + Sprite *_mouseCursor; Klayman *_klayman; Palette *_palette; Background *_background; -- cgit v1.2.3 From 626cea6d1c516d4da1f8c6aad1bdb0552e54bf91 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 12:53:28 +0000 Subject: NEVERHOOD: Implement Mouse435 --- engines/neverhood/module1000.cpp | 2 +- engines/neverhood/mouse.cpp | 98 +++++++++++++++++++++++++++++++++++++++- engines/neverhood/mouse.h | 14 ++++++ 3 files changed, 112 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 547f8c1ee0..bc52cfd573 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -629,7 +629,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF _background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0)); _palette = new Palette(_vm, backgroundFileHash); _palette->usePalette(); - // TODO _mouseCursor = addSprite(new Class435(_vm, cursorFileHash, 20, 620)); + _mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620)); } diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 5693048ed5..c753183269 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -112,7 +112,103 @@ void Mouse433::updateCursor() { _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); } else { _surface->getDrawRect().x = filterX(_x + _drawRect.x); - } + } + + if (_doDeltaY) { + _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); + } else { + _surface->getDrawRect().y = filterY(_y + _drawRect.y); + } + + if (_needRefresh) { + _needRefresh = false; + _drawRect = _mouseCursorResource.getRect(); + _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); + } + +} + +Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) + : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) { + + debug("Mouse435::Mouse435(%08X)", fileHash); + + _mouseCursorResource.load(fileHash); + _x = _vm->getMouseX(); + _y = _vm->getMouseY(); + if (_x <= _x1) { + _mouseCursorResource.setCursorNum(6); + } else if (_x >= _x2) { + _mouseCursorResource.setCursorNum(5); + } else { + _mouseCursorResource.setCursorNum(4); + } + createSurface(2000, 32, 32); + SetUpdateHandler(&Mouse435::update); + SetMessageHandler(&Mouse435::handleMessage); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = 32; + _drawRect.height = 32; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = 32; + _deltaRect.height = 32; + processDelta(); + _needRefresh = true; + updateCursor(); +} + +void Mouse435::load(uint32 fileHash) { + _mouseCursorResource.load(fileHash); + _needRefresh = true; +} + +void Mouse435::update() { + debug("Mouse435::update()"); + updateCursor(); + _frameNum++; + if (_frameNum >= 6) + _frameNum = 0; + _needRefresh = _frameNum % 2 == 0; +} + +uint32 Mouse435::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Mouse435::handleMessage(%04X)", messageNum); + uint32 messageResult = 0; + if (messageNum != 5) { + messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4002: + _x = param.asPoint().x; + _y = param.asPoint().y; + if (_x <= _x1) { + _mouseCursorResource.setCursorNum(6); + } else if (_x >= _x2) { + _mouseCursorResource.setCursorNum(5); + } else { + _mouseCursorResource.setCursorNum(4); + } + processDelta(); + break; + } + } else { + // TODO: Debug stuff + } + return messageResult; +} + +void Mouse435::updateCursor() { + debug("Mouse435::updateCursor()"); + + if (!_surface) + return; + + if (_doDeltaX) { + _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); + } else { + _surface->getDrawRect().x = filterX(_x + _drawRect.x); + } if (_doDeltaY) { _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index d03588f4e0..4bda936a91 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -43,6 +43,20 @@ protected: void updateCursor(); }; +class Mouse435 : public StaticSprite { +public: + Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2); + void load(uint32 fileHash); +protected: + MouseCursorResource _mouseCursorResource; + int _frameNum; + int16 _x1; + int16 _x2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void updateCursor(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MOUSE_H */ -- cgit v1.2.3 From be8d542264288343a4d60936f73f94906fc0e181 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 18:46:21 +0000 Subject: NEVERHOOD: Updated tables.h with data from Scene1002 --- devtools/create_neverhood/tables.h | 20 ++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 494 -> 2138 bytes 2 files changed, 20 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 6f1fc48250..d6e230af5e 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -23,6 +23,8 @@ static const uint32 hitRectListOffsets[] = { // Scene1001 0x004B4858, + // Scene1002 + 0x004B4134, 0 }; @@ -30,6 +32,10 @@ static const uint32 rectListOffsets[] = { // Scene1001 1, 0x004B49F0, 1, 0x004B4A00, + // Scene1002 + 3, 0x004B43A0, + 1, 0x004B4418, + 3, 0x004B43A0, 0, 0 }; @@ -44,6 +50,20 @@ static const uint32 messageListOffsets[] = { 1, 0x004B4960, 4, 0x004B48A8, 3, 0x004B48C8, + // Scene1002 + 1, 0x004B4270, + 1, 0x004B4478, + 3, 0x004B4298, + 1, 0x004B4470, + 4, 0x004B4428, + 5, 0x004B4448, + 1, 0x004B44B8, + 2, 0x004B44A8, + 1, 0x004B44A0, + 2, 0x004B43D0, + 4, 0x004B4480, + 2, 0x004B41E0, + 5, 0x004B4148, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index bbd7419ec8..99e3fcc1ca 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 92e08f21edfe48e6eb2a6c0b4f2a481f9df9827d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 18:47:03 +0000 Subject: NEVERHOOD: Start with Scene1002 (a lot incomplete) --- engines/neverhood/background.cpp | 2 - engines/neverhood/klayman.cpp | 116 +++++++++ engines/neverhood/klayman.h | 9 + engines/neverhood/module1000.cpp | 515 +++++++++++++++++++++++++++++---------- engines/neverhood/module1000.h | 67 ++++- engines/neverhood/neverhood.cpp | 6 + engines/neverhood/neverhood.h | 1 + engines/neverhood/sprite.cpp | 4 +- engines/neverhood/sprite.h | 2 + 9 files changed, 587 insertions(+), 135 deletions(-) diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp index c47acd15a9..0c522dbe75 100644 --- a/engines/neverhood/background.cpp +++ b/engines/neverhood/background.cpp @@ -65,7 +65,6 @@ DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int // TODO _spriteResource.load(calcHash(fileName)); createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _surface->drawSpriteResource(_spriteResource); - } DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority) @@ -74,7 +73,6 @@ DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objec _spriteResource.load(fileHash); createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _surface->drawSpriteResource(_spriteResource); - } void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 height) { diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index db88daf7ae..9acda937e2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -49,6 +49,8 @@ static const KlaymanTableItem klaymanTable3[] = { }; #endif +// Klayman + Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority) : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), @@ -1162,4 +1164,118 @@ void Klayman::sub420830() { SetSpriteCallback(NULL); } +// KmScene1001 + +KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { +} + +uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { + debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum); + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub4211B0)); + } + break; + case 0x480D: + setCallback2(AnimationCallback(&KmScene1001::sub44FA50)); + break; + case 0x4812: + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + }else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + + case 0x481B: + // TODO: It's not really a point but an x1/x2 pair + if (param.asPoint().x != 0) { + sub41CC40(param.asPoint().x, param.asPoint().y); + } else { + error("// TODO sub41CCE0(param.asPoint().y);"); + // TODO sub41CCE0(param.asPoint().y); + } + break; + + case 0x481F: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger()); + sub41C7B0(); + break; + + case 0x4836: + if (param.asInteger() == 1) { + _parentScene->sendMessage(0x2002, 0, this); + setCallback2(AnimationCallback(&Klayman::sub4211F0)); + } + break; + + case 0x483F: + sub41CD00(param.asInteger()); + break; + + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + + return 0; +} + +void KmScene1001::sub44FA50() { + if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x00648953, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1001::handleMessage44FA00); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + } +} + +uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("KmScene1001::handleMessage44FA00(%04X)", messageNum); + uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x480F, 0, this); + } + break; + } + return messageResult; +} + + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 4d883c3462..24f70e1fdf 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -179,6 +179,15 @@ protected: }; +class KmScene1001 : public Klayman { +public: + KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub44FA50(); + uint32 handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index bc52cfd573..f4b16945ec 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -53,7 +53,9 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) break; } } else if (which == 0) { - createScene1001(0); + //createScene1001(0); + // DEBUG: Jump to room + createScene1002(0); } else if (which == 1) { createScene1002(1); } @@ -73,6 +75,11 @@ void Module1000::createScene1001(int which) { } void Module1000::createScene1002(int which) { + _vm->gameState().sceneNum = 1; + _childObject = new Scene1002(_vm, this, which); + // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); + // TODO Music18hList_play(0x061880C6, 0, 0, 1); + SetUpdateHandler(&Module1000::updateScene1002); } void Module1000::createScene1003(int which) { @@ -125,6 +132,51 @@ void Module1000::updateScene1001() { } void Module1000::updateScene1002() { + + _childObject->handleUpdate(); + + if (_done) { + + debug("SCENE 1002 DONE; _field20 = %d", _field20); + + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + _parentModule->sendMessage(0x1009, 0, this); + } else if (_field20 == 2) { + // TODO createScene1004(0); + // TODO _childObject->handleUpdate(); + } else { + createScene1001(1); + _childObject->handleUpdate(); + } + } + + if (_field24 >= 0) { + if (_field24 == 1) { + _parentModule->sendMessage(0x100A, 0, this); + } else if (_field24 == 2) { + // TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1); + } else { + // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable3); + } + _field24 = -1; + } + + if (_field26 >= 0) { + if (_field26 == 1) { + _parentModule->sendMessage(0x1023, 0, this); + } else { + // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); + } + _field26 = -1; + } + + if (_field28 >= 0) { + _field28 = -1; + } + } void Module1000::updateScene1003() { @@ -146,117 +198,6 @@ void Module1000::updateScene1005() { // Scene1001 -KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { -} - -uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { - debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum); - switch (messageNum) { - case 0x4001: - case 0x4800: - sub41C930(param.asPoint().x, false); - break; - case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); - break; - case 0x4804: - if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub4211B0)); - } - break; - case 0x480D: - setCallback2(AnimationCallback(&KmScene1001::sub44FA50)); - break; - case 0x4812: - setCallback2(AnimationCallback(&Klayman::sub41FF80)); - break; - case 0x4816: - if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); - } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); - }else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - sub41C7B0(); - break; - - case 0x481B: - // TODO: It's not really a point but an x1/x2 pair - if (param.asPoint().x != 0) { - sub41CC40(param.asPoint().x, param.asPoint().y); - } else { - error("// TODO sub41CCE0(param.asPoint().y);"); - // TODO sub41CCE0(param.asPoint().y); - } - break; - - case 0x481F: - if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); - } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); - } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); - } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); - } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); - } - break; - - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger()); - sub41C7B0(); - break; - - case 0x4836: - if (param.asInteger() == 1) { - _parentScene->sendMessage(0x2002, 0, this); - setCallback2(AnimationCallback(&Klayman::sub4211F0)); - } - break; - - case 0x483F: - sub41CD00(param.asInteger()); - break; - - case 0x4840: - sub41CD70(param.asInteger()); - break; - } - - return 0; -} - -void KmScene1001::sub44FA50() { - if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) { - _status2 = 2; - _flagE5 = false; - setFileHash(0x00648953, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1001::handleMessage44FA00); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - } -} - -uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("KmScene1001::handleMessage44FA00(%04X)", messageNum); - uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x480F, 0, this); - } - break; - } - return messageResult; -} - AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) { @@ -483,7 +424,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _name = "Scene1001"; - Sprite *staticSprite1; + Sprite *tempSprite; SetMessageHandler(&Scene1001::handleMessage); @@ -518,19 +459,19 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } addSprite(_klayman); - staticSprite1 = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300)); + tempSprite = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300)); // TODO: This sucks somehow, find a better way _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; if (getGlobalVar(0xD217189D) == 0) { _asDoor = addSprite(new AsScene1001Door(_vm)); _asDoor->getSurface()->getClipRect().x1 = 0; _asDoor->getSurface()->getClipRect().y1 = 0; - _asDoor->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; + _asDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; _asDoor->getSurface()->getClipRect().y2 = 480; } else { _asDoor = NULL; @@ -544,12 +485,12 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0)); if (getGlobalVar(0x03C698DA) == 0) { - staticSprite1 = addSprite(new StaticSprite(_vm, 0x8C066150, 200)); + tempSprite = addSprite(new StaticSprite(_vm, 0x8C066150, 200)); _asWindow = addSprite(new AsScene1001Window(_vm)); - _asWindow->getSurface()->getClipRect().x1 = staticSprite1->getSurface()->getDrawRect().x; - _asWindow->getSurface()->getClipRect().y1 = staticSprite1->getSurface()->getDrawRect().y; - _asWindow->getSurface()->getClipRect().x2 = staticSprite1->getSurface()->getDrawRect().x + staticSprite1->getSurface()->getDrawRect().width; - _asWindow->getSurface()->getClipRect().y2 = staticSprite1->getSurface()->getDrawRect().y + staticSprite1->getSurface()->getDrawRect().height; + _asWindow->getSurface()->getClipRect().x1 = tempSprite->getSurface()->getDrawRect().x; + _asWindow->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; + _asWindow->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; + _asWindow->getSurface()->getClipRect().y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; } else { _asWindow = NULL; } @@ -559,7 +500,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1001::~Scene1001() { - // TODO setGlobalVar(0xC0418A02, _klayman->_doDeltaX); + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX()); } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -617,6 +558,335 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +// Scene1002 + +SsScene1002LadderArch::SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 0x152C1313, 1015), _parentScene(parentScene) { + + SetMessageHandler(&SsScene1002LadderArch::handleMessage); +} + +uint32 SsScene1002LadderArch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x482A: + _parentScene->sendMessage(0x1022, 995, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1015, this); + break; + } + return messageResult; +} + +Class599::Class599(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 0x316C4BB4, 1015), _parentScene(parentScene) { + + SetMessageHandler(&Class599::handleMessage); +} + +uint32 Class599::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x482A: + _parentScene->sendMessage(0x1022, 995, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1015, this); + break; + } + return messageResult; +} + +Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), + _flag1B4(false), _flag1BE(false) { + + static const uint32 kClass426FileHashList[] = { + 0x00412692, + 0x140B60BE + }; + + NRect tempClipRect; + Sprite *tempSprite; + + // TODO _field1B6 = -1; + // TODO _resourceTable8.setResourceList(0x004B4110); + // TODO _resourceTable7.setResourceList(0x004B4100); + // TODO _resourceTable6.setResourceList(0x004B40E8); + // TODO _resourceTable5.setResourceList(0x004B40C0); + // TODO _resourceTable4.setResourceList(0x004B4080); + // TODO _resourceTable3.setResourceList(0x004B4060); + // TODO _resourceTable2.setResourceList(0x004B4000, true); + // TODO _resourceTable1.setResourceList(0x004B3F90, true); + // TODO _resourceTable1.loadSome(3000); + + SetUpdateHandler(&Scene1002::update); + SetMessageHandler(&Scene1002::handleMessage); + + _vm->_collisionMan->setHitRects(0x004B4134); + + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x12C23307, 0, 0)); + _palette = new Palette(_vm, 0x12C23307); + _palette->usePalette(); + + _flag = false; + + addSprite(new StaticSprite(_vm, 0x06149428, 1100)); + addSprite(new StaticSprite(_vm, 0x312C8774, 1100)); + + _ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this)); + _ssLadderArchPart1 = addSprite(new StaticSprite(_vm, 0x060000A0, 1200)); + _ssLadderArchPart2 = addSprite(new StaticSprite(_vm, 0xB2A423B0, 1100)); + _ssLadderArchPart3 = addSprite(new StaticSprite(_vm, 0x316E0772, 1100)); + + _class599 = addSprite(new Class599(_vm, this)); + +// _ssLadderArchPart3->getSurface()->getDrawRect().x = 200; + +#if 0 + if (which < 0) { + if (_vm->_gameState.field2 == 0) { + _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226)); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4270); + // TODO + // TODO _klayman->setRepl(64, 0); + } else { + _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435)); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4270); + // TODO + } + } else { + if (which == 1) { + _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435)); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4478); + // TODO + _vm->_gameState.field2 = 1; + } else if (which == 2) { + _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645)); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4298); + // TODO + _vm->_gameState.field2 = 1; + _klayman->sendMessage(0x4820, 0, this); + } else { + _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226)); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4470); + // TODO + _class479 = addSprite(new Class479(_vm, this, _klayman)); + // TODO + // TODO _klayman->setRepl(64, 0); + _vm->_gameState.field2 = 0; + } + } +#endif + + _mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL)); + + // TODO + + addSprite(new StaticSprite(_vm, 0xB3242310, 825)); + + // TODO + +#if 0 + + _class502_1 = addSprite(new Class502(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false); + _class502_2 = addSprite(new Class502(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false); + _class502_3 = addSprite(new Class502(_vm, this, true, 201, 370, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0); + _class502_4 = addSprite(new Class502(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false); + _class502_5 = addSprite(new Class502(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false); + + _class431 = addSprite(new Class431(_vm, tempClipRect)); + + tempSprite = addSprite(new Class505(_vm, tempClipRect)); + + _class504 = addSprite(new Class504(_vm, tempClipRect, this, _class431, tempSprite)); + _class426 = addSprite(new Class426(_vm, this, kClass426FileHashList, 800, 0)); + _class503 = addSprite(new Class503(_vm, this, _klayman, false)); + + _vm->_collisionMan->addSprite(_class503); + _klayman->sendEntityMessage(0x2007, _class503, this); + + _class506 = addSprite(new Class506(_vm)); + + setRectList(0x004B43A0); + +#endif + +#if 0 // TODO + _soundResource2.load(0x60755842); + _soundResource3.load(0x616D5821); +#endif + +} + +Scene1002::~Scene1002() { +} + +void Scene1002::update() { + Scene::update(); +#if 0 // TODO: Waiting for Klayman... + if (!_flag1B4 && _klayman->getY() > 230) { + // TODO + deleteSprite(&_ssLadderArchPart3); + _klayman->clearRepl(); + _flag1B4 = true; + _vm->_gameState.field2 = 1; + } + + if (_flag1BE && _klayman->getY() > 422) { + _parentModule->sendMessage(0x1024, 1, this); + _flag1BE = false; + } + +#endif + +} + +uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { + setGlobalVar(0x8306F218, 1); + setGlobalVar(0x1B144052, 3); + _parentModule->sendMessage(0x1009, 1, this); + } + break; + case 0x000D: + if (param.asInteger() == 0x48848178) { + setGlobalVar(0x8306F218, 1); + setGlobalVar(0x1B144052, 3); + _parentModule->sendMessage(0x1009, 1, this); + } + messageResult = 1; + break; + case 0x100D: + if (param.asInteger() == 0xE6EE60E1) { + if (getGlobalVar(0x8306F218)) { + setMessageList(0x004B4428); + } else { + // TODO _resourceTable3.load(); + setMessageList(0x004B4448); + } + messageResult = 1; + } else if (param.asInteger() == 0x4A845A00) { + // TODO _resourceTable4.load(); + _klayman->sendEntityMessage(0x1014, _class502_1, this); + } else if (param.asInteger() == 0x43807801) { + // TODO _resourceTable4.load(); + _klayman->sendEntityMessage(0x1014, _class502_2, this); + } else if (param.asInteger() == 0x46C26A01) { + if (getGlobalVar(0x8306F218)) { + setMessageList(0x004B44B8); + } else { + _klayman->sendEntityMessage(0x1014, _class502_3, this); + if (_class503->getX() - 10 < 366 && _class503->getX() + 10 > 366) { + setGlobalVar(0x2B514304, 1); + setMessageList(0x004B44A8); + } else { + // TODO _resourceTable5.load(); + setMessageList(0x004B44A0); + } + } + messageResult = 1; + } else if (param.asInteger() == 0x468C7B11) { + // TODO _resourceTable4.load(); + _klayman->sendEntityMessage(0x1014, _class502_4, this); + } else if (param.asInteger() == 0x42845B19) { + // TODO _resourceTable4.load(); + _klayman->sendEntityMessage(0x1014, _class502_5, this); + } else if (param.asInteger() == 0xC0A07458) { + _klayman->sendEntityMessage(0x1014, _class426, this); + } + break; + case 0x1024: + if (param.asInteger() == 1) { + // TODO _resourceTable3.load(); + } else if (param.asInteger() == 3) { + // TODO _resourceTable2.load(); + } + _parentModule->sendMessage(0x1024, param, this); + break; + case 0x2000: + if (_flag) { + setMessageList2(0x004B43D0); + } else { + if (_klayman->getY() > 420) { + _klayman->sendEntityMessage(0x1014, _class503, this); + setMessageList2(0x004B4480); + } else if (_klayman->getY() > 227) { + setMessageList2(0x004B41E0); + } else { + setMessageList2(0x004B4148); + } + } + break; + case 0x2002: + _messageList = NULL; + break; + case 0x2005: + _flag = true; + setRectList(0x004B4418); + break; + case 0x2006: + _flag = false; + setRectList(0x004B43A0); + break; + case 0x4806: + _parentModule->sendMessage(0x1024, 2, this); + _flag1BE = true; + if (sender == _class502_1) { + setGlobalVar(0x4DE80AC0, 0); + _soundResource1.play(0x665198C0); + } else if (sender == _class502_2) { + setGlobalVar(0x4DE80AC0, 0); + _soundResource1.play(0xE2D389C0); + } else if (sender == _class502_3) { + setGlobalVar(0x4DE80AC0, 0); + _soundResource2.play(); + _class431->sendMessage(0x4808, 0, this); + _class506->sendMessage(0x4808, 0, this); + } else if (sender == _class502_4) { + setGlobalVar(0x4DE80AC0, 0); + _soundResource1.play(0xE0558848); + } else if (sender == _class502_5) { + setGlobalVar(0x4DE80AC0, 1); + _soundResource1.play(0x44014282); + } + break; + case 0x4807: + if (sender == _class502_3) { + _soundResource3.play(); + _class431->sendMessage(0x4809, 0, this); + _class506->sendMessage(0x4809, 0, this); + } else if (sender == _class503) { + if (getGlobalVar(0x8306F218)) { + _class502_3->sendMessage(0x4807, 0, this); + } + } + break; + case 0x480B: + _klayman->sendEntityMessage(0x1014, _class504, this); + break; + case 0x480F: + setGlobalVar(0x4DE80AC0, 0); + _soundResource2.play(); + _class431->sendMessage(0x4808, 0, this); + _class506->sendMessage(0x4808, 0, this); + break; + } + return messageResult; +} + // Class152 Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) @@ -630,7 +900,6 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF _palette = new Palette(_vm, backgroundFileHash); _palette->usePalette(); _mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620)); - } uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index c1c7c8e4a0..c5c03b5571 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -55,15 +55,6 @@ protected: // Scene1001 -class KmScene1001 : public Klayman { -public: - KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub44FA50(); - uint32 handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender); -}; - class AsScene1001Door : public AnimatedSprite { public: AsScene1001Door(NeverhoodEngine *vm); @@ -142,6 +133,64 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// Scene1002 + +class SsScene1002LadderArch : public StaticSprite { +public: + SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Class599 : public StaticSprite { +public: + Class599(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1002 : public Scene { +public: + Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1002(); +protected: + // TODO ResourceTable _resourceTable1; + // TODO ResourceTable _resourceTable2; + // TODO ResourceTable _resourceTable3; + // TODO ResourceTable _resourceTable4; + // TODO ResourceTable _resourceTable5; + // TODO ResourceTable _resourceTable6; + // TODO ResourceTable _resourceTable7; + // TODO ResourceTable _resourceTable8; + Sprite *_class502_1; + Sprite *_class502_2; + Sprite *_class502_3; + Sprite *_class502_4; + Sprite *_class502_5; + Sprite *_class431; + Sprite *_class504; + Sprite *_class503; + Sprite *_ssLadderArch; + Sprite *_ssLadderArchPart1; + Sprite *_ssLadderArchPart2; + Sprite *_ssLadderArchPart3; + Sprite *_class599; + Sprite *_class478; + Sprite *_class479; + Sprite *_class506; + Sprite *_class426; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + bool _flag1B4; + bool _flag1BE; + bool _flag; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1000_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index ab3cdc6a8f..abae6eb70a 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -65,6 +65,12 @@ Common::Error NeverhoodEngine::run() { _isSaveAllowed = false; + _mouseX = 0; + _mouseY = 0; + + _gameState.sceneNum = 0; + _gameState.field2 = 0; + _staticData = new StaticData(); _staticData->load("neverhood.dat"); diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 4f6131a746..38d773a324 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -48,6 +48,7 @@ class StaticData; struct GameState { int sceneNum; + int field2; }; class NeverhoodEngine : public ::Engine { diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 713bfeffe6..222368c94a 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -106,10 +106,12 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) : Sprite(vm, 0), _spriteResource(vm) { + + debug("StaticSprite::StaticSprite(%08X)", fileHash); _name = "StaticSprite"; init(fileHash, surfacePriority, x, y, width, height); - + } void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 16f741afaa..0368d2d3a6 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -47,6 +47,8 @@ public: bool isPointInside(int16 x, int16 y); int16 getX() const { return _x; } int16 getY() const { return _y; } + bool isDoDeltaX() const { return _doDeltaX; } + bool isDoDeltaY() const { return _doDeltaY; } protected: void (Sprite::*_spriteUpdateCb)(); int16 (Sprite::*_filterXCb)(int16); -- cgit v1.2.3 From ffe024844b2f97fe4e735603308e505a7bcd982d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 11 Jul 2011 22:24:00 +0000 Subject: NEVERHOOD: More work on Scene1002 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 2 +- engines/neverhood/module1000.cpp | 288 +++++++++++++++++++++++++++++++----- engines/neverhood/module1000.h | 37 ++++- engines/neverhood/scene.cpp | 2 +- engines/neverhood/screen.cpp | 16 -- engines/neverhood/smackerplayer.cpp | 2 +- 7 files changed, 290 insertions(+), 59 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c2d3e6d887..4354797695 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -33,7 +33,7 @@ GameModule::GameModule(NeverhoodEngine *vm) // Other initializations moved to actual engine class - // TODO + // TODO .text:0048AD96 // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 9acda937e2..562624d57f 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { - // TODO + // TODO .text:0041C4D3 DirtySurface createSurface(surfacePriority, 320, 200); _x = x; _y = y; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index f4b16945ec..703796e51f 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -598,6 +598,230 @@ uint32 Class599::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } +AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _flag1(flag1) { + + SetUpdateHandler(&AsScene1002Ring::update); + + if (flag1) { + createSurface(990, 68, 314); + if (flag2) { + setFileHash(0x04103090, 0, -1); + SetMessageHandler(&AsScene1002Ring::handleMessage447930); + } else { + setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); + SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); + } + } else { + createSurface(990, 68, 138); + setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); + SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); + } + + debug("clipY1 = %d", clipY1); + + _surface->getClipRect().x1 = 0; + _surface->getClipRect().y1 = clipY1; + _surface->getClipRect().x2 = 640; + _surface->getClipRect().y2 = 480; + + _x = x; + _y = y; + + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + +} + +void AsScene1002Ring::update() { + AnimatedSprite::updateAnim(); + AnimatedSprite::updatePosition(); +} + +uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4806: + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + _parentScene->sendMessage(0x4806, 0, this); + SetMessageHandler(&AsScene1002Ring::handleMessage447760); + if (_flag1) { + setFileHash(0x87502558, 0, -1); + } else { + setFileHash(0x80DD4010, 0, -1); + } + break; + case 0x480F: + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + _parentScene->sendMessage(0x480F, 0, this); + SetMessageHandler(&AsScene1002Ring::handleMessage447890); + setFileHash(0x861A2020, 0, -1); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + if (_flag1) { + setFileHash(0x78D0A812, 0, -1); + SetMessageHandler(&AsScene1002Ring::handleMessage447930); + } else { + setFileHash(0xB85D2A10, 0, -1); + SetMessageHandler(&AsScene1002Ring::handleMessage447930); + } + break; + case 0x4807: + _parentScene->sendMessage(0x4807, 0, this); + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + setFileHash(0x8258A030, 0, -1); + SetMessageHandler(&AsScene1002Ring::handleMessage447A00); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + setFileHash(0x04103090, 0, -1); + SetMessageHandler(&AsScene1002Ring::handleMessage447930); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4807: + _parentScene->sendMessage(0x4807, 0, this); + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + setFileHash(0x8258A030, 0, -1); + SetMessageHandler(&AsScene1002Ring::handleMessage447A00); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage4475E0(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x05410F72) { + _soundResource.play(0x21EE40A9); + } + break; + case 0x3002: + setFileHash(0xA85C4011, 0, -1); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) + : StaticSprite(vm, 1200) { + + _spriteResource.load2(0x1052370F); + createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _surface->getClipRect() = clipRect; + + _x = 526; + + if (getGlobalVar(0x8306F218)) { + _y = 49; + } else { + _y = 239; + } + + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + + _needRefresh = true; + + SetUpdateHandler(&AsScene1002Door::update); + SetMessageHandler(&AsScene1002Door::handleMessage); + SetSpriteCallback(NULL); + StaticSprite::update(); + +} + +void AsScene1002Door::update() { + handleSpriteUpdate(); + StaticSprite::update(); +} + +uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + setGlobalVar(0x8306F218, 1); + SetSpriteCallback(&AsScene1002Door::spriteUpdate447D10); + break; + case 0x4809: + setGlobalVar(0x8306F218, 0); + SetSpriteCallback(&AsScene1002Door::spriteUpdate447D40); + break; + } + return messageResult; +} + +void AsScene1002Door::spriteUpdate447D10() { + if (_y > 49) { + _y -= 8; + if (_y < 49) { + SetSpriteCallback(NULL); + _y = 49; + } + _needRefresh = true; + } +} + +void AsScene1002Door::spriteUpdate447D40() { + if (_y < 239) { + _y += 8; + if (_y > 239) { + SetSpriteCallback(NULL); + _y = 239; + } + _needRefresh = true; + } +} + Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _flag1B4(false), _flag1BE(false) { @@ -644,28 +868,26 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class599 = addSprite(new Class599(_vm, this)); -// _ssLadderArchPart3->getSurface()->getDrawRect().x = 200; - #if 0 if (which < 0) { if (_vm->_gameState.field2 == 0) { _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); - // TODO + // TODO // TODO _klayman->setRepl(64, 0); } else { _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); - // TODO + // TODO } } else { if (which == 1) { _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); - // TODO + // TODO _vm->_gameState.field2 = 1; } else if (which == 2) { _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645)); @@ -689,25 +911,25 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL)); - // TODO - - addSprite(new StaticSprite(_vm, 0xB3242310, 825)); + tempSprite = addSprite(new StaticSprite(_vm, 0xB3242310, 825)); + tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x; + tempClipRect.y1 = tempSprite->getSurface()->getDrawRect().y; + tempClipRect.x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + tempClipRect.y2 = _ssLadderArchPart2->getSurface()->getDrawRect().y + _ssLadderArchPart2->getSurface()->getDrawRect().height; - // TODO + _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false)); + _asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false)); + _asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0)); + _asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false)); + _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false)); + _asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect)); + #if 0 - _class502_1 = addSprite(new Class502(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false); - _class502_2 = addSprite(new Class502(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false); - _class502_3 = addSprite(new Class502(_vm, this, true, 201, 370, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0); - _class502_4 = addSprite(new Class502(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false); - _class502_5 = addSprite(new Class502(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false); - - _class431 = addSprite(new Class431(_vm, tempClipRect)); - tempSprite = addSprite(new Class505(_vm, tempClipRect)); - _class504 = addSprite(new Class504(_vm, tempClipRect, this, _class431, tempSprite)); + _class504 = addSprite(new Class504(_vm, tempClipRect, this, _asDoor, tempSprite)); _class426 = addSprite(new Class426(_vm, this, kClass426FileHashList, 800, 0)); _class503 = addSprite(new Class503(_vm, this, _klayman, false)); @@ -780,15 +1002,15 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit messageResult = 1; } else if (param.asInteger() == 0x4A845A00) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _class502_1, this); + _klayman->sendEntityMessage(0x1014, _asRing1, this); } else if (param.asInteger() == 0x43807801) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _class502_2, this); + _klayman->sendEntityMessage(0x1014, _asRing2, this); } else if (param.asInteger() == 0x46C26A01) { if (getGlobalVar(0x8306F218)) { setMessageList(0x004B44B8); } else { - _klayman->sendEntityMessage(0x1014, _class502_3, this); + _klayman->sendEntityMessage(0x1014, _asRing3, this); if (_class503->getX() - 10 < 366 && _class503->getX() + 10 > 366) { setGlobalVar(0x2B514304, 1); setMessageList(0x004B44A8); @@ -800,10 +1022,10 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit messageResult = 1; } else if (param.asInteger() == 0x468C7B11) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _class502_4, this); + _klayman->sendEntityMessage(0x1014, _asRing4, this); } else if (param.asInteger() == 0x42845B19) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _class502_5, this); + _klayman->sendEntityMessage(0x1014, _asRing5, this); } else if (param.asInteger() == 0xC0A07458) { _klayman->sendEntityMessage(0x1014, _class426, this); } @@ -844,33 +1066,33 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x4806: _parentModule->sendMessage(0x1024, 2, this); _flag1BE = true; - if (sender == _class502_1) { + if (sender == _asRing1) { setGlobalVar(0x4DE80AC0, 0); _soundResource1.play(0x665198C0); - } else if (sender == _class502_2) { + } else if (sender == _asRing2) { setGlobalVar(0x4DE80AC0, 0); _soundResource1.play(0xE2D389C0); - } else if (sender == _class502_3) { + } else if (sender == _asRing3) { setGlobalVar(0x4DE80AC0, 0); _soundResource2.play(); - _class431->sendMessage(0x4808, 0, this); + _asDoor->sendMessage(0x4808, 0, this); _class506->sendMessage(0x4808, 0, this); - } else if (sender == _class502_4) { + } else if (sender == _asRing4) { setGlobalVar(0x4DE80AC0, 0); _soundResource1.play(0xE0558848); - } else if (sender == _class502_5) { + } else if (sender == _asRing5) { setGlobalVar(0x4DE80AC0, 1); _soundResource1.play(0x44014282); } break; case 0x4807: - if (sender == _class502_3) { + if (sender == _asRing3) { _soundResource3.play(); - _class431->sendMessage(0x4809, 0, this); + _asDoor->sendMessage(0x4809, 0, this); _class506->sendMessage(0x4809, 0, this); } else if (sender == _class503) { if (getGlobalVar(0x8306F218)) { - _class502_3->sendMessage(0x4807, 0, this); + _asRing3->sendMessage(0x4807, 0, this); } } break; @@ -880,7 +1102,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x480F: setGlobalVar(0x4DE80AC0, 0); _soundResource2.play(); - _class431->sendMessage(0x4808, 0, this); + _asDoor->sendMessage(0x4808, 0, this); _class506->sendMessage(0x4808, 0, this); break; } diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index c5c03b5571..c78658f31e 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -151,6 +151,31 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class AsScene1002Ring : public AnimatedSprite { +public: + AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2); +protected: + Scene *_parentScene; + bool _flag1; + SoundResource _soundResource; + void update(); + uint32 handleMessage4475E0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage447760(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage447890(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage447930(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage447A00(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1002Door : public StaticSprite { +public: + AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect); +protected: + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate447D10(); + void spriteUpdate447D40(); +}; + class Scene1002 : public Scene { public: Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); @@ -164,12 +189,12 @@ protected: // TODO ResourceTable _resourceTable6; // TODO ResourceTable _resourceTable7; // TODO ResourceTable _resourceTable8; - Sprite *_class502_1; - Sprite *_class502_2; - Sprite *_class502_3; - Sprite *_class502_4; - Sprite *_class502_5; - Sprite *_class431; + Sprite *_asRing1; + Sprite *_asRing2; + Sprite *_asRing3; + Sprite *_asRing4; + Sprite *_asRing5; + Sprite *_asDoor; Sprite *_class504; Sprite *_class503; Sprite *_ssLadderArch; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 3851cfa3ad..1aee786458 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -178,7 +178,7 @@ Background *Scene::addBackground(Background *background) { void Scene::update() { if (_smkFileHash != 0) { - // TODO + // TODO .text:0040138D //**** ALL TODO _smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0); _savedUpdateHandlerCb = _updateHandlerCb; diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index db1c16a1ce..7b3d4bc6e5 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -148,22 +148,6 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, } } - #if 0 - if ( ddRect.right > ddRect.left ) - { - if ( ddRect.top < ddRect.bottom ) - { - (*(int (__stdcall **)(_DWORD, _DWORD, _DWORD, LPDIRECTDRAWSURFACE, struct tagRECT *, unsigned int))(**(_DWORD **)(this + 8) + 28))( - *(_DWORD *)(this + 8), - destX, - destY, - ddSurface, - &ddRect, - blitFlags | (unsigned int)DDBLTFAST_WAIT); - } - } - #endif - } void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) { diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index bbb0db144c..a13276a1f8 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -146,7 +146,7 @@ void SmackerPlayer::update() { } if (_doubleSurface) { - // TODO + // TODO .text:0046422D mov byte ptr [eax+28h], 1 } // TODO _vm->_screen->_skipUpdate = true; -- cgit v1.2.3 From b611b65bf42a3f2d710199fa69428ec1012a0108 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 13 Jul 2011 18:34:20 +0000 Subject: NEVERHOOD: Change addHitRect to use an explicit count - This is since the alignment stuff didn't work and it's not worth it to investigate - Add possibility to write out hardcoded message lists instead of reading from the exe for special lists --- devtools/create_neverhood/create_neverhood.cpp | 55 ++++++++++++++++++------- devtools/create_neverhood/tables.h | 6 +-- dists/engine-data/neverhood.dat | Bin 2138 -> 2138 bytes engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 2 +- engines/neverhood/scene.cpp | 2 +- engines/neverhood/smackerplayer.cpp | 2 +- 7 files changed, 47 insertions(+), 22 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 951a2f0ef1..84f3f74ac8 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -76,6 +76,7 @@ typedef std::vector RectItems; struct MessageItem { uint16 messageNum; uint32 messageParam; + MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {} }; typedef std::vector MessageItems; @@ -103,14 +104,10 @@ byte *getData(uint32 offset) { return data + offset - dataStart + fileStart; } -void addHitRect(uint32 offset) { +void addHitRect(uint32 count, uint32 offset) { HitRectList *hitRectList = new HitRectList(); hitRectList->id = offset; byte *item = getData(offset); - uint32 count = READ_LE_UINT32(item); - //printf("count = %d\n", count); - // Align to 16 bytes - item = data + ((offset + 4 + 16) & 0xFFFFFFF0) - dataStart + fileStart; for (uint32 i = 0; i < count; i++) { HitRect hitRect; hitRect.x1 = READ_LE_UINT16(item + 0); @@ -128,15 +125,43 @@ void addHitRect(uint32 offset) { void addMessage(uint32 count, uint32 offset) { MessageList *messageList = new MessageList(); messageList->id = offset; - byte *item = getData(offset); - for (uint32 i = 0; i < count; i++) { - MessageItem messageItem; - messageItem.messageNum = READ_LE_UINT16(item + 0); - messageItem.messageParam = READ_LE_UINT32(item + 4); - //printf("%04X, %08X\n", messageItem.messageNum, messageItem.messageParam); - item += 8; - messageList->messageItems.push_back(messageItem); + + // Special code for message lists which are set at runtime (but otherwise constant) + switch (offset) { + // Scene 1002 rings + case 0x004B4200: + messageList->messageItems.push_back(MessageItem(0x4800, 258)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x4A845A00)); + messageList->messageItems.push_back(MessageItem(0x4805, 1)); + break; + case 0x004B4218: + messageList->messageItems.push_back(MessageItem(0x4800, 297)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x43807801)); + messageList->messageItems.push_back(MessageItem(0x4805, 2)); + break; + case 0x004B4230: + messageList->messageItems.push_back(MessageItem(0x4800, 370)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x46C26A01)); + break; + case 0x004B4240: + messageList->messageItems.push_back(MessageItem(0x4800, 334)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x468C7B11)); + messageList->messageItems.push_back(MessageItem(0x4805, 1)); + break; + case 0x004B4258: + messageList->messageItems.push_back(MessageItem(0x4800, 425)); + messageList->messageItems.push_back(MessageItem(0x100D, 0x42845B19)); + messageList->messageItems.push_back(MessageItem(0x4805, 1)); + break; + default: + // Read message list from the exe + byte *item = getData(offset); + for (uint32 i = 0; i < count; i++) { + messageList->messageItems.push_back(MessageItem(READ_LE_UINT16(item + 0), READ_LE_UINT32(item + 4))); + item += 8; + } } + messageLists.push_back(messageList); } @@ -180,8 +205,8 @@ int main(int argc, char *argv[]) { loadExe("nhc.exe"); - for (int i = 0; hitRectListOffsets[i] != 0; i++) { - addHitRect(hitRectListOffsets[i]); + for (int i = 0; hitRectListOffsets[i] != 0; i += 2) { + addHitRect(hitRectListOffsets[i], hitRectListOffsets[i + 1]); } for (int i = 0; rectListOffsets[i] != 0; i += 2) { diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index d6e230af5e..7aba996ef8 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -22,10 +22,10 @@ static const uint32 hitRectListOffsets[] = { // Scene1001 - 0x004B4858, + 1, 0x004B4860, // Scene1002 - 0x004B4134, - 0 + 1, 0x004B4138, + 0, 0 }; static const uint32 rectListOffsets[] = { diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 99e3fcc1ca..f02d72ca1b 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 4354797695..c2d3e6d887 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -33,7 +33,7 @@ GameModule::GameModule(NeverhoodEngine *vm) // Other initializations moved to actual engine class - // TODO .text:0048AD96 + // TODO // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 562624d57f..9acda937e2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { - // TODO .text:0041C4D3 DirtySurface + // TODO createSurface(surfacePriority, 320, 200); _x = x; _y = y; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 1aee786458..3851cfa3ad 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -178,7 +178,7 @@ Background *Scene::addBackground(Background *background) { void Scene::update() { if (_smkFileHash != 0) { - // TODO .text:0040138D + // TODO //**** ALL TODO _smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0); _savedUpdateHandlerCb = _updateHandlerCb; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index a13276a1f8..bbb0db144c 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -146,7 +146,7 @@ void SmackerPlayer::update() { } if (_doubleSurface) { - // TODO .text:0046422D mov byte ptr [eax+28h], 1 + // TODO } // TODO _vm->_screen->_skipUpdate = true; -- cgit v1.2.3 From 436f8952bbd168c53481bd19f9d79372dd0561c9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 13 Jul 2011 18:38:40 +0000 Subject: NEVERHOOD: More work on Scene1002, Klayman and the rest - Add "heavy debug" output to Entity (display which update/message handler is called) - Also add more debug output - Error out when a StaticData resource could not be found --- engines/neverhood/collisionman.cpp | 19 + engines/neverhood/collisionman.h | 1 + engines/neverhood/entity.h | 11 +- engines/neverhood/klayman.cpp | 947 ++++++++++++++++++++++++++++++++++++- engines/neverhood/klayman.h | 71 ++- engines/neverhood/module1000.cpp | 580 +++++++++++++++++++++-- engines/neverhood/module1000.h | 82 +++- engines/neverhood/mouse.cpp | 16 +- engines/neverhood/resource.cpp | 10 +- engines/neverhood/scene.cpp | 4 +- engines/neverhood/sprite.cpp | 7 + engines/neverhood/sprite.h | 20 +- engines/neverhood/staticdata.cpp | 6 + 13 files changed, 1701 insertions(+), 73 deletions(-) diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index 31bc16d23c..87ec0cdcad 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -39,6 +39,16 @@ void CollisionMan::setHitRects(uint32 id) { void CollisionMan::setHitRects(HitRectList *hitRects) { _hitRects = hitRects; + + // DEBUG + if (_hitRects) { + debug("CollisionMan::setHitRects() count = %d", _hitRects->size()); + for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) { + HitRect *hitRect = &(*it); + debug("(%d, %d, %d, %d) -> %04X", hitRect->rect.x1, hitRect->rect.y1, hitRect->rect.x2, hitRect->rect.y2, hitRect->type); + } + } + } void CollisionMan::clearHitRects() { @@ -79,6 +89,15 @@ void CollisionMan::clearSprites() { _sprites.clear(); } +void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) { + for (Common::Array::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) { + Sprite *collSprite = *iter; + if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getRect())) { + collSprite->sendMessage(messageNum, messageParam, sprite); + } + } +} + void CollisionMan::save() { // TODO } diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h index 155859923b..86359525b0 100644 --- a/engines/neverhood/collisionman.h +++ b/engines/neverhood/collisionman.h @@ -40,6 +40,7 @@ public: void addSprite(Sprite *sprite); void removeSprite(Sprite *sprite); void clearSprites(); + void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam); void save(); void restore(); uint getSpriteCount() const { return _sprites.size(); } diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 7538b36ce2..18c6b7e7b9 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -23,6 +23,7 @@ #ifndef NEVERHOOD_ENTITY_H #define NEVERHOOD_ENTITY_H +#include "common/str.h" #include "neverhood/neverhood.h" #include "neverhood/gamevars.h" #include "neverhood/graphics.h" @@ -71,12 +72,16 @@ protected: // TODO: Constructors for the param types... }; -#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler) -#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler) +// TODO: Disable heavy debug stuff in release mode + +#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler); debug("SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler +#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug("SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler class Entity { public: Common::String _name; // Entity name for debugging purposes + Common::String _updateHandlerCbName; + Common::String _messageHandlerCbName; Entity(NeverhoodEngine *vm, int priority) : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") { } @@ -86,11 +91,13 @@ public: } void handleUpdate() { //debug("Entity(%s).handleUpdate", _name.c_str()); + debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str()); if (_updateHandlerCb) (this->*_updateHandlerCb)(); } bool hasMessageHandler() const { return _messageHandlerCb != NULL; } uint32 sendMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug(2, "sendMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; } // NOTE: These were overloaded before for the various message parameter types diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 9acda937e2..51dde55548 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -58,7 +58,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { - // TODO + // TODO DirtySurface createSurface(surfacePriority, 320, 200); _x = x; _y = y; @@ -84,6 +84,7 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&Klayman::sub41FC80)); break; case 0x4818: + debug("TODO sub41C930"); // TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false); break; } @@ -304,7 +305,8 @@ bool Klayman::sub41CF10(AnimationCb callback) { return false; } - void Klayman::sub41C7B0() { +void Klayman::sub41C7B0() { + debug("Klayman::sub41C7B0()"); if (_callback1Cb) { AnimationCb cb = _callback1Cb; _callback1Cb = NULL; @@ -334,6 +336,7 @@ void Klayman::sub41C790() { } void Klayman::sub41FC80() { + //ok if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) { _status2 = 1; _flagE5 = true; @@ -430,6 +433,7 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FCF0() { + //ok _status2 = 1; _flagE5 = true; setFileHash(0x5420E254, 0, -1); @@ -505,6 +509,7 @@ void Klayman::sub4211B0() { } uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok debug("Klayman::handleMessage41E920(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { @@ -587,7 +592,8 @@ void Klayman::spriteUpdate41F5F0() { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdiff; if (_field114) { - // TODO KlaymanSprite_sub_41CF70 + error("// TODO Klayman_sub_41CF70"); + // TODO Klayman_sub_41CF70 } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { @@ -818,7 +824,7 @@ void Klayman::spriteUpdate41F320() { _x += xdelta; if (_field114) { debug("_field114"); - // TODO KlaymanSprite_sub_41CF70 + // TODO Klayman_sub_41CF70 } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { @@ -1059,8 +1065,8 @@ void Klayman::spriteUpdate41F780() { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdiff; if (_field114) { - debug("// TODO KlaymanSprite_sub_41CF70();"); - // TODO KlaymanSprite_sub_41CF70(); + error("// TODO Klayman_sub_41CF70();"); + // TODO Klayman_sub_41CF70(); } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { @@ -1164,6 +1170,405 @@ void Klayman::sub420830() { SetSpriteCallback(NULL); } +void Klayman::sub41FC40() { + _status2 = 1; + _flagE5 = true; + setFileHash(0xAC20C012, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E3C0); + SetSpriteCallback(NULL); +} + +uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x1008: + debug("case 0x1008"); +#if 0 // TODO + if (_frameIndex < getHashListIndexByString("SpeedUp")) { + setFileHash(0xAC20C012, getHashListIndexByString("SpeedUp"), -1) + _y = 435; + } +#endif + return 0; + case 0x100D: + if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0460E2FA); + } + break; + } + return handleMessage41D480(messageNum, param, sender); +} + +void Klayman::sub420210() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420210))) { + _status2 = 0; + setFileHash(0xD82890BA, 0, -1); + sub4201C0(); + } +} + +void Klayman::sub4201C0() { + _flagE5 = false; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D790); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetAnimationCallback3(&Klayman::sub420340); + _attachedSprite->sendMessage(0x482B, 0, this); +} + +uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x4806, 0, this); + } + _flagE5 = true; + } else if (param.asInteger() == 0x320AC306) { + _soundResource1.play(0x5860C640); + } else if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x482A, 0, this); + } else if (param.asInteger() == 0x88001184) { + _attachedSprite->sendMessage(0x482B, 0, this); + } + break; + } + return messageResult; +} + +void Klayman::spriteUpdate41F230() { + AnimatedSprite::updateDeltaXY(); + _x4 = _x; +} + +void Klayman::sub420340() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x4829E0B8, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(NULL); +} + +void Klayman::sub420250() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420250))) { + _status2 = 0; + setFileHash(0x900980B2, 0, -1); + sub4201C0(); + } +} + +void Klayman::sub420290() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420290))) { + _status2 = 0; + _flagE5 = false; + setFileHash(0xBA1910B2, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D880); + SetAnimationCallback3(&Klayman::sub420380); + _attachedSprite->sendMessage(0x482B, 0, this); + } +} + +uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x4806, 0, this); + } + } else if (param.asInteger() == 0x320AC306) { + _soundResource1.play(0x5860C640); + } else if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x482A, 0, this); + } else if (param.asInteger() == 0x88001184) { + _attachedSprite->sendMessage(0x482B, 0, this); + } + break; + } + return messageResult; +} + +void Klayman::sub420380() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x4A293FB0, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DAA0); + SetSpriteCallback(NULL); +} + +uint32 Klayman::handleMessage41DAA0(int messageNum, const MessageParam ¶m, Entity *sender) { + if (messageNum == 0x1008) { + sub4203C0(); + return 0; + } + return handleMessage41D360(messageNum, param, sender); +} + +void Klayman::sub4203C0() { + _status2 = 1; + _flagE5 = false; + if (_attachedSprite) { + _attachedSprite->sendMessage(0x4807, 0, this); + _attachedSprite = NULL; + } + setFileHash(0xB869A4B9, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub420300() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420300))) { + _status2 = 0; + setFileHash(0xB8699832, 0, -1); + sub4201C0(); + } +} + +void Klayman::sub41CCE0(int16 x) { + sub41CC40(((Sprite*)_attachedSprite)->getX(), x); +} + +void Klayman::sub420970() { + _status2 = 0; + _flagE5 = true; + _statusE0 = 3; + setFileHash2(0x3A292504, 0x01084280, 0); + _fileHash4 = 0x01084280; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(NULL); + sub41C7B0(); +} + +void Klayman::sub4209D0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub4209D0))) { + _status2 = 0; + if (_y4 < _y) { + if (_statusE0 == 1) { + _statusE0 = 2; + sub420BC0(); + } else { + sub41C7B0(); + } + } else if (_statusE0 == 0) { + _statusE0 = 2; + _flagE5 = false; + setFileHash(0x122D1505, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E0D0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } else if (_statusE0 == 3) { + _statusE0 = 2; + _flagE5 = false; + setFileHash2(0x122D1505, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E0D0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } else if (_statusE0 == 1) { + _statusE0 = 2; + _flagE5 = true; + setFileHash(0x122D1505, 29 - _frameIndex, -1); + } + } +} + +void Klayman::sub420BC0() { + _status2 = 2; + if (_statusE0 == 1) { + _statusE0 = 0; + _flagE5 = false; + setFileHash2(0x3A292504, 0x02421405, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DFD0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } else if (_statusE0 == 1) { + _statusE0 = 0; + _flagE5 = false; + setFileHash2(0x122D1505, 0x02421405, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41DFD0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } else { + sub41C7B0(); + } +} + +uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x489B025C) { + _soundResource1.play(0x52C4C2D7); + } else if (param.asInteger() == 0x400A0E64) { + _soundResource1.play(0x50E081D9); + } else if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0460E2FA); + } + break; + } + return messageResult; +} + +uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + _flagE5 = true; + } else if (param.asInteger() == 0x489B025C) { + _soundResource1.play(0x52C4C2D7); + } else if (param.asInteger() == 0x400A0E64) { + _soundResource1.play(0x50E081D9); + } else if (param.asInteger() == 0x02421405) { + if (_statusE0 == 1) { + setFileHash2(0x3A292504, 0x01084280, 0); + } else { + setFileHash2(0x122D1505, 0x01084280, 0); + } + if (_statusE0 == 1) { + if (_y4 >= _y - 30) { + sendMessage(0x1019, 0, this); + } + } else { + if (_y4 <= _y) { + sendMessage(0x1019, 0, this); + } + } + } + break; + } + return messageResult; +} + +void Klayman::sub420AD0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420AD0))) { + _status2 = 0; + if (_y4 >= _y - 30) { + sub41C7B0(); + } else if (_statusE0 == 0) { + _statusE0 = 1; + _flagE5 = false; + setFileHash(0x3A292504, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E0D0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } else if (_statusE0 == 3) { + _statusE0 = 1; + _flagE5 = true; + setFileHash2(0x3A292504, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E0D0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } else if (_statusE0 == 2) { + _statusE0 = 1; + _flagE5 = true; + setFileHash(0x3A292504, 29 - _frameIndex, -1); + } + } +} + +void Klayman::sub421030() { + _status2 = 2; + _flagE5 = false; + setFileHash2(0xF229C003, 0x14884392, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E490); + SetSpriteCallback(&Klayman::spriteUpdate41F230); +} + +uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) { + _parentScene->sendMessage(0x482A, 0, this); + } else if (param.asInteger() == 0x110010D1) { + _parentScene->sendMessage(0x482B, 0, this); + } else if (param.asInteger() == 0x32180101) { + if (_soundFlag) { + _soundResource1.play(0x48498E46); + } else { + _soundResource1.play(0x405002D8); + } + } else if (param.asInteger() == 0x0A2A9098) { + if (_soundFlag) { + _soundResource1.play(0x50399F64); + } else { + _soundResource1.play(0x0460E2FA); + } + } + break; + } + return messageResult; +} + +void Klayman::sub420FE0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420FE0))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0xF229C003, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E490); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } +} + +void Klayman::sub4210C0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub4210C0))) { + _status2 = 0; + _flagE5 = false; + setFileHash2(0xCA221107, 0x8520108C, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E490); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } +} + +void Klayman::sub421070() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub421070))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0xCA221107, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E490); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } +} + +void Klayman::sub420420() { + _status2 = 1; + _flagE5 = true; + setFileHash(0x18118554, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E290); + SetSpriteCallback(NULL); +} + +uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender) { + + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x320AC306) { + _soundResource1.play(0x5860C640); + } + break; + } + return messageResult; +} + +//############################################################################## + // KmScene1001 KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -1210,8 +1615,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asPoint().x != 0) { sub41CC40(param.asPoint().x, param.asPoint().y); } else { - error("// TODO sub41CCE0(param.asPoint().y);"); - // TODO sub41CCE0(param.asPoint().y); + sub41CCE0(param.asPoint().y); } break; @@ -1277,5 +1681,532 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶ return messageResult; } +// KmScene1002 + +KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _class599(class599), _ssLadderArch(ssLadderArch), _otherSprite(NULL), + _status(0) { + + setKlaymanTable1(); + +} + +void KmScene1002::xUpdate() { + if (_x >= 250 && _x <= 435 && _y >= 420) { + if (_status == 0) { + // TODO setKlaymanTable(stru_4B44C8); + _status = 1; + } + } else if (_status == 1) { + setKlaymanTable1(); + _status = 0; + } +} + +uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { + //ok + debug("KmScene1002::xHandleMessage(%04X)", messageNum); + if (messageNum == 0x100D) + debug("-> %08X", param.asInteger()); + switch (messageNum) { + case 0x2001: + setCallback2(AnimationCallback(&KmScene1002::sub449E90)); + break; + case 0x2007: + _otherSprite = (Sprite*)param.asEntity(); + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4803: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&KmScene1002::sub44A250)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&KmScene1002::sub44A2C0)); + } + break; + case 0x4804: + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + break; + case 0x4805: + switch (param.asInteger()) { + case 1: + setCallback2(AnimationCallback(&Klayman::sub420210)); + break; + case 2: + setCallback2(AnimationCallback(&Klayman::sub420250)); + break; + case 3: + setCallback2(AnimationCallback(&Klayman::sub420290)); + break; + case 4: + setCallback2(AnimationCallback(&Klayman::sub420300)); + break; + } + break; + case 0x480A: + setCallback2(AnimationCallback(&KmScene1002::sub44A3E0)); + break; + case 0x480D: + setCallback2(AnimationCallback(&KmScene1002::sub449E20)); + break; + case 0x4816: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&KmScene1002::sub44A330)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + sub41CCE0(param.asInteger()); + break; + case 0x4820: + _parentScene->sendMessage(0x2005, 0, this); + setCallback2(AnimationCallback(&Klayman::sub420970)); + break; + case 0x4821: + _parentScene->sendMessage(0x2005, 0, this); + _y4 = param.asInteger(); + setCallback2(AnimationCallback(&Klayman::sub4209D0)); + break; + case 0x4822: + _parentScene->sendMessage(0x2005, 0, this); + _y4 = param.asInteger(); + setCallback2(AnimationCallback(&Klayman::sub420AD0)); + break; + case 0x4823: + _parentScene->sendMessage(0x2006, 0, this); + setCallback2(AnimationCallback(&Klayman::sub420BC0)); + break; + case 0x482E: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub421030)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420FE0)); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4210C0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub421070)); + } + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +void KmScene1002::update4497D0() { + debug("KmScene1002::update4497D0()"); + Klayman::update(); + if (_counter1 != 0 && (--_counter1 == 0)) { + _surface->setVisible(true); + SetUpdateHandler(&Klayman::update); + } +} + +uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x480F, 0, this); + } + } else if (param.asInteger() == 0x586B0300) { + if (_otherSprite) { + _otherSprite->sendMessage(0x480E, 1, this); + } + } else if (param.asInteger() == 0x4AB28209) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x482A, 0, this); + } + } else if (param.asInteger() == 0x88001184) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x482B, 0, this); + } + } + break; + } + return messageResult; +} + +uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok + switch (messageNum) { + case 0x4811: + _soundResource1.play(0x5252A0E4); + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + if (_doDeltaX) { + _x = ((Sprite*)sender)->getX() - 75; + } else { + _x = ((Sprite*)sender)->getX() + 75; + } + _y = ((Sprite*)sender)->getY() - 200; + + debug("&&&&&&&&&&& param.asInteger() = %d", param.asInteger()); + + if (param.asInteger() == 0) { + sub449EF0(); + } else if (param.asInteger() == 1) { + sub44A0D0(); + } else if (param.asInteger() == 2) { + sub44A050(); + } + break; + } + return 0; +} + +uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x942D2081) { + _flagE5 = false; + _attachedSprite->sendMessage(0x2003, 0, this); + } else if (param.asInteger() == 0xDA600012) { + sub44A370(); + } else if (param.asInteger() == 0x0D01B294) { + _flagE5 = false; + _attachedSprite->sendMessage(0x480B, 0, this); + } + break; + } + return messageResult; +} + +uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x480B, (uint32)_doDeltaX, this); + } + } else if (param.asInteger() == 0x02421405) { + if (_flagE4) { + if (_attachedSprite) { + if (_attachedSprite->sendMessage(0x480C, (uint32)_doDeltaX, this) != 0) { + sub44A460(); + } + } + } else { + SetMessageHandler(&KmScene1002::handleMessage449BA0); + } + } else if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x482A, 0, this); + } else if (param.asInteger() == 0x88001184) { + _attachedSprite->sendMessage(0x482B, 0, this); + } else if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0460E2FA); + } + break; + case 0x480A: + _flagE4 = true; + return 0; + } + return handleMessage41D480(messageNum, param, sender); +} + +uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + _attachedSprite->sendMessage(0x482A, 0, this); + } else if (param.asInteger() == 0x88001184) { + _attachedSprite->sendMessage(0x482B, 0, this); + } else if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0460E2FA); + } + break; + } + return messageResult; +} + +uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + debug("case 0x1008"); +#if 0 // TODO + if (_frameIndex < getHashListIndexByString("SpeedUp")) { + setFileHash(0x35AA8059, getHashListIndexByString("SpeedUp"), -1) + _y = 435; + } +#endif + messageResult = 0; + break; + case 0x100D: + if (param.asInteger() == 0x1A1A0785) { + _soundResource1.play(0x40F0A342); + } else if (param.asInteger() == 0x60428026) { + _soundResource1.play(0x40608A59); + } + break; + } + return messageResult; +} + +uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender) { + //ok + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x1307050A) { + _soundResource1.play(0x40428A09); + } + break; + } + return messageResult; +} + +void KmScene1002::spriteUpdate449DC0() { + debug("KmScene1002::spriteUpdate449DC0()"); + AnimatedSprite::updateDeltaXY(); + HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); + debug("$$$ hitRect->type = %04X", hitRect->type); + if (hitRect->type == 0x5001) { + _y = hitRect->rect.y1; + processDelta(); + sendMessage(0x1019, 0, this); + } + _vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0); +} + +void KmScene1002::sub449E20() { + debug("KmScene1002::sub449E20()"); + if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x584984B4, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene1002::handleMessage449800); + SetAnimationCallback3(&Klayman::sub420420); + _attachedSprite->sendMessage(0x482B, 0, this); + } +} + +void KmScene1002::sub449E90() { + debug("KmScene1002::sub449E90()"); + _soundResource1.play(0x56548280); + _status2 = 0; + _flagE5 = false; + _surface->setVisible(false); + setFileHash(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1002::handleMessage4498E0); +} + +void KmScene1002::sub449EF0() { + //ok + debug("KmScene1002::sub449EF0()"); + _counter1 = 1; + _status2 = 0; + _flagE5 = false; + setFileHash(0x000BAB02, 0, -1); + SetUpdateHandler(&KmScene1002::update4497D0); + + // Weird stuff happening + SetMessageHandler(&Klayman::handleMessage41D360); + //SetMessageHandler(&Klayman::handleMessage41D480); + + SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); + SetAnimationCallback3(&KmScene1002::sub449F70); + _class599->sendMessage(0x482A, 0, this); + _ssLadderArch->sendMessage(0x482A, 0, this); +} + +void KmScene1002::sub449F70() { + //ok + debug("KmScene1002::sub449F70()"); + _parentScene->sendMessage(0x1024, 1, this); + _soundResource1.play(0x41648271); + _status2 = 1; + _flagE5 = false; + _flagE1 = false; + setFileHash2(0x000BAB02, 0x88003000, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1002::handleMessage41D480); + SetAnimationCallback3(&KmScene1002::sub44A230); + _parentScene->sendMessage(0x2002, 0, this); + // TODO _callbackList = NULL; + _attachedSprite = NULL; + _class599->sendMessage(0x482B, 0, this); + _ssLadderArch->sendMessage(0x482B, 0, this); +} + +void KmScene1002::sub44A050() { + //ok + debug("KmScene1002::sub44A050()"); + _counter1 = 1; + _status2 = 0; + _flagE5 = false; + setFileHash(0x9308C132, 0, -1); + SetUpdateHandler(&KmScene1002::update4497D0); + SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); + SetMessageHandler(&Klayman::handleMessage41D480); + SetAnimationCallback3(&KmScene1002::sub449F70); + _class599->sendMessage(0x482A, 0, this); + _ssLadderArch->sendMessage(0x482A, 0, this); +} + +void KmScene1002::sub44A0D0() { + //ok + debug("KmScene1002::sub44A0D0()"); + _counter1 = 1; + _status2 = 0; + _flagE5 = false; + setFileHash(0x0013A206, 0, -1); + SetUpdateHandler(&KmScene1002::update4497D0); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); + SetAnimationCallback3(&KmScene1002::sub44A150); + _class599->sendMessage(0x482A, 0, this); + _ssLadderArch->sendMessage(0x482A, 0, this); +} + +void KmScene1002::sub44A150() { + //ok + debug("KmScene1002::sub44A150()"); + _parentScene->sendMessage(0x1024, 1, this); + _soundResource1.play(0x41648271); + _status2 = 1; + _flagE5 = false; + _flagE1 = false; + setFileHash2(0x0013A206, 0x88003000, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage41D480); + SetSpriteCallback(NULL); + SetAnimationCallback3(&KmScene1002::sub44A230); + _parentScene->sendMessage(0x2002, 0, this); + // TODO _callbackList = NULL; + _attachedSprite = NULL; + _class599->sendMessage(0x482B, 0, this); + _ssLadderArch->sendMessage(0x482B, 0, this); +} + +void KmScene1002::sub44A230() { + //ok + debug("KmScene1002::sub44A230()"); + setDoDeltaX(2); + sub41FC80(); +} + +void KmScene1002::sub44A250() { + //ok + debug("KmScene1002::sub44A250()"); + if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) { + _parentScene->sendMessage(0x1024, 3, this); + _status2 = 2; + _flagE5 = false; + setFileHash(0xB93AB151, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage449D60); + SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); + SetAnimationCallback3(&Klayman::sub420420); + } +} + +void KmScene1002::sub44A2C0() { + //ok + debug("KmScene1002::sub44A2C0()"); + if (_attachedSprite) { + _x = ((Sprite*)_attachedSprite)->getX(); + _attachedSprite->sendMessage(0x4807, 0, this); + _attachedSprite = NULL; + } + _status2 = 2; + _flagE5 = false; + setFileHash(0x586984B1, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage41D360); + SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); + SetAnimationCallback3(&Klayman::sub420420); +} + +void KmScene1002::sub44A330() { + //ok + debug("KmScene1002::sub44A330()"); + _status2 = 2; + _flagE5 = true; + setDoDeltaX(0); + setFileHash(0x1CD89029, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage449990); + SetSpriteCallback(&Klayman::spriteUpdate41F250); +} + +void KmScene1002::sub44A370() { + //ok + debug("KmScene1002::sub44A370()"); + _status2 = 1; + _flagE5 = false; + setFileHash(0x35AA8059, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage449C90); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + setCallback1(AnimationCallback(&KmScene1002::sub44A3C0)); +} + +void KmScene1002::sub44A3C0() { + debug("KmScene1002::sub44A3C0()"); + _parentScene->sendMessage(0x1024, 1, this); +} + +void KmScene1002::sub44A3E0() { + //ok + debug("KmScene1002::sub44A3E0()"); + if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) { + _status2 = 2; + _flagE4 = false; + _flagE5 = true; + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + setFileHash(0x5C01A870, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage449A30); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + setCallback1(AnimationCallback(&KmScene1002::sub44A4B0)); + } +} + +void KmScene1002::sub44A460() { + //ok + debug("KmScene1002::sub44A460()"); + _flagE4 = false; + _flagE5 = true; + setFileHash2(0x5C01A870, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1002::handleMessage449A30); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + setCallback1(AnimationCallback(&KmScene1002::sub44A4B0)); +} + +void KmScene1002::sub44A4B0() { + _attachedSprite->sendMessage(0x482A, 0, this); +} } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 24f70e1fdf..20d0e885cd 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -63,10 +63,32 @@ public: void sub4208F0(); void sub420930(); void sub420830(); + void sub41FC40(); + void sub420210(); + void sub4201C0(); + void sub420340(); + void sub420250(); + void sub420290(); + void sub420380(); + void sub4203C0(); + void sub420300(); + void sub420970(); + void sub4209D0(); + void sub420BC0(); + void sub420AD0(); + void sub421030(); + void sub420FE0(); + void sub4210C0(); + void sub421070(); + void sub420420(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); void spriteUpdate41F780(); + void spriteUpdate41F230(); + + uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); protected: Entity *_parentScene; @@ -133,10 +155,8 @@ protected: void sub41C790(); void update41D0F0(); - uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); void sub41FF00(); - uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); void sub41FCF0(); @@ -171,11 +191,19 @@ protected: void sub41CD00(int16 x); void sub41CC40(int16 x1, int16 x2); void sub41CAC0(int16 x); + void sub41CCE0(int16 x); void sub41FC30(); uint32 handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41E3C0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41D790(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41D880(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41DAA0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41E0D0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41E490(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -188,6 +216,43 @@ protected: uint32 handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender); }; +class KmScene1002 : public Klayman { +public: + KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y); +protected: + Sprite *_class599; + Sprite *_ssLadderArch; + Sprite *_otherSprite; + int _status; + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void update4497D0(); + uint32 handleMessage449800(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage449990(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage449A30(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate449DC0(); + void sub449E20(); + void sub449E90(); + void sub449EF0(); + void sub449F70(); + void sub44A050(); + void sub44A0D0(); + void sub44A150(); + void sub44A230(); + void sub44A250(); + void sub44A2C0(); + void sub44A330(); + void sub44A370(); + void sub44A3C0(); + void sub44A3E0(); + void sub44A460(); + void sub44A4B0(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 703796e51f..529cbeab07 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -381,10 +381,10 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m setFileHash(0x04A98C36, 0, -1); break; case 0x482A: - _parentScene->sendMessage(0x1022, 0x3DE, this); + _parentScene->sendMessage(0x1022, 990, this); break; case 0x482B: - _parentScene->sendMessage(0x1022, 0x3F2, this); + _parentScene->sendMessage(0x1022, 1010, this); break; } return messageResult; @@ -428,7 +428,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1001::handleMessage); - _vm->_collisionMan->setHitRects(0x004B4858); + _vm->_collisionMan->setHitRects(0x004B4860); _surfaceFlag = false; _background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0)); _palette = new Palette(_vm, 0x4086520E); @@ -822,15 +822,520 @@ void AsScene1002Door::spriteUpdate447D40() { } } +Class505::Class505(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1400) { + + createSurface(1025, 88, 165); + _surface->setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class505::handleMessage); +} + +uint32 Class505::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + _x = ((Sprite*)sender)->getX() - 98; + _y = ((Sprite*)sender)->getY() - 111; + setFileHash(0x0422255A, 0, -1); + _surface->setVisible(true); + break; + case 0x3002: + setFileHash1(); + _surface->setVisible(false); + break; + } + return messageResult; +} + +AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505) + : AnimatedSprite(vm, 1300), _rect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _class505(class505), + _soundResource(vm) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); + SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0); + + createSurface(800, 136, 147); + _surface->getClipRect() = clipRect; + + spriteUpdate448AA0(); + + // TODO _soundResource.load(0xC0C40298); + + setFileHash(0x586C1D48, 0, 0); + +} + +uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xA61CA1C2) { + _class505->sendMessage(0x2004, 0, this); + } else if (param.asInteger() == 0x14CE0620) { + // TODO _soundResource.play(); + } + break; + case 0x2003: + sub448B10(); + break; + } + return messageResult; +} + +uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage4489D0(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void AsScene1002DoorSpy::spriteUpdate448AA0() { + _x = _asDoor->getX() + 34; + _y = _asDoor->getY() + 175; +} + +void AsScene1002DoorSpy::sub448AC0() { + _surface->getClipRect() = _rect; + _parentScene->setSurfacePriority(getSurface(), 800); + setFileHash(0x586C1D48, 0, 0); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); +} + +void AsScene1002DoorSpy::sub448B10() { + _surface->getClipRect().x1 = 0; + _surface->getClipRect().y1 = 0; + _surface->getClipRect().x2 = 640; + _surface->getClipRect().y2 = 480; + _parentScene->setSurfacePriority(getSurface(), 1200); + setFileHash(0x586C1D48, 1, -1); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60); + SetAnimationCallback3(&AsScene1002DoorSpy::sub448AC0); +} + +Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) + : StaticSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm), _status(0) { + + _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; + + _fileHashes[0] = fileHash1; + _fileHashes[1] = fileHash2; + + _spriteResource.load2(fileHash1); + createSurface(surfacePriority, 40, 40); + + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + + _surface->setVisible(false); + _needRefresh = true; + + SetUpdateHandler(&Class426::update); + SetMessageHandler(&Class426::handleMessage); + +} + +void Class426::update() { + if (_countdown != 0 && (--_countdown) == 0) { + if (_status == 1) { + _status = 2; + _spriteResource.load2(_fileHashes[1]); + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); + _countdown = 4; + } else if (_status == 2) { + _status = 3; + _spriteResource.load2(_fileHashes[0]); + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); + _countdown = 4; + } else if (_status == 3) { + _status = 0; + _surface->setVisible(false); + } + } +} + +uint32 Class426::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480B: + _parentScene->sendMessage(0x480B, 0, this); + _status = 1; + _countdown = 4; + _surface->setVisible(true); + _soundResource.play(_soundFileHash); + break; + } + return messageResult; +} + +AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _klayman(klayman), + _flag(flag), _countdown(0) { + + createSurface(995, 175, 195); + + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + + if (!flag) { + if (getGlobalVar(0x8306F218)) { + setDoDeltaX(1); + _x = 366; + _y = 435; + sub4485F0(); + } else { + _x = 174 + getGlobalVar(0x1B144052) * 32; + _y = 435; + sub448660(); + } + } else { + _x = 186 + getGlobalVar(0x86341E88) * 32; + _y = 364; + if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) { + sub4485F0(); + } else { + sub448660(); + } + } + + _flags = 4; +} + +void AsScene1002VenusFlyTrap::update() { + if (_countdown != 0 && (--_countdown == 0)) { + removeCallbacks(); + } + AnimatedSprite::update(); +} + +void AsScene1002VenusFlyTrap::update447FB0() { + if (_countdown == 0 && _klayman->getX() - 20 > _x) { + setDoDeltaX(1); + } else if (_klayman->getX() + 20 < _x) { + setDoDeltaX(0); + } + update(); +} + +uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000890C4) { + _soundResource.play(0xC21190D8); + } else if (param.asInteger() == 0x522200A0) { + _soundResource.play(0x931080C8); + } + break; + case 0x1011: + if (_flag) { + if (_x >= 154 && _x <= 346) { + _parentScene->sendMessage(0x2000, 0, this); + messageResult = 1; + } + } else { + if (_x >= 174 && _x <= 430) { + _parentScene->sendMessage(0x2000, 0, this); + messageResult = 1; + } + } + break; + case 0x480B: + setDoDeltaX(param.asInteger() != 0 ? 1 : 0); + if (_flag) { + if (getGlobalVar(0x8306F218)) { + sub448560(); + } else { + sub448530(); + } + } else { + if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) { + sub448560(); + } else { + sub448530(); + } + } + break; + case 0x480C: + if (_flag) { + if (_x >= 154 && _x <= 346) + messageResult = 1; + else + messageResult = 0; + } else { + if (_x >= 174 && _x <= 430) + messageResult = 1; + else + messageResult = 0; + } + break; + case 0x480E: + if (param.asInteger() == 1) { + sub4485B0(); + } + break; + case 0x4810: + debug("trap collision"); + sub448780(); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 995, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1015, this); + break; + } + return messageResult; +} + +uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage448000(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000890C4) { + _soundResource.play(0xC21190D8); + } else if (param.asInteger() == 0x41881801) { + if (_flag) { + if (_x > 330) { + _klayman->sendMessage(0x4811, 2, this); + } else if (_x > 265) { + _klayman->sendMessage(0x4811, 0, this); + } else { + _klayman->sendMessage(0x4811, 0, this); + } + } else { + _klayman->sendMessage(0x4811, 0, this); + } + } else if (param.asInteger() == 0x522200A0) { + _soundResource.play(0x931080C8); + } + break; + case 0x3002: + removeCallbacks(); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 995, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1015, this); + break; + } + return messageResult; +} + +void AsScene1002VenusFlyTrap::sub4484F0() { + //ok + setDoDeltaX(2); + setFileHash(0xC4080034, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); +} + +void AsScene1002VenusFlyTrap::sub448530() { + //ok + setFileHash(0xC4080034, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); +} + +void AsScene1002VenusFlyTrap::sub448560() { + //ok + _parentScene->sendMessage(0x4807, 0, this); + setFileHash(0x82292851, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); +} + +void AsScene1002VenusFlyTrap::sub4485B0() { + //ok + setDoDeltaX(1); + setFileHash(0x86A82A11, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4485F0); +} + +void AsScene1002VenusFlyTrap::sub4485F0() { + //ok + setFileHash(0xB5A86034, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); +} + +void AsScene1002VenusFlyTrap::sub448620() { + //ok + setFileHash(0x31303094, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(NULL); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448720); + _countdown = 24; +} + +void AsScene1002VenusFlyTrap::sub448660() { + setFileHash(0xC8204250, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update447FB0); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); + if (_flag) { + if (_x >= 154 && _x <= 346) { + setGlobalVar(0x86341E88, (_x - 186) / 32); + } else { + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0); + _countdown = 12; + } + } else { + if (_x >= 174 && _x <= 430) { + setGlobalVar(0x1B144052, (_x - 174) / 32); + } else { + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0); + _countdown = 12; + } + } +} + +void AsScene1002VenusFlyTrap::sub448720() { + //ok + setFileHash(0x152920C4, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448750); +} + +void AsScene1002VenusFlyTrap::sub448750() { + //ok + setFileHash(0x84001117, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); +} + +void AsScene1002VenusFlyTrap::sub448780() { +debug("AsScene1002VenusFlyTrap::sub448780()"); + if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) { + if (_flag) { + setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); + } else { + setDoDeltaX(_x > 320 ? 1 : 0); + } + _klayman->sendMessage(0x2001, 0, this); + setFileHash(0x8C2C80D4, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); + SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448620); + } +} + +Class506::Class506(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _countdown(0) { + + createSurface(850, 186, 212); + _x = 320; + _y = 240; + if (getGlobalVar(0x8306F218)) { + setFileHash(0x004A4495, -1, -1); + _newHashListIndex = -2; + } else { + _surface->setVisible(false); + } + SetUpdateHandler(&Class506::update); + SetMessageHandler(&Class506::handleMessage4491B0); +} + +void Class506::update() { + if (_countdown != 0 && (--_countdown == 0)) { + if (_flag) { + sub449280(); + } else { + sub449250(); + } + } + AnimatedSprite::update(); +} + +uint32 Class506::handleMessage4491B0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageResult) { + case 0x4808: + _flag = false; + _countdown = 2; + break; + case 0x4809: + _flag = true; + _countdown = 2; + break; + } + return messageResult; +} + +uint32 Class506::handleMessage449210(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage4491B0(messageNum, param, sender); + switch (messageResult) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class506::sub449250() { + setFileHash(0x004A4495, 0, -1); + SetMessageHandler(&Class506::handleMessage4491B0); + _newHashListIndex = -2; + _surface->setVisible(true); +} + +void Class506::sub449280() { + setFileHash(0x004A4495, -1, -1); + _playBackwards = true; + SetMessageHandler(&Class506::handleMessage449210); + SetAnimationCallback3(&Class506::sub4492C0); + _surface->setVisible(true); +} + +void Class506::sub4492C0() { + _surface->setVisible(false); + setFileHash1(); +} + Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _flag1B4(false), _flag1BE(false) { - static const uint32 kClass426FileHashList[] = { - 0x00412692, - 0x140B60BE - }; - NRect tempClipRect; Sprite *tempSprite; @@ -848,7 +1353,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1002::update); SetMessageHandler(&Scene1002::handleMessage); - _vm->_collisionMan->setHitRects(0x004B4134); + _vm->_collisionMan->setHitRects(0x004B4138); _surfaceFlag = true; @@ -868,46 +1373,46 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class599 = addSprite(new Class599(_vm, this)); -#if 0 if (which < 0) { if (_vm->_gameState.field2 == 0) { - _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); + //_class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); // TODO // TODO _klayman->setRepl(64, 0); } else { - _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435); + //_class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); // TODO } } else { if (which == 1) { - _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435); + //_class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); // TODO _vm->_gameState.field2 = 1; } else if (which == 2) { - _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645); + //_class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4298); // TODO _vm->_gameState.field2 = 1; _klayman->sendMessage(0x4820, 0, this); } else { - _klayman = addSprite(new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); + //_class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4470); // TODO - _class479 = addSprite(new Class479(_vm, this, _klayman)); + //_class479 = addSprite(new Class479(_vm, this, _klayman)); // TODO // TODO _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; } } -#endif + + addSprite(_klayman); _mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL)); @@ -925,22 +1430,21 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect)); -#if 0 + tempSprite = addSprite(new Class505(_vm)); - tempSprite = addSprite(new Class505(_vm, tempClipRect)); - - _class504 = addSprite(new Class504(_vm, tempClipRect, this, _asDoor, tempSprite)); - _class426 = addSprite(new Class426(_vm, this, kClass426FileHashList, 800, 0)); - _class503 = addSprite(new Class503(_vm, this, _klayman, false)); + _asDoorSpy = addSprite(new AsScene1002DoorSpy(_vm, tempClipRect, this, _asDoor, tempSprite)); + + _class426 = addSprite(new Class426(_vm, this, 0x00412692, 0x140B60BE, 800, 0)); + _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, false)); - _vm->_collisionMan->addSprite(_class503); - _klayman->sendEntityMessage(0x2007, _class503, this); + _vm->_collisionMan->addSprite(_asVenusFlyTrap); + + _klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this); _class506 = addSprite(new Class506(_vm)); setRectList(0x004B43A0); -#endif #if 0 // TODO _soundResource2.load(0x60755842); @@ -954,11 +1458,10 @@ Scene1002::~Scene1002() { void Scene1002::update() { Scene::update(); -#if 0 // TODO: Waiting for Klayman... if (!_flag1B4 && _klayman->getY() > 230) { // TODO deleteSprite(&_ssLadderArchPart3); - _klayman->clearRepl(); + // TODO _klayman->clearRepl(); _flag1B4 = true; _vm->_gameState.field2 = 1; } @@ -968,11 +1471,10 @@ void Scene1002::update() { _flag1BE = false; } -#endif - } uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Scene1002::handleMessage(%04X)", messageNum); uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -1011,7 +1513,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B44B8); } else { _klayman->sendEntityMessage(0x1014, _asRing3, this); - if (_class503->getX() - 10 < 366 && _class503->getX() + 10 > 366) { + if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) { setGlobalVar(0x2B514304, 1); setMessageList(0x004B44A8); } else { @@ -1043,7 +1545,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList2(0x004B43D0); } else { if (_klayman->getY() > 420) { - _klayman->sendEntityMessage(0x1014, _class503, this); + _klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this); setMessageList2(0x004B4480); } else if (_klayman->getY() > 227) { setMessageList2(0x004B41E0); @@ -1090,14 +1592,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit _soundResource3.play(); _asDoor->sendMessage(0x4809, 0, this); _class506->sendMessage(0x4809, 0, this); - } else if (sender == _class503) { + } else if (sender == _asVenusFlyTrap) { if (getGlobalVar(0x8306F218)) { _asRing3->sendMessage(0x4807, 0, this); } } break; case 0x480B: - _klayman->sendEntityMessage(0x1014, _class504, this); + _klayman->sendEntityMessage(0x1014, _asDoorSpy, this); break; case 0x480F: setGlobalVar(0x4DE80AC0, 0); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index c78658f31e..79a4985ffc 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -176,6 +176,84 @@ protected: void spriteUpdate447D40(); }; +class Class505 : public AnimatedSprite { +public: + Class505(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1002DoorSpy : public AnimatedSprite { +public: + AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505); +protected: + Scene *_parentScene; + Sprite *_asDoor; + Sprite *_class505; + SoundResource _soundResource; + NRect _rect; + uint32 handleMessage4489D0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage448A60(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate448AA0(); + void sub448AC0(); + void sub448B10(); +}; + +class Class426 : public StaticSprite { +public: + Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); + // TODO Class426_sub433660 (not used yet) +protected: + Scene *_parentScene; + int _countdown; + uint32 _fileHashes[2]; + int _status; + SoundResource _soundResource; + uint32 _soundFileHash; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1002VenusFlyTrap : public AnimatedSprite { +public: + AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag); +protected: + Scene *_parentScene; + Sprite *_klayman; + int _countdown; + SoundResource _soundResource; + bool _flag; + void update(); + void update447FB0(); + uint32 handleMessage448000(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage4482E0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage448320(int messageNum, const MessageParam ¶m, Entity *sender); + void sub4484F0(); + void sub448530(); + void sub448560(); + void sub4485B0(); + void sub4485F0(); + void sub448620(); + void sub448660(); + void sub448720(); + void sub448750(); + void sub448780(); +}; + +class Class506 : public AnimatedSprite { +public: + Class506(NeverhoodEngine *vm); +protected: + int _countdown; + bool _flag; + void update(); + uint32 handleMessage4491B0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage449210(int messageNum, const MessageParam ¶m, Entity *sender); + void sub449250(); + void sub449280(); + void sub4492C0(); +}; + class Scene1002 : public Scene { public: Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); @@ -195,8 +273,8 @@ protected: Sprite *_asRing4; Sprite *_asRing5; Sprite *_asDoor; - Sprite *_class504; - Sprite *_class503; + Sprite *_asDoorSpy; + Sprite *_asVenusFlyTrap; Sprite *_ssLadderArch; Sprite *_ssLadderArchPart1; Sprite *_ssLadderArchPart2; diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index c753183269..381f4a7186 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -29,7 +29,7 @@ namespace Neverhood { Mouse433::Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect) : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0) { - debug("Mouse433::Mouse433(%08X)", fileHash); + debug(7, "Mouse433::Mouse433(%08X)", fileHash); if (mouseRect) { _mouseRect = *mouseRect; @@ -70,7 +70,7 @@ void Mouse433::load(uint32 fileHash) { } void Mouse433::update() { - debug("Mouse433::update()"); + debug(7, "Mouse433::update()"); updateCursor(); _frameNum++; if (_frameNum >= 6) @@ -79,7 +79,7 @@ void Mouse433::update() { } uint32 Mouse433::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Mouse433::handleMessage(%04X)", messageNum); + debug(7, "Mouse433::handleMessage(%04X)", messageNum); uint32 messageResult = 0; if (messageNum != 5) { messageResult = Sprite::handleMessage(messageNum, param, sender); @@ -103,7 +103,7 @@ uint32 Mouse433::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Mouse433::updateCursor() { - debug("Mouse433::updateCursor()"); + debug(7, "Mouse433::updateCursor()"); if (!_surface) return; @@ -131,7 +131,7 @@ void Mouse433::updateCursor() { Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) { - debug("Mouse435::Mouse435(%08X)", fileHash); + debug(7, "Mouse435::Mouse435(%08X)", fileHash); _mouseCursorResource.load(fileHash); _x = _vm->getMouseX(); @@ -165,7 +165,7 @@ void Mouse435::load(uint32 fileHash) { } void Mouse435::update() { - debug("Mouse435::update()"); + debug(7, "Mouse435::update()"); updateCursor(); _frameNum++; if (_frameNum >= 6) @@ -174,7 +174,7 @@ void Mouse435::update() { } uint32 Mouse435::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Mouse435::handleMessage(%04X)", messageNum); + debug(7, "Mouse435::handleMessage(%04X)", messageNum); uint32 messageResult = 0; if (messageNum != 5) { messageResult = Sprite::handleMessage(messageNum, param, sender); @@ -199,7 +199,7 @@ uint32 Mouse435::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Mouse435::updateCursor() { - debug("Mouse435::updateCursor()"); + debug(7, "Mouse435::updateCursor()"); if (!_surface) return; diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 841827a4bd..dde80ebe79 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -291,10 +291,14 @@ void AnimResource::unloadInternal() { } int16 AnimResource::getFrameIndex(uint32 frameHash) { + int16 frameIndex = -1; for (uint i = 0; i < _frames.size(); i++) - if (_frames[i].frameHash == frameHash) - return (int16)i; - return -1; + if (_frames[i].frameHash == frameHash) { + frameIndex = (int16)i; + break; + } + debug("AnimResource::getFrameIndex(%08X) -> %d", frameHash, frameIndex); + return frameIndex; } MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 3851cfa3ad..7252e391a0 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -416,7 +416,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool } void Scene::runMessageList() { - debug("Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1); + debug(7, "Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1); if (_messageListFlag2 || _messageListFlag1) return; @@ -434,7 +434,7 @@ void Scene::runMessageList() { int messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; - //debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); + debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); _messageListIndex++; if (_messageListIndex == _messageListCount) { diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 222368c94a..155d3254ec 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -72,6 +72,10 @@ bool Sprite::isPointInside(int16 x, int16 y) { return x >= _rect.x1 && x <= _rect.x2 && y >= _rect.y1 && y <= _rect.y2; } +bool Sprite::checkCollision(NRect &rect) { + return (_rect.x1 < rect.x2) && (rect.x1 < _rect.x2) && (_rect.y1 < rect.y2) && (rect.y1 < _rect.y2); +} + uint32 Sprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x0005: @@ -373,6 +377,7 @@ void AnimatedSprite::updatePosition() { void AnimatedSprite::updateFrameIndex() { if (!_playBackwards) { + debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2); if (_frameIndex < _frameIndex2) { _frameIndex++; } else { @@ -441,6 +446,7 @@ void AnimatedSprite::setFileHash1() { } void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) { + debug("AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5); _fileHash1 = fileHash; _fileHash6 = fileHash6; _fileHash5 = fileHash5; @@ -498,6 +504,7 @@ void AnimatedSprite::removeCallbacks() { if (_callback3Cb) { _callback2Cb = _callback3Cb; _callback3Cb = NULL; + debug("Fire _callback3Cb '%s'", _callback3CbName.c_str()); (this->*_callback2Cb)(); #if 0 // TODO } else if (_callbackList) { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 0368d2d3a6..996c063b42 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -30,9 +30,9 @@ namespace Neverhood { -#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback) -#define SetFilterX(callback) _filterXCb = static_cast (callback) -#define SetFilterY(callback) _filterYCb = static_cast (callback) +#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback); debug("SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback +#define SetFilterX(callback) _filterXCb = static_cast (callback); debug("SetFilterX(" #callback ")") +#define SetFilterY(callback) _filterYCb = static_cast (callback); debug("SetFilterY(" #callback ")") const int16 kDefPosition = -32768; @@ -45,12 +45,16 @@ public: void setDoDeltaX(int type); void setDoDeltaY(int type); bool isPointInside(int16 x, int16 y); + bool checkCollision(NRect &rect); int16 getX() const { return _x; } int16 getY() const { return _y; } + uint16 getFlags() const { return _flags; } bool isDoDeltaX() const { return _doDeltaX; } bool isDoDeltaY() const { return _doDeltaY; } + NRect& getRect() { return _rect; } protected: void (Sprite::*_spriteUpdateCb)(); + Common::String _spriteUpdateCbName; // For debugging purposes int16 (Sprite::*_filterXCb)(int16); int16 (Sprite::*_filterYCb)(int16); BaseSurface *_surface; @@ -92,9 +96,9 @@ protected: void update(); }; -#define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback) -#define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback) -#define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback) +#define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback +#define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback); debug("SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback +#define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback); debug("SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback #define AnimationCallback(callback) static_cast (callback) class AnimatedSprite : public Sprite { @@ -133,6 +137,10 @@ protected: AnimationCb _callback1Cb; AnimationCb _callback2Cb; AnimationCb _callback3Cb; + // For debugging purposes + Common::String _callback1CbName; + Common::String _callback2CbName; + Common::String _callback3CbName; void init(); void updateAnim(); void updatePosition(); diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 4cd1d30251..b9ac232707 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -107,14 +107,20 @@ void StaticData::load(const char *filename) { } HitRectList *StaticData::getHitRectList(uint32 id) { + if (!_hitRectLists[id]) + error("StaticData::getHitRectList() HitRectList with id %08X not found", id); return _hitRectLists[id]; } RectList *StaticData::getRectList(uint32 id) { + if (!_rectLists[id]) + error("StaticData::getRectList() RectList with id %08X not found", id); return _rectLists[id]; } MessageList *StaticData::getMessageList(uint32 id) { + if (!_messageLists[id]) + error("StaticData::getMessageList() MessageList with id %08X not found", id); return _messageLists[id]; } -- cgit v1.2.3 From 264777893578186cb27113f5918ef5e62fcfb836 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 13 Jul 2011 23:00:39 +0000 Subject: NEVERHOOD: Fix crash/corruption in clipped sprite drawing --- engines/neverhood/neverhood.cpp | 10 +--------- engines/neverhood/scene.cpp | 1 - engines/neverhood/screen.cpp | 20 ++++++++++++++------ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index abae6eb70a..9e1475fe03 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -89,6 +89,7 @@ Common::Error NeverhoodEngine::run() { CursorMan.showMouse(true); { + // DEBUG: Dummy cursor byte buffer[2*2]; memset(buffer, 255, 4); CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0); @@ -166,22 +167,13 @@ Common::Error NeverhoodEngine::run() { _mouseY = event.mouse.y; _gameModule->handleMouseMove(event.mouse.x, event.mouse.y); break; - case Common::EVENT_LBUTTONDOWN: case Common::EVENT_RBUTTONDOWN: _gameModule->handleMouseDown(event.mouse.x, event.mouse.y); break; - /* - _buttonState |= kLeftButton; - break; case Common::EVENT_LBUTTONUP: - _buttonState &= ~kLeftButton; - break; - _buttonState |= kRightButton; - break; case Common::EVENT_RBUTTONUP: - _buttonState &= ~kRightButton; break; case Common::EVENT_QUIT: _system->quit(); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 7252e391a0..2b5c81b4ad 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -179,7 +179,6 @@ void Scene::update() { if (_smkFileHash != 0) { // TODO - //**** ALL TODO _smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0); _savedUpdateHandlerCb = _updateHandlerCb; _savedMessageHandlerCb = _messageHandlerCb; diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 7b3d4bc6e5..a88491424c 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -104,7 +104,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, else ddRect.x2 = drawRect.width; - if (drawRect.x <= clipRect.x1) { + if (drawRect.x < clipRect.x1) { destX = clipRect.x1; ddRect.x1 = clipRect.x1 - drawRect.x; } else { @@ -117,7 +117,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, else ddRect.y2 = drawRect.height; - if (drawRect.y <= clipRect.y1) { + if (drawRect.y < clipRect.y1) { destY = clipRect.y1; ddRect.y1 = clipRect.y1 - drawRect.y; } else { @@ -125,13 +125,16 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, ddRect.y1 = 0; } - debug(8, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); - + debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); + const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); int width = ddRect.x2 - ddRect.x1; int height = ddRect.y2 - ddRect.y1; + if (width <= 0 || height <= 0) + return; + if (!transparent) { while (height--) { memcpy(dest, source, width); @@ -146,8 +149,13 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, source += surface->pitch; dest += _backScreen->pitch; } - } - + } + + // Useful for debugging + //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); + //_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); + //_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255); + } void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) { -- cgit v1.2.3 From 8a5c4a84d082074ad7aa47c5f797876b1cb7120f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 14 Jul 2011 08:20:40 +0000 Subject: NEVERHOOD: Implement color replace in AnimatedSprite (used to disable a color in sprite drawing) --- engines/neverhood/graphics.cpp | 45 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/graphics.h | 1 + engines/neverhood/module1000.cpp | 10 ++++----- engines/neverhood/resource.cpp | 15 ++++++++++---- engines/neverhood/resource.h | 6 ++++-- engines/neverhood/sprite.cpp | 35 +++++++++++++++++++------------ engines/neverhood/sprite.h | 6 ++++-- 7 files changed, 92 insertions(+), 26 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 68134bda97..b9e2c482a1 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -197,6 +197,51 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi } +void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY) { + + // TODO: Flip Y + + debug("unpackSpriteRleRepl(%d, %d)", oldColor, newColor); + + int16 rows, chunks; + int16 skip, copy; + + rows = READ_LE_UINT16(source); + chunks = READ_LE_UINT16(source + 2); + source += 4; + + do { + if (chunks == 0) { + dest += rows * destPitch; + } else { + while (rows-- > 0) { + uint16 rowChunks = chunks; + while (rowChunks-- > 0) { + skip = READ_LE_UINT16(source); + copy = READ_LE_UINT16(source + 2); + source += 4; + if (!flipX) { + for (int xc = 0; xc < copy; xc++) { + dest[skip + xc] = source[xc] == oldColor ? newColor : source[xc]; + } + } else { + byte *flipDest = dest + width - skip - 1; + for (int xc = 0; xc < copy; xc++) { + *flipDest-- = source[xc] == oldColor ? newColor : source[xc]; + } + } + source += copy; + } + dest += destPitch; + } + } + rows = READ_LE_UINT16(source); + chunks = READ_LE_UINT16(source + 2); + source += 4; + } while (rows > 0); + +} + void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { // TODO: Flip Y diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 2bddea3156..9ac23a81f5 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -91,6 +91,7 @@ protected: void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels); void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); +void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY); void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 529cbeab07..04059caf7d 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -924,10 +924,10 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui _fileHashes[0] = fileHash1; _fileHashes[1] = fileHash2; - + _spriteResource.load2(fileHash1); createSurface(surfacePriority, 40, 40); - + _surface->getDrawRect().x = 0; _surface->getDrawRect().y = 0; _surface->getDrawRect().width = _spriteResource.getDimensions().width; @@ -1379,7 +1379,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) //_class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); // TODO - // TODO _klayman->setRepl(64, 0); + _klayman->setRepl(64, 0); } else { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435); //_class478 = addSprite(new Class478(_vm, _klayman)); @@ -1407,7 +1407,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) // TODO //_class479 = addSprite(new Class479(_vm, this, _klayman)); // TODO - // TODO _klayman->setRepl(64, 0); + _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; } } @@ -1461,7 +1461,7 @@ void Scene1002::update() { if (!_flag1B4 && _klayman->getY() > 230) { // TODO deleteSprite(&_ssLadderArchPart3); - // TODO _klayman->clearRepl(); + _klayman->clearRepl(); _flag1B4 = true; _vm->_gameState.field2 = 1; } diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index dde80ebe79..97eae89bd5 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -158,8 +158,10 @@ void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, _currSpriteData = _spriteData + frameInfo.spriteDataOffs; _width = frameInfo.rect.width; _height = frameInfo.rect.height; - // TODO: Repl stuff - unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY); + if (_replEnabled && _replOldColor != _replNewColor) + unpackSpriteRleRepl(_currSpriteData, _width, _height, dest, destPitch, _replOldColor, _replNewColor, flipX, flipY); + else + unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY); } bool AnimResource::load(uint32 fileHash) { @@ -276,8 +278,8 @@ void AnimResource::clear() { void AnimResource::clear2() { clear(); _replEnabled = true; - _replOldByte = 0; - _replNewByte = 0; + _replOldColor = 0; + _replNewColor = 0; } bool AnimResource::loadInternal(uint32 fileHash) { @@ -301,6 +303,11 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) { return frameIndex; } +void AnimResource::setRepl(byte oldColor, byte newColor) { + _replOldColor = oldColor; + _replNewColor = newColor; +} + MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) : _cursorSprite(vm), _cursorNum(4), _currFileHash(0) { diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index b2a98c7670..610973c155 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -87,6 +87,8 @@ public: uint getFrameCount() const { return _frames.size(); } const AnimFrameInfo& getFrameInfo(int16 index) const { return _frames[index]; } int16 getFrameIndex(uint32 frameHash); + void setReplEnabled(bool value) { _replEnabled = value; } + void setRepl(byte oldColor, byte newColor); protected: NeverhoodEngine *_vm; int _resourceHandle; @@ -96,8 +98,8 @@ protected: byte *_paletteData; byte *_spriteData; bool _replEnabled; - byte _replOldByte; - byte _replNewByte; + byte _replOldColor; + byte _replNewColor; Common::Array _frames; }; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 155d3254ec..78c780bdbb 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -227,9 +227,9 @@ void AnimatedSprite::init() { _newHashListIndex = -1; _fileHash4 = 0; _flag = false; - _replOldByte = 0; - _replNewByte = 0; - // TODO _animResource.replEnabled = 0; + _replOldColor = 0; + _replNewColor = 0; + _animResource.setReplEnabled(false); _playBackwards = false; } @@ -255,6 +255,18 @@ void AnimatedSprite::updateDeltaXY() { processDelta(); } +void AnimatedSprite::setRepl(byte oldColor, byte newColor) { + _replOldColor = oldColor; + _replNewColor = newColor; + _animResource.setReplEnabled(true); +} + +void AnimatedSprite::clearRepl() { + _replOldColor = 0; + _replNewColor = 0; + _animResource.setReplEnabled(false); +} + void AnimatedSprite::updateAnim() { _flag = false; @@ -280,9 +292,8 @@ void AnimatedSprite::updateAnim() { // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } - if (_replNewByte != _replOldByte) { - debug("TODO"); - // TODO _animResource.setRepl(_replOldByte, _replNewByte); + if (_replOldColor != _replNewColor) { + _animResource.setRepl(_replOldColor, _replNewColor); } _fileHash2 = 0; if (_animStatus != 0) { @@ -313,9 +324,8 @@ void AnimatedSprite::updateAnim() { // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } - if (_replNewByte != _replOldByte) { - debug("TODO"); - // TODO _animResource.setRepl(_replOldByte, _replNewByte); + if (_replOldColor != _replNewColor) { + _animResource.setRepl(_replOldColor, _replNewColor); } _fileHash1 = 0; _frameIndex = _fileHash6 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash6)) : 0; @@ -328,9 +338,8 @@ void AnimatedSprite::updateAnim() { // TODO _animResource.loadInternal(calcHash("sqDefault")); _fileHash3 = 0; } - if (_replNewByte != _replOldByte) { - debug("TODO"); - // TODO _animResource.setRepl(_replOldByte, _replNewByte); + if (_replOldColor != _replNewColor) { + _animResource.setRepl(_replOldColor, _replNewColor); } _fileHash1 = 0; _frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1; @@ -377,7 +386,7 @@ void AnimatedSprite::updatePosition() { void AnimatedSprite::updateFrameIndex() { if (!_playBackwards) { - debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2); + //debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2); if (_frameIndex < _frameIndex2) { _frameIndex++; } else { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 996c063b42..71660ff985 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -107,6 +107,8 @@ public: AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y); void update(); void updateDeltaXY(); + void setRepl(byte oldColor, byte newColor); + void clearRepl(); protected: typedef void (AnimatedSprite::*AnimationCb)(); AnimResource _animResource; @@ -125,8 +127,8 @@ protected: int _newHashListIndex; uint32 _fileHash4; int16 _deltaX, _deltaY; - byte _replOldByte; - byte _replNewByte; + byte _replOldColor; + byte _replNewColor; bool _playBackwards; bool _flag; /* TODO -- cgit v1.2.3 From 78365121ea9931eb5973c2dcc0cae278fcc6a58d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 14 Jul 2011 13:25:12 +0000 Subject: NEVERHOOD: Add NavigationLists in create_neverhood --- devtools/create_neverhood/create_neverhood.cpp | 61 ++++++++++++++++++++++++- devtools/create_neverhood/tables.h | 4 ++ dists/engine-data/neverhood.dat | Bin 2138 -> 2194 bytes 3 files changed, 63 insertions(+), 2 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 84f3f74ac8..25ef67651d 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -81,6 +81,18 @@ struct MessageItem { typedef std::vector MessageItems; +struct NavigationItem { + uint32 fileHash; + uint32 leftSmackerFileHash; + uint32 rightSmackerFileHash; + uint32 middleSmackerFileHash; + byte interactive; + byte middleFlag; + uint32 mouseCursorFileHash; +}; + +typedef std::vector NavigationItems; + struct HitRectList { uint32 id; HitRects hitRects; @@ -96,9 +108,15 @@ struct MessageList { MessageItems messageItems; }; +struct NavigationList { + uint32 id; + NavigationItems navigationItems; +}; + std::vector hitRectLists; std::vector rectLists; std::vector messageLists; +std::vector navigationLists; byte *getData(uint32 offset) { return data + offset - dataStart + fileStart; @@ -125,7 +143,6 @@ void addHitRect(uint32 count, uint32 offset) { void addMessage(uint32 count, uint32 offset) { MessageList *messageList = new MessageList(); messageList->id = offset; - // Special code for message lists which are set at runtime (but otherwise constant) switch (offset) { // Scene 1002 rings @@ -161,7 +178,6 @@ void addMessage(uint32 count, uint32 offset) { item += 8; } } - messageLists.push_back(messageList); } @@ -199,6 +215,25 @@ void addRect(uint32 count, uint32 offset) { rectLists.push_back(rectList); } +void addNavigation(uint32 count, uint32 offset) { + NavigationList *navigationList = new NavigationList(); + navigationList->id = offset; + byte *item = getData(offset); + for (uint32 i = 0; i < count; i++) { + NavigationItem navigationItem; + navigationItem.fileHash = READ_LE_UINT32(item + 0); + navigationItem.leftSmackerFileHash = READ_LE_UINT32(item + 4); + navigationItem.rightSmackerFileHash = READ_LE_UINT32(item + 8); + navigationItem.middleSmackerFileHash = READ_LE_UINT32(item + 12); + navigationItem.interactive = item[16]; + navigationItem.middleFlag = item[17]; + navigationItem.mouseCursorFileHash = READ_LE_UINT32(item + 20); + item += 24; + navigationList->navigationItems.push_back(navigationItem); + } + navigationLists.push_back(navigationList); +} + int main(int argc, char *argv[]) { FILE *datFile; @@ -217,6 +252,10 @@ int main(int argc, char *argv[]) { addMessage(messageListOffsets[i], messageListOffsets[i + 1]); } + for (int i = 0; navigationListOffsets[i] != 0; i += 2) { + addNavigation(navigationListOffsets[i], navigationListOffsets[i + 1]); + } + datFile = fopen("neverhood.dat", "wb"); writeUint32LE(datFile, 0x11223344); // Some magic @@ -274,6 +313,24 @@ int main(int argc, char *argv[]) { } } + // Write all navigation lists + writeUint32LE(datFile, navigationLists.size()); + for (std::vector::iterator it = navigationLists.begin(); it != navigationLists.end(); it++) { + NavigationList *navigationList = *it; + writeUint32LE(datFile, navigationList->id); + writeUint32LE(datFile, navigationList->navigationItems.size()); + for (uint32 i = 0; i < navigationList->navigationItems.size(); i++) { + const NavigationItem &navigationItem = navigationList->navigationItems[i]; + writeUint32LE(datFile, navigationItem.fileHash); + writeUint32LE(datFile, navigationItem.leftSmackerFileHash); + writeUint32LE(datFile, navigationItem.rightSmackerFileHash); + writeUint32LE(datFile, navigationItem.middleSmackerFileHash); + writeByte(datFile, navigationItem.interactive); + writeByte(datFile, navigationItem.middleFlag); + writeUint32LE(datFile, navigationItem.mouseCursorFileHash); + } + } + fclose(datFile); printf("Done.\n"); diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 7aba996ef8..3024197a88 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -67,3 +67,7 @@ static const uint32 messageListOffsets[] = { 0, 0 }; +static const uint32 navigationListOffsets[] = { + // Module2300 + 2, 0x004B67B8 +}; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index f02d72ca1b..a9bd4fd0a4 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From db9e45706caa2a4d2eddcb0c63532b3f6429a73e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 14 Jul 2011 13:51:45 +0000 Subject: NEVERHOOD: More work on Scene1002 - Implement NavigationMouse and NavigationLists - Some renaming --- engines/neverhood/module1000.cpp | 51 ++++++++++--- engines/neverhood/module1000.h | 12 ++- engines/neverhood/mouse.cpp | 155 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/mouse.h | 13 ++++ engines/neverhood/sprite.cpp | 14 ++-- engines/neverhood/sprite.h | 6 +- engines/neverhood/staticdata.cpp | 27 +++++++ engines/neverhood/staticdata.h | 14 ++++ 8 files changed, 272 insertions(+), 20 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 04059caf7d..bb15998063 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -790,17 +790,17 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x4808: setGlobalVar(0x8306F218, 1); - SetSpriteCallback(&AsScene1002Door::spriteUpdate447D10); + SetSpriteCallback(&AsScene1002Door::suOpenDoor); break; case 0x4809: setGlobalVar(0x8306F218, 0); - SetSpriteCallback(&AsScene1002Door::spriteUpdate447D40); + SetSpriteCallback(&AsScene1002Door::suCloseDoor); break; } return messageResult; } -void AsScene1002Door::spriteUpdate447D10() { +void AsScene1002Door::suOpenDoor() { if (_y > 49) { _y -= 8; if (_y < 49) { @@ -811,7 +811,7 @@ void AsScene1002Door::spriteUpdate447D10() { } } -void AsScene1002Door::spriteUpdate447D40() { +void AsScene1002Door::suCloseDoor() { if (_y < 239) { _y += 8; if (_y > 239) { @@ -1332,6 +1332,36 @@ void Class506::sub4492C0() { setFileHash1(); } +Class478::Class478(NeverhoodEngine *vm, Klayman *klayman) + : AnimatedSprite(vm, 1200), _klayman(klayman) { + + createSurface(1200, 40, 163); + SetUpdateHandler(&Class478::update); + SetMessageHandler(&Sprite::handleMessage); + _surface->setVisible(false); +} + +void Class478::update() { + if (_klayman->getCurrAnimFileHash() == 0x3A292504) { + setFileHash(0xBA280522, _frameIndex, -1); + _newHashListIndex = _klayman->getFrameIndex(); + _surface->setVisible(true); + _x = _klayman->getX(); + _y = _klayman->getY(); + setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); + } else if (_klayman->getCurrAnimFileHash() == 0x122D1505) { + setFileHash(0x1319150C, _frameIndex, -1); + _newHashListIndex = _klayman->getFrameIndex(); + _surface->setVisible(true); + _x = _klayman->getX(); + _y = _klayman->getY(); + setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); + } else { + _surface->setVisible(false); + } + AnimatedSprite::update(); +} + Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _flag1B4(false), _flag1BE(false) { @@ -1373,36 +1403,39 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class599 = addSprite(new Class599(_vm, this)); + // DEBUG/HACK!!!! + which = 1; setGlobalVar(0x8306F218, 1); + if (which < 0) { if (_vm->_gameState.field2 == 0) { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); - //_class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); // TODO _klayman->setRepl(64, 0); } else { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435); - //_class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); // TODO } } else { if (which == 1) { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435); - //_class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); // TODO _vm->_gameState.field2 = 1; } else if (which == 2) { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645); - //_class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4298); // TODO _vm->_gameState.field2 = 1; _klayman->sendMessage(0x4820, 0, this); } else { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); - //_class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4470); // TODO //_class479 = addSprite(new Class479(_vm, this, _klayman)); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 79a4985ffc..51cb9a4126 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -172,8 +172,8 @@ public: protected: void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate447D10(); - void spriteUpdate447D40(); + void suOpenDoor(); + void suCloseDoor(); }; class Class505 : public AnimatedSprite { @@ -254,6 +254,14 @@ protected: void sub4492C0(); }; +class Class478 : public AnimatedSprite { +public: + Class478(NeverhoodEngine *vm, Klayman *klayman); +protected: + Klayman *_klayman; + void update(); +}; + class Scene1002 : public Scene { public: Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 381f4a7186..63d98666d6 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -224,4 +224,159 @@ void Mouse435::updateCursor() { } +// NavigationMouse + +NavigationMouse::NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type) + : StaticSprite(vm, 2000), _mouseCursorResource(vm), _type(type), _frameNum(0) { + + _mouseCursorResource.load(fileHash); + _mouseCursorResource.setCursorNum(0); + _x = _vm->getMouseX(); + _y = _vm->getMouseY(); + createSurface(2000, 32, 32); + SetUpdateHandler(&NavigationMouse::update); + SetMessageHandler(&NavigationMouse::handleMessage); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = 32; + _drawRect.height = 32; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = 32; + _deltaRect.height = 32; + processDelta(); + _needRefresh = true; + updateCursor(); +} + +void NavigationMouse::update() { + updateCursor(); + _frameNum++; + if (_frameNum >= 6) + _frameNum = 0; + _needRefresh = _frameNum % 2 == 0; +} + +uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2064: + _x = param.asPoint().x; + _y = param.asPoint().y; + switch (_type) { + case 1: + if (_x >= 320) + messageResult = 1; + else + messageResult = 0; + break; + case 2: + default: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else + messageResult = 2; + break; + case 3: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else + messageResult = 4; + break; + case 4: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else if (_y >= 150) + messageResult = 2; + else + messageResult = 3; + break; + case 5: + if (_y >= 240) + messageResult = 4; + else + messageResult = 3; + break; + } + break; + case 0x4002: + _x = param.asPoint().x; + _y = param.asPoint().y; + switch (_type) { + case 1: + if (_x >= 320) + _mouseCursorResource.setCursorNum(6); + else + _mouseCursorResource.setCursorNum(5); + break; + case 2: + default: + if (_x < 100) + _mouseCursorResource.setCursorNum(6); + else if (_x > 540) + _mouseCursorResource.setCursorNum(5); + else + _mouseCursorResource.setCursorNum(0); + break; + case 3: + if (_x < 100) + _mouseCursorResource.setCursorNum(1); + else if (_x > 540) + _mouseCursorResource.setCursorNum(1); + break; + case 4: + if (_x < 100) + _mouseCursorResource.setCursorNum(6); + else if (_x > 540) + _mouseCursorResource.setCursorNum(5); + else if (_y >= 150) + _mouseCursorResource.setCursorNum(0); + else + _mouseCursorResource.setCursorNum(3); + break; + case 5: + if (_y >= 240) + _mouseCursorResource.setCursorNum(2); + else + _mouseCursorResource.setCursorNum(3); + break; + } + _needRefresh = true; + processDelta(); + break; + } + return messageResult; +} + +void NavigationMouse::updateCursor() { + + if (!_surface) + return; + + if (_doDeltaX) { + _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); + } else { + _surface->getDrawRect().x = filterX(_x + _drawRect.x); + } + + if (_doDeltaY) { + _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); + } else { + _surface->getDrawRect().y = filterY(_y + _drawRect.y); + } + + if (_needRefresh) { + _needRefresh = false; + _drawRect = _mouseCursorResource.getRect(); + _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); + } + +} + } // End of namespace Neverhood diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index 4bda936a91..4f27cb4e95 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -57,6 +57,19 @@ protected: void updateCursor(); }; +class NavigationMouse : public StaticSprite { +public: + NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type); + void load(uint32 fileHash); +protected: + MouseCursorResource _mouseCursorResource; + int _frameNum; + int _type; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void updateCursor(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MOUSE_H */ diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 78c780bdbb..4996bdd28a 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -286,11 +286,11 @@ void AnimatedSprite::updateAnim() { if (_fileHash2 != 0) { if (_animResource.loadInternal(_fileHash2)) { - _fileHash3 = _fileHash2; + _currAnimFileHash = _fileHash2; } else { debug("TODO"); // TODO _animResource.loadInternal(calcHash("sqDefault")); - _fileHash3 = 0; + _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { _animResource.setRepl(_replOldColor, _replNewColor); @@ -318,11 +318,11 @@ void AnimatedSprite::updateAnim() { } else { if (_animStatus == 1) { if (_animResource.loadInternal(_fileHash1)) { - _fileHash3 = _fileHash1; + _currAnimFileHash = _fileHash1; } else { debug("TODO"); // TODO _animResource.loadInternal(calcHash("sqDefault")); - _fileHash3 = 0; + _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { _animResource.setRepl(_replOldColor, _replNewColor); @@ -332,11 +332,11 @@ void AnimatedSprite::updateAnim() { _frameIndex2 = _fileHash5 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1; } else { if (_animResource.loadInternal(_fileHash1)) { - _fileHash3 = _fileHash1; + _currAnimFileHash = _fileHash1; } else { debug("TODO"); // TODO _animResource.loadInternal(calcHash("sqDefault")); - _fileHash3 = 0; + _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { _animResource.setRepl(_replOldColor, _replNewColor); @@ -386,7 +386,7 @@ void AnimatedSprite::updatePosition() { void AnimatedSprite::updateFrameIndex() { if (!_playBackwards) { - //debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _fileHash3, _frameIndex, _frameIndex2); + //debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _currAnimFileHash, _frameIndex, _frameIndex2); if (_frameIndex < _frameIndex2) { _frameIndex++; } else { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 71660ff985..f1d8a87b69 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -52,6 +52,7 @@ public: bool isDoDeltaX() const { return _doDeltaX; } bool isDoDeltaY() const { return _doDeltaY; } NRect& getRect() { return _rect; } + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); protected: void (Sprite::*_spriteUpdateCb)(); Common::String _spriteUpdateCbName; // For debugging purposes @@ -70,7 +71,6 @@ protected: //0000004A field4A dw ? // seems to be unused except in ctor //0000004C rectResource RectResource ? //void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createSurface(int surfacePriority, int16 width, int16 height); void handleSpriteUpdate() { if (_spriteUpdateCb) @@ -109,12 +109,14 @@ public: void updateDeltaXY(); void setRepl(byte oldColor, byte newColor); void clearRepl(); + uint32 getCurrAnimFileHash() const { return _currAnimFileHash; } + int16 getFrameIndex() const { return _frameIndex; } protected: typedef void (AnimatedSprite::*AnimationCb)(); AnimResource _animResource; + uint32 _currAnimFileHash; uint32 _fileHash1; uint32 _fileHash2; - uint32 _fileHash3; int16 _frameIndex; int16 _frameIndex3; int16 _frameIndex2; diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index b9ac232707..42af4975ea 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -104,6 +104,27 @@ void StaticData::load(const char *filename) { _hitRectLists[id] = hitRectList; } + // Load navigation lists + uint32 navigationListsCount = fd.readUint32LE(); + debug("navigationListsCount: %d", navigationListsCount); + for (uint32 i = 0; i < navigationListsCount; i++) { + NavigationList *navigationList = new NavigationList(); + uint32 id = fd.readUint32LE(); + uint32 itemCount = fd.readUint32LE(); + for (uint32 itemIndex = 0; itemIndex < itemCount; itemIndex++) { + NavigationItem navigationItem; + navigationItem.fileHash = fd.readUint32LE(); + navigationItem.leftSmackerFileHash = fd.readUint32LE(); + navigationItem.rightSmackerFileHash = fd.readUint32LE(); + navigationItem.middleSmackerFileHash = fd.readUint32LE(); + navigationItem.interactive = fd.readByte(); + navigationItem.middleFlag = fd.readByte(); + navigationItem.mouseCursorFileHash = fd.readUint32LE(); + navigationList->push_back(navigationItem); + } + _navigationLists[id] = navigationList; + } + } HitRectList *StaticData::getHitRectList(uint32 id) { @@ -124,4 +145,10 @@ MessageList *StaticData::getMessageList(uint32 id) { return _messageLists[id]; } +NavigationList *StaticData::getNavigationList(uint32 id) { + if (!_navigationLists[id]) + error("StaticData::getNavigationList() NavigationList with id %08X not found", id); + return _navigationLists[id]; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index a7d8a65bdd..178e5c9eb5 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -56,6 +56,18 @@ struct MessageItem { typedef Common::Array MessageList; +struct NavigationItem { + uint32 fileHash; + uint32 leftSmackerFileHash; + uint32 rightSmackerFileHash; + uint32 middleSmackerFileHash; + byte interactive; + byte middleFlag; + uint32 mouseCursorFileHash; +}; + +typedef Common::Array NavigationList; + class StaticData { public: StaticData(); @@ -64,10 +76,12 @@ public: HitRectList *getHitRectList(uint32 id); RectList *getRectList(uint32 id); MessageList *getMessageList(uint32 id); + NavigationList *getNavigationList(uint32 id); protected: Common::HashMap _hitRectLists; Common::HashMap _rectLists; Common::HashMap _messageLists; + Common::HashMap _navigationLists; }; } // End of namespace Neverhood -- cgit v1.2.3 From 0bfb52df74ac47a4842c66d40fd0ae5efc5d6af6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 14 Jul 2011 19:03:09 +0000 Subject: NEVERHOOD: Implement NavigationScene - Work on the SmackerDecoder, create the surface immediately when a file is opened --- engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 2 + engines/neverhood/navigationscene.cpp | 212 ++++++++++++++++++++++++++++++++++ engines/neverhood/navigationscene.h | 56 +++++++++ engines/neverhood/neverhood.cpp | 7 ++ engines/neverhood/neverhood.h | 2 + engines/neverhood/smackerplayer.cpp | 35 ++++-- engines/neverhood/smackerplayer.h | 5 +- engines/neverhood/smackerscene.cpp | 1 - 9 files changed, 307 insertions(+), 14 deletions(-) create mode 100644 engines/neverhood/navigationscene.cpp create mode 100644 engines/neverhood/navigationscene.h diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index e39041e24d..af03c075cc 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -13,6 +13,7 @@ MODULE_OBJS = \ module1000.o \ module1500.o \ mouse.o \ + navigationscene.o \ neverhood.o \ palette.o \ resource.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index bb15998063..bc898621af 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/module1000.h" +#include "neverhood/navigationscene.h"//### namespace Neverhood { @@ -77,6 +78,7 @@ void Module1000::createScene1001(int which) { void Module1000::createScene1002(int which) { _vm->gameState().sceneNum = 1; _childObject = new Scene1002(_vm, this, which); + // DEBUG _childObject = new NavigationScene(_vm, this, 0x004B67B8, 0, NULL); // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); // TODO Music18hList_play(0x061880C6, 0, 0, 1); SetUpdateHandler(&Module1000::updateScene1002); diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp new file mode 100644 index 0000000000..81af71fe17 --- /dev/null +++ b/engines/neverhood/navigationscene.cpp @@ -0,0 +1,212 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/navigationscene.h" +#include "neverhood/mouse.h" + +namespace Neverhood { + +NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes) + : Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false), + _soundFlag1(false), _soundFlag2(false), _smackerFileHash(0), _interactive(true), _done(false) { + + _navigationList = _vm->_staticData->getNavigationList(navigationListId); + for (NavigationList::iterator it = _navigationList->begin(); it != _navigationList->end(); it++) { + debug("%08X %08X %08X %08X %d %d %08X", (*it).fileHash, (*it).leftSmackerFileHash, (*it).rightSmackerFileHash, + (*it).middleSmackerFileHash, (*it).interactive, (*it).middleFlag, (*it).mouseCursorFileHash); + } + + if (_navigationIndex < 0) { + _navigationIndex = (int)getGlobalVar(0x4200189E); + if (_navigationIndex >= (int)_navigationList->size()) + _navigationIndex = 0; + } + setGlobalVar(0x4200189E, _navigationIndex); + + SetUpdateHandler(&NavigationScene::update); + SetMessageHandler(&NavigationScene::handleMessage); + + _smackerPlayer = new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true); + + addEntity(_smackerPlayer); + + addSurface(_smackerPlayer->getSurface()); + + createMouseCursor(); + + _vm->_screen->clear(); + + _parentModule->sendMessage(0x100A, _navigationIndex, this); + +} + +NavigationScene::~NavigationScene() { + // TODO Sound1ChList_sub_4080B0(0); + // TODO Sound1ChList_sub_408110(0); +} + +byte NavigationScene::getNavigationAreaType() { + return 0; // TODO +} + +void NavigationScene::update() { + if (_smackerFileHash != 0) { + _mouseCursor->getSurface()->setVisible(false); + _smackerPlayer->open(_smackerFileHash, false); + _vm->_screen->clear(); + _smackerDone = false; + _smackerFileHash = 0; + } else if (_smackerDone) { + if (_done) { + _parentModule->sendMessage(0x1009, _navigationIndex, this); + } else { + const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; + createMouseCursor(); + _mouseCursor->getSurface()->setVisible(true); + _soundFlag2 = false; + _soundFlag1 = false; + _interactive = true; + // TODO Sound1ChList_sub_4080B0(0); + // TODO Sound1ChList_sub_408110(0); + _smackerDone = false; + _smackerPlayer->open(navigationItem.fileHash, true); + _vm->_screen->clear(); + _parentModule->sendMessage(0x100A, _navigationIndex, this); + } + } + Scene::update(); +} + +uint32 NavigationScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x0000: + _mouseCursor->sendMessage(0x4002, param, this); + break; + case 0x0001: + handleNavigation(param.asPoint()); + break; + case 0x0009: + if (!_interactive) + _smackerDone = true; + break; + case 0x3002: + _smackerDone = true; + break; + } + return 0; +} + +void NavigationScene::createMouseCursor() { + + const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; + uint32 mouseCursorFileHash; + int areaType; + + if (_mouseCursor) { + deleteSprite(&_mouseCursor); + } + + mouseCursorFileHash = navigationItem.mouseCursorFileHash; + // TODO: Check the resource... + if (mouseCursorFileHash == 0) + mouseCursorFileHash = 0x63A40028; + + if (_itemsTypes) { + areaType = _itemsTypes[_navigationIndex]; + } else if (navigationItem.middleSmackerFileHash != 0 || navigationItem.middleFlag) { + areaType = 0; + } else { + areaType = 1; + } + + _mouseCursor = addSprite(new NavigationMouse(_vm, mouseCursorFileHash, areaType)); + _mouseCursor->sendPointMessage(0x4002, _vm->getMousePos(), this); + +} + +void NavigationScene::handleNavigation(const NPoint &mousePos) { + + const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; + bool oldSoundFlag1 = _soundFlag1; + bool oldSoundFlag2 = _soundFlag2; + uint32 direction = _mouseCursor->sendPointMessage(0x2064, mousePos, this); + + switch (direction) { + // TODO: Merge cases 0 and 1? + case 0: + if (navigationItem.leftSmackerFileHash != 0) { + _smackerFileHash = navigationItem.leftSmackerFileHash; + _interactive = false; + _soundFlag1 = false; + _soundFlag2 = true; + do { + _navigationIndex--; + if (_navigationIndex < 0) + _navigationIndex = _navigationList->size() - 1; + } while (!(*_navigationList)[_navigationIndex].interactive); + setGlobalVar(0x4200189E, _navigationIndex); + } else { + _parentModule->sendMessage(0x1009, _navigationIndex, this); + } + break; + case 1: + if (navigationItem.rightSmackerFileHash != 0) { + _smackerFileHash = navigationItem.rightSmackerFileHash; + _interactive = false; + _soundFlag1 = false; + _soundFlag2 = true; + do { + _navigationIndex++; + if (_navigationIndex >= (int)_navigationList->size()) + _navigationIndex = 0; + } while (!(*_navigationList)[_navigationIndex].interactive); + setGlobalVar(0x4200189E, _navigationIndex); + } else { + _parentModule->sendMessage(0x1009, _navigationIndex, this); + } + break; + case 2: + case 3: + case 4: + if (navigationItem.middleFlag) { + _parentModule->sendMessage(0x1009, _navigationIndex, this); + } else if (navigationItem.middleSmackerFileHash != 0) { + _smackerFileHash = navigationItem.middleSmackerFileHash; + _interactive = false; + _soundFlag1 = true; + _soundFlag2 = false; + _done = true; + } + break; + } + + if (oldSoundFlag2 != _soundFlag2) { + // TODO Sound1ChList_sub_408110(_soundFlag2); + } + + if (oldSoundFlag1 != _soundFlag1) { + // TODO Sound1ChList_sub_4080B0(_soundFlag1); + } + +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h new file mode 100644 index 0000000000..08aefb7cc4 --- /dev/null +++ b/engines/neverhood/navigationscene.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_NAVIGATIONSCENE_H +#define NEVERHOOD_NAVIGATIONSCENE_H + +#include "neverhood/neverhood.h" +#include "neverhood/resourceman.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class NavigationScene : public Scene { +public: + NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes); + virtual ~NavigationScene(); + byte getNavigationAreaType(); +protected: + SmackerPlayer *_smackerPlayer; + bool _smackerDone; + NavigationList *_navigationList; + int _navigationIndex; + uint32 _smackerFileHash; + bool _interactive; + bool _soundFlag1; + bool _soundFlag2; + bool _done; + byte *_itemsTypes; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createMouseCursor(); + void handleNavigation(const NPoint &mousePos); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_NAVIGATIONSCENE_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 9e1475fe03..4440a05dd6 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -208,4 +208,11 @@ Common::Error NeverhoodEngine::run() { return Common::kNoError; } +NPoint NeverhoodEngine::getMousePos() { + NPoint pt; + pt.x = _mouseX; + pt.y = _mouseY; + return pt; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 38d773a324..86f7a0ad33 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -45,6 +45,7 @@ class GameVars; class ResourceMan; class Screen; class StaticData; +struct NPoint; struct GameState { int sceneNum; @@ -119,6 +120,7 @@ public: GameState& gameState() { return _gameState; } int16 getMouseX() const { return _mouseX; } int16 getMouseY() const { return _mouseY; } + NPoint getMousePos(); public: diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index bbb0db144c..f0b30084cc 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -20,6 +20,7 @@ * */ +#include "graphics/palette.h" #include "neverhood/smackerplayer.h" #include "neverhood/palette.h" #include "neverhood/resourceman.h" @@ -68,26 +69,37 @@ void SmackerDoubleSurface::draw() { SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag) : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false), - _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL) { + _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true) { + + debug("_smackerSurface = %p", (void*)_smackerSurface); SetUpdateHandler(&SmackerPlayer::update); + open(fileHash, flag); } SmackerPlayer::~SmackerPlayer() { close(); -} +} -void SmackerPlayer::open(uint32 fileHash, bool flag1) { +void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { debug("SmackerPlayer::open(%08X)", fileHash); - _flag1 = flag1; + _keepLastFrame = keepLastFrame; close(); + if (_doubleSurface) { + _smackerSurface = new SmackerDoubleSurface(_vm); + } else { + _smackerSurface = new SmackerSurface(_vm); + } + + _smackerFirst = true; + _stream = _vm->_res->createStream(fileHash); - // TODO: _flag1 stuff + // TODO: _keepLastFrame stuff _smackerDecoder = new Video::SmackerDecoder(_vm->_mixer); _smackerDecoder->loadStream(_stream); @@ -117,6 +129,8 @@ uint SmackerPlayer::getStatus() { void SmackerPlayer::update() { + debug(8, "SmackerPlayer::update()"); + if (!_smackerDecoder) return; @@ -129,20 +143,17 @@ void SmackerPlayer::update() { const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame(); - if (!_smackerSurface) { + if (_smackerFirst) { if (_doubleSurface) { - // TODO: Use SmackerDoubleSurface - _smackerSurface = new SmackerDoubleSurface(_vm); _smackerSurface->getDrawRect().x = 320 - _smackerDecoder->getWidth(); _smackerSurface->getDrawRect().y = 240 - _smackerDecoder->getHeight(); - // TODO DoubleDrawSurface.field_28 = false; _smackerSurface->setSmackerFrame(smackerFrame); } else { - _smackerSurface = new SmackerSurface(_vm); _smackerSurface->getDrawRect().x = (640 - _smackerDecoder->getWidth()) / 2; _smackerSurface->getDrawRect().y = (480 - _smackerDecoder->getHeight()) / 2; _smackerSurface->setSmackerFrame(smackerFrame); } + _smackerFirst = false; } if (_doubleSurface) { @@ -153,10 +164,12 @@ void SmackerPlayer::update() { _dirtyFlag = true; if (_smackerDecoder->hasDirtyPalette()) { + debug("updatePalette()"); updatePalette(); } - if (_smackerDecoder->endOfVideo() && !_flag1) { + if (_smackerDecoder->endOfVideo() && !_keepLastFrame) { + // Inform the scene about the end of the video playback if (_scene) { _scene->sendMessage(0x3002, 0, this); } diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index d923bbdf6b..2262277956 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -52,7 +52,7 @@ public: SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag); ~SmackerPlayer(); BaseSurface *getSurface() { return _smackerSurface; } - void open(uint32 fileHash, bool flag1); + void open(uint32 fileHash, bool keepLastFrame); void close(); void gotoFrame(uint frameNumber); uint getStatus(); @@ -61,9 +61,10 @@ protected: Palette *_palette; Video::SmackerDecoder *_smackerDecoder; SmackerSurface *_smackerSurface; + bool _smackerFirst; bool _doubleSurface; Common::SeekableReadStream *_stream; - bool _flag1; + bool _keepLastFrame; bool _flag2; bool _dirtyFlag; void update(); diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 1584ac32d9..ace77f9284 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -92,7 +92,6 @@ void SmackerScene::nextVideo() { _parentModule->sendMessage(0x1009, 0, this); } - } void SmackerScene::update() { -- cgit v1.2.3 From a23b694c94d318b3e06f450189aab82b3908fcc5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 16 Jul 2011 11:01:08 +0000 Subject: NEVERHOOD: Implement Scene1005 - Add FontSurface - Add DataResource - Fix NavigationScene, only accept input when interactive --- engines/neverhood/graphics.cpp | 46 ++++++ engines/neverhood/graphics.h | 18 +++ engines/neverhood/module1000.cpp | 204 +++++++++++++++++++++++++- engines/neverhood/module1000.h | 16 +++ engines/neverhood/navigationscene.cpp | 6 +- engines/neverhood/neverhood.cpp | 14 +- engines/neverhood/resource.cpp | 263 ++++++++++++++++++++++++++++++++++ engines/neverhood/resource.h | 72 ++++++++++ engines/neverhood/sprite.cpp | 11 +- 9 files changed, 639 insertions(+), 11 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index b9e2c482a1..e46d4eaf86 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -107,6 +107,52 @@ void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResour } } +void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent) { + // TODO: Clipping + byte *source = (byte*)sourceSurface->getBasePtr(sourceRect.x, sourceRect.y); + byte *dest = (byte*)_surface->getBasePtr(x, y); + int height = sourceRect.height; + if (!transparent) { + while (height--) { + memcpy(dest, source, sourceRect.width); + source += sourceSurface->pitch; + dest += _surface->pitch; + } + } else { + while (height--) { + for (int xc = 0; xc < sourceRect.width; xc++) + if (source[xc] != 0) + dest[xc] = source[xc]; + source += sourceSurface->pitch; + dest += _surface->pitch; + } + } +} + +// FontSurface + +FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) + : BaseSurface(vm, 0, charWidth * 16, charHeight * numRows), _tracking(tracking), _numRows(numRows), _firstChar(firstChar), + _charWidth(charWidth), _charHeight(charHeight) { +} + +void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) { + NDrawRect sourceRect; + chr -= _firstChar; + sourceRect.x = (chr % 16) * _charWidth; + sourceRect.y = (chr / 16) * _charHeight; + sourceRect.width = _charWidth; + sourceRect.height = _charHeight; + destSurface->copyFrom(_surface, x, y, sourceRect, true); +} + +void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string) { + for (; *string != 0; string++) { + drawChar(destSurface, x, y, *string); + x += (*_tracking)[*string - _firstChar].x; + } +} + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 9ac23a81f5..8bdf0afd3d 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -34,6 +34,8 @@ struct NPoint { int16 x, y; }; +typedef Common::Array NPointArray; + struct NDimensions { int16 width, height; }; @@ -44,6 +46,8 @@ struct NRect { NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {} }; +typedef Common::Array NRectArray; + struct NDrawRect { int16 x, y, width, height; NDrawRect() : x(0), y(0), width(0), height(0) {} @@ -67,6 +71,7 @@ public: void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height); void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height); void drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum); + void copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent); int getPriority() const { return _priority; } void setPriority(int priority) { _priority = priority; } NDrawRect& getDrawRect() { return _drawRect; } @@ -87,6 +92,19 @@ protected: bool _transparent; }; +class FontSurface : public BaseSurface { +public: + FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); + void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); + void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string); +protected: + NPointArray *_tracking; + uint16 _numRows; + byte _firstChar; + uint16 _charWidth; + uint16 _charHeight; +}; + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index bc898621af..6825f62926 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -56,7 +56,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 0) { //createScene1001(0); // DEBUG: Jump to room - createScene1002(0); + //createScene1002(0); + createScene1005(0); } else if (which == 1) { createScene1002(1); } @@ -95,6 +96,11 @@ void Module1000::createScene1004(int which) { } void Module1000::createScene1005(int which) { + _vm->gameState().sceneNum = 4; + _childObject = new Scene1005(_vm, this, which); + // TODO Music18hList_stop(0x061880C6, 0, 0); + // TODO Music18hList_play(_musicFileHash, 0, 0, 1); + SetUpdateHandler(&Module1000::updateScene1002); } void Module1000::updateScene1001() { @@ -196,6 +202,16 @@ void Module1000::updateScene1004() { } void Module1000::updateScene1005() { + _childObject->handleUpdate(); + if (_done) { + debug("SCENE 1005 DONE"); + // TODO Music18hList_stop(_musicFileHash, 0, 1); + _done = false; + delete _childObject; + _childObject = NULL; + createScene1004(1); + _childObject->handleUpdate(); + } } // Scene1001 @@ -1673,4 +1689,190 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity return 0; } +// Scene1005 + +Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + SetMessageHandler(&Scene1005::handleMessage); + + _surfaceFlag = true; + + if (getGlobalVar(0xD0A14D10)) { + _background = addBackground(new DirtyBackground(_vm, 0x2800E011, 0, 0)); + _palette = new Palette(_vm, 0x2800E011); + _palette->usePalette(); + addSprite(new StaticSprite(_vm, 0x492D5AD7, 100)); + _mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620)); + } else { + _background = addBackground(new DirtyBackground(_vm, 0x8870A546, 0, 0)); + _palette = new Palette(_vm, 0x8870A546); + _palette->usePalette(); + addSprite(new StaticSprite(_vm, 0x40D1E0A9, 100)); + addSprite(new StaticSprite(_vm, 0x149C00A6, 100)); + _mouseCursor = addSprite(new Mouse435(_vm, 0x0A54288F, 20, 620)); + } + + drawTextToBackground(); + +} + +Scene1005::~Scene1005() { +} + +uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + } + return 0; +} + +void Scene1005::drawTextToBackground() { + TextResource textResource(_vm); + const char *textStart, *textEnd; + int16 y = 36; + uint32 textIndex = getTextIndex(); + FontSurface *fontSurface = createFontSurface(); + textResource.load(0x80283101); + textStart = textResource.getString(textIndex, textEnd); + while (textStart < textEnd) { + fontSurface->drawString(_background->getSurface(), 188, y, (const byte*)textStart); + y += 36; + textStart += strlen(textStart) + 1; + } + delete fontSurface; +} + +FontSurface *Scene1005::createFontSurface() { + FontSurface *fontSurface; + DataResource fontData(_vm); + SpriteResource fontSprite(_vm); + fontData.load(calcHash("asRecFont")); + uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x; + uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x; + uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; + uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; + NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); + fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight); + if (getGlobalVar(0xD0A14D10)) { + fontSprite.load2(0x283CE401); + } else { + fontSprite.load2(0xC6604282); + } + fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0); + return fontSurface; +} + +uint32 Scene1005::getTextIndex() { + uint32 textIndex; + textIndex = getTextIndex1(); + if (getGlobalVar(0xD0A14D10)) { + textIndex = getTextIndex2(); + } + if (getGlobalVar(0x8440001F) && getGlobalVar(0x01830201) == textIndex) { + textIndex = getTextIndex3(); + } else { + setGlobalVar(0x8440001F, 1); + setGlobalVar(0x01830201, textIndex); + } + return textIndex; +} + +uint32 Scene1005::getTextIndex1() { + uint32 textIndex; + if (getGlobalVar(0x98109F12)) { + if (!getGlobalVar(0x2090590C)) + textIndex = 18; + else if (!getGlobalVar(0x610210B7)) + textIndex = 19; + else if (getGlobalVar(0x0C0288F4)) { + if (!getGlobalVar(0xD0A14D10)) + textIndex = 23; + else if (!getSubVar(0x0090EA95, 0) && !getSubVar(0x08D0AB11, 0)) + textIndex = 24; + else if (!getGlobalVar(0xC0780812)) + textIndex = 26; + else if (!getSubVar(0x0090EA95, 1) && !getSubVar(0x08D0AB11, 1)) + textIndex = 27; + else if (!getGlobalVar(0xC0780812)) + textIndex = 28; + else + textIndex = 29; + } else if (!getGlobalVar(0xE7498218)) + textIndex = 20; + else if (!getGlobalVar(0x081890D14)) + textIndex = 21; + else + textIndex = 22; + } else if (getGlobalVar(0x00040153)) { + if (!getGlobalVar(0x10938830)) + textIndex = 12; + else if (!getGlobalVar(0x2050861A)) + textIndex = 13; + else if (!getGlobalVar(0x4DE80AC0)) + textIndex = 50; + else if (!getGlobalVar(0x89C669AA)) + textIndex = 14; + else if (!getGlobalVar(0x1C1B8A9A)) + textIndex = 15; + else if (!getGlobalVar(0xCB45DE03)) + textIndex = 16; + else + textIndex = 17; + } else if (!getGlobalVar(0x2B514304)) { + textIndex = 0; + } else if (getGlobalVar(0x0A18CA33)) { + if (!getGlobalVar(0x404290D5)) + textIndex = 4; + else if (!getGlobalVar(0x45080C38)) + textIndex = 5; + else if (!getSubVar(0x14800353, 0x40119852)) + textIndex = 6; + else if (!getGlobalVar(0x4E0BE910)) + textIndex = 7; + else if (!getGlobalVar(0x86615030)) + textIndex = 8; + else if (!getSubVar(0x14800353, 0x304008D2)) + textIndex = 9; + else if (!getSubVar(0x14800353, 0x01180951)) + textIndex = 10; + else + textIndex = 11; + } else if (!getGlobalVar(0x0A310817)) { + textIndex = 1; + } else if (getGlobalVar(0x000CF819)) { + textIndex = 3; + } else { + textIndex = 2; + } + return textIndex; +} + +uint32 Scene1005::getTextIndex2() { + uint32 textIndex = getGlobalVar(0x29408F00); + if (textIndex + 1 >= 10) { + setGlobalVar(0x29408F00, 0); + textIndex = 0; + } else { + setGlobalVar(0x29408F00, textIndex + 1); + } + return textIndex + 40; +} + +uint32 Scene1005::getTextIndex3() { + uint32 textIndex = getGlobalVar(0x8A140C21); + if (textIndex + 1 >= 10) { + setGlobalVar(0x8A140C21, 0); + textIndex = 0; + } else { + setGlobalVar(0x8A140C21, textIndex + 1); + } + return textIndex + 30; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 51cb9a4126..4b2121eb53 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -302,6 +302,22 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// Scene1005 + +class Scene1005 : public Scene { +public: + Scene1005(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1005(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void drawTextToBackground(); + FontSurface *createFontSurface(); + uint32 getTextIndex(); + uint32 getTextIndex1(); + uint32 getTextIndex2(); + uint32 getTextIndex3(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1000_H */ diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 81af71fe17..f6be668b3c 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -99,10 +99,12 @@ void NavigationScene::update() { uint32 NavigationScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x0000: - _mouseCursor->sendMessage(0x4002, param, this); + if (_interactive) + _mouseCursor->sendMessage(0x4002, param, this); break; case 0x0001: - handleNavigation(param.asPoint()); + if (_interactive) + handleNavigation(param.asPoint()); break; case 0x0009: if (!_interactive) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 4440a05dd6..1f253c0a15 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -146,6 +146,16 @@ Common::Error NeverhoodEngine::run() { } #endif +#if 0 + { // Create a new scope + DataResource dataResource(this); + //dataResource.load(0x01801002); + //dataResource.load(0x84500132); + dataResource.load(0x81120132); + } +#endif + +#if 1 _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); @@ -196,7 +206,9 @@ Common::Error NeverhoodEngine::run() { delete _gameModule; delete _collisionMan; - +#endif + + delete _res; delete _screen; diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 97eae89bd5..1c376105cf 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -20,11 +20,16 @@ * */ +#include "common/memstream.h" #include "neverhood/resource.h" #include "neverhood/resourceman.h" namespace Neverhood { +// TODO: Since the load() methods are similar in most cases some of the code therein +// can probably be copied into another method (e.g. inside the resource manager) +// to reduce code. + // SpriteResource SpriteResource::SpriteResource(NeverhoodEngine *vm) @@ -360,6 +365,248 @@ void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) { } } +// TextResource + +TextResource::TextResource(NeverhoodEngine *vm) + : _vm(vm), _resourceHandle(-1), _textData(NULL), _count(0) { + +} + +TextResource::~TextResource() { + unload(); +} + +void TextResource::load(uint32 fileHash) { + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle != -1) { + if (_vm->_res->getResourceType(_resourceHandle) == 6) { + _textData = _vm->_res->loadResource(_resourceHandle, true); + _count = READ_LE_UINT32(_textData); + } else { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + } + } +} + +void TextResource::unload() { + if (_resourceHandle != -1) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + _textData = NULL; + _count = 0; + } +} + +const char *TextResource::getString(uint index, const char *&textEnd) { + const char *textStart = (const char*)(_textData + 4 + _count * 4 + READ_LE_UINT32(_textData + (index + 1) * 4)); + textEnd = (const char*)(_textData + 4 + _count * 4 + READ_LE_UINT32(_textData + (index + 2) * 4)); + return textStart; +} + +// DataResource + +DataResource::DataResource(NeverhoodEngine *vm) + : _vm(vm), _resourceHandle(-1) { +} + +DataResource::~DataResource() { + unload(); +} + +void DataResource::load(uint32 fileHash) { + debug("DataResource::load(%08X)", fileHash); + byte *data = NULL; + uint32 dataSize = 0; + unload(); + _resourceHandle = _vm->_res->useResource(fileHash); + if (_resourceHandle != -1) { + if (_vm->_res->getResourceType(_resourceHandle) == 5) { + data = _vm->_res->loadResource(_resourceHandle, true); + dataSize = _vm->_res->getResourceSize(_resourceHandle); + } else { + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + } + } + if (data && dataSize) { + Common::MemoryReadStream dataS(data, dataSize); + uint itemCount = dataS.readUint16LE(); + uint32 itemStartOffs = 2 + itemCount * 8; + debug("itemCount = %d", itemCount); + for (uint i = 0; i < itemCount; i++) { + dataS.seek(2 + i * 8); + DRDirectoryItem drDirectoryItem; + drDirectoryItem.nameHash = dataS.readUint32LE(); + drDirectoryItem.offset = dataS.readUint16LE(); + drDirectoryItem.type = dataS.readUint16LE(); + debug("%03d nameHash = %08X; offset = %04X; type = %d", i, drDirectoryItem.nameHash, drDirectoryItem.offset, drDirectoryItem.type); + dataS.seek(itemStartOffs + drDirectoryItem.offset); + switch (drDirectoryItem.type) { + case 1: + { + debug(3, "NPoint"); + NPoint point; + point.x = dataS.readUint16LE(); + point.y = dataS.readUint16LE(); + debug(3, "(%d, %d)", point.x, point.y); + drDirectoryItem.offset = _points.size(); + _points.push_back(point); + break; + } + case 2: + { + uint count = dataS.readUint16LE(); + NPointArray *pointArray = new NPointArray(); + debug(3, "NPointArray; count = %d", count); + for (uint j = 0; j < count; j++) { + NPoint point; + point.x = dataS.readUint16LE(); + point.y = dataS.readUint16LE(); + debug(3, "(%d, %d)", point.x, point.y); + pointArray->push_back(point); + } + drDirectoryItem.offset = _pointArrays.size(); + _pointArrays.push_back(pointArray); + break; + } + case 3: + { + uint count = dataS.readUint16LE(); + HitRectList *hitRectList = new HitRectList(); + debug(3, "HitRectList; count = %d", count); + for (uint j = 0; j < count; j++) { + HitRect hitRect; + hitRect.rect.x1 = dataS.readUint16LE(); + hitRect.rect.y1 = dataS.readUint16LE(); + hitRect.rect.x2 = dataS.readUint16LE(); + hitRect.rect.y2 = dataS.readUint16LE(); + hitRect.type = dataS.readUint16LE(); + debug(3, "(%d, %d, %d, %d) -> %04d", hitRect.rect.x1, hitRect.rect.y1, hitRect.rect.x2, hitRect.rect.y2, hitRect.type); + hitRectList->push_back(hitRect); + } + drDirectoryItem.offset = _hitRectLists.size(); + _hitRectLists.push_back(hitRectList); + break; + } + case 4: + { + uint count = dataS.readUint16LE(); + MessageList *messageList = new MessageList(); + debug(3, "MessageList; count = %d", count); + for (uint j = 0; j < count; j++) { + MessageItem messageItem; + messageItem.messageNum = dataS.readUint32LE(); + messageItem.messageValue = dataS.readUint32LE(); + debug(3, "(%04X, %08X)", messageItem.messageNum, messageItem.messageValue); + messageList->push_back(messageItem); + } + drDirectoryItem.offset = _messageLists.size(); + _messageLists.push_back(messageList); + break; + } + case 5: + { + uint count = dataS.readUint16LE(); + DRSubRectList *drSubRectList = new DRSubRectList(); + debug(3, "SubRectList; count = %d", count); + for (uint j = 0; j < count; j++) { + DRSubRect drSubRect; + drSubRect.rect.x1 = dataS.readUint16LE(); + drSubRect.rect.y1 = dataS.readUint16LE(); + drSubRect.rect.x2 = dataS.readUint16LE(); + drSubRect.rect.y2 = dataS.readUint16LE(); + drSubRect.messageListHash = dataS.readUint32LE(); + drSubRect.messageListItemIndex = dataS.readUint16LE(); + debug(3, "(%d, %d, %d, %d) -> %08X (%d)", drSubRect.rect.x1, drSubRect.rect.y1, drSubRect.rect.x2, drSubRect.rect.y2, drSubRect.messageListHash, drSubRect.messageListItemIndex); + drSubRectList->push_back(drSubRect); + } + drDirectoryItem.offset = _drSubRectLists.size(); + _drSubRectLists.push_back(drSubRectList); + break; + } + case 6: + { + DRRect drRect; + drRect.rect.x1 = dataS.readUint16LE(); + drRect.rect.y1 = dataS.readUint16LE(); + drRect.rect.x2 = dataS.readUint16LE(); + drRect.rect.y2 = dataS.readUint16LE(); + drRect.subRectIndex = dataS.readUint16LE(); + debug(3, "(%d, %d, %d, %d) -> %d", drRect.rect.x1, drRect.rect.y1, drRect.rect.x2, drRect.rect.y2, drRect.subRectIndex); + drDirectoryItem.offset = _drRects.size(); + _drRects.push_back(drRect); + break; + } + case 7: + { + uint count = dataS.readUint16LE(); + NRectArray *rectArray = new NRectArray(); + debug(3, "NRectArray; count = %d", count); + for (uint j = 0; j < count; j++) { + NRect rect; + rect.x1 = dataS.readUint16LE(); + rect.y1 = dataS.readUint16LE(); + rect.x2 = dataS.readUint16LE(); + rect.y2 = dataS.readUint16LE(); + debug(3, "(%d, %d, %d, %d)", rect.x1, rect.y1, rect.x2, rect.y2); + rectArray->push_back(rect); + } + drDirectoryItem.offset = _rectArrays.size(); + _rectArrays.push_back(rectArray); + break; + } + } + _directory.push_back(drDirectoryItem); + } + } +} + +void DataResource::unload() { + if (_resourceHandle != -1) { + _vm->_res->unloadResource(_resourceHandle); + _vm->_res->unuseResource(_resourceHandle); + _resourceHandle = -1; + // TODO: Clear arrays + } +} + +NPoint DataResource::getPoint(uint32 nameHash) { + DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 1); + if (drDirectoryItem) + return _points[drDirectoryItem->offset]; + return NPoint(); +} + +NPointArray *DataResource::getPointArray(uint32 nameHash) { + DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 2); + if (drDirectoryItem) + return _pointArrays[drDirectoryItem->offset]; + return NULL; +} + +HitRectList *DataResource::getHitRectList() { + // TODO + return NULL; +} + +MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) { + // TODO + return NULL; +} + +DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash, uint16 type) { + for (Common::Array::iterator it = _directory.begin(); it != _directory.end(); it++) { + if ((*it).nameHash == nameHash && (*it).type == type) + return &(*it); + } + return NULL; +} + +// SoundResource + SoundResource::SoundResource(NeverhoodEngine *vm) : _vm(vm) { } @@ -374,4 +621,20 @@ void SoundResource::play(uint32 fileHash, bool looping) { void SoundResource::play() { } +uint32 calcHash(const char *value) { + uint32 hash = 0, shiftValue = 0; + while (*value != 0) { + char ch = *value++; + if (ch >= 'a' && ch <= 'z') + ch -= 32; + else if (ch >= '0' && ch <= '9') + ch += 22; + shiftValue += ch - 64; + if (shiftValue >= 32) + shiftValue -= 32; + hash ^= 1 << shiftValue; + } + return hash; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 610973c155..d273e7c9d9 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -23,8 +23,10 @@ #ifndef NEVERHOOD_RESOURCE_H #define NEVERHOOD_RESOURCE_H +#include "common/str.h" #include "neverhood/neverhood.h" #include "neverhood/graphics.h" +#include "neverhood/staticdata.h" namespace Neverhood { @@ -119,6 +121,74 @@ protected: uint32 _currFileHash; }; +class TextResource { +public: + TextResource(NeverhoodEngine *vm); + ~TextResource(); + void load(uint32 fileHash); + void unload(); + const char *getString(uint index, const char *&textEnd); + uint getCount() const { return _count;} +protected: + NeverhoodEngine *_vm; + int _resourceHandle; + byte *_textData; + uint _count; +}; + +/* DataResource + 1 Single NPoint + 2 Array of NPoints + 3 Array of NRects + 4 MessageList + 5 SubRectList + 6 RectList +*/ + +class DataResource { +public: + DataResource(NeverhoodEngine *vm); + ~DataResource(); + void load(uint32 fileHash); + void unload(); + NPoint getPoint(uint32 nameHash); + NPointArray *getPointArray(uint32 nameHash); + HitRectList *getHitRectList(); + MessageList *getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY); +protected: + + struct DRDirectoryItem { + uint32 nameHash; + uint16 offset; + uint16 type; + }; + + struct DRRect { + NRect rect; + uint16 subRectIndex; + }; + + struct DRSubRect { + NRect rect; + uint32 messageListHash; + uint16 messageListItemIndex; + }; + + typedef Common::Array DRSubRectList; + + NeverhoodEngine *_vm; + int _resourceHandle; + Common::Array _directory; + Common::Array _points; + Common::Array _pointArrays; + Common::Array _rectArrays; + Common::Array _hitRectLists; + Common::Array _messageLists; + Common::Array _drRects; + Common::Array _drSubRectLists; + DataResource::DRDirectoryItem *findDRDirectoryItem(uint32 nameHash, uint16 type); +}; + // TODO: Dummy class atm class SoundResource { @@ -131,6 +201,8 @@ protected: NeverhoodEngine *_vm; }; +uint32 calcHash(const char *value); + } // End of namespace Neverhood #endif /* NEVERHOOD_RESOURCE_H */ diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 4996bdd28a..87fd13153b 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -104,7 +104,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac : Sprite(vm, 0), _spriteResource(vm) { _name = "StaticSprite"; - // TODO init(calcHash(filename), surfacePriority, x, y, width, height); + init(calcHash(filename), surfacePriority, x, y, width, height); } @@ -288,8 +288,7 @@ void AnimatedSprite::updateAnim() { if (_animResource.loadInternal(_fileHash2)) { _currAnimFileHash = _fileHash2; } else { - debug("TODO"); - // TODO _animResource.loadInternal(calcHash("sqDefault")); + _animResource.loadInternal(calcHash("sqDefault")); _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { @@ -320,8 +319,7 @@ void AnimatedSprite::updateAnim() { if (_animResource.loadInternal(_fileHash1)) { _currAnimFileHash = _fileHash1; } else { - debug("TODO"); - // TODO _animResource.loadInternal(calcHash("sqDefault")); + _animResource.loadInternal(calcHash("sqDefault")); _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { @@ -334,8 +332,7 @@ void AnimatedSprite::updateAnim() { if (_animResource.loadInternal(_fileHash1)) { _currAnimFileHash = _fileHash1; } else { - debug("TODO"); - // TODO _animResource.loadInternal(calcHash("sqDefault")); + _animResource.loadInternal(calcHash("sqDefault")); _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { -- cgit v1.2.3 From 71da221507182398a1fe905f4cd293a4ed25eacd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 16 Jul 2011 17:27:21 +0000 Subject: NEVERHOOD: Implement Scene1004 - Module1000 is now almost complete --- engines/neverhood/graphics.h | 1 + engines/neverhood/klayman.cpp | 118 +++++++++++++++++- engines/neverhood/klayman.h | 11 ++ engines/neverhood/module1000.cpp | 253 ++++++++++++++++++++++++++++++++------- engines/neverhood/module1000.h | 23 +++- engines/neverhood/resource.cpp | 4 + engines/neverhood/resource.h | 1 + engines/neverhood/scene.cpp | 12 +- engines/neverhood/scene.h | 3 +- engines/neverhood/sprite.cpp | 12 +- engines/neverhood/sprite.h | 3 +- 11 files changed, 386 insertions(+), 55 deletions(-) diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 8bdf0afd3d..36bd95e3ab 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -81,6 +81,7 @@ public: bool getVisible() const { return _visible; } void setVisible(bool value) { _visible = value; } void setTransparent(bool value) { _transparent = value; } + Graphics::Surface *getSurface() { return _surface; } protected: NeverhoodEngine *_vm; int _priority; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 51dde55548..d5c320536f 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -1555,7 +1555,6 @@ void Klayman::sub420420() { } uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1567,6 +1566,33 @@ uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub420ED0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420ED0))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x91540140, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E2F0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } +} + +uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC61A0119) { + _soundResource1.play(0x402338C2); + } else if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0A2AA8E0); + } + break; + } + return messageResult; +} + //############################################################################## // KmScene1001 @@ -2209,4 +2235,94 @@ void KmScene1002::sub44A4B0() { _attachedSprite->sendMessage(0x482A, 0, this); } +// KmScene1004 + +KmScene1004::KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + _dataResource.load(0x01900A04); +} + +uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x4818: + sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481E: + setCallback2(AnimationCallback(&KmScene1004::sub478170)); + break; + case 0x4820: + _parentScene->sendMessage(0x2000, 0, this); + setCallback2(AnimationCallback(&Klayman::sub420970)); + break; + case 0x4821: + _parentScene->sendMessage(0x2000, 0, this); + _y4 = param.asInteger(); + setCallback2(AnimationCallback(&Klayman::sub4209D0)); + break; + case 0x4822: + _parentScene->sendMessage(0x2000, 0, this); + _y4 = param.asInteger(); + setCallback2(AnimationCallback(&Klayman::sub420AD0)); + break; + case 0x4823: + _parentScene->sendMessage(0x2001, 0, this); + setCallback2(AnimationCallback(&Klayman::sub420BC0)); + break; + case 0x4824: + _parentScene->sendMessage(0x2000, 0, this); + _y4 = _dataResource.getPoint(param.asInteger()).y; + setCallback2(AnimationCallback(&Klayman::sub4209D0)); + break; + case 0x4825: + _parentScene->sendMessage(0x2000, 0, this); + _y4 = _dataResource.getPoint(param.asInteger()).y; + setCallback2(AnimationCallback(&Klayman::sub420AD0)); + break; + case 0x4828: + setCallback2(AnimationCallback(&Klayman::sub420ED0)); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x04684052) { + _flagE5 = true; + _parentScene->sendMessage(0x2002, 0, this); + } + break; + } + return messageResult; +} + +void KmScene1004::sub478170() { + _status2 = 2; + _flagE5 = false; + setFileHash(0x123E9C9F, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene1004::handleMessage478110); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 20d0e885cd..8ec33bceab 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -81,6 +81,7 @@ public: void sub4210C0(); void sub421070(); void sub420420(); + void sub420ED0(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -204,6 +205,7 @@ protected: uint32 handleMessage41E0D0(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E490(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41E2F0(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -253,6 +255,15 @@ protected: void sub44A4B0(); }; +class KmScene1004 : public Klayman { +public: + KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage478110(int messageNum, const MessageParam ¶m, Entity *sender); + void sub478170(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 6825f62926..dc28960e60 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -56,8 +56,9 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 0) { //createScene1001(0); // DEBUG: Jump to room - //createScene1002(0); - createScene1005(0); + createScene1002(0); + //createScene1005(0); + //createScene1004(0); } else if (which == 1) { createScene1002(1); } @@ -93,6 +94,11 @@ void Module1000::createScene1003(int which) { } void Module1000::createScene1004(int which) { + _vm->gameState().sceneNum = 3; + _childObject = new Scene1004(_vm, this, which); + SetUpdateHandler(&Module1000::updateScene1004); + // TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1); + // TODO Music18hList_stop(0x061880C6, 0, 2); } void Module1000::createScene1005(int which) { @@ -100,16 +106,13 @@ void Module1000::createScene1005(int which) { _childObject = new Scene1005(_vm, this, which); // TODO Music18hList_stop(0x061880C6, 0, 0); // TODO Music18hList_play(_musicFileHash, 0, 0, 1); - SetUpdateHandler(&Module1000::updateScene1002); + SetUpdateHandler(&Module1000::updateScene1005); } void Module1000::updateScene1001() { _childObject->handleUpdate(); - if (_done) { - debug("SCENE 1001 DONE; _field20 = %d", _field20); - _done = false; delete _childObject; _childObject = NULL; @@ -117,11 +120,10 @@ void Module1000::updateScene1001() { createScene1003(0); _childObject->handleUpdate(); } else { - // TODO createScene1002(); - // TODO _childObject->handleUpdate(); + createScene1002(0); + _childObject->handleUpdate(); } } - if (_field24 >= 0) { if (_field24 == 2) { // TODO ResourceTable_multiLoad(&_resourceTable2, &_resourceTable1, &_resourceTable3); @@ -131,36 +133,29 @@ void Module1000::updateScene1001() { _field24 = -1; } } - if (_field26 >= 0) { // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3); _field26 = -1; } - } void Module1000::updateScene1002() { - _childObject->handleUpdate(); - if (_done) { - debug("SCENE 1002 DONE; _field20 = %d", _field20); - _done = false; delete _childObject; _childObject = NULL; if (_field20 == 1) { _parentModule->sendMessage(0x1009, 0, this); } else if (_field20 == 2) { - // TODO createScene1004(0); - // TODO _childObject->handleUpdate(); + createScene1004(0); + _childObject->handleUpdate(); } else { createScene1001(1); _childObject->handleUpdate(); } } - if (_field24 >= 0) { if (_field24 == 1) { _parentModule->sendMessage(0x100A, 0, this); @@ -171,7 +166,6 @@ void Module1000::updateScene1002() { } _field24 = -1; } - if (_field26 >= 0) { if (_field26 == 1) { _parentModule->sendMessage(0x1023, 0, this); @@ -180,11 +174,9 @@ void Module1000::updateScene1002() { } _field26 = -1; } - if (_field28 >= 0) { _field28 = -1; } - } void Module1000::updateScene1003() { @@ -199,6 +191,30 @@ void Module1000::updateScene1003() { } void Module1000::updateScene1004() { + _childObject->handleUpdate(); + if (_done) { + debug("SCENE 1004 DONE; _field20 = %d", _field20); + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene1005(0); + _childObject->handleUpdate(); + } else { + createScene1002(2); + _childObject->handleUpdate(); + } + } + if (_field24 >= 0) { + if (_field24 == 0) { + // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); + } + _field24 = -1; + } + if (_field26 >= 0) { + // TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1); + _field26 = -1; + } } void Module1000::updateScene1005() { @@ -223,11 +239,7 @@ AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) _x = 726; _y = 440; callback1(); -#if 0 - _soundResource2.set(0xED403E03); - _soundResource2.load(); - _soundResource2.createSoundBuffer(); -#endif + _soundResource2.load(0xED403E03); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1001Door::handleMessage); } @@ -1421,49 +1433,66 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class599 = addSprite(new Class599(_vm, this)); - // DEBUG/HACK!!!! - which = 1; setGlobalVar(0x8306F218, 1); - if (which < 0) { if (_vm->_gameState.field2 == 0) { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); - // TODO + _klayman->getSurface()->getClipRect().x1 = 31; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); - // TODO + _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); } } else { if (which == 1) { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); - // TODO + _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _vm->_gameState.field2 = 1; } else if (which == 2) { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4298); - // TODO + _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _vm->_gameState.field2 = 1; _klayman->sendMessage(0x4820, 0, this); } else { _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4470); - // TODO - //_class479 = addSprite(new Class479(_vm, this, _klayman)); - // TODO + _klayman->getSurface()->getClipRect().x1 = 31; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + // TODO _class479 = addSprite(new Class479(_vm, this, _klayman)); + // TODO _class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; } } - addSprite(_klayman); + addSprite(_klayman); _mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL)); @@ -1496,11 +1525,8 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B43A0); - -#if 0 // TODO _soundResource2.load(0x60755842); _soundResource3.load(0x616D5821); -#endif } @@ -1510,7 +1536,11 @@ Scene1002::~Scene1002() { void Scene1002::update() { Scene::update(); if (!_flag1B4 && _klayman->getY() > 230) { - // TODO + _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); deleteSprite(&_ssLadderArchPart3); _klayman->clearRepl(); _flag1B4 = true; @@ -1689,6 +1719,144 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity return 0; } +// Scene1004 + +AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100), _soundResource(vm) { + + _x = 330; + _y = 327; + createSurface(800, 56, 50); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1004TrashCan::handleMessage); + _surface->setVisible(false); +} + +uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x225A8587) { + _soundResource.play(0x109AFC4C); + } + break; + case 0x2002: + setFileHash(0xEB312C11, 0, -1); + _surface->setVisible(true); + break; + case 0x3002: + setFileHash1(); + _surface->setVisible(false); + break; + } + return 0; +} + +Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _paletteAreaStatus(-1) { + + Palette2 *palette2; + Sprite *tempSprite; + + _surfaceFlag = true; + + SetUpdateHandler(&Scene1004::update); + SetMessageHandler(&Scene1004::handleMessage); + + _background = addBackground(new DirtyBackground(_vm, 0x50C03005, 0, 0)); + + if (getGlobalVar(0x0D0A14D10)) { + palette2 = new Palette2(_vm, 0xA30BA329); + palette2->addPalette(0xA30BA329, 0, 256, 0); + } else { + palette2 = new Palette2(_vm, 0x50C03005); + palette2->addPalette(0x50C03005, 0, 256, 0); + } + _palette = palette2; + _palette->usePalette(); + addEntity(_palette); + + _mouseCursor = addSprite(new Mouse433(_vm, 0x03001504, NULL)); + + if (which < 0) { + setRectList(0x004B7C70); + _klayman = new KmScene1004(_vm, this, 330, 327); + setMessageList(0x004B7C18); + } else if (which == 1) { + setRectList(0x004B7C70); + _klayman = new KmScene1004(_vm, this, 330, 327); + setMessageList(0x004B7C08); + } else { + loadDataResource(0x01900A04); + _klayman = new KmScene1004(_vm, this, _dataResource.getPoint(0x80052A29).x, 27); + setMessageList(0x004B7BF0); + } + + addSprite(_klayman); + + updatePaletteArea(); + + _class478 = addSprite(new Class478(_vm, _klayman)); + + addSprite(new StaticSprite(_vm, 0x800034A0, 1100)); + addSprite(new StaticSprite(_vm, 0x64402020, 1100)); + addSprite(new StaticSprite(_vm, 0x3060222E, 1300)); + tempSprite = addSprite(new StaticSprite(_vm, 0x0E002004, 1300)); + + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + + _asTrashCan = addSprite(new AsScene1004TrashCan(_vm)); + +} + +void Scene1004::update() { + Scene::update(); + updatePaletteArea(); +} + +uint32 Scene1004::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x926500A1) { + setMessageList(0x004B7C20); + messageResult = 1; + } + break; + case 0x2000: + loadDataResource(0x01900A04); + break; + case 0x2001: + setRectList(0x004B7C70); + break; + case 0x2002: + _asTrashCan->sendMessage(0x2002, 0, this); + break; + } + return messageResult; +} + +void Scene1004::updatePaletteArea() { + if (_klayman->getY() < 150) { + if (_paletteAreaStatus != 0) { + _paletteAreaStatus = 0; + ((Palette2*)_palette)->addPalette(0x406B0D10, 0, 64, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + } + } else { + if (_paletteAreaStatus != 1) { + _paletteAreaStatus = 1; + ((Palette2*)_palette)->addPalette(0x24332243, 0, 64, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + } + } +} + // Scene1005 Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1717,9 +1885,6 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) } -Scene1005::~Scene1005() { -} - uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 4b2121eb53..0e3f950c3e 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -302,12 +302,33 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// Scene1004 + +class AsScene1004TrashCan : public AnimatedSprite { +public: + AsScene1004TrashCan(NeverhoodEngine *vm); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1004 : public Scene { +public: + Scene1004(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_class478; + Sprite *_asTrashCan; + int _paletteAreaStatus; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void updatePaletteArea(); +}; + // Scene1005 class Scene1005 : public Scene { public: Scene1005(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene1005(); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void drawTextToBackground(); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 1c376105cf..8b2a19c07c 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -606,6 +606,7 @@ DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash } // SoundResource +// ALL TODO SoundResource::SoundResource(NeverhoodEngine *vm) : _vm(vm) { @@ -615,6 +616,9 @@ bool SoundResource::isPlaying() { return false; } +void SoundResource::load(uint32 fileHash) { +} + void SoundResource::play(uint32 fileHash, bool looping) { } diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index d273e7c9d9..5d8d5ca13d 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -195,6 +195,7 @@ class SoundResource { public: SoundResource(NeverhoodEngine *vm); bool isPlaying(); + void load(uint32 fileHash); void play(uint32 fileHash, bool looping = false); void play(); protected: diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 2b5c81b4ad..8f49a0033d 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -26,7 +26,7 @@ namespace Neverhood { Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) - : Entity(vm, 0), _parentModule(parentModule) { + : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) { _messageListFlag1 = false; _systemCallbackFlag = false; @@ -94,8 +94,10 @@ void Scene::draw() { (*iter)->addDirtyRect(); // TODO g_screen->addDirtyRects(); } - for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) + for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { + debug(4, "priority = %d", (*iter)->getPriority()); (*iter)->draw(); + } } } @@ -492,4 +494,10 @@ void Scene::setRectList(RectList *rectList) { _rectType = 1; } +void Scene::loadDataResource(uint32 fileHash) { + _dataResource.load(fileHash); + if (_klayman) + _klayman->loadDataResource(fileHash); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 0878380ccd..8f0b79a5ee 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -61,7 +61,7 @@ protected: bool _messageListFlag1; NPoint _mouseClickPos; bool _mouseClicked; - // TODO RectResource _rectResource; + DataResource _dataResource; RectList *_rectList; int _rectType; // rectListCount @@ -102,6 +102,7 @@ protected: void runMessageList(); void setRectList(uint32 id); void setRectList(RectList *rectList); + void loadDataResource(uint32 fileHash); }; } // End of namespace Neverhood diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 87fd13153b..2c772d7731 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -27,10 +27,8 @@ namespace Neverhood { // Sprite Sprite::Sprite(NeverhoodEngine *vm, int objectPriority) - : Entity(vm, objectPriority), _x(0), _y(0), - _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), - _doDeltaX(false), _doDeltaY(false), _needRefresh(false), - _flags(0) { + : Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), + _dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0) { _name = "Sprite"; SetMessageHandler(&Sprite::handleMessage); @@ -87,6 +85,10 @@ uint32 Sprite::handleMessage(int messageNum, const MessageParam ¶m, Entity * return 0; } +void Sprite::loadDataResource(uint32 fileHash) { + _dataResource.load(fileHash); +} + void Sprite::createSurface(int surfacePriority, int16 width, int16 height) { _surface = new BaseSurface(_vm, surfacePriority, width, height); } @@ -138,7 +140,7 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, _drawRect.x = 0; _drawRect.y = 0; _drawRect.width = width; - _drawRect.width = height; + _drawRect.height = height; _needRefresh = true; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index f1d8a87b69..18c9ae32da 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -53,6 +53,7 @@ public: bool isDoDeltaY() const { return _doDeltaY; } NRect& getRect() { return _rect; } uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void loadDataResource(uint32 fileHash); protected: void (Sprite::*_spriteUpdateCb)(); Common::String _spriteUpdateCbName; // For debugging purposes @@ -69,7 +70,7 @@ protected: NRect _rect; uint16 _flags; //0000004A field4A dw ? // seems to be unused except in ctor - //0000004C rectResource RectResource ? + DataResource _dataResource; //void update(); void createSurface(int surfacePriority, int16 width, int16 height); void handleSpriteUpdate() { -- cgit v1.2.3 From 438b6bb53c03db915f436a95427b6ab2c9504fce Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 16 Jul 2011 21:22:54 +0000 Subject: NEVERHOOD: Implement Module2300 (just a bunch of NavigationScenes) - Fix Smacker player by using a SafeSubReadStream - Fix NavigationMouse (cursors in type 1 were swapped) --- engines/neverhood/blbarchive.cpp | 3 +- engines/neverhood/gamemodule.cpp | 70 ++++++++-- engines/neverhood/gamemodule.h | 6 +- engines/neverhood/module.cpp | 2 - engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 7 +- engines/neverhood/module2300.cpp | 270 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2300.h | 57 +++++++++ engines/neverhood/mouse.cpp | 5 +- engines/neverhood/resource.cpp | 17 ++- engines/neverhood/sprite.cpp | 5 +- 11 files changed, 407 insertions(+), 36 deletions(-) create mode 100644 engines/neverhood/module2300.cpp create mode 100644 engines/neverhood/module2300.h diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 3138b9102d..2e29485d58 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -110,7 +110,8 @@ byte *BlbArchive::getEntryExtData(uint index) { Common::SeekableReadStream *BlbArchive::createStream(uint index) { const BlbArchiveEntry &entry = _entries[index]; - return new Common::SeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize); + //debug("entry.offset = %08X; entry.offset + entry.diskSize = %08X", entry.offset, entry.offset + entry.diskSize); + return new Common::SafeSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize); } } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c2d3e6d887..4800923d2d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -25,6 +25,7 @@ #include "neverhood/graphics.h" #include "neverhood/module1000.h" #include "neverhood/module1500.h" +#include "neverhood/module2300.h" namespace Neverhood { @@ -63,7 +64,7 @@ void GameModule::handleMouseMove(int16 x, int16 y) { NPoint mousePos; mousePos.x = x; mousePos.y = y; - debug("GameModule::handleMouseMove(%d, %d)", x, y); + debug(2, "GameModule::handleMouseMove(%d, %d)", x, y); _childObject->sendPointMessage(0, mousePos, this); } } @@ -73,7 +74,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) { NPoint mousePos; mousePos.x = x; mousePos.y = y; - debug("GameModule::handleMouseDown(%d, %d)", x, y); + debug(2, "GameModule::handleMouseDown(%d, %d)", x, y); _childObject->sendPointMessage(1, mousePos, this); } } @@ -106,9 +107,29 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM -// createModule1500(0); // Logos and intro video +// createModule1500(0); // Logos and intro video //Real +// createModule1000(0); + createModule2300(0); +} + +void GameModule::createModule1000(int which) { + setGlobalVar(0x91080831, 0x03294419); + _childObject = new Module1000(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1000); +} - createModule1000(0); +void GameModule::updateModule1000() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + // TODO _resourceTable3.load(); + delete _childObject; + _childObject = NULL; + createModule2300(0); + _childObject->handleUpdate(); + } } void GameModule::createModule1500(int which) { @@ -131,24 +152,47 @@ void GameModule::updateModule1500() { } } -void GameModule::createModule1000(int which) { - setGlobalVar(0x91080831, 0x03294419); - _childObject = new Module1000(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1000); +void GameModule::createModule2300(int which) { + setGlobalVar(0x91080831, 0x1A214010); + _childObject = new Module2300(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule2300); } -void GameModule::updateModule1000() { +void GameModule::updateModule2300() { if (!_childObject) return; _childObject->handleUpdate(); if (_done) { _done = false; - // TODO _resourceTable3.load(); delete _childObject; _childObject = NULL; - error("Done..."); - // TODO createModule2300(); - // TODO _childObject->handleUpdate(); + if (_field20 == 1) { + // TODO createModule2200(0); + // TODO _childObject->handleUpdate(); + } else if (_field20 == 2) { + // TODO createModule1200(0); + // TODO _childObject->handleUpdate(); + } else if (_field20 == 3) { + // TODO createModule2400(0); + // TODO _childObject->handleUpdate(); + } else if (_field20 == 4) { + // TODO createModule3000(0); + // TODO _childObject->handleUpdate(); + } else { + createModule1000(1); + _childObject->handleUpdate(); + } + } + if (_field24 >= 0) { + if (_field24 == 2) { + // TODO _resourceTable4.load(); + } else if (_field24 == 0) { + // TODO _resourceTable3.load(); + } + _field24 = -1; + } + if (_field26 >= 0) { + _field26 = -1; } } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 876506ce0c..7977ea51a0 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -49,10 +49,12 @@ protected: */ uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void startup(); - void createModule1500(int which); - void updateModule1500(); void createModule1000(int which); void updateModule1000(); + void createModule1500(int which); + void updateModule1500(); + void createModule2300(int which); + void updateModule2300(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 03109c0c86..8f0b55625a 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -42,7 +42,6 @@ void Module::draw() { } uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { case 0x0008: if (_parentModule) @@ -68,7 +67,6 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * if (_childObject && sender == _parentModule) return _childObject->sendMessage(messageNum, param, sender); } - return 0; } diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index af03c075cc..ed7077e337 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS = \ module.o \ module1000.o \ module1500.o \ + module2300.o \ mouse.o \ navigationscene.o \ neverhood.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index dc28960e60..8ee5941d95 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -21,7 +21,6 @@ */ #include "neverhood/module1000.h" -#include "neverhood/navigationscene.h"//### namespace Neverhood { @@ -54,9 +53,10 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) break; } } else if (which == 0) { - //createScene1001(0); + //createScene1001(0);//Real // DEBUG: Jump to room - createScene1002(0); + setGlobalVar(0x8306F218, 1); + createScene1002(2); //createScene1005(0); //createScene1004(0); } else if (which == 1) { @@ -80,7 +80,6 @@ void Module1000::createScene1001(int which) { void Module1000::createScene1002(int which) { _vm->gameState().sceneNum = 1; _childObject = new Scene1002(_vm, this, which); - // DEBUG _childObject = new NavigationScene(_vm, this, 0x004B67B8, 0, NULL); // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); // TODO Music18hList_play(0x061880C6, 0, 0, 1); SetUpdateHandler(&Module1000::updateScene1002); diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp new file mode 100644 index 0000000000..32ce2a18ba --- /dev/null +++ b/engines/neverhood/module2300.cpp @@ -0,0 +1,270 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2300.h" +#include "neverhood/navigationscene.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _volume(0) { + + debug("Create Module2300(%d)", which); + + // TODO Sound1ChList_addSoundResources(0x1A214010, dword_4B6938, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B6938, true, 50, 600, 10, 10, 150); + + _flag = getGlobalVar(0x10938830) == 0; + + if (_flag) { + // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); + // TODO Sound1ChList_playLooping(0x90F0D1C3); + } else { + // TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 0, 0, 0, 0); + } + + // TODO Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_sub_407C70(0x1A214010, 0x41861371, 0x43A2507F, 0); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 0: + createScene2301(-1); + break; + case 1: + createScene2302(-1); + break; + case 2: + createScene2303(-1); + break; + case 3: + createScene2304(-1); + break; + case 4: + createScene2305(-1); + break; + } + } else if (which == 1) { + createScene2303(0); + } else if (which == 2) { + createScene2304(0); + } else if (which == 3) { + createScene2305(-1); + } else if (which == 4) { + createScene2302(3); + } else { + createScene2301(1); + } + +} + +Module2300::~Module2300() { + // TODO Sound1ChList_sub_407A50(0x1A214010); +} + +void Module2300::createScene2301(int which) { + _vm->gameState().sceneNum = 0; + _childObject = new NavigationScene(_vm, this, 0x004B67B8, which, NULL); + SetUpdateHandler(&Module2300::updateScene2301); +} + +void Module2300::createScene2302(int which) { + _vm->gameState().sceneNum = 1; + _childObject = new NavigationScene(_vm, this, 0x004B67E8, which, NULL); + SetUpdateHandler(&Module2300::updateScene2302); + if (_flag) { + _volume = 15; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 15); + } +} + +void Module2300::createScene2303(int which) { + _vm->gameState().sceneNum = 2; + _childObject = new NavigationScene(_vm, this, 0x004B6878, which, NULL); + SetUpdateHandler(&Module2300::updateScene2303); +} + +void Module2300::createScene2304(int which) { + _vm->gameState().sceneNum = 3; + if (getGlobalVar(0x10938830)) { + _childObject = new NavigationScene(_vm, this, 0x004B68F0, which, NULL); + } else { + // TODO Sound1ChList_setVolume(0x90F0D1C3, _volume); + _childObject = new NavigationScene(_vm, this, 0x004B68A8, which, NULL); + if (_flag) { + _volume = 87; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 87); + } + } + SetUpdateHandler(&Module2300::updateScene2304); +} + +void Module2300::createScene2305(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 4; + // TODO Sound1ChList_sub_4080B0(true); + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x20080A0B); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module2300::updateScene2305); +} + +void Module2300::updateScene2301() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2302(4); + _childObject->handleUpdate(); + } else { + _parentModule->sendMessage(0x1009, 0, this); + } + } + if (_field24 >= 0) { + if (_field24 == 0) { + _parentModule->sendMessage(0x100A, 0, this); + } + _field24 = -1; + } + if (_field26 >= 0) { + _parentModule->sendMessage(0x1023, 0, this); + _field26 = -1; + } +} + +void Module2300::updateScene2302() { + _childObject->handleUpdate(); +#if 0 // TODO + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && + navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { + _volume++; + Sound1ChList_setVolume(0x90F0D1C3, _volume); + } +#endif +#if 0 // TODO + if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && + navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { + Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64); + Sound1ChList_setVolume(0x48498E46, 70); + Sound1ChList_setVolume(0x50399F64, 70); + } +#endif + if (_done) { + debug("SCENE 2302 DONE; _field20 = %d", _field20); + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2301(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene2303(1); + _childObject->handleUpdate(); + } else if (_field20 == 3) { + createScene2302(3); + _childObject->handleUpdate(); + } else if (_field20 == 4) { + createScene2304(1); + _childObject->handleUpdate(); + } else if (_field20 == 5) { + _parentModule->sendMessage(0x1009, 3, this); + } else { + _parentModule->sendMessage(0x1009, 4, this); + } + } +} + +void Module2300::updateScene2303() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + _parentModule->sendMessage(0x1009, 3, this); + } else { + createScene2302(5); + _childObject->handleUpdate(); + } + } + if (_field24 >= 0) { + if (_field24 == 1) { + // TODO _resourceTable1.setResourceList(ex_sub_479D00(0), true); + // TODO _resourceTable2.loadResources(); + } + _field24 = -1; + } +} + +void Module2300::updateScene2304() { + _childObject->handleUpdate(); +#if 0 // TODO + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && + navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { + _volume--; + Sound1ChList_setVolume(0x90F0D1C3, _volume); + } +#endif + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + _parentModule->sendMessage(0x1009, 2, this); + } else { + createScene2302(1); + _childObject->handleUpdate(); + } + } + if (_field24 >= 0) { + if (_field24 == 0) { + _parentModule->sendMessage(0x100A, 2, this); + } + _field24 = -1; + } + if (_field26 >= 0) { + if (_field26 == 1) { + _parentModule->sendMessage(0x1023, 2, this); + } + _field26 = -1; + } +} + +void Module2300::updateScene2305() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + // TODO Sound1ChList_sub_4080B0(false); + createScene2302(2); + _childObject->handleUpdate(); + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h new file mode 100644 index 0000000000..9f705db6d5 --- /dev/null +++ b/engines/neverhood/module2300.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2300_H +#define NEVERHOOD_MODULE2300_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2300 + +class Module2300 : public Module { +public: + Module2300(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2300(); +protected: + // TODO ResourceTable _resourceTable1; + // TODO ResourceTable _resourceTable2; + bool _flag; + int _volume; + void createScene2301(int which); + void createScene2302(int which); + void createScene2303(int which); + void createScene2304(int which); + void createScene2305(int which); + void updateScene2301(); + void updateScene2302(); + void updateScene2303(); + void updateScene2304(); + void updateScene2305(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2300_H */ diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 63d98666d6..1eaf0cb843 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -258,6 +258,7 @@ void NavigationMouse::update() { } uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("NavigationMouse: _type = %d", _type); uint32 messageResult = 0; switch (messageNum) { case 0x2064: @@ -311,9 +312,9 @@ uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam ¶m, switch (_type) { case 1: if (_x >= 320) - _mouseCursorResource.setCursorNum(6); - else _mouseCursorResource.setCursorNum(5); + else + _mouseCursorResource.setCursorNum(6); break; case 2: default: diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 8b2a19c07c..44fef14ebe 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -51,11 +51,11 @@ void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) { } bool SpriteResource::load(uint32 fileHash) { - debug("SpriteResource::load(%08X)", fileHash); + debug(2, "SpriteResource::load(%08X)", fileHash); // TODO: Later merge with load2 and make the mode a parameter unload(); _resourceHandle = _vm->_res->useResource(fileHash); - debug("SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle); + debug(2, "SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle); if (_resourceHandle != -1) { if (_vm->_res->getResourceType(_resourceHandle) == 2) { byte *spriteData = _vm->_res->loadResource(_resourceHandle, true); @@ -106,7 +106,7 @@ PaletteResource::~PaletteResource() { } bool PaletteResource::load(uint32 fileHash) { - debug("PaletteResource::load(%08X)", fileHash); + debug(2, "PaletteResource::load(%08X)", fileHash); unload(); _resourceHandle = _vm->_res->useResource(fileHash); if (_resourceHandle != -1) { @@ -170,7 +170,7 @@ void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, } bool AnimResource::load(uint32 fileHash) { - debug("AnimResource::load(%08X)", fileHash); + debug(2, "AnimResource::load(%08X)", fileHash); if (fileHash == _fileHash) return true; @@ -304,7 +304,7 @@ int16 AnimResource::getFrameIndex(uint32 frameHash) { frameIndex = (int16)i; break; } - debug("AnimResource::getFrameIndex(%08X) -> %d", frameHash, frameIndex); + debug(2, "AnimResource::getFrameIndex(%08X) -> %d", frameHash, frameIndex); return frameIndex; } @@ -324,7 +324,6 @@ void MouseCursorResource::load(uint32 fileHash) { if (_currFileHash != fileHash) { if (_cursorSprite.load(fileHash) && !_cursorSprite.isRle() && _cursorSprite.getDimensions().width == 96 && _cursorSprite.getDimensions().height == 224) { - debug("load ok"); _currFileHash = fileHash; } else { unload(); @@ -417,7 +416,7 @@ DataResource::~DataResource() { } void DataResource::load(uint32 fileHash) { - debug("DataResource::load(%08X)", fileHash); + debug(2, "DataResource::load(%08X)", fileHash); byte *data = NULL; uint32 dataSize = 0; unload(); @@ -435,14 +434,14 @@ void DataResource::load(uint32 fileHash) { Common::MemoryReadStream dataS(data, dataSize); uint itemCount = dataS.readUint16LE(); uint32 itemStartOffs = 2 + itemCount * 8; - debug("itemCount = %d", itemCount); + debug(2, "itemCount = %d", itemCount); for (uint i = 0; i < itemCount; i++) { dataS.seek(2 + i * 8); DRDirectoryItem drDirectoryItem; drDirectoryItem.nameHash = dataS.readUint32LE(); drDirectoryItem.offset = dataS.readUint16LE(); drDirectoryItem.type = dataS.readUint16LE(); - debug("%03d nameHash = %08X; offset = %04X; type = %d", i, drDirectoryItem.nameHash, drDirectoryItem.offset, drDirectoryItem.type); + debug(2, "%03d nameHash = %08X; offset = %04X; type = %d", i, drDirectoryItem.nameHash, drDirectoryItem.offset, drDirectoryItem.type); dataS.seek(itemStartOffs + drDirectoryItem.offset); switch (drDirectoryItem.type) { case 1: diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 2c772d7731..d0a6628d75 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -385,7 +385,6 @@ void AnimatedSprite::updatePosition() { void AnimatedSprite::updateFrameIndex() { if (!_playBackwards) { - //debug("%08X ### _frameIndex = %d; _frameIndex2 = %d", _currAnimFileHash, _frameIndex, _frameIndex2); if (_frameIndex < _frameIndex2) { _frameIndex++; } else { @@ -437,7 +436,7 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { } void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) { - debug("AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4); + debug(2, "AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4); _fileHash1 = fileHash; _frameIndex3 = frameIndex3; _frameIndex4 = frameIndex4; @@ -454,7 +453,7 @@ void AnimatedSprite::setFileHash1() { } void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) { - debug("AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5); + debug(2, "AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5); _fileHash1 = fileHash; _fileHash6 = fileHash6; _fileHash5 = fileHash5; -- cgit v1.2.3 From b1377ab153399db3fdca784ef03a040090a59706 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 16 Jul 2011 21:23:28 +0000 Subject: NEVERHOOD: Add entries for Module2300 --- devtools/create_neverhood/tables.h | 14 +++++++++++++- dists/engine-data/neverhood.dat | Bin 2194 -> 2786 bytes 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 3024197a88..e6e4d753cd 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -36,6 +36,8 @@ static const uint32 rectListOffsets[] = { 3, 0x004B43A0, 1, 0x004B4418, 3, 0x004B43A0, + // Scene1004 + 1, 0x004B7C70, 0, 0 }; @@ -64,10 +66,20 @@ static const uint32 messageListOffsets[] = { 4, 0x004B4480, 2, 0x004B41E0, 5, 0x004B4148, + // Scene1004 + 3, 0x004B7BF0, + 2, 0x004B7C08, + 1, 0x004B7C18, + 2, 0x004B7C20, 0, 0 }; static const uint32 navigationListOffsets[] = { // Module2300 - 2, 0x004B67B8 + 2, 0x004B67B8, + 6, 0x004B67E8, + 2, 0x004B6878, + 3, 0x004B68F0, + 3, 0x004B68A8, + 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index a9bd4fd0a4..6e7c150b5d 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 720050bec1477b1e7df5bb34bb6ecf992d2a8ca1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 18 Jul 2011 18:54:43 +0000 Subject: NEVERHOOD: Start with Module1200/Scene1201 (not complete yet) - Fix an odd bug with the game variables (index of newly added subvar was sometimes -1) --- engines/neverhood/gamemodule.cpp | 44 ++- engines/neverhood/gamemodule.h | 5 + engines/neverhood/gamevars.cpp | 20 +- engines/neverhood/klayman.cpp | 254 ++++++++++++- engines/neverhood/klayman.h | 21 ++ engines/neverhood/module.mk | 1 + engines/neverhood/module1200.cpp | 772 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1200.h | 141 +++++++ engines/neverhood/scene.cpp | 7 + engines/neverhood/scene.h | 1 + 10 files changed, 1245 insertions(+), 21 deletions(-) create mode 100644 engines/neverhood/module1200.cpp create mode 100644 engines/neverhood/module1200.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 4800923d2d..95a6a5f48a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -24,6 +24,7 @@ #include "neverhood/graphics.h" #include "neverhood/module1000.h" +#include "neverhood/module1200.h" #include "neverhood/module1500.h" #include "neverhood/module2300.h" @@ -108,8 +109,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule1500(0); // Logos and intro video //Real -// createModule1000(0); - createModule2300(0); +// createModule1000(-1); +// createModule2300(0); + createModule1200(0); } void GameModule::createModule1000(int which) { @@ -132,6 +134,30 @@ void GameModule::updateModule1000() { } } +void GameModule::createModule1200(int which) { + setGlobalVar(0x91080831, 0x00478311); + _childObject = new Module1200(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1200); +} + +void GameModule::updateModule1200() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + // TODO createModule2600(0); + // TODO _childObject->handleUpdate(); + } else { + createModule2300(2); + _childObject->handleUpdate(); + } + } +} + void GameModule::createModule1500(int which) { _someFlag1 = false; setGlobalVar(0x91080831, 0x00F10114); @@ -170,8 +196,8 @@ void GameModule::updateModule2300() { // TODO createModule2200(0); // TODO _childObject->handleUpdate(); } else if (_field20 == 2) { - // TODO createModule1200(0); - // TODO _childObject->handleUpdate(); + createModule1200(0); + _childObject->handleUpdate(); } else if (_field20 == 3) { // TODO createModule2400(0); // TODO _childObject->handleUpdate(); @@ -196,4 +222,14 @@ void GameModule::updateModule2300() { } } +void GameModule::createModule2400(int which) { + debug("createModule2400"); + _vm->_system->quit(); +} + +void GameModule::createModule3000(int which) { + debug("createModule3000"); + _vm->_system->quit(); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 7977ea51a0..d95c31e47d 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -51,10 +51,15 @@ protected: void startup(); void createModule1000(int which); void updateModule1000(); + void createModule1200(int which); + void updateModule1200(); void createModule1500(int which); void updateModule1500(); + void createModule2200(int which); void createModule2300(int which); void updateModule2300(); + void createModule2400(int which); + void createModule3000(int which); }; } // End of namespace Neverhood diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index 98ae709cfd..caf79b2ad9 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -57,7 +57,16 @@ uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) { void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value); - _vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value; + + int16 varIndex = getSubVarIndex(0, nameHash); + debug(" varIndex = %d", varIndex); + + int16 subVarIndex = getSubVarIndex(varIndex, subNameHash); + debug(" subVarIndex = %d", subVarIndex); + + _vars[subVarIndex].value = value; + + //_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value; } int16 GameVars::addVar(uint32 nameHash, uint32 value) { @@ -89,16 +98,19 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) { } else { while (_vars[nextIndex].nextIndex != -1) nextIndex = _vars[nextIndex].nextIndex; - _vars[nextIndex].nextIndex = addVar(subNameHash, value); - return _vars[nextIndex].nextIndex; + int16 index = addVar(subNameHash, value); + _vars[nextIndex].nextIndex = index; + return index; } } int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) { debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash); int16 subVarIndex = findSubVarIndex(varIndex, subNameHash); - if (subVarIndex == -1) + if (subVarIndex == -1) { subVarIndex = addSubVar(varIndex, subNameHash, 0); + debug("need to create: subVarIndex = %d", subVarIndex); + } return subVarIndex; } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index d5c320536f..145d645e01 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -84,8 +84,7 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&Klayman::sub41FC80)); break; case 0x4818: - debug("TODO sub41C930"); - // TODO sub41C930(_rectResource.getRectangle1(param.asInteger()).x, false); + sub41C930(_dataResource.getPoint(param.asInteger()).x, false); break; } return 0; @@ -461,6 +460,7 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); + debug("xdiff = %d", xdiff); if (x == _x) { _x4 = x; if (!_flagE1 && !_flagE2 && !_flagE3) { @@ -485,6 +485,7 @@ void Klayman::sub41C930(int16 x, bool flag) { error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));"); // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); } else { + debug("##################################################################"); _x4 = x; setCallback2(AnimationCallback(&Klayman::sub41F950)); } @@ -688,6 +689,9 @@ void Klayman::sub41F950() { _status2 = 0; _flagE1 = true; _flagE5 = true; + + debug("222222222222222222222 x = %d; x4 = %d", _x, _x4); + setDoDeltaX(_x4 < _x); setFileHash(0x242C0198, 0, -1); SetUpdateHandler(&Klayman::update); @@ -821,9 +825,12 @@ void Klayman::spriteUpdate41F320() { sendMessage(0x1019, 0, this); } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + + debug("xxxxxxxxxxxxxxxxxxxxxxxxx xdelta = %d", xdelta); + _x += xdelta; if (_field114) { - debug("_field114"); + error("_field114"); // TODO Klayman_sub_41CF70 } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); @@ -980,22 +987,28 @@ void Klayman::sub41CD00(int16 x) { void Klayman::sub41CC40(int16 x1, int16 x2) { if (_x > x1) { if (_x == x1 + x2) { + debug("sub41CC40 #1"); _x4 = x1 + x2; setCallback2(NULL); sub41C7B0(); } else if (_x < x1 + x2) { + debug("sub41CC40 #2"); sub41CAC0(x1 + x2); } else { + debug("sub41CC40 #3"); sub41C930(x1 + x2, false); } } else { if (_x == x1 - x2) { + debug("sub41CC40 #4"); _x4 = x1 - x2; setCallback2(NULL); sub41C7B0(); } else if (_x > x1 - x2) { + debug("sub41CC40 #5"); sub41CAC0(x1 - x2); } else { + debug("sub41CC40 #6"); sub41C930(x1 - x2, false); } } @@ -1593,6 +1606,26 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub4207A0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub4207A0))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x9B250AD2, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41EEF0); + } +} + +void Klayman::sub4207F0() { + _status2 = 2; + _flagE5 = false; + setFileHash(0x98F88391, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41EEF0); +} + //############################################################################## // KmScene1001 @@ -1635,16 +1668,14 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); sub41C7B0(); break; - case 0x481B: // TODO: It's not really a point but an x1/x2 pair - if (param.asPoint().x != 0) { - sub41CC40(param.asPoint().x, param.asPoint().y); + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); } else { - sub41CCE0(param.asPoint().y); + sub41CCE0(param.asPoint().x); } break; - case 0x481F: if (param.asInteger() == 0) { setCallback2(AnimationCallback(&Klayman::sub420870)); @@ -1658,28 +1689,23 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&Klayman::sub420830)); } break; - case 0x482D: setDoDeltaX(_x > (int16)param.asInteger()); sub41C7B0(); break; - case 0x4836: if (param.asInteger() == 1) { _parentScene->sendMessage(0x2002, 0, this); setCallback2(AnimationCallback(&Klayman::sub4211F0)); } break; - case 0x483F: sub41CD00(param.asInteger()); break; - case 0x4840: sub41CD70(param.asInteger()); break; } - return 0; } @@ -2325,4 +2351,206 @@ void KmScene1004::sub478170() { SetSpriteCallback(&AnimatedSprite::updateDeltaXY); } +// KmScene1201 + +KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) { + + // TODO setKlaymanTable(dword_4AEF10, 3); + _flagF6 = true; + +} + +uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480A: + setCallback2(AnimationCallback(&KmScene1201::sub40DF00)); + break; + case 0x4812: + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + break; + case 0x4813: + setCallback2(AnimationCallback(&KmScene1201::sub40DD20)); + break; + case 0x4814: + setCallback2(AnimationCallback(&KmScene1201::sub40DFA0)); + break; + case 0x4815: + setCallback2(AnimationCallback(&KmScene1201::sub40E040)); + break; + case 0x4816: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger() != 0 ? 1 : 0); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x481F: + setCallback2(AnimationCallback(&Klayman::sub420830)); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +void KmScene1201::update40DBE0() { + if (_x >= 380) + sub41C7B0(); + Klayman::update(); +} + +uint32 KmScene1201::handleMessage40DC00(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x51281850) { + setGlobalVar(0x20A0C516, 1); + } else if (param.asInteger() == 0x43000538) { + _soundResource1.play(0x21043059); + } else if (param.asInteger() == 0x02B20220) { + _soundResource1.play(0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + _soundResource1.play(0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + _soundResource1.play(0x44051000); + } + break; + } + return messageResult; +} + +void KmScene1201::sub40DD20() { + if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DD20))) { + _status2 = 0; + _flagE5 = false; + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + setFileHash(0x9CAA0218, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1201::handleMessage40DC00); + SetAnimationCallback3(&KmScene1201::sub40DD90); + } +} + +void KmScene1201::sub40DD90() { + _status2 = 1; + _flagE5 = false; + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + setFileHash(0x1222A513, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1201::handleMessage40DC00); +} + +uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + _soundResource1.play(0x405002D8); + if (_attachedSprite) { + _attachedSprite->sendMessage(0x480B, 0, this); + } + } else if (param.asInteger() == 0x02421405) { + if (_countdown != 0) { + _countdown--; + sub40DF60(); + } else { + SetMessageHandler(&Klayman::handleMessage41D480); + } + } + break; + } + return Klayman::handleMessage41D480(messageNum, param, sender); +} + +uint32 KmScene1201::handleMessage40DEA0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000F0082) { + _soundResource1.play(0x74E2810F); + } + break; + } + return messageResult; +} + +void KmScene1201::sub40DF00() { + if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DF00))) { + _status2 = 2; + _flagE5 = false; + _countdown = 8; + setDoDeltaX(0); + setFileHash(0x0C1CA072, 0, -1); + SetUpdateHandler(&KmScene1201::update40DBE0); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene1201::handleMessage40DDF0); + } +} + +void KmScene1201::sub40DF60() { + _flagE5 = false; + setFileHash2(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&KmScene1201::update40DBE0); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene1201::handleMessage40DDF0); +} + +void KmScene1201::sub40DFA0() { + if (!sub41CF10(AnimationCallback(&KmScene1201::sub40DFA0))) { + _status2 = 1; + _flagE5 = false; + setDoDeltaX(0); + setFileHash(0x2821C590, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene1201::handleMessage40DEA0); + SetAnimationCallback3(&Klayman::sub41FC80); + _class464->sendMessage(0x2006, 0, this); + _soundResource1.play(0x62E0A356); + } +} + +void KmScene1201::sub40E040() { + if (!sub41CF10(AnimationCallback(&KmScene1201::sub40E040))) { + _status2 = 1; + _flagE5 = false; + setFileHash(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&Klayman::handleMessage41D360); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 8ec33bceab..3c87104125 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -82,6 +82,8 @@ public: void sub421070(); void sub420420(); void sub420ED0(); + void sub4207A0(); + void sub4207F0(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -264,6 +266,25 @@ protected: void sub478170(); }; +class KmScene1201 : public Klayman { +public: + KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y); +protected: + Entity *_class464; + int _countdown; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void update40DBE0(); + uint32 handleMessage40DC00(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40DD20(); + void sub40DD90(); + uint32 handleMessage40DDF0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40DEA0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40DF00(); + void sub40DF60(); + void sub40DFA0(); + void sub40E040(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index ed7077e337..17424765e0 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -11,6 +11,7 @@ MODULE_OBJS = \ klayman.o \ module.o \ module1000.o \ + module1200.o \ module1500.o \ module2300.o \ mouse.o \ diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp new file mode 100644 index 0000000000..8075c5c391 --- /dev/null +++ b/engines/neverhood/module1200.cpp @@ -0,0 +1,772 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1200.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _moduleDone(false) { + + // TODO _resourceTable.setResourceList(0x004B3E68); + SetMessageHandler(&Module1200::handleMessage); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 0: + createScene1201(-1); + break; + case 1: + createScene1202(-1); + break; + case 2: + createScene1203(-1); + break; + } + } else if (which == 1) { + createScene1201(2); + } else { + createScene1201(0); + } + + // TODO Music18hList_add(0x00478311, 0x62222CAE); + // TODO Music18hList_play(0x62222CAE, 0, 0, 1); +} + +Module1200::~Module1200() { + // TODO Music18hList_deleteGroup(0x00478311); +} + +uint32 Module1200::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1009: + _moduleDone = true; + _moduleDoneStatus = param.asInteger(); + break; + } + return messageResult; +} + +void Module1200::createScene1201(int which) { + _vm->gameState().sceneNum = 0; + _childObject = new Scene1201(_vm, this, which); + SetUpdateHandler(&Module1200::updateScene1201); +} + +void Module1200::createScene1202(int which) { + _vm->gameState().sceneNum = 1; + //_childObject = new Scene1202(_vm, this, which); + //SetUpdateHandler(&Module1200::updateScene1202); +} + +void Module1200::createScene1203(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 2; + // TODO Music18hList_stop(0x62222CAE, 0, 0); + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x31890001); + smackerScene->nextVideo(); + _childObject = smackerScene; + setGlobalVar(0x2A02C07B, 1); + SetUpdateHandler(&Module1200::updateScene1203); +} + +void Module1200::updateScene1201() { + _childObject->handleUpdate(); + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + if (_moduleDoneStatus == 1) { + createScene1202(0); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 2) { + _parentModule->sendMessage(0x1009, 0, this); + } else if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { + createScene1203(-1); + } else { + _parentModule->sendMessage(0x1009, 1, this); + } + } +} + +void Module1200::updateScene1202() { + _childObject->handleUpdate(); + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + createScene1201(1); + _childObject->handleUpdate(); + } +} + +void Module1200::updateScene1203() { + _childObject->handleUpdate(); + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + createScene1201(3); + _childObject->handleUpdate(); + // TODO Music18hList_play(0x62222CAE, 0, 0, 1); + } +} + +// Scene1201 + +static const uint32 kScene1201InitArray[] = { + 1, 0, 2, 4, 5, 3, 6, 7, 8, 10, 9, 11, 13, 14, 12, 16, 17, 15 +}; + +static const NPoint kScene1201PointArray[] = { + {218, 193}, + {410, 225}, + {368, 277}, + {194, 227}, + {366, 174}, + {458, 224}, + {242, 228}, + {512, 228}, + {458, 277}, + {217, 233}, + {458, 173}, + {410, 276}, + {203, 280}, + {371, 226}, + {508, 279}, + {230, 273}, + {410, 171}, + {493, 174} +}; + +static const uint32 kScene1201SsScene1201TntFileHashList1[] = { + 0x2098212D, + 0x1600437E, + 0x1600437E, + 0x00A840E3, + 0x1A1830F6, + 0x1A1830F6, + 0x00212062, + 0x384010B6, + 0x384010B6, + 0x07A01080, + 0xD80C2837, + 0xD80C2837, + 0x03A22092, + 0xD8802CB6, + 0xD8802CB6, + 0x03A93831, + 0xDA460476, + 0xDA460476 +}; + +static const uint32 kScene1201SsScene1201TntFileHashList2[] = { + 0x3040C676, + 0x10914448, + 0x10914448, + 0x3448A066, + 0x1288C049, + 0x1288C049, + 0x78C0E026, + 0x3098D05A, + 0x3098D05A, + 0x304890E6, + 0x1284E048, + 0x1284E048, + 0xB140A1E6, + 0x5088A068, + 0x5088A068, + 0x74C4C866, + 0x3192C059, + 0x3192C059 +}; + +SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2) + : StaticSprite(vm, 900), _field7A(-1) { + + int16 x = kScene1201PointArray[pointIndex].x; + int16 y = kScene1201PointArray[pointIndex].y; + if (x < 300) { + _spriteResource.load2(kScene1201SsScene1201TntFileHashList1[elemIndex]); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + } else { + _spriteResource.load2(kScene1201SsScene1201TntFileHashList2[elemIndex]); + _x = x; + _y = y; + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -_spriteResource.getDimensions().height; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + + } + createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _surface->getClipRect().x1 = 0; + _surface->getClipRect().y1 = 0; + _surface->getClipRect().x2 = 640; + _surface->getClipRect().y2 = clipY2; + _needRefresh = true; + StaticSprite::update(); +} + +AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash) + : AnimatedSprite(vm, fileHash, surfacePriority, x, y), _parentScene(parentScene), _nameHash(nameHash) { + + if (!getSubVar(0x02038314, _nameHash) && !getSubVar(0x02720344, _nameHash)) { + SetMessageHandler(&AsScene1201Tape::handleMessage); + } else { + _surface->setVisible(false); + SetMessageHandler(NULL); + } +} + +uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4806: + setSubVar(0x02038314, _nameHash, 1); + _surface->setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Class466::Class466(NeverhoodEngine *vm, bool flag) + : AnimatedSprite(vm, 1200), _soundResource(vm) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class466::handleMessage); + createSurface(10, 34, 149); + _x = 202; + _y = -32; + if (flag) { + sub40D380(); + } else { + sub40D340(); + } +} + +uint32 Class466::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02060018) { + _soundResource.play(0x47900E06); + } + break; + case 0x2006: + sub40D360(); + break; + } + return messageResult; +} + +void Class466::sub40D340() { + setFileHash(0x928F0C10, 0, -1); + _newHashListIndex = 0; +} + +void Class466::sub40D360() { + setFileHash(0x928F0C10, 1, -1); + _newHashListIndex = -2; +} + +void Class466::sub40D380() { + setFileHash(0x928F0C10, 15, -1); + _newHashListIndex = -2; +} + +Class468::Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag) + : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) { + + createSurface1(100, 0xD088AC30); + _x = 320; + _y = 240; + SetUpdateHandler(&Class468::update); + SetMessageHandler(&Class468::handleMessage); + _newHashListIndex = -2; + if (flag) { + setFileHash(0xD088AC30, -1, -1); + _newHashListIndex = -2; + _countdown = 25; + } else { + setFileHash1(); + _surface->setVisible(false); + } +} + +void Class468::update() { + if (_countdown != 0 && (--_countdown == 0)) { + sub40D830(); + } + AnimatedSprite::update(); +} + +uint32 Class468::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + case 0x4829: + sub40D7E0(); + break; + } + return messageResult; +} + +void Class468::sub40D7E0() { + setFileHash(0xD088AC30, 0, -1); + _newHashListIndex = -2; + _surface->setVisible(true); + _soundResource.play(calcHash("fxDoorOpen20")); +} + +void Class468::sub40D830() { + setFileHash(0xD088AC30, -1, -1); + _playBackwards = true; + _surface->setVisible(true); + _soundResource.play(calcHash("fxDoorClose20")); + SetAnimationCallback3(&Class468::sub40D880); +} + +void Class468::sub40D880() { + setFileHash1(); + _surface->setVisible(false); +} + +Class464::Class464(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200) { + + createSurface(1200, 69, 98); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class464::handleMessage); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + _surface->setVisible(false); +} + +uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2006: + _x = 436; + _y = 339; + setFileHash(0xA060C599, 0, -1); + _surface->setVisible(true); + break; + case 0x3002: + setFileHash1(); + _surface->setVisible(false); + removeCallbacks(); + break; + } + return messageResult; +} + +Class463::Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _class466(class466), + _flag(false) { + + //TODO_field_F0 = -1; + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class463::handleMessage); + createSurface(990, 106, 181); + _x = 201; + if (flag) { + _y = 297; + sub40CD60(); + } else { + _y = 334; + sub40CD30(); + } +} + +Class463::~Class463() { + // TODO Sound1ChList_sub_407AF0(0x01D00560); +} + +uint32 Class463::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x092870C0) { + _class466->sendMessage(0x2006, 0, this); + } else if (param.asInteger() == 0x11CA0144) { + _soundResource.play(0x51800A04); + } + break; + case 0x1011: + _parentScene->sendMessage(0x2002, 0, this); + messageResult = 1; + case 0x480B: + if (!_flag) { + _sprite = (Sprite*)sender; + sub40CD90(); + } + break; + } + return messageResult; + +} + +uint32 Class463::handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Class463::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class463::spriteUpdate40CD10() { + _x = _sprite->getX() + 100; +} + +void Class463::sub40CD30() { + setFileHash(0x654913D0, 0, -1); + SetMessageHandler(&Class463::handleMessage); + SetSpriteCallback(NULL); +} + +void Class463::sub40CD60() { + setFileHash(0x356803D0, 0, -1); + SetMessageHandler(&Class463::handleMessage40CCD0); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetAnimationCallback3(&Class463::sub40CD30); +} + +void Class463::sub40CD90() { + // TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true); + // TODO Sound1ChList_playLooping(0x4B044624); + _flag = true; + setFileHash(0x85084190, 0, -1); + SetMessageHandler(&Class463::handleMessage); + SetSpriteCallback(&Class463::spriteUpdate40CD10); + _newHashListIndex = -2; +} + + +Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _flag(false) { + + int16 topY1, topY2, topY3, topY4; + int16 x1, x2; + Sprite *tempSprite, *class464; + + // TODO _resourceTable2.setResourceList(ex_sub_41C730(), true); + if (getGlobalVar(0x0A18CA33)) { + // TODO _resourceTable1.setResourceList(0x004AEA10, true); + } else if (getGlobalVar(0x0A310817)) { + // TODO _resourceTable1.setResourceList(0x004AEA70, true); + } else { + // TODO _resourceTable1.setResourceList(0x004AEB18, true); + } + + SetUpdateHandler(&Scene1201::update); + SetMessageHandler(&Scene1201::handleMessage); + + _vm->_collisionMan->setHitRects(0x004AEBD0); + + _surfaceFlag = true; + + if (!getSubVar(0x40050052, 0xE8058B52)) { + setSubVar(0x40050052, 0xE8058B52, 1); + for (uint32 index = 0; index < 18; index++) { + setSubVar(0x10055D14, index, kScene1201InitArray[index]); + } + } + + _mouseCursor = addSprite(new Mouse433(_vm, 0x9A2C0409, NULL)); + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + + tempSprite = addSprite(new StaticSprite(_vm, 0x03C82530, 100)); + topY1 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; + + tempSprite = addSprite(new StaticSprite(_vm, 0x88182069, 200)); + topY2 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; + + tempSprite = addSprite(new StaticSprite(_vm, 0x476014E0, 300)); + topY3 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; + + tempSprite = addSprite(new StaticSprite(_vm, 0x04063110, 500)); + topY4 = tempSprite->getY() + 1; + + _class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1 ? 1 : 0)); + _class466->getSurface()->getClipRect().x1 = 0; + _class466->getSurface()->getClipRect().y1 = topY4; + _class466->getSurface()->getClipRect().x2 = 640; + _class466->getSurface()->getClipRect().y2 = 480; + + addSprite(new StaticSprite(_vm, 0x400B04B0, 1200)); + + tempSprite = addSprite(new StaticSprite(_vm, 0x40295462, 1200)); + x1 = tempSprite->getX(); + + tempSprite = addSprite(new StaticSprite(_vm, 0xA29223FA, 1200)); + x2 = tempSprite->getX() + tempSprite->getSurface()->getDrawRect().width; + + class464 = addSprite(new Class464(_vm)); + + if (which < 0) { + _klayman = new KmScene1201(_vm, this, class464, 364, 333); + setMessageList(0x004AEC08); + } else if (which == 3) { + _klayman = new KmScene1201(_vm, this, class464, 400, 329); + setMessageList(0x004AEC08); + } else if (which == 2) { + if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + _klayman = new KmScene1201(_vm, this, class464, 374, 333); + setMessageList(0x004AEC08); + } else { + _klayman = new KmScene1201(_vm, this, class464, 640, 329); + setMessageList(0x004AEC20); + } + } else if (which == 1) { + if (getGlobalVar(0xC0418A02)) { + _klayman = new KmScene1201(_vm, this, class464, 364, 333); + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmScene1201(_vm, this, class464, 246, 333); + } + setMessageList(0x004AEC30); + } else { + _klayman = new KmScene1201(_vm, this, class464, 0, 336); + setMessageList(0x004AEC10); + } + + _klayman->getSurface()->getClipRect().x1 = x1; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = x2; + _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setRepl(64, 0); + + addSprite(_klayman); + + if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + _background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0)); + _palette = new Palette(_vm, 0x4019A2C4); + _palette->usePalette(); + _class468 = NULL; + } else { + _background = addBackground(new DirtyBackground(_vm, 0x40206EC5, 0, 0)); + _palette = new Palette(_vm, 0x40206EC5); + _palette->usePalette(); + _class468 = addSprite(new Class468(_vm, _klayman, which - 2 != 1)); // CHECKME??? + } + + if (getGlobalVar(0x000CF819)) { + addSprite(new StaticSprite(_vm, 0x10002ED8, 500)); + if (!getGlobalVar(0x0A18CA33)) { + Class463 *class463; + class463 = new Class463(_vm, this, _class466, which - 1 != 1); + class463->getSurface()->getClipRect().x1 = x1; + class463->getSurface()->getClipRect().y1 = 0; + class463->getSurface()->getClipRect().x2 = x2; + class463->getSurface()->getClipRect().y2 = 480; + _vm->_collisionMan->addSprite(_class463); + _class463 = addSprite(class463); +#if 0 + tempSprite = addSprite(new Class465(_vm, _class463)); + tempSprite->getSurface()->getClipRect().x1 = x1; + tempSprite->getSurface()->getClipRect().y1 = 0; + tempSprite->getSurface()->getClipRect().x2 = x2; + tempSprite->getSurface()->getClipRect().y2 = 480; +#endif + class463->setRepl(64, 0); + } + + uint32 tntIndex = 1; + while (tntIndex < 18) { + uint32 elemIndex = getSubVar(0x10055D14, tntIndex); + int16 clipY2; + if (kScene1201PointArray[elemIndex].y < 175) + clipY2 = topY1; + else if (kScene1201PointArray[elemIndex].y < 230) + clipY2 = topY2; + else + clipY2 = topY3; + addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2)); + elemIndex = getSubVar(0x10055D14, tntIndex + 1); + if (kScene1201PointArray[elemIndex].y < 175) + clipY2 = topY1; + else if (kScene1201PointArray[elemIndex].y < 230) + clipY2 = topY2; + else + clipY2 = topY3; + addSprite(new SsScene1201Tnt(_vm, tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2)); + tntIndex += 3; + } + + if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + setRectList(0x004AEE58); + } else { + setRectList(0x004AEDC8); + } + + } else { + + addSprite(new StaticSprite(_vm, 0x8E8A1981, 900)); + + uint32 tntIndex = 0; + while (tntIndex < 18) { + uint32 elemIndex = getSubVar(0x10055D14, tntIndex); + int16 clipY2; + if (kScene1201PointArray[elemIndex].x < 300) { + clipY2 = 480; + } else { + if (kScene1201PointArray[elemIndex].y < 175) + clipY2 = topY1; + else if (kScene1201PointArray[elemIndex].y < 230) + clipY2 = topY2; + else + clipY2 = topY3; + } + addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2)); + tntIndex++; + } + + if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + setRectList(0x004AEE18); + } else { + setRectList(0x004AED88); + } + + } + + tempSprite = addSprite(new StaticSprite(_vm, 0x63D400BC, 900)); + +#if 0 + _class467 = addSprite(new Class467(_vm, _klayman)); + _class467->getSurface()->getClipRect().x1 = x1; + _class467->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; + _class467->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; + _class467->getSurface()->getClipRect().y2 = 480; +#endif + + if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) { + setGlobalVar(0x0112090A, 1); + } + + _class461 = NULL; + +#if 0 + if (getGlobalVar(0x0112090A) < 3) { + _class461 = addSprite(new Class461(_vm, this)); + _vm->_collisionMan->addSprite(_class461); + } + + if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + _class462 = addSprite(new Class462(_vm, this, _klayman)); + _class462->getSurface()->getClipRect().x1 = x1; + _class462->getSurface()->getClipRect().y1 = 0; + _class462->getSurface()->getClipRect().x2 = x2; + _class462->getSurface()->getClipRect().y2 = 480; + } +#endif + +} + +Scene1201::~Scene1201() { +} + +void Scene1201::update() { + Scene::update(); + if (_class461 && getGlobalVar(0x0112090A)) { + deleteSprite(&_class461); + } +} + +uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug("Scene1201::handleMessage(%04X)", messageNum); + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x07053000) { + _flag = true; + _class462->sendMessage(0x2004, 0, this); + } else if (param.asInteger() == 0x140E5744) { + _class462->sendMessage(0x2005, 0, this); + } else if (param.asInteger() == 0x40253C40) { + _messageListFlag = false; + _class462->sendMessage(0x2006, 0, this); + } else if (param.asInteger() == 0x090EB048) { + if (_klayman->getX() < 572) { + setMessageList2(0x004AEC90); + } else { + setMessageList2(0x004AEC20); + } + } + break; + case 0x2001: + if (!getGlobalVar(0x0112090A)) { + setMessageList2(0x004AECB0); + } else { + _klayman->sendEntityMessage(0x1014, _class461, this); + setMessageList2(0x004AECC0); + } + break; + case 0x2002: + if (getGlobalVar(0x20A0C516)) { + _klayman->sendEntityMessage(0x1014, _class463, this); + setMessageList2(0x004AECF0); + } else if (getGlobalVar(0x0112090A) == 3) { + _klayman->sendEntityMessage(0x1014, _class463, this); + if (_klayman->getX() > _class463->getX()) { + setMessageList(0x004AECD0); + } else { + setMessageList(0x004AECE0); + } + } + break; + case 0x4814: + messageList402220(); + break; + case 0x4826: + if (sender == _asTape) { + _klayman->sendEntityMessage(0x1014, _asTape, this); + setMessageList(0x004AED38); + } + break; + case 0x4829: + _class468->sendMessage(0x4829, 0, this); + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h new file mode 100644 index 0000000000..bbdfaeb634 --- /dev/null +++ b/engines/neverhood/module1200.h @@ -0,0 +1,141 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1200_H +#define NEVERHOOD_MODULE1200_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1200 + +class Module1200 : public Module { +public: + Module1200(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1200(); +protected: + // TODO ResourceTable _resourceTable; + bool _moduleDone; + uint32 _moduleDoneStatus; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene1201(int which); + void createScene1202(int which); + void createScene1203(int which); + void updateScene1201(); + void updateScene1202(); + void updateScene1203(); +}; + +// Scene1201 + +class AsScene1201Tape : public AnimatedSprite { +public: + AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash); +protected: + Scene *_parentScene; + uint32 _nameHash; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Class466 : public AnimatedSprite { +public: + Class466(NeverhoodEngine *vm, bool flag); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40D340(); + void sub40D360(); + void sub40D380(); +}; + +class Class468 : public AnimatedSprite { +public: + Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag); +protected: + SoundResource _soundResource; + Sprite *_klayman; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40D7E0(); + void sub40D830(); + void sub40D880(); +}; + +class Class464 : public AnimatedSprite { +public: + Class464(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Class463 : public AnimatedSprite { +public: + Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag); + virtual ~Class463(); +protected: + Scene *_parentScene; + Sprite *_class466; + Sprite *_sprite; + SoundResource _soundResource; + bool _flag; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate40CD10(); + void sub40CD30(); + void sub40CD60(); + void sub40CD90(); +}; + +class SsScene1201Tnt : public StaticSprite { +public: + SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2); +protected: + uint32 _elemIndex; + int16 _field7A; +}; + +class Scene1201 : public Scene { +public: + Scene1201(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1201(); +protected: + // TODO ResourceTable _resourceTable1; + // TODO ResourceTable _resourceTable2; + Sprite *_class461; + Sprite *_class463; + Sprite *_class462; + Sprite *_class466; + Sprite *_class467; + Sprite *_class468; + Sprite *_asTape; + bool _flag; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1200_H */ diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 8f49a0033d..43f1ca79bc 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -485,6 +485,13 @@ void Scene::runMessageList() { } +void Scene::messageList402220() { + _messageListFlag1 = false; + _messageList = NULL; + _messageListFlag = true; + _klayman->sendMessage(0x4004, 0, this); +} + void Scene::setRectList(uint32 id) { setRectList(_vm->_staticData->getRectList(id)); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 8f0b79a5ee..47114053b0 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -102,6 +102,7 @@ protected: void runMessageList(); void setRectList(uint32 id); void setRectList(RectList *rectList); + void messageList402220(); void loadDataResource(uint32 fileHash); }; -- cgit v1.2.3 From 0632fc7dda2b0ad97f22105a3fb6fbcd3346feb9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 18 Jul 2011 18:54:59 +0000 Subject: NEVERHOOD: Add tables for Scene1201 --- devtools/create_neverhood/tables.h | 19 +++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 2786 -> 3702 bytes 2 files changed, 19 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index e6e4d753cd..016ac73318 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -25,6 +25,8 @@ static const uint32 hitRectListOffsets[] = { 1, 0x004B4860, // Scene1002 1, 0x004B4138, + // Scene1201 + 4, 0x004AEBD0, 0, 0 }; @@ -38,6 +40,11 @@ static const uint32 rectListOffsets[] = { 3, 0x004B43A0, // Scene1004 1, 0x004B7C70, + // Scene1201 + 1, 0x004AEE58, + 1, 0x004AEDC8, + 1, 0x004AEE18, + 1, 0x004AED88, 0, 0 }; @@ -71,6 +78,18 @@ static const uint32 messageListOffsets[] = { 2, 0x004B7C08, 1, 0x004B7C18, 2, 0x004B7C20, + // Scene1201 + 1, 0x004AEC08, + 2, 0x004AEC10, + 2, 0x004AEC20, + 2, 0x004AEC30, + 4, 0x004AEC90, + 2, 0x004AECB0, + 2, 0x004AECC0, + 5, 0x004AECF0, + 2, 0x004AECD0, + 2, 0x004AECE0, + 2, 0x004AED38, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 6e7c150b5d..36a42920ad 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From f162516f25150cf5ca149986731f7f4e8f7da437 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 18 Jul 2011 20:20:23 +0000 Subject: NEVERHOOD: More work on Scene1201 --- engines/neverhood/klayman.cpp | 26 +++++++++----- engines/neverhood/klayman.h | 2 ++ engines/neverhood/module1200.cpp | 77 +++++++++++++++++++++++++++++++++++----- engines/neverhood/module1200.h | 22 +++++++++++- 4 files changed, 109 insertions(+), 18 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 145d645e01..91de87d7f5 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -485,7 +485,6 @@ void Klayman::sub41C930(int16 x, bool flag) { error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));"); // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); } else { - debug("##################################################################"); _x4 = x; setCallback2(AnimationCallback(&Klayman::sub41F950)); } @@ -773,8 +772,7 @@ void Klayman::sub41FA40() { if (_status3 == 2) { sub41C7B0(); } else if (_status3 == 3) { - error("// TODO sub420F20();"); - // TODO sub420F20(); + sub420F20(); } else { _flagE2 = true; _flagE5 = true; @@ -1626,6 +1624,23 @@ void Klayman::sub4207F0() { SetMessageHandler(&Klayman::handleMessage41EEF0); } +void Klayman::sub420F20() { + _flagF8 = false; + _flagE5 = false; + setFileHash(0x11A8E012, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F5A0); + SetMessageHandler(&Klayman::handleMessage41EC70); +} + +void Klayman::spriteUpdate41F5A0() { + if (!_flagF8 && ABS(_x4 - _x) < 80) { + _parentScene->sendMessage(0x4829, 0, this); + _flagF8 = true; + } + AnimatedSprite::updateDeltaXY(); +} + //############################################################################## // KmScene1001 @@ -1758,8 +1773,6 @@ void KmScene1002::xUpdate() { uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { //ok debug("KmScene1002::xHandleMessage(%04X)", messageNum); - if (messageNum == 0x100D) - debug("-> %08X", param.asInteger()); switch (messageNum) { case 0x2001: setCallback2(AnimationCallback(&KmScene1002::sub449E90)); @@ -1908,9 +1921,6 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶ _x = ((Sprite*)sender)->getX() + 75; } _y = ((Sprite*)sender)->getY() - 200; - - debug("&&&&&&&&&&& param.asInteger() = %d", param.asInteger()); - if (param.asInteger() == 0) { sub449EF0(); } else if (param.asInteger() == 1) { diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3c87104125..3682d75e69 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -84,11 +84,13 @@ public: void sub420ED0(); void sub4207A0(); void sub4207F0(); + void sub420F20(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); void spriteUpdate41F780(); void spriteUpdate41F230(); + void spriteUpdate41F5A0(); uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 8075c5c391..eef543385c 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -478,6 +478,69 @@ void Class463::sub40CD90() { _newHashListIndex = -2; } +Class465::Class465(NeverhoodEngine *vm, Sprite *class463) + : AnimatedSprite(vm, 1200), _class463(class463) { + + createSurface1(995, 0x828C0411); + SetUpdateHandler(&Class465::update); + SetMessageHandler(&Sprite::handleMessage); + SetSpriteCallback(&Class465::spriteUpdate40D150); + setFileHash(0x828C0411, 0, -1); + _surface->setVisible(false); +} + +Class465::~Class465() { + // TODO Sound1ChList_sub_407AF0(0x041080A4); +} + +void Class465::update() { + AnimatedSprite::update(); + if (getGlobalVar(0x20A0C516)) { + _surface->setVisible(true); + SetUpdateHandler(&AnimatedSprite::update); + // TODO Sound1ChList_addSoundResource(0x041080A4, 0x460A1050, true); + // TODO Sound1ChList_playLooping(0x460A1050); + } +} + +void Class465::spriteUpdate40D150() { + _x = _class463->getX() - 18; + _y = _class463->getY() - 158; +} + +AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) + : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman) { + + _x = 320; + _y = 240; + createSurface(800, 55, 199); + if (_klayman->getX() < 100) { + setFileHash(0x508A111B, 0, -1); + _newHashListIndex = -2; + _soundResource.play(calcHash("fxDoorOpen03")); + } else { + setFileHash(0x508A111B, -1, -1); + _newHashListIndex = -2; + } + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1201LeftDoor::handleMessage); +} + +uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4809: + sub40D590(); + break; + } + return messageResult; +} + +void AsScene1201LeftDoor::sub40D590() { + setFileHash(0x508A111B, -1, -1); + _playBackwards = true; + _newHashListIndex = 0; +} Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _flag(false) { @@ -600,13 +663,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) class463->getSurface()->getClipRect().y2 = 480; _vm->_collisionMan->addSprite(_class463); _class463 = addSprite(class463); -#if 0 tempSprite = addSprite(new Class465(_vm, _class463)); tempSprite->getSurface()->getClipRect().x1 = x1; tempSprite->getSurface()->getClipRect().y1 = 0; tempSprite->getSurface()->getClipRect().x2 = x2; tempSprite->getSurface()->getClipRect().y2 = 480; -#endif class463->setRepl(64, 0); } @@ -670,13 +731,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = addSprite(new StaticSprite(_vm, 0x63D400BC, 900)); -#if 0 - _class467 = addSprite(new Class467(_vm, _klayman)); - _class467->getSurface()->getClipRect().x1 = x1; - _class467->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; - _class467->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; - _class467->getSurface()->getClipRect().y2 = 480; -#endif + _asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman)); + _asLeftDoor->getSurface()->getClipRect().x1 = x1; + _asLeftDoor->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; + _asLeftDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; + _asLeftDoor->getSurface()->getClipRect().y2 = 480; if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) { setGlobalVar(0x0112090A, 1); diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index bbdfaeb634..2a8a933b59 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -109,6 +109,26 @@ protected: void sub40CD90(); }; +class Class465 : public AnimatedSprite { +public: + Class465(NeverhoodEngine *vm, Sprite *class463); + ~Class465(); +protected: + Sprite *_class463; + void update(); + void spriteUpdate40D150(); +}; + +class AsScene1201LeftDoor : public AnimatedSprite { +public: + AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman); +protected: + Sprite *_klayman; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40D590(); +}; + class SsScene1201Tnt : public StaticSprite { public: SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2); @@ -128,7 +148,7 @@ protected: Sprite *_class463; Sprite *_class462; Sprite *_class466; - Sprite *_class467; + Sprite *_asLeftDoor; Sprite *_class468; Sprite *_asTape; bool _flag; -- cgit v1.2.3 From 04d2b9a4028d1f6ac7c5c5e4a6cc95f8532e9cdf Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 26 Jul 2011 08:33:35 +0000 Subject: NEVERHOOD: Add entries for Scene1401, Scene1402 and Scene1705 --- devtools/create_neverhood/tables.h | 44 +++++++++++++++++++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 3702 -> 5448 bytes 2 files changed, 44 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 016ac73318..58e48dc1a4 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -27,6 +27,8 @@ static const uint32 hitRectListOffsets[] = { 1, 0x004B4138, // Scene1201 4, 0x004AEBD0, + // Scene1705 + 1, 0x004B69D8, 0, 0 }; @@ -45,6 +47,14 @@ static const uint32 rectListOffsets[] = { 1, 0x004AEDC8, 1, 0x004AEE18, 1, 0x004AED88, + // Scene1401 + 1, 0x004B6758, + // Scene1402 + 1, 0x004B0C48, + 1, 0x004B0C98, + // Scene1705 + 1, 0x004B6B40, + 1, 0x004B6B30, 0, 0 }; @@ -90,10 +100,44 @@ static const uint32 messageListOffsets[] = { 2, 0x004AECD0, 2, 0x004AECE0, 2, 0x004AED38, + // Scene1401 + 1, 0x004B65C8, + 1, 0x004B65D0, + 1, 0x004B65D8, + 1, 0x004B65E8, + 3, 0x004B6670, + 4, 0x004B6690, + 1, 0x004B66B0, + 3, 0x004B6658, + 2, 0x004B65F0, + // Scene1402 + 1, 0x004B0B48, + 1, 0x004B0B50, + 1, 0x004B0B58, + 1, 0x004B0B60, + 2, 0x004B0B68, + 3, 0x004B0BB8, + 3, 0x004B0BD0, + // Scene1705 + 1, 0x004B69E8, + 2, 0x004B6A08, + 4, 0x004B6AA0, + 2, 0x004B6A18, + 1, 0x004B69F0, + 2, 0x004B6AC0, 0, 0 }; static const uint32 navigationListOffsets[] = { + // Module1700 + 2, 0x004AE8B8, + 3, 0x004AE8E8, + // Module1800 + 4, 0x004AFD38, + 1, 0x004AFD98, + 2, 0x004AFDB0, + 4, 0x004AFDE0, + 2, 0x004AFE40, // Module2300 2, 0x004B67B8, 6, 0x004B67E8, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 36a42920ad..a76db0a809 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From bfd71cff6e73c0be6b2d66f7f71921094f42ca09 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 26 Jul 2011 08:38:19 +0000 Subject: NEVERHOOD: New modules Module1200, Module1400, Module1700 and Module1800 - Implement CollisionMan::removeSprite --- engines/neverhood/blbarchive.cpp | 3 +- engines/neverhood/collisionman.cpp | 9 +- engines/neverhood/diskplayerscene.cpp | 563 +++++++++++++ engines/neverhood/diskplayerscene.h | 110 +++ engines/neverhood/gamemodule.cpp | 97 ++- engines/neverhood/gamemodule.h | 6 + engines/neverhood/graphics.cpp | 9 +- engines/neverhood/klayman.cpp | 520 +++++++++++- engines/neverhood/klayman.h | 56 +- engines/neverhood/module.mk | 4 + engines/neverhood/module1200.cpp | 631 +++++++++++++-- engines/neverhood/module1200.h | 103 ++- engines/neverhood/module1400.cpp | 1439 +++++++++++++++++++++++++++++++++ engines/neverhood/module1400.h | 242 ++++++ engines/neverhood/module1700.cpp | 359 ++++++++ engines/neverhood/module1700.h | 80 ++ engines/neverhood/module1800.cpp | 300 +++++++ engines/neverhood/module1800.h | 63 ++ engines/neverhood/navigationscene.cpp | 9 +- engines/neverhood/navigationscene.h | 6 +- engines/neverhood/palette.cpp | 7 +- engines/neverhood/palette.h | 5 +- engines/neverhood/resource.cpp | 15 + engines/neverhood/resource.h | 1 + engines/neverhood/resourceman.cpp | 4 +- engines/neverhood/scene.cpp | 9 +- engines/neverhood/scene.h | 3 +- engines/neverhood/smackerplayer.cpp | 46 +- engines/neverhood/smackerplayer.h | 4 + engines/neverhood/sprite.cpp | 11 +- engines/neverhood/sprite.h | 6 +- 31 files changed, 4561 insertions(+), 159 deletions(-) create mode 100644 engines/neverhood/diskplayerscene.cpp create mode 100644 engines/neverhood/diskplayerscene.h create mode 100644 engines/neverhood/module1400.cpp create mode 100644 engines/neverhood/module1400.h create mode 100644 engines/neverhood/module1700.cpp create mode 100644 engines/neverhood/module1700.h create mode 100644 engines/neverhood/module1800.cpp create mode 100644 engines/neverhood/module1800.h diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 2e29485d58..6a047cab46 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -105,12 +105,11 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) { byte *BlbArchive::getEntryExtData(uint index) { BlbArchiveEntry &entry = _entries[index]; - return _extData && entry.extDataOfs != 0 ? &_extData[entry.extDataOfs - 1] : NULL; + return (_extData && entry.extDataOfs != 0) ? &_extData[entry.extDataOfs - 1] : NULL; } Common::SeekableReadStream *BlbArchive::createStream(uint index) { const BlbArchiveEntry &entry = _entries[index]; - //debug("entry.offset = %08X; entry.offset + entry.diskSize = %08X", entry.offset, entry.offset + entry.diskSize); return new Common::SafeSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize); } diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index 87ec0cdcad..4296b91a10 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -52,7 +52,7 @@ void CollisionMan::setHitRects(HitRectList *hitRects) { } void CollisionMan::clearHitRects() { - _hitRects = 0; + _hitRects = NULL; } HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) { @@ -82,7 +82,12 @@ void CollisionMan::addSprite(Sprite *sprite) { } void CollisionMan::removeSprite(Sprite *sprite) { - // TODO + for (uint index = 0; index < _sprites.size(); index++) { + if (_sprites[index] == sprite) { + _sprites.remove_at(index); + break; + } + } } void CollisionMan::clearSprites() { diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp new file mode 100644 index 0000000000..dd2c837dbd --- /dev/null +++ b/engines/neverhood/diskplayerscene.cpp @@ -0,0 +1,563 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/diskplayerscene.h" +#include "neverhood/mouse.h" + +namespace Neverhood { + +// TODO: Maybe move hash tables into neverhood.dat + +static const uint32 kDiskplayerPaletteFileHashes[] = { + 0x03B78240, + 0x34B32B08, + 0x4F2569D4, + 0x07620590, + 0x38422401 +}; + +static const byte kDiskplayerInitArray[] = { + 2, 1, 4, 5, 3, 11, 8, 6, 7, 9, 10, 17, 16, 18, 19, 20, 15, 14, 13, 12 +}; + +static const uint32 kDiskplayerSmackerFileHashes[] = { + 0x010A2810, + 0x020A2810, + 0x040A2810, + 0x080A2810, + 0x100A2810, + 0x200A2810, + 0x400A2810, + 0x800A2810, + 0x000A2811, + 0x010C2810, + 0x020C2810, + 0x040C2810, + 0x080C2810, + 0x100C2810, + 0x200C2810, + 0x400C2810, + 0x800C2810, + 0x000C2811, + 0x000C2812, + 0x02002810, + 0x04002810 +}; + +static const uint32 kDiskplayerSlotFileHashes1[] = { + 0x81312280, + 0x01312281, + 0x01312282, + 0x01312284, + 0x01312288, + 0x01312290, + 0x013122A0, + 0x013122C0, + 0x01312200, + 0x82312280, + 0x02312281, + 0x02312282, + 0x02312284, + 0x02312288, + 0x02312290, + 0x023122A0, + 0x023122C0, + 0x02312200, + 0x02312380, + 0x04312281 +}; + +static const uint32 kDiskplayerSlotFileHashes2[] = { + 0x90443A00, + 0x90443A18, + 0x90443A28, + 0x90443A48, + 0x90443A88, + 0x90443B08, + 0x90443808, + 0x90443E08, + 0x90443208, + 0xA0443A00, + 0xA0443A18, + 0xA0443A28, + 0xA0443A48, + 0xA0443A88, + 0xA0443B08, + 0xA0443808, + 0xA0443E08, + 0xA0443208, + 0xA0442A08, + 0xC0443A18 +}; + +static const uint32 kDiskplayerSlotFileHashes3[] = { + 0x10357320, + 0x10557320, + 0x10957320, + 0x11157320, + 0x12157320, + 0x14157320, + 0x18157320, + 0x00157320, + 0x30157320, + 0x1035B320, + 0x1055B320, + 0x1095B320, + 0x1115B320, + 0x1215B320, + 0x1415B320, + 0x1815B320, + 0x0015B320, + 0x3015B320, + 0x5015B320, + 0x10543320 +}; + +static const uint32 kDiskplayerSlotFileHashes4[] = { + 0xDC8020E4, + 0xDC802164, + 0xDC802264, + 0xDC802464, + 0xDC802864, + 0xDC803064, + 0xDC800064, + 0xDC806064, + 0xDC80A064, + 0xDC8020E7, + 0xDC802167, + 0xDC802267, + 0xDC802467, + 0xDC802867, + 0xDC803067, + 0xDC800067, + 0xDC806067, + 0xDC80A067, + 0xDC812067, + 0xDC802161 +}; + +Class494::Class494(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + createSurface1(0x100B90B4, 1200); + _x = 211; + _y = 195; + setFileHash(0x100B90B4, 0, -1); + _newHashListIndex = 0; + _needRefresh = true; + updatePosition(); + _surface->setVisible(false); +} + +uint32 Class494::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class494::sub43BE00() { + setFileHash1(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Sprite::handleMessage); + _surface->setVisible(false); +} + +void Class494::sub43BE20() { + setFileHash(0x100B90B4, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class494::handleMessage); + SetAnimationCallback3(&Class494::sub43BE00); + _surface->setVisible(true); +} + +DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene) + : StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm), + _diskplayerScene(diskplayerScene), _isPlaying(false) { + + _spriteResource.load2(0x24A4A664); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = _spriteResource.getDimensions().width; + _deltaRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _surface->setVisible(false); + processDelta(); + _needRefresh = true; + StaticSprite::update(); + _soundResource1.load(0x44043000); + _soundResource2.load(0x44045000); + SetMessageHandler(&DiskplayerPlayButton::handleMessage); +} + +uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_diskplayerScene->getFlag3()) { + if (_isPlaying) { + _diskplayerScene->sendMessage(0x2001, 0, this); + release(); + } else { + _diskplayerScene->sendMessage(0x2000, 0, this); + press(); + } + } + StaticSprite::update(); + messageResult = 1; + break; + } + return messageResult; +} + +void DiskplayerPlayButton::press() { + if (!_isPlaying) { + _surface->setVisible(true); + StaticSprite::update(); + _soundResource1.play(); + _isPlaying = true; + } +} + +void DiskplayerPlayButton::release() { + if (_isPlaying) { + _surface->setVisible(false); + StaticSprite::update(); + _soundResource2.play(); + _isPlaying = false; + } +} + +DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value) + : Entity(vm, 0), _diskplayerScene(diskplayerScene), _soundResource(vm), _elementIndex(elementIndex), + _value(value), _flag2(false), _flag(false), _countdown(0), _initialCountdown(2), + _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { + + if (value != 0 && elementIndex < 20) { + _inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100)); + _appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[_elementIndex], 1000)); + _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[_elementIndex], 1100)); + _inactiveSlot->getSurface()->setVisible(false); + _appearSlot->getSurface()->setVisible(false); + _activeSlot->getSurface()->setVisible(false); + _soundResource.load(0x46210074); + // TODO sound panning stuff + } else if (elementIndex != 20) { + _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100)); + _activeSlot->getSurface()->setVisible(false); + } + SetUpdateHandler(&DiskplayerSlot::update); +} + +void DiskplayerSlot::update() { + if (_countdown != 0 && (--_countdown == 0)) { + if (_flag) { + if (_inactiveSlot) { + _inactiveSlot->getSurface()->setVisible(true); + } + if (_activeSlot) { + _activeSlot->getSurface()->setVisible(false); + } + _countdown = _initialCountdown / 2; + } else { + if (_inactiveSlot) { + _inactiveSlot->getSurface()->setVisible(false); + } + if (_activeSlot) { + _activeSlot->getSurface()->setVisible(true); + } + _countdown = _initialCountdown; + } + _flag = !_flag; + } +} + +void DiskplayerSlot::appear() { + if (_inactiveSlot) { + _inactiveSlot->getSurface()->setVisible(true); + } + if (_appearSlot) { + _appearSlot->getSurface()->setVisible(true); + } + if (_inactiveSlot) { + _soundResource.play(); + } +} + +void DiskplayerSlot::play() { + if (!_flag2) { + if (_inactiveSlot) { + _inactiveSlot->getSurface()->setVisible(false); + } + if (_activeSlot) { + _activeSlot->getSurface()->setVisible(true); + } + _flag = true; + _countdown = 0; + } +} + +void DiskplayerSlot::activate() { + if (!_flag2) { + _countdown = _initialCountdown; + } +} + +void DiskplayerSlot::stop() { + if (!_flag2) { + if (_inactiveSlot) { + _inactiveSlot->getSurface()->setVisible(true); + } + if (_activeSlot) { + _activeSlot->getSurface()->setVisible(false); + } + _flag = false; + _countdown = 0; + } +} + +DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _which(which), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0), + _fullFlag(false), _flag3(false), _inputDisabled(true), _updateStatus(0) { + + int count = 0; + + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x8A000044, 0, 0)); + _palette = new Palette(_vm, kDiskplayerPaletteFileHashes[_which]); + _playButton = new DiskplayerPlayButton(_vm, this); + addSprite(_playButton); + _vm->_collisionMan->addSprite(_playButton); + _class494 = new Class494(_vm); + addSprite(_class494); + + // DEBUG: Give all disks + for (int i = 0; i < 19; i++) { + setSubVar(0x02720344, i, 1); + } + + for (int i = 0; i < 20; i++) { + _diskAvailable[i] = 0; + if (getSubVar(0x02720344, i)) + count++; + } + + for (int i = 0; i < count; i++) { + _diskAvailable[kDiskplayerInitArray[i] - 1] = 1; + } + + for (int i = 0; i < 20; i++) { + _diskSlots[i] = new DiskplayerSlot(_vm, this, i, _diskAvailable[i]); + addEntity(_diskSlots[i]); + } + + _fullFlag = count == 20; + + if (_fullFlag && !getGlobalVar(0xC0780812)) + _flag3 = true; + + _flag4 = _flag3; + + _class650 = new DiskplayerSlot(_vm, this, 20, 0); + addEntity(_class650); + + _mouseCursor = addSprite(new Mouse435(_vm, 0x000408A8, 20, 620)); + _mouseCursor->getSurface()->setVisible(false); + + _smackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true); + addEntity(_smackerPlayer); + addSurface(_smackerPlayer->getSurface()); + _smackerPlayer->setDrawPos(154, 86); + // TODO _smackerPlayer->gotoFrame(0); + + _palette->usePalette(); + + SetMessageHandler(&DiskplayerScene::handleMessage); + SetUpdateHandler(&DiskplayerScene::update); + _appearCountdown = 6; + +} + +void DiskplayerScene::update() { + Scene::update(); + + debug("_updateStatus = %d", _updateStatus); + + if (_updateStatus == 1) { + if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) { + if (_diskAvailable[_diskIndex]) { + playDisk(); + } else { + playStatic(); + } + } + } else if (_updateStatus == 2) { + if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) { + _diskSlots[_diskIndex]->stop(); + _diskIndex++; + if (_fullFlag) { + if (_diskIndex == 20) { + if (_flag3) { + playDisk(); + _updateStatus = 3; + } else { + _diskIndex = 0; + stop(); + } + } else { + playDisk(); + } + } else { + if (_diskIndex == 20) { + _diskIndex = 0; + stop(); + } else { + tuneIn(); + } + } + } + } else if (_updateStatus == 3) { + if (_smackerPlayer->getFrameNumber() == 133) { + _class494->sub43BE20(); + setGlobalVar(0xC0780812, 1); + } else if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) { + for (int i = 0; i < 20; i++) { + _diskSlots[i]->setFlag2(false); + _diskSlots[i]->stop(); + } + _diskIndex = 0; + stop(); + _mouseCursor->getSurface()->setVisible(true); + _flag3 = false; + } + } + + if (_appearCountdown != 0 && (--_appearCountdown == 0)) { + _diskSlots[_diskIndex]->appear(); + if (_flag3) { + _diskSlots[_diskIndex]->activate(); + _diskSlots[_diskIndex]->setFlag2(true); + } + _diskIndex++; + while (_diskAvailable[_diskIndex] == 0 && _diskIndex < 19) + _diskIndex++; + if (_diskIndex < 20) { + _appearCountdown = 1; + } else { + _diskIndex = 0; + _inputDisabled = false; + if (_flag3) { + _playButton->press(); + _tuneInCountdown = 2; + } else { + _mouseCursor->getSurface()->setVisible(true); + _diskSlots[_diskIndex]->activate(); + } + } + } + + if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0)) { + playDisk(); + } + +} + +uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + if (!_inputDisabled) { + switch (messageNum) { + case 0x0001: + // TODO: Debug/Cheat + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } else if (!_flag3 && + param.asPoint().x > 38 && param.asPoint().x < 598 && + param.asPoint().y > 400 && param.asPoint().y < 460) { + + _diskSlots[_diskIndex]->stop(); + _diskIndex = (param.asPoint().x - 38) / 28; + _diskSlots[_diskIndex]->activate(); + if (_updateStatus == 2) { + if (_diskAvailable[_diskIndex]) { + playDisk(); + } else { + playStatic(); + } + } + } + break; + // case 0x000D: TODO: Debug/Cheat + case 0x2000: + tuneIn(); + break; + case 0x2001: + stop(); + break; + } + } + return messageResult; +} + +void DiskplayerScene::stop() { + _smackerPlayer->open(0x08288103, true); + _palette->usePalette(); + _playButton->release(); + _updateStatus = 0; + _diskSlots[_diskIndex]->activate(); +} + +void DiskplayerScene::tuneIn() { + _smackerPlayer->open(0x900001C1, false); + _palette->usePalette(); + _playButton->release(); + _updateStatus = 1; + _diskSlots[_diskIndex]->activate(); +} + +void DiskplayerScene::playDisk() { + _smackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false); + _palette->usePalette(); + _updateStatus = 2; + _diskSlots[_diskIndex]->play(); +} + +void DiskplayerScene::playStatic() { + _smackerPlayer->open(0x90000101, false); + _palette->usePalette(); + _playButton->release(); + _updateStatus = 2; + _diskSlots[_diskIndex]->activate(); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h new file mode 100644 index 0000000000..7969a7a03b --- /dev/null +++ b/engines/neverhood/diskplayerscene.h @@ -0,0 +1,110 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_DISKPLAYERSCENE_H +#define NEVERHOOD_DISKPLAYERSCENE_H + +#include "neverhood/neverhood.h" +#include "neverhood/resourceman.h" +#include "neverhood/scene.h" +#include "neverhood/smackerplayer.h" + +namespace Neverhood { + +class DiskplayerScene; + +class Class494 : public AnimatedSprite { +public: + Class494(NeverhoodEngine *vm); + void sub43BE20(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub43BE00(); +}; + +class DiskplayerPlayButton : public StaticSprite { +public: + DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene); + void press(); + void release(); +protected: + DiskplayerScene *_diskplayerScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + bool _isPlaying; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class DiskplayerSlot : public Entity { +public: + DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value); + void activate(); + void stop(); + void appear(); + void play(); + void setFlag2(bool value) { _flag2 = value; } +protected: + DiskplayerScene *_diskplayerScene; + SoundResource _soundResource; + Sprite *_inactiveSlot; + Sprite *_appearSlot; + Sprite *_activeSlot; + int _elementIndex; + int _initialCountdown; + int _countdown; + bool _flag2; + int _value; + bool _flag; + void update(); +}; + +class DiskplayerScene : public Scene { +public: + DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which); + bool getFlag3() const { return _flag3; } +protected: + SmackerPlayer *_smackerPlayer; + DiskplayerPlayButton *_playButton; + Class494 *_class494; + DiskplayerSlot *_diskSlots[20]; + DiskplayerSlot *_class650; + int _updateStatus; + byte _diskAvailable[20]; + bool _flag4; + int _which; + int _diskIndex; + int _appearCountdown; + int _tuneInCountdown; + bool _fullFlag; + bool _inputDisabled; + bool _flag3; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stop(); + void tuneIn(); + void playDisk(); + void playStatic(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_DISKPLAYERSCENE_H */ diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 95a6a5f48a..02ae2a7cac 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -25,7 +25,10 @@ #include "neverhood/graphics.h" #include "neverhood/module1000.h" #include "neverhood/module1200.h" +#include "neverhood/module1400.h" #include "neverhood/module1500.h" +#include "neverhood/module1700.h" +#include "neverhood/module1800.h" #include "neverhood/module2300.h" namespace Neverhood { @@ -110,8 +113,13 @@ void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule1500(0); // Logos and intro video //Real // createModule1000(-1); -// createModule2300(0); - createModule1200(0); +// createModule2300(2); + _vm->gameState().sceneNum = 6; + //createModule1200(-1); + //createModule1800(-1); + //createModule1700(-1); + //createModule1700(1); + createModule1400(-1); } void GameModule::createModule1000(int which) { @@ -149,6 +157,7 @@ void GameModule::updateModule1200() { delete _childObject; _childObject = NULL; if (_field20 == 1) { + error("// TODO createModule2600(0);"); // TODO createModule2600(0); // TODO _childObject->handleUpdate(); } else { @@ -158,6 +167,29 @@ void GameModule::updateModule1200() { } } +void GameModule::createModule1400(int which) { + setGlobalVar(0x91080831, 0x00AD0012); + _childObject = new Module1400(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1400); +} + +void GameModule::updateModule1400() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + error("WEIRD!"); + } else { + // TODO createModule1600(1); + // TODO _childObject->handleUpdate(); + } + } +} + void GameModule::createModule1500(int which) { _someFlag1 = false; setGlobalVar(0x91080831, 0x00F10114); @@ -178,6 +210,61 @@ void GameModule::updateModule1500() { } } +void GameModule::createModule1700(int which) { + setGlobalVar(0x91080831, 0x04212331); + _childObject = new Module1700(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1700); +} + +void GameModule::updateModule1700() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + debug("Module1700 done; _field20 = %d", _field20); + if (_field20 == 1) { + // TODO createModule2900(3); + // TODO _childObject->handleUpdate(); + } else { + // TODO createModule1600(2); + // TODO _childObject->handleUpdate(); + } + } +} + +void GameModule::createModule1800(int which) { + setGlobalVar(0x91080831, 0x04A14718); + _childObject = new Module1800(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1800); +} + +void GameModule::updateModule1800() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + // TODO GameState_clear(); + // TODO GameModule_handleKeyEscape(); + } else if (_field20 == 2) { + // TODO createModule2700(0); + // TODO _childObject->handleUpdate(); + } else if (_field20 == 3) { + // TODO createModule3000(3); + // TODO _childObject->handleUpdate(); + } else { + // TODO createModule2800(0); + // TODO _childObject->handleUpdate(); + } + } +} + void GameModule::createModule2300(int which) { setGlobalVar(0x91080831, 0x1A214010); _childObject = new Module2300(_vm, this, which); @@ -223,13 +310,11 @@ void GameModule::updateModule2300() { } void GameModule::createModule2400(int which) { - debug("createModule2400"); - _vm->_system->quit(); + error("createModule2400"); } void GameModule::createModule3000(int which) { - debug("createModule3000"); - _vm->_system->quit(); + error("createModule3000"); } } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index d95c31e47d..344a78ff60 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -53,8 +53,14 @@ protected: void updateModule1000(); void createModule1200(int which); void updateModule1200(); + void createModule1400(int which); + void updateModule1400(); void createModule1500(int which); void updateModule1500(); + void createModule1700(int which); + void updateModule1700(); + void createModule1800(int which); + void updateModule1800(); void createModule2200(int which); void createModule2300(int which); void updateModule2300(); diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index e46d4eaf86..204e38628d 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -43,7 +43,7 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h _clipRect.x2 = 640; _clipRect.y2 = 480; _surface = new Graphics::Surface(); - _surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8()); + _surface->create(_sysRect.width, _sysRect.height, Graphics::PixelFormat::createFormatCLUT8()); } BaseSurface::~BaseSurface() { @@ -51,7 +51,6 @@ BaseSurface::~BaseSurface() { } void BaseSurface::draw() { - debug(8, "BaseSurface::draw()"); if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { // TODO: _sysRect alternate drawing code (is that used?) _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent); @@ -223,9 +222,9 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi skip = READ_LE_UINT16(source); copy = READ_LE_UINT16(source + 2); source += 4; - if (!flipX) + if (!flipX) { memcpy(dest + skip, source, copy); - else { + } else { byte *flipDest = dest + width - skip - 1; for (int xc = 0; xc < copy; xc++) { *flipDest-- = source[xc]; @@ -247,8 +246,6 @@ void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int de // TODO: Flip Y - debug("unpackSpriteRleRepl(%d, %d)", oldColor, newColor); - int16 rows, chunks; int16 skip, copy; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 91de87d7f5..b24e3eb6b4 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -266,6 +266,172 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub421350() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x582EC138, 0, -1); + _counter = 0; + SetSpriteCallback(NULL); + SetUpdateHandler(&Klayman::update41D1C0); + SetMessageHandler(&Klayman::handleMessage41D360); + _counter3 = 0; + _counterMax = 8; + _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; +} + +void Klayman::update41D1C0() { + update(); + _counter++; + if (_counter >= _counterMax) { + _counter = 0; + if (_table) { + int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue); + for (int i = 0; i < _tableCount; i++) { + if (randomValue < _table[_tableCount].value) { + (this->*(_table[_tableCount].callback))(); + _counterMax = _vm->_rnd->getRandomNumber(128) + 24; + break; + } + randomValue -= _table[_tableCount].value; + } + } + } else { + _counter3++; + if (_counter3 >= _counter3Max) { + _counter3 = 0; + _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + sub4213F0(); + } + } +} + +void Klayman::sub4213F0() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x5C24C018, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Klayman::sub4213B0); +} + +void Klayman::sub4213B0() { + _status2 = 0; + _flagE5 = true; + setFileHash(0x5C24C018, 0, -1); + SetUpdateHandler(&Klayman::update41D1C0); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(NULL); +} + +void Klayman::sub420060() { + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + if (!sub41CEB0(AnimationCallback(&Klayman::sub420060))) { + _status2 = 1; + _flagE5 = false; + setFileHash(0x1449C169, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D4C0); + SetSpriteCallback(NULL); + } +} + +void Klayman::sub41FFF0() { + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + if (!sub41CEB0(AnimationCallback(&Klayman::sub41FFF0))) { + _status2 = 1; + _flagE5 = false; + setFileHash(0x0018C032, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D640); + SetSpriteCallback(NULL); + } +} + +uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC1380080) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x4806, 0, this); + _soundResource1.play(0xC8004340); + } + } else if (param.asInteger() == 0x02B20220) { + _soundResource1.play(0xC5408620); + } else if (param.asInteger() == 0x03020231) { + _soundResource1.play(0xD4C08010); + } else if (param.asInteger() == 0x67221A03) { + _soundResource1.play(0x44051000); + } else if (param.asInteger() == 0x925A0C1E) { + _soundResource1.play(0x40E5884D); + } + break; + } + return messageResult; +} + +void Klayman::sub4214D0() { + _status2 = 0; + _flagE5 = false; + setFileHash(0xD229823D, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub421510() { + _status2 = 0; + _flagE5 = false; + setFileHash(0x9A2801E0, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(NULL); +} + +void Klayman::sub421160() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub421160))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x004AA310, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EC70); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } +} + +void Klayman::sub4212C0() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub4212C0))) { + _status2 = 0; + _flagE5 = false; + setFileHash(0x392A0330, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EAB0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + } +} + +uint32 Klayman::handleMessage41EAB0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x001A2832) { + _soundResource1.play(0xC0E4884C); + } + break; + } + return messageResult; +} + +void Klayman::sub421310() { + _status2 = 0; + _flagE5 = false; + setFileHash(0x913AB120, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteCallback(&Klayman::spriteUpdate41F230); +} + ///////////////////////////////////////////////////////////////// void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) { @@ -460,7 +626,6 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); - debug("xdiff = %d", xdiff); if (x == _x) { _x4 = x; if (!_flagE1 && !_flagE2 && !_flagE3) { @@ -623,7 +788,7 @@ void Klayman::sub41FB40() { _status2 = 1; _flagE2 = true; _flagE5 = true; - setDoDeltaX(_x4 < _x); + setDoDeltaX(_x4 < _x ? 1 : 0); setFileHash(0x5C48C506, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DD80); @@ -688,10 +853,7 @@ void Klayman::sub41F950() { _status2 = 0; _flagE1 = true; _flagE5 = true; - - debug("222222222222222222222 x = %d; x4 = %d", _x, _x4); - - setDoDeltaX(_x4 < _x); + setDoDeltaX(_x4 < _x ? 1 : 0); setFileHash(0x242C0198, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EC70); @@ -823,9 +985,6 @@ void Klayman::spriteUpdate41F320() { sendMessage(0x1019, 0, this); } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); - - debug("xxxxxxxxxxxxxxxxxxxxxxxxx xdelta = %d", xdelta); - _x += xdelta; if (_field114) { error("_field114"); @@ -876,7 +1035,7 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FF80() { - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x); + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); if (!sub41CEB0(AnimationCallback(&Klayman::sub41FF80))) { _status2 = 1; _flagE5 = false; @@ -985,28 +1144,22 @@ void Klayman::sub41CD00(int16 x) { void Klayman::sub41CC40(int16 x1, int16 x2) { if (_x > x1) { if (_x == x1 + x2) { - debug("sub41CC40 #1"); _x4 = x1 + x2; setCallback2(NULL); sub41C7B0(); } else if (_x < x1 + x2) { - debug("sub41CC40 #2"); sub41CAC0(x1 + x2); } else { - debug("sub41CC40 #3"); sub41C930(x1 + x2, false); } } else { if (_x == x1 - x2) { - debug("sub41CC40 #4"); _x4 = x1 - x2; setCallback2(NULL); sub41C7B0(); } else if (_x > x1 - x2) { - debug("sub41CC40 #5"); sub41CAC0(x1 - x2); } else { - debug("sub41CC40 #6"); sub41C930(x1 - x2, false); } } @@ -1044,7 +1197,7 @@ void Klayman::sub41FBC0() { _status2 = 2; _flagE3 = true; _flagE5 = true; - setDoDeltaX(_x4 >= _x); + setDoDeltaX(_x4 >= _x ? 1 : 0); setFileHash(0x08B28116, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DF10); @@ -1641,6 +1794,68 @@ void Klayman::spriteUpdate41F5A0() { AnimatedSprite::updateDeltaXY(); } +void Klayman::sub420600() { + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + _flagE4 = false; + _flagE5 = true; + setFileHash2(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D970); +} + +void Klayman::sub420660() { + _attachedSprite->sendMessage(0x4807, 0, this); +} + +uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + if (_attachedSprite) + _attachedSprite->sendMessage(0x480B, _doDeltaX ? 1 : 0, this); + } else if (param.asInteger() == 0x02421405) { + if (_flagE4 && _attachedSprite->hasMessageHandler() && _attachedSprite->sendMessage(0x480C, _doDeltaX ? 1 : 0, this) != 0) { + sub4205C0(); + } else { + setCallback1(AnimationCallback(&Klayman::sub420660)); + SetMessageHandler(&Klayman::handleMessage41D480); + } + } else if (param.asInteger() == 0x32180101) { + _soundResource1.play(0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + _soundResource1.play(0x0460E2FA); + } + break; + case 0x480A: + _flagE4 = true; + return 0; + } + return handleMessage41D480(messageNum, param, sender); +} + +void Klayman::sub4205C0() { + _flagE4 = false; + _flagE5 = true; + setFileHash2(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D970); +} + +void Klayman::sub420550() { + setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + if (!sub41CEB0(AnimationCallback(&Klayman::sub420550))) { + _status2 = 2; + _flagE4 = false; + _flagE5 = true; + setFileHash(0x0C1CA072, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D970); + } +} + //############################################################################## // KmScene1001 @@ -1705,7 +1920,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger()); + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); sub41C7B0(); break; case 0x4836: @@ -2401,7 +2616,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4817: - setDoDeltaX(param.asInteger() != 0 ? 1 : 0); + setDoDeltaX(param.asInteger()); sub41C7B0(); break; case 0x481B: @@ -2563,4 +2778,271 @@ void KmScene1201::sub40E040() { } } +// KmScene1401 + +KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480A: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420600)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420550)); + } + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + } else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x482E: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub421030)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420FE0)); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4210C0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub421070)); + } + break; + } + return 0; +} + +// KmScene1402 + +KmScene1402::KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + SetFilterY(&Sprite::defFilterY); +} + +uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480A: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420600)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420550)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + } + return 0; +} + +// KmScene1705 + +KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) { + + // Empty +} + +uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _flag = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + if (_flag) { + setCallback2(AnimationCallback(&Klayman::sub421350)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + } + break; + case 0x4803: + setCallback2(AnimationCallback(&KmScene1705::sub468A80)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_flag) { + setCallback2(AnimationCallback(&Klayman::sub4214D0)); + } + break; + case 0x481E: + if (_flag) { + setCallback2(AnimationCallback(&Klayman::sub421510)); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x4835: + _parentScene->sendMessage(0x2000, 1, this); + _flag = true; + setCallback2(AnimationCallback(&Klayman::sub4212C0)); + break; + case 0x4836: + _parentScene->sendMessage(0x2000, 0, this); + _flag = false; + setCallback2(AnimationCallback(&Klayman::sub421310)); + break; + case 0x483D: + sub468AD0(); + break; + case 0x483E: + sub468B10(); + break; + } + return messageResult; +} + +uint32 KmScene1705::handleMessage4689A0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + _soundResource1.play(0x85B10BB8); + } else if (param.asInteger() == 0x4E6A0CA0) { + _soundResource1.play(0xC5B709B0); + } + break; + } + return messageResult; +} + +void KmScene1705::spriteUpdate468A30() { + updateDeltaXY(); + HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); + if (hitRect->type == 0x5001) { + _y = hitRect->rect.y1; + processDelta(); + sendMessage(0x1019, 0, this); + } +} + +void KmScene1705::sub468A80() { + _status2 = 2; + _flagE5 = false; + setFileHash2(0xB93AB151, 0x40A100F8, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&KmScene1705::spriteUpdate468A30); + SetMessageHandler(&Klayman::handleMessage41D360); + SetAnimationCallback3(&Klayman::sub420420); +} + +void KmScene1705::sub468AD0() { + _status2 = 0; + _flagE5 = false; + setFileHash(0x5E0A4905, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1705::handleMessage4689A0); +} + +void KmScene1705::sub468B10() { + _status2 = 0; + _flagE5 = false; + setFileHash(0xD86E4477, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1705::handleMessage4689A0); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3682d75e69..5cb11abd10 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -85,6 +85,20 @@ public: void sub4207A0(); void sub4207F0(); void sub420F20(); + void sub421350(); + void sub4213F0(); + void sub4213B0(); + void sub420060(); + void sub41FFF0(); + void sub4214D0(); + void sub421510(); + void sub421160(); + void sub4212C0(); + void sub421310(); + void sub420600(); + void sub420660(); + void sub4205C0(); + void sub420550(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -95,6 +109,11 @@ public: uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); + void setKlaymanTable(const KlaymanTableItem *table, int tableCount); + void setKlaymanTable1(); + void setKlaymanTable2(); + void setKlaymanTable3(); + protected: Entity *_parentScene; Entity *_attachedSprite; @@ -129,11 +148,6 @@ protected: virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void setKlaymanTable(const KlaymanTableItem *table, int tableCount); - void setKlaymanTable1(); - void setKlaymanTable2(); - void setKlaymanTable3(); - void sub41FD40(); void sub41FD90(); uint32 handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender); @@ -210,6 +224,11 @@ protected: uint32 handleMessage41E490(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E2F0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41D640(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41EAB0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41D970(int messageNum, const MessageParam ¶m, Entity *sender); + + void update41D1C0(); }; @@ -287,6 +306,33 @@ protected: void sub40E040(); }; +class KmScene1401 : public Klayman { +public: + KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1402 : public Klayman { +public: + KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1705 : public Klayman { +public: + KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage4689A0(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate468A30(); + void sub468A80(); + void sub468AD0(); + void sub468B10(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 17424765e0..0b3b10c2f8 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -5,6 +5,7 @@ MODULE_OBJS = \ blbarchive.o \ collisionman.o \ detection.o \ + diskplayerscene.o \ gamemodule.o \ gamevars.o \ graphics.o \ @@ -12,7 +13,10 @@ MODULE_OBJS = \ module.o \ module1000.o \ module1200.o \ + module1400.o \ module1500.o \ + module1700.o \ + module1800.o \ module2300.o \ mouse.o \ navigationscene.o \ diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index eef543385c..7a09b5f060 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -76,8 +76,8 @@ void Module1200::createScene1201(int which) { void Module1200::createScene1202(int which) { _vm->gameState().sceneNum = 1; - //_childObject = new Scene1202(_vm, this, which); - //SetUpdateHandler(&Module1200::updateScene1202); + _childObject = new Scene1202(_vm, this, which); + SetUpdateHandler(&Module1200::updateScene1202); } void Module1200::createScene1203(int which) { @@ -161,7 +161,7 @@ static const NPoint kScene1201PointArray[] = { {493, 174} }; -static const uint32 kScene1201SsScene1201TntFileHashList1[] = { +static const uint32 kScene1201TntFileHashList1[] = { 0x2098212D, 0x1600437E, 0x1600437E, @@ -182,7 +182,7 @@ static const uint32 kScene1201SsScene1201TntFileHashList1[] = { 0xDA460476 }; -static const uint32 kScene1201SsScene1201TntFileHashList2[] = { +static const uint32 kScene1201TntFileHashList2[] = { 0x3040C676, 0x10914448, 0x10914448, @@ -209,7 +209,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi int16 x = kScene1201PointArray[pointIndex].x; int16 y = kScene1201PointArray[pointIndex].y; if (x < 300) { - _spriteResource.load2(kScene1201SsScene1201TntFileHashList1[elemIndex]); + _spriteResource.load2(kScene1201TntFileHashList1[elemIndex]); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _drawRect.x = 0; @@ -217,7 +217,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; } else { - _spriteResource.load2(kScene1201SsScene1201TntFileHashList2[elemIndex]); + _spriteResource.load2(kScene1201TntFileHashList2[elemIndex]); _x = x; _y = y; _drawRect.x = -(_spriteResource.getDimensions().width / 2); @@ -307,14 +307,14 @@ void Class466::sub40D380() { _newHashListIndex = -2; } -Class468::Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag) +AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag) : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) { - createSurface1(100, 0xD088AC30); + createSurface1(0xD088AC30, 100); _x = 320; _y = 240; - SetUpdateHandler(&Class468::update); - SetMessageHandler(&Class468::handleMessage); + SetUpdateHandler(&AsScene1201RightDoor::update); + SetMessageHandler(&AsScene1201RightDoor::handleMessage); _newHashListIndex = -2; if (flag) { setFileHash(0xD088AC30, -1, -1); @@ -326,14 +326,14 @@ Class468::Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag) } } -void Class468::update() { +void AsScene1201RightDoor::update() { if (_countdown != 0 && (--_countdown == 0)) { sub40D830(); } AnimatedSprite::update(); } -uint32 Class468::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -346,22 +346,22 @@ uint32 Class468::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class468::sub40D7E0() { +void AsScene1201RightDoor::sub40D7E0() { setFileHash(0xD088AC30, 0, -1); _newHashListIndex = -2; _surface->setVisible(true); _soundResource.play(calcHash("fxDoorOpen20")); } -void Class468::sub40D830() { +void AsScene1201RightDoor::sub40D830() { setFileHash(0xD088AC30, -1, -1); _playBackwards = true; _surface->setVisible(true); _soundResource.play(calcHash("fxDoorClose20")); - SetAnimationCallback3(&Class468::sub40D880); + SetAnimationCallback3(&AsScene1201RightDoor::sub40D880); } -void Class468::sub40D880() { +void AsScene1201RightDoor::sub40D880() { setFileHash1(); _surface->setVisible(false); } @@ -394,14 +394,14 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -Class463::Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag) +AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag) : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _class466(class466), _flag(false) { - - //TODO_field_F0 = -1; + + flag = false; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class463::handleMessage); + SetMessageHandler(&AsScene1201TntMan::handleMessage); createSurface(990, 106, 181); _x = 201; if (flag) { @@ -413,11 +413,11 @@ Class463::Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bo } } -Class463::~Class463() { +AsScene1201TntMan::~AsScene1201TntMan() { // TODO Sound1ChList_sub_407AF0(0x01D00560); } -uint32 Class463::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -441,8 +441,8 @@ uint32 Class463::handleMessage(int messageNum, const MessageParam ¶m, Entity } -uint32 Class463::handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Class463::handleMessage(messageNum, param, sender); +uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: removeCallbacks(); @@ -451,37 +451,37 @@ uint32 Class463::handleMessage40CCD0(int messageNum, const MessageParam ¶m, return messageResult; } -void Class463::spriteUpdate40CD10() { +void AsScene1201TntMan::spriteUpdate40CD10() { _x = _sprite->getX() + 100; } -void Class463::sub40CD30() { +void AsScene1201TntMan::sub40CD30() { setFileHash(0x654913D0, 0, -1); - SetMessageHandler(&Class463::handleMessage); + SetMessageHandler(&AsScene1201TntMan::handleMessage); SetSpriteCallback(NULL); } -void Class463::sub40CD60() { +void AsScene1201TntMan::sub40CD60() { setFileHash(0x356803D0, 0, -1); - SetMessageHandler(&Class463::handleMessage40CCD0); + SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - SetAnimationCallback3(&Class463::sub40CD30); + SetAnimationCallback3(&AsScene1201TntMan::sub40CD30); } -void Class463::sub40CD90() { +void AsScene1201TntMan::sub40CD90() { // TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true); // TODO Sound1ChList_playLooping(0x4B044624); _flag = true; setFileHash(0x85084190, 0, -1); - SetMessageHandler(&Class463::handleMessage); - SetSpriteCallback(&Class463::spriteUpdate40CD10); + SetMessageHandler(&AsScene1201TntMan::handleMessage); + SetSpriteCallback(&AsScene1201TntMan::spriteUpdate40CD10); _newHashListIndex = -2; } -Class465::Class465(NeverhoodEngine *vm, Sprite *class463) - : AnimatedSprite(vm, 1200), _class463(class463) { +Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) + : AnimatedSprite(vm, 1200), _asTntMan(asTntMan) { - createSurface1(995, 0x828C0411); + createSurface1(0x828C0411, 995); SetUpdateHandler(&Class465::update); SetMessageHandler(&Sprite::handleMessage); SetSpriteCallback(&Class465::spriteUpdate40D150); @@ -504,8 +504,251 @@ void Class465::update() { } void Class465::spriteUpdate40D150() { - _x = _class463->getX() - 18; - _y = _class463->getY() - 158; + _x = _asTntMan->getX() - 18; + _y = _asTntMan->getY() - 158; +} + +AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + + createSurface(1100, 57, 60); + SetUpdateHandler(&AsScene1201Match::update); + SetMessageHandler(&AsScene1201Match::handleMessage40C2D0); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + + switch (getGlobalVar(0x0112090A)) { + case 0: + _x = 521; + _y = 112; + _status = 0; + sub40C4C0(); + break; + case 1: + _x = 521; + _y = 112; + _status = 2; + sub40C470(); + _soundResource.load(0xD00230CD); + break; + case 2: + setDoDeltaX(1); + _x = 403; + _y = 337; + _status = 0; + sub40C4F0(); + break; + } +} + +void AsScene1201Match::update() { + if (_countdown != 0 && (--_countdown == 0)) { + removeCallbacks(); + } + updateAnim(); + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x86668011) { + _soundResource.play(); + } + break; + } + return messageResult; +} + +uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage40C2D0(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage40C2D0(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x2001, 0, this); + messageResult = 1; + break; + case 0x4806: + _surface->setVisible(false); + setGlobalVar(0x0112090A, 3); + break; + } + return messageResult; +} + +void AsScene1201Match::sub40C3E0() { + setFileHash(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::handleMessage40C320); + if (_status == 0) { + SetAnimationCallback3(&AsScene1201Match::sub40C420); + } else { + SetAnimationCallback3(&AsScene1201Match::sub40C470); + } +} + +void AsScene1201Match::sub40C420() { + setGlobalVar(0x0112090A, 2); + _x -= 199; + _y += 119; + setFileHash(0x018D0240, 0, -1); + SetMessageHandler(&AsScene1201Match::handleMessage40C320); + SetAnimationCallback3(&AsScene1201Match::sub40C4F0); +} + +void AsScene1201Match::sub40C470() { + setFileHash(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::handleMessage40C2D0); + _newHashListIndex = 0; + if (_status != 0) { + _countdown = 36; + _status--; + SetAnimationCallback3(&AsScene1201Match::sub40C3E0); + } +} + +void AsScene1201Match::sub40C4C0() { + setFileHash(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::handleMessage40C360); + _newHashListIndex = 0; +} + +void AsScene1201Match::sub40C4F0() { + setDoDeltaX(1); + _x = 403; + _y = 337; + setFileHash(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::handleMessage40C360); + _newHashListIndex = 0; +} + +AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman) + : AnimatedSprite(vm, 900), _soundResource(vm), _parentScene(parentScene), _klayman(klayman), + _flag(false) { + + createSurface(1100, 203, 199); + SetUpdateHandler(&AsScene1201Creature::update); + SetMessageHandler(&AsScene1201Creature::handleMessage40C710); + _x = 540; + _y = 320; + sub40C8E0(); + _countdown3 = 2; +} + +void AsScene1201Creature::update() { + bool oldFlag = _flag; + _flag = _x >= 385; + if (_flag != oldFlag) + sub40C8E0(); + if (_countdown1 != 0 && (--_countdown1 == 0)) { + removeCallbacks(); + } + updateAnim(); + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02060018) { + _soundResource.play(0xCD298116); + } + break; + case 0x2004: + setCallback2(AnimationCallback(&AsScene1201Creature::sub40C960)); + break; + case 0x2006: + setCallback2(AnimationCallback(&AsScene1201Creature::sub40C9B0)); + break; + } + return messageResult; +} + +uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage40C710(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02421405) { + if (_countdown2 != 0 && (--_countdown2 == 0)) { + sub40C990(); + } + } + break; + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02060018) { + _soundResource.play(0xCD298116); + _parentScene->sendMessage(0x4814, 0, this); + _klayman->sendMessage(0x4814, 0, this); + } + break; + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void AsScene1201Creature::sub40C8E0() { + _countdown3--; + if (_countdown3 == 0) + _countdown3 = 3; + setFileHash(0x08081513, 0, -1); + SetMessageHandler(&AsScene1201Creature::handleMessage40C710); + SetAnimationCallback3(&AsScene1201Creature::sub40C930); + _countdown1 = 36; +} + +void AsScene1201Creature::sub40C930() { + if (!_flag) { + setFileHash(0xCA287133, 0, -1); + SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0); + SetAnimationCallback3(&AsScene1201Creature::sub40C8E0); + } +} + +void AsScene1201Creature::sub40C960() { + setFileHash(0x08081513, 0, -1); + SetMessageHandler(&AsScene1201Creature::handleMessage40C710); + SetAnimationCallback3(&AsScene1201Creature::sub40C9E0); + _countdown1 = 48; +} + +void AsScene1201Creature::sub40C990() { + setFileHash2(0x0B6E13FB, 0x01084280, 0); +} + +void AsScene1201Creature::sub40C9B0() { + setFileHash(0xCA287133, 0, -1); + SetMessageHandler(&AsScene1201Creature::handleMessage40C830); + SetAnimationCallback3(&AsScene1201Creature::sub40C8E0); + _countdown1 = 0; +} + +void AsScene1201Creature::sub40C9E0() { + setFileHash(0x5A201453, 0, -1); + SetMessageHandler(&AsScene1201Creature::handleMessage40C710); + _countdown1 = 0; } AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) @@ -543,7 +786,8 @@ void AsScene1201LeftDoor::sub40D590() { } Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag(false) { + : Scene(vm, parentModule, true), _flag(false), _asMatch(NULL), _asTntMan(NULL), + _asCreature(NULL), _class466(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { int16 topY1, topY2, topY3, topY4; int16 x1, x2; @@ -589,12 +833,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = addSprite(new StaticSprite(_vm, 0x04063110, 500)); topY4 = tempSprite->getY() + 1; - _class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1 ? 1 : 0)); + _class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1)); _class466->getSurface()->getClipRect().x1 = 0; _class466->getSurface()->getClipRect().y1 = topY4; _class466->getSurface()->getClipRect().x2 = 640; _class466->getSurface()->getClipRect().y2 = 480; - + addSprite(new StaticSprite(_vm, 0x400B04B0, 1200)); tempSprite = addSprite(new StaticSprite(_vm, 0x40295462, 1200)); @@ -644,31 +888,31 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0)); _palette = new Palette(_vm, 0x4019A2C4); _palette->usePalette(); - _class468 = NULL; + _asRightDoor = NULL; } else { _background = addBackground(new DirtyBackground(_vm, 0x40206EC5, 0, 0)); _palette = new Palette(_vm, 0x40206EC5); _palette->usePalette(); - _class468 = addSprite(new Class468(_vm, _klayman, which - 2 != 1)); // CHECKME??? + _asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2)); } if (getGlobalVar(0x000CF819)) { addSprite(new StaticSprite(_vm, 0x10002ED8, 500)); if (!getGlobalVar(0x0A18CA33)) { - Class463 *class463; - class463 = new Class463(_vm, this, _class466, which - 1 != 1); - class463->getSurface()->getClipRect().x1 = x1; - class463->getSurface()->getClipRect().y1 = 0; - class463->getSurface()->getClipRect().x2 = x2; - class463->getSurface()->getClipRect().y2 = 480; - _vm->_collisionMan->addSprite(_class463); - _class463 = addSprite(class463); - tempSprite = addSprite(new Class465(_vm, _class463)); + AsScene1201TntMan *asTntMan; + asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1); + asTntMan->getSurface()->getClipRect().x1 = x1; + asTntMan->getSurface()->getClipRect().y1 = 0; + asTntMan->getSurface()->getClipRect().x2 = x2; + asTntMan->getSurface()->getClipRect().y2 = 480; + _vm->_collisionMan->addSprite(asTntMan); + _asTntMan = addSprite(asTntMan); + tempSprite = addSprite(new Class465(_vm, _asTntMan)); tempSprite->getSurface()->getClipRect().x1 = x1; tempSprite->getSurface()->getClipRect().y1 = 0; tempSprite->getSurface()->getClipRect().x2 = x2; tempSprite->getSurface()->getClipRect().y2 = 480; - class463->setRepl(64, 0); + asTntMan->setRepl(64, 0); } uint32 tntIndex = 1; @@ -741,22 +985,20 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(0x0112090A, 1); } - _class461 = NULL; + _asMatch = NULL; -#if 0 if (getGlobalVar(0x0112090A) < 3) { - _class461 = addSprite(new Class461(_vm, this)); - _vm->_collisionMan->addSprite(_class461); + _asMatch = addSprite(new AsScene1201Match(_vm, this)); + _vm->_collisionMan->addSprite(_asMatch); } if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { - _class462 = addSprite(new Class462(_vm, this, _klayman)); - _class462->getSurface()->getClipRect().x1 = x1; - _class462->getSurface()->getClipRect().y1 = 0; - _class462->getSurface()->getClipRect().x2 = x2; - _class462->getSurface()->getClipRect().y2 = 480; + _asCreature = addSprite(new AsScene1201Creature(_vm, this, _klayman)); + _asCreature->getSurface()->getClipRect().x1 = x1; + _asCreature->getSurface()->getClipRect().y1 = 0; + _asCreature->getSurface()->getClipRect().x2 = x2; + _asCreature->getSurface()->getClipRect().y2 = 480; } -#endif } @@ -765,8 +1007,8 @@ Scene1201::~Scene1201() { void Scene1201::update() { Scene::update(); - if (_class461 && getGlobalVar(0x0112090A)) { - deleteSprite(&_class461); + if (_asMatch && getGlobalVar(0x0112090A)) { + deleteSprite(&_asMatch); } } @@ -777,12 +1019,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x07053000) { _flag = true; - _class462->sendMessage(0x2004, 0, this); + _asCreature->sendMessage(0x2004, 0, this); } else if (param.asInteger() == 0x140E5744) { - _class462->sendMessage(0x2005, 0, this); + _asCreature->sendMessage(0x2005, 0, this); } else if (param.asInteger() == 0x40253C40) { _messageListFlag = false; - _class462->sendMessage(0x2006, 0, this); + _asCreature->sendMessage(0x2006, 0, this); } else if (param.asInteger() == 0x090EB048) { if (_klayman->getX() < 572) { setMessageList2(0x004AEC90); @@ -795,17 +1037,17 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit if (!getGlobalVar(0x0112090A)) { setMessageList2(0x004AECB0); } else { - _klayman->sendEntityMessage(0x1014, _class461, this); + _klayman->sendEntityMessage(0x1014, _asMatch, this); setMessageList2(0x004AECC0); } break; case 0x2002: if (getGlobalVar(0x20A0C516)) { - _klayman->sendEntityMessage(0x1014, _class463, this); + _klayman->sendEntityMessage(0x1014, _asTntMan, this); setMessageList2(0x004AECF0); } else if (getGlobalVar(0x0112090A) == 3) { - _klayman->sendEntityMessage(0x1014, _class463, this); - if (_klayman->getX() > _class463->getX()) { + _klayman->sendEntityMessage(0x1014, _asTntMan, this); + if (_klayman->getX() > _asTntMan->getX()) { setMessageList(0x004AECD0); } else { setMessageList(0x004AECE0); @@ -822,10 +1064,253 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4829: - _class468->sendMessage(0x4829, 0, this); + _asRightDoor->sendMessage(0x4829, 0, this); + break; + } + return messageResult; +} + +// Scene1202 + +static const uint32 kScene1202Table[] = { + 1, 2, 0, 4, 5, 3, 7, 8, 6, 10, 11, 9, 13, 14, 12, 16, 17, 15 +}; + +static const NPoint kScene1202Points[] = { + {203, 140}, + {316, 212}, + {277, 264}, + {176, 196}, + {275, 159}, + {366, 212}, + {230, 195}, + {412, 212}, + {368, 263}, + {204, 192}, + {365, 164}, + {316, 262}, + {191, 255}, + {280, 213}, + {406, 266}, + {214, 254}, + {316, 158}, + {402, 161} +}; + +static const uint32 kScene1202FileHashes[] = { + 0x1AC00B8, + 0x1AC14B8, + 0x1AC14B8, + 0x1AC30B8, + 0x1AC14B8, + 0x1AC14B8, + 0x1AC00B8, + 0x1AC14B8, + 0x1AC14B8, + 0x1AC90B8, + 0x1AC18B8, + 0x1AC18B8, + 0x1AC30B8, + 0x1AC14B8, + 0x1AC14B8, + 0x1AC50B8, + 0x1AC14B8, + 0x1AC14B8 +}; + +AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _index(index) { + + int positionIndex; + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0); + positionIndex = getSubVar(0x10055D14, _index); + createSurface(900, 37, 67); + _x = kScene1202Points[positionIndex].x; + _y = kScene1202Points[positionIndex].y; + sub4540A0(); +} + +uint32 AsScene1202TntItem::handleMessage453FE0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x2000, _index, this); + messageResult = 1; + break; + case 0x2001: + _index2 = (int)param.asInteger(); + sub4540D0(); break; } return messageResult; } +uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void AsScene1202TntItem::sub4540A0() { + setFileHash(kScene1202FileHashes[_index], 0, -1); + SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0); + _newHashListIndex = 0; +} + +void AsScene1202TntItem::sub4540D0() { + setFileHash(kScene1202FileHashes[_index], 0, -1); + SetMessageHandler(&AsScene1202TntItem::handleMessage454060); + SetAnimationCallback3(&AsScene1202TntItem::sub454100); +} + +void AsScene1202TntItem::sub454100() { + _x = kScene1202Points[_index2].x; + _y = kScene1202Points[_index2].y; + setFileHash(kScene1202FileHashes[_index], 6, -1); + SetMessageHandler(&AsScene1202TntItem::handleMessage454060); + SetAnimationCallback3(&AsScene1202TntItem::sub454160); + _playBackwards = true; +} + +void AsScene1202TntItem::sub454160() { + _parentScene->sendMessage(0x2002, _index, this); + sub4540A0(); +} + +Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _paletteResource(vm), _soundResource1(vm), + _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), + _flag(true), _soundFlag(false), _counter(0), _index(-1) { + + Palette2 *palette2; + + SetMessageHandler(&Scene1202::handleMessage453C10); + SetUpdateHandler(&Scene1202::update); + + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x60210ED5, 0, 0)); + + palette2 = new Palette2(_vm, 0x60210ED5); + palette2->usePalette(); + _palette = palette2; + addEntity(_palette); + + _paletteResource.load(0x60250EB5); + _paletteResource.copyPalette(_paletteData); + + _mouseCursor = addSprite(new Mouse435(_vm, 0x10ED160A, 20, 620)); + + for (int i = 0; i < 18; i++) { + _asTntItems[i] = addSprite(new AsScene1202TntItem(_vm, this, i)); + _vm->_collisionMan->addSprite(_asTntItems[i]); + } + + addSprite(new StaticSprite(_vm, 0x8E8419C1, 1100)); + + if (getGlobalVar(0x000CF819)) { + SetMessageHandler(&Scene1202::handleMessage453D90); + } + + _soundResource1.play(0x40106542); + _soundResource2.load(0x40005446); + _soundResource2.load(0x40005446); + _soundResource2.load(0x68E25540); + +} + +Scene1202::~Scene1202() { + if (isSolved()) { + setGlobalVar(0x000CF819, 1); + } +} + +void Scene1202::update() { + Scene::update(); + if (_soundFlag) { + if (!_soundResource4.isPlaying()) { + _parentModule->sendMessage(0x1009, 0, this); + } + } else if (_counter == 0 && isSolved()) { + SetMessageHandler(&Scene1202::handleMessage453D90); + setGlobalVar(0x000CF819, 1); + doPaletteEffect(); + _soundResource4.play(); + _soundFlag = true; + } else if (_index >= 0 && _counter == 0) { + int index2 = kScene1202Table[_index]; + _asTntItems[_index]->sendMessage(0x2001, getSubVar(0x10055D14, index2), this); + _asTntItems[index2]->sendMessage(0x2001, getSubVar(0x10055D14, _index), this); + int temp = getSubVar(0x10055D14, index2); + setSubVar(0x10055D14, index2, getSubVar(0x10055D14, _index)); + setSubVar(0x10055D14, _index, temp); + _counter = 2; + _index = -1; + if (_flag) { + _soundResource2.play(); + } else { + _soundResource3.play(); + } + _flag = !_flag; + } +} + +uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO: Debug/Cheat stuff + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x000D: + if (param.asInteger() == 0x14210006) { + // TODO: Debug/Cheat stuff + messageResult = 1; + } + break; + case 0x2000: + _index = (int)param.asInteger(); + break; + case 0x2002: + _counter--; + break; + } + return messageResult; +} + +uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + } + return 0; +} + +bool Scene1202::isSolved() { + return + getSubVar(0x10055D14, 0) == 0 && getSubVar(0x10055D14, 3) == 3 && + getSubVar(0x10055D14, 6) == 6 && getSubVar(0x10055D14, 9) == 9 && + getSubVar(0x10055D14, 12) == 12 && getSubVar(0x10055D14, 15) == 15; +} + +void Scene1202::doPaletteEffect() { +#if 0 // TODO + Palette2 *palette2 = (Palette2*)_palette; + palette2->startFadeToPalette(24); +#endif +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index 2a8a933b59..3ffed442d9 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -70,9 +70,9 @@ protected: void sub40D380(); }; -class Class468 : public AnimatedSprite { +class AsScene1201RightDoor : public AnimatedSprite { public: - Class468(NeverhoodEngine *vm, Sprite *klayman, bool flag); + AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag); protected: SoundResource _soundResource; Sprite *_klayman; @@ -91,10 +91,10 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class463 : public AnimatedSprite { +class AsScene1201TntMan : public AnimatedSprite { public: - Class463(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag); - virtual ~Class463(); + AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag); + virtual ~AsScene1201TntMan(); protected: Scene *_parentScene; Sprite *_class466; @@ -111,14 +111,56 @@ protected: class Class465 : public AnimatedSprite { public: - Class465(NeverhoodEngine *vm, Sprite *class463); + Class465(NeverhoodEngine *vm, Sprite *asTntMan); ~Class465(); protected: - Sprite *_class463; + Sprite *_asTntMan; void update(); void spriteUpdate40D150(); }; +class AsScene1201Match : public AnimatedSprite { +public: + AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource; + int _countdown; + int _status; + void update(); + uint32 handleMessage40C2D0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40C320(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40C360(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40C3E0(); + void sub40C420(); + void sub40C470(); + void sub40C4C0(); + void sub40C4F0(); +}; + +class AsScene1201Creature : public AnimatedSprite { +public: + AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman); +protected: + Scene *_parentScene; + Sprite *_klayman; + SoundResource _soundResource; + int _countdown1; + int _countdown2; + int _countdown3; + bool _flag; + void update(); + uint32 handleMessage40C710(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40C7B0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40C830(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40C8E0(); + void sub40C930(); + void sub40C960(); + void sub40C990(); + void sub40C9B0(); + void sub40C9E0(); +}; + class AsScene1201LeftDoor : public AnimatedSprite { public: AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman); @@ -144,18 +186,57 @@ public: protected: // TODO ResourceTable _resourceTable1; // TODO ResourceTable _resourceTable2; - Sprite *_class461; - Sprite *_class463; - Sprite *_class462; + Sprite *_asMatch; + Sprite *_asTntMan; + Sprite *_asCreature; Sprite *_class466; Sprite *_asLeftDoor; - Sprite *_class468; + Sprite *_asRightDoor; Sprite *_asTape; bool _flag; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// Scene1202 + +class AsScene1202TntItem : public AnimatedSprite { +public: + AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index); +protected: + Scene *_parentScene; + int _index, _index2; + uint32 handleMessage453FE0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage454060(int messageNum, const MessageParam ¶m, Entity *sender); + void sub4540A0(); + void sub4540D0(); + void sub454100(); + void sub454160(); +}; + +class Scene1202 : public Scene { +public: + Scene1202(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1202(); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + PaletteResource _paletteResource; + Sprite *_asTntItems[18]; + int _counter; + int _index; + byte _paletteData[1024]; + bool _soundFlag; + bool _flag; + void update(); + uint32 handleMessage453C10(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage453D90(int messageNum, const MessageParam ¶m, Entity *sender); + bool isSolved(); + void doPaletteEffect(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1200_H */ diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp new file mode 100644 index 0000000000..7d618f5319 --- /dev/null +++ b/engines/neverhood/module1400.cpp @@ -0,0 +1,1439 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1400.h" +#include "neverhood/module1000.h" +#include "neverhood/diskplayerscene.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module1400(%d)", which); + + // TODO Music18hList_add(0x00AD0012, 0x06333232); + // TODO Music18hList_add(0x00AD0012, 0x624A220E); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 1: + createScene1402(-1); + break; + case 2: + createScene1403(-1); + break; + case 3: + createScene1404(-1); + break; + case 4: + createScene1405(-1); + break; + case 5: + createScene1406(-1); + break; + case 6: + createScene1407(-1); + break; + default: + createScene1401(-1); + } + } else { + createScene1401(0); + } + +} + +Module1400::~Module1400() { + // TODO Music18hList_deleteGroup(0x00AD0012); +} + +void Module1400::createScene1401(int which) { + _vm->gameState().sceneNum = 0; + // TODO Music18hList_play(0x06333232, 0, 2, 1); + _childObject = new Scene1401(_vm, this, which); + SetUpdateHandler(&Module1400::updateScene1401); +} + +void Module1400::createScene1402(int which) { + _vm->gameState().sceneNum = 1; + // TODO Music18hList_stop(0x06333232, 0, 2); + // TODO Music18hList_stop(0x624A220E, 0, 2); + _childObject = new Scene1402(_vm, this, which); + SetUpdateHandler(&Module1400::updateScene1402); +} + +void Module1400::createScene1403(int which) { + _vm->gameState().sceneNum = 2; + // TODO Music18hList_stop(0x06333232, 0, 2); + // TODO Music18hList_play(0x624A220E, 0, 2, 1); + // TODO _childObject = new Scene1403(_vm, this, which); + SetUpdateHandler(&Module1400::updateScene1403); +} + +void Module1400::createScene1404(int which) { + _vm->gameState().sceneNum = 3; + // TODO Music18hList_play(0x06333232, 0, 2, 1); + // TODO _childObject = new Scene1404(_vm, this, which); + SetUpdateHandler(&Module1400::updateScene1404); +} + +void Module1400::createScene1405(int which) { + _vm->gameState().sceneNum = 4; + // TODO Music18hList_play(0x06333232, 0, 2, 1); + // TODO _childObject = new Scene1405(_vm, this, which); + SetUpdateHandler(&Module1400::updateScene1405); +} + +void Module1400::createScene1406(int which) { + _vm->gameState().sceneNum = 5; + // TODO Music18hList_stop(0x06333232, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 2); + SetUpdateHandler(&Module1400::updateScene1405); +} + +void Module1400::createScene1407(int which) { + _vm->gameState().sceneNum = 6; + // TODO Music18hList_stop(0x06333232, 0, 2); + _childObject = new Scene1407(_vm, this, which); + SetUpdateHandler(&Module1400::updateScene1407); +} + +void Module1400::updateScene1401() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene1402(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene1404(0); + _childObject->handleUpdate(); + } else { + _parentModule->sendMessage(0x1009, 0, this); + } + } +} + +void Module1400::updateScene1402() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + + debug("Scene1402: _field20 = %d", _field20); + + if (_field20 == 1) { + createScene1403(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene1407(-1); + _childObject->handleUpdate(); + } else { + createScene1401(1); + _childObject->handleUpdate(); + } + } +} + +void Module1400::updateScene1403() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1402(1); + _childObject->handleUpdate(); + } +} + +void Module1400::updateScene1404() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene1405(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene1406(-1); + _childObject->handleUpdate(); + } else { + createScene1401(2); + _childObject->handleUpdate(); + } + } +} + +void Module1400::updateScene1405() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1404(1); + _childObject->handleUpdate(); + } +} + +void Module1400::updateScene1406() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1404(2); + _childObject->handleUpdate(); + } +} + +void Module1400::updateScene1407() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1402(2); + _childObject->handleUpdate(); + } +} + +// Scene1401 + +Class525::Class525(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), + _countdown1(0), _countdown2(0) { + + // TODO createSurface3(900, dword_4B6768); + createSurface(900, 640, 480); //TODO: Remeove once the line above is done + _x = 454; + _y = 217; + SetUpdateHandler(&Class525::update4662A0); + SetMessageHandler(&Class525::handleMessage466320); + setFileHash(0x4C210500, 0, -1); +} + +Class525::~Class525() { + // TODO Sound1ChList_sub_407AF0(0x01104C08); +} + +void Class525::update4662A0() { + AnimatedSprite::update(); + if (_countdown1 != 0 && (--_countdown1 == 0)) { + sub466460(); + } + if (_countdown2 != 0 && (--_countdown2 == 0)) { + // TODO Sound1ChList_addSoundResource(0x01104C08, 0x4A116437, true); + // TODO Sound1ChList_playLooping(0x4A116437); + } +} + +void Class525::update466300() { + AnimatedSprite::update(); + if (_countdown1 != 0) { + _countdown1--; + } +} + +uint32 Class525::handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0A8A1490) { + _soundResource2.play(0x6AB6666F); + } + break; + case 0x2000: + _countdown1 = 70; + _countdown2 = 8; + sub466420(); + break; + case 0x483A: + sub4664B0(); + break; + } + return messageResult; +} + +uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + if (_countdown1 != 0) { + sub466420(); + } else { + sub466460(); + } + SetMessageHandler(&Class525::handleMessage466320); + SetUpdateHandler(&Class525::update4662A0); + break; + } + return messageResult; +} + +void Class525::sub466420() { + setFileHash(0x4C240100, 0, -1); + _soundResource1.play(0x4A30063F); +} + +void Class525::sub466460() { + // TODO Sound1ChList_deleteSoundByHash(0x4A116437); + _soundResource1.play(0x4A120435); + setFileHash(0x4C210500, 0, -1); +} + +void Class525::sub4664B0() { + setFileHash(0x6C210810, 0, -1); + SetMessageHandler(&Class525::handleMessage4663C0); + SetUpdateHandler(&Class525::update466300); +} + +Class526::Class526(NeverhoodEngine *vm, Sprite *class525) + : AnimatedSprite(vm, 1100), _soundResource(vm), _class525(class525) { + + // TODO createSurface3(100, dword_4B6778); + createSurface(100, 640, 480); //TODO: Remeove once the line above is done + _x = 478; + _y = 433; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class526::handleMessage); + setFileHash(0xA282C472, 0, -1); +} + +uint32 Class526::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x66382026) { + _soundResource.play(0x0CD84468); + } else if (param.asInteger() == 0x6E28061C) { + _soundResource.play(0x78C8402C); + } else if (param.asInteger() == 0x462F0410) { + _soundResource.play(0x60984E28); + } + break; + case 0x4839: + sub466770(); + break; + } + return messageResult; +} + +void Class526::spriteUpdate466720() { + AnimatedSprite::updateDeltaXY(); + if (_rect.y1 <= 150) { + _soundResource.play(0x0E32247F); + setFileHash1(); + SetSpriteCallback(NULL); + SetMessageHandler(NULL); + _surface->setVisible(false); + } +} + +void Class526::sub466770() { + setFileHash(0x34880040, 0, -1); + SetSpriteCallback(&Class526::spriteUpdate466720); +} + +Class527::Class527(NeverhoodEngine *vm, Sprite *class526) + : AnimatedSprite(vm, 1100), _soundResource(vm), _class526(class526) { + + // TODO createSurface3(200, dword_4B6768); + createSurface(200, 640, 480); //TODO: Remeove once the line above is done + _x = 427; + _y = 433; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class527::handleMessage); + setFileHash(0x461A1490, 0, -1); +} + +uint32 Class527::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4839: + sub466970(); + break; + } + return messageResult; +} + +void Class527::spriteUpdate466920() { + AnimatedSprite::updateDeltaXY(); + if (_rect.y1 <= 150) { + _soundResource.play(0x18020439); + setFileHash1(); + SetSpriteCallback(NULL); + SetMessageHandler(NULL); + _surface->setVisible(false); + } +} + +void Class527::sub466970() { + setFileHash(0x103B8020, 0, -1); + SetSpriteCallback(&Class527::spriteUpdate466920); +} + +Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) + : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) { + + _x = 320; + _y = 240; + createSurface1(100, 0x04551900); + SetUpdateHandler(&Class528::update); + SetMessageHandler(&Class528::handleMessage); + _newHashListIndex = -2; + if (flag) { + _flag = true; + setFileHash(0x04551900, -1,- 1); + _countdown = 48; + } else { + _flag = false; + setFileHash1(); + _surface->setVisible(false); + } +} + +void Class528::update() { + if (_countdown != 0 && (--_countdown == 0)) { + sub466C50(); + } + AnimatedSprite::update(); +} + + +uint32 Class528::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + if (_flag) + _countdown = 168; + messageResult = _flag ? 1 : 0; + break; + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + _countdown = 168; + if (_flag) + sub466BF0(); + break; + } + return messageResult; +} + +void Class528::sub466BF0() { + _flag = true; + _surface->setVisible(true); + setFileHash(0x04551900, 0, -1); + _newHashListIndex = -2; + _soundResource.play(calcHash("fxDoorOpen24")); +} + +void Class528::sub466C50() { + _flag = false; + _surface->setVisible(true); + setFileHash(0x04551900, -1, -1); + _soundResource.play(calcHash("fxDoorClose24")); + _playBackwards = true; + SetAnimationCallback3(&Class528::sub466CB0); +} + +void Class528::sub466CB0() { + setFileHash1(); + _surface->setVisible(false); +} + +static const Class489Item kClass489Items[] = { + {{154, 453}, 4, 2, 0, -1, 0, 1}, + {{104, 391}, 4, -1, -1, -1, 1, 1}, + {{ 22, 447}, 6, -1, -1, -1, 1, 1}, + {{112, 406}, 2, -1, -1, -1, 1, 0}, + {{262, 433}, 1, 1, 0, -1, 0, 0} +}; + +Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525), + _soundResource1(vm), _soundResource2(vm), _soundResource3(vm) { + + _class489Item = &kClass489Items[getGlobalVar(0x04A105B3)]; + // TODO createSurface3(990, dword_4B26D8); + createSurface(990, 640, 480); //TODO: Remeove once the line above is done + setFileHash(0x10E3042B, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class489::handleMessage); + _x = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; + _flag = true; + sub434C80(); + setDoDeltaX(1); + if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) { + sub434E90(); + } + _soundResource3.load(0xC8C2507C); +} + +Class489::~Class489() { + // TODO Sound1ChList_sub_407AF0(0x05331081); +} + +uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4807: + setGlobalVar(0x04A10F33, (_x - _class489Item->point.x) / 108); + if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) { + sub434E60(); + } else { + sub434DD0(); + } + break; + case 0x480B: + if (param.asInteger() != 1) { + if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) { + incGlobalVar(0x04A10F33, 1); + } + } else if (getGlobalVar(0x04A10F33) > 0) { + incGlobalVar(0x04A10F33, -1); + } + sub434DF0(); + break; + case 0x480C: + if (param.asInteger() != 1) { + messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0; + } else { + messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; + } + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + case 0x4828: + sub435040(); + break; + } + return messageResult; +} + +uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 && + param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) { + _parentScene->sendMessage(0x4826, 1, this); + } else { + _parentScene->sendMessage(0x4826, 0, this); + } + messageResult = 1; + break; + case 0x4807: + _parentScene->sendMessage(0x4807, 0, this); + sub434F80(); + break; + case 0x480B: + if (param.asInteger() != 1) { + if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) { + incGlobalVar(0x04A10F33, 1); + } + } else if (getGlobalVar(0x04A10F33) > 0) { + incGlobalVar(0x04A10F33, -1); + } + sub434FF0(); + break; + case 0x480C: + if (param.asInteger() != 1) { + messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0; + } else { + messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; + } + break; + case 0x480F: + sub434EC0(); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +uint32 Class489::handleMessage434B20(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class489::spriteUpdate434B60() { + if (_x <= _klayman->getX()) + _x = _klayman->getX() - 100; + else + _x = _klayman->getX() + 100; + sub434C80(); + if (_remX == _x) { + if (getGlobalVar(0x04A10F33) == 0 && _class489Item->flag4 != 0) { + _parentScene->sendMessage(0x1019, 0, this); + incGlobalVar(0x04A105B3, -1); + setGlobalVar(0x04A10F33, kClass489Items[getGlobalVar(0x04A105B3)].varIndex1); + } else if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex1 && _class489Item->flag != 0) { + _parentScene->sendMessage(0x1019, 1, this); + incGlobalVar(0x04A105B3, +1); + setGlobalVar(0x04A10F33, 0); + } + } + Sprite::processDelta(); +} + +void Class489::sub434C80() { + + bool soundFlag = false; + + _y = _class489Item->point.y; + + if (_class489Item->index1 != -1) { + int16 elX = _class489Item->index1 * 108 + _class489Item->point.x; + if (elX - 20 < _x && elX + 20 > _x) { + soundFlag = true; + _y = _class489Item->point.y + 10; + } + } + + if (_class489Item->flag2 != -1) { + int16 elX = _class489Item->index1 * 108 + _class489Item->point.x; + if (elX - 20 < _x && elX + 20 > _x) { + soundFlag = true; + _y = _class489Item->point.y + 10; + } + } + + if (_class489Item->varIndex2 != -1) { + int16 elX = _class489Item->varIndex2 * 108 + _class489Item->point.x; + if (elX - 20 < _x && elX + 20 > _x) { + soundFlag = true; + _y = _class489Item->point.y + 10; + } + } + + if (_flag) { + if (!soundFlag) { + _flag = false; + } + } else if (soundFlag) { + _soundResource2.play(0x5440E474); + _flag = true; + } + +} + +void Class489::sub434D80() { + AnimatedSprite::updateDeltaXY(); + if (_rect.y1 <= 150) { + _class525->sendMessage(0x483A, 0, this); + setFileHash1(); + SetMessageHandler(&Sprite::handleMessage); + SetSpriteCallback(NULL); + _surface->setVisible(false); + } +} + +void Class489::sub434DD0() { + SetSpriteCallback(NULL); + SetMessageHandler(&Class489::handleMessage); + setFileHash(0x10E3042B, 0, -1); +} + +void Class489::sub434DF0() { + _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; + setFileHash(0x14A10137, 0, -1); + SetSpriteCallback(&Class489::spriteUpdate434B60); + SetMessageHandler(&Class489::handleMessage); + _soundResource2.play(0xEC008474); +} + +void Class489::sub434E60() { + SetSpriteCallback(NULL); + SetMessageHandler(&Class489::handleMessage434B20); + setFileHash(0x80C32213, 0, -1); + SetAnimationCallback3(&Class489::sub434E90); +} + +void Class489::sub434E90() { + SetSpriteCallback(NULL); + SetMessageHandler(&Class489::handleMessage4348E0); + setFileHash(0xD23B207F, 0, -1); +} + +void Class489::sub434EC0() { + setFileHash(0x50A80517, 0, -1); + SetMessageHandler(&Class489::handleMessage434B20); + SetSpriteCallback(NULL); + SetAnimationCallback3(&Class489::sub434F40); + setGlobalVar(0x12A10DB3, 1); + _soundResource1.play(0xCC4A8456); + // TODO Sound1ChList_addSoundResource(0x05331081, 0xCE428854, true); + // TODO Sound1ChList_playLooping(0xCE428854); +} + +void Class489::sub434F40() { + _parentScene->sendMessage(0x480F, 0, this); + setFileHash(0xD833207F, 0, -1); + SetSpriteCallback(NULL); + SetMessageHandler(&Class489::handleMessage4348E0); +} + +void Class489::sub434F80() { + setFileHash(0x50A94417, 0, -1); + SetSpriteCallback(NULL); + SetMessageHandler(&Class489::handleMessage434B20); + SetAnimationCallback3(&Class489::sub434E90); + setGlobalVar(0x12A10DB3, 0); + _soundResource1.play(0xCC4A8456); + // TODO Sound1ChList_deleteSoundByHash(0xCE428854); +} + +void Class489::sub434FF0() { + _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; + setFileHash(0x22CB4A33, 0, -1); + SetSpriteCallback(&Class489::spriteUpdate434B60); + SetMessageHandler(&Class489::handleMessage434B20); + SetAnimationCallback3(&Class489::sub434DF0); +} + +void Class489::sub435040() { + setGlobalVar(0x04A105B3, 4); + setGlobalVar(0x04A10F33, 0); + SetSpriteCallback(&Class489::sub434D80); + SetMessageHandler(&Sprite::handleMessage); + setFileHash(0x708D4712, 0, -1); + _soundResource3.play(); +} + +Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _flag(false), _class427(NULL), _class489(NULL), + _class525(NULL), _class526(NULL), _class527(NULL), _class528(NULL), + _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { + + SetMessageHandler(&Scene1401::handleMessage); + SetUpdateHandler(&Scene1401::update); + setRectList(0x004B6758); + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x08221FA5, 0, 0)); + _palette = new Palette(_vm, 0x08221FA5); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x21FA108A, NULL)); + + // TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0)); + _class525 = addSprite(new Class525(_vm)); + + if (!getGlobalVar(0x01023818)) { + _class526 = addSprite(new Class526(_vm, _class525)); + _class527 = addSprite(new Class527(_vm, _class525)); + } + + _sprite3 = addSprite(new StaticSprite(_vm, 0xA82BA811, 1100)); + addSprite(new StaticSprite(_vm, 0x0A116C60, 1100)); + _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0)); + _sprite1 = addSprite(new StaticSprite(_vm, 0x38EA100C, 1005)); + _sprite2 = addSprite(new StaticSprite(_vm, 0x98D0223C, 1200)); + _sprite2->getSurface()->setVisible(false); + + if (which < 0) { + _klayman = new KmScene1401(_vm, this, 380, 447); + setMessageList(0x004B65C8); + _sprite1->getSurface()->setVisible(false); + } else if (which == 1) { + _klayman = new KmScene1401(_vm, this, 0, 447); + setMessageList(0x004B65D0); + _sprite1->getSurface()->setVisible(false); + } else if (which == 2) { + _klayman = new KmScene1401(_vm, this, 660, 447); + setMessageList(0x004B65D8); + _sprite1->getSurface()->setVisible(false); + } else { + _klayman = new KmScene1401(_vm, this, 290, 413); + setMessageList(0x004B65E8); + _sprite1->getSurface()->setVisible(false); + } + addSprite(_klayman); + + if (getGlobalVar(0x04A105B3) == 2) { + _class489 = addSprite(new Class489(_vm, this, _klayman, _class525)); + _vm->_collisionMan->addSprite(_class489); + if (getGlobalVar(0x04A10F33) == 6) { + _klayman->sendEntityMessage(0x1014, _class489, this); + _klayman->setX(_class489->getX() + 100); + _klayman->processDelta(); + setMessageList(0x004B6670); + } else if (getGlobalVar(0x04A10F33) == 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + _klayman->setX(_class489->getX() - 100); + _klayman->processDelta(); + setMessageList(0x004B6670); + } + _class489->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x; + _class489->getSurface()->getClipRect().y1 = _sprite2->getSurface()->getDrawRect().y; + _class489->getSurface()->getClipRect().x2 = 640; + _class489->getSurface()->getClipRect().y2 = 480; + } + + _klayman->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + + if (which == 0 && _class489 && _class489->hasMessageHandler()) { + _class489->sendMessage(0x482B, 0, this); + } + + _class528 = addSprite(new Class528(_vm, _klayman, which == 1)); + +} + +void Scene1401::update() { + Scene::update(); + if (_class489 && !_flag && _class489->getY() < 360) { + _sprite2->getSurface()->setVisible(true); + _flag = true; + } else { + _sprite2->getSurface()->setVisible(false); + } +} + +uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02144CB1) { + _klayman->sendEntityMessage(0x1014, _class427, this); + } else if (param.asInteger() == 0x402064D8) { + _klayman->sendEntityMessage(0x1014, _ssButton, this); + } else if (param.asInteger() == 0x01C66840) { + if (_class528->hasMessageHandler() && _class528->sendMessage(0x2001, 0, this) != 0) { + setMessageList(0x004B6690); + } else { + setMessageList(0x004B66B0); + } + } + break; + case 0x1019: + if (param.asInteger() != 0) { + _parentModule->sendMessage(0x1009, 2, this); + } else { + _parentModule->sendMessage(0x1009, 1, this); + } + break; + case 0x480B: + if (sender == _class427) { + _class525->sendMessage(0x2000, 0, this); + if (!getGlobalVar(0x01023818)) { + _class526->sendMessage(0x4839, 0, this); + _class527->sendMessage(0x4839, 0, this); + setGlobalVar(0x01023818, 1); + } + if (_class489 && _class489->getX() > 404 && _class489->getX() < 504) { + _class489 ->sendMessage(0x4839, 0, this); + } + } else if (sender == _ssButton) { + _ssButton->sendMessage(0x4808, 0, this); + } + break; + case 0x4826: + if (sender == _class489) { + if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setMessageList2(0x004B6658); + } else { + setMessageList2(0x004B65F0); + } + } + break; + case 0x482A: + _sprite1->getSurface()->setVisible(true); + if (_class489) { + _class489->sendMessage(0x482B, 0, this); + } + break; + case 0x482B: + _sprite1->getSurface()->setVisible(false); + if (_class489) { + _class489->sendMessage(0x482A, 0, this); + } + break; + } + return 0; +} + +// Scene1402 + +Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) + : StaticSprite(vm, fileHash, surfacePriority) { + + SetFilterY(&Sprite::defFilterY); + SetUpdateHandler(&StaticSprite::update); + +} + +Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource1(vm), + _soundResource2(vm) { + + // TODO createSurface3(900, dword_4B6768); + createSurface(900, 640, 480); //TODO: Remeove once the line above is done + + SetFilterY(&Sprite::defFilterY); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class482::handleMessage); + _x = 279; + _y = 270; + if (which == 2) { + setFileHash(0x20060259, 0, -1); + _soundResource1.play(0x419014AC); + _soundResource2.load(0x61901C29); + } else if (which == 1) { + setFileHash(0x210A0213, 0, -1); + _soundResource1.play(0x41809C6C); + } else { + setFileHash(0x20060259, 0, -1); + _soundResource2.load(0x61901C29); + _newHashListIndex = -2; + } +} + +uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + _soundResource2.play(); + setFileHash(0x20060259, -1, -1); + _playBackwards = true; + SetAnimationCallback3(&Class482::sub428530); + break; + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class482::sub428500() { + _parentScene->sendMessage(0x2000, 0, this); + setFileHash1(); + _surface->setVisible(false); +} + +void Class482::sub428530() { + _parentScene->sendMessage(0x2001, 0, this); + setFileHash1(); + _surface->setVisible(false); +} + +void Class482::sub428560() { + _parentScene->sendMessage(0x2003, 0, this); + setFileHash1(); +} + +Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _flag(false), _class482(NULL), _class489(NULL) { + + SetMessageHandler(&Scene1402::handleMessage); + + _background = addBackground(new Background(_vm, 0x231482F0, 0, 0)); + _background->getSurface()->getDrawRect().y = -10; + // TODO g_screen->field_26 = 0; + _palette = new Palette(_vm, 0x231482F0); + _palette->addPalette(0x91D3A391, 0, 64, 0); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x482F4239, NULL)); + + _class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100)); + _class454_2 = addSprite(new Class454(_vm, 0x10A02120, 1100)); + _class454_3 = addSprite(new Class454(_vm, 0x60882BE0, 1100)); + + if (getGlobalVar(0x70A1189C)) + setRectList(0x004B0C48); + else + setRectList(0x004B0C98); + + if (which < 0) { + _klayman = new KmScene1402(_vm, this, 377, 391); + setMessageList(0x004B0B48); + if (!getGlobalVar(0x70A1189C)) { + _class482 = addSprite(new Class482(_vm, this, 0)); + } + } else if (which == 1) { + _klayman = new KmScene1402(_vm, this, 42, 391); + setMessageList(0x004B0B50); + } else if (which == 2) { + _klayman = new KmScene1402(_vm, this, 377, 391); + setMessageList(0x004B0B60); + _klayman->setDoDeltaX(1); + if (getGlobalVar(0x70A1189C)) { + _class482 = addSprite(new Class482(_vm, this, 1)); + clearRectList(); + _mouseCursor->getSurface()->setVisible(false); + sub428220(); + } else { + _class482 = addSprite(new Class482(_vm, this, 0)); + } + } else { + _klayman = new KmScene1402(_vm, this, 513, 391); + setMessageList(0x004B0B58); + if (!getGlobalVar(0x70A1189C)) { + _class482 = addSprite(new Class482(_vm, this, 2)); + sub428220(); + } + } + addSprite(_klayman); + + if (_class482) { + _class482->getSurface()->getClipRect().x1 = 0; + _class482->getSurface()->getClipRect().y1 = 0; + _class482->getSurface()->getClipRect().x2 = 640; + _class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + } + + if (getGlobalVar(0x4A105B3) == 1) { + _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); + _vm->_collisionMan->addSprite(_class489); + if (getGlobalVar(0x4A10F33) == 4) { + _klayman->sendEntityMessage(0x1014, _class489, this); + _klayman->setX(_class489->getX() + 100); + _klayman->processDelta(); + setMessageList(0x004B0BD0); + } else if (getGlobalVar(0x4A10F33) == 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + _klayman->setX(_class489->getX() - 100); + _klayman->processDelta(); + setMessageList(0x004B0BD0); + } + _class489->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x; + _class489->getSurface()->getClipRect().y1 = 0; + _class489->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x; + _class489->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + } + + _klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + +} + +void Scene1402::update() { + if (_flag) { + _background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10) - 10; + // TODO g_screen->field_26 = -10 - _background->getSurface()->getDrawRect().y; + } else { + _background->getSurface()->getDrawRect().y = -10; + // TODO g_screen->field_26 = 0; + SetUpdateHandler(&Scene::update); + } + Scene::update(); + if (_class482) { + _class482->getSurface()->getClipRect().x1 = 0; + _class482->getSurface()->getClipRect().y1 = 0; + _class482->getSurface()->getClipRect().x2 = 640; + _class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + } + _klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; +} + +uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x00F43389) { + if (getGlobalVar(0x70A1189C)) { + _parentModule->sendMessage(0x1009, 0, this); + } else { + clearRectList(); + _klayman->getSurface()->setVisible(false); + _mouseCursor->getSurface()->setVisible(false); + _class482->sendMessage(0x2002, 0, this); + sub428220(); + } + } + break; + case 0x1019: + if (param.asInteger()) { + _parentModule->sendMessage(0x1009, 0, this); + } else { + _parentModule->sendMessage(0x1009, 1, this); + } + break; + case 0x2000: + sub428230(); + _mouseCursor->getSurface()->setVisible(true); + setRectList(0x004B0C48); + break; + case 0x2001: + sub428230(); + _parentModule->sendMessage(0x1009, 0, this); + break; + case 0x2003: + sub428230(); + break; + case 0x4826: + if (sender == _class489) { + if (_class489->sendMessage(0x408C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setMessageList2(0x004B0BB8); + } else { + setMessageList2(0x004B0B68); + } + } + } + return 0; +} + +void Scene1402::sub428220() { + _flag = true; + SetUpdateHandler(&Scene1402::update); +} + +void Scene1402::sub428230() { + _flag = false; +} + +// Scene1407 + +static const int16 kScene1407MouseFloorY[] = { + 106, 150, 191, 230, 267, 308, 350, 395 +}; + +static const struct { + int16 x; + int16 floorIndex; + int16 sectionIndex; + int16 nextHoleIndex; +} kScene1407MouseHoles[] = { + {125, 0, 0, 7}, + {452, 7, 21, 0}, + {337, 4, 11, 4}, + {286, 6, 17, 6}, + {348, 6, 17, 39}, + {536, 6, 18, 42}, + {111, 1, 3, 18}, + {203, 1, 3, 38}, + {270, 1, 3, 9}, + {197, 5, 14, 3}, + {252, 5, 14, 35}, + {297, 5, 14, 7}, + {359, 5, 14, 8}, + {422, 4, 12, 26}, + {467, 4, 12, 2}, + {539, 4, 12, 40}, + {111, 5, 13, 17}, + {211, 0, 1, 20}, + {258, 0, 1, 11}, + {322, 0, 1, 16}, + { 99, 6, 16, 31}, + {142, 6, 16, 27}, + {194, 6, 16, 12}, + {205, 2, 6, 45}, + {264, 2, 6, 10}, + { 98, 4, 10, 2}, + {152, 4, 10, 37}, + {199, 4, 10, 13}, + {258, 4, 10, 16}, + {100, 7, 19, 43}, + {168, 7, 19, 23}, + {123, 3, 8, 14}, + {181, 3, 8, 39}, + {230, 3, 8, 28}, + {292, 3, 8, 22}, + {358, 3, 8, 36}, + {505, 3, 9, 44}, + {400, 2, 7, 34}, + {454, 2, 7, 32}, + {532, 2, 7, 46}, + {484, 5, 15, 25}, + {529, 5, 15, 30}, + {251, 7, 20, 48}, + {303, 7, 20, 21}, + {360, 7, 20, 33}, + {503, 0, 2, 5}, + {459, 1, 4, 19}, + {530, 1, 4, 42}, + {111, 2, 5, 47}, + {442, 6, 18, 1} +}; + +static const struct { + int16 x1, x2; + int16 goodHoleIndex; +} kScene1407MouseSections[] = { + {100, 149, 0}, + {182, 351, 17}, + {430, 524, 45}, + { 89, 293, 7}, + {407, 555, 47}, + { 89, 132, 48}, + {178, 303, 23}, + {367, 551, 38}, + {105, 398, 31}, + {480, 537, 36}, + { 84, 275, 27}, + {318, 359, 2}, + {402, 560, 15}, + { 91, 132, 16}, + {179, 400, 10}, + {461, 552, 41}, + { 86, 218, 21}, + {267, 376, 4}, + {420, 560, 49}, + { 77, 188, 30}, + {237, 394, 44}, + {438, 515, 5} +}; + +AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) { + + // TODO createSurface3(100, dword_4B05B0); + createSurface(100, 640, 480); //TODO: Remeove once the line above is done + + SetUpdateHandler(&AnimatedSprite::update); + _x = 108; + _y = 106; + stIdleLookAtGoodHole(); +} + +void AsScene1407Mouse::suWalkTo() { + int16 xdelta = _walkDestX - _x; + if (xdelta > _deltaX) + xdelta = _deltaX; + else if (xdelta < -_deltaX) + xdelta = -_deltaX; + _deltaX = 0; + if (_walkDestX == _x) { + sendMessage(0x1019, 0, this); + } else { + _x += xdelta; + processDelta(); + } +} + +void AsScene1407Mouse::upGoThroughHole() { + if (_countdown != 0 && (--_countdown == 0)) { + SetUpdateHandler(&AnimatedSprite::update); + removeCallbacks(); + } + AnimatedSprite::update(); +} + +uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + { + int16 mouseX = param.asPoint().x; + int16 mouseY = param.asPoint().y; + int holeIndex; + for (holeIndex = 0; holeIndex < 50; holeIndex++) { + int16 holeX = kScene1407MouseHoles[holeIndex].x; + int16 holeY = kScene1407MouseFloorY[kScene1407MouseHoles[holeIndex].floorIndex]; + if (mouseX >= holeX - 14 && mouseX <= holeX + 14 && mouseY >= holeY - 36 && mouseY <= holeY) + break; + } + if (holeIndex < 50 && kScene1407MouseHoles[holeIndex].sectionIndex == _currSectionIndex) { + _nextHoleIndex = kScene1407MouseHoles[holeIndex].nextHoleIndex; + _walkDestX = kScene1407MouseHoles[holeIndex].x; + stWalkToHole(); + } else { + if (mouseX < kScene1407MouseSections[_currSectionIndex].x1) { + _walkDestX = kScene1407MouseSections[_currSectionIndex].x1; + } else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2) { + _walkDestX = kScene1407MouseSections[_currSectionIndex].x2; + } else { + _walkDestX = mouseX; + } + stWalkToDest(); + } + } + break; + case 0x1019: + removeCallbacks(); + break; + case 0x2001: + { + // Reset the position + // Find the nearest hole and go through it, and exit at the first hole + int16 distance = 640; + int matchIndex = 50; + for (int index = 0; index < 50; index++) { + if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex) { + if (ABS(kScene1407MouseHoles[index].x - _x) < distance) { + matchIndex = index; + distance = ABS(kScene1407MouseHoles[index].x - _x); + } + } + } + if (matchIndex < 50) { + _nextHoleIndex = 0; + _walkDestX = kScene1407MouseHoles[matchIndex].x; + stWalkToHole(); + } + } + break; + } + return messageResult; +} + +void AsScene1407Mouse::stIdleLookAtGoodHole() { + setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0); + setFileHash(0x72215194, 0, -1); + SetSpriteCallback(NULL); + SetMessageHandler(&AsScene1407Mouse::handleMessage); +} + +void AsScene1407Mouse::stWalkToDest() { + if (_walkDestX != _x) { + setDoDeltaX(_walkDestX < _x ? 1 : 0); + setFileHash(0x22291510, 0, -1); + SetSpriteCallback(&AsScene1407Mouse::suWalkTo); + SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetAnimationCallback3(&AsScene1407Mouse::stIdleLookAtGoodHole); + } +} + +void AsScene1407Mouse::stWalkToHole() { + setDoDeltaX(_walkDestX < _x ? 1 : 0); + setFileHash(0x22291510, 0, -1); + SetSpriteCallback(&AsScene1407Mouse::suWalkTo); + SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetAnimationCallback3(&AsScene1407Mouse::stGoThroughHole); +} + +void AsScene1407Mouse::stGoThroughHole() { + setFileHash(0x72215194, 0, -1); + SetSpriteCallback(NULL); + SetMessageHandler(NULL); + SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); + SetAnimationCallback3(&AsScene1407Mouse::stArriveAtHole); + _surface->setVisible(false); + _countdown = 12; +} + +void AsScene1407Mouse::stArriveAtHole() { + _currSectionIndex = kScene1407MouseHoles[_nextHoleIndex].sectionIndex; + _x = kScene1407MouseHoles[_nextHoleIndex].x; + _y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex]; + if (_nextHoleIndex == 1) { + _parentScene->sendMessage(0x2000, 0, this); + _walkDestX = 512; + stWalkToDest(); + _surface->setVisible(true); + } else { + _walkDestX = _x + 14; + stWalkToDest(); + _surface->setVisible(true); + } +} + +Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm), _puzzleSolvedCountdown(0), + _resetButtonCountdown(0) { + + _surfaceFlag = true; + + SetMessageHandler(&Scene1407::handleMessage); + SetUpdateHandler(&Scene1407::update); + + _background = addBackground(new DirtyBackground(_vm, 0x00442225, 0, 0)); + _palette = new Palette(_vm, 0x00442225); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620)); + + _asMouse = addSprite(new AsScene1407Mouse(_vm, this)); + _ssResetButton = addSprite(new StaticSprite(_vm, 0x12006600, 100)); + _ssResetButton->getSurface()->setVisible(false); + +} + +void Scene1407::update() { + Scene::update(); + if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) { + _parentModule->sendMessage(0x1009, 1, this); + } else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) { + _ssResetButton->getSurface()->setVisible(false); + } +} + +uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (_puzzleSolvedCountdown == 0) { + // TODO: Debug/Cheat stuff + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + // Exit scene + _parentModule->sendMessage(0x1009, 0, this); + } else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 && + param.asPoint().y >= 62 && param.asPoint().y <= 90) { + // The reset button was clicked + _asMouse->sendMessage(0x2001, 0, this); + _ssResetButton->getSurface()->setVisible(true); + _soundResource.play(0x44045000); + _resetButtonCountdown = 12; + } else { + // Handle the mouse + _asMouse->sendMessage(messageNum, param, this); + } + } + break; + case 0x000D: + // TODO: Debug/Cheat stuff + break; + case 0x2000: + // The mouse got the cheese (nomnom) + setGlobalVar(0x70A1189C, 1); + _soundResource.play(0x68E25540); + _mouseCursor->getSurface()->setVisible(false); + _puzzleSolvedCountdown = 72; + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h new file mode 100644 index 0000000000..433dc413f5 --- /dev/null +++ b/engines/neverhood/module1400.h @@ -0,0 +1,242 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1400_H +#define NEVERHOOD_MODULE1400_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class Module1400 : public Module { +public: + Module1400(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1400(); +protected: + void createScene1401(int which); + void createScene1402(int which); + void createScene1403(int which); + void createScene1404(int which); + void createScene1405(int which); + void createScene1406(int which); + void createScene1407(int which); + void updateScene1401(); + void updateScene1402(); + void updateScene1403(); + void updateScene1404(); + void updateScene1405(); + void updateScene1406(); + void updateScene1407(); +}; + +// Scene1401 + +class Class525 : public AnimatedSprite { +public: + Class525(NeverhoodEngine *vm); + virtual ~Class525(); +protected: + int _countdown1; + int _countdown2; + SoundResource _soundResource1; + SoundResource _soundResource2; + void update4662A0(); + void update466300(); + uint32 handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage4663C0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub466420(); + void sub466460(); + void sub4664B0(); +}; + +class Class526 : public AnimatedSprite { +public: + Class526(NeverhoodEngine *vm, Sprite *class525); +protected: + Sprite *_class525; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate466720(); + void sub466770(); +}; + +class Class527 : public AnimatedSprite { +public: + Class527(NeverhoodEngine *vm, Sprite *class526); +protected: + Sprite *_class526; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate466920(); + void sub466970(); +}; + +class Class528 : public AnimatedSprite { +public: + Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag); +protected: + Sprite *_klayman; + SoundResource _soundResource; + int _countdown; + bool _flag; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub466BF0(); + void sub466C50(); + void sub466CB0(); +}; + +struct Class489Item { + NPoint point; + int8 varIndex1; + int8 varIndex2; + int8 index1; + int8 flag2; + int8 flag4; + int8 flag; +}; + +class Class489 : public AnimatedSprite { +public: + Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525); + virtual ~Class489(); +protected: + Scene *_parentScene; + Sprite *_klayman; + Sprite *_class525; + const Class489Item *_class489Item; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + int16 _remX; + bool _flag; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage4348E0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage434B20(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate434B60(); + void sub434C80(); + void sub434D80(); + void sub434DD0(); + void sub434DF0(); + void sub434E60(); + void sub434E90(); + void sub434EC0(); + void sub434F40(); + void sub434F80(); + void sub434FF0(); + void sub435040(); +}; + +class Scene1401 : public Scene { +public: + Scene1401(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + bool _flag; + Sprite *_class427; + Sprite *_class489; + Sprite *_class525; + Sprite *_class526; + Sprite *_class527; + Sprite *_class528; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_ssButton; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1402 + +class Class454 : public StaticSprite { +public: + Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority); +}; + +class Class482 : public AnimatedSprite { +public: + Class482(NeverhoodEngine *vm, Scene *parentScene, int which); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub428500(); + void sub428530(); + void sub428560(); +}; + +class Scene1402 : public Scene { +public: + Scene1402(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_class454_1; + Sprite *_class454_2; + Sprite *_class454_3; + Sprite *_class482; + Sprite *_class489; + bool _flag; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub428220(); + void sub428230(); +}; + +// Scene1407 + +class AsScene1407Mouse : public AnimatedSprite { +public: + AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + int16 _walkDestX; + int16 _currSectionIndex; + int16 _nextHoleIndex; + int _countdown; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suWalkTo(); + void upGoThroughHole(); + void stIdleLookAtGoodHole(); + void stWalkToDest(); + void stWalkToHole(); + void stGoThroughHole(); + void stArriveAtHole(); +}; + +class Scene1407 : public Scene { +public: + Scene1407(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource; + Sprite *_asMouse; + Sprite *_ssResetButton; + int _puzzleSolvedCountdown; + int _resetButtonCountdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1400_H */ diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp new file mode 100644 index 0000000000..3289173dfb --- /dev/null +++ b/engines/neverhood/module1700.cpp @@ -0,0 +1,359 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1700.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundResource(vm) { + + debug("Create Module1700(%d)", which); + + // TODO Music18hList_add(0x04212331); + // TODO Sound1ChList_addSoundResources(0x04212331, dword_4AE930, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 50, 600, 5, 150); + // TODO Sound1ChList_sub_407C70(0x04212331, 0x41861371, 0x43A2507F, 0); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 0: + createScene1701(-1); + break; + case 1: + createScene1702(-1); + break; + case 2: + createScene1703(-1); + break; + case 3: + createScene1704(-1); + break; + default: + createScene1705(-1); + } + } else if (which == 0) { + createScene1701(-1); + } else if (which == 1) { + createScene1705(1); + } else { + createScene1705(3); + } + +} + +Module1700::~Module1700() { + // TODO Sound1ChList_sub_407A50(0x04212331); +} + +void Module1700::createScene1701(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 0; + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x3028A005); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1700::updateScene1701); +} + +void Module1700::createScene1702(int which) { + _vm->gameState().sceneNum = 1; + _childObject = new NavigationScene(_vm, this, 0x004AE8B8, which, NULL); + SetUpdateHandler(&Module1700::updateScene1702); +} + +void Module1700::createScene1703(int which) { + _vm->gameState().sceneNum = 2; + _childObject = new NavigationScene(_vm, this, 0x004AE8E8, which, NULL); + SetUpdateHandler(&Module1700::updateScene1703); +} + +void Module1700::createScene1704(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 3; + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x01190041); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1700::updateScene1701); +} + +void Module1700::createScene1705(int which) { + _vm->gameState().sceneNum = 4; + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + // TODO Music18hList_play(0x31114225, 0, 2, 1); + _childObject = new Scene1705(_vm, this, which); + SetUpdateHandler(&Module1700::updateScene1705); +} + +void Module1700::updateScene1701() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_vm->gameState().sceneNum == 3) { + createScene1705(0); + _childObject->handleUpdate(); + } else { + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0); + createScene1702(0); + _childObject->handleUpdate(); + } + } +} + +void Module1700::updateScene1702() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1703(0); + _childObject->handleUpdate(); + } else if (_field20 == 1) { + createScene1702(1); + _childObject->handleUpdate(); + } + } +} + +void Module1700::updateScene1703() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1704(-1); + _childObject->handleUpdate(); + } else if (_field20 == 1) { + createScene1702(1); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + if (!_soundResource.isPlaying()) { + // TODO _soundResource.setVolume(60); + _soundResource.play(0x58B45E58); + } + createScene1703(2); + _childObject->handleUpdate(); + } + } +} + +void Module1700::updateScene1705() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + _parentModule->sendMessage(0x1009, 1, this); + } +} + +// Scene1705 + +static const uint32 kScene1705FileHashes[] = { + 0x910EA801, + 0x920EA801, + 0x940EA801, + 0x980EA801, + 0x800EA801, + 0xB00EA801, + 0xD00EA801, + 0x100EA801, + 0x900EA800, + 0xD10EA801, + 0x110EA801, + 0x910EA800 +}; + +Class602::Class602(NeverhoodEngine *vm, uint32 fileHash, int index) + : StaticSprite(vm, fileHash, 100) { + + _x = _spriteResource.getPosition().x + index * 30; + _y = _spriteResource.getPosition().y + 160; + StaticSprite::update(); +} + +Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash) + : StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _index(index) { + + if (!getSubVar(0x02038314, _index) && !getSubVar(0x02720344, _index)) { + SetMessageHandler(&Class606::handleMessage); + } else { + _surface->setVisible(false); + SetMessageHandler(NULL); + } + _deltaRect = _drawRect; + _deltaRect.x -= 4; + _deltaRect.y -= 8; + _deltaRect.width += 8; + _deltaRect.height += 16; + Sprite::processDelta(); +} + +uint32 Class606::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4806: + setSubVar(0x02038314, _index, 1); + _surface->setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _paletteArea(1) { + + Palette2 *palette2; + Sprite *tempSprite; + + setGlobalVar(0xE7498218, 1); + // TODO _vm->initVarsScene1705(); + + SetMessageHandler(&Scene1705::handleMessage); + SetUpdateHandler(&Scene1705::update); + + _vm->_collisionMan->setHitRects(0x004B69D8); + + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x03118226, 0, 0)); + + palette2 = new Palette2(_vm, 0x03118226); + palette2->addPalette(0x91D3A391, 0, 64, 0); + palette2->copyBasePalette(0, 256, 0); + palette2->usePalette(); + _palette = palette2; + addEntity(_palette); + + _mouseCursor = addSprite(new Mouse433(_vm, 0x18222039, NULL)); + + addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0)); + addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1)); + addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2)); + + _sprite = addSprite(new StaticSprite(_vm, 0x31313A22, 1100)); + + _class606 = addSprite(new Class606(_vm, this, 15, 1100, 238, 439, 0x02363852)); + _vm->_collisionMan->addSprite(_class606); + + which = 4; + + if (which < 0) { + _klayman = new KmScene1705(_vm, this, 231, 434); + setMessageList(0x004B69E8); + sendMessage(0x2000, 0, this); + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + } else if (which == 1) { + _klayman = new KmScene1705(_vm, this, 431, 434); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004B6A08); + sendMessage(0x2000, 1, this); + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + } else if (which == 2) { + _klayman = new KmScene1705(_vm, this, 431, 434); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004B6AA0); + sendMessage(0x2000, 1, this); + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + } else if (which == 3) { + _klayman = new KmScene1705(_vm, this, 431, 434); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004B6A18); + sendMessage(0x2000, 1, this); + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + } else { + _klayman = new KmScene1705(_vm, this, 231, 74); + _klayman->sendMessage(0x2000, 0, this); + setMessageList(0x004B69F0); + sendMessage(0x2000, 0, this); + tempSprite = addSprite(new StaticSprite(_vm, 0x30303822, 1100)); + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; + _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + } + + addSprite(_klayman); + +} + +void Scene1705::update() { + Scene::update(); + if (_klayman->getX() < 224 && _paletteArea != 0) { + ((Palette2*)_palette)->addPalette(0xF2210C15, 0, 64, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + _paletteArea = 0; + } else if (_klayman->getX() >= 224 && _paletteArea == 0) { + ((Palette2*)_palette)->addPalette(0x91D3A391, 0, 64, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + _paletteArea = 1; + } +} + +uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004B6B40); + _klayman->setKlaymanTable3(); + } else { + setRectList(0x004B6B30); + _klayman->setKlaymanTable1(); + } + break; + case 0x4826: + if (sender == _class606 && _klayman->getX() <= 318) { + _klayman->sendEntityMessage(0x1014, sender, this); + setMessageList(0x004B6AC0); + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h new file mode 100644 index 0000000000..0fefa72122 --- /dev/null +++ b/engines/neverhood/module1700.h @@ -0,0 +1,80 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1700_H +#define NEVERHOOD_MODULE1700_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +class Module1700 : public Module { +public: + Module1700(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1700(); +protected: + SoundResource _soundResource; + void update(); + void createScene1701(int which); + void createScene1702(int which); + void createScene1703(int which); + void createScene1704(int which); + void createScene1705(int which); + void updateScene1701(); + void updateScene1702(); + void updateScene1703(); + void updateScene1705(); +}; + +// Scene1705 + +class Class602 : public StaticSprite { +public: + Class602(NeverhoodEngine *vm, uint32 fileHash, int index); +}; + +class Class606 : public StaticSprite { +public: + Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash); +protected: + Scene *_parentScene; + int _index; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1705 : public Scene { +public: + Scene1705(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite; + Sprite *_class606; + int _paletteArea; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1700_H */ diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp new file mode 100644 index 0000000000..2a4d89cead --- /dev/null +++ b/engines/neverhood/module1800.cpp @@ -0,0 +1,300 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1800.h" +#include "neverhood/navigationscene.h" +#include "neverhood/smackerscene.h" + +#include "neverhood/diskplayerscene.h" + +namespace Neverhood { + +Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module1800(%d)", which); + + // TODO Sound1ChList_addSoundResources(0x04A14718, dword_4AFE70); + // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 1, 50, 600, 10, 150); + // TODO Sound1ChList_sub_407C70(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 0: + createScene1801(-1); + break; + case 1: + createScene1802(-1); + break; + case 2: + createScene1803(-1); + break; + default: + case 3: + createScene1804(-1); + break; + case 4: + createScene1805(-1); + break; + case 5: + createScene1806(-1); + break; + case 6: + createScene1807(-1); + break; + case 7: + createScene1808(-1); + break; + case 8: + createScene1809(-1); + break; + } + } else if (which == 2) { + createScene1806(0); + } else if (which == 3) { + createScene1801(0); + } else { + createScene1804(1); + } + +} + +Module1800::~Module1800() { + // TODO Sound1ChList_sub_407A50(0x04A14718); +} + +void Module1800::createScene1801(int which) { + static const byte kNavigationTypes[] = {1, 0, 2, 0}; + _vm->gameState().sceneNum = 0; +#if 0 + _childObject = new NavigationScene(_vm, this, 0x004AFD38, which, kNavigationTypes); +#endif + _childObject = new DiskplayerScene(_vm, this, 3); + SetUpdateHandler(&Module1800::updateScene1801); +} + +void Module1800::createScene1802(int which) { + static const byte kNavigationTypes[] = {5}; + _vm->gameState().sceneNum = 1; + _childObject = new NavigationScene(_vm, this, 0x004AFD98, which, kNavigationTypes); + SetUpdateHandler(&Module1800::updateScene1802); +} + +void Module1800::createScene1803(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 2; + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x006C0085); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1800::updateScene1803); +} + +void Module1800::createScene1804(int which) { + _vm->gameState().sceneNum = 3; + _childObject = new NavigationScene(_vm, this, 0x004AFDB0, which, NULL); + SetUpdateHandler(&Module1800::updateScene1804); +} + +void Module1800::createScene1804b(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 3; + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x0A840C01); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1800::updateScene1803); +} + +void Module1800::createScene1805(int which) { + _vm->gameState().sceneNum = 4; + _childObject = new NavigationScene(_vm, this, 0x004AFDE0, which, NULL); + SetUpdateHandler(&Module1800::updateScene1805); +} + +void Module1800::createScene1806(int which) { + _vm->gameState().sceneNum = 5; + _childObject = new NavigationScene(_vm, this, 0x004AFE40, which, NULL); + SetUpdateHandler(&Module1800::updateScene1806); +} + +void Module1800::createScene1807(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 6; + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x08D84010); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1800::updateScene1803); + // TODO Sound1ChList_sub_407A50(0x04A14718); +} + +void Module1800::createScene1808(int which) { + SmackerScene *smackerScene; + _vm->gameState().sceneNum = 7; + // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0); + smackerScene = new SmackerScene(_vm, this, true, true, false); + smackerScene->setFileHash(0x0168B121); + smackerScene->nextVideo(); + _childObject = smackerScene; + SetUpdateHandler(&Module1800::updateScene1803); +} + +void Module1800::createScene1809(int which) { +#if 0 // TODO + _vm->gameState().sceneNum = 8; + _childObject = new CreditsScene(_vm, this, 0); + SetUpdateHandler(&Module1800::updateScene1809); +#endif +} + +void Module1800::updateScene1801() { + _childObject->handleUpdate(); +#if 0 // TODO + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (navigationScene->soundFlag1 && navigationScene->index == 2) { + // TODO Sound1ChList_sub_4080B0(false); + } +#endif + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene1805(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene1802(-1); + _childObject->handleUpdate(); + } else if (_field20 == 3) { + createScene1804(0); + _childObject->handleUpdate(); + } + } +} + +void Module1800::updateScene1802() { + _childObject->handleUpdate(); + if (_done) { + int areaType = ((NavigationScene*)_childObject)->getNavigationAreaType(); + _done = false; + delete _childObject; + _childObject = NULL; + if (areaType == 3) { + createScene1808(-1); + } else { + createScene1803(-1); + } + _childObject->handleUpdate(); + } +} + +void Module1800::updateScene1803() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 2) { + createScene1801(2); + _childObject->handleUpdate(); + } else if (_field20 == 3) { + _parentModule->sendMessage(0x1009, 0, this); + } else if (_field20 == 6) { + createScene1809(-1); + _childObject->handleUpdate(); + } else if (_field20 == 7) { + _parentModule->sendMessage(0x1009, 3, this); + } + } +} + +void Module1800::updateScene1804() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1804b(-1); + _childObject->handleUpdate(); + } else if (_field20 == 1) { + createScene1801(1); + _childObject->handleUpdate(); + } + } +} + +void Module1800::updateScene1805() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1807(-1); + _childObject->handleUpdate(); + } else if (_field20 == 1) { + createScene1806(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene1801(3); + _childObject->handleUpdate(); + } else if (_field20 == 3) { + createScene1805(3); + _childObject->handleUpdate(); + } + } +} + +void Module1800::updateScene1806() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + _parentModule->sendMessage(0x1009, 2, this); + } else if (_field20 == 1) { + createScene1805(3); + _childObject->handleUpdate(); + } + } + if (_field24 >= 0) { + if (_field24 == 1) { + // TODO _resourceTable.setResourceList(ex_sub_42EDA0(0), true); + } + _field24 = -1; + } +} + +void Module1800::updateScene1809() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + _parentModule->sendMessage(0x1009, 1, this); + // TODO GameState stuff + } +} +} // End of namespace Neverhood diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h new file mode 100644 index 0000000000..13d4790a8c --- /dev/null +++ b/engines/neverhood/module1800.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1800_H +#define NEVERHOOD_MODULE1800_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1800 + +class Module1800 : public Module { +public: + Module1800(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1800(); +protected: + // TODO ResourceTable _resourceTable; + void createScene1801(int which); + void createScene1802(int which); + void createScene1803(int which); + void createScene1804(int which); + void createScene1804b(int which); + void createScene1805(int which); + void createScene1806(int which); + void createScene1807(int which); + void createScene1808(int which); + void createScene1809(int which); + void updateScene1801(); + void updateScene1802(); + void updateScene1803(); + void updateScene1804(); + void updateScene1805(); + void updateScene1806(); + void updateScene1807(); + void updateScene1808(); + void updateScene1809(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1800_H */ diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index f6be668b3c..7bc1551250 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -25,7 +25,7 @@ namespace Neverhood { -NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes) +NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes) : Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false), _soundFlag1(false), _soundFlag2(false), _smackerFileHash(0), _interactive(true), _done(false) { @@ -64,8 +64,11 @@ NavigationScene::~NavigationScene() { // TODO Sound1ChList_sub_408110(0); } -byte NavigationScene::getNavigationAreaType() { - return 0; // TODO +int NavigationScene::getNavigationAreaType() { + NPoint mousePos; + mousePos.x = _mouseCursor->getX(); + mousePos.y = _mouseCursor->getY(); + return _mouseCursor->sendPointMessage(0x2064, mousePos, this); } void NavigationScene::update() { diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h index 08aefb7cc4..c37a7fc178 100644 --- a/engines/neverhood/navigationscene.h +++ b/engines/neverhood/navigationscene.h @@ -31,9 +31,9 @@ namespace Neverhood { class NavigationScene : public Scene { public: - NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, byte *itemsTypes); + NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes); virtual ~NavigationScene(); - byte getNavigationAreaType(); + int getNavigationAreaType(); protected: SmackerPlayer *_smackerPlayer; bool _smackerDone; @@ -44,7 +44,7 @@ protected: bool _soundFlag1; bool _soundFlag2; bool _done; - byte *_itemsTypes; + const byte *_itemsTypes; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createMouseCursor(); diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index e186d3814f..28fa81b87a 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -160,7 +160,6 @@ void Palette2::update() { if (_status == 1) { Palette::update(); } else if (_status == 2) { - debug("... _palCounter = %d", _palCounter); if (_palCounter > 1) { for (int i = 0; i < 256; i++) { fadeColor(_palette + i * 4, _basePalette[i * 4 + 0], _basePalette[i * 4 + 1], _basePalette[i * 4 + 2]); @@ -174,6 +173,12 @@ void Palette2::update() { } } +void Palette2::copyBasePalette(int toIndex, int count, int fromIndex) { + if (toIndex + count > 256) + count = 256 - toIndex; + memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4); +} + void Palette2::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) { PaletteResource paletteResource(_vm); if (toIndex + count > 256) diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index e3d95aa7f6..01f63e8e7e 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -38,7 +38,7 @@ public: Palette(NeverhoodEngine *vm, const char *filename); // Create from resource with fileHash Palette(NeverhoodEngine *vm, uint32 fileHash); - ~Palette(); + virtual ~Palette(); void usePalette(); void addPalette(const char *filename, int toIndex, int count, int fromIndex); void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); @@ -60,7 +60,8 @@ public: Palette2(NeverhoodEngine *vm); // TODO: Other ctors Palette2(NeverhoodEngine *vm, uint32 fileHash); - ~Palette2(); + virtual ~Palette2(); + void copyBasePalette(int toIndex, int count, int fromIndex); void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); void startFadeToPalette(int counter); public: diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 44fef14ebe..39824de7f9 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -313,6 +313,21 @@ void AnimResource::setRepl(byte oldColor, byte newColor) { _replNewColor = newColor; } +NDimensions AnimResource::loadSpriteDimensions(uint32 fileHash) { + NDimensions dimensions; + byte *resDimensions = _vm->_res->getResourceExtDataByHash(fileHash); + if (resDimensions) { + dimensions.width = READ_LE_UINT16(resDimensions + 0); + dimensions.height = READ_LE_UINT16(resDimensions + 2); + } else { + dimensions.width = 0; + dimensions.height = 0; + } + return dimensions; +} + +// MouseCursorResource + MouseCursorResource::MouseCursorResource(NeverhoodEngine *vm) : _cursorSprite(vm), _cursorNum(4), _currFileHash(0) { diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 5d8d5ca13d..a7d5e6c761 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -91,6 +91,7 @@ public: int16 getFrameIndex(uint32 frameHash); void setReplEnabled(bool value) { _replEnabled = value; } void setRepl(byte oldColor, byte newColor); + NDimensions loadSpriteDimensions(uint32 fileHash); protected: NeverhoodEngine *_vm; int _resourceHandle; diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 28f0994cb1..0538f58e87 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -135,8 +135,8 @@ byte *ResourceMan::getResourceExtData(int resourceHandle) { } byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) { - ResourceFileEntry *entry = findEntry(fileHash); - return _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex); + ResourceFileEntry *entry = findEntrySimple(fileHash); + return entry ? _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex) : NULL; } byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 43f1ca79bc..d725cedb99 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -88,14 +88,16 @@ void Scene::draw() { if (_smackerPlayer->getSurface()) _smackerPlayer->getSurface()->draw(); } else { +#if 0 if (_surfaceFlag) { // TODO g_screen->copyDirtyRects(); for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) (*iter)->addDirtyRect(); // TODO g_screen->addDirtyRects(); } +#endif for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { - debug(4, "priority = %d", (*iter)->getPriority()); + //debug(4, "priority = %d", (*iter)->getPriority()); (*iter)->draw(); } } @@ -501,6 +503,11 @@ void Scene::setRectList(RectList *rectList) { _rectType = 1; } +void Scene::clearRectList() { + _rectList = NULL; + _rectType = 1; +} + void Scene::loadDataResource(uint32 fileHash) { _dataResource.load(fileHash); if (_klayman) diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 47114053b0..65326c310f 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -50,6 +50,7 @@ public: void setSurfacePriority(BaseSurface *surface, int priority); void deleteSprite(Sprite **sprite); Background *addBackground(Background *background); + void update(); protected: Module *_parentModule; Common::Array _entities; @@ -89,7 +90,6 @@ protected: bool _prevVisible; int _messageValue; // TODO 000000CF field_CF db ? - void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void smackerUpdate(); uint32 smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -102,6 +102,7 @@ protected: void runMessageList(); void setRectList(uint32 id); void setRectList(RectList *rectList); + void clearRectList(); void messageList402220(); void loadDataResource(uint32 fileHash); }; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index f0b30084cc..66e7a58746 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -69,12 +69,10 @@ void SmackerDoubleSurface::draw() { SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag) : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false), - _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true) { - - debug("_smackerSurface = %p", (void*)_smackerSurface); + _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true), + _drawX(-1), _drawY(-1) { SetUpdateHandler(&SmackerPlayer::update); - open(fileHash, flag); } @@ -121,14 +119,31 @@ void SmackerPlayer::close() { } void SmackerPlayer::gotoFrame(uint frameNumber) { + // TODO? +} + +uint32 SmackerPlayer::getFrameCount() { + return _smackerDecoder ? _smackerDecoder->getFrameCount() : 0; +} + +uint32 SmackerPlayer::getFrameNumber() { + return _smackerDecoder ? _smackerDecoder->getCurFrame() : 0; } uint SmackerPlayer::getStatus() { return 0; } -void SmackerPlayer::update() { +void SmackerPlayer::setDrawPos(int16 x, int16 y) { + _drawX = x; + _drawY = y; + if (_smackerSurface) { + _smackerSurface->getDrawRect().x = _drawX; + _smackerSurface->getDrawRect().y = _drawY; + } +} +void SmackerPlayer::update() { debug(8, "SmackerPlayer::update()"); if (!_smackerDecoder) @@ -144,15 +159,18 @@ void SmackerPlayer::update() { const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame(); if (_smackerFirst) { - if (_doubleSurface) { - _smackerSurface->getDrawRect().x = 320 - _smackerDecoder->getWidth(); - _smackerSurface->getDrawRect().y = 240 - _smackerDecoder->getHeight(); - _smackerSurface->setSmackerFrame(smackerFrame); - } else { - _smackerSurface->getDrawRect().x = (640 - _smackerDecoder->getWidth()) / 2; - _smackerSurface->getDrawRect().y = (480 - _smackerDecoder->getHeight()) / 2; - _smackerSurface->setSmackerFrame(smackerFrame); + _smackerSurface->setSmackerFrame(smackerFrame); + if (_drawX < 0 || _drawY < 0) { + if (_doubleSurface) { + _drawX = 320 - _smackerDecoder->getWidth(); + _drawY = 240 - _smackerDecoder->getHeight(); + } else { + _drawX = (640 - _smackerDecoder->getWidth()) / 2; + _drawY = (480 - _smackerDecoder->getHeight()) / 2; + } } + _smackerSurface->getDrawRect().x = _drawX; + _smackerSurface->getDrawRect().y = _drawY; _smackerFirst = false; } @@ -164,7 +182,6 @@ void SmackerPlayer::update() { _dirtyFlag = true; if (_smackerDecoder->hasDirtyPalette()) { - debug("updatePalette()"); updatePalette(); } @@ -179,7 +196,6 @@ void SmackerPlayer::update() { } } - } void SmackerPlayer::updatePalette() { diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index 2262277956..6579bb4add 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -55,7 +55,10 @@ public: void open(uint32 fileHash, bool keepLastFrame); void close(); void gotoFrame(uint frameNumber); + uint32 getFrameCount(); + uint32 getFrameNumber(); uint getStatus(); + void setDrawPos(int16 x, int16 y); protected: Scene *_scene; Palette *_palette; @@ -67,6 +70,7 @@ protected: bool _keepLastFrame; bool _flag2; bool _dirtyFlag; + int _drawX, _drawY; void update(); void updatePalette(); }; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index d0a6628d75..ee6e7aa942 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -93,6 +93,11 @@ void Sprite::createSurface(int surfacePriority, int16 width, int16 height) { _surface = new BaseSurface(_vm, surfacePriority, width, height); } +int16 Sprite::defFilterY(int16 y) { + // TODO return y - g_screen->field_26; + return y; +} + // StaticSprite StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) @@ -209,7 +214,6 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface _x = x; _y = y; setFileHash(fileHash, 0, -1); - } void AnimatedSprite::init() { @@ -428,10 +432,7 @@ void AnimatedSprite::updateFrameInfo() { } void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { - NDimensions dimensions; - // TODO dimensions = getAnimatedSpriteDimensions(fileHash); - dimensions.width = 640; - dimensions.height = 480; + NDimensions dimensions = _animResource.loadSpriteDimensions(fileHash); _surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height); } diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 18c9ae32da..86165f3440 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -48,12 +48,15 @@ public: bool checkCollision(NRect &rect); int16 getX() const { return _x; } int16 getY() const { return _y; } + void setX(int16 value) { _x = value; } + void setY(int16 value) { _y = value; } uint16 getFlags() const { return _flags; } bool isDoDeltaX() const { return _doDeltaX; } bool isDoDeltaY() const { return _doDeltaY; } NRect& getRect() { return _rect; } uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void loadDataResource(uint32 fileHash); + int16 defFilterY(int16 y); protected: void (Sprite::*_spriteUpdateCb)(); Common::String _spriteUpdateCbName; // For debugging purposes @@ -71,7 +74,6 @@ protected: uint16 _flags; //0000004A field4A dw ? // seems to be unused except in ctor DataResource _dataResource; - //void update(); void createSurface(int surfacePriority, int16 width, int16 height); void handleSpriteUpdate() { if (_spriteUpdateCb) @@ -91,10 +93,10 @@ public: StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); void load(uint32 fileHash, bool dimensions, bool position); + void update(); protected: SpriteResource _spriteResource; void init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height); - void update(); }; #define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback -- cgit v1.2.3 From d7dd4b43563b3d0ad5b16ff1fb384ab1382b3848 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 27 Jul 2011 18:02:30 +0000 Subject: NEVERHOOD: Implement Scene1403, Scene1404 and Scene1405 (memory minigame) - Move GameModule::startup call into engine instead of the game module constructor - Reduce debug output --- engines/neverhood/entity.h | 4 +- engines/neverhood/gamemodule.cpp | 103 ++++++++- engines/neverhood/gamemodule.h | 3 +- engines/neverhood/gamevars.cpp | 33 ++- engines/neverhood/klayman.cpp | 355 +++++++++++++++++++++++++++---- engines/neverhood/klayman.h | 26 +++ engines/neverhood/module1400.cpp | 448 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module1400.h | 66 ++++++ engines/neverhood/neverhood.cpp | 8 +- engines/neverhood/neverhood.h | 1 + engines/neverhood/scene.cpp | 2 +- engines/neverhood/sprite.h | 2 +- 12 files changed, 977 insertions(+), 74 deletions(-) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 18c6b7e7b9..e49aa94e08 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -74,8 +74,8 @@ protected: // TODO: Disable heavy debug stuff in release mode -#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler); debug("SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler -#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug("SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler +#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler +#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler class Entity { public: diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 02ae2a7cac..d4b1e7bfd5 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -44,7 +44,7 @@ GameModule::GameModule(NeverhoodEngine *vm) SetMessageHandler(&GameModule::handleMessage); - startup(); + //startup(); } @@ -83,6 +83,105 @@ void GameModule::handleMouseDown(int16 x, int16 y) { } } +void GameModule::initScene1405Vars() { + + // TODO: Give better names + + byte array44[3]; + byte array3C[10]; + byte array30[48]; + uint32 index3 = 48; + uint32 index2 = 9; + uint32 index1 = 2; + uint32 rndIndex; + + // Exit if it's already initialized + if (getSubVar(0x40050052, 0xC8606803)) + return; + + for (uint32 i = 0; i < 3; i++) + setSubVar(0x61084036, i, 1); + + for (byte i = 0; i < 3; i++) + array44[i] = i; + + for (byte i = 0; i < 10; i++) + array3C[i] = i; + + for (byte i = 0; i < 48; i++) + array30[i] = i; + + rndIndex = _vm->_rnd->getRandomNumber(3 - 1); + + setSubVar(0x13100631, array44[rndIndex], 5); + + for (byte i = 5; i < 9; i++) + array3C[i] = array3C[i + 1]; + + while (rndIndex < 2) { + array44[rndIndex] = array44[rndIndex + 1]; + rndIndex++; + } + + for (int i = 0; i < 2; i++) { + uint32 rndIndex1 = _vm->_rnd->getRandomNumber(index2 - 1); // si + uint32 rndIndex2 = _vm->_rnd->getRandomNumber(index1 - 1); // di + setSubVar(0x13100631, array44[rndIndex2], array3C[rndIndex1]); + index2--; + while (rndIndex1 < index2) { + array3C[rndIndex1] = array3C[rndIndex1 + 1]; + rndIndex1++; + } + index1--; + while (rndIndex2 < index1) { + array44[rndIndex2] = array44[rndIndex2 + 1]; + rndIndex2++; + } + } + + for (uint32 i = 0; i < 3; i++) { + uint32 rndValue = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2; + uint32 index4 = 0; + setSubVar(0x7500993A, i, rndValue); + while (index4 < rndValue) { + uint32 rndIndex3 = _vm->_rnd->getRandomNumber(index3 - 1); + setSubVar(0x0C65F80B, array30[rndIndex3], getSubVar(0x13100631, i)); + index3--; + while (rndIndex3 < index3) { + array30[rndIndex3] = array30[rndIndex3 + 1]; + rndIndex3++; + } + index4++; + } + } + + uint32 index5 = 0; + while (index3 != 0) { + uint32 rndIndex4 = _vm->_rnd->getRandomNumber(index3 - 1); + index1 = array3C[index5]; + setSubVar(0x0C65F80B, array30[rndIndex4], index1); + index3--; + while (rndIndex4 < index3) { + array30[rndIndex4] = array30[rndIndex4 + 1]; + rndIndex4++; + } + uint32 rndIndex5 = _vm->_rnd->getRandomNumber(index3 - 1); + setSubVar(0x0C65F80B, array30[rndIndex5], index1); + index3--; + while (rndIndex5 < index3) { + array30[rndIndex5] = array30[rndIndex5 + 1]; + rndIndex5++; + } + index5++; + if (index5 >= index2) + index5 = 0; + + } + + setSubVar(0x40050052, 0xC8606803, 1); + +} + uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -114,7 +213,7 @@ void GameModule::startup() { // createModule1500(0); // Logos and intro video //Real // createModule1000(-1); // createModule2300(2); - _vm->gameState().sceneNum = 6; + _vm->gameState().sceneNum = 4; //createModule1200(-1); //createModule1800(-1); //createModule1700(-1); diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 344a78ff60..d93a7994a7 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -34,8 +34,10 @@ class GameModule : public Module { public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); + void startup(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); + void initScene1405Vars(); protected: Entity *_prevChildObject; bool _someFlag1; @@ -48,7 +50,6 @@ protected: ResourceTable _resourceTable4; */ uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void startup(); void createModule1000(int which); void updateModule1000(); void createModule1200(int which); diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index caf79b2ad9..e0cae80105 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -32,18 +32,18 @@ GameVars::~GameVars() { } uint32 GameVars::getGlobalVar(uint32 nameHash) { - debug("GameVars::getGlobalVar(%08X)", nameHash); + //debug("GameVars::getGlobalVar(%08X)", nameHash); int16 varIndex = findSubVarIndex(0, nameHash); return varIndex != -1 ? _vars[varIndex].value : 0; } void GameVars::setGlobalVar(uint32 nameHash, uint32 value) { - debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value); + //debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value); _vars[getSubVarIndex(0, nameHash)].value = value; } uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) { - debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash); + //debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash); uint32 value = 0; int16 varIndex = findSubVarIndex(0, nameHash); if (varIndex != -1) { @@ -56,21 +56,17 @@ uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) { } void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { - debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value); - + //debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value); int16 varIndex = getSubVarIndex(0, nameHash); - debug(" varIndex = %d", varIndex); - + //debug(" varIndex = %d", varIndex); int16 subVarIndex = getSubVarIndex(varIndex, subNameHash); - debug(" subVarIndex = %d", subVarIndex); - + //debug(" subVarIndex = %d", subVarIndex); _vars[subVarIndex].value = value; - //_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value; } int16 GameVars::addVar(uint32 nameHash, uint32 value) { - debug("GameVars::addVar(%08X, %d)", nameHash, value); + //debug("GameVars::addVar(%08X, %d)", nameHash, value); GameVar gameVar; gameVar.nameHash = nameHash; gameVar.value = value; @@ -81,7 +77,7 @@ int16 GameVars::addVar(uint32 nameHash, uint32 value) { } int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) { - debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash); + //debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash); for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) { if (_vars[nextIndex].nameHash == subNameHash) return nextIndex; @@ -90,18 +86,19 @@ int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) { } int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) { - debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value); + //debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value); int16 nextIndex = _vars[varIndex].firstIndex; + int16 subVarIndex; if (nextIndex == -1) { - _vars[varIndex].firstIndex = addVar(subNameHash, value); - return _vars[varIndex].firstIndex; + subVarIndex = addVar(subNameHash, value); + _vars[varIndex].firstIndex = subVarIndex; } else { while (_vars[nextIndex].nextIndex != -1) nextIndex = _vars[nextIndex].nextIndex; - int16 index = addVar(subNameHash, value); - _vars[nextIndex].nextIndex = index; - return index; + subVarIndex = addVar(subNameHash, value); + _vars[nextIndex].nextIndex = subVarIndex; } + return subVarIndex; } int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) { diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index b24e3eb6b4..3aaab36874 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -49,6 +49,12 @@ static const KlaymanTableItem klaymanTable3[] = { }; #endif +static const KlaymanTableItem klaymanTable4[] = { + {1, &Klayman::sub41FDA0}, + {1, &Klayman::sub41FE60}, + {1, &Klayman::sub41FEB0}, +}; + // Klayman Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority) @@ -471,7 +477,7 @@ bool Klayman::sub41CF10(AnimationCb callback) { } void Klayman::sub41C7B0() { - debug("Klayman::sub41C7B0()"); + //debug("Klayman::sub41C7B0()"); if (_callback1Cb) { AnimationCb cb = _callback1Cb; _callback1Cb = NULL; @@ -541,7 +547,7 @@ void Klayman::update41D0F0() { } uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41D360(%04X)", messageNum); + //debug("Klayman::handleMessage41D360(%04X)", messageNum); Sprite::handleMessage(messageNum, param, sender); uint32 messageResult = xHandleMessage(messageNum, param); switch (messageNum) { @@ -587,7 +593,7 @@ void Klayman::sub41FF00() { } uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41D480(%04X)", messageNum); + //debug("Klayman::handleMessage41D480(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -608,7 +614,7 @@ void Klayman::sub41FCF0() { } uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41F140(%04X)", messageNum); + //debug("Klayman::handleMessage41F140(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -624,7 +630,7 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { - debug("Klayman::sub41C930(%d, %d)", x, flag); + //debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); if (x == _x) { _x4 = x; @@ -675,7 +681,7 @@ void Klayman::sub4211B0() { uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { //ok - debug("Klayman::handleMessage41E920(%04X)", messageNum); + //debug("Klayman::handleMessage41E920(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -704,7 +710,7 @@ bool Klayman::sub41CEB0(AnimationCb callback3) { } void Klayman::spriteUpdate41F250() { - debug("Klayman::spriteUpdate41F250()"); + //debug("Klayman::spriteUpdate41F250()"); int16 xdiff = _x4 - _x; @@ -736,7 +742,7 @@ void Klayman::spriteUpdate41F250() { } void Klayman::spriteUpdate41F5F0() { - debug("Klayman::spriteUpdate41F5F0()"); + //debug("Klayman::spriteUpdate41F5F0()"); int16 xdiff = _x4 - _x; @@ -801,7 +807,7 @@ void Klayman::sub41FBB0() { } uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41DD80(%04X)", messageNum); + //debug("Klayman::handleMessage41DD80(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -832,7 +838,7 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, E } void Klayman::sub41CD70(int16 x) { - debug("Klayman::sub41CD70(%d)", x); + //debug("Klayman::sub41CD70(%d)", x); if (x > _x) { if (ABS(x - _x) <= 105) { sub41CAC0(x); @@ -868,7 +874,7 @@ void Klayman::sub41FB30() { } uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41EC70(%04X)", messageNum); + //debug("Klayman::handleMessage41EC70(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -908,7 +914,7 @@ void Klayman::spriteUpdate41F300() { } uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41EB70(%04X)", messageNum); + //debug("Klayman::handleMessage41EB70(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1047,7 +1053,7 @@ void Klayman::sub41FF80() { } uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41D4C0(%04X)", messageNum); + //debug("Klayman::handleMessage41D4C0(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1085,7 +1091,7 @@ void Klayman::sub420120() { } uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41DAD0(%04X)", messageNum); + //debug("Klayman::handleMessage41DAD0(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1166,7 +1172,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { } void Klayman::sub41CAC0(int16 x) { - debug("Klayman::sub41CAC0(%d)", x); + //debug("Klayman::sub41CAC0(%d)", x); int16 xdiff = ABS(x - _x); if (x == _x) { _x4 = x; @@ -1256,7 +1262,7 @@ void Klayman::spriteUpdate41F780() { } uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41DF10(%04X)", messageNum); + //debug("Klayman::handleMessage41DF10(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1302,7 +1308,7 @@ void Klayman::sub4208F0() { } uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Klayman::handleMessage41EEF0(%04X)", messageNum); + //debug("Klayman::handleMessage41EEF0(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1856,6 +1862,139 @@ void Klayman::sub420550() { } } +void Klayman::sub420C50() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420C50))) { + _status2 = 0; + if (_flagF7) { + sub420D50(); + } else { + _attachedSprite->sendMessage(0x482B, 0, this); + setFileHash(0x0C303040, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41E210); + SetAnimationCallback3(&Klayman::sub420CD0); + _flagE5 = false; + } + } +} + +void Klayman::sub420CD0() { + setFileHash(0x0D318140, 0, -1); + _attachedSprite->sendMessage(0x480F, 0, this); + SetAnimationCallback3(&Klayman::sub420D10); +} + +void Klayman::sub420D10() { + setFileHash(0x4464A440, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D360); + _flagF7 = true; + _flagE5 = true; +} + +void Klayman::sub420D50() { + setFileHash(0x09018068, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41E210); + _attachedSprite->sendMessage(0x4807, 0, this); + SetAnimationCallback3(&Klayman::sub420DA0); + _flagE5 = false; +} + +void Klayman::sub420DA0() { + setFileHash(0x0D318140, 0, -1); + _attachedSprite->sendMessage(0x480F, 0, this); + SetAnimationCallback3(&Klayman::sub420DE0); +} + +void Klayman::sub420DE0() { + setFileHash(0x4464A440, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D360); + _flagF7 = true; + _flagE5 = true; +} + +void Klayman::sub420E20() { + if (_flagF7) { + _status2 = 2; + setFileHash(0x09018068, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41E210); + _attachedSprite->sendMessage(0x4807, 0, this); + SetAnimationCallback3(&Klayman::sub420E90); + _flagE5 = false; + _flagF7 = false; + } else { + sub41C7B0(); + } +} + +void Klayman::sub420E90() { + setFileHash(0x0928C048, 0, -1); + setCallback1(AnimationCallback(&Klayman::sub420EB0)); +} + +void Klayman::sub420EB0() { + _attachedSprite->sendMessage(0x482A, 0, this); +} + +void Klayman::sub420680() { + if (!sub41CF10(AnimationCallback(&Klayman::sub420680))) { + _status2 = 2; + _counter2 = 0; + for (uint32 i = 0; i < 20; i++) { + if (getSubVar(0x02038314, i)) { + setSubVar(0x02720344, i, 1); + setSubVar(0x02038314, i, 0); + _counter2++; + } + } + if (_counter2 == 0) { + setCallback2(NULL); + sub41C7B0(); + } else { + setFileHash(0xD8C8D100, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetMessageHandler(&Klayman::handleMessage41DB90); + _flagE5 = false; + _counter2--; + } + } +} + +uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x06040580) { + if (_counter2 == 0) { + // TODO: Calc calcHash value somewhere else + setFileHash3(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); + } + } else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { + _counter2--; + setFileHash2(0xD8C8D100, 0x01084280, 0); + } else if (param.asInteger() == 0x062A1510) { + _soundResource1.play(0x41688704); + } else if (param.asInteger() == 0x02B20220) { + _soundResource1.play(0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + _soundResource1.play(0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + _soundResource1.play(0x44051000); + } else if (param.asInteger() == 0x0E040501) { + _soundResource1.play(0xC6A129C1); + } + } + return handleMessage41D480(messageNum, param, sender); +} + //############################################################################## // KmScene1001 @@ -1865,7 +2004,7 @@ KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { - debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum); + //debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum); switch (messageNum) { case 0x4001: case 0x4800: @@ -1951,7 +2090,7 @@ void KmScene1001::sub44FA50() { } uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("KmScene1001::handleMessage44FA00(%04X)", messageNum); + //debug("KmScene1001::handleMessage44FA00(%04X)", messageNum); uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1987,7 +2126,7 @@ void KmScene1002::xUpdate() { uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { //ok - debug("KmScene1002::xHandleMessage(%04X)", messageNum); + //debug("KmScene1002::xHandleMessage(%04X)", messageNum); switch (messageNum) { case 0x2001: setCallback2(AnimationCallback(&KmScene1002::sub449E90)); @@ -2089,7 +2228,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene1002::update4497D0() { - debug("KmScene1002::update4497D0()"); + //debug("KmScene1002::update4497D0()"); Klayman::update(); if (_counter1 != 0 && (--_counter1 == 0)) { _surface->setVisible(true); @@ -2259,10 +2398,10 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶ } void KmScene1002::spriteUpdate449DC0() { - debug("KmScene1002::spriteUpdate449DC0()"); + //debug("KmScene1002::spriteUpdate449DC0()"); AnimatedSprite::updateDeltaXY(); HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); - debug("$$$ hitRect->type = %04X", hitRect->type); + //debug("$$$ hitRect->type = %04X", hitRect->type); if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; processDelta(); @@ -2272,7 +2411,7 @@ void KmScene1002::spriteUpdate449DC0() { } void KmScene1002::sub449E20() { - debug("KmScene1002::sub449E20()"); + //debug("KmScene1002::sub449E20()"); if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) { _status2 = 2; _flagE5 = false; @@ -2286,7 +2425,7 @@ void KmScene1002::sub449E20() { } void KmScene1002::sub449E90() { - debug("KmScene1002::sub449E90()"); + //debug("KmScene1002::sub449E90()"); _soundResource1.play(0x56548280); _status2 = 0; _flagE5 = false; @@ -2299,7 +2438,7 @@ void KmScene1002::sub449E90() { void KmScene1002::sub449EF0() { //ok - debug("KmScene1002::sub449EF0()"); + //debug("KmScene1002::sub449EF0()"); _counter1 = 1; _status2 = 0; _flagE5 = false; @@ -2318,7 +2457,7 @@ void KmScene1002::sub449EF0() { void KmScene1002::sub449F70() { //ok - debug("KmScene1002::sub449F70()"); + //debug("KmScene1002::sub449F70()"); _parentScene->sendMessage(0x1024, 1, this); _soundResource1.play(0x41648271); _status2 = 1; @@ -2338,7 +2477,7 @@ void KmScene1002::sub449F70() { void KmScene1002::sub44A050() { //ok - debug("KmScene1002::sub44A050()"); + //debug("KmScene1002::sub44A050()"); _counter1 = 1; _status2 = 0; _flagE5 = false; @@ -2353,7 +2492,7 @@ void KmScene1002::sub44A050() { void KmScene1002::sub44A0D0() { //ok - debug("KmScene1002::sub44A0D0()"); + //debug("KmScene1002::sub44A0D0()"); _counter1 = 1; _status2 = 0; _flagE5 = false; @@ -2368,7 +2507,7 @@ void KmScene1002::sub44A0D0() { void KmScene1002::sub44A150() { //ok - debug("KmScene1002::sub44A150()"); + //debug("KmScene1002::sub44A150()"); _parentScene->sendMessage(0x1024, 1, this); _soundResource1.play(0x41648271); _status2 = 1; @@ -2388,14 +2527,14 @@ void KmScene1002::sub44A150() { void KmScene1002::sub44A230() { //ok - debug("KmScene1002::sub44A230()"); + //debug("KmScene1002::sub44A230()"); setDoDeltaX(2); sub41FC80(); } void KmScene1002::sub44A250() { //ok - debug("KmScene1002::sub44A250()"); + //debug("KmScene1002::sub44A250()"); if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) { _parentScene->sendMessage(0x1024, 3, this); _status2 = 2; @@ -2410,7 +2549,7 @@ void KmScene1002::sub44A250() { void KmScene1002::sub44A2C0() { //ok - debug("KmScene1002::sub44A2C0()"); + //debug("KmScene1002::sub44A2C0()"); if (_attachedSprite) { _x = ((Sprite*)_attachedSprite)->getX(); _attachedSprite->sendMessage(0x4807, 0, this); @@ -2427,7 +2566,7 @@ void KmScene1002::sub44A2C0() { void KmScene1002::sub44A330() { //ok - debug("KmScene1002::sub44A330()"); + //debug("KmScene1002::sub44A330()"); _status2 = 2; _flagE5 = true; setDoDeltaX(0); @@ -2439,7 +2578,7 @@ void KmScene1002::sub44A330() { void KmScene1002::sub44A370() { //ok - debug("KmScene1002::sub44A370()"); + //debug("KmScene1002::sub44A370()"); _status2 = 1; _flagE5 = false; setFileHash(0x35AA8059, 0, -1); @@ -2450,13 +2589,13 @@ void KmScene1002::sub44A370() { } void KmScene1002::sub44A3C0() { - debug("KmScene1002::sub44A3C0()"); + //debug("KmScene1002::sub44A3C0()"); _parentScene->sendMessage(0x1024, 1, this); } void KmScene1002::sub44A3E0() { //ok - debug("KmScene1002::sub44A3E0()"); + //debug("KmScene1002::sub44A3E0()"); if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) { _status2 = 2; _flagE4 = false; @@ -2472,7 +2611,7 @@ void KmScene1002::sub44A3E0() { void KmScene1002::sub44A460() { //ok - debug("KmScene1002::sub44A460()"); + //debug("KmScene1002::sub44A460()"); _flagE4 = false; _flagE5 = true; setFileHash2(0x5C01A870, 0x01084280, 0); @@ -2898,6 +3037,146 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +// KmScene1403 + +KmScene1403::KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + setKlaymanTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); +} + +uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480A: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420600)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420550)); + } + break; + case 0x480D: + setCallback2(AnimationCallback(&KmScene1001::sub420C50)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x4827: + setCallback2(AnimationCallback(&Klayman::sub420E20)); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +// KmScene1404 + +KmScene1404::KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480A: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420600)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420550)); + } + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481A: + setCallback2(AnimationCallback(&Klayman::sub420680)); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + // KmScene1705 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 5cb11abd10..d7c351e20c 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -99,6 +99,16 @@ public: void sub420660(); void sub4205C0(); void sub420550(); + void sub420C50(); + void sub420CD0(); + void sub420D10(); + void sub420D50(); + void sub420DA0(); + void sub420DE0(); + void sub420E20(); + void sub420E90(); + void sub420EB0(); + void sub420680(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -230,6 +240,8 @@ protected: void update41D1C0(); + uint32 handleMessage41DB90(int messageNum, const MessageParam ¶m, Entity *sender); + }; class KmScene1001 : public Klayman { @@ -320,6 +332,20 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene1403 : public Klayman { +public: + KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1404 : public Klayman { +public: + KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene1705 : public Klayman { public: KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 7d618f5319..4da5faa2ff 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -23,6 +23,7 @@ #include "neverhood/module1400.h" #include "neverhood/module1000.h" #include "neverhood/diskplayerscene.h" +#include "neverhood/gamemodule.h" #include "neverhood/navigationscene.h" namespace Neverhood { @@ -87,21 +88,21 @@ void Module1400::createScene1403(int which) { _vm->gameState().sceneNum = 2; // TODO Music18hList_stop(0x06333232, 0, 2); // TODO Music18hList_play(0x624A220E, 0, 2, 1); - // TODO _childObject = new Scene1403(_vm, this, which); + _childObject = new Scene1403(_vm, this, which); SetUpdateHandler(&Module1400::updateScene1403); } void Module1400::createScene1404(int which) { _vm->gameState().sceneNum = 3; // TODO Music18hList_play(0x06333232, 0, 2, 1); - // TODO _childObject = new Scene1404(_vm, this, which); + _childObject = new Scene1404(_vm, this, which); SetUpdateHandler(&Module1400::updateScene1404); } void Module1400::createScene1405(int which) { _vm->gameState().sceneNum = 4; // TODO Music18hList_play(0x06333232, 0, 2, 1); - // TODO _childObject = new Scene1405(_vm, this, which); + _childObject = new Scene1405(_vm, this, which); SetUpdateHandler(&Module1400::updateScene1405); } @@ -109,7 +110,7 @@ void Module1400::createScene1406(int which) { _vm->gameState().sceneNum = 5; // TODO Music18hList_stop(0x06333232, 0, 2); _childObject = new DiskplayerScene(_vm, this, 2); - SetUpdateHandler(&Module1400::updateScene1405); + SetUpdateHandler(&Module1400::updateScene1406); } void Module1400::createScene1407(int which) { @@ -176,6 +177,7 @@ void Module1400::updateScene1404() { _done = false; delete _childObject; _childObject = NULL; + debug("Scene1404; _field20 = %d", _field20); if (_field20 == 1) { createScene1405(0); _childObject->handleUpdate(); @@ -402,7 +404,7 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) _x = 320; _y = 240; - createSurface1(100, 0x04551900); + createSurface1(0x04551900, 100); SetUpdateHandler(&Class528::update); SetMessageHandler(&Class528::handleMessage); _newHashListIndex = -2; @@ -1058,7 +1060,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1402::update() { if (_flag) { - _background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10) - 10; + _background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10 - 1) - 10; // TODO g_screen->field_26 = -10 - _background->getSurface()->getDrawRect().y; } else { _background->getSurface()->getDrawRect().y = -10; @@ -1436,4 +1438,438 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +// Scene1403 + +Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _class489(NULL), _flag(false) { + + SetMessageHandler(&Scene1403::handleMessage); + + setRectList(0x004B1FF8); + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x2110A234, 0, 0)); + _palette = new Palette(_vm, 0x2110A234); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL)); + + _class401_1 = addSprite(new StaticSprite(_vm, 0x01102A33, 100)); + _class401_1->getSurface()->setVisible(false); + + _class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995)); + + _class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995)); + + _asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011); + addSprite(_asTape1); + _vm->_collisionMan->addSprite(_asTape1); + _asTape1->setRepl(64, 0); + + _asTape2 = new AsScene1201Tape(_vm, this, 16, 1100, 498, 468, 0x9048A093); + addSprite(_asTape2); + _vm->_collisionMan->addSprite(_asTape2); + _asTape2->setRepl(64, 0); + + if (which < 0) { + _klayman = new KmScene1403(_vm, this, 380, 463); + setMessageList(0x004B1F18); + } else { + _klayman = new KmScene1403(_vm, this, 640, 463); + setMessageList(0x004B1F20); + } + addSprite(_klayman); + _klayman->setRepl(64, 0); + + if (getGlobalVar(0x04A105B3) == 4) { + Class489 *class489; + class489 = new Class489(_vm, this, _klayman, 0); + _class489 = class489; + addSprite(_class489); + _vm->_collisionMan->addSprite(_class489); + if (getGlobalVar(0x04A10F33) == 4) { + _klayman->sendEntityMessage(0x1014, _class489, this); + _klayman->setX(_class489->getX() + 100); + _klayman->processDelta(); + setMessageList(0x004B1F70); + } + _class489->getSurface()->getClipRect().x1 = 0; + _class489->getSurface()->getClipRect().y1 = 0; + _class489->getSurface()->getClipRect().x2 = 640; + _class489->getSurface()->getClipRect().y2 = _class401_2->getSurface()->getDrawRect().y + _class401_2->getSurface()->getDrawRect().height; + class489->setRepl(64, 0); + } + +} + +uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x88C11390) { + setRectList(0x004B2008); + _flag = true; + } else if (param.asInteger() == 0x08821382) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setRectList(0x004B1FF8); + _flag = false; + } + break; + case 0x1019: + _parentModule->sendMessage(0x1009, 0, this); + break; + case 0x1022: + if (sender == _class489) { + if (param.asInteger() >= 1000) { + setSurfacePriority(_class401_3->getSurface(), 1100); + } else { + setSurfacePriority(_class401_3->getSurface(), 995); + } + } + break; + case 0x4807: + _class401_1->getSurface()->setVisible(false); + break; + case 0x480F: + _class401_1->getSurface()->setVisible(true); + break; + case 0x4826: + if (sender == _class489) { + if (_flag) { + setMessageList2(0x004B1FA8); + } else if (param.asInteger() == 1) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setMessageList2(0x004B1F88); + } else if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setMessageList2(0x004B1F58); + } else { + setMessageList2(0x004B1F28); + } + } else if (sender == _asTape1 || sender == _asTape2) { + if (_flag) { + setMessageList2(0x004B1FA8); + } else if (_messageListStatus != 2) { + _klayman->sendEntityMessage(0x1014, sender, this); + setMessageList2(0x004B1FB8); + } + } + break; + } + return 0; +} + +// Scene1404 + +Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _class489(NULL), _class545(NULL) { + + if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) { + setGlobalVar(0x13382860, 5); + } + + SetMessageHandler(&Scene1404::handleMessage); + _surfaceFlag = true; + + setRectList(0x004B8D80); + + _background = addBackground(new DirtyBackground(_vm, 0xAC0B006F, 0, 0)); + _palette = new Palette(_vm, 0xAC0B006F); + _palette->addPalette(0x00801510, 0, 65, 0); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL)); + + if (getGlobalVar(0x13382860) == 5) { + // TODO _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); + // TODO _vm->_collisionMan->addSprite(_class545); + } + + _sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100)); + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 14, 1100, 281, 411, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + + if (which < 0) { + _klayman = new KmScene1404(_vm, this, 376, 406); + setMessageList(0x004B8C28); + } else if (which == 1) { + _klayman = new KmScene1404(_vm, this, 376, 406); + setMessageList(0x004B8C30); + } else if (which == 2) { + if (getGlobalVar(0xC0418A02)) { + _klayman = new KmScene1404(_vm, this, 347, 406); + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmScene1404(_vm, this, 187, 406); + } + setMessageList(0x004B8D28); + } else { + _klayman = new KmScene1404(_vm, this, 30, 406); + setMessageList(0x004B8C38); + } + addSprite(_klayman); + + if (getGlobalVar(0x04A105B3) == 3) { + _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); + _vm->_collisionMan->addSprite(_class489); + if (getGlobalVar(0x04A10F33) == 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + _klayman->setX(_class489->getX() - 100); + _klayman->processDelta(); + setMessageList(0x004B8CB8); + } + _class489->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _class489->getSurface()->getClipRect().y1 = 0; + _class489->getSurface()->getClipRect().x2 = 640; + _class489->getSurface()->getClipRect().y2 = 480; + } + + _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + +} + +Scene1404::~Scene1404() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x410650C2) { + if (_class489 && _class489->getX() == 220) { + setMessageList(0x004B8C40); + } else { + setMessageList(0x004B8CE8); + } + } + break; + case 0x1019: + _parentModule->sendMessage(0x1009, 0, this); + break; + case 0x4826: + if (sender == _class489) { + if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setMessageList2(0x004B8CA0); + } else { + setMessageList2(0x004B8C40); + } + } else if (sender == _asTape && _messageListStatus != 2) { + _klayman->sendEntityMessage(0x1014, _asTape, this); + setMessageList(0x004B8CD0); + } else if (sender == _class545 && _messageListStatus != 2) { + _klayman->sendEntityMessage(0x1014, _class545, this); + setMessageList(0x004B8D18); + } + break; + } + return 0; +} + +// Scene1405 + +static const NPoint kAsScene1405TileItemPositions[] = { + {100, 80}, + {162, 78}, + {222, 76}, + {292, 76}, + {356, 82}, + {422, 84}, + {488, 86}, + {550, 90}, + {102, 134}, + {164, 132}, + {224, 136}, + {294, 136}, + {360, 136}, + {422, 138}, + {484, 144}, + {548, 146}, + { 98, 196}, + {160, 200}, + {228, 200}, + {294, 202}, + {360, 198}, + {424, 200}, + {482, 202}, + {548, 206}, + { 98, 260}, + {160, 264}, + {226, 260}, + {296, 262}, + {358, 260}, + {424, 262}, + {486, 264}, + {550, 266}, + { 94, 322}, + {160, 316}, + {226, 316}, + {296, 320}, + {358, 322}, + {422, 324}, + {488, 322}, + {550, 322}, + { 98, 380}, + {160, 376}, + {226, 376}, + {294, 378}, + {356, 380}, + {420, 380}, + {490, 378}, + {552, 376} +}; + +AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm), + _index(index), _countdown(0), _flag(false) { + + _soundResource.load(0x05308101); + // TODO _soundResource.setPan + _x = kAsScene1405TileItemPositions[_index].x; + _y = kAsScene1405TileItemPositions[_index].y; + createSurface1(0x844B805C, 1100); + _surface->setVisible(false); + if (getSubVar(0xCCE0280F, _index)) + _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; + SetUpdateHandler(&AsScene1405Tile::update); + SetMessageHandler(&AsScene1405Tile::handleMessage); + + debug("getSubVar(0x0C65F80B, _index) = %d", getSubVar(0x0C65F80B, _index)); + + setFileHash(0x844B805C, getSubVar(0x0C65F80B, _index), -1); + _newHashListIndex = (int16)getSubVar(0x0C65F80B, _index); +} + +void AsScene1405Tile::update() { + updateAnim(); + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + show(); + } +} + +uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (getSubVar(0xCCE0280F, _index) == 0 && _parentScene->getCountdown() == 0) { + show(); + _parentScene->sendMessage(0x2000, _index, this); + } + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene1405Tile::show() { + if (!_flag) { + _flag = true; + _soundResource.play(); + _surface->setVisible(true); + } +} + +void AsScene1405Tile::hide() { + if (_flag) { + _flag = false; + _soundResource.play(); + _surface->setVisible(false); + } +} + +Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm), _selectFirstTile(true), + _tilesLeft(48), _countdown(0) { + + _vm->gameModule()->initScene1405Vars(); + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x0C0C007D, 0, 0)); + _palette = new Palette(_vm, 0x0C0C007D); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse435(_vm, 0xC00790C8, 20, 620)); + + // TODO: Some debug code: Leave two matching tiles open + for (int i = 0; i < 48; i++) + setSubVar(0xCCE0280F, i, 1); + int debugIndex = 0; + setSubVar(0xCCE0280F, debugIndex, 0); + for (int i = 0; i < 48; i++) { + if (i != debugIndex && getSubVar(0x0C65F80B, i) == getSubVar(0x0C65F80B, debugIndex)) { + setSubVar(0xCCE0280F, i, 0); + break; + } + } + + for (uint32 index = 0; index < 48; index++) { + _tiles[index] = new AsScene1405Tile(_vm, this, index); + addSprite(_tiles[index]); + _vm->_collisionMan->addSprite(_tiles[index]); + if (getSubVar(0xCCE0280F, index)) + _tilesLeft--; + } + + _soundResource.load(0x68E25540); + + SetMessageHandler(&Scene1405::handleMessage); + SetUpdateHandler(&Scene1405::update); + +} + +void Scene1405::update() { + Scene::update(); + if (_countdown != 0 && (--_countdown == 0)) { + _tilesLeft = 48; + _tiles[_firstTileIndex]->hide(); + _tiles[_secondTileIndex]->hide(); + for (uint32 i = 0; i < 48; i++) { + if (getSubVar(0xCCE0280F, i)) { + _tiles[i]->hide(); + setSubVar(0xCCE0280F, i, 0); + } + } + } +} + +uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO: Debug/Cheat stuff + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x000D: + // TODO: Debug/Cheat stuff + break; + case 0x2000: + if (_selectFirstTile) { + _firstTileIndex = param.asInteger(); + _selectFirstTile = false; + } else { + _secondTileIndex = param.asInteger(); + if (_firstTileIndex != _secondTileIndex) { + _selectFirstTile = true; + if (getSubVar(0x0C65F80B, _secondTileIndex) == getSubVar(0x0C65F80B, _firstTileIndex)) { + setSubVar(0xCCE0280F, _firstTileIndex, 1); + setSubVar(0xCCE0280F, _secondTileIndex, 1); + _tilesLeft -= 2; + if (_tilesLeft == 0) { + _soundResource.play(); + } + } else { + _countdown = 10; + } + } + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 433dc413f5..72afb4f15a 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -26,6 +26,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/module1200.h" namespace Neverhood { @@ -237,6 +238,71 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// Scene1403 + +class Scene1403 : public Scene { +public: + Scene1403(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_class401_1; + Sprite *_class401_2; + Sprite *_class401_3; + AsScene1201Tape *_asTape1; + AsScene1201Tape *_asTape2; + Sprite *_class489; + bool _flag; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1404 + +class Scene1404 : public Scene { +public: + Scene1404(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1404(); +protected: + Sprite *_sprite1; + Sprite *_asTape; + Sprite *_class489; + Sprite *_class545; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1405 + +class Scene1405; + +class AsScene1405Tile : public AnimatedSprite { +public: + AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index); + void show(); + void hide(); +protected: + Scene1405 *_parentScene; + SoundResource _soundResource; + bool _flag; + uint32 _index; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1405 : public Scene { +public: + Scene1405(NeverhoodEngine *vm, Module *parentModule, int which); + int getCountdown() const { return _countdown; } +protected: + SoundResource _soundResource; + bool _selectFirstTile; + int _firstTileIndex; + int _secondTileIndex; + int _tilesLeft; + int _countdown; + AsScene1405Tile *_tiles[48]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1400_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 1f253c0a15..0db5d62c2c 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -156,8 +156,11 @@ Common::Error NeverhoodEngine::run() { #endif #if 1 + _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); + + _gameModule->startup(); // Preliminary main loop, needs some more work but works for testing while (!shouldQuit()) { @@ -181,14 +184,9 @@ Common::Error NeverhoodEngine::run() { case Common::EVENT_RBUTTONDOWN: _gameModule->handleMouseDown(event.mouse.x, event.mouse.y); break; - /* - case Common::EVENT_LBUTTONUP: - case Common::EVENT_RBUTTONUP: - break; case Common::EVENT_QUIT: _system->quit(); break; - */ default: break; } diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 86f7a0ad33..edb204c92d 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -118,6 +118,7 @@ public: #endif GameState& gameState() { return _gameState; } + GameModule *gameModule() { return _gameModule; } int16 getMouseX() const { return _mouseX; } int16 getMouseY() const { return _mouseY; } NPoint getMousePos(); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index d725cedb99..b9a464c1e9 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -505,7 +505,7 @@ void Scene::setRectList(RectList *rectList) { void Scene::clearRectList() { _rectList = NULL; - _rectType = 1; + _rectType = 0; } void Scene::loadDataResource(uint32 fileHash) { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 86165f3440..a518c39da2 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -30,7 +30,7 @@ namespace Neverhood { -#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback); debug("SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback +#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback); debug(2, "SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback #define SetFilterX(callback) _filterXCb = static_cast (callback); debug("SetFilterX(" #callback ")") #define SetFilterY(callback) _filterYCb = static_cast (callback); debug("SetFilterY(" #callback ")") -- cgit v1.2.3 From ad7c50d593594247f1669177eccb37e3ab8394ed Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 27 Jul 2011 18:02:51 +0000 Subject: NEVERHOOD: Add more tables --- devtools/create_neverhood/tables.h | 25 +++++++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 5448 -> 6210 bytes 2 files changed, 25 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 58e48dc1a4..aa70279af3 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -52,6 +52,11 @@ static const uint32 rectListOffsets[] = { // Scene1402 1, 0x004B0C48, 1, 0x004B0C98, + // Scene1403 + 1, 0x004B1FF8, + 1, 0x004B2008, + // Scene1404 + 1, 0x004B8D80, // Scene1705 1, 0x004B6B40, 1, 0x004B6B30, @@ -118,6 +123,26 @@ static const uint32 messageListOffsets[] = { 2, 0x004B0B68, 3, 0x004B0BB8, 3, 0x004B0BD0, + // Scene1403 + 1, 0x004B1F18, + 1, 0x004B1F20, + 3, 0x004B1F70, + 2, 0x004B1FA8, + 4, 0x004B1F88, + 3, 0x004B1F58, + 2, 0x004B1F28, + 2, 0x004B1FB8, + // Scene1404 + 1, 0x004B8C28, + 1, 0x004B8C30, + 1, 0x004B8C38, + 1, 0x004B8D28, + 3, 0x004B8CB8, + 2, 0x004B8C40, + 6, 0x004B8CE8, + 3, 0x004B8CA0, + 2, 0x004B8CD0, + 2, 0x004B8D18, // Scene1705 1, 0x004B69E8, 2, 0x004B6A08, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index a76db0a809..f1208577ba 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 08be9cde7b6d5dbd8632e73cc5e07820fca61bda Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 28 Jul 2011 18:27:37 +0000 Subject: NEVERHOOD: Implement Scene3010 (door lock) --- engines/neverhood/gamemodule.cpp | 7 +- engines/neverhood/module.mk | 1 + engines/neverhood/module3000.cpp | 525 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module3000.h | 121 +++++++++ 4 files changed, 653 insertions(+), 1 deletion(-) create mode 100644 engines/neverhood/module3000.cpp create mode 100644 engines/neverhood/module3000.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d4b1e7bfd5..6d9c577065 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -30,6 +30,7 @@ #include "neverhood/module1700.h" #include "neverhood/module1800.h" #include "neverhood/module2300.h" +#include "neverhood/module3000.h" namespace Neverhood { @@ -268,7 +269,11 @@ void GameModule::updateModule1200() { void GameModule::createModule1400(int which) { setGlobalVar(0x91080831, 0x00AD0012); - _childObject = new Module1400(_vm, this, which); + //_childObject = new Module1400(_vm, this, which); + + _vm->gameState().sceneNum = 9; + _childObject = new Module3000(_vm, this, -1); + SetUpdateHandler(&GameModule::updateModule1400); } diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 0b3b10c2f8..20e0bbb2c7 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -18,6 +18,7 @@ MODULE_OBJS = \ module1700.o \ module1800.o \ module2300.o \ + module3000.o \ mouse.o \ navigationscene.o \ neverhood.o \ diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp new file mode 100644 index 0000000000..b2fd80f1e9 --- /dev/null +++ b/engines/neverhood/module3000.cpp @@ -0,0 +1,525 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module3000.h" + +namespace Neverhood { + +Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _moduleDone(false), _soundVolume(0) { + + debug("Create Module3000(%d)", which); + + // TODO Sound1ChList_addSoundResources(0x81293110, dword_4B7FC8, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 1, 50, 600, 5, 150); + // TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 20000, 30000, 20000, 30000); + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + + _flag = getGlobalVar(0x10938830) != 0; + + if (_flag) { + // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); + // TODO Sound1ChList_playLooping(0x90F0D1C3); + } + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + default: + case 1: + createScene3002(-1); + break; + case 2: + createScene3003(-1); + break; + case 3: + createScene3004(-1); + break; + case 4: + createScene3005(-1); + break; + case 5: + createScene3006(-1); + break; + case 6: + createScene3007(-1); + break; + case 7: + createScene3008(-1); + break; + case 8: + createScene3009(-1); + break; + case 9: + createScene3010(-1); + break; + case 10: + createScene3011(-1); + break; + case 11: + createScene3012(-1); + break; + case 12: + createScene3013(-1); + break; + } + } else if (which == 0) { + createScene3002(0); + } else if (which == 1) { + createScene3005(2); + } else if (which == 2) { + createScene3005(1); + } else if (which == 3) { + createScene3006(1); + } + + SetMessageHandler(&Module3000::handleMessage); + +} + +Module3000::~Module3000() { + // TODO Sound1ChList_sub_407A50(0x81293110); +} + +void Module3000::createScene3002(int which) { + // TODO +} + +void Module3000::createScene3003(int which) { + // TODO +} + +void Module3000::createScene3004(int which) { + // TODO +} + +void Module3000::createScene3005(int which) { + // TODO +} + +void Module3000::createScene3006(int which) { + // TODO +} + +void Module3000::createScene3007(int which) { + // TODO +} + +void Module3000::createScene3008(int which) { + // TODO +} + +void Module3000::createScene3009(int which) { + // TODO +} + +void Module3000::createScene3010(int which) { + _vm->gameState().sceneNum = 9; + _childObject = new Scene3010(_vm, this, 0); + SetUpdateHandler(&Module3000::updateScene3010); +} + +void Module3000::createScene3011(int which) { + // TODO +} + +void Module3000::createScene3012(int which) { + // TODO +} + +void Module3000::createScene3013(int which) { + // TODO +} + +void Module3000::updateScene3010() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + } +} + +// Scene3010 + +static const uint32 kScene3010VarNameHashes[] = { + 0x304008D2, + 0x40119852, + 0x01180951 +}; + +static const uint32 kScene3010DeadBoltButtonFileHashes1[] = { + 0x301024C2, + 0x20280580, + 0x30200452 +}; + +static const uint32 kScene3010DeadBoltButtonFileHashes2[] = { + 0x50C025A8, + 0x1020A0A0, + 0x5000A7E8 +}; + +static const NPoint kAsScene3010DeadBoltPoints[] = { + {550, 307}, + {564, 415}, + {560, 514} +}; + +static const uint32 kAsScene3010DeadBoltFileHashes2[] = { + 0x181A0042, + 0x580A08F2, + 0x18420076 +}; + +static const uint32 kAsScene3010DeadBoltFileHashes1[] = { + 0x300E105A, + 0x804E0052, + 0x040E485A +}; + +SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled) + : StaticSprite(vm, 900), _parentScene(parentScene), _soundResource1(vm), + _soundResource2(vm), _soundResource3(vm), _buttonLocked(false), _countdown1(0), + _countdown2(0), _buttonIndex(buttonIndex) { + + NDimensions dimensions1, dimensions2; + + _buttonEnabled = getSubVar(0x14800353, kScene3010VarNameHashes[_buttonIndex]) != 0; + _spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); + dimensions1 = _spriteResource.getDimensions(); + _spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); + dimensions2 = _spriteResource.getDimensions(); + createSurface(400, + MAX(dimensions1.width, dimensions2.width), + MAX(dimensions1.height, dimensions2.height)); + setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); + if (initDisabled) { + disableButton(); + } else if (_buttonEnabled) { + _countdown1 = initCountdown * 12 + 1; + } + _soundResource1.load(0xF4217243); + _soundResource2.load(0x44049000); + _soundResource3.load(0x6408107E); + SetUpdateHandler(&SsScene3010DeadBoltButton::update); + SetMessageHandler(&SsScene3010DeadBoltButton::handleMessage); +} + +void SsScene3010DeadBoltButton::update() { + + if (_countdown1 != 0 && (--_countdown1 == 0)) { + _soundResource1.play(); + _surface->setVisible(false); + setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); + } + + if (_countdown2 != 0 && (--_countdown2 == 0)) { + _surface->setVisible(true); + setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); + } + +} + +uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_buttonLocked && _countdown1 == 0) { + if (_buttonEnabled) { + _soundResource2.play(); + _soundResource3.play(); + _surface->setVisible(true); + _buttonLocked = true; + _parentScene->sendMessage(0x2000, _buttonIndex, this); + } else { + _parentScene->sendMessage(0x2002, _buttonIndex, this); + } + _needRefresh = true; + StaticSprite::update(); + } + messageResult = 1; + break; + } + return messageResult; +} + +void SsScene3010DeadBoltButton::disableButton() { + _buttonLocked = true; + setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); + _surface->setVisible(true); +} + +void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { + _spriteResource.load(fileHash); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = _spriteResource.getDimensions().width; + _deltaRect.height = _spriteResource.getDimensions().height; + processDelta(); + _needRefresh = true; + StaticSprite::update(); +} + +void SsScene3010DeadBoltButton::setCountdown(int count) { + _countdown2 = count * 18 + 1; +} + +AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), + _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false), + _countdown(0) { + + _x = kAsScene3010DeadBoltPoints[_boltIndex].x; + _y = kAsScene3010DeadBoltPoints[_boltIndex].y; + + if (getSubVar(0x14800353, kScene3010VarNameHashes[_boltIndex])) { + createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); + setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + _soundResource1.load(0x46005BC4); + } else { + createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200); + setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); + _soundResource1.load(0x420073DC); + _soundResource2.load(0x420073DC); + } + + _surface->setVisible(false); + stIdle(); + if (initUnlocked) + unlock(true); + + _needRefresh = true; + AnimatedSprite::updatePosition(); + +} + +void AsScene3010DeadBolt::update() { + updateAnim(); + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + stDisabled(); + } +} + +uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void AsScene3010DeadBolt::stIdle() { + setFileHash1(); + SetUpdateHandler(&AsScene3010DeadBolt::update); + SetMessageHandler(&Sprite::handleMessage); + _locked = false; +} + +void AsScene3010DeadBolt::unlock(bool skipAnim) { + if (!_unlocked) { + _surface->setVisible(true); + if (skipAnim) { + setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); + _newHashListIndex = -2; + } else { + setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); + setCallback1(AnimationCallback(&AsScene3010DeadBolt::stIdleMessage)); + SetAnimationCallback3(&AsScene3010DeadBolt::stIdle); + _soundResource1.play(); + } + _unlocked = true; + _soundResource3.load(0x4010C345); + } +} + +void AsScene3010DeadBolt::stIdleMessage() { + setFileHash1(); + SetMessageHandler(&Sprite::handleMessage); + _parentScene->sendMessage(0x2001, _boltIndex, this); +} + +void AsScene3010DeadBolt::lock() { + if (!_locked) { + _locked = true; + _surface->setVisible(true); + setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); + SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); + setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage)); + SetAnimationCallback3(&AsScene3010DeadBolt::stIdle); + if (_soundToggle) { + _soundResource1.play(); + } else { + _soundResource2.play(); + } + _soundToggle = !_soundToggle; + } +} + +void AsScene3010DeadBolt::setCountdown(int count) { + _countdown = count * 18 + 1; +} + +void AsScene3010DeadBolt::stDisabled() { + _surface->setVisible(true); + setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); + setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage)); + SetAnimationCallback3(&AsScene3010DeadBolt::stIdle); + _playBackwards = true; + _soundResource3.play(); +} + +void AsScene3010DeadBolt::stDisabledMessage() { + _surface->setVisible(false); + _parentScene->sendMessage(0x2003, _boltIndex, this); +} + +Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm), _countdown(0), + _doorUnlocked(false), _checkUnlocked(false) { + + int initCountdown = 0; + + // DEBUG: Enable all buttons + setSubVar(0x14800353, kScene3010VarNameHashes[0], 1); + setSubVar(0x14800353, kScene3010VarNameHashes[1], 1); + setSubVar(0x14800353, kScene3010VarNameHashes[2], 1); + + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x80802626, 0, 0)); + _palette = new Palette(_vm, 0x80802626); + _palette->usePalette(); + + for (int i = 0; i < 3; i++) { + _asDeadBolts[i] = new AsScene3010DeadBolt(_vm, this, i, which == 1);//CHECKME + addSprite(_asDeadBolts[i]); + _ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME + addSprite(_ssDeadBoltButtons[i]); + _vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]); + if (getSubVar(0x14800353, kScene3010VarNameHashes[i])) + initCountdown++; + _boltUnlocking[i] = false; + _boltUnlocked[i] = false; + } + + if (which == 0) { + _mouseCursor = addSprite(new Mouse435(_vm, 0x02622800, 20, 620)); + } + + _soundResource.load(0x68E25540); + + SetMessageHandler(&Scene3010::handleMessage); + SetUpdateHandler(&Scene3010::update); + + if (which == 1) { + _checkUnlocked = true; + for (int i = 0; i < 3; i++) { + _boltUnlocked[i] = true; + _ssDeadBoltButtons[i]->setCountdown(i + 1); + _asDeadBolts[i]->setCountdown(i + 1); + } + } + +} + +void Scene3010::update() { + Scene::update(); + if (_checkUnlocked && !_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { + _countdown = 24; + _checkUnlocked = false; + } + if (_countdown != 0 && (--_countdown == 0)) { + _parentModule->sendMessage(0x1009, _doorUnlocked ? 1 : 0, this); + } +} + +uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO: Debug stuff + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) { + if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) { + _mouseCursor->getSurface()->setVisible(false); + if (!_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { + _countdown = 1; + } else { + _checkUnlocked = true; + for (int i = 0; i < 3; i++) { + _ssDeadBoltButtons[i]->setCountdown(i); + if (_boltUnlocked[i]) { + _asDeadBolts[i]->setCountdown(i); + } + } + } + } + } + break; + case 0x000D: + // TODO: Debug stuff + break; + case 0x2000: + if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) { + _asDeadBolts[param.asInteger()]->unlock(false); + _boltUnlocking[param.asInteger()] = true; + } + break; + case 0x2001: + _boltUnlocked[param.asInteger()] = true; + _boltUnlocking[param.asInteger()] = false; + if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) { + if (!getGlobalVar(0x00040153)) { + setGlobalVar(0x00040153, 1); + _soundResource.play(); + _countdown = 60; + } else { + _countdown = 48; + } + _doorUnlocked = true; + } + break; + case 0x2002: + if (!_checkUnlocked && _countdown == 0) { + _asDeadBolts[param.asInteger()]->lock(); + } + break; + case 0x2003: + _boltUnlocked[param.asInteger()] = false; + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h new file mode 100644 index 0000000000..b2375fca13 --- /dev/null +++ b/engines/neverhood/module3000.h @@ -0,0 +1,121 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE3000_H +#define NEVERHOOD_MODULE3000_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/module1200.h" + +namespace Neverhood { + +class Module3000 : public Module { +public: + Module3000(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module3000(); +protected: + bool _moduleDone; + int _moduleDoneStatus; + int _soundVolume; + bool _flag; + void createScene3002(int which); + void createScene3003(int which); + void createScene3004(int which); + void createScene3005(int which); + void createScene3006(int which); + void createScene3007(int which); + void createScene3008(int which); + void createScene3009(int which); + void createScene3010(int which); + void createScene3011(int which); + void createScene3012(int which); + void createScene3013(int which); + void updateScene3010(); +}; + +// Scene3010 + +class SsScene3010DeadBoltButton : public StaticSprite { +public: + SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled); + void setCountdown(int count); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + int _buttonIndex; + bool _buttonEnabled; + bool _buttonLocked; + int _countdown1; + int _countdown2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void disableButton(); + void setSprite(uint32 fileHash); +}; + +class AsScene3010DeadBolt : public AnimatedSprite { +public: + AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked); + void setCountdown(int count); + void lock(); + void unlock(bool skipAnim); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + int _boltIndex; + int _countdown; + bool _soundToggle; + bool _unlocked; + bool _locked; + void update(); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdle(); + void stIdleMessage(); + void stDisabled(); + void stDisabledMessage(); +}; + +class Scene3010 : public Scene { +public: + Scene3010(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource; + int _countdown; + bool _doorUnlocked; + bool _checkUnlocked; + SsScene3010DeadBoltButton *_ssDeadBoltButtons[3]; + AsScene3010DeadBolt *_asDeadBolts[3]; + bool _boltUnlocked[3]; + bool _boltUnlocking[3]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE3000_H */ -- cgit v1.2.3 From 63fe7bd18a10e2799d6c6d4566aa6655636ad637 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 29 Jul 2011 08:22:46 +0000 Subject: NEVERHOOD: Introduce and use Module::createNavigationScene and Module::createSmackerScene --- engines/neverhood/module.cpp | 14 ++++++++++++++ engines/neverhood/module.h | 2 ++ engines/neverhood/module1200.cpp | 7 +------ engines/neverhood/module1400.cpp | 1 - engines/neverhood/module1500.cpp | 8 +------- engines/neverhood/module1700.cpp | 17 ++++------------- engines/neverhood/module1800.cpp | 40 +++++++++------------------------------- engines/neverhood/module2300.cpp | 18 ++++++------------ 8 files changed, 37 insertions(+), 70 deletions(-) diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 8f0b55625a..15960e8e44 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -21,6 +21,8 @@ */ #include "neverhood/module.h" +#include "neverhood/navigationscene.h" +#include "neverhood/smackerscene.h" namespace Neverhood { @@ -70,4 +72,16 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * return 0; } +void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes) { + _childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes); +} + +void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort) { + SmackerScene *smackerScene; + smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort); + smackerScene->setFileHash(fileHash); + smackerScene->nextVideo(); + _childObject = smackerScene; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 790130a3e4..fd35f0d135 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -48,6 +48,8 @@ protected: int16 _field24, _field26, _field28; uint32 _field20; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); + void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 7a09b5f060..ff494e7ed5 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -21,7 +21,6 @@ */ #include "neverhood/module1200.h" -#include "neverhood/smackerscene.h" namespace Neverhood { @@ -81,13 +80,9 @@ void Module1200::createScene1202(int which) { } void Module1200::createScene1203(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 2; // TODO Music18hList_stop(0x62222CAE, 0, 0); - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x31890001); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x31890001, true, true, false); setGlobalVar(0x2A02C07B, 1); SetUpdateHandler(&Module1200::updateScene1203); } diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 4da5faa2ff..52e5ae73c2 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -24,7 +24,6 @@ #include "neverhood/module1000.h" #include "neverhood/diskplayerscene.h" #include "neverhood/gamemodule.h" -#include "neverhood/navigationscene.h" namespace Neverhood { diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 95b3925245..9506f8032e 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -91,19 +91,13 @@ void Module1500::createScene1502() { } void Module1500::createScene1503() { - debug("createScene1503"); - SmackerScene *smackerScene; _parentModule->sendMessage(0x0800, 0, this); _vm->gameState().sceneNum = 2; - smackerScene = new SmackerScene(_vm, this, true, true, true); - smackerScene->setFileHash(0x001A0005); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x001A0005, true, true, true); SetUpdateHandler(&Module1500::update); } void Module1500::createScene1504() { - debug("createScene1504"); _vm->gameState().sceneNum = 3; _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); SetUpdateHandler(&Module1500::update); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 3289173dfb..e6cbe62b10 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -21,7 +21,6 @@ */ #include "neverhood/module1700.h" -#include "neverhood/navigationscene.h" namespace Neverhood { @@ -67,36 +66,28 @@ Module1700::~Module1700() { } void Module1700::createScene1701(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 0; // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x3028A005); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x3028A005, true, true, false); SetUpdateHandler(&Module1700::updateScene1701); } void Module1700::createScene1702(int which) { _vm->gameState().sceneNum = 1; - _childObject = new NavigationScene(_vm, this, 0x004AE8B8, which, NULL); + createNavigationScene(0x004AE8B8, which); SetUpdateHandler(&Module1700::updateScene1702); } void Module1700::createScene1703(int which) { _vm->gameState().sceneNum = 2; - _childObject = new NavigationScene(_vm, this, 0x004AE8E8, which, NULL); + createNavigationScene(0x004AE8E8, which); SetUpdateHandler(&Module1700::updateScene1703); } void Module1700::createScene1704(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 3; // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x01190041); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x01190041, true, true, false); SetUpdateHandler(&Module1700::updateScene1701); } diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 2a4d89cead..1ce2d0f116 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -22,9 +22,6 @@ #include "neverhood/module1800.h" #include "neverhood/navigationscene.h" -#include "neverhood/smackerscene.h" - -#include "neverhood/diskplayerscene.h" namespace Neverhood { @@ -85,77 +82,58 @@ Module1800::~Module1800() { void Module1800::createScene1801(int which) { static const byte kNavigationTypes[] = {1, 0, 2, 0}; _vm->gameState().sceneNum = 0; -#if 0 - _childObject = new NavigationScene(_vm, this, 0x004AFD38, which, kNavigationTypes); -#endif - _childObject = new DiskplayerScene(_vm, this, 3); + createNavigationScene(0x004AFD38, which, kNavigationTypes); SetUpdateHandler(&Module1800::updateScene1801); } void Module1800::createScene1802(int which) { static const byte kNavigationTypes[] = {5}; _vm->gameState().sceneNum = 1; - _childObject = new NavigationScene(_vm, this, 0x004AFD98, which, kNavigationTypes); + createNavigationScene(0x004AFD98, which, kNavigationTypes); SetUpdateHandler(&Module1800::updateScene1802); } void Module1800::createScene1803(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 2; - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x006C0085); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x006C0085, true, true, false); SetUpdateHandler(&Module1800::updateScene1803); } void Module1800::createScene1804(int which) { _vm->gameState().sceneNum = 3; - _childObject = new NavigationScene(_vm, this, 0x004AFDB0, which, NULL); + createNavigationScene(0x004AFDB0, which); SetUpdateHandler(&Module1800::updateScene1804); } void Module1800::createScene1804b(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 3; - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x0A840C01); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x0A840C01, true, true, false); SetUpdateHandler(&Module1800::updateScene1803); } void Module1800::createScene1805(int which) { _vm->gameState().sceneNum = 4; - _childObject = new NavigationScene(_vm, this, 0x004AFDE0, which, NULL); + createNavigationScene(0x004AFDE0, which); SetUpdateHandler(&Module1800::updateScene1805); } void Module1800::createScene1806(int which) { _vm->gameState().sceneNum = 5; - _childObject = new NavigationScene(_vm, this, 0x004AFE40, which, NULL); + createNavigationScene(0x004AFE40, which); SetUpdateHandler(&Module1800::updateScene1806); } void Module1800::createScene1807(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 6; - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x08D84010); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x08D84010, true, true, false); SetUpdateHandler(&Module1800::updateScene1803); // TODO Sound1ChList_sub_407A50(0x04A14718); } void Module1800::createScene1808(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 7; // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0); - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x0168B121); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x0168B121, true, true, false); SetUpdateHandler(&Module1800::updateScene1803); } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 32ce2a18ba..6bd10bbf12 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -21,8 +21,6 @@ */ #include "neverhood/module2300.h" -#include "neverhood/navigationscene.h" -#include "neverhood/smackerscene.h" namespace Neverhood { @@ -84,13 +82,13 @@ Module2300::~Module2300() { void Module2300::createScene2301(int which) { _vm->gameState().sceneNum = 0; - _childObject = new NavigationScene(_vm, this, 0x004B67B8, which, NULL); + createNavigationScene(0x004B67B8, which); SetUpdateHandler(&Module2300::updateScene2301); } void Module2300::createScene2302(int which) { _vm->gameState().sceneNum = 1; - _childObject = new NavigationScene(_vm, this, 0x004B67E8, which, NULL); + createNavigationScene(0x004B67E8, which); SetUpdateHandler(&Module2300::updateScene2302); if (_flag) { _volume = 15; @@ -100,17 +98,17 @@ void Module2300::createScene2302(int which) { void Module2300::createScene2303(int which) { _vm->gameState().sceneNum = 2; - _childObject = new NavigationScene(_vm, this, 0x004B6878, which, NULL); + createNavigationScene(0x004B6878, which); SetUpdateHandler(&Module2300::updateScene2303); } void Module2300::createScene2304(int which) { _vm->gameState().sceneNum = 3; if (getGlobalVar(0x10938830)) { - _childObject = new NavigationScene(_vm, this, 0x004B68F0, which, NULL); + createNavigationScene(0x004B68F0, which); } else { // TODO Sound1ChList_setVolume(0x90F0D1C3, _volume); - _childObject = new NavigationScene(_vm, this, 0x004B68A8, which, NULL); + createNavigationScene(0x004B68A8, which); if (_flag) { _volume = 87; // TODO Sound1ChList_setVolume(0x90F0D1C3, 87); @@ -120,13 +118,9 @@ void Module2300::createScene2304(int which) { } void Module2300::createScene2305(int which) { - SmackerScene *smackerScene; _vm->gameState().sceneNum = 4; // TODO Sound1ChList_sub_4080B0(true); - smackerScene = new SmackerScene(_vm, this, true, true, false); - smackerScene->setFileHash(0x20080A0B); - smackerScene->nextVideo(); - _childObject = smackerScene; + createSmackerScene(0x20080A0B, true, true, false); SetUpdateHandler(&Module2300::updateScene2305); } -- cgit v1.2.3 From d88836596d4c12763332d300c0da2282e24f535d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 29 Jul 2011 21:12:59 +0000 Subject: NEVERHOOD: More work on Module3000 and Scene3009 (incomplete) --- engines/neverhood/gamemodule.cpp | 35 +- engines/neverhood/gamemodule.h | 1 + engines/neverhood/module.cpp | 5 + engines/neverhood/module.h | 3 + engines/neverhood/module1800.cpp | 2 +- engines/neverhood/module3000.cpp | 857 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module3000.h | 82 ++++ engines/neverhood/scene.cpp | 6 + engines/neverhood/scene.h | 1 + engines/neverhood/sprite.cpp | 2 - engines/neverhood/sprite.h | 2 +- 11 files changed, 979 insertions(+), 17 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 6d9c577065..f280399a01 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -214,12 +214,13 @@ void GameModule::startup() { // createModule1500(0); // Logos and intro video //Real // createModule1000(-1); // createModule2300(2); - _vm->gameState().sceneNum = 4; + _vm->gameState().sceneNum = 8; //createModule1200(-1); //createModule1800(-1); //createModule1700(-1); //createModule1700(1); - createModule1400(-1); + //createModule1400(-1); + createModule3000(-1); } void GameModule::createModule1000(int which) { @@ -418,7 +419,35 @@ void GameModule::createModule2400(int which) { } void GameModule::createModule3000(int which) { - error("createModule3000"); + setGlobalVar(0x91080831, 0x81293110); + _childObject = new Module3000(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule3000); +} + +void GameModule::updateModule3000() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + // TODO createModule1900(0); + // TODO _childObject->handleUpdate(); + } else if (_field20 == 2) { + // WEIRD: Sets the errorFlag + } else if (_field20 == 3) { + createModule1800(3); + _childObject->handleUpdate(); + } else if (_field20 == 4) { + // TODO createModule3000(0); + // TODO _childObject->handleUpdate(); + } else { + createModule2300(4); + _childObject->handleUpdate(); + } + } } } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index d93a7994a7..8d5aace8e4 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -67,6 +67,7 @@ protected: void updateModule2300(); void createModule2400(int which); void createModule3000(int which); + void updateModule3000(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 15960e8e44..edf67c7ea3 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -72,6 +72,11 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * return 0; } +NavigationScene *Module::navigationScene() { + // Not so nice + return (NavigationScene*)_childObject; +} + void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes) { _childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes); } diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index fd35f0d135..470fe36c98 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -36,6 +36,8 @@ namespace Neverhood { +class NavigationScene; + class Module : public Entity { public: Module(NeverhoodEngine *vm, Module *parentModule); @@ -48,6 +50,7 @@ protected: int16 _field24, _field26, _field28; uint32 _field20; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + NavigationScene *navigationScene(); void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); }; diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 1ce2d0f116..e2c88dc2b6 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -173,7 +173,7 @@ void Module1800::updateScene1801() { void Module1800::updateScene1802() { _childObject->handleUpdate(); if (_done) { - int areaType = ((NavigationScene*)_childObject)->getNavigationAreaType(); + int areaType = navigationScene()->getNavigationAreaType(); _done = false; delete _childObject; _childObject = NULL; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index b2fd80f1e9..c82c111c82 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/module3000.h" +#include "neverhood/navigationscene.h" namespace Neverhood { @@ -101,36 +102,115 @@ Module3000::~Module3000() { // TODO Sound1ChList_sub_407A50(0x81293110); } +uint32 Module3000::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1009: + _moduleDone = true; + _moduleDoneStatus = param.asInteger(); + break; + } + return messageResult; +} + void Module3000::createScene3002(int which) { - // TODO + _vm->gameState().sceneNum = 1; + if (!getGlobalVar(0x01BA1A52)) { + createNavigationScene(0x004B7C80, which); + } else if (getGlobalVar(0x10938830)) { + createNavigationScene(0x004B7CE0, which); + } else { + createNavigationScene(0x004B7CB0, which); + } + SetUpdateHandler(&Module3000::updateScene3002); +} + +void Module3000::createScene3002b(int which) { + _vm->gameState().sceneNum = 1; + if (!getGlobalVar(0x01BA1A52)) { + if (getGlobalVar(0x10938830)) { + createSmackerScene(0x00940021, true, true, false); + } else { + createSmackerScene(0x01140021, true, true, false); + } + } else { + if (getGlobalVar(0x10938830)) { + createSmackerScene(0x001011B1, true, true, false); + } else { + createSmackerScene(0x001021B1, true, true, false); + } + } + SetUpdateHandler(&Module3000::updateScene3002b); + setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1); } void Module3000::createScene3003(int which) { - // TODO + _vm->gameState().sceneNum = 2; + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + if (_flag) { + _soundVolume = 90; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 90); + } + if (getGlobalVar(0x10938830)) { + createNavigationScene(0x004B7D58, which); + } else { + createNavigationScene(0x004B7D10, which); + } + SetUpdateHandler(&Module3000::updateScene3003); } void Module3000::createScene3004(int which) { - // TODO + _vm->gameState().sceneNum = 3; + if (getGlobalVar(0x09221A62)) { + createNavigationScene(0x004B7E60, which); + } else if (getGlobalVar(0x10938830)) { + createNavigationScene(0x004B7DA0, which); + } else { + createNavigationScene(0x004B7E00, which); + } + SetUpdateHandler(&Module3000::updateScene3004); } void Module3000::createScene3005(int which) { - // TODO + _vm->gameState().sceneNum = 4; + if (getGlobalVar(0x09221A62)) { + createNavigationScene(0x004B7F20, which); + } else { + createNavigationScene(0x004B7EC0, which); + } + SetUpdateHandler(&Module3000::updateScene3005); } void Module3000::createScene3006(int which) { - // TODO + static const byte kNavigationTypes[] = {3, 0}; + _vm->gameState().sceneNum = 5; + createNavigationScene(0x004B7F80, which, kNavigationTypes); + SetUpdateHandler(&Module3000::updateScene3006); } void Module3000::createScene3007(int which) { - // TODO + static const byte kNavigationTypes[] = {5}; + _vm->gameState().sceneNum = 6; + createNavigationScene(0x004B7FB0, which, kNavigationTypes); + SetUpdateHandler(&Module3000::updateScene3007); } void Module3000::createScene3008(int which) { - // TODO + _vm->gameState().sceneNum = 6; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); + if (!getSubVar(0x40050052, 0x089809C2)) { + setSubVar(0x40050052, 0x089809C2, 1); + createSmackerScene(0x90022001, true, true, false); + } else { + createSmackerScene(0x98022001, true, true, false); + } + SetUpdateHandler(&Module3000::updateScene3002b); } void Module3000::createScene3009(int which) { - // TODO + _vm->gameState().sceneNum = 7; + _childObject = new Scene3009(_vm, this, which); + SetUpdateHandler(&Module3000::updateScene3009); } void Module3000::createScene3010(int which) { @@ -144,11 +224,260 @@ void Module3000::createScene3011(int which) { } void Module3000::createScene3012(int which) { - // TODO + _vm->gameState().sceneNum = 11; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); + if (!getSubVar(0x40050052, 0x10130993)) { + setSubVar(0x40050052, 0x10130993, 1); + createSmackerScene(0x31093019, true, true, false); + } else { + createSmackerScene(0x20093019, true, true, false); + } + SetUpdateHandler(&Module3000::updateScene3002b); } void Module3000::createScene3013(int which) { - // TODO + _vm->gameState().sceneNum = 12; + _childObject = new Scene3010(_vm, this, 1); + SetUpdateHandler(&Module3000::updateScene3002b); +} + +void Module3000::updateScene3002() { + _childObject->handleUpdate(); +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (navigationIndex == 1) { + if (frameNumber == 0) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } else if (frameNumber == 100) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 0) { + if (frameNumber == 0) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } else if (frameNumber == 10) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + } + } + } +#endif + if (_moduleDone) { + int areaType = navigationScene()->getNavigationAreaType(); + _moduleDone = false; + delete _childObject; + _childObject = NULL; + if (!getGlobalVar(0x01BA1A52)) { + if (_moduleDoneStatus == 0) { + createScene3010(-1); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 1) { + _parentModule->sendMessage(0x1009, 0, this); + } + } else { + if (_moduleDoneStatus == 0) { + if (areaType == 2) { + createScene3003(0); + _childObject->handleUpdate(); + } else { + //createScene3002b(-1); + _childObject->handleUpdate(); + } + } else if (_moduleDoneStatus == 1) { + _parentModule->sendMessage(0x1009, 0, this); + } + } + } +} + +void Module3000::updateScene3002b() { + _childObject->handleUpdate(); + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + switch (_vm->gameState().sceneNum) { + case 1: + if (getGlobalVar(0x01BA1A52)) { + createScene3002(0); + _childObject->handleUpdate(); + } else { + createScene3013(-1); + _childObject->handleUpdate(); + } + break; + case 7: + case 8: + createScene3009(-1); + break; + case 11: + _parentModule->sendMessage(0x1009, 3, this); + break; + case 12: + createScene3002(0); + _childObject->handleUpdate(); + break; + default: + createScene3006(0); + break; + } + } +} + +void Module3000::updateScene3003() { + _childObject->handleUpdate(); +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (_flag && _soundVolume > 1 && frameNumber % 2) { + _soundVolume--; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + } + if (navigationIndex == 0) { + if (frameNumber == 35) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 1) { + if (frameNumber == 55) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } + } + } +#endif + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + if (_flag) { + _soundVolume = 0; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); + } + if (_moduleDoneStatus == 0) { + createScene3004(0); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 1) { + setGlobalVar(0x01BA1A52, 0); + createScene3002(1); + _childObject->handleUpdate(); + } + } +} + +void Module3000::updateScene3004() { + _childObject->handleUpdate(); +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (navigationIndex == 2) { + if (frameNumber == 40) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + } + } + } +#endif + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + if (_moduleDoneStatus == 1) { + createScene3005(0); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 3) { + createScene3011(-1); + _childObject->handleUpdate(); + } else if (getGlobalVar(0x09221A62)) { + createScene3006(0); + _childObject->handleUpdate(); + } else { + createScene3003(1); + _childObject->handleUpdate(); + } + } +} + +void Module3000::updateScene3005() { + _childObject->handleUpdate(); + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + if (_moduleDoneStatus == 0) { + _parentModule->sendMessage(0x1009, 1, this); + } else if (_moduleDoneStatus == 1) { + createScene3008(-1); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 2) { + createScene3004(3); + _childObject->handleUpdate(); + } + } + // NOTE: Skipped resource preloading stuff +} + +void Module3000::updateScene3006() { + _childObject->handleUpdate(); +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { + // TODO Sound1ChList_sub_4080B0(false); + } +#endif + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + if (_moduleDoneStatus == 0) { + createScene3007(0); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 1) { + createScene3004(0); + _childObject->handleUpdate(); + } + } +} + +void Module3000::updateScene3007() { + _childObject->handleUpdate(); + if (_moduleDone) { + int areaType = navigationScene()->getNavigationAreaType(); + _moduleDone = false; + delete _childObject; + _childObject = NULL; + if (areaType == 4) { + createScene3012(-1); + _childObject->handleUpdate(); + } else { + createSmackerScene(0x080810C5, true, true, false); + SetUpdateHandler(&Module3000::updateScene3002b); + } + } +} + +void Module3000::updateScene3009() { + _childObject->handleUpdate(); + // TODO... } void Module3000::updateScene3010() { @@ -157,9 +486,517 @@ void Module3000::updateScene3010() { _done = false; delete _childObject; _childObject = NULL; + if (_moduleDoneStatus == 0 || _moduleDoneStatus == 2) { + createScene3002(0); + _childObject->handleUpdate(); + } else if (_moduleDoneStatus == 1) { + createScene3002b(-1); + _childObject->handleUpdate(); + } } } +// Scene3009 + +static const uint32 kScene3009SmackerFileHashes[] = { + 0x1010000D, + 0x340A0049, + 0x340A0049, + 0x0282081D, + 0x0082080D, + 0x0882080D, + 0x0882080D, + 0x0282081D, + 0x004B000B, + 0x014B000B, + 0x044B000B, + 0x0282081D, + 0x0282081D, + 0x0282081D, + 0x340A0049 +}; + +static const uint32 kScene3009VarValues[] = { + 0x00000000, + 0x8004001B, + 0x0004001A, + 0x1048404B, + 0x50200109, + 0x12032109, + 0x10201109, + 0x000A2030, + 0x000A0028, + 0x000A0028, + 0x000A0028, + 0x040A1069, + 0x040A1069, + 0x040A1069, + 0x240A1101 +}; + +static const uint32 kClass439FileHashes[] = { + 0x618827A0, + 0xB1A92322 +}; + +static const uint32 kClass440FileHashes[] = { + 0x4011018C, + 0x15086623 +}; + +static const NPoint kClass524Points[] = { + {289, 338}, + {285, 375}, + {284, 419}, + {456, 372}, + {498, 372}, + {541, 372} +}; + +static const uint32 kClass524FileHashes[] = { + 0x24542582, + 0x1CD61D96 +}; + +static const uint32 kClass441FileHashes1[] = { + 0x24016060, + 0x21216221, + 0x486160A0, + 0x42216422, + 0x90A16120, + 0x84216824, + 0x08017029, + 0x08217029, + 0x10014032, + 0x10214032, + 0x20012004, + 0x20212004 +}; + +static const uint32 kClass441FileHashes2[] = { + 0x40092024, + 0x01636002, + 0x8071E028, + 0x02A56064, + 0x00806031, + 0x052960A8, + 0x0A116130, + 0x0A316130, + 0x14216200, + 0x14016200, + 0x28416460, + 0x28616460 +}; + +Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene) + : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), + _flag1(false) { + + _spriteResource.load2(0x120B24B0); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = _spriteResource.getDimensions().width; + _deltaRect.height = _spriteResource.getDimensions().height; + _surface->setVisible(false); + processDelta(); + _needRefresh = true; + SetUpdateHandler(&Class438::update); + SetMessageHandler(&Class438::handleMessage); + _soundResource.load(0x3901B44F); +} + +void Class438::update() { + StaticSprite::update(); + if (_flag1 && !_soundResource.isPlaying()) { + _parentScene->sendMessage(0x2000, 0, this); + _surface->setVisible(false); + } +} + +uint32 Class438::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_flag1 && !_parentScene->sub462E90()) { + _flag1 = true; + _surface->setVisible(true); + _soundResource.play(); + } + messageResult = 1; + break; + } + return messageResult; +} + +Class439::Class439(NeverhoodEngine *vm, int index) + : StaticSprite(vm, 1400), _blinkCountdown(0) { + + _spriteResource.load2(kClass439FileHashes[index]); + createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _needRefresh = true; + if (getGlobalVar(0x0C0288F4)) { + hide(); + } else { + startBlinking(); + } + SetUpdateHandler(&Class439::update); +} + +void Class439::update() { + if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) { + if (_blinkToggle) { + _surface->setVisible(true); + } else { + _surface->setVisible(false); + } + StaticSprite::update(); + _blinkCountdown = 3; + _blinkToggle = !_blinkToggle; + } +} + +void Class439::show() { + _surface->setVisible(true); + StaticSprite::update(); + _blinkCountdown = 0; +} + +void Class439::hide() { + _surface->setVisible(false); + StaticSprite::update(); + _blinkCountdown = 0; +} + +void Class439::startBlinking() { + _surface->setVisible(true); + StaticSprite::update(); + _blinkCountdown = 3; + _blinkToggle = true; +} + +Class440::Class440(NeverhoodEngine *vm, int index) + : StaticSprite(vm, 1400) { + + _spriteResource.load2(kClass440FileHashes[index]); + createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _surface->setVisible(false); + _needRefresh = true; +} + +Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index) + : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { + + _x = 300; + _y = getGlobalVar(0x000809C2) ? 52 : 266; + createSurface1(0xC2463913, 1200); + _needRefresh = true; + updatePosition(); + _surface->setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class522::handleMessage); +} + +void Class522::show() { + setFileHash(0xC2463913, 0, -1); + _surface->setVisible(true); + updatePosition(); + _enabled = true; +} + +uint32 Class522::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_enabled) { + _parentScene->sendMessage(0x2002, 0, this); + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _flag1(false), _flag2(false), + _flag3(false), _flag4(false), _countdown1(1), _countdown2(1) { + + _varValue = getGlobalVar(0x20580A86); + + // TODO _vm->gameModule()->initScene3009Vars(); + + setGlobalVar(0xF0402B0A, 0); + _surfaceFlag = true; + + _vm->_screen->clear(); + + _background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0)); + _palette = new Palette(_vm, 0xD000420C); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620)); + + _class438 = addSprite(new Class438(_vm, this)); + _vm->_collisionMan->addSprite(_class438); + + _class522 = new Class522(_vm, this, _varValue); + addSprite(_class522); + _vm->_collisionMan->addSprite(_class522); + +#if 0 + _class523 = new Class523(_vm, this, _varValue); + addSprite(_class523); + _vm->_collisionMan->addSprite(_class523); +#endif + + if (_varValue != 0 && _varValue != 8 && _varValue != 9 && _varValue != 9) { + _flag1 = true; + } else { + _flag1 = false; + if (_varValue == 0) { +#if 0 + _class523->stMoveUp(); +#endif + _flag4 = true; + } + } + + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_varValue], false, _flag1)); + _smackerPlayer->setDrawPos(89, 37); + + addSprite(new StaticSprite(_vm, 0x8540252C, 400)); + + for (int i = 0; i < 2; i++) { + _class439Array[i] = new Class439(_vm, i); + addSprite(_class439Array[i]); + _class440Array[i] = new Class440(_vm, i); + addSprite(_class440Array[i]); + } + + +#if 0 + for (int i = 0; i < 6; i++) { + _class524Array[i] = new Class524(_vm, this, i); + addSprite(_class524Array[i]); + if (i < 3) + _varValueArray[i] = getSubVar(0x00504B86, i); + else + _varValueArray[i] = getSubVar(0x0A4C0A9A, i - 3); + } +#endif + + SetMessageHandler(&Scene3009::handleMessage); + SetUpdateHandler(&Scene3009::update); +} + +void Scene3009::update() { + Scene::update(); + if (!_flag1 && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _varValue <= 14) { + switch (_varValue) { + case 0: + case 14: + _smackerPlayer->open(0x340A0049, true); + _palette->usePalette(); + _flag1 = true; + break; + case 8: + _smackerPlayer->open(0x0082080D, true); + _palette->usePalette(); + _flag1 = true; + _flag4 = false; + break; + case 9: + _smackerPlayer->open(0x0282080D, true); + _palette->usePalette(); + _flag1 = true; + _flag4 = false; + break; + case 10: + _smackerPlayer->open(0x0882080D, true); + _palette->usePalette(); + _flag1 = true; + _flag4 = false; + break; + case 11: + case 12: + case 13: + if (_flag2) { + if (_varValue == 11) + _smackerPlayer->open(0x110A000F, false); + else if (_varValue == 12) + _smackerPlayer->open(0x500B004F, false); + else if (_varValue == 13) + _smackerPlayer->open(0x100B010E, false); + _palette->usePalette(); + _flag2 = false; +#if 0 + _class523->stMoveDown(); +#endif + } else { + sub462DC0(); + } + break; + } + } + + if (_countdown1 != 0 && (--_countdown1 == 0) && sub462E10()) { +#if 0 + for (int i = 0; i < 3; i++) + _class524Array[i]->hide(); +#endif + if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) { + _class439Array[0]->show(); + _class440Array[0]->getSurface()->setVisible(true); + // TODO _class440Array->StaticSprite_update + _class522->show(); + } + } + + if (_countdown2 != 0 && (--_countdown2 == 0) && sub462E50()) { +#if 0 + for (int i = 0; i < 6; i++) + _class524Array[i]->hide(); +#endif + if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) { + _class439Array[1]->show(); + _class440Array[1]->getSurface()->setVisible(true); +#if 0 + // TODO _class440Array[1]->StaticSprite_update + _class523->show(); +#endif + } + } + +} + +uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO: Debug stuff + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) { + setGlobalVar(0x20580A86, 0); + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x000D: + // TODO: Debug stuff + break; + case 0x2000: + if (!getGlobalVar(0x000809C2)) { + if (!getGlobalVar(0x10938830)) { + _varValue = 1; + setGlobalVar(0x10938830, 1); + } else { + _varValue = 2; + } + } else if (!getGlobalVar(0x9040018A)) { + _varValue = 3; + } else if (!getGlobalVar(0x610210B7)) { + _varValue = 4; + } else if (!getGlobalVar(0x0C0288F4)) { + setGlobalVar(0x0C0288F4, 1); + _varValue = 5; + } else { + _varValue = 6; + } + sub462DC0(); + break; + case 0x2001: + _countdown1 = 24; + break; + case 0x2002: + if (!getGlobalVar(0x9040018A) && !_flag4) { + if (getGlobalVar(0x000809C2)) { + _varValue = 14; + setGlobalVar(0x000809C2, 0); + } else { + _varValue = 7; + setGlobalVar(0x000809C2, 1); + } + sub462DC0(); + } + break; + case 0x2003: + _countdown2 = 24; + break; + case 0x2004: + if (getGlobalVar(0x000809C2)) { + if (!getGlobalVar(0x9040018A)) { + if (!getGlobalVar(0x610210B7)) { + _varValue = 8; + } else { + if (!getGlobalVar(0x0C0288F4)) { + _varValue = 9; + } else { + _varValue = 10; + } + } + setGlobalVar(0x9040018A, 1); + _flag4 = true; + sub462DC0(); + } else if (!getGlobalVar(0x610210B7)) { + _varValue = 11; + _smackerPlayer->open(0x108A000F, false); + } else if (!getGlobalVar(0x0C0288F4)) { + _varValue = 12; + _smackerPlayer->open(0x500B002F, false); + } else { + _varValue = 13; + _smackerPlayer->open(0x100B008E, false); + } + _palette->usePalette(); + _flag2 = true; + _flag4 = true; + _flag1 = false; + setGlobalVar(0x9040018A, 0); + } + break; + } + return 0; +} + +void Scene3009::sub462DC0() { + setGlobalVar(0x20580A86, _varValue); + setGlobalVar(0xF0402B0A, kScene3009VarValues[_varValue]); + _parentModule->sendMessage(0x1009, 1, this); +} + +bool Scene3009::sub462E10() { + for (int i = 0; i < 3; i++) + if (_varValueArray[i] != getSubVar(0x00000914, i)) + return false; + return true; +} + +bool Scene3009::sub462E50() { + for (int i = 0; i < 6; i++) + if (_varValueArray[i] != getSubVar(0x00000914, i)) + return false; + return true; +} + +bool Scene3009::sub462E90() { + return _flag3 || _flag4; +} + // Scene3010 static const uint32 kScene3010VarNameHashes[] = { diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index b2375fca13..9bda5db2af 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -39,7 +39,9 @@ protected: int _moduleDoneStatus; int _soundVolume; bool _flag; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createScene3002(int which); + void createScene3002b(int which); void createScene3003(int which); void createScene3004(int which); void createScene3005(int which); @@ -51,9 +53,89 @@ protected: void createScene3011(int which); void createScene3012(int which); void createScene3013(int which); + void updateScene3002(); + void updateScene3002b(); + void updateScene3003(); + void updateScene3004(); + void updateScene3005(); + void updateScene3006(); + void updateScene3007(); + void updateScene3009(); void updateScene3010(); }; +// Scene3009 + +class Scene3009; + +class Class438 : public StaticSprite { +public: + Class438(NeverhoodEngine *vm, Scene3009 *parentScene); +protected: + Scene3009 *_parentScene; + SoundResource _soundResource; + bool _flag1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Class439 : public StaticSprite { +public: + Class439(NeverhoodEngine *vm, int index); + void show(); + void hide(); + void startBlinking(); +protected: + int _blinkCountdown; + bool _blinkToggle; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Class440 : public StaticSprite { +public: + Class440(NeverhoodEngine *vm, int index); +}; + +class Class522 : public AnimatedSprite { +public: + Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index); + void show(); +protected: + Scene3009 *_parentScene; + bool _enabled; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene3009 : public Scene { +public: + Scene3009(NeverhoodEngine *vm, Module *parentModule, int which); + bool sub462E90(); +protected: + int _countdown1; + int _countdown2; + SmackerPlayer *_smackerPlayer; + Sprite *_class438; + Class439 *_class439Array[2]; + Class440 *_class440Array[2]; + Class522 *_class522; +#if 0 + Class523 *_class523; + Class524 *_class524Array[6]; +#endif + uint32 _varValue; + uint32 _varValueArray[6]; + bool _flag1; + bool _flag2; + bool _flag3; + bool _flag4; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub462DC0(); + bool sub462E10(); + bool sub462E50(); +}; + // Scene3010 class SsScene3010DeadBoltButton : public StaticSprite { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index b9a464c1e9..2c6b10ef4b 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -179,6 +179,12 @@ Background *Scene::addBackground(Background *background) { return background; } +SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) { + addEntity(smackerPlayer); + addSurface(smackerPlayer->getSurface()); + return smackerPlayer; +} + void Scene::update() { if (_smkFileHash != 0) { diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 65326c310f..ab5cf9f90e 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -50,6 +50,7 @@ public: void setSurfacePriority(BaseSurface *surface, int priority); void deleteSprite(Sprite **sprite); Background *addBackground(Background *background); + SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); protected: Module *_parentModule; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index ee6e7aa942..deb54af8e1 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -140,8 +140,6 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, _x = x == kDefPosition ? _spriteResource.getPosition().x : x; _y = y == kDefPosition ? _spriteResource.getPosition().y : y; - debug("StaticSprite::init() final: x = %d; y = %d", _x, _y); - _drawRect.x = 0; _drawRect.y = 0; _drawRect.width = width; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index a518c39da2..7ec5d9124a 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -96,7 +96,7 @@ public: void update(); protected: SpriteResource _spriteResource; - void init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height); + void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); }; #define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback -- cgit v1.2.3 From 87d1f79f311f25ea434680caff508614a5c892d9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 2 Aug 2011 10:56:16 +0000 Subject: NEVERHOOD: More work on Scene3009 --- engines/neverhood/gamemodule.cpp | 20 +- engines/neverhood/gamemodule.h | 1 + engines/neverhood/module3000.cpp | 487 +++++++++++++++++++++++++----------- engines/neverhood/module3000.h | 91 +++++-- engines/neverhood/neverhood.cpp | 2 +- engines/neverhood/smackerplayer.cpp | 80 +++--- engines/neverhood/smackerplayer.h | 3 + 7 files changed, 483 insertions(+), 201 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index f280399a01..c1ee6dda15 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -45,8 +45,6 @@ GameModule::GameModule(NeverhoodEngine *vm) SetMessageHandler(&GameModule::handleMessage); - //startup(); - } GameModule::~GameModule() { @@ -183,6 +181,16 @@ void GameModule::initScene1405Vars() { } +void GameModule::initScene3009Vars() { + if (!getSubVar(0x40050052, 0x8C9819C2)) { + for (int i = 0; i < 3; i++) { + setSubVar(0x00504B86, i, _vm->_rnd->getRandomNumber(12 - 1)); + setSubVar(0x0A4C0A9A, i, _vm->_rnd->getRandomNumber(12 - 1)); + } + setSubVar(0x40050052, 0x8C9819C2, 1); + } +} + uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -214,13 +222,19 @@ void GameModule::startup() { // createModule1500(0); // Logos and intro video //Real // createModule1000(-1); // createModule2300(2); - _vm->gameState().sceneNum = 8; //createModule1200(-1); //createModule1800(-1); //createModule1700(-1); //createModule1700(1); //createModule1400(-1); +#if 1 + _vm->gameState().sceneNum = 8; createModule3000(-1); +#endif +#if 0 + _vm->gameState().sceneNum = 0; + createModule1800(-1); +#endif } void GameModule::createModule1000(int which) { diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 8d5aace8e4..6290a85209 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -38,6 +38,7 @@ public: void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); void initScene1405Vars(); + void initScene3009Vars(); protected: Entity *_prevChildObject; bool _someFlag1; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index c82c111c82..45db8adc7e 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/module3000.h" +#include "neverhood/gamemodule.h" #include "neverhood/navigationscene.h" namespace Neverhood { @@ -37,7 +38,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); - _flag = getGlobalVar(0x10938830) != 0; + _flag = getGlobalVar(0x10938830) != 0; if (_flag) { // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); @@ -196,7 +197,7 @@ void Module3000::createScene3007(int which) { } void Module3000::createScene3008(int which) { - _vm->gameState().sceneNum = 6; + _vm->gameState().sceneNum = 7; // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); if (!getSubVar(0x40050052, 0x089809C2)) { setSubVar(0x40050052, 0x089809C2, 1); @@ -208,7 +209,7 @@ void Module3000::createScene3008(int which) { } void Module3000::createScene3009(int which) { - _vm->gameState().sceneNum = 7; + _vm->gameState().sceneNum = 8; _childObject = new Scene3009(_vm, this, which); SetUpdateHandler(&Module3000::updateScene3009); } @@ -478,6 +479,24 @@ void Module3000::updateScene3007() { void Module3000::updateScene3009() { _childObject->handleUpdate(); // TODO... + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + _flag = getGlobalVar(0x10938830); // CHECKME + if (_moduleDoneStatus != 1) { + // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0): + createScene3005(1); + _childObject->handleUpdate(); + } else if (getGlobalVar(0xF0402B0A)) { + createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false); + SetUpdateHandler(&Module3000::updateScene3002b); + } else { + // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0); + createScene3005(1); + _childObject->handleUpdate(); + } + } } void Module3000::updateScene3010() { @@ -516,7 +535,7 @@ static const uint32 kScene3009SmackerFileHashes[] = { 0x340A0049 }; -static const uint32 kScene3009VarValues[] = { +static const uint32 kScene3009CannonLocationFileHashes[] = { 0x00000000, 0x8004001B, 0x0004001A, @@ -534,17 +553,17 @@ static const uint32 kScene3009VarValues[] = { 0x240A1101 }; -static const uint32 kClass439FileHashes[] = { +static const uint32 kSsScene3009SymbolEdgesFileHashes[] = { 0x618827A0, 0xB1A92322 }; -static const uint32 kClass440FileHashes[] = { +static const uint32 kSsScene3009TargetLineFileHashes[] = { 0x4011018C, 0x15086623 }; -static const NPoint kClass524Points[] = { +static const NPoint kAsScene3009SymbolPoints[] = { {289, 338}, {285, 375}, {284, 419}, @@ -553,12 +572,12 @@ static const NPoint kClass524Points[] = { {541, 372} }; -static const uint32 kClass524FileHashes[] = { +static const uint32 kAsScene3009SymbolFileHashes[] = { 0x24542582, 0x1CD61D96 }; -static const uint32 kClass441FileHashes1[] = { +static const uint32 kSsScene3009SymbolArrowFileHashes1[] = { 0x24016060, 0x21216221, 0x486160A0, @@ -573,7 +592,7 @@ static const uint32 kClass441FileHashes1[] = { 0x20212004 }; -static const uint32 kClass441FileHashes2[] = { +static const uint32 kSsScene3009SymbolArrowFileHashes2[] = { 0x40092024, 0x01636002, 0x8071E028, @@ -588,7 +607,7 @@ static const uint32 kClass441FileHashes2[] = { 0x28616460 }; -Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene) +SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene) : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _flag1(false) { @@ -607,12 +626,12 @@ Class438::Class438(NeverhoodEngine *vm, Scene3009 *parentScene) _surface->setVisible(false); processDelta(); _needRefresh = true; - SetUpdateHandler(&Class438::update); - SetMessageHandler(&Class438::handleMessage); + SetUpdateHandler(&SsScene3009FireCannonButton::update); + SetMessageHandler(&SsScene3009FireCannonButton::handleMessage); _soundResource.load(0x3901B44F); } -void Class438::update() { +void SsScene3009FireCannonButton::update() { StaticSprite::update(); if (_flag1 && !_soundResource.isPlaying()) { _parentScene->sendMessage(0x2000, 0, this); @@ -620,7 +639,7 @@ void Class438::update() { } } -uint32 Class438::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -635,10 +654,10 @@ uint32 Class438::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -Class439::Class439(NeverhoodEngine *vm, int index) +SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) : StaticSprite(vm, 1400), _blinkCountdown(0) { - _spriteResource.load2(kClass439FileHashes[index]); + _spriteResource.load2(kSsScene3009SymbolEdgesFileHashes[index]); createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; @@ -652,10 +671,10 @@ Class439::Class439(NeverhoodEngine *vm, int index) } else { startBlinking(); } - SetUpdateHandler(&Class439::update); + SetUpdateHandler(&SsScene3009SymbolEdges::update); } -void Class439::update() { +void SsScene3009SymbolEdges::update() { if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) { if (_blinkToggle) { _surface->setVisible(true); @@ -668,29 +687,29 @@ void Class439::update() { } } -void Class439::show() { +void SsScene3009SymbolEdges::show() { _surface->setVisible(true); StaticSprite::update(); _blinkCountdown = 0; } -void Class439::hide() { +void SsScene3009SymbolEdges::hide() { _surface->setVisible(false); StaticSprite::update(); _blinkCountdown = 0; } -void Class439::startBlinking() { +void SsScene3009SymbolEdges::startBlinking() { _surface->setVisible(true); StaticSprite::update(); _blinkCountdown = 3; _blinkToggle = true; } -Class440::Class440(NeverhoodEngine *vm, int index) +SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) : StaticSprite(vm, 1400) { - _spriteResource.load2(kClass440FileHashes[index]); + _spriteResource.load2(kSsScene3009TargetLineFileHashes[index]); createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; @@ -702,7 +721,72 @@ Class440::Class440(NeverhoodEngine *vm, int index) _needRefresh = true; } -Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index) +void SsScene3009TargetLine::show() { + _surface->setVisible(true); + StaticSprite::update(); +} + +SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index) + : StaticSprite(vm, 1400), _soundResource(vm), _asSymbol(asSymbol), + _index(index), _enabled(true), _countdown(0) { + + _incrDecr = _index % 2; + + _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]); + createSurface(1200, 33, 31); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = 33; + _drawRect.height = 31; + _deltaRect = _drawRect; + processDelta(); + _needRefresh = true; + SetUpdateHandler(&SsScene3009SymbolArrow::update); + SetMessageHandler(&SsScene3009SymbolArrow::handleMessage); + _soundResource.load(0x2C852206); +} + +void SsScene3009SymbolArrow::hide() { + _enabled = false; + _surface->setVisible(false); +} + +void SsScene3009SymbolArrow::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown == 0)) { + _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]); + _needRefresh = true; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + } +} + +uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_enabled && _countdown == 0) { + _countdown = 2; + _spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]); + _needRefresh = true; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _soundResource.play(); + _asSymbol->sendMessage(0x2005, _incrDecr, this); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index) : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { _x = 300; @@ -712,17 +796,17 @@ Class522::Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index) updatePosition(); _surface->setVisible(false); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class522::handleMessage); + SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage); } -void Class522::show() { +void AsScene3009VerticalIndicator::show() { setFileHash(0xC2463913, 0, -1); _surface->setVisible(true); updatePosition(); _enabled = true; } -uint32 Class522::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -735,13 +819,136 @@ uint32 Class522::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag1(false), _flag2(false), - _flag3(false), _flag4(false), _countdown1(1), _countdown2(1) { +AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue) + : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { + + _x = getGlobalVar(0x9040018A) ? 533 : 92; + _y = 150; + createSurface1(0xC0C12954, 1200); + _needRefresh = true; + updatePosition(); + _surface->setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage); + if (varValue == 8 || varValue == 9 || varValue == 10) { + SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight); + _x = 280; + } +} + +uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_enabled) { + _parentScene->sendMessage(0x2004, 0, this); + } + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene3009HorizontalIndicator::suMoveLeft() { + _x -= 6; + if (_x < 92) { + SetSpriteCallback(NULL); + _x = 92; + } +} + +void AsScene3009HorizontalIndicator::suMoveRight() { + _x += 6; + if (_x > 533) { + SetSpriteCallback(NULL); + _x = 533; + } +} + +void AsScene3009HorizontalIndicator::show() { + setFileHash(0xC0C12954, 0, -1); + _surface->setVisible(true); + updatePosition(); + _enabled = true; +} + +void AsScene3009HorizontalIndicator::stMoveLeft() { + _x = 533; + SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveLeft); +} + +void AsScene3009HorizontalIndicator::stMoveRight() { + _x = 330; + SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight); +} + +AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) { + + _symbolIndex = getSubVar(0x00000914, _index); - _varValue = getGlobalVar(0x20580A86); + _x = kAsScene3009SymbolPoints[_index].x; + _y = kAsScene3009SymbolPoints[_index].y; + createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200); + setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); + _newHashListIndex = _symbolIndex; + _needRefresh = true; + updatePosition(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene3009Symbol::handleMessage); + + _ssArrowPrev = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 0); + _parentScene->addSprite(_ssArrowPrev); + _vm->_collisionMan->addSprite(_ssArrowPrev); + + _ssArrowNext = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 1); + _parentScene->addSprite(_ssArrowNext); + _vm->_collisionMan->addSprite(_ssArrowNext); + +} + +uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (param.asInteger()) { + if (_symbolIndex == 11) + _symbolIndex = 0; + else + _symbolIndex++; + } else { + if (_symbolIndex == 0) + _symbolIndex = 11; + else + _symbolIndex--; + } + setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); + _newHashListIndex = _symbolIndex; + setSubVar(0x00000914, _index, _symbolIndex); + if (_index / 3 == 0) { + _parentScene->sendMessage(0x2001, 0, this); + } else { + _parentScene->sendMessage(0x2003, 0, this); + } + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene3009Symbol::hide() { + _ssArrowPrev->hide(); + _ssArrowNext->hide(); +} + +Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _keepVideo(false), _flag2(false), + /*_flag3(false), */_flag4(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { + + _cannonLocation = getGlobalVar(0x20580A86); + debug("_cannonLocation = %d", _cannonLocation); - // TODO _vm->gameModule()->initScene3009Vars(); + _vm->gameModule()->initScene3009Vars(); setGlobalVar(0xF0402B0A, 0); _surfaceFlag = true; @@ -750,137 +957,129 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0)); _palette = new Palette(_vm, 0xD000420C); - _palette->usePalette(); _mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620)); - _class438 = addSprite(new Class438(_vm, this)); - _vm->_collisionMan->addSprite(_class438); + _ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this)); + _vm->_collisionMan->addSprite(_ssFireCannonButton); - _class522 = new Class522(_vm, this, _varValue); - addSprite(_class522); - _vm->_collisionMan->addSprite(_class522); + _asVerticalIndicator = new AsScene3009VerticalIndicator(_vm, this, _cannonLocation); + addSprite(_asVerticalIndicator); + _vm->_collisionMan->addSprite(_asVerticalIndicator); -#if 0 - _class523 = new Class523(_vm, this, _varValue); - addSprite(_class523); - _vm->_collisionMan->addSprite(_class523); -#endif + _asHorizontalIndicator = new AsScene3009HorizontalIndicator(_vm, this, _cannonLocation); + addSprite(_asHorizontalIndicator); + _vm->_collisionMan->addSprite(_asHorizontalIndicator); - if (_varValue != 0 && _varValue != 8 && _varValue != 9 && _varValue != 9) { - _flag1 = true; + if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) { + _keepVideo = true; } else { - _flag1 = false; - if (_varValue == 0) { -#if 0 - _class523->stMoveUp(); -#endif + _keepVideo = false; + if (_cannonLocation != 0) { + _asHorizontalIndicator->stMoveRight(); _flag4 = true; } } - _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_varValue], false, _flag1)); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo)); _smackerPlayer->setDrawPos(89, 37); + _palette->usePalette(); addSprite(new StaticSprite(_vm, 0x8540252C, 400)); for (int i = 0; i < 2; i++) { - _class439Array[i] = new Class439(_vm, i); - addSprite(_class439Array[i]); - _class440Array[i] = new Class440(_vm, i); - addSprite(_class440Array[i]); + _ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i); + addSprite(_ssSymbolEdges[i]); + _ssTargetLines[i] = new SsScene3009TargetLine(_vm, i); + addSprite(_ssTargetLines[i]); } -#if 0 for (int i = 0; i < 6; i++) { - _class524Array[i] = new Class524(_vm, this, i); - addSprite(_class524Array[i]); + _asSymbols[i] = new AsScene3009Symbol(_vm, this, i); + addSprite(_asSymbols[i]); if (i < 3) - _varValueArray[i] = getSubVar(0x00504B86, i); + _correctSymbols[i] = getSubVar(0x00504B86, i); else - _varValueArray[i] = getSubVar(0x0A4C0A9A, i - 3); + _correctSymbols[i] = getSubVar(0x0A4C0A9A, i - 3); } -#endif SetMessageHandler(&Scene3009::handleMessage); SetUpdateHandler(&Scene3009::update); + + // DEBUG: Set the correct code + for (int i = 0; i < 6; i++) + setSubVar(0x00000914, i, _correctSymbols[i]); + sendMessage(0x2003, 0, this); + //setGlobalVar(0x610210B7, 1); + } void Scene3009::update() { Scene::update(); - if (!_flag1 && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _varValue <= 14) { - switch (_varValue) { + + if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonLocation <= 14) { + switch (_cannonLocation) { case 0: case 14: _smackerPlayer->open(0x340A0049, true); _palette->usePalette(); - _flag1 = true; + _keepVideo = true; break; case 8: _smackerPlayer->open(0x0082080D, true); _palette->usePalette(); - _flag1 = true; + _keepVideo = true; _flag4 = false; break; case 9: _smackerPlayer->open(0x0282080D, true); _palette->usePalette(); - _flag1 = true; + _keepVideo = true; _flag4 = false; break; case 10: _smackerPlayer->open(0x0882080D, true); _palette->usePalette(); - _flag1 = true; + _keepVideo = true; _flag4 = false; break; case 11: case 12: case 13: if (_flag2) { - if (_varValue == 11) + if (_cannonLocation == 11) _smackerPlayer->open(0x110A000F, false); - else if (_varValue == 12) + else if (_cannonLocation == 12) _smackerPlayer->open(0x500B004F, false); - else if (_varValue == 13) + else if (_cannonLocation == 13) _smackerPlayer->open(0x100B010E, false); _palette->usePalette(); _flag2 = false; -#if 0 - _class523->stMoveDown(); -#endif + _asHorizontalIndicator->stMoveLeft(); } else { - sub462DC0(); + playExtVideo(); } break; } } - if (_countdown1 != 0 && (--_countdown1 == 0) && sub462E10()) { -#if 0 + if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) { for (int i = 0; i < 3; i++) - _class524Array[i]->hide(); -#endif + _asSymbols[i]->hide(); if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) { - _class439Array[0]->show(); - _class440Array[0]->getSurface()->setVisible(true); - // TODO _class440Array->StaticSprite_update - _class522->show(); + _ssSymbolEdges[0]->show(); + _ssTargetLines[0]->show(); + _asVerticalIndicator->show(); } } - if (_countdown2 != 0 && (--_countdown2 == 0) && sub462E50()) { -#if 0 - for (int i = 0; i < 6; i++) - _class524Array[i]->hide(); -#endif + if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) { + for (int i = 3; i < 6; i++) + _asSymbols[i]->hide(); if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) { - _class439Array[1]->show(); - _class440Array[1]->getSurface()->setVisible(true); -#if 0 - // TODO _class440Array[1]->StaticSprite_update - _class523->show(); -#endif + _ssSymbolEdges[1]->show(); + _ssTargetLines[1]->show(); + _asHorizontalIndicator->show(); } } @@ -902,104 +1101,104 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (!getGlobalVar(0x000809C2)) { if (!getGlobalVar(0x10938830)) { - _varValue = 1; + _cannonLocation = 1; setGlobalVar(0x10938830, 1); } else { - _varValue = 2; + _cannonLocation = 2; } } else if (!getGlobalVar(0x9040018A)) { - _varValue = 3; + _cannonLocation = 3; } else if (!getGlobalVar(0x610210B7)) { - _varValue = 4; + _cannonLocation = 4; } else if (!getGlobalVar(0x0C0288F4)) { setGlobalVar(0x0C0288F4, 1); - _varValue = 5; + _cannonLocation = 5; } else { - _varValue = 6; + _cannonLocation = 6; } - sub462DC0(); + playExtVideo(); break; case 0x2001: - _countdown1 = 24; + _lockSymbolsPart1Countdown = 24; break; case 0x2002: if (!getGlobalVar(0x9040018A) && !_flag4) { if (getGlobalVar(0x000809C2)) { - _varValue = 14; + _cannonLocation = 14; setGlobalVar(0x000809C2, 0); } else { - _varValue = 7; + _cannonLocation = 7; setGlobalVar(0x000809C2, 1); } - sub462DC0(); + playExtVideo(); } break; case 0x2003: - _countdown2 = 24; + _lockSymbolsPart2Countdown = 24; break; case 0x2004: if (getGlobalVar(0x000809C2)) { if (!getGlobalVar(0x9040018A)) { if (!getGlobalVar(0x610210B7)) { - _varValue = 8; + _cannonLocation = 8; + } else if (!getGlobalVar(0x0C0288F4)) { + _cannonLocation = 9; } else { - if (!getGlobalVar(0x0C0288F4)) { - _varValue = 9; - } else { - _varValue = 10; - } + _cannonLocation = 10; } setGlobalVar(0x9040018A, 1); _flag4 = true; - sub462DC0(); - } else if (!getGlobalVar(0x610210B7)) { - _varValue = 11; - _smackerPlayer->open(0x108A000F, false); - } else if (!getGlobalVar(0x0C0288F4)) { - _varValue = 12; - _smackerPlayer->open(0x500B002F, false); + playExtVideo(); } else { - _varValue = 13; - _smackerPlayer->open(0x100B008E, false); + if (!getGlobalVar(0x610210B7)) { + _cannonLocation = 11; + _smackerPlayer->open(0x108A000F, false); + } else if (!getGlobalVar(0x0C0288F4)) { + _cannonLocation = 12; + _smackerPlayer->open(0x500B002F, false); + } else { + _cannonLocation = 13; + _smackerPlayer->open(0x100B008E, false); + } + _palette->usePalette(); + _flag2 = true; + _flag4 = true; + _keepVideo = false; + setGlobalVar(0x9040018A, 0); } - _palette->usePalette(); - _flag2 = true; - _flag4 = true; - _flag1 = false; - setGlobalVar(0x9040018A, 0); } break; } return 0; } -void Scene3009::sub462DC0() { - setGlobalVar(0x20580A86, _varValue); - setGlobalVar(0xF0402B0A, kScene3009VarValues[_varValue]); +void Scene3009::playExtVideo() { + setGlobalVar(0x20580A86, _cannonLocation); + setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]); _parentModule->sendMessage(0x1009, 1, this); } -bool Scene3009::sub462E10() { +bool Scene3009::isSymbolsPart1Solved() { for (int i = 0; i < 3; i++) - if (_varValueArray[i] != getSubVar(0x00000914, i)) + if (_correctSymbols[i] != getSubVar(0x00000914, i)) return false; return true; } -bool Scene3009::sub462E50() { - for (int i = 0; i < 6; i++) - if (_varValueArray[i] != getSubVar(0x00000914, i)) +bool Scene3009::isSymbolsPart2Solved() { + for (int i = 3; i < 6; i++) + if (_correctSymbols[i] != getSubVar(0x00000914, i)) return false; return true; } bool Scene3009::sub462E90() { - return _flag3 || _flag4; + return /*_flag3 || */_flag4; } // Scene3010 -static const uint32 kScene3010VarNameHashes[] = { +static const uint32 kScene3010ButtonNameHashes[] = { 0x304008D2, 0x40119852, 0x01180951 @@ -1042,7 +1241,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene NDimensions dimensions1, dimensions2; - _buttonEnabled = getSubVar(0x14800353, kScene3010VarNameHashes[_buttonIndex]) != 0; + _buttonEnabled = getSubVar(0x14800353, kScene3010ButtonNameHashes[_buttonIndex]) != 0; _spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); dimensions1 = _spriteResource.getDimensions(); _spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); @@ -1133,10 +1332,10 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false), _countdown(0) { - _x = kAsScene3010DeadBoltPoints[_boltIndex].x; - _y = kAsScene3010DeadBoltPoints[_boltIndex].y; + _x = kAsScene3010DeadBoltPoints[_boltIndex].x; + _y = kAsScene3010DeadBoltPoints[_boltIndex].y; - if (getSubVar(0x14800353, kScene3010VarNameHashes[_boltIndex])) { + if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) { createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); _soundResource1.load(0x46005BC4); @@ -1249,9 +1448,9 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) int initCountdown = 0; // DEBUG: Enable all buttons - setSubVar(0x14800353, kScene3010VarNameHashes[0], 1); - setSubVar(0x14800353, kScene3010VarNameHashes[1], 1); - setSubVar(0x14800353, kScene3010VarNameHashes[2], 1); + setSubVar(0x14800353, kScene3010ButtonNameHashes[0], 1); + setSubVar(0x14800353, kScene3010ButtonNameHashes[1], 1); + setSubVar(0x14800353, kScene3010ButtonNameHashes[2], 1); _surfaceFlag = true; @@ -1265,7 +1464,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) _ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME addSprite(_ssDeadBoltButtons[i]); _vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]); - if (getSubVar(0x14800353, kScene3010VarNameHashes[i])) + if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i])) initCountdown++; _boltUnlocking[i] = false; _boltUnlocked[i] = false; diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 9bda5db2af..499741d851 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -68,9 +68,9 @@ protected: class Scene3009; -class Class438 : public StaticSprite { +class SsScene3009FireCannonButton : public StaticSprite { public: - Class438(NeverhoodEngine *vm, Scene3009 *parentScene); + SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene); protected: Scene3009 *_parentScene; SoundResource _soundResource; @@ -79,9 +79,9 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class439 : public StaticSprite { +class SsScene3009SymbolEdges : public StaticSprite { public: - Class439(NeverhoodEngine *vm, int index); + SsScene3009SymbolEdges(NeverhoodEngine *vm, int index); void show(); void hide(); void startBlinking(); @@ -92,14 +92,30 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class440 : public StaticSprite { +class SsScene3009TargetLine : public StaticSprite { public: - Class440(NeverhoodEngine *vm, int index); + SsScene3009TargetLine(NeverhoodEngine *vm, int index); + void show(); }; -class Class522 : public AnimatedSprite { +class SsScene3009SymbolArrow : public StaticSprite { public: - Class522(NeverhoodEngine *vm, Scene3009 *parentScene, int index); + SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index); + void hide(); +protected: + SoundResource _soundResource; + Sprite *_asSymbol; + int _index; + int _incrDecr; + bool _enabled; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene3009VerticalIndicator : public AnimatedSprite { +public: + AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index); void show(); protected: Scene3009 *_parentScene; @@ -107,33 +123,58 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class AsScene3009HorizontalIndicator : public AnimatedSprite { +public: + AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue); + void show(); + void stMoveLeft(); + void stMoveRight(); +protected: + Scene3009 *_parentScene; + bool _enabled; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveLeft(); + void suMoveRight(); +}; + +class AsScene3009Symbol : public AnimatedSprite { +public: + AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index); + void hide(); +protected: + Scene3009 *_parentScene; + int _index; + uint32 _symbolIndex; + SsScene3009SymbolArrow *_ssArrowPrev; + SsScene3009SymbolArrow *_ssArrowNext; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene3009 : public Scene { public: Scene3009(NeverhoodEngine *vm, Module *parentModule, int which); bool sub462E90(); protected: - int _countdown1; - int _countdown2; + int _lockSymbolsPart1Countdown; + int _lockSymbolsPart2Countdown; SmackerPlayer *_smackerPlayer; - Sprite *_class438; - Class439 *_class439Array[2]; - Class440 *_class440Array[2]; - Class522 *_class522; -#if 0 - Class523 *_class523; - Class524 *_class524Array[6]; -#endif - uint32 _varValue; - uint32 _varValueArray[6]; - bool _flag1; + Sprite *_ssFireCannonButton; + SsScene3009SymbolEdges *_ssSymbolEdges[2]; + SsScene3009TargetLine *_ssTargetLines[2]; + AsScene3009VerticalIndicator *_asVerticalIndicator; + AsScene3009HorizontalIndicator *_asHorizontalIndicator; + AsScene3009Symbol *_asSymbols[6]; + uint32 _cannonLocation; + uint32 _correctSymbols[6]; + bool _keepVideo; bool _flag2; - bool _flag3; + // UNUSED? bool _flag3; bool _flag4; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub462DC0(); - bool sub462E10(); - bool sub462E50(); + void playExtVideo(); + bool isSymbolsPart1Solved(); + bool isSymbolsPart2Solved(); }; // Scene3010 diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 0db5d62c2c..c6a7e5abf2 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -198,7 +198,7 @@ Common::Error NeverhoodEngine::run() { _screen->wait(); _screen->update(); - debug("---------------------------------------"); + debug(0, "---------------------------------------"); } diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 66e7a58746..39f49cb6e7 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -83,6 +83,7 @@ SmackerPlayer::~SmackerPlayer() { void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { debug("SmackerPlayer::open(%08X)", fileHash); + _fileHash = fileHash; _keepLastFrame = keepLastFrame; close(); @@ -143,6 +144,21 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) { } } +void SmackerPlayer::rewind() { + + delete _smackerDecoder; + _smackerDecoder = NULL; + _stream = NULL; + + _smackerFirst = true; + + _stream = _vm->_res->createStream(_fileHash); + + _smackerDecoder = new Video::SmackerDecoder(_vm->_mixer); + _smackerDecoder->loadStream(_stream); + +} + void SmackerPlayer::update() { debug(8, "SmackerPlayer::update()"); @@ -156,34 +172,7 @@ void SmackerPlayer::update() { if (!_smackerDecoder->endOfVideo()) { - const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame(); - - if (_smackerFirst) { - _smackerSurface->setSmackerFrame(smackerFrame); - if (_drawX < 0 || _drawY < 0) { - if (_doubleSurface) { - _drawX = 320 - _smackerDecoder->getWidth(); - _drawY = 240 - _smackerDecoder->getHeight(); - } else { - _drawX = (640 - _smackerDecoder->getWidth()) / 2; - _drawY = (480 - _smackerDecoder->getHeight()) / 2; - } - } - _smackerSurface->getDrawRect().x = _drawX; - _smackerSurface->getDrawRect().y = _drawY; - _smackerFirst = false; - } - - if (_doubleSurface) { - // TODO - } - - // TODO _vm->_screen->_skipUpdate = true; - _dirtyFlag = true; - - if (_smackerDecoder->hasDirtyPalette()) { - updatePalette(); - } + updateFrame(); if (_smackerDecoder->endOfVideo() && !_keepLastFrame) { // Inform the scene about the end of the video playback @@ -192,12 +181,47 @@ void SmackerPlayer::update() { } _flag2 = true; } else { + if (_smackerDecoder->endOfVideo()) { + rewind(); + updateFrame(); + } _flag2 = false; } } } +void SmackerPlayer::updateFrame() { + const Graphics::Surface *smackerFrame = _smackerDecoder->decodeNextFrame(); + + if (_smackerFirst) { + _smackerSurface->setSmackerFrame(smackerFrame); + if (_drawX < 0 || _drawY < 0) { + if (_doubleSurface) { + _drawX = 320 - _smackerDecoder->getWidth(); + _drawY = 240 - _smackerDecoder->getHeight(); + } else { + _drawX = (640 - _smackerDecoder->getWidth()) / 2; + _drawY = (480 - _smackerDecoder->getHeight()) / 2; + } + } + _smackerSurface->getDrawRect().x = _drawX; + _smackerSurface->getDrawRect().y = _drawY; + _smackerFirst = false; + } + + if (_doubleSurface) { + // TODO + } + + // TODO _vm->_screen->_skipUpdate = true; + _dirtyFlag = true; + + if (_smackerDecoder->hasDirtyPalette()) { + updatePalette(); + } +} + void SmackerPlayer::updatePalette() { byte tempPalette[1024]; const byte *smackerPalette = _smackerDecoder->getPalette(); diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index 6579bb4add..fb7f6daa96 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -64,6 +64,7 @@ protected: Palette *_palette; Video::SmackerDecoder *_smackerDecoder; SmackerSurface *_smackerSurface; + uint32 _fileHash; bool _smackerFirst; bool _doubleSurface; Common::SeekableReadStream *_stream; @@ -71,7 +72,9 @@ protected: bool _flag2; bool _dirtyFlag; int _drawX, _drawY; + void rewind(); void update(); + void updateFrame(); void updatePalette(); }; -- cgit v1.2.3 From 9d12661537db2229fe08102a8c2491e0647826a4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 2 Aug 2011 19:03:11 +0000 Subject: NEVERHOOD: Implement Scene3011 - And use _moduleDone instead of _done in Module3000 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module3000.cpp | 269 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module3000.h | 47 +++++++ engines/neverhood/resource.h | 1 + 4 files changed, 315 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c1ee6dda15..16824e9ba8 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -228,7 +228,7 @@ void GameModule::startup() { //createModule1700(1); //createModule1400(-1); #if 1 - _vm->gameState().sceneNum = 8; + _vm->gameState().sceneNum = 10; createModule3000(-1); #endif #if 0 diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 45db8adc7e..51940bacd0 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -221,7 +221,9 @@ void Module3000::createScene3010(int which) { } void Module3000::createScene3011(int which) { - // TODO + _vm->gameState().sceneNum = 10; + _childObject = new Scene3011(_vm, this, 0); + SetUpdateHandler(&Module3000::updateScene3011); } void Module3000::createScene3012(int which) { @@ -403,6 +405,9 @@ void Module3000::updateScene3004() { _moduleDone = false; delete _childObject; _childObject = NULL; + + debug("_moduleDoneStatus = %d", _moduleDoneStatus); + if (_moduleDoneStatus == 1) { createScene3005(0); _childObject->handleUpdate(); @@ -501,8 +506,8 @@ void Module3000::updateScene3009() { void Module3000::updateScene3010() { _childObject->handleUpdate(); - if (_done) { - _done = false; + if (_moduleDone) { + _moduleDone = false; delete _childObject; _childObject = NULL; if (_moduleDoneStatus == 0 || _moduleDoneStatus == 2) { @@ -515,6 +520,17 @@ void Module3000::updateScene3010() { } } +void Module3000::updateScene3011() { + _childObject->handleUpdate(); + if (_moduleDone) { + _moduleDone = false; + delete _childObject; + _childObject = NULL; + createScene3004(3); + _childObject->handleUpdate(); + } +} + // Scene3009 static const uint32 kScene3009SmackerFileHashes[] = { @@ -1558,4 +1574,251 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +// Scene3011 + +static const uint32 kAsScene3011SymbolFileHashes[] = { + 0x00C88050, + 0x01488050, + 0x02488050, + 0x04488050, + 0x08488050, + 0x10488050, + 0x20488050, + 0x40488050, + 0x80488050, + 0x00488051, + 0x00488052, + 0x00488054, + 0x008B0000, + 0x008D0000, + 0x00810000, + 0x00990000, + 0x00A90000, + 0x00C90000, + 0x00090000, + 0x01890000, + 0x02890000, + 0x04890000, + 0x08890000, + 0x10890000 +}; + +SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag) + : StaticSprite(vm, 1400), _parentScene(parentScene), _soundResource(vm), + _countdown(0) { + + if (flag) { + _spriteResource.load2(0x11282020); + } else { + _spriteResource.load2(0x994D0433); + } + _soundResource.load(0x44061000); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _deltaRect.x = 0; + _deltaRect.y = 0; + _deltaRect.width = _spriteResource.getDimensions().width; + _deltaRect.height = _spriteResource.getDimensions().height; + _surface->setVisible(false); + processDelta(); + _needRefresh = true; + SetUpdateHandler(&SsScene3011Button::update); + SetMessageHandler(&SsScene3011Button::handleMessage); +} + +void SsScene3011Button::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown == 0)) { + _surface->setVisible(false); + } +} + +uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + StaticSprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + _surface->setVisible(true); + _countdown = 4; + _parentScene->sendMessage(0x2000, 0, this); + _soundResource.play(); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) + : AnimatedSprite(vm, 1000), _soundResource1(vm), _soundResource2(vm), + _index(index), _flag1(flag), _flag2(false) { + + if (flag) { + _x = 310; + _y = 200; + createSurface1(kAsScene3011SymbolFileHashes[_index], 1200); + _soundResource1.load(0x6052C60F); + _soundResource2.load(0x6890433B); + } else { + _index = 12; + _x = index * 39 + 96; + _y = 225; + createSurface(1200, 41, 48); + _soundResource1.load(0x64428609); + _soundResource2.load(0x7080023B); + } + _surface->setVisible(false); + _needRefresh = true; + SetUpdateHandler(&AnimatedSprite::update); +} + +void AsScene3011Symbol::show(bool flag) { + _flag2 = flag; + setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1); + _surface->setVisible(true); + if (flag) { + _soundResource2.play(); + } else { + _soundResource1.play(); + } +} + +void AsScene3011Symbol::hide() { + setFileHash1(); + _surface->setVisible(false); +} + +void AsScene3011Symbol::stopSound() { + if (_flag2) { + _soundResource2.stop(); + } else { + _soundResource2.stop(); + } +} + +void AsScene3011Symbol::change(int index, bool flag) { + _index = index; + _flag2 = flag; + setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1); + _surface->setVisible(true); + if (flag) { + _soundResource2.play(); + } else { + _soundResource1.play(); + } +} + +Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) { + + Palette2 *palette2; + + _surfaceFlag = true; + + // TODO _vm->gameModule()->initScene3011Vars(); + _index1 = getGlobalVar(0x2414C2F2); + + _background = addBackground(new DirtyBackground(_vm, 0x92124A04, 0, 0)); + + palette2 = new Palette2(_vm, 0xA4070114); + addEntity(palette2); + palette2->usePalette(); + _palette = palette2; + + _mouseCursor = addSprite(new Mouse435(_vm, 0x24A00929, 20, 620)); + + for (int i = 0; i < 12; i++) { + _asSymbols[i] = new AsScene3011Symbol(_vm, i, true); + addSprite(_asSymbols[i]); + } + + _ssButton = addSprite(new SsScene3011Button(_vm, this, true)); + _vm->_collisionMan->addSprite(_ssButton); + + SetUpdateHandler(&Scene3011::update); + SetMessageHandler(&Scene3011::handleMessage); + +} + +void Scene3011::update() { + Scene::update(); + + if (_countdown != 0 && (--_countdown == 0)) { + switch (_updateStatus) { + case 0: + if (_buttonClicked) { + if (_index1 == _index2) { + do { + _index3 = _vm->_rnd->getRandomNumber(12 - 1); + } while (_index1 == _index3); + _asSymbols[getSubVar(0x04909A50, _index3)]->show(true); + } else { + _asSymbols[getSubVar(0x04909A50, _index2)]->show(false); + } + _updateStatus = 1; + _countdown = 24; + fadeIn(); + _buttonClicked = false; + } + break; + case 1: + _updateStatus = 2; + _countdown = 24; + break; + case 2: + fadeOut(); + _updateStatus = 3; + _countdown = 24; + break; + case 3: + _updateStatus = 0; + _countdown = 1; + if (_index1 == _index2) { + _asSymbols[getSubVar(0x04909A50, _index3)]->hide(); + } else { + _asSymbols[getSubVar(0x04909A50, _index2)]->hide(); + } + _index2++; + if (_index2 >= 12) + _index2 = 0; + break; + } + } +} + +uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x2000: + _buttonClicked = true; + if (_countdown == 0) + _countdown = 1; + break; + } + return 0; +} + +void Scene3011::fadeIn() { + Palette2 *palette2 = (Palette2*)_palette; + palette2->addPalette(0x92124A04, 0, 256, 0); + palette2->startFadeToPalette(24); +} + +void Scene3011::fadeOut() { + Palette2 *palette2 = (Palette2*)_palette; + palette2->addPalette(0xA4070114, 0, 256, 0); + palette2->startFadeToPalette(24); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 499741d851..64a4b76817 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -62,6 +62,7 @@ protected: void updateScene3007(); void updateScene3009(); void updateScene3010(); + void updateScene3011(); }; // Scene3009 @@ -239,6 +240,52 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +// Scene3011 + +class SsScene3011Button : public StaticSprite { +public: + SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag); +protected: + Scene *_parentScene; + SoundResource _soundResource; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene3011Symbol : public AnimatedSprite { +public: + AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag); + void show(bool flag); + void hide(); + void stopSound(); + void change(int index, bool flag); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + bool _flag1; + bool _flag2; + int _index; +}; + +class Scene3011 : public Scene { +public: + Scene3011(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssButton; + AsScene3011Symbol *_asSymbols[12]; + int _updateStatus; + bool _buttonClicked; + int _countdown; + int _index1; + int _index2; + int _index3; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void fadeIn(); + void fadeOut(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE3000_H */ diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index a7d5e6c761..f8d282cd57 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -199,6 +199,7 @@ public: void load(uint32 fileHash); void play(uint32 fileHash, bool looping = false); void play(); + void stop() { /*DUMMY*/ } protected: NeverhoodEngine *_vm; }; -- cgit v1.2.3 From 5fcc3af23bc0838283693e34ac9e073aca773821 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Aug 2011 12:23:34 +0000 Subject: NEVERHOOD: Implement Module2000 --- engines/neverhood/gamemodule.cpp | 32 +++++-- engines/neverhood/gamemodule.h | 2 + engines/neverhood/klayman.cpp | 98 ++++++++++++++++++++ engines/neverhood/klayman.h | 13 ++- engines/neverhood/module.mk | 1 + engines/neverhood/module2000.cpp | 193 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2000.h | 59 ++++++++++++ 7 files changed, 391 insertions(+), 7 deletions(-) create mode 100644 engines/neverhood/module2000.cpp create mode 100644 engines/neverhood/module2000.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 16824e9ba8..7408c25fbd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -29,6 +29,7 @@ #include "neverhood/module1500.h" #include "neverhood/module1700.h" #include "neverhood/module1800.h" +#include "neverhood/module2000.h" #include "neverhood/module2300.h" #include "neverhood/module3000.h" @@ -227,7 +228,7 @@ void GameModule::startup() { //createModule1700(-1); //createModule1700(1); //createModule1400(-1); -#if 1 +#if 0 _vm->gameState().sceneNum = 10; createModule3000(-1); #endif @@ -235,6 +236,10 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule1800(-1); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule2000(-1); +#endif } void GameModule::createModule1000(int which) { @@ -284,11 +289,7 @@ void GameModule::updateModule1200() { void GameModule::createModule1400(int which) { setGlobalVar(0x91080831, 0x00AD0012); - //_childObject = new Module1400(_vm, this, which); - - _vm->gameState().sceneNum = 9; - _childObject = new Module3000(_vm, this, -1); - + _childObject = new Module1400(_vm, this, which); SetUpdateHandler(&GameModule::updateModule1400); } @@ -384,6 +385,25 @@ void GameModule::updateModule1800() { } } +void GameModule::createModule2000(int which) { + setGlobalVar(0x91080831, 0x08250000); + _childObject = new Module2000(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule2000); +} + +void GameModule::updateModule2000() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + // TODO createModule2900(4); + _childObject->handleUpdate(); + } +} + void GameModule::createModule2300(int which) { setGlobalVar(0x91080831, 0x1A214010); _childObject = new Module2300(_vm, this, which); diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 6290a85209..6de3893fbd 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -63,6 +63,8 @@ protected: void updateModule1700(); void createModule1800(int which); void updateModule1800(); + void createModule2000(int which); + void updateModule2000(); void createModule2200(int which); void createModule2300(int which); void updateModule2300(); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 3aaab36874..d74f94bbbf 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3324,4 +3324,102 @@ void KmScene1705::sub468B10() { SetMessageHandler(&KmScene1705::handleMessage4689A0); } +KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) { + + // Empty +} + +uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2000: + _flag = param.asInteger() != 0; + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + if (_flag) { + setCallback2(AnimationCallback(&Klayman::sub421350)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + } + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&Klayman::sub41F9E0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481D: + if (_flag) { + setCallback2(AnimationCallback(&Klayman::sub4214D0)); + } + break; + case 0x481E: + if (_flag) { + setCallback2(AnimationCallback(&Klayman::sub421510)); + } + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x4835: + _parentScene->sendMessage(0x2000, 1, this); + _flag = true; + setCallback2(AnimationCallback(&Klayman::sub4212C0)); + break; + case 0x4836: + _parentScene->sendMessage(0x2000, 0, this); + _flag = false; + setCallback2(AnimationCallback(&Klayman::sub421310)); + break; + case 0x483D: + sub440230(); + break; + case 0x483E: + sub440270(); + break; + } + return 0; +} + +uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + _soundResource1.play(0x85B10BB8); + } if (param.asInteger() == 0x4E6A0CA0) { + _soundResource1.play(0xC5B709B0); + } + break; + } +} + +void KmScene2001::sub440230() { + _status2 = 0; + _flagE5 = false; + setFileHash(0xBE68CC54, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene2001::handleMessage4401A0); +} + +void KmScene2001::sub440270() { + _status2 = 0; + _flagE5 = false; + setFileHash(0x18AB4ED4, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene2001::handleMessage4401A0); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index d7c351e20c..8585689595 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -109,6 +109,7 @@ public: void sub420E90(); void sub420EB0(); void sub420680(); + void sub41F9E0(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -204,7 +205,6 @@ protected: void sub41F950(); void sub41FB30(); uint32 handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41F9E0(); void spriteUpdate41F300(); uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); void sub41FA40(); @@ -359,6 +359,17 @@ protected: void sub468B10(); }; +class KmScene2001 : public Klayman { +public: + KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage4401A0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub440230(); + void sub440270(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 20e0bbb2c7..5dcdc41aed 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -17,6 +17,7 @@ MODULE_OBJS = \ module1500.o \ module1700.o \ module1800.o \ + module2000.o \ module2300.o \ module3000.o \ mouse.o \ diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp new file mode 100644 index 0000000000..9f45db218c --- /dev/null +++ b/engines/neverhood/module2000.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2000.h" +#include "neverhood/gamemodule.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module2000(%d)", which); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 0: + createScene2001(-1); + break; + case 2: + createScene2003(-1); + break; + default: + createScene2002(-1); + break; + } + } else if (which == 0) { + createScene2001(3); + } else if (which == 1) { + createScene2001(1); + } + +} + +Module2000::~Module2000() { + // TODO Sound1ChList_sub_407A50(0x81293110); +} + +void Module2000::createScene2001(int which) { + _vm->gameState().sceneNum = 0; + _childObject = new Scene2001(_vm, this, which); + SetUpdateHandler(&Module2000::updateScene2001); + _childObject->handleUpdate(); +} + +void Module2000::createScene2002(int which) { + _vm->gameState().sceneNum = 1; + if (getGlobalVar(0x98109F12)) { + createNavigationScene(0x004B7B48, which); + } else { + createNavigationScene(0x004B7B00, which); + } + SetUpdateHandler(&Module2000::updateScene2002); + _childObject->handleUpdate(); +} + +void Module2000::createScene2003(int which) { + _vm->gameState().sceneNum = 2; + setGlobalVar(0x98109F12, 1); + setSubVar(0x2C145A98, 1, 1); + createSmackerScene(0x204B2031, true, true, false); + SetUpdateHandler(&Module2000::updateScene2003); + _childObject->handleUpdate(); +} + +void Module2000::updateScene2001() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + _parentModule->sendMessage(0x1009, 0, this); + } else { + createScene2002(0); + } + } +} + +void Module2000::updateScene2002() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + if (getGlobalVar(0x98109F12)) { + createScene2002(0); + } else { + createScene2003(-1); + } + } else if (_field20 == 1) { + createScene2002(1); + } else if (_field20 == 2) { + createScene2001(0); + } + } +} + +void Module2000::updateScene2003() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene2002(0); + } +} + +// Scene2001 + +Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene2001::handleMessage); + + _background = addBackground(new DirtyBackground(_vm, 0xA6417244, 0, 0)); + _palette = new Palette(_vm, 0xA6417244); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL)); + + _class401 = addSprite(new StaticSprite(_vm, 0x0D641724, 1100)); + + if (which < 0) { + _klayman = new KmScene2001(_vm, this, 300, 345); + setMessageList(0x004B3538); + sendMessage(0x2000, 0, this); + } else if (which == 1) { + _klayman = new KmScene2001(_vm, this, 116, 345); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004B3540); + sendMessage(0x2000, 1, this); + } else if (which == 2) { + _klayman = new KmScene2001(_vm, this, 116, 345); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004B35F0); + sendMessage(0x2000, 1, this); + } else if (which == 3) { + _klayman = new KmScene2001(_vm, this, 116, 345); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004B3550); + sendMessage(0x2000, 1, this); + } else { + _klayman = new KmScene2001(_vm, this, 390, 345); + setMessageList(0x004B3530); + sendMessage(0x2000, 0, this); + _klayman->setDoDeltaX(1); + } + addSprite(_klayman); + + _klayman->getSurface()->getClipRect().x1 = _class401->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + +} + +uint32 Scene2001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004B3680); + _klayman->setKlaymanTable3(); + } else { + setRectList(0x004B3670); + _klayman->setKlaymanTable1(); + } + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h new file mode 100644 index 0000000000..23ac8a8e9f --- /dev/null +++ b/engines/neverhood/module2000.h @@ -0,0 +1,59 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2000_H +#define NEVERHOOD_MODULE2000_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/module1200.h" + +namespace Neverhood { + +class Module2000 : public Module { +public: + Module2000(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2000(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene2001(int which); + void createScene2002(int which); + void createScene2003(int which); + void updateScene2001(); + void updateScene2002(); + void updateScene2003(); +}; + +// Scene2001 + +class Scene2001 : public Scene { +public: + Scene2001(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_class401; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2000_H */ -- cgit v1.2.3 From 828629018567b3ff4e3f3311420168ff83bf62a7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Aug 2011 12:23:47 +0000 Subject: NEVERHOOD: Add tables for Module2000 --- devtools/create_neverhood/tables.h | 25 +++++++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 6210 -> 7592 bytes 2 files changed, 25 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index aa70279af3..b2d5bc52ff 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -60,6 +60,9 @@ static const uint32 rectListOffsets[] = { // Scene1705 1, 0x004B6B40, 1, 0x004B6B30, + // Scene2001 + 1, 0x004B3680, + 1, 0x004B3670, 0, 0 }; @@ -150,6 +153,12 @@ static const uint32 messageListOffsets[] = { 2, 0x004B6A18, 1, 0x004B69F0, 2, 0x004B6AC0, + // Scene2001 + 1, 0x004B3538, + 2, 0x004B3540, + 4, 0x004B35F0, + 2, 0x004B3550, + 1, 0x004B3530, 0, 0 }; @@ -169,5 +178,21 @@ static const uint32 navigationListOffsets[] = { 2, 0x004B6878, 3, 0x004B68F0, 3, 0x004B68A8, + // Module2000 + 3, 0x004B7B48, + 3, 0x004B7B00, + // Module3000 + 2, 0x004B7C80, + 2, 0x004B7CE0, + 2, 0x004B7CB0, + 3, 0x004B7D58, + 3, 0x004B7D10, + 4, 0x004B7E60, + 4, 0x004B7DA0, + 4, 0x004B7E00, + 4, 0x004B7F20, + 4, 0x004B7EC0, + 2, 0x004B7F80, + 1, 0x004B7FB0, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index f1208577ba..84a6425ae6 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From bc239b3fb17a359151b8486f1e13c577817adef1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Aug 2011 18:52:02 +0000 Subject: NEVERHOOD: Restructure/redesign create_neverhood tool and made it more extensible for future game structures --- devtools/create_neverhood/create_neverhood.cpp | 487 ++++++++++++++----------- 1 file changed, 269 insertions(+), 218 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 25ef67651d..14dd32db3d 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -41,6 +41,13 @@ byte *data; uint32 dataStart = 0x004AE000; uint32 fileStart = 0x000AC600; +class HitRectList; +class RectList; +class MessageList; +class NavigationList; + +void addMessageList(uint32 messageListCount, uint32 messageListOffset); + void loadExe(const char *filename) { FILE *exe = fopen(filename, "rb"); dataSize = fileSize(exe); @@ -49,38 +56,131 @@ void loadExe(const char *filename) { fclose(exe); } +byte *getData(uint32 offset) { + return data + offset - dataStart + fileStart; +} + struct HitRect { int16 x1, y1, x2, y2; uint16 messageNum; + + void load(uint32 offset) { + byte *item = getData(offset); + x1 = READ_LE_UINT16(item + 0); + y1 = READ_LE_UINT16(item + 2); + x2 = READ_LE_UINT16(item + 4); + y2 = READ_LE_UINT16(item + 6); + messageNum = READ_LE_UINT16(item + 8); + } + + void save(FILE *fd) { + writeUint16LE(fd, x1); + writeUint16LE(fd, y1); + writeUint16LE(fd, x2); + writeUint16LE(fd, y2); + writeUint16LE(fd, messageNum); + } + + int getItemSize() const { + return 10; + } + }; -typedef std::vector HitRects; +struct MessageItem { + uint16 messageNum; + uint32 messageParam; + MessageItem() {} + MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {} + + void load(uint32 offset) { + byte *item = getData(offset); + messageNum = READ_LE_UINT16(item + 0); + messageParam = READ_LE_UINT32(item + 4); + } + + void save(FILE *fd) { + writeUint16LE(fd, messageNum); + writeUint32LE(fd, messageParam); + } + + int getItemSize() const { + return 8; + } + +}; struct SubRectItem { int16 x1, y1, x2, y2; uint32 messageListCount; uint32 messageListOffset; -}; -typedef std::vector SubRectItems; + void load(uint32 offset) { + byte *item = getData(offset); + x1 = READ_LE_UINT16(item + 0); + y1 = READ_LE_UINT16(item + 2); + x2 = READ_LE_UINT16(item + 4); + y2 = READ_LE_UINT16(item + 6); + messageListCount = READ_LE_UINT32(item + 8); + messageListOffset = READ_LE_UINT32(item + 12); + // Add the message to the message list + addMessageList(messageListCount, messageListOffset); + } + + void save(FILE *fd) { + writeUint16LE(fd, x1); + writeUint16LE(fd, y1); + writeUint16LE(fd, x2); + writeUint16LE(fd, y2); + writeUint32LE(fd, messageListOffset); + } + + int getItemSize() const { + return 16; + } + +}; struct RectItem { int16 x1, y1, x2, y2; uint32 subRectListCount; uint32 subRectListOffset; - SubRectItems subRectItems; -}; + std::vector subRectItems; -typedef std::vector RectItems; - -struct MessageItem { - uint16 messageNum; - uint32 messageParam; - MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {} + void load(uint32 offset) { + byte *item = getData(offset); + uint32 subItemOffset; + x1 = READ_LE_UINT16(item + 0); + y1 = READ_LE_UINT16(item + 2); + x2 = READ_LE_UINT16(item + 4); + y2 = READ_LE_UINT16(item + 6); + subRectListCount = READ_LE_UINT32(item + 8); + subRectListOffset = READ_LE_UINT32(item + 12); + subItemOffset = subRectListOffset; + for (uint32 j = 0; j < subRectListCount; j++) { + SubRectItem subRectItem; + subRectItem.load(subItemOffset); + subItemOffset += 16; + subRectItems.push_back(subRectItem); + } + } + + void save(FILE *fd) { + writeUint16LE(fd, x1); + writeUint16LE(fd, y1); + writeUint16LE(fd, x2); + writeUint16LE(fd, y2); + writeUint32LE(fd, subRectItems.size()); + for (uint32 j = 0; j < subRectItems.size(); j++) + subRectItems[j].save(fd); + } + + int getItemSize() const { + return 16; + } + }; -typedef std::vector MessageItems; - struct NavigationItem { uint32 fileHash; uint32 leftSmackerFileHash; @@ -89,149 +189,172 @@ struct NavigationItem { byte interactive; byte middleFlag; uint32 mouseCursorFileHash; -}; + + void load(uint32 offset) { + byte *item = getData(offset); + fileHash = READ_LE_UINT32(item + 0); + leftSmackerFileHash = READ_LE_UINT32(item + 4); + rightSmackerFileHash = READ_LE_UINT32(item + 8); + middleSmackerFileHash = READ_LE_UINT32(item + 12); + interactive = item[16]; + middleFlag = item[17]; + mouseCursorFileHash = READ_LE_UINT32(item + 20); + } -typedef std::vector NavigationItems; + void save(FILE *fd) { + writeUint32LE(fd, fileHash); + writeUint32LE(fd, leftSmackerFileHash); + writeUint32LE(fd, rightSmackerFileHash); + writeUint32LE(fd, middleSmackerFileHash); + writeByte(fd, interactive); + writeByte(fd, middleFlag); + writeUint32LE(fd, mouseCursorFileHash); + } -struct HitRectList { - uint32 id; - HitRects hitRects; + int getItemSize() const { + return 24; + } + }; -struct RectList { +template +class StaticDataList { +public: uint32 id; - RectItems rectItems; + std::vector items; + + virtual ~StaticDataList() { + } + + void add(ITEMCLASS item) { + items.push_back(item); + } + + int getCount() const { + return items.size(); + } + + ITEMCLASS *getListItem(int index) { + return &items[index]; + } + + virtual bool specialLoadList(uint32 count, uint32 offset) { + return false; + } + + void loadList(uint32 count, uint32 offset) { + id = offset; + if (!specialLoadList(count, offset)) { + for (uint32 i = 0; i < count; i++) { + ITEMCLASS listItem; + listItem.load(offset); + offset += listItem.getItemSize(); + add(listItem); + } + } + } + + void saveList(FILE *fd) { + writeUint32LE(fd, id); + writeUint32LE(fd, getCount()); + for (int i = 0; i < getCount(); i++) { + items[i].save(fd); + } + } + +}; + +class HitRectList : public StaticDataList { }; -struct MessageList { - uint32 id; - MessageItems messageItems; +class RectList : public StaticDataList { }; -struct NavigationList { - uint32 id; - NavigationItems navigationItems; +class MessageList : public StaticDataList { +public: + + virtual bool specialLoadList(uint32 count, uint32 offset) { + // Special code for message lists which are set at runtime (but otherwise constant) + switch (offset) { + // Scene 1002 rings + case 0x004B4200: + add(MessageItem(0x4800, 258)); + add(MessageItem(0x100D, 0x4A845A00)); + add(MessageItem(0x4805, 1)); + return true; + case 0x004B4218: + add(MessageItem(0x4800, 297)); + add(MessageItem(0x100D, 0x43807801)); + add(MessageItem(0x4805, 2)); + return true; + case 0x004B4230: + add(MessageItem(0x4800, 370)); + add(MessageItem(0x100D, 0x46C26A01)); + return true; + case 0x004B4240: + add(MessageItem(0x4800, 334)); + add(MessageItem(0x100D, 0x468C7B11)); + add(MessageItem(0x4805, 1)); + return true; + case 0x004B4258: + add(MessageItem(0x4800, 425)); + add(MessageItem(0x100D, 0x42845B19)); + add(MessageItem(0x4805, 1)); + return true; + } + return false; + } + }; -std::vector hitRectLists; -std::vector rectLists; -std::vector messageLists; -std::vector navigationLists; +class NavigationList : public StaticDataList { -byte *getData(uint32 offset) { - return data + offset - dataStart + fileStart; -} +}; -void addHitRect(uint32 count, uint32 offset) { - HitRectList *hitRectList = new HitRectList(); - hitRectList->id = offset; - byte *item = getData(offset); - for (uint32 i = 0; i < count; i++) { - HitRect hitRect; - hitRect.x1 = READ_LE_UINT16(item + 0); - hitRect.y1 = READ_LE_UINT16(item + 2); - hitRect.x2 = READ_LE_UINT16(item + 4); - hitRect.y2 = READ_LE_UINT16(item + 6); - hitRect.messageNum = READ_LE_UINT16(item + 8); - item += 10; - //printf("(%d, %d, %d, %d) -> %04X\n", hitRect.x1, hitRect.y1, hitRect.x2, hitRect.y2, hitRect.messageNum); - hitRectList->hitRects.push_back(hitRect); +template +class StaticDataListVector { +public: + std::vector lists; + + void add(LISTCLASS *list) { + lists.push_back(list); } - hitRectLists.push_back(hitRectList); -} - -void addMessage(uint32 count, uint32 offset) { - MessageList *messageList = new MessageList(); - messageList->id = offset; - // Special code for message lists which are set at runtime (but otherwise constant) - switch (offset) { - // Scene 1002 rings - case 0x004B4200: - messageList->messageItems.push_back(MessageItem(0x4800, 258)); - messageList->messageItems.push_back(MessageItem(0x100D, 0x4A845A00)); - messageList->messageItems.push_back(MessageItem(0x4805, 1)); - break; - case 0x004B4218: - messageList->messageItems.push_back(MessageItem(0x4800, 297)); - messageList->messageItems.push_back(MessageItem(0x100D, 0x43807801)); - messageList->messageItems.push_back(MessageItem(0x4805, 2)); - break; - case 0x004B4230: - messageList->messageItems.push_back(MessageItem(0x4800, 370)); - messageList->messageItems.push_back(MessageItem(0x100D, 0x46C26A01)); - break; - case 0x004B4240: - messageList->messageItems.push_back(MessageItem(0x4800, 334)); - messageList->messageItems.push_back(MessageItem(0x100D, 0x468C7B11)); - messageList->messageItems.push_back(MessageItem(0x4805, 1)); - break; - case 0x004B4258: - messageList->messageItems.push_back(MessageItem(0x4800, 425)); - messageList->messageItems.push_back(MessageItem(0x100D, 0x42845B19)); - messageList->messageItems.push_back(MessageItem(0x4805, 1)); - break; - default: - // Read message list from the exe - byte *item = getData(offset); - for (uint32 i = 0; i < count; i++) { - messageList->messageItems.push_back(MessageItem(READ_LE_UINT16(item + 0), READ_LE_UINT32(item + 4))); - item += 8; + + void loadListVector(const uint32 *offsets) { + for (int i = 0; offsets[i] != 0; i += 2) { + LISTCLASS *list = new LISTCLASS(); + list->loadList(offsets[i], offsets[i + 1]); + bool doAppend = true; + // Bad + for (typename std::vector::iterator it = lists.begin(); it != lists.end(); it++) { + if ((*it)->id == list->id) { + doAppend = false; + break; + } + } + if (doAppend) + lists.push_back(list); } } - messageLists.push_back(messageList); -} - -void addRect(uint32 count, uint32 offset) { - RectList *rectList = new RectList(); - rectList->id = offset; - byte *item = getData(offset); - for (uint32 i = 0; i < count; i++) { - RectItem rectItem; - byte *subItem; - rectItem.x1 = READ_LE_UINT16(item + 0); - rectItem.y1 = READ_LE_UINT16(item + 2); - rectItem.x2 = READ_LE_UINT16(item + 4); - rectItem.y2 = READ_LE_UINT16(item + 6); - rectItem.subRectListCount = READ_LE_UINT32(item + 8); - rectItem.subRectListOffset = READ_LE_UINT32(item + 12); - //printf("(%d, %d, %d, %d), %d, %08X\n", rectItem.x1, rectItem.y1, rectItem.x2, rectItem.y2, rectItem.subRectListCount, rectItem.subRectListOffset); - subItem = getData(rectItem.subRectListOffset); - for (uint32 j = 0; j < rectItem.subRectListCount; j++) { - SubRectItem subRectItem; - subRectItem.x1 = READ_LE_UINT16(subItem + 0); - subRectItem.y1 = READ_LE_UINT16(subItem + 2); - subRectItem.x2 = READ_LE_UINT16(subItem + 4); - subRectItem.y2 = READ_LE_UINT16(subItem + 6); - subRectItem.messageListCount = READ_LE_UINT32(subItem + 8); - subRectItem.messageListOffset = READ_LE_UINT32(subItem + 12); - subItem += 16; - //printf("(%d, %d, %d, %d), %d, %08X\n", subRectItem.x1, subRectItem.y1, subRectItem.x2, subRectItem.y2, subRectItem.messageListCount, subRectItem.messageListOffset); - addMessage(subRectItem.messageListCount, subRectItem.messageListOffset); - rectItem.subRectItems.push_back(subRectItem); + + void saveListVector(FILE *fd) { + writeUint32LE(fd, lists.size()); + for (typename std::vector::iterator it = lists.begin(); it != lists.end(); it++) { + (*it)->saveList(fd); } - item += 16; - rectList->rectItems.push_back(rectItem); } - rectLists.push_back(rectList); -} -void addNavigation(uint32 count, uint32 offset) { - NavigationList *navigationList = new NavigationList(); - navigationList->id = offset; - byte *item = getData(offset); - for (uint32 i = 0; i < count; i++) { - NavigationItem navigationItem; - navigationItem.fileHash = READ_LE_UINT32(item + 0); - navigationItem.leftSmackerFileHash = READ_LE_UINT32(item + 4); - navigationItem.rightSmackerFileHash = READ_LE_UINT32(item + 8); - navigationItem.middleSmackerFileHash = READ_LE_UINT32(item + 12); - navigationItem.interactive = item[16]; - navigationItem.middleFlag = item[17]; - navigationItem.mouseCursorFileHash = READ_LE_UINT32(item + 20); - item += 24; - navigationList->navigationItems.push_back(navigationItem); - } - navigationLists.push_back(navigationList); +}; + +StaticDataListVector hitRectLists; +StaticDataListVector rectLists; +StaticDataListVector messageLists; +StaticDataListVector navigationLists; + +void addMessageList(uint32 messageListCount, uint32 messageListOffset) { + MessageList *messageList = new MessageList(); + messageList->loadList(messageListCount, messageListOffset); + messageLists.add(messageList); } int main(int argc, char *argv[]) { @@ -240,96 +363,24 @@ int main(int argc, char *argv[]) { loadExe("nhc.exe"); - for (int i = 0; hitRectListOffsets[i] != 0; i += 2) { - addHitRect(hitRectListOffsets[i], hitRectListOffsets[i + 1]); - } - - for (int i = 0; rectListOffsets[i] != 0; i += 2) { - addRect(rectListOffsets[i], rectListOffsets[i + 1]); - } - - for (int i = 0; messageListOffsets[i] != 0; i += 2) { - addMessage(messageListOffsets[i], messageListOffsets[i + 1]); - } - - for (int i = 0; navigationListOffsets[i] != 0; i += 2) { - addNavigation(navigationListOffsets[i], navigationListOffsets[i + 1]); - } - + hitRectLists.loadListVector(hitRectListOffsets); + rectLists.loadListVector(rectListOffsets); + messageLists.loadListVector(messageListOffsets); + navigationLists.loadListVector(navigationListOffsets); + datFile = fopen("neverhood.dat", "wb"); writeUint32LE(datFile, 0x11223344); // Some magic writeUint32LE(datFile, DAT_VERSION); // Write all message lists - writeUint32LE(datFile, messageLists.size()); - for (std::vector::iterator it = messageLists.begin(); it != messageLists.end(); it++) { - MessageList *messageList = *it; - writeUint32LE(datFile, messageList->id); - writeUint32LE(datFile, messageList->messageItems.size()); - for (uint32 i = 0; i < messageList->messageItems.size(); i++) { - writeUint16LE(datFile, messageList->messageItems[i].messageNum); - writeUint32LE(datFile, messageList->messageItems[i].messageParam); - } - } - + messageLists.saveListVector(datFile); // Write all rect lists - writeUint32LE(datFile, rectLists.size()); - for (std::vector::iterator it = rectLists.begin(); it != rectLists.end(); it++) { - RectList *rectList = *it; - writeUint32LE(datFile, rectList->id); - writeUint32LE(datFile, rectList->rectItems.size()); - for (uint32 i = 0; i < rectList->rectItems.size(); i++) { - const RectItem &rectItem = rectList->rectItems[i]; - writeUint16LE(datFile, rectItem.x1); - writeUint16LE(datFile, rectItem.y1); - writeUint16LE(datFile, rectItem.x2); - writeUint16LE(datFile, rectItem.y2); - writeUint32LE(datFile, rectItem.subRectItems.size()); - for (uint32 j = 0; j < rectItem.subRectItems.size(); j++) { - const SubRectItem &subRectItem = rectItem.subRectItems[j]; - writeUint16LE(datFile, subRectItem.x1); - writeUint16LE(datFile, subRectItem.y1); - writeUint16LE(datFile, subRectItem.x2); - writeUint16LE(datFile, subRectItem.y2); - writeUint32LE(datFile, subRectItem.messageListOffset); - } - } - } - + rectLists.saveListVector(datFile); // Write all hit rect lists - writeUint32LE(datFile, hitRectLists.size()); - for (std::vector::iterator it = hitRectLists.begin(); it != hitRectLists.end(); it++) { - HitRectList *hitRectList = *it; - writeUint32LE(datFile, hitRectList->id); - writeUint32LE(datFile, hitRectList->hitRects.size()); - for (uint32 i = 0; i < hitRectList->hitRects.size(); i++) { - const HitRect &hitRect = hitRectList->hitRects[i]; - writeUint16LE(datFile, hitRect.x1); - writeUint16LE(datFile, hitRect.y1); - writeUint16LE(datFile, hitRect.x2); - writeUint16LE(datFile, hitRect.y2); - writeUint16LE(datFile, hitRect.messageNum); - } - } - + hitRectLists.saveListVector(datFile); // Write all navigation lists - writeUint32LE(datFile, navigationLists.size()); - for (std::vector::iterator it = navigationLists.begin(); it != navigationLists.end(); it++) { - NavigationList *navigationList = *it; - writeUint32LE(datFile, navigationList->id); - writeUint32LE(datFile, navigationList->navigationItems.size()); - for (uint32 i = 0; i < navigationList->navigationItems.size(); i++) { - const NavigationItem &navigationItem = navigationList->navigationItems[i]; - writeUint32LE(datFile, navigationItem.fileHash); - writeUint32LE(datFile, navigationItem.leftSmackerFileHash); - writeUint32LE(datFile, navigationItem.rightSmackerFileHash); - writeUint32LE(datFile, navigationItem.middleSmackerFileHash); - writeByte(datFile, navigationItem.interactive); - writeByte(datFile, navigationItem.middleFlag); - writeUint32LE(datFile, navigationItem.mouseCursorFileHash); - } - } + navigationLists.saveListVector(datFile); fclose(datFile); -- cgit v1.2.3 From bec86c7c2ee49a1428b5fac88b08e427805970a8 Mon Sep 17 00:00:00 2001 From: digitall Date: Sun, 21 Aug 2011 23:39:45 +0000 Subject: NEVERHOOD: Switch to initGraphics() call, rather than separate calls. Default to 1xScalar. --- engines/neverhood/neverhood.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index c6a7e5abf2..d94d3db128 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -57,11 +57,7 @@ NeverhoodEngine::~NeverhoodEngine() { } Common::Error NeverhoodEngine::run() { - // Initialize backend - _system->beginGFXTransaction(); - initCommonGFX(false); - _system->initSize(640, 480); - _system->endGFXTransaction(); + initGraphics(640, 480, true); _isSaveAllowed = false; -- cgit v1.2.3 From eb8c44b54c846d30d9ce246b786fd46e1218b586 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 29 Aug 2011 10:21:30 +0000 Subject: NEVERHOOD: Implement Scene2201 - Implement DataResource::getHitRectList, DataResource::getMessageListAtPos and related stuff in scene.cpp --- engines/neverhood/gamemodule.cpp | 28 +- engines/neverhood/gamemodule.h | 1 + engines/neverhood/klayman.cpp | 76 ++++ engines/neverhood/klayman.h | 7 + engines/neverhood/module.mk | 1 + engines/neverhood/module2200.cpp | 730 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2200.h | 206 +++++++++++ engines/neverhood/resource.cpp | 22 +- engines/neverhood/scene.cpp | 51 ++- engines/neverhood/scene.h | 6 +- engines/neverhood/staticdata.h | 2 +- 11 files changed, 1115 insertions(+), 15 deletions(-) create mode 100644 engines/neverhood/module2200.cpp create mode 100644 engines/neverhood/module2200.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7408c25fbd..a118e4fb01 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -30,6 +30,7 @@ #include "neverhood/module1700.h" #include "neverhood/module1800.h" #include "neverhood/module2000.h" +#include "neverhood/module2200.h" #include "neverhood/module2300.h" #include "neverhood/module3000.h" @@ -236,10 +237,14 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule1800(-1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 0; createModule2000(-1); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule2200(-1); +#endif } void GameModule::createModule1000(int which) { @@ -404,6 +409,25 @@ void GameModule::updateModule2000() { } } +void GameModule::createModule2200(int which) { + setGlobalVar(0x91080831, 0x11391412); + _childObject = new Module2200(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule2200); +} + +void GameModule::updateModule2200() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createModule2300(1); + _childObject->handleUpdate(); + } +} + void GameModule::createModule2300(int which) { setGlobalVar(0x91080831, 0x1A214010); _childObject = new Module2300(_vm, this, which); @@ -419,7 +443,7 @@ void GameModule::updateModule2300() { delete _childObject; _childObject = NULL; if (_field20 == 1) { - // TODO createModule2200(0); + createModule2200(0); // TODO _childObject->handleUpdate(); } else if (_field20 == 2) { createModule1200(0); diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 6de3893fbd..9ef1b92464 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -66,6 +66,7 @@ protected: void createModule2000(int which); void updateModule2000(); void createModule2200(int which); + void updateModule2200(); void createModule2300(int which); void updateModule2300(); void createModule2400(int which); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index d74f94bbbf..50dd23101c 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -573,8 +573,10 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E break; case 0x482C: if (param.asInteger() != 0) { + debug("#################################################"); // TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,); } else { + debug("#################################################"); // TODO _field114 = 0; } break; @@ -3402,6 +3404,7 @@ uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam ¶ } break; } + return messageResult; } void KmScene2001::sub440230() { @@ -3422,4 +3425,77 @@ void KmScene2001::sub440270() { SetMessageHandler(&KmScene2001::handleMessage4401A0); } +KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk) + // TODO: NRect *rect1, int16 unk in Klayman ctor + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + _dataResource.load(0x04104242); + _flagF6 = false; +} + +uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4812: + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + break; + case 0x4816: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x4818: + sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x482E: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub421030)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420FE0)); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4210C0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub421070)); + } + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 8585689595..1c02f1e9cf 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -370,6 +370,13 @@ protected: void sub440270(); }; +class KmScene2201 : public Klayman { +public: + KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 5dcdc41aed..9122eaffab 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -18,6 +18,7 @@ MODULE_OBJS = \ module1700.o \ module1800.o \ module2000.o \ + module2200.o \ module2300.o \ module3000.o \ mouse.o \ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp new file mode 100644 index 0000000000..9e4d083b8d --- /dev/null +++ b/engines/neverhood/module2200.cpp @@ -0,0 +1,730 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2200.h" +#include "neverhood/module1000.h" +#include "neverhood/module1200.h" + +namespace Neverhood { + +Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module2200(%d)", which); + + // TODO: Music18hList_add(0x11391412, 0x601C908C); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + default: + createScene2201(-1); + break; + case 1: + createScene2202(-1); + break; + case 2: + createScene2203(-1); + break; + case 3: + createScene2204(-1); + break; + case 4: + createScene2205(-1); + break; + case 5: + createScene2206(-1); + break; + case 6: + createScene2207(-1); + break; + case 7: + createScene2208(-1); + break; + case 8: + createScene2209(-1); + break; + case 9: + createScene2210(-1); + break; + case 10: + createScene2211(-1); + break; + case 11: + createScene2212(-1); + break; + case 12: + createScene2213(-1); + break; + case 13: + createScene2214(-1); + break; + case 14: + createScene2215(-1); + break; + case 15: + createScene2216(-1); + break; + case 16: + createScene2217(-1); + break; + case 17: + createScene2218(-1); + break; + case 18: + createScene2219(-1); + break; + case 19: + createScene2220(-1); + break; + case 20: + createScene2221(-1); + break; + case 21: + createScene2222(-1); + break; + case 22: + createScene2223(-1); + break; + case 23: + createScene2224(-1); + break; + case 24: + createScene2225(-1); + break; + case 25: + createScene2226(-1); + break; + case 26: + createScene2227(-1); + break; + case 27: + createScene2228(-1); + break; + case 28: + createScene2229(-1); + break; + case 29: + createScene2230(-1); + break; + case 30: + createScene2231(-1); + break; + case 31: + createScene2232(-1); + break; + case 32: + createScene2233(-1); + break; + case 33: + createScene2234(-1); + break; + case 34: + createScene2235(-1); + break; + case 35: + createScene2236(-1); + break; + case 36: + createScene2237(-1); + break; + case 37: + createScene2238(-1); + break; + case 38: + createScene2239(-1); + break; + case 39: + createScene2240(-1); + break; + case 40: + createScene2241(-1); + break; + case 41: + createScene2242(-1); + break; + case 42: + createScene2243(-1); + break; + case 43: + createScene2244(-1); + break; + case 44: + createScene2245(-1); + break; + case 45: + createScene2246(-1); + break; + case 46: + createScene2247(-1); + break; + case 47: + createScene2248(-1); + break; + } + } else { + createScene2201(0); + } + +} + +Module2200::~Module2200() { + // TODO Sound1ChList_sub_407A50(0x11391412); +} + +void Module2200::createScene2201(int which) { + _vm->gameState().sceneNum = 0; + _childObject = new Scene2201(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2201); +} + +void Module2200::createScene2202(int which) { +} + +void Module2200::createScene2203(int which) { +} + +void Module2200::createScene2204(int which) { +} + +void Module2200::createScene2205(int which) { +} + +void Module2200::createScene2206(int which) { +} + +void Module2200::createScene2207(int which) { +} + +void Module2200::createScene2208(int which) { +} + +void Module2200::createScene2209(int which) { +} + +void Module2200::createScene2210(int which) { +} + +void Module2200::createScene2211(int which) { +} + +void Module2200::createScene2212(int which) { +} + +void Module2200::createScene2213(int which) { +} + +void Module2200::createScene2214(int which) { +} + +void Module2200::createScene2215(int which) { +} + +void Module2200::createScene2216(int which) { +} + +void Module2200::createScene2217(int which) { +} + +void Module2200::createScene2218(int which) { +} + +void Module2200::createScene2219(int which) { +} + +void Module2200::createScene2220(int which) { +} + +void Module2200::createScene2221(int which) { +} + +void Module2200::createScene2222(int which) { +} + +void Module2200::createScene2223(int which) { +} + +void Module2200::createScene2224(int which) { +} + +void Module2200::createScene2225(int which) { +} + +void Module2200::createScene2226(int which) { +} + +void Module2200::createScene2227(int which) { +} + +void Module2200::createScene2228(int which) { +} + +void Module2200::createScene2229(int which) { +} + +void Module2200::createScene2230(int which) { +} + +void Module2200::createScene2231(int which) { +} + +void Module2200::createScene2232(int which) { +} + +void Module2200::createScene2233(int which) { +} + +void Module2200::createScene2234(int which) { +} + +void Module2200::createScene2235(int which) { +} + +void Module2200::createScene2236(int which) { +} + +void Module2200::createScene2237(int which) { +} + +void Module2200::createScene2238(int which) { +} + +void Module2200::createScene2239(int which) { +} + +void Module2200::createScene2240(int which) { +} + +void Module2200::createScene2241(int which) { +} + +void Module2200::createScene2242(int which) { +} + +void Module2200::createScene2243(int which) { +} + +void Module2200::createScene2244(int which) { +} + +void Module2200::createScene2245(int which) { +} + +void Module2200::createScene2246(int which) { +} + +void Module2200::createScene2247(int which) { +} + +void Module2200::createScene2248(int which) { +} + +void Module2200::updateScene2201() { + // TODO + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + } +} + +void Module2200::updateScene2202() { +} + +void Module2200::updateScene2203() { +} + +void Module2200::updateScene2204() { +} + +void Module2200::updateScene2205() { +} + +void Module2200::updateScene2206() { +} + +void Module2200::updateScene2207() { +} + +void Module2200::updateScene2208() { +} + +void Module2200::updateScene2209() { +} + +void Module2200::updateScene2210() { +} + +void Module2200::updateScene2211() { +} + +void Module2200::updateScene2212() { +} + +void Module2200::updateScene2213() { +} + +void Module2200::updateScene2214() { +} + +void Module2200::updateScene2215() { +} + +void Module2200::updateScene2216() { +} + +void Module2200::updateScene2217() { +} + +void Module2200::updateScene2218() { +} + +void Module2200::updateScene2219() { +} + +void Module2200::updateScene2220() { +} + +void Module2200::updateScene2221() { +} + +void Module2200::updateScene2222() { +} + +void Module2200::updateScene2223() { +} + +void Module2200::updateScene2224() { +} + +void Module2200::updateScene2225() { +} + +void Module2200::updateScene2226() { +} + +void Module2200::updateScene2227() { +} + +void Module2200::updateScene2228() { +} + +void Module2200::updateScene2229() { +} + +void Module2200::updateScene2230() { +} + +void Module2200::updateScene2231() { +} + +void Module2200::updateScene2232() { +} + +void Module2200::updateScene2233() { +} + +void Module2200::updateScene2234() { +} + +void Module2200::updateScene2235() { +} + +void Module2200::updateScene2236() { +} + +void Module2200::updateScene2237() { +} + +void Module2200::updateScene2238() { +} + +void Module2200::updateScene2239() { +} + +void Module2200::updateScene2240() { +} + +void Module2200::updateScene2241() { +} + +void Module2200::updateScene2242() { +} + +void Module2200::updateScene2243() { +} + +void Module2200::updateScene2244() { +} + +void Module2200::updateScene2245() { +} + +void Module2200::updateScene2246() { +} + +void Module2200::updateScene2247() { +} + +void Module2200::updateScene2248() { +} + +// Scene2201 + +AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + _x = 403; + _y = 259; + createSurface(100, 233, 96); + setFileHash(0x8600866, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); +} + +AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1) + : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _doorLightSprite(doorLightSprite), + _countdown(0), _doorOpen(flag1) { + + _x = 408; + _y = 290; + createSurface(900, 63, 266); + SetUpdateHandler(&AsScene2201Door::update); + SetMessageHandler(&AsScene2201Door::handleMessage); + if (_doorOpen) { + setFileHash(0xE2CB0412, -1, -1); + _countdown = 48; + _newHashListIndex = -2; + } else { + setFileHash(0xE2CB0412, 0, -1); + _newHashListIndex = 0; + _doorLightSprite->getSurface()->setVisible(false); + } +} + +void AsScene2201Door::update() { + if (_countdown != 0 && _doorOpen && (--_countdown == 0)) { + stCloseDoor(); + } + AnimatedSprite::update(); +} + +uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x11001090) { + if (_doorOpen) + _doorLightSprite->getSurface()->setVisible(true); + } else if (param.asInteger() == 0x11283090) { + if (!_doorOpen) + _doorLightSprite->getSurface()->setVisible(false); + } + break; + case 0x2000: + if (_doorOpen) + _countdown = 144; + messageResult = _doorOpen ? 1 : 0; + break; + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + _countdown = 144; + if (!_doorOpen) + stOpenDoor(); + break; + } + return messageResult; +} + +void AsScene2201Door::stOpenDoor() { + _doorOpen = true; + setFileHash(0xE2CB0412, 0, -1); + _newHashListIndex = -2; + _soundResource.play(calcHash("fxDoorOpen33")); +} + +void AsScene2201Door::stCloseDoor() { + _doorOpen = false; + setFileHash(0xE2CB0412, -1, -1); + _playBackwards = true; + _newHashListIndex = 0; + _soundResource.play(calcHash("fxDoorClose33")); +} + +Class444::Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex) + : StaticSprite(vm, 900) { + + _spriteResource.load2(kClass444FileHashes[spriteIndex]); + createSurface(100, 16, 16); + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -(_spriteResource.getDimensions().height / 2); + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = kClass444Points[pointIndex].x; + _y = kClass444Points[pointIndex].y; + _needRefresh = true; +} + +Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundFlag(false) { + + Sprite *tempSprite; + + if (!getSubVar(0x40050052, 0x60400854)) { + // TODO _vm->gameModule()->initScene2201Vars(); + } + + _surfaceFlag = true; + SetMessageHandler(&Scene2201::handleMessage); + SetUpdateHandler(&Scene2201::update); + + loadDataResource(0x04104242); + loadHitRectList(); + + _background = addBackground(new DirtyBackground(_vm, 0x40008208, 0, 0)); + _palette = new Palette(_vm, 0x40008208); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x0820C408, NULL)); + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + + _ssDoorButton = addSprite(new Class426(_vm, this, 0xE4A43E29, 0xE4A43E29, 100, 0)); + + for (uint32 i = 0; i < 9; i++) { + if ((int16)getSubVar(0x484498D0, i) >= 0) { + addSprite(new Class444(_vm, i, (int16)getSubVar(0x484498D0, i))); + } + } + + _rect1.y1 = 0; + _rect1.x2 = 640; + _rect2.x2 = 640; + _rect2.y2 = 480; + + if (!getGlobalVar(0x404290D5)) { + addSprite(new StaticSprite(_vm, 0x00026027, 900)); + } + + tempSprite = addSprite(new StaticSprite(_vm, 0x030326A0, 1100)); + _rect1.x1 = tempSprite->getSurface()->getDrawRect().x; + + addSprite(new StaticSprite(_vm, 0x811DA061, 1100)); + + tempSprite = addSprite(new StaticSprite(_vm, 0x11180022, 1100)); + _rect2.x1 = tempSprite->getSurface()->getDrawRect().x; + + tempSprite = addSprite(new StaticSprite(_vm, 0x0D411130, 1100)); + _rect1.y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; + _rect2.y1 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; + + _doorLightSprite = addSprite(new StaticSprite(_vm, 0xA4062212, 900)); + + if (which < 0) { + _klayman = new KmScene2201(_vm, this, 300, 427, &_rect1, 2); + setMessageList(0x004B8118); + _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); + } else if (which == 1) { + _klayman = new KmScene2201(_vm, this, 412, 393, &_rect1, 2); + setMessageList(0x004B8130); + _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); + } else if (which == 2) { + if (getGlobalVar(0xC0418A02)) { + _klayman = new KmScene2201(_vm, this, 379, 427, &_rect1, 2); + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmScene2201(_vm, this, 261, 427, &_rect1, 2); + } + setMessageList(0x004B8178); + _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); + } else { + NPoint pt = _dataResource.getPoint(0x0304D8DC); + _klayman = new KmScene2201(_vm, this, pt.x, pt.y, &_rect1, 2); + setMessageList(0x004B8120); + _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true)); + } + addSprite(_klayman); + + addSprite(new AsScene2201CeilingFan(_vm)); + + // TODO Sound1ChList_addSoundResource(0x04106220, 0x81212040, true); + +} + +Scene2201::~Scene2201() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + // TODO Sound1ChList_sub_407AF0(0x04106220); +} + +void Scene2201::update() { + Scene::update(); + if (!_soundFlag) { + // TODO Sound1ChList_playLooping(0x81212040); + _soundFlag = true; + } +} + +uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) { + _klayman->sendEntityMessage(0x1014, _ssDoorButton, this); + } else if (param.asInteger() == 0x35803198) { + if (_asDoor->hasMessageHandler() && _asDoor->sendMessage(0x2000, 0, this)) { + setMessageList(0x004B81A0); + } else { + setMessageList(0x004B81B8); + } + } else if (param.asInteger() == 0x51445010) { + if (getGlobalVar(0x404290D5)) { + setMessageList(0x004B8108); + } else { + setMessageList(0x004B8150); + } + } else if (param.asInteger() == 0x1D203082) { + setMessageList(0x004B8180); + } else if (param.asInteger() == 0x00049091) { + if (getGlobalVar(0x404290D5)) { + setMessageList(0x004B8138); + } else { + setMessageList(0x004B8108); + } + } + break; + case 0x480B: + if (sender == _ssDoorButton) { + _asDoor->sendMessage(0x4808, 0, this); + } + break; + case 0x4826: + if (sender == _asTape) { + _klayman->sendEntityMessage(0x1014, _asTape, this); + setMessageList(0x004B81C8); + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h new file mode 100644 index 0000000000..5b14606c4c --- /dev/null +++ b/engines/neverhood/module2200.h @@ -0,0 +1,206 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2200_H +#define NEVERHOOD_MODULE2200_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2200 + +class Module2200 : public Module { +public: + Module2200(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2200(); +protected: + void createScene2201(int which); + void createScene2202(int which); + void createScene2203(int which); + void createScene2204(int which); + void createScene2205(int which); + void createScene2206(int which); + void createScene2207(int which); + void createScene2208(int which); + void createScene2209(int which); + void createScene2210(int which); + void createScene2211(int which); + void createScene2212(int which); + void createScene2213(int which); + void createScene2214(int which); + void createScene2215(int which); + void createScene2216(int which); + void createScene2217(int which); + void createScene2218(int which); + void createScene2219(int which); + void createScene2220(int which); + void createScene2221(int which); + void createScene2222(int which); + void createScene2223(int which); + void createScene2224(int which); + void createScene2225(int which); + void createScene2226(int which); + void createScene2227(int which); + void createScene2228(int which); + void createScene2229(int which); + void createScene2230(int which); + void createScene2231(int which); + void createScene2232(int which); + void createScene2233(int which); + void createScene2234(int which); + void createScene2235(int which); + void createScene2236(int which); + void createScene2237(int which); + void createScene2238(int which); + void createScene2239(int which); + void createScene2240(int which); + void createScene2241(int which); + void createScene2242(int which); + void createScene2243(int which); + void createScene2244(int which); + void createScene2245(int which); + void createScene2246(int which); + void createScene2247(int which); + void createScene2248(int which); + void updateScene2201(); + void updateScene2202(); + void updateScene2203(); + void updateScene2204(); + void updateScene2205(); + void updateScene2206(); + void updateScene2207(); + void updateScene2208(); + void updateScene2209(); + void updateScene2210(); + void updateScene2211(); + void updateScene2212(); + void updateScene2213(); + void updateScene2214(); + void updateScene2215(); + void updateScene2216(); + void updateScene2217(); + void updateScene2218(); + void updateScene2219(); + void updateScene2220(); + void updateScene2221(); + void updateScene2222(); + void updateScene2223(); + void updateScene2224(); + void updateScene2225(); + void updateScene2226(); + void updateScene2227(); + void updateScene2228(); + void updateScene2229(); + void updateScene2230(); + void updateScene2231(); + void updateScene2232(); + void updateScene2233(); + void updateScene2234(); + void updateScene2235(); + void updateScene2236(); + void updateScene2237(); + void updateScene2238(); + void updateScene2239(); + void updateScene2240(); + void updateScene2241(); + void updateScene2242(); + void updateScene2243(); + void updateScene2244(); + void updateScene2245(); + void updateScene2246(); + void updateScene2247(); + void updateScene2248(); +}; + +// Scene2201 + +static const NPoint kClass444Points[] = { + {305, 305}, + {321, 305}, + {336, 305}, + {305, 319}, + {321, 319}, + {336, 319}, + {305, 332}, + {321, 332}, + {336, 333} +}; + +static const uint32 kClass444FileHashes[] = { + 0x88134A44, + 0xAA124340, + 0xB8124602, + 0xA902464C, + 0x890A4244, + 0xA8124642, + 0xB812C204, + 0x381A4A4C +}; + +class AsScene2201CeilingFan : public AnimatedSprite { +public: + AsScene2201CeilingFan(NeverhoodEngine *vm); +}; + +class AsScene2201Door : public AnimatedSprite { +public: + AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1); +protected: + SoundResource _soundResource; + Klayman *_klayman; + Sprite *_doorLightSprite; + bool _doorOpen; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); +}; + +class Class444 : public StaticSprite { +public: + Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex); +}; + + +class Scene2201 : public Scene { +public: + Scene2201(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2201(); +protected: + NRect _rect1; + NRect _rect2; + Sprite *_doorLightSprite; + Sprite *_asDoor; + Sprite *_ssDoorButton; + Sprite *_asTape; + bool _soundFlag; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2200_H */ diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 39824de7f9..ef8e532ef1 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -497,7 +497,7 @@ void DataResource::load(uint32 fileHash) { hitRect.rect.y1 = dataS.readUint16LE(); hitRect.rect.x2 = dataS.readUint16LE(); hitRect.rect.y2 = dataS.readUint16LE(); - hitRect.type = dataS.readUint16LE(); + hitRect.type = dataS.readUint16LE() + 0x5001; debug(3, "(%d, %d, %d, %d) -> %04d", hitRect.rect.x1, hitRect.rect.y1, hitRect.rect.x2, hitRect.rect.y2, hitRect.type); hitRectList->push_back(hitRect); } @@ -514,7 +514,7 @@ void DataResource::load(uint32 fileHash) { MessageItem messageItem; messageItem.messageNum = dataS.readUint32LE(); messageItem.messageValue = dataS.readUint32LE(); - debug(3, "(%04X, %08X)", messageItem.messageNum, messageItem.messageValue); + debug(3, "(%08X, %08X)", messageItem.messageNum, messageItem.messageValue); messageList->push_back(messageItem); } drDirectoryItem.offset = _messageLists.size(); @@ -602,12 +602,26 @@ NPointArray *DataResource::getPointArray(uint32 nameHash) { } HitRectList *DataResource::getHitRectList() { - // TODO + DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(calcHash("HitArray"), 3); + if (drDirectoryItem) + return _hitRectLists[drDirectoryItem->offset]; return NULL; } MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) { - // TODO + for (uint i = 0; i < _drRects.size(); i++) { + if (klaymanX >= _drRects[i].rect.x1 && klaymanX <= _drRects[i].rect.x2 && + klaymanY >= _drRects[i].rect.y1 && klaymanY <= _drRects[i].rect.y2) { + DRSubRectList *drSubRectList = _drSubRectLists[_drRects[i].subRectIndex]; + for (uint j = 0; j < drSubRectList->size(); j++) { + DRSubRect &subRect = (*drSubRectList)[j]; + if (mouseX >= subRect.rect.x1 && mouseX <= subRect.rect.x2 && + mouseY >= subRect.rect.y1 && mouseY <= subRect.rect.y2) { + return _messageLists[subRect.messageListItemIndex]; + } + } + } + } return NULL; } diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 2c6b10ef4b..2a01bc2869 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -36,7 +36,6 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _mouseClickPos.y = 0; _mouseClicked = false; _rectList = NULL; - // TODO _someRects = NULL; _klayman = NULL; _mouseCursor = NULL; _palette = NULL; @@ -332,10 +331,10 @@ bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { } bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { + int16 klaymanX = _klayman->getX(); + int16 klaymanY = _klayman->getY(); if (_rectType == 1) { RectList &rectList = *_rectList; - int16 klaymanX = _klayman->getX(); - int16 klaymanY = _klayman->getY(); for (uint i = 0; i < rectList.size(); i++) { debug("(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2); if (klaymanX >= rectList[i].rect.x1 && klaymanX <= rectList[i].rect.x2 && @@ -350,6 +349,10 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { } } } + } else if (_rectType == 2) { + MessageList *messageList = _dataResource.getMessageListAtPos(klaymanX, klaymanY, mouseX, mouseY); + if (messageList && messageList->size()) + setMessageList2(messageList, true, true); } return true; } @@ -440,7 +443,7 @@ void Scene::runMessageList() { if (_messageList && _klayman) { while (_messageList && _messageListIndex < _messageListCount && !_messageListFlag1) { - int messageNum = (*_messageList)[_messageListIndex].messageNum; + uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); @@ -450,7 +453,7 @@ void Scene::runMessageList() { _klayman->sendMessage(0x1021, 0, this); } if (_systemCallbackFlag) { - // TODO messageNum = systemConvertMessageCb(messageNum); + messageNum = convertMessageNum(messageNum); } if (messageNum != 0x4003) { if (messageNum == 0x1009 || messageNum == 0x1024) { @@ -514,10 +517,48 @@ void Scene::clearRectList() { _rectType = 0; } +void Scene::loadHitRectList() { + HitRectList *hitRectList = _dataResource.getHitRectList(); + debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList); + if (hitRectList) { + _hitRectList = *hitRectList; + _vm->_collisionMan->setHitRects(&_hitRectList); + } +} + void Scene::loadDataResource(uint32 fileHash) { _dataResource.load(fileHash); + _rectType = 2; if (_klayman) _klayman->loadDataResource(fileHash); } +uint16 Scene::convertMessageNum(uint32 messageNum) { + switch (messageNum) { + case 0x00004004: + return 0x4001; + case 0x00000083: + return 0x100A; + case 0x044001C8: + return 0x481C; + case 0x02420480: + return 0x4818; + case 0x08004025: + return 0x100D; + case 0x04404281: + return 0x4824; + case 0x08400880: + return 0x4825; + case 0x08209081: + return 0x4823; + case 0x24000060: + return 0x1009; + case 0x42002200: + return 0x4004; + case 0x428D4894: + return 0x101A; + } + return 0x1000; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index ab5cf9f90e..e3ed273d42 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -65,10 +65,8 @@ protected: bool _mouseClicked; DataResource _dataResource; RectList *_rectList; + HitRectList _hitRectList; int _rectType; - // rectListCount - // TODO 00000088 someRects dd ? - // TODO 0000008C someRectsCount dw ? // TODO 0000008E field_8E dw ? Sprite *_mouseCursor; Klayman *_klayman; @@ -104,8 +102,10 @@ protected: void setRectList(uint32 id); void setRectList(RectList *rectList); void clearRectList(); + void loadHitRectList(); void messageList402220(); void loadDataResource(uint32 fileHash); + uint16 convertMessageNum(uint32 messageNum); }; } // End of namespace Neverhood diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index 178e5c9eb5..c19c060487 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -50,7 +50,7 @@ struct RectItem { typedef Common::Array RectList; struct MessageItem { - uint16 messageNum; + uint32 messageNum; uint32 messageValue; }; -- cgit v1.2.3 From 28177361bf9406fce53db89b469e912219380b4d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 29 Aug 2011 10:23:04 +0000 Subject: NEVERHOOD: Add Hall of Records tables - Add tables for Scene2201 --- devtools/create_neverhood/create_neverhood.cpp | 99 +++++++++++++++++++++---- devtools/create_neverhood/tables.h | 56 ++++++++++++++ dists/engine-data/neverhood.dat | Bin 7592 -> 8080 bytes 3 files changed, 142 insertions(+), 13 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 14dd32db3d..1efc6161c4 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -60,6 +60,28 @@ byte *getData(uint32 offset) { return data + offset - dataStart + fileStart; } +const char *getStringP(uint32 offset) { + return offset != 0 ? (const char*)getData(offset) : NULL; +} + +uint32 calcHash(const char *value) { + if (!value) + return 0; + uint32 hash = 0, shiftValue = 0; + while (*value != 0) { + char ch = *value++; + if (ch >= 'a' && ch <= 'z') + ch -= 32; + else if (ch >= '0' && ch <= '9') + ch += 22; + shiftValue += ch - 64; + if (shiftValue >= 32) + shiftValue -= 32; + hash ^= 1 << shiftValue; + } + return hash; +} + struct HitRect { int16 x1, y1, x2, y2; uint16 messageNum; @@ -217,6 +239,36 @@ struct NavigationItem { }; +struct SceneInfo140Item { + uint32 bgFilename1; + uint32 bgFilename2; + uint32 txFilename; + uint32 bgFilename3; + byte xPosIndex; + byte count; + + void load(uint32 offset) { + byte *item = getData(offset); + // Only save the hashes instead of the full names + bgFilename1 = calcHash(getStringP(READ_LE_UINT32(item + 0))); + bgFilename2 = calcHash(getStringP(READ_LE_UINT32(item + 4))); + txFilename = calcHash(getStringP(READ_LE_UINT32(item + 8))); + bgFilename3 = calcHash(getStringP(READ_LE_UINT32(item + 12))); + xPosIndex = item[16]; + count = item[17]; + } + + void save(FILE *fd) { + writeUint32LE(fd, bgFilename1); + writeUint32LE(fd, bgFilename2); + writeUint32LE(fd, txFilename); + writeUint32LE(fd, bgFilename3); + writeByte(fd, xPosIndex); + writeByte(fd, count); + } + +}; + template class StaticDataList { public: @@ -346,10 +398,33 @@ public: }; +template +class StaticDataVector { +public: + std::vector items; + + void loadVector(const uint32 *offsets) { + for (int i = 0; offsets[i] != 0; i++) { + ITEMCLASS item; + item.load(offsets[i]); + items.push_back(item); + } + } + + void saveVector(FILE *fd) { + writeUint32LE(fd, items.size()); + for (typename std::vector::iterator it = items.begin(); it != items.end(); it++) { + (*it).save(fd); + } + } + +}; + StaticDataListVector hitRectLists; StaticDataListVector rectLists; StaticDataListVector messageLists; StaticDataListVector navigationLists; +StaticDataVector sceneInfo140Items; void addMessageList(uint32 messageListCount, uint32 messageListOffset) { MessageList *messageList = new MessageList(); @@ -363,24 +438,22 @@ int main(int argc, char *argv[]) { loadExe("nhc.exe"); - hitRectLists.loadListVector(hitRectListOffsets); - rectLists.loadListVector(rectListOffsets); - messageLists.loadListVector(messageListOffsets); - navigationLists.loadListVector(navigationListOffsets); - + hitRectLists.loadListVector(hitRectListOffsets); + rectLists.loadListVector(rectListOffsets); + messageLists.loadListVector(messageListOffsets); + navigationLists.loadListVector(navigationListOffsets); + sceneInfo140Items.loadVector(sceneInfo140Offsets); + datFile = fopen("neverhood.dat", "wb"); writeUint32LE(datFile, 0x11223344); // Some magic writeUint32LE(datFile, DAT_VERSION); - // Write all message lists - messageLists.saveListVector(datFile); - // Write all rect lists - rectLists.saveListVector(datFile); - // Write all hit rect lists - hitRectLists.saveListVector(datFile); - // Write all navigation lists - navigationLists.saveListVector(datFile); + messageLists.saveListVector(datFile); + rectLists.saveListVector(datFile); + hitRectLists.saveListVector(datFile); + navigationLists.saveListVector(datFile); + sceneInfo140Items.saveVector(datFile); fclose(datFile); diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index b2d5bc52ff..8a139f5e74 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -159,6 +159,19 @@ static const uint32 messageListOffsets[] = { 4, 0x004B35F0, 2, 0x004B3550, 1, 0x004B3530, + // Scene2201 + 1, 0x004B8118, + 1, 0x004B8130, + 1, 0x004B8178, + 2, 0x004B8120, + 3, 0x004B81A0, + 1, 0x004B81B8, + 2, 0x004B8108, + 5, 0x004B8150, + 4, 0x004B8180, + 3, 0x004B8138, + 2, 0x004B8108, + 2, 0x004B81C8, 0, 0 }; @@ -196,3 +209,46 @@ static const uint32 navigationListOffsets[] = { 1, 0x004B7FB0, 0, 0 }; + +// Hall of Records scene definitions + +static const uint32 sceneInfo140Offsets[] = { + 0x004B7180, + 0x004B7198, + 0x004B71B0, + 0x004B71C8, + 0x004B71E0, + 0x004B71F8, + 0x004B7210, + 0x004B7228, + 0x004B7240, + 0x004B7258, + 0x004B7270, + 0x004B7288, + 0x004B72A0, + 0x004B72B8, + 0x004B72D0, + 0x004B72E8, + 0x004B7300, + 0x004B7318, + 0x004B7330, + 0x004B7348, + 0x004B7360, + 0x004B7378, + 0x004B7390, + 0x004B73A8, + 0x004B73C0, + 0x004B73D8, + 0x004B73F0, + 0x004B7408, + 0x004B7420, + 0x004B7438, + 0x004B7450, + 0x004B7468, + 0x004B7480, + 0x004B7498, + 0x004B74B0, + 0x004B74C8, + 0 +}; + diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 84a6425ae6..fb36884f81 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From b64b0cfac2b066bfdd63e938624d742dc1123365 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 29 Aug 2011 10:41:39 +0000 Subject: NEVERHOOD: Implement updateScene2201 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2200.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index a118e4fb01..e797240e4e 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -444,7 +444,7 @@ void GameModule::updateModule2300() { _childObject = NULL; if (_field20 == 1) { createModule2200(0); - // TODO _childObject->handleUpdate(); + _childObject->handleUpdate(); } else if (_field20 == 2) { createModule1200(0); _childObject->handleUpdate(); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 9e4d083b8d..55f4192e7c 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -338,12 +338,18 @@ void Module2200::createScene2248(int which) { } void Module2200::updateScene2201() { - // TODO _childObject->handleUpdate(); if (_done) { _done = false; delete _childObject; _childObject = NULL; + if (_field20 == 1) { + createScene2203(0); + } else if (_field20 == 2) { + createScene2202(0); + } else { + _parentModule->sendMessage(0x1009, 0, this); + } } } -- cgit v1.2.3 From c4a4ce4e3561cbaa09e83e9938e6a41b79d8c0f0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 30 Aug 2011 14:02:12 +0000 Subject: NEVERHOOD: Implement Scene2202 (sliding puzzle) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2200.cpp | 400 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2200.h | 47 ++++- 3 files changed, 447 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e797240e4e..9d9a97a943 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 0; + _vm->gameState().sceneNum = 1; createModule2200(-1); #endif } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 55f4192e7c..e9cb8fa8f6 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -197,6 +197,10 @@ void Module2200::createScene2201(int which) { } void Module2200::createScene2202(int which) { + // TODO Music18hList_play(0x601C908C, 0, 2, 1); + _vm->gameState().sceneNum = 1; + _childObject = new Scene2202(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2202); } void Module2200::createScene2203(int which) { @@ -354,6 +358,13 @@ void Module2200::updateScene2201() { } void Module2200::updateScene2202() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene2201(2); + } } void Module2200::updateScene2203() { @@ -732,5 +743,394 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit } return 0; } + +static const NPoint kSsScene2202PuzzleTilePoints[] = { + {196, 105}, + {323, 102}, + {445, 106}, + {192, 216}, + {319, 220}, + {446, 216}, + {188, 320}, + {319, 319}, + {443, 322} +}; + +static const uint32 kSsScene2202PuzzleTileFileHashes1[] = { + 0xA500800C, + 0x2182910C, + 0x2323980C, + 0x23049084, + 0x21008080, + 0x2303900C, + 0x6120980C, + 0x2504D808 +}; + +static const uint32 kSsScene2202PuzzleTileFileHashes2[] = { + 0x0AAD8080, + 0x0A290291, + 0x0A2BA398, + 0x822B8490, + 0x86298080, + 0x0A2B8390, + 0x0A69A098, + 0x0E2D84D8 +}; + +SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value) + : StaticSprite(vm, 900), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene), + _value(value), _tileIndex(tileIndex), _isMoving(false) { + + debug("#1 _value = %d; _tileIndex = %d", _value, _tileIndex); + SetUpdateHandler(&SsScene2202PuzzleTile::update); + SetMessageHandler(&SsScene2202PuzzleTile::handleMessage); + debug("#2"); + _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); + if (_tileIndex >= 0 && _tileIndex <= 2) { + createSurface(100, 128, 128); + } else if (_tileIndex >= 3 && _tileIndex <= 5) { + createSurface(300, 128, 128); + } else { + createSurface(500, 128, 128); + } + debug("#3"); + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -(_spriteResource.getDimensions().height / 2); + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _deltaRect = _drawRect; + _x = kSsScene2202PuzzleTilePoints[_tileIndex].x; + _y = kSsScene2202PuzzleTilePoints[_tileIndex].y; + processDelta(); + _needRefresh = true; + StaticSprite::update(); + _soundResource1.load(0x40958621); + _soundResource2.load(0x51108241); + debug("LOAD OK"); +} + +void SsScene2202PuzzleTile::update() { + handleSpriteUpdate(); + StaticSprite::update(); +} + +uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isMoving && !getGlobalVar(0x404290D5)) { + _parentScene->sendMessage(0x2000, _tileIndex, this); + } + messageResult = 1; + break; + case 0x2001: + _isMoving = true; + moveTile(param.asInteger()); + break; + } + return messageResult; +} +void SsScene2202PuzzleTile::suMoveTileX() { + + bool done = false; + + if (_counterDirection) { + if (_counter > 2) + _counter -= 2; + } else { + if (_counter < 20) + _counter += 2; + } + + for (int16 i = 0; i < _counter; i++) { + _x += _xIncr; + _errValue += _yDelta; + if (_errValue >= _xDelta) { + _errValue -= _xDelta; + _y += _yIncr; + } + if (_x == _newX && _y == _newY) { + done = true; + break; + } + if (_x == _xFlagPos) + _counterDirection = true; + } + + if (done) { + stopMoving(); + } + + processDelta(); + +} + +void SsScene2202PuzzleTile::suMoveTileY() { + + bool done = false; + + if (_counterDirection) { + if (_counter > 2) + _counter -= 2; + } else { + if (_counter < 20) + _counter += 2; + } + + for (int16 i = 0; i < _counter; i++) { + _y += _yIncr; + _errValue += _xDelta; + if (_errValue >= _yDelta) { + _errValue -= _yDelta; + _x += _xIncr; + } + if (_x == _newX && _y == _newY) { + done = true; + break; + } + if (_x == _xFlagPos) + _counterDirection = true; + } + + if (done) { + stopMoving(); + } + + processDelta(); + +} + +void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { + + _spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]); + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -(_spriteResource.getDimensions().height / 2); + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _needRefresh = true; + + setSubVar(0x484498D0, _tileIndex, (uint32)-1); + setSubVar(0x484498D0, newTileIndex, (uint32)_value); + + _tileIndex = newTileIndex; + + _errValue = 0; + _counterDirection = false; + _counter = 0; + + _newX = kSsScene2202PuzzleTilePoints[newTileIndex].x; + _newY = kSsScene2202PuzzleTilePoints[newTileIndex].y; + + if (_x == _newX && _y == _newY) + return; + + if (_x <= _newX) { + if (_y <= _newY) { + _xDelta = _newX - _x; + _yDelta = _newY - _y; + _xIncr = 1; + _yIncr = 1; + } else { + _xDelta = _newX - _x; + _yDelta = _y - _newY; + _xIncr = 1; + _yIncr = -1; + } + } else { + if (_y <= _newY) { + _xDelta = _x - _newX; + _yDelta = _newY - _y; + _xIncr = -1; + _yIncr = 1; + } else { + _xDelta = _x - _newX; + _yDelta = _y - _newY; + _xIncr = -1; + _yIncr = -1; + } + } + + if (_xDelta > _yDelta) { + SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileX); + if (_xIncr > 0) { + if (_newX - _x >= 180) + _xFlagPos = _newX - 90; + else + _xFlagPos = _x + _newX / 2; + } else { + if (_x - _newX >= 180) + _xFlagPos = _x + 90; + else + _xFlagPos = _x / 2 + _newX; + } + _soundResource1.play(); + } else { + SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileY); + if (_yIncr > 0) { + if (_newY - _y >= 180) + _xFlagPos = _newY - 90; + else + _xFlagPos = _y + _newY / 2; + } else { + if (_y - _newY >= 180) + _xFlagPos = _y + 90; + else + _xFlagPos = _y / 2 + _newY; + } + _soundResource2.play(); + } + +} + +void SsScene2202PuzzleTile::stopMoving() { + _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -(_spriteResource.getDimensions().height / 2); + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _needRefresh = true; + SetSpriteCallback(NULL); + _isMoving = false; + _parentScene->sendMessage(0x2002, _tileIndex, this); +} + +Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), + _isSolved(false), _leaveScene(false), _isTileMoving(false), _movingTileSprite(NULL), _doneMovingTileSprite(NULL) { + + Palette2 *palette2; + + // TODO initScene2201Vars(); + SetMessageHandler(&Scene2202::handleMessage); + SetUpdateHandler(&Scene2202::update); + + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x08100A0C, 0, 0)); + palette2 = new Palette2(_vm, 0x08100A0C); + _palette = palette2; + _palette->usePalette(); + addEntity(palette2); + _mouseCursor = addSprite(new Mouse435(_vm, 0x00A08089, 20, 620)); + + //DEBUG! + for (uint32 index = 0; index < 9; index++) + setSubVar(0x484498D0, index, 7 - index); + + for (uint32 index = 0; index < 9; index++) { + int16 value = (int16)getSubVar(0x484498D0, index); + if (value >= 0) { + Sprite *puzzleTileSprite = addSprite(new SsScene2202PuzzleTile(_vm, this, index, value)); + _vm->_collisionMan->addSprite(puzzleTileSprite); + } + } + + addSprite(new StaticSprite(_vm, 0x55C043B8, 200)); + addSprite(new StaticSprite(_vm, 0x85500158, 400)); + addSprite(new StaticSprite(_vm, 0x25547028, 600)); + + _soundResource1.load(0x68E25540); + _soundResource2.load(0x40400457); + + // TODO Sound1ChList_addSoundResource(0x60400854, 0x8101A241, true); + // TODO Sound1ChList_playLooping(0x8101A241); + +} + +Scene2202::~Scene2202() { + // TODO Sound1ChList_sub_407AF0(0x60400854); +} + +void Scene2202::update() { + Scene::update(); + + if (_leaveScene && !_soundResource2.isPlaying()) { + _parentModule->sendMessage(0x1009, 0, this); + } + + if (_isSolved && !_soundResource1.isPlaying()) { + _soundResource2.play(); + _isSolved = false; + _leaveScene = true; + } + + if (_movingTileSprite && !_isTileMoving) { + int16 value = getFreeTileIndex(_movingTileIndex); + if (value != -1) { + setSurfacePriority(_movingTileSprite->getSurface(), 700); + _movingTileSprite->sendMessage(0x2001, value, this); + _movingTileSprite = NULL; + _isTileMoving = true; + } + } + + if (_doneMovingTileSprite) { + setSurfacePriority(_doneMovingTileSprite->getSurface(), _surfacePriority); + _doneMovingTileSprite = NULL; + if (testIsSolved()) { + _soundResource1.play(); + setGlobalVar(0x404290D5, 1); + _isSolved = true; + } + } + +} + +uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO Debug stuff + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + case 0x000D: + // TODO Debug stuff + break; + case 0x2000: + _movingTileIndex = (int16)param.asInteger(); + _movingTileSprite = (Sprite*)sender; + break; + case 0x2002: + _isTileMoving = false; + _doneMovingTileSprite = (Sprite*)sender; + if (param.asInteger() >= 0 && param.asInteger() <= 2) { + _surfacePriority = 100; + } else if (param.asInteger() >= 3 && param.asInteger() <= 5) { + _surfacePriority = 300; + } else { + _surfacePriority = 500; + } + break; + } + return 0; +} + +int16 Scene2202::getFreeTileIndex(int16 index) { + if (index >= 3 && (int16)getSubVar(0x484498D0, index - 3) == -1) { + return index - 3; + } else if (index <= 5 && (int16)getSubVar(0x484498D0, index + 3) == -1) { + return index + 3; + } else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(0x484498D0, index - 1) == -1) { + return index - 1; + } else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(0x484498D0, index + 1) == -1) { + return index + 1; + } else + return -1; +} + +bool Scene2202::testIsSolved() { + return + getSubVar(0x484498D0, 0) == 0 && + getSubVar(0x484498D0, 2) == 2 && + getSubVar(0x484498D0, 3) == 3 && + getSubVar(0x484498D0, 4) == 4 && + getSubVar(0x484498D0, 5) == 5 && + getSubVar(0x484498D0, 6) == 6 && + getSubVar(0x484498D0, 8) == 7; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 5b14606c4c..d7f41d6f20 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -184,7 +184,6 @@ public: Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex); }; - class Scene2201 : public Scene { public: Scene2201(NeverhoodEngine *vm, Module *parentModule, int which); @@ -201,6 +200,52 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class SsScene2202PuzzleTile : public StaticSprite { +public: + SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value); +protected: + Scene *_parentScene; + int16 _value; + int16 _tileIndex; + int16 _newX, _newY; + int16 _xDelta, _yDelta; + int16 _xIncr; + int16 _yIncr; + int16 _errValue; + int16 _counter; + int16 _xFlagPos; + bool _counterDirection; + bool _isMoving; + SoundResource _soundResource1; + SoundResource _soundResource2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveTileX(); + void suMoveTileY(); + void moveTile(int16 newTileIndex); + void stopMoving(); +}; + +class Scene2202 : public Scene { +public: + Scene2202(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2202(); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + Sprite *_movingTileSprite; + Sprite *_doneMovingTileSprite; + bool _isTileMoving; + int16 _movingTileIndex; + int _surfacePriority; + bool _leaveScene; + bool _isSolved; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + int16 getFreeTileIndex(int16 index); + bool testIsSolved(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ -- cgit v1.2.3 From 9273c2e97ab90068faf01df246f89d939804ee79 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 31 Aug 2011 10:50:49 +0000 Subject: NEVERHOOD: Add tables for Scene2203 --- devtools/create_neverhood/tables.h | 15 +++++++++++++++ dists/engine-data/neverhood.dat | Bin 8080 -> 8394 bytes 2 files changed, 15 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 8a139f5e74..1956ece8c6 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -29,6 +29,8 @@ static const uint32 hitRectListOffsets[] = { 4, 0x004AEBD0, // Scene1705 1, 0x004B69D8, + // Scene2203 + 1, 0x004B8320, 0, 0 }; @@ -63,6 +65,8 @@ static const uint32 rectListOffsets[] = { // Scene2001 1, 0x004B3680, 1, 0x004B3670, + // Scene2203 + 1, 0x004B8420, 0, 0 }; @@ -172,6 +176,17 @@ static const uint32 messageListOffsets[] = { 3, 0x004B8138, 2, 0x004B8108, 2, 0x004B81C8, + // Scene2203 + 1, 0x004B8340, + 1, 0x004B8350, + 1, 0x004B8358, + 1, 0x004B8348, + 3, 0x004B83B0, + 3, 0x004B83C8, + 2, 0x004B8370, + 2, 0x004B8360, + 2, 0x004B83E0, + 2, 0x004B83F0, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index fb36884f81..e27396b12a 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 31457e11aa423e9350d08e6bc5663eccfdd448bd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 31 Aug 2011 13:15:55 +0000 Subject: NEVERHOOD: Implement Scene2203 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 97 +++++++++++++++ engines/neverhood/klayman.h | 9 ++ engines/neverhood/module2200.cpp | 254 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2200.h | 38 ++++++ 5 files changed, 393 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 9d9a97a943..daa0555c84 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 1; + _vm->gameState().sceneNum = 2; createModule2200(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 50dd23101c..8eab4a2e36 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -1765,6 +1765,17 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub420750() { + if (!sub41CEB0(AnimationCallback(&Klayman::sub420750))) { + _status2 = 2; + _flagE5 = false; + setFileHash(0x5CCCB330, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41DD20); + } +} + void Klayman::sub4207A0() { if (!sub41CEB0(AnimationCallback(&Klayman::sub4207A0))) { _status2 = 2; @@ -1997,6 +2008,20 @@ uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam ¶m, E return handleMessage41D480(messageNum, param, sender); } +uint32 Klayman::handleMessage41DD20(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040D4186) { + if (_attachedSprite) { + _attachedSprite->sendMessage(0x4808, 0, this); + } + } + break; + } + return messageResult; +} + //############################################################################## // KmScene1001 @@ -3498,4 +3523,76 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene2203::KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + }else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x4818: + sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x4819: + setCallback2(AnimationCallback(&Klayman::sub420750)); + break; + case 0x481A: + setCallback2(AnimationCallback(&Klayman::sub420680)); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 1c02f1e9cf..8ca56cc5d9 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -82,6 +82,7 @@ public: void sub421070(); void sub420420(); void sub420ED0(); + void sub420750(); void sub4207A0(); void sub4207F0(); void sub420F20(); @@ -237,6 +238,7 @@ protected: uint32 handleMessage41D640(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41EAB0(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D970(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41DD20(int messageNum, const MessageParam ¶m, Entity *sender); void update41D1C0(); @@ -377,6 +379,13 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2203 : public Klayman { +public: + KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index e9cb8fa8f6..23f8d73f58 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -204,6 +204,10 @@ void Module2200::createScene2202(int which) { } void Module2200::createScene2203(int which) { + // TODO Music18hList_play(0x601C908C, 0, 2, 1); + _vm->gameState().sceneNum = 2; + _childObject = new Scene2203(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2203); } void Module2200::createScene2204(int which) { @@ -368,6 +372,22 @@ void Module2200::updateScene2202() { } void Module2200::updateScene2203() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2205(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene2204(0); + _childObject->handleUpdate(); + } else { + createScene2201(1); + _childObject->handleUpdate(); + } + } } void Module2200::updateScene2204() { @@ -782,10 +802,8 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS : StaticSprite(vm, 900), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) { - debug("#1 _value = %d; _tileIndex = %d", _value, _tileIndex); SetUpdateHandler(&SsScene2202PuzzleTile::update); SetMessageHandler(&SsScene2202PuzzleTile::handleMessage); - debug("#2"); _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); if (_tileIndex >= 0 && _tileIndex <= 2) { createSurface(100, 128, 128); @@ -794,7 +812,6 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS } else { createSurface(500, 128, 128); } - debug("#3"); _drawRect.x = -(_spriteResource.getDimensions().width / 2); _drawRect.y = -(_spriteResource.getDimensions().height / 2); _drawRect.width = _spriteResource.getDimensions().width; @@ -807,7 +824,6 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS StaticSprite::update(); _soundResource1.load(0x40958621); _soundResource2.load(0x51108241); - debug("LOAD OK"); } void SsScene2202PuzzleTile::update() { @@ -913,9 +929,9 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { setSubVar(0x484498D0, _tileIndex, (uint32)-1); setSubVar(0x484498D0, newTileIndex, (uint32)_value); - + _tileIndex = newTileIndex; - + _errValue = 0; _counterDirection = false; _counter = 0; @@ -1133,4 +1149,230 @@ bool Scene2202::testIsSolved() { getSubVar(0x484498D0, 8) == 7; } +static const uint32 kClass545FileHashes[] = { + 0x2450D850, + 0x0C9CE8D0, + 0x2C58A152 +}; + +Class545::Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y) + : AnimatedSprite(vm, kClass545FileHashes[index], surfacePriority, x, y), _parentScene(parentScene), _index(index) { + + if (!getSubVar(0x0090EA95, _index) && !getSubVar(0x08D0AB11, _index)) { + SetMessageHandler(&Class545::handleMessage); + } else { + _surface->setVisible(false); + SetMessageHandler(NULL); + } +} + +uint32 Class545::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4806: + setSubVar(0x0090EA95, _index, 1); + _surface->setVisible(false); + SetMessageHandler(NULL); + } + return messageResult; +} + +static const uint32 kAsScene2203DoorFileHashes[] = { + 0x7868AE10, + 0x1A488110 +}; + +AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), + _index(index) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2203Door::handleMessage); + _x = 320; + _y = 240; + createSurface1(kAsScene2203DoorFileHashes[_index], 900); + if (getGlobalVar(0x9A500914) == _index) { + setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1); + _newHashListIndex = -2; + } else { + setFileHash(kAsScene2203DoorFileHashes[_index], 0, -1); + _newHashListIndex = 0; + } +} + +uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_index == getGlobalVar(0x9A500914)) + _parentScene->sendMessage(0x2002, 0, this); + else + _parentScene->sendMessage(0x2001, 0, this); + messageResult = 1; + break; + case 0x2000: + _otherDoor = (Sprite*)param.asEntity(); + break; + case 0x3002: + if (_index == getGlobalVar(0x9A500914)) + _parentScene->sendMessage(0x4808, 0, this); + setFileHash1(); + break; + case 0x4808: + setGlobalVar(0x9A500914, _index); + _otherDoor->sendMessage(0x4809, 0, this); + openDoor(); + break; + case 0x4809: + closeDoor(); + _parentScene->sendMessage(0x2003, 0, this); + break; + } + return messageResult; +} + +void AsScene2203Door::openDoor() { + _soundResource.play(0x341014C4); + setFileHash(kAsScene2203DoorFileHashes[_index], 1, -1); +} + +void AsScene2203Door::closeDoor() { + setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1); + _playBackwards = true; + _newHashListIndex = 0; +} + +Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) + setGlobalVar(0x13382860, 1); + + SetMessageHandler(&Scene2203::handleMessage); + _surfaceFlag = true; + + _background = addBackground(new DirtyBackground(_vm, 0x82C80334, 0, 0)); + _palette = new Palette(_vm, 0x82C80334); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x80330824, NULL)); + + _vm->_collisionMan->setHitRects(0x004B8320); + + if (getGlobalVar(0x13382860) == 1) { + _class545 = addSprite(new Class545(_vm, this, 2, 1100, 282, 432)); + _vm->_collisionMan->addSprite(_class545); + } + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 1, 1100, 435, 432, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + + _asLeftDoor = addSprite(new AsScene2203Door(_vm, this, 0)); + _asRightDoor = addSprite(new AsScene2203Door(_vm, this, 1)); + + _ssSmallLeftDoor = addSprite(new StaticSprite(_vm, 0x542CC072, 1100)); + _ssSmallRightDoor = addSprite(new StaticSprite(_vm, 0x0A2C0432, 1100)); + + _leftDoorClipRect.x1 = _ssSmallLeftDoor->getSurface()->getDrawRect().x; + _leftDoorClipRect.y1 = 0; + _leftDoorClipRect.x2 = 640; + _leftDoorClipRect.y2 = 480; + + _rightDoorClipRect.x1 = 0; + _rightDoorClipRect.y1 = 0; + _rightDoorClipRect.x2 = _ssSmallRightDoor->getSurface()->getDrawRect().x + _ssSmallRightDoor->getSurface()->getDrawRect().width; + _rightDoorClipRect.y2 = 480; + + _asLeftDoor->sendEntityMessage(0x2000, _asRightDoor, this); + _asRightDoor->sendEntityMessage(0x2000, _asLeftDoor, this); + + _vm->_collisionMan->addSprite(_asLeftDoor); + _vm->_collisionMan->addSprite(_asRightDoor); + + if (which < 0) { + _klayman = new KmScene2203(_vm, this, 200, 427); + setMessageList(0x004B8340); + } else if (which == 1) { + _klayman = new KmScene2203(_vm, this, 640, 427); + setMessageList(0x004B8350); + } else if (which == 2) { + if (getGlobalVar(0xC0418A02)) { + _klayman = new KmScene2203(_vm, this, 362, 427); + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmScene2203(_vm, this, 202, 427); + } + setMessageList(0x004B8358); + } else { + _klayman = new KmScene2203(_vm, this, 0, 427); + setMessageList(0x004B8348); + } + addSprite(_klayman); + + if (getGlobalVar(0x9A500914)) { + _ssSmallLeftDoor->getSurface()->setVisible(false); + _klayman->getSurface()->getClipRect() = _rightDoorClipRect; + } else { + _ssSmallRightDoor->getSurface()->setVisible(false); + _klayman->getSurface()->getClipRect() = _leftDoorClipRect; + } + + setRectList(0x004B8420); + +} + +Scene2203::~Scene2203() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + _klayman->sendEntityMessage(0x1014, sender, this); + if (sender == _asLeftDoor) { + setMessageList2(0x004B83B0); + } else { + setMessageList2(0x004B83C8); + } + break; + case 0x2002: + if (sender == _asLeftDoor) { + setMessageList2(0x004B8370); + } else { + setMessageList2(0x004B8360); + } + break; + case 0x2003: + if (sender == _asLeftDoor) { + _ssSmallLeftDoor->getSurface()->setVisible(false); + } else { + _ssSmallRightDoor->getSurface()->setVisible(false); + } + break; + case 0x4808: + if (sender == _asLeftDoor) { + _ssSmallLeftDoor->getSurface()->setVisible(true); + _klayman->getSurface()->getClipRect() = _leftDoorClipRect; + } else { + _ssSmallRightDoor->getSurface()->setVisible(true); + _klayman->getSurface()->getClipRect() = _rightDoorClipRect; + } + break; + case 0x4826: + if (sender == _asTape) { + _klayman->sendEntityMessage(0x1014, _asTape, this); + setMessageList(0x004B83E0); + } else if (sender == _class545) { + _klayman->sendEntityMessage(0x1014, _class545, this); + setMessageList(0x004B83F0); + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index d7f41d6f20..6a0634f600 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -246,6 +246,44 @@ protected: bool testIsSolved(); }; +class Class545 : public AnimatedSprite { +public: + Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y); +protected: + Scene *_parentScene; + int _index; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2203Door : public AnimatedSprite { +public: + AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index); +protected: + Scene *_parentScene; + SoundResource _soundResource; + Sprite *_otherDoor; + int _index; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void openDoor(); + void closeDoor(); +}; + +class Scene2203 : public Scene { +public: + Scene2203(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2203(); +protected: + Sprite *_asLeftDoor; + Sprite *_asRightDoor; + Sprite *_ssSmallLeftDoor; + Sprite *_ssSmallRightDoor; + Sprite *_asTape; + Sprite *_class545; + NRect _leftDoorClipRect; + NRect _rightDoorClipRect; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ -- cgit v1.2.3 From 732f7c8845bf694e30f3d8c1ffe4b33a5a06a7c7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 31 Aug 2011 13:52:58 +0000 Subject: NEVERHOOD: Add Scene2204 (just a DiskplayerScene) --- engines/neverhood/module2200.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 23f8d73f58..e8fd77dc18 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -23,6 +23,7 @@ #include "neverhood/module2200.h" #include "neverhood/module1000.h" #include "neverhood/module1200.h" +#include "neverhood/diskplayerscene.h" namespace Neverhood { @@ -211,6 +212,10 @@ void Module2200::createScene2203(int which) { } void Module2200::createScene2204(int which) { + _vm->gameState().sceneNum = 3; + // TODO Music18hList_stop(0x601C908C, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 3); + SetUpdateHandler(&Module2200::updateScene2204); } void Module2200::createScene2205(int which) { @@ -391,6 +396,13 @@ void Module2200::updateScene2203() { } void Module2200::updateScene2204() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene2203(2); + } } void Module2200::updateScene2205() { -- cgit v1.2.3 From e177dcf911fc7034faef9c378f7b95f2355ec66b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 1 Sep 2011 10:18:49 +0000 Subject: NEVERHOOD: Implement Scene2205 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 63 ++++++++++++++ engines/neverhood/klayman.h | 22 +++-- engines/neverhood/module1000.cpp | 26 ++++++ engines/neverhood/module1000.h | 2 +- engines/neverhood/module2200.cpp | 180 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2200.h | 20 +++++ engines/neverhood/mouse.h | 6 +- 8 files changed, 310 insertions(+), 11 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index daa0555c84..fd603a8972 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 2; + _vm->gameState().sceneNum = 4; createModule2200(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 8eab4a2e36..404cce5e76 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3595,4 +3595,67 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmScene2205::xUpdate() { + setGlobalVar(0x18288913, _frameIndex); +} + +uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&KmScene2205::sub423980)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4816: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x4818: + sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +void KmScene2205::sub423980() { + int16 frameIndex = getGlobalVar(0x18288913); + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetAnimationCallback3(&Klayman::sub41FA40); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 8ca56cc5d9..d9d63b1011 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -111,20 +111,27 @@ public: void sub420EB0(); void sub420680(); void sub41F9E0(); + void sub41FA40(); + void sub41FB30(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); void spriteUpdate41F780(); void spriteUpdate41F230(); void spriteUpdate41F5A0(); + void spriteUpdate41F300(); + void spriteUpdate41F320(); uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); void setKlaymanTable(const KlaymanTableItem *table, int tableCount); void setKlaymanTable1(); void setKlaymanTable2(); void setKlaymanTable3(); + + void setSoundFlag(bool value) { _soundFlag = value; } protected: Entity *_parentScene; @@ -204,14 +211,8 @@ protected: uint32 handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender); void sub41CD70(int16 x); void sub41F950(); - void sub41FB30(); uint32 handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate41F300(); - uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41FA40(); - void spriteUpdate41F320(); - uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender); @@ -386,6 +387,15 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2205 : public Klayman { +public: + KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + void sub423980(); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 8ee5941d95..69c6014aa2 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -972,6 +972,32 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui } +void Class426::setFileHashes(uint32 fileHash1, uint32 fileHash2) { + _fileHashes[0] = fileHash1; + _fileHashes[1] = fileHash2; + if (_status == 2) { + _spriteResource.load2(fileHash2); + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); + } else { + _spriteResource.load2(fileHash1); + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); + } +} + void Class426::update() { if (_countdown != 0 && (--_countdown) == 0) { if (_status == 1) { diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 0e3f950c3e..5229e7a083 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -202,7 +202,7 @@ protected: class Class426 : public StaticSprite { public: Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); - // TODO Class426_sub433660 (not used yet) + void setFileHashes(uint32 fileHash1, uint32 fileHash2); protected: Scene *_parentScene; int _countdown; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index e8fd77dc18..e7e025750f 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -219,6 +219,10 @@ void Module2200::createScene2204(int which) { } void Module2200::createScene2205(int which) { + _vm->gameState().sceneNum = 4; + // TODO Music18hList_stop(0x601C908C, 0, 2); + _childObject = new Scene2205(_vm, this, 3); + SetUpdateHandler(&Module2200::updateScene2205); } void Module2200::createScene2206(int which) { @@ -406,6 +410,22 @@ void Module2200::updateScene2204() { } void Module2200::updateScene2205() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2206(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene2205(2); + _childObject->handleUpdate(); + } else { + createScene2203(1); + _childObject->handleUpdate(); + } + } } void Module2200::updateScene2206() { @@ -1387,4 +1407,164 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + SetMessageHandler(&SsScene2205DoorFrame::handleMessage); + _spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0); + createSurface(1100, 45, 206); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); +} + +uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + _spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); + } + return messageResult; +} + +Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Palette2 *palette2; + + SetMessageHandler(&Scene2205::handleMessage); + SetUpdateHandler(&Scene2205::update); + + _vm->_collisionMan->setHitRects(0x004B0620); + _surfaceFlag = true; + + if (getGlobalVar(0x4D080E54)) { + _isLightOn = true; + _background = addBackground(new DirtyBackground(_vm, 0x0008028D, 0, 0)); + palette2 = new Palette2(_vm, 0x0008028D); + _palette = palette2; + _palette->usePalette(); + addEntity(palette2); + _mouseCursor = addSprite(new Mouse433(_vm, 0x80289008, NULL)); + _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0); + addSprite(_ssLightSwitch); + } else { + _isLightOn = false; + _background = addBackground(new DirtyBackground(_vm, 0xD00A028D, 0, 0)); + palette2 = new Palette2(_vm, 0xD00A028D); + _palette = palette2; + _palette->usePalette(); + addEntity(palette2); + _mouseCursor = addSprite(new Mouse433(_vm, 0xA0289D08, NULL)); + _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0); + addSprite(_ssLightSwitch); + } + + palette2->addPalette(0xD00A028D, 0, 256, 0); + + _ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm)); + + if (which < 0) { + _klayman = new KmScene2205(_vm, this, 320, 417); + setMessageList(0x004B0658); + if (!getGlobalVar(0x4D080E54)) { + _palette->addPalette(0x68033B1C, 0, 65, 0); + } + _isKlaymanInLight = false; + } else if (which == 1) { + _klayman = new KmScene2205(_vm, this, 640, 417); + setMessageList(0x004B0648); + if (!getGlobalVar(0x4D080E54)) { + _palette->addPalette(0x68033B1C, 0, 65, 0); + } + _isKlaymanInLight = false; + } else { + _klayman = new KmScene2205(_vm, this, 0, 417); + setMessageList(0x004B0640); + _isKlaymanInLight = true; + } + addSprite(_klayman); + + _klayman->getSurface()->getClipRect().x1 = _ssDoorFrame->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + + loadDataResource(0x00144822); + _klayman->setSoundFlag(true); + +} + +void Scene2205::update() { + Scene::update(); + + if (!_isLightOn && getGlobalVar(0x4D080E54)) { + _palette->addPalette(0x0008028D, 0, 256, 0); + _background->load(0x0008028D); + _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); + _ssDoorFrame->sendMessage(0x2000, 0, this); + ((Mouse433*)_mouseCursor)->load(0x80289008); + ((Mouse433*)_mouseCursor)->updateCursor(); + _isLightOn = true; + } else if (_isLightOn && !getGlobalVar(0x4D080E54)) { + _palette->addPalette(0xD00A028D, 0, 256, 0); + _background->load(0xD00A028D); + _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); + _ssDoorFrame->sendMessage(0x2000, 0, this); + ((Mouse433*)_mouseCursor)->load(0xA0289D08); + ((Mouse433*)_mouseCursor)->updateCursor(); + _isKlaymanInLight = true; + if (_klayman->getX() > 85) { + _palette->addPalette(0x68033B1C, 0, 65, 0); + _isKlaymanInLight = false; + } + _isLightOn = false; + } + + if (!getGlobalVar(0x4D080E54)) { + if (_isKlaymanInLight && _klayman->getX() > 85) { + ((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + _isKlaymanInLight = false; + } else if (!_isKlaymanInLight && _klayman->getX() <= 85) { + ((Palette2*)_palette)->addPalette(0xD00A028D, 0, 65, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + _isKlaymanInLight = true; + } + } + +} + +uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x6449569A) { + setMessageList(0x004B0690); + } else if (param.asInteger() == 0x2841369C) { + setMessageList(0x004B0630); + } else if (param.asInteger() == 0x402064D8) { + _klayman->sendEntityMessage(0x1014, _ssLightSwitch, this); + } + break; + case 0x480B: + setGlobalVar(0x4D080E54, getGlobalVar(0x4D080E54) ? 0 : 1); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 6a0634f600..c79edb44d6 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -26,6 +26,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/module1000.h" namespace Neverhood { @@ -284,6 +285,25 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class SsScene2205DoorFrame : public StaticSprite { +public: + SsScene2205DoorFrame(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2205 : public Scene { +public: + Scene2205(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Class426 *_ssLightSwitch; + Sprite *_ssDoorFrame; + bool _isKlaymanInLight; + bool _isLightOn; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index 4f27cb4e95..65dcb27856 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -34,19 +34,20 @@ class Mouse433 : public StaticSprite { public: Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect); void load(uint32 fileHash); + void updateCursor(); protected: MouseCursorResource _mouseCursorResource; int _frameNum; NRect _mouseRect; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void updateCursor(); }; class Mouse435 : public StaticSprite { public: Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2); void load(uint32 fileHash); + void updateCursor(); protected: MouseCursorResource _mouseCursorResource; int _frameNum; @@ -54,20 +55,19 @@ protected: int16 _x2; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void updateCursor(); }; class NavigationMouse : public StaticSprite { public: NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type); void load(uint32 fileHash); + void updateCursor(); protected: MouseCursorResource _mouseCursorResource; int _frameNum; int _type; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void updateCursor(); }; } // End of namespace Neverhood -- cgit v1.2.3 From 8729ca04d9b7cc42417f8824ccb383fe403058f3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 1 Sep 2011 10:19:08 +0000 Subject: NEVERHOOD: Add tables for Scene2205 --- devtools/create_neverhood/tables.h | 8 ++++++++ dists/engine-data/neverhood.dat | Bin 8394 -> 8512 bytes 2 files changed, 8 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 1956ece8c6..238edc8297 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -31,6 +31,8 @@ static const uint32 hitRectListOffsets[] = { 1, 0x004B69D8, // Scene2203 1, 0x004B8320, + // Scene2205 + 1, 0x004B0620, 0, 0 }; @@ -187,6 +189,12 @@ static const uint32 messageListOffsets[] = { 2, 0x004B8360, 2, 0x004B83E0, 2, 0x004B83F0, + // Scene2205 + 1, 0x004B0658, + 2, 0x004B0648, + 1, 0x004B0640, + 4, 0x004B0690, + 2, 0x004B0630, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index e27396b12a..8654c515cf 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 80bbb06453b080234f3fe52c66f628a80e3ae0fa Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 1 Sep 2011 19:09:16 +0000 Subject: NEVERHOOD: Add tables for Scene2206 --- devtools/create_neverhood/tables.h | 18 ++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 8512 -> 9374 bytes 2 files changed, 18 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 238edc8297..18ea38ba89 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -69,6 +69,9 @@ static const uint32 rectListOffsets[] = { 1, 0x004B3670, // Scene2203 1, 0x004B8420, + // Scene2206 + 1, 0x004B8AF8, + 1, 0x004B8B58, 0, 0 }; @@ -195,6 +198,21 @@ static const uint32 messageListOffsets[] = { 1, 0x004B0640, 4, 0x004B0690, 2, 0x004B0630, + // Scene2206 + 1, 0x004B88A8, + 2, 0x004B88B8, + 1, 0x004B88C8, + 1, 0x004B8A70, + 1, 0x004B88B0, + 5, 0x004B8948, + 2, 0x004B8970, + 2, 0x004B8988, + 4, 0x004B8998, + 4, 0x004B89B8, + 4, 0x004B89D8, + 5, 0x004B89F8, + 5, 0x004B8A20, + 5, 0x004B8A48, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 8654c515cf..26e71ac7eb 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From f29619f655ede0e764c93d23f57d35cac7f1c3f7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 1 Sep 2011 19:10:14 +0000 Subject: NEVERHOOD: Implement Scene2206 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 143 ++++++++++++++++ engines/neverhood/klayman.h | 13 ++ engines/neverhood/module2200.cpp | 343 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2200.h | 49 ++++++ 5 files changed, 548 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index fd603a8972..6450f5a42a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 4; + _vm->gameState().sceneNum = 5; createModule2200(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 404cce5e76..97fdd5a0ad 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3658,4 +3658,147 @@ void KmScene2205::sub423980() { setCallback1(AnimationCallback(&Klayman::sub41FB30)); } +KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // TODO Sound1ChList_addSoundResource(0x80101800, 0xD3B02847); +} + +KmScene2206::~KmScene2206() { + // TODO Sound1ChList_sub_407AF0(0x80101800); +} + +void KmScene2206::xUpdate() { + setGlobalVar(0x18288913, _frameIndex); +} + +uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4803: + setCallback2(AnimationCallback(&KmScene2206::sub482490)); + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&KmScene2206::sub482530)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4812: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + }else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x482E: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub421030)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420FE0)); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4210C0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub421070)); + } + break; + case 0x4837: + // TODO sub41CE70(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +void KmScene2206::spriteUpdate482450() { + _yDelta++; + _y += _yDelta; + if (_y > 600) { + sendMessage(0x1019, 0, this); + } +} + +void KmScene2206::sub482490() { + if (!sub41CF10(AnimationCallback(&KmScene2206::sub482490))) { + _status2 = 1; + _parentScene->sendMessage(0x4803, 0, this); + _flagE5 = false; + _yDelta = 0; + setFileHash(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteCallback(&KmScene2206::spriteUpdate482450); + // TODO Sound1ChList_playLooping(0xD3B02847); + } +} + +void KmScene2206::sub482530() { + int16 frameIndex = getGlobalVar(0x18288913) + 1; + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetAnimationCallback3(&Klayman::sub41FA40); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); +} + + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index d9d63b1011..3cb5e3803c 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -396,6 +396,19 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2206 : public Klayman { +public: + KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + ~KmScene2206(); +protected: + int16 _yDelta; + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void spriteUpdate482450(); + void sub482490(); + void sub482530(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index e7e025750f..bec20fa0d1 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -221,11 +221,15 @@ void Module2200::createScene2204(int which) { void Module2200::createScene2205(int which) { _vm->gameState().sceneNum = 4; // TODO Music18hList_stop(0x601C908C, 0, 2); - _childObject = new Scene2205(_vm, this, 3); + _childObject = new Scene2205(_vm, this, which); SetUpdateHandler(&Module2200::updateScene2205); } void Module2200::createScene2206(int which) { + _vm->gameState().sceneNum = 5; + // TODO Music18hList_stop(0x601C908C, 0, 2); + _childObject = new Scene2206(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2206); } void Module2200::createScene2207(int which) { @@ -429,6 +433,25 @@ void Module2200::updateScene2205() { } void Module2200::updateScene2206() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2247(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene2207(0); + _childObject->handleUpdate(); + } else if (_field20 == 3) { + createScene2209(0); + _childObject->handleUpdate(); + } else { + createScene2205(1); + _childObject->handleUpdate(); + } + } } void Module2200::updateScene2207() { @@ -1567,4 +1590,322 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +static const int16 kScene2206XPositions[] = { + 384, + 480, + 572 +}; + +static const uint32 kScene2206MessageIds1[] = { + 0x004B8998, + 0x004B89B8, + 0x004B89D8 +}; + +static const uint32 kScene2206MessageIds2[] = { + 0x004B89F8, + 0x004B8A20, + 0x004B8A48 +}; + +static const int16 kClass603XDeltas1[] = { + -24, -28, -18, 6, 9, -8 +}; + +static const int16 kClass603XDeltas2[] = { + -8, 7, 11, 26, 13, 14 +}; + +Class603::Class603(NeverhoodEngine *vm, uint32 fileHash) + : StaticSprite(vm, fileHash, 200), _soundResource(vm) { + + if (getGlobalVar(0x18890C91)) + _x -= 63; + SetUpdateHandler(&Class603::update); + SetMessageHandler(&Class603::handleMessage); + SetSpriteCallback(NULL); +} + +void Class603::update() { + handleSpriteUpdate(); + StaticSprite::update(); +} + +uint32 Class603::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + _index = 0; + SetMessageHandler(NULL); + SetSpriteCallback(&Class603::spriteUpdate481E60); + _soundResource.play(0x032746E0); + break; + case 0x4809: + _index = 0; + SetMessageHandler(NULL); + SetSpriteCallback(&Class603::spriteUpdate481E90); + _soundResource.play(0x002642C0); + break; + } + return messageResult; +} + +void Class603::spriteUpdate481E60() { + if (_index < 6) { + _x += kClass603XDeltas1[_index]; + _index++; + } else { + SetMessageHandler(&Class603::handleMessage); + SetSpriteCallback(NULL); + } +} + +void Class603::spriteUpdate481E90() { + if (_index < 6) { + _x += kClass603XDeltas2[_index]; + _index++; + } else { + SetMessageHandler(&Class603::handleMessage); + SetSpriteCallback(NULL); + } +} + +Class604::Class604(NeverhoodEngine *vm, uint32 fileHash) + : StaticSprite(vm, fileHash, 50) { + + SetUpdateHandler(&Class604::update); + SetMessageHandler(&Class604::handleMessage); + SetSpriteCallback(NULL); +} + +void Class604::update() { + handleSpriteUpdate(); + StaticSprite::update(); +} + +uint32 Class604::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4803: + SetMessageHandler(NULL); + SetSpriteCallback(&Class604::spriteUpdate482020); + _yDelta = 0; + break; + } + return messageResult; +} + +void Class604::spriteUpdate482020() { + _yDelta++; + _y += _yDelta; +} + +Class607::Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) + : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { + + if (getGlobalVar(0x45080C38)) { + _surface->setVisible(false); + SetMessageHandler(NULL); + } else { + SetMessageHandler(&Class607::handleMessage); + } + _deltaRect = _drawRect; + processDelta(); +} + +uint32 Class607::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4806: + setGlobalVar(0x45080C38, 1); + _surface->setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm) { + + uint32 fileHash; + Palette2 *palette2; + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&Scene2206::handleMessage); + _surfaceFlag = true; + + if (getGlobalVar(0x4D080E54)) { + fileHash = 0x41983216; + _sprite1 = addSprite(new StaticSprite(_vm, 0x2201266A, 100)); + _sprite2 = addSprite(new StaticSprite(_vm, 0x3406A333, 300)); + _sprite3 = addSprite(new StaticSprite(_vm, 0x24A223A2, 100)); + _sprite4 = addSprite(new Class603(_vm, 0x26133023)); + _sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; + _sprite4->getSurface()->getClipRect().y1 = 0; + _sprite4->getSurface()->getClipRect().x2 = 640; + _sprite4->getSurface()->getClipRect().y2 = 480; + setRectList(0x004B8AF8); + _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0)); + _mouseCursor = addSprite(new Mouse433(_vm, 0x83212411, NULL)); + _class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x5E00E262)); + _class604 = addSprite(new Class604(_vm, 0x085E25E0)); + } else { + fileHash = 0xE0102A45; + _sprite1 = addSprite(new StaticSprite(_vm, 0x1C1106B8, 100)); + _sprite2 = addSprite(new StaticSprite(_vm, 0x020462E0, 300)); + _sprite3 = addSprite(new StaticSprite(_vm, 0x900626A2, 100)); + _sprite4 = addSprite(new Class603(_vm, 0x544822A8)); + _sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; + _sprite4->getSurface()->getClipRect().y1 = 0; + _sprite4->getSurface()->getClipRect().x2 = 640; + _sprite4->getSurface()->getClipRect().y2 = 480; + setRectList(0x004B8B58); + _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0)); + _mouseCursor = addSprite(new Mouse433(_vm, 0x02A41E09, NULL)); + _class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x52032563)); + _class604 = addSprite(new Class604(_vm, 0x317831A0)); + } + + _class604->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; + _class604->getSurface()->getClipRect().y1 = 0; + _class604->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; + _class604->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; + + _background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0)); + + palette2 = new Palette2(_vm, fileHash); + _palette = palette2; + _palette->usePalette(); + addEntity(palette2); + + palette2->addPalette(fileHash, 0, 256, 0); + + if (!getGlobalVar(0x4D080E54)) { + _palette->addPalette(0x0263D144, 0, 65, 0); + } + + _vm->_collisionMan->addSprite(_class607); + + if (which < 0) { + _klayman = new KmScene2206(_vm, this, 200, 430); + setMessageList(0x004B88A8); + } else if (which == 1) { + _klayman = new KmScene2206(_vm, this, 640, 430); + setMessageList(0x004B88B8); + } else if (which == 2) { + _klayman = new KmScene2206(_vm, this, 205, 396); + setMessageList(0x004B88C8); + _palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0); + sub4819D0(); + _soundResource.play(0x53B8284A); + } else if (which == 3) { + _klayman = new KmScene2206(_vm, this, kScene2206XPositions[getGlobalVar(0x48A68852)], 430); + if (getGlobalVar(0xC0418A02)) + _klayman->setDoDeltaX(1); + setMessageList(0x004B8A70); + } else { + _klayman = new KmScene2206(_vm, this, 0, 430); + setMessageList(0x004B88B0); + } + addSprite(_klayman); + + _klayman->setSoundFlag(true); + _klayman->setKlaymanTable2(); + +} + +Scene2206::~Scene2206() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) { + sub481B00(); + } else if (param.asInteger() == 0x402064D8) { + _klayman->sendEntityMessage(0x1014, _sprite5, this); + } else if (param.asInteger() == 0x11C40840) { + if (getGlobalVar(0x18890C91)) + setMessageList(0x004B8948); + else + setMessageList(0x004B8970); + } + break; + case 0x4803: + _class604->sendMessage(0x4803, 0, this); + break; + case 0x480B: + if (sender == _sprite5) { + setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1); + if (getGlobalVar(0x18890C91)) + _sprite4->sendMessage(0x4808, 0, this); + else + _sprite4->sendMessage(0x4809, 0, this); + } + break; + case 0x4826: + _klayman->sendEntityMessage(0x1014, _class607, this); + setMessageList(0x004B8988); + break; + case 0x482A: + sub4819D0(); + break; + case 0x482B: + sub481950(); + break; + } + return messageResult; +} + +void Scene2206::sub481950() { + if (getGlobalVar(0x4D080E54)) { + ((Palette2*)_palette)->addPalette(0x41983216, 0, 65, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + } + setSurfacePriority(_sprite1->getSurface(), 100); + setSurfacePriority(_sprite2->getSurface(), 300); + setSurfacePriority(_sprite3->getSurface(), 100); + setSurfacePriority(_sprite4->getSurface(), 200); + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; +} + +void Scene2206::sub4819D0() { + if (!getGlobalVar(0x4D080E54)) { + ((Palette2*)_palette)->addPalette(0xB103B604, 0, 65, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + } + setSurfacePriority(_sprite1->getSurface(), 1100); + setSurfacePriority(_sprite2->getSurface(), 1300); + setSurfacePriority(_sprite3->getSurface(), 1100); + setSurfacePriority(_sprite4->getSurface(), 1200); + _klayman->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; +} + +void Scene2206::sub481B00() { + setGlobalVar(0x48A68852, (_mouseClickPos.x - 354) / 96); + if (getGlobalVar(0x48A68852) > 2) + setGlobalVar(0x48A68852, 2); + setGlobalVar(0x49C40058, (_mouseClickPos.y - 183) / 7); + setGlobalVar(0xC8C28808, calcHash("stLineagex")); + setGlobalVar(0x4CE79018, 0); + if (ABS(kScene2206XPositions[getGlobalVar(0x48A68852)] - _klayman->getX()) >= 144) { + setMessageList2(kScene2206MessageIds1[getGlobalVar(0x48A68852)]); + } else { + setMessageList2(kScene2206MessageIds2[getGlobalVar(0x48A68852)]); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index c79edb44d6..ef56c3f0ac 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -304,6 +304,55 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class603 : public StaticSprite { +public: + Class603(NeverhoodEngine *vm, uint32 fileHash); +protected: + int _index; + SoundResource _soundResource; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate481E60(); + void spriteUpdate481E90(); +}; + +class Class604 : public StaticSprite { +public: + Class604(NeverhoodEngine *vm, uint32 fileHash); +protected: + int16 _yDelta; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void spriteUpdate482020(); +}; + +class Class607 : public StaticSprite { +public: + Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2206 : public Scene { +public: + Scene2206(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2206(); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_sprite5; + Sprite *_class604; + Sprite *_class607; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub481950(); + void sub4819D0(); + void sub481B00(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ -- cgit v1.2.3 From 8459fa97778f1f303bbbcd92359608146e3f5069 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 2 Sep 2011 17:50:59 +0000 Subject: NEVERHOOD: Add tables for Scene2207 --- devtools/create_neverhood/tables.h | 9 +++++++++ dists/engine-data/neverhood.dat | Bin 9374 -> 9904 bytes 2 files changed, 9 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 18ea38ba89..597e67f4b1 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -72,6 +72,9 @@ static const uint32 rectListOffsets[] = { // Scene2206 1, 0x004B8AF8, 1, 0x004B8B58, + // Scene2207 + 3, 0x004B38B8, + 1, 0x004B3948, 0, 0 }; @@ -213,6 +216,12 @@ static const uint32 messageListOffsets[] = { 5, 0x004B89F8, 5, 0x004B8A20, 5, 0x004B8A48, + // Scene2207 + 1, 0x004B38E8, + 4, 0x004B38F0, + 2, 0x004B37D8, + 2, 0x004B3958, + 3, 0x004B3920, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 26e71ac7eb..fb991ee18f 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 41f8749bd08db81a2b710d7422fbdbf0cc1921b9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 2 Sep 2011 17:51:39 +0000 Subject: NEVERHOOD: Implement Scene2207 (not complete yet) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 120 ++++++++++ engines/neverhood/klayman.h | 16 +- engines/neverhood/module2200.cpp | 506 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2200.h | 71 ++++++ 5 files changed, 712 insertions(+), 3 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 6450f5a42a..b987aa7c78 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 6; createModule2200(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 97fdd5a0ad..3e90cf13f6 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3800,5 +3800,125 @@ void KmScene2206::sub482530() { setCallback1(AnimationCallback(&Klayman::sub41FB30)); } +KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2001: + setCallback2(AnimationCallback(&KmScene2207::sub442460)); + break; + case 0x2005: + spriteUpdate442430(); + setCallback2(AnimationCallback(&KmScene2207::sub41FC80)); + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480D: + setCallback2(AnimationCallback(&KmScene2207::sub4424B0)); + break; + case 0x4812: + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + }else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x4827: + setCallback2(AnimationCallback(&Klayman::sub420E20)); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +void KmScene2207::spriteUpdate442430() { + _x = ((Sprite*)_attachedSprite)->getX() - 20; + _y = ((Sprite*)_attachedSprite)->getY() + 46; + processDelta(); +} + +void KmScene2207::sub442460() { + if (!sub41CF10(AnimationCallback(&KmScene2207::sub442460))) { + _status2 = 1; + _flagE5 = true; + setFileHash(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&KmScene2207::spriteUpdate442430); + SetMessageHandler(&Klayman::handleMessage41D360); + } +} + +void KmScene2207::sub4424B0() { + if (!sub41CEB0(AnimationCallback(&KmScene2207::sub4424B0))) { + _status2 = 0; + if (_flagF7) { + sub420D50(); + } else { + _flagE5 = false; + setFileHash(0x0C303040, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&KmScene2207::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41E210); + SetAnimationCallback3(&KmScene2207::sub442520); + } + } +} + +void KmScene2207::sub442520() { + setFileHash(0x0D318140, 0, -1); + SetAnimationCallback3(&KmScene2207::sub442560); + _attachedSprite->sendMessage(0x480F, 0, this); +} + +void KmScene2207::sub442560() { + _flagE5 = true; + _flagF7 = true; + setFileHash(0x1564A2C0, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&KmScene2207::spriteUpdate41F230); + SetAnimationCallback3(&KmScene2207::sub4425A0); +} + +void KmScene2207::sub4425A0() { + _flagE5 = true; + _flagF7 = true; + setFileHash(0x4464A440, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&KmScene2207::spriteUpdate41F230); + SetMessageHandler(&Klayman::handleMessage41D360); +} } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3cb5e3803c..7187905d66 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -125,6 +125,7 @@ public: uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); void setKlaymanTable(const KlaymanTableItem *table, int tableCount); void setKlaymanTable1(); @@ -213,8 +214,6 @@ protected: void sub41F950(); uint32 handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender); @@ -409,6 +408,19 @@ protected: void sub482530(); }; +class KmScene2207 : public Klayman { +public: + KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void spriteUpdate442430(); + void sub442460(); + void sub4424B0(); + void sub442520(); + void sub442560(); + void sub4425A0(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index bec20fa0d1..67c3be8cec 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -23,6 +23,7 @@ #include "neverhood/module2200.h" #include "neverhood/module1000.h" #include "neverhood/module1200.h" +#include "neverhood/gamemodule.h" #include "neverhood/diskplayerscene.h" namespace Neverhood { @@ -233,6 +234,9 @@ void Module2200::createScene2206(int which) { } void Module2200::createScene2207(int which) { + _vm->gameState().sceneNum = 6; + _childObject = new Scene2207(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2207); } void Module2200::createScene2208(int which) { @@ -455,6 +459,14 @@ void Module2200::updateScene2206() { } void Module2200::updateScene2207() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene2206(2); + _childObject->handleUpdate(); + } } void Module2200::updateScene2208() { @@ -1908,4 +1920,498 @@ void Scene2206::sub481B00() { } } +static const uint32 kScene2207FileHashes[] = { + 0x33B1E12E, + 0x33D1E12E, + 0x3311E12E, + 0x3291E12E, + 0x3191E12E, + 0x3791E12E, + 0x3B91E12E, + 0x2391E12E, + 0x1391E12E, + 0x3BB1E12E, + 0x23B1E12E, + 0x13B1E12E +}; + +AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _soundResource(vm), + _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) { + + NPoint pt; + + _dataResource.load(0x00524846); + _pointArray = _dataResource.getPointArray(0x005B02B7); + pt = _dataResource.getPoint(0x403A82B1); + _x = pt.x; + _y = pt.y; + createSurface(1100, 129, 103); + setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0); + SetUpdateHandler(&AsScene2207Elevator::update); + SetSpriteCallback(&AsScene2207Elevator::suSetPosition); + SetMessageHandler(&AsScene2207Elevator::handleMessage); + _newHashListIndex = 0; +} + +AsScene2207Elevator::~AsScene2207Elevator() { + // TODO Sound1ChList_sub_407AF0(0x02700413); +} + +void AsScene2207Elevator::update() { + + if (_destPointIndex + _destPointIndexDelta > _pointIndex) { + _pointIndex++; + setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + _newHashListIndex = _pointIndex; + if (_destPointIndex + _destPointIndexDelta == _pointIndex) { + if (_destPointIndexDelta != 0) { + _destPointIndexDelta = 0; + } else { + // TODO Sound1ChList_deleteSoundByHash(0xD3B02847); + _soundResource.play(0x53B8284A); + } + } + } + + if (_destPointIndex + _destPointIndexDelta < _pointIndex) { + _pointIndex--; + if (_pointIndex == 0) + _parentScene->sendMessage(0x2003, 0, this); + setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + _newHashListIndex = _pointIndex; + if (_destPointIndex + _destPointIndexDelta == _pointIndex) { + if (_destPointIndexDelta != 0) { + _destPointIndexDelta = 0; + } else { + // TODO Sound1ChList_deleteSoundByHash(0xD3B02847); + _soundResource.play(0x53B8284A); + } + } + } + + if (_pointIndex > 20 && _surface->getPriority() != 900) { + _parentScene->sendMessage(0x2002, 900, this); + } else if (_pointIndex < 20 && _surface->getPriority() != 1100) { + _parentScene->sendMessage(0x2002, 1100, this); + } + + AnimatedSprite::update(); + + if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) { + _parentScene->sendMessage(0x2004, 0, this); + _isMoving = false; + } + +} + +void AsScene2207Elevator::suSetPosition() { + _x = (*_pointArray)[_pointIndex].x; + _y = (*_pointArray)[_pointIndex].y - 60; + processDelta(); +} + +uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + moveToY(param.asInteger()); + break; + } + return messageResult; +} + +void AsScene2207Elevator::moveToY(int16 y) { + int16 minDistance = 480; + + if (!_pointArray || _pointArray->size() == 0) + return; + + for (uint i = 0; i < _pointArray->size(); i++) { + int16 distance = ABS(y - (*_pointArray)[i].y); + if (distance < minDistance) { + minDistance = distance; + _destPointIndex = i; + } + } + + if (_destPointIndex != _pointIndex) { + if (_destPointIndex == 0 || _destPointIndex == _pointArray->size() - 1) { + _destPointIndexDelta = 0; + } else if (_destPointIndex < _pointIndex) { + _destPointIndexDelta = -2; + } else { + _destPointIndexDelta = 2; + } + // TODO Sound1ChList_addSoundResource(0x02700413, 0xD3B02847, true); + // TODO Sound1ChList_playLooping(0xD3B02847); + } + + _isMoving = true; + +} + +Class500::Class500(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm), + _soundResource3(vm), _soundResource4(vm), _flag1(true) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class500::handleMessage); + createSurface1(0xCCFD6090, 100); + _x = 309; + _y = 320; + setFileHash(0xCCFD6090, 0, -1); + _newHashListIndex = 0; + _soundResource2.load(0x40330872); + _soundResource3.load(0x72A2914A); + _soundResource4.load(0xD4226080); +} + +Class500::~Class500() { + // TODO Sound1ChList_sub_407AF0(0x80D00820); +} + +uint32 Class500::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (!_flag1) { + if (param.asInteger() == 0x3423093) { + // TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true); + // TODO Sound1ChList_playLooping(0x12121943); + } else if (param.asInteger() == 0x834AB011) { + _soundResource1.stop(); + _soundResource2.stop(); + _soundResource3.stop(); + _soundResource4.stop(); + // TODO Sound1ChList_deleteSoundByHash(0x12121943); + } else if (param.asInteger() == 0x3A980501) { + _soundResource2.play(); + } else if (param.asInteger() == 0x2A2AD498) { + _soundResource3.play(); + } else if (param.asInteger() == 0xC4980008) { + _soundResource4.play(); + } else if (param.asInteger() == 0x06B84228) { + _soundResource1.play(0xE0702146); + } + } + break; + case 0x2006: + sub441D50(); + break; + case 0x2007: + sub441D90(); + break; + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class500::sub441D50() { + if (!_flag1) { + SetAnimationCallback3(NULL); + } else { + setFileHash(0xCCFD6090, 0, -1); + _flag1 = false; + _surface->setVisible(true); + } +} + +void Class500::sub441D90() { + SetAnimationCallback3(&Class500::sub441DA0); +} + +void Class500::sub441DA0() { + setFileHash1(); + _soundResource1.stop(); + _soundResource2.stop(); + _soundResource3.stop(); + _soundResource4.stop(); + // TODO Sound1ChList_deleteSoundByHash(0x12121943); + _flag1 = true; + _surface->setVisible(false); +} + +Class501::Class501(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _flag1(true) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class501::handleMessage); + createSurface1(0x8CAA0099, 100); + _x = 309; + _y = 320; + setFileHash(0x8CAA0099, 0, -1); + _newHashListIndex = 0; +} + +uint32 Class501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2006: + sub441FA0(); + break; + case 0x2007: + sub441FE0(); + break; + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class501::sub441FA0() { + if (!_flag1) { + SetAnimationCallback3(NULL); + } else { + _surface->setVisible(true); + setFileHash(0x8CAA0099, 0, -1); + _flag1 = false; + } +} + +void Class501::sub441FE0() { + SetAnimationCallback3(&Class501::sub441FF0); +} + +void Class501::sub441FF0() { + setFileHash1(); + _surface->setVisible(false); + _flag1 = true; +} + +Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index) + : StaticSprite(vm, fileHash, 100) { + + _x = 330; + _y = 246 + index * 50; + StaticSprite::update(); +} + +Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), + _flag1(true), _elevatorSurfacePriority(0) { + + _vm->gameModule()->initScene3009Vars(); + + //DEBUG + setGlobalVar(0x4D080E54, 1); + + if (!getSubVar(0x40050052, 0x88460852)) + setSubVar(0x40050052, 0x88460852, 1); + + SetMessageHandler(&Scene2207::handleMessage); + SetUpdateHandler(&Scene2207::update); + _surfaceFlag = true; + + _klayman = new KmScene2207(_vm, this, 0, 0); // CHECKME: Stack vars are uninitialized?! + addSprite(_klayman); + _klayman->setRepl(64, 0); + + setMessageList(0x004B38E8); + + _asElevator = addSprite(new AsScene2207Elevator(_vm, this)); + + if (getGlobalVar(0x4D080E54)) { + + _background = addBackground(new DirtyBackground(_vm, 0x88C00241, 0, 0)); + _palette = new Palette(_vm, 0x88C00241); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL)); + + _ssMaskPart1 = addSprite(new StaticSprite(_vm, 0xE20A28A0, 1200)); + _ssMaskPart2 = addSprite(new StaticSprite(_vm, 0x688F62A5, 1100)); + _ssMaskPart3 = addSprite(new StaticSprite(_vm, 0x0043B038, 1100)); + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + +// _class487 = addSprite(new Class487(_vm, this, 527, 333, 0)); +// _vm->_collisionMan->addSprite(_class487); + + _class500 = addSprite(new Class500(_vm, this)); + _class501 = addSprite(new Class501(_vm)); + + _class500->getSurface()->setVisible(false); + _class501->getSurface()->setVisible(false); + + _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0)); + +// _class487->getSurface()->getClipRect().x1 = 0; +// _class487->getSurface()->getClipRect().y1 = 0; +// _class487->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width; +// _class487->getSurface()->getClipRect().y2 = 480; + + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height; + + _asElevator->getSurface()->getClipRect().x1 = 0; + _asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; + _asElevator->getSurface()->getClipRect().x2 = 640; + _asElevator->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height; + + } else { + + setGlobalVar(0x81890D14, 1); + + _background = addBackground(new DirtyBackground(_vm, 0x05C02A55, 0, 0)); + _palette = new Palette(_vm, 0x05C02A55); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL)); + + _ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200)); + + addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0)); + addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1)); + addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2)); + + _asTape = NULL; + _class487 = NULL; + _class500 = NULL; + _class501 = NULL; + _ssButton = NULL; + + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + + _asElevator->getSurface()->getClipRect().x1 = 0; + _asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; + _asElevator->getSurface()->getClipRect().x2 = 640; + _asElevator->getSurface()->getClipRect().y2 = 480; + + } + + _dataResource.load(0x00524846); + + setRectList(0x004B38B8); + + _klayman->sendEntityMessage(0x1014, _asElevator, this); + _klayman->sendMessage(0x2001, 0, this); + _asElevator->sendMessage(0x2000, 480, this); + + _soundResource2.load(calcHash("fxFogHornSoft")); + +} + +void Scene2207::update() { + Scene::update(); + if (_elevatorSurfacePriority != 0) { + setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority); + _elevatorSurfacePriority = 0; + } + if (_klayman->getY() == 423) { + _flag1 = _klayman->getX() > 459 && _klayman->getX() < 525; + } +} + +uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0014F275) { + if (_flag1) { + _asElevator->sendMessage(0x2000, _mouseClickPos.y, this); + _klayman->sendEntityMessage(0x1014, _asElevator, this); + _klayman->sendMessage(0x2001, 0, this); + } else { + messageList402220(); + } + } else if (param.asInteger() == 0x34569073) { + if (_flag1) { + _messageListFlag1 = true; + _asElevator->sendMessage(0x2000, 0, this); + _klayman->sendEntityMessage(0x1014, _asElevator, this); + _klayman->sendMessage(0x2001, 0, this); + } else { + messageList402220(); + } + } else if (param.asInteger() == 0x4054C877) { + if (_flag1) { + _asElevator->sendMessage(0x2000, 480, this); + _klayman->sendEntityMessage(0x1014, _asElevator, this); + _klayman->sendMessage(0x2001, 0, this); + } else { + messageList402220(); + } + } else if (param.asInteger() == 0x0CBC6211) { + _klayman->sendEntityMessage(0x1014, _asElevator, this); + _klayman->sendMessage(0x2001, 0, this); + setRectList(0x004B38B8); + } else if (param.asInteger() == 0x402064D8) { + _klayman->sendEntityMessage(0x1014, _ssButton, this); + } else if (param.asInteger() == 0x231DA241) { + if (_ssButton) { + setMessageList(0x004B38F0); + } else { + setMessageList(0x004B37D8); + } + } + break; + case 0x2002: + _elevatorSurfacePriority = param.asInteger(); + break; + case 0x2003: + _messageListFlag1 = false; + break; + case 0x4807: + _class500->sendMessage(0x2007, 0, this); + _class501->sendMessage(0x2007, 0, this); + break; + case 0x480B: + if (sender == _ssButton) { + if (getSubVar(0x14800353, 0x40119852)) { + setSubVar(0x14800353, 0x40119852, 0); + _soundResource1.play(calcHash("fx3LocksDisable")); + } else { + setSubVar(0x14800353, 0x40119852, 1); + _soundResource2.play(); + } + } + break; + case 0x480F: + _class500->sendMessage(0x2006, 0, this); + _class501->sendMessage(0x2006, 0, this); + _class500->getSurface()->setVisible(true); + _class501->getSurface()->setVisible(true); + break; + case 0x4826: + if (sender == _asTape) { + if (_klayman->getY() == 423) { + _klayman->sendEntityMessage(0x1014, _asTape, this); + setMessageList(0x004B3958); + } + } else if (_flag1) { + SetMessageHandler(&Scene2207::handleMessage2); + _asElevator->sendMessage(0x2000, 347, this); + _klayman->sendEntityMessage(0x1014, _asElevator, this); + _klayman->sendMessage(0x2001, 0, this); + } + break; + } + return messageResult; +} + +uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + _elevatorSurfacePriority = param.asInteger(); + break; + case 0x2004: + SetMessageHandler(&Scene2207::handleMessage); + _klayman->sendMessage(0x2005, 0, this); +// _klayman->sendEntityMessage(0x1014, _class487, this); + setMessageList(0x004B3920); + setRectList(0x004B3948); + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index ef56c3f0ac..cf53e698ee 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -353,6 +353,77 @@ protected: void sub481B00(); }; +class AsScene2207Elevator : public AnimatedSprite { +public: + AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene); + ~AsScene2207Elevator(); +protected: + Scene *_parentScene; + SoundResource _soundResource; + NPointArray *_pointArray; + int16 _pointIndex; + int16 _destPointIndex, _destPointIndexDelta; + bool _isMoving; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suSetPosition(); + void moveToY(int16 y); +}; + +class Class500 : public AnimatedSprite { +public: + Class500(NeverhoodEngine *vm, Scene *parentScene); + ~Class500(); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + bool _flag1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub441D50(); + void sub441D90(); + void sub441DA0(); +}; + +class Class501 : public AnimatedSprite { +public: + Class501(NeverhoodEngine *vm); +protected: + bool _flag1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub441FA0(); + void sub441FE0(); + void sub441FF0(); +}; + +class Class597 : public StaticSprite { +public: + Class597(NeverhoodEngine *vm, uint32 fileHash, int index); +}; + +class Scene2207 : public Scene { +public: + Scene2207(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + Sprite *_asElevator; + Sprite *_ssMaskPart1; + Sprite *_ssMaskPart2; + Sprite *_ssMaskPart3; + Sprite *_asTape; + Sprite *_class487; + Sprite *_class500; + Sprite *_class501; + Sprite *_ssButton; + int _elevatorSurfacePriority; + bool _flag1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ -- cgit v1.2.3 From 50996201f417ca392add73535cbf636c685b95ed Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 8 Sep 2011 07:49:06 +0000 Subject: NEVERHOOD: Very small cleanup --- engines/neverhood/module1000.cpp | 151 +++++++++++++++++++++------------------ engines/neverhood/module1000.h | 12 ++++ 2 files changed, 95 insertions(+), 68 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 69c6014aa2..3387e2e74e 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -53,12 +53,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) break; } } else if (which == 0) { - //createScene1001(0);//Real - // DEBUG: Jump to room - setGlobalVar(0x8306F218, 1); - createScene1002(2); - //createScene1005(0); - //createScene1004(0); + createScene1001(0); } else if (which == 1) { createScene1002(1); } @@ -884,16 +879,11 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0); - createSurface(800, 136, 147); _surface->getClipRect() = clipRect; - spriteUpdate448AA0(); - - // TODO _soundResource.load(0xC0C40298); - + _soundResource.load(0xC0C40298); setFileHash(0x586C1D48, 0, 0); - } uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -903,7 +893,7 @@ uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessagePara if (param.asInteger() == 0xA61CA1C2) { _class505->sendMessage(0x2004, 0, this); } else if (param.asInteger() == 0x14CE0620) { - // TODO _soundResource.play(); + _soundResource.play(); } break; case 0x2003: @@ -1212,7 +1202,6 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag } void AsScene1002VenusFlyTrap::sub4484F0() { - //ok setDoDeltaX(2); setFileHash(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); @@ -1221,7 +1210,6 @@ void AsScene1002VenusFlyTrap::sub4484F0() { } void AsScene1002VenusFlyTrap::sub448530() { - //ok setFileHash(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); @@ -1229,7 +1217,6 @@ void AsScene1002VenusFlyTrap::sub448530() { } void AsScene1002VenusFlyTrap::sub448560() { - //ok _parentScene->sendMessage(0x4807, 0, this); setFileHash(0x82292851, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); @@ -1238,7 +1225,6 @@ void AsScene1002VenusFlyTrap::sub448560() { } void AsScene1002VenusFlyTrap::sub4485B0() { - //ok setDoDeltaX(1); setFileHash(0x86A82A11, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); @@ -1247,14 +1233,12 @@ void AsScene1002VenusFlyTrap::sub4485B0() { } void AsScene1002VenusFlyTrap::sub4485F0() { - //ok setFileHash(0xB5A86034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); } void AsScene1002VenusFlyTrap::sub448620() { - //ok setFileHash(0x31303094, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(NULL); @@ -1284,7 +1268,6 @@ void AsScene1002VenusFlyTrap::sub448660() { } void AsScene1002VenusFlyTrap::sub448720() { - //ok setFileHash(0x152920C4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); @@ -1292,7 +1275,6 @@ void AsScene1002VenusFlyTrap::sub448720() { } void AsScene1002VenusFlyTrap::sub448750() { - //ok setFileHash(0x84001117, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); @@ -1300,7 +1282,6 @@ void AsScene1002VenusFlyTrap::sub448750() { } void AsScene1002VenusFlyTrap::sub448780() { -debug("AsScene1002VenusFlyTrap::sub448780()"); if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) { if (_flag) { setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); @@ -1417,6 +1398,53 @@ void Class478::update() { AnimatedSprite::update(); } +Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman) + : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman), + _flag1(false) { + + SetUpdateHandler(&Class479::update); + SetMessageHandler(&Class479::handleMessage); + createSurface(1000, 33, 41); + _surface->setVisible(false); +} + +void Class479::update() { + if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) { + setFileHash(0x9820C913, _klayman->getFrameIndex(), -1); + _newHashListIndex = _klayman->getFrameIndex(); + _surface->setVisible(true); + _x = _klayman->getX(); + _y = _klayman->getY(); + setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); + } else { + _surface->setVisible(false); + } + AnimatedSprite::update(); +} + +uint32 Class479::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + _parentScene->sendMessage(0x1022, 1200, this); + _flag1 = true; + _savedClipRect = _surface->getClipRect(); + _surface->getClipRect().x1 = 0; + _surface->getClipRect().y1 = 0; + _surface->getClipRect().x2 = 640; + _surface->getClipRect().y2 = 480; + } else if (param.asInteger() == 0x88001184) { + _parentScene->sendMessage(0x1022, 1000, this); + if (_flag1) { + _surface->getClipRect() = _savedClipRect; + } + } + break; + } + return messageResult; +} + Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _flag1B4(false), _flag1BE(false) { @@ -1424,17 +1452,6 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) NRect tempClipRect; Sprite *tempSprite; - // TODO _field1B6 = -1; - // TODO _resourceTable8.setResourceList(0x004B4110); - // TODO _resourceTable7.setResourceList(0x004B4100); - // TODO _resourceTable6.setResourceList(0x004B40E8); - // TODO _resourceTable5.setResourceList(0x004B40C0); - // TODO _resourceTable4.setResourceList(0x004B4080); - // TODO _resourceTable3.setResourceList(0x004B4060); - // TODO _resourceTable2.setResourceList(0x004B4000, true); - // TODO _resourceTable1.setResourceList(0x004B3F90, true); - // TODO _resourceTable1.loadSome(3000); - SetUpdateHandler(&Scene1002::update); SetMessageHandler(&Scene1002::handleMessage); @@ -1479,42 +1496,40 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); } + } else if (which == 1) { + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4478); + _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _vm->_gameState.field2 = 1; + } else if (which == 2) { + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4298); + _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _vm->_gameState.field2 = 1; + _klayman->sendMessage(0x4820, 0, this); } else { - if (which == 1) { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435); - _class478 = addSprite(new Class478(_vm, _klayman)); - setMessageList(0x004B4478); - _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); - _vm->_gameState.field2 = 1; - } else if (which == 2) { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645); - _class478 = addSprite(new Class478(_vm, _klayman)); - setMessageList(0x004B4298); - _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); - _vm->_gameState.field2 = 1; - _klayman->sendMessage(0x4820, 0, this); - } else { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); - _class478 = addSprite(new Class478(_vm, _klayman)); - setMessageList(0x004B4470); - _klayman->getSurface()->getClipRect().x1 = 31; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); - // TODO _class479 = addSprite(new Class479(_vm, this, _klayman)); - // TODO _class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); - _klayman->setRepl(64, 0); - _vm->_gameState.field2 = 0; - } + _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); + _class478 = addSprite(new Class478(_vm, _klayman)); + setMessageList(0x004B4470); + _klayman->getSurface()->getClipRect().x1 = 31; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height; + _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _class479 = addSprite(new Class479(_vm, this, _klayman)); + _class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setRepl(64, 0); + _vm->_gameState.field2 = 0; } addSprite(_klayman); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 5229e7a083..385ac1094d 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -262,6 +262,18 @@ protected: void update(); }; +class Class479 : public AnimatedSprite { +public: + Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman); +protected: + Scene *_parentScene; + Klayman *_klayman; + bool _flag1; + NRect _savedClipRect; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene1002 : public Scene { public: Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From 730844f1b7455ff8beea78be207920c95d11bf15 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 8 Sep 2011 15:07:07 +0000 Subject: NEVERHOOD: Implement Scene2208 (viewer for Hall Of Records text) - Implement Screen::drawSurface3 and Screen::drawUnk and move actual blitting code to Screen::blit --- engines/neverhood/background.h | 1 + engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/graphics.cpp | 7 +- engines/neverhood/module2200.cpp | 209 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2200.h | 24 +++++ engines/neverhood/neverhood.h | 1 + engines/neverhood/palette.cpp | 2 +- engines/neverhood/screen.cpp | 122 +++++++++++++++++++++-- engines/neverhood/screen.h | 3 + 9 files changed, 361 insertions(+), 10 deletions(-) diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h index 733f80b83d..8ac3581a51 100644 --- a/engines/neverhood/background.h +++ b/engines/neverhood/background.h @@ -38,6 +38,7 @@ public: BaseSurface *getSurface() { return _surface; } void createSurface(int surfacePriority, int16 width, int16 height); void load(uint32 fileHash); + SpriteResource& getSpriteResource() { return _spriteResource; } protected: BaseSurface *_surface; SpriteResource _spriteResource; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index b987aa7c78..920893c650 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 6; + _vm->gameState().sceneNum = 7; createModule2200(-1); #endif } diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 204e38628d..900ad57d56 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -52,8 +52,11 @@ BaseSurface::~BaseSurface() { void BaseSurface::draw() { if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { - // TODO: _sysRect alternate drawing code (is that used?) - _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent); + if (_sysRect.x == 0 && _sysRect.y == 0) { + _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent); + } else { + _vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent); + } } } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 67c3be8cec..2fb3eecc91 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -240,6 +240,11 @@ void Module2200::createScene2207(int which) { } void Module2200::createScene2208(int which) { + if (which >= 0) + _vm->gameState().which = _vm->gameState().sceneNum; + _vm->gameState().sceneNum = 7; + _childObject = new Scene2208(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2208); } void Module2200::createScene2209(int which) { @@ -470,6 +475,15 @@ void Module2200::updateScene2207() { } void Module2200::updateScene2208() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + // TODO + createScene2206(2); + _childObject->handleUpdate(); + } } void Module2200::updateScene2209() { @@ -2414,4 +2428,199 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Enti return messageResult; } +static const uint32 kScene2208FileHashes1[] = { + 0x041023CB, + 0x041020CB, + 0x041026CB, + 0x04102ACB, + 0x041032CB, + 0x041002CB +}; + +static const uint32 kScene2208FileHashes2[] = { + 0x091206C9, + 0x091406C9, + 0x091806C9, + 0x090006C9, + 0x093006C9, + 0x095006C9 +}; + +Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _textResource(vm) { + + SpriteResource spriteResource(_vm); + const char *textStart, *textEnd; + + if (!getGlobalVar(0xC8C28808)) + setGlobalVar(0xC8C28808, calcHash("stLineagex")); + + _textResource.load(getGlobalVar(0xC8C28808)); + + textStart = _textResource.getString(getGlobalVar(0x48A68852), textEnd); + while (textStart < textEnd) { + _strings.push_back(textStart); + textStart += strlen(textStart) + 1; + } + + _maxRowIndex = 8 + 10 * (3 - (getGlobalVar(0xC8C28808) == calcHash("stLineagex") ? 1 : 0)); + + _background = new Background(_vm, 0); + _background->createSurface(0, 640, 528); + _background->getSpriteResource().getPosition().y = 480; + addBackground(_background); + + _palette = new Palette(_vm, 0x08100289); + _palette->usePalette(); + addEntity(_palette); // Why? + + _mouseCursor = addSprite(new Mouse435(_vm, 0x0028D089, 40, 600)); + + createFontSurface(); + + _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); + spriteResource.load2(0x08100289); + _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); + + _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); + spriteResource.load2(!getGlobalVar(0x4CE79018) ? kScene2208FileHashes1[getGlobalVar(0x48A68852) % 6] : getGlobalVar(0x4CE79018)); + _topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); + + _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); + spriteResource.load2(kScene2208FileHashes2[getGlobalVar(0x48A68852) % 6]); + _bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); + + SetUpdateHandler(&Scene2208::update); + SetMessageHandler(&Scene2208::handleMessage); + + _visibleRowsCount = 10; + + _newRowIndex = (int16)getGlobalVar(0x49C40058); + if (_newRowIndex + _visibleRowsCount > _maxRowIndex) + _newRowIndex = _maxRowIndex - _visibleRowsCount; + if (_newRowIndex < 6) + _newRowIndex = 0; + + _rowScrollY = 0; + + _backgroundScrollY = 48 * _newRowIndex; + + _currRowIndex = _newRowIndex; + + for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++) + drawRow(_newRowIndex + rowIndex); + + _background->getSurface()->getSysRect().y = _backgroundScrollY; + + // TODO Screen.yOffset = _backgroundScrollY; + // TODO Scene2208_sub409080 (creates background Sprites via the text, doesn't seem to be used?) + +} + +Scene2208::~Scene2208() { + delete _fontSurface; + delete _backgroundSurface; + delete _topBackgroundSurface; + delete _bottomBackgroundSurface; +} + +void Scene2208::update() { + + int16 mouseY = _vm->getMouseY(); + + if (mouseY < 48) { + if (_currRowIndex > 0) + _newRowIndex = _currRowIndex - 1; + } else if (mouseY > 432) { + if (_currRowIndex < _maxRowIndex - _visibleRowsCount) + _newRowIndex = _currRowIndex + 1; + } else { + if (_currRowIndex > _newRowIndex) + _newRowIndex = _currRowIndex; + } + + if (_currRowIndex < _newRowIndex) { + if (_rowScrollY == 0) { + drawRow(_currRowIndex + _visibleRowsCount); + } + _backgroundScrollY += 4; + _rowScrollY += 4; + if (_rowScrollY == 48) { + _rowScrollY = 0; + _currRowIndex++; + } + _background->getSurface()->getSysRect().y = _backgroundScrollY; + } else if (_currRowIndex > _newRowIndex || _rowScrollY > 0) { + if (_rowScrollY == 0) { + drawRow(_currRowIndex - 1); + _currRowIndex--; + } + _backgroundScrollY -= 4; + if (_rowScrollY == 0) + _rowScrollY = 48; + _rowScrollY -= 4; + _background->getSurface()->getSysRect().y = _backgroundScrollY; + } + + // TODO Screen.yOffset = _backgroundScrollY; + Scene::update(); + +} + +uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 40 || param.asPoint().x >= 600) { + _parentModule->sendMessage(0x1009, 0, this); + } + break; + } + return messageResult; +} + +void Scene2208::createFontSurface() { + DataResource fontData(_vm); + SpriteResource spriteResource(_vm); + fontData.load(calcHash("asRecFont")); + uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x; + uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x; + uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; + uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; + NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); + spriteResource.load2(0x0800090C); + _fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight); + _fontSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); +} + +void Scene2208::drawRow(int16 rowIndex) { + NDrawRect sourceRect; + int16 y = (rowIndex * 48) % 528; + if (rowIndex < 4) { + sourceRect.x = 0; + sourceRect.y = y; + sourceRect.width = 640; + sourceRect.height = 48; + _background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true); + } else if (rowIndex >= _maxRowIndex - 5) { + sourceRect.x = 0; + sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48; + sourceRect.width = 640; + sourceRect.height = 48; + _background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect, true); + } else { + rowIndex -= 4; + sourceRect.x = 0; + sourceRect.y = (rowIndex * 48) % 480; + sourceRect.width = 640; + sourceRect.height = 48; + _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true); + if (rowIndex < _strings.size()) { + const char *text = _strings[rowIndex]; + // TODO/CHECKME: Use temporary string up to '{' character (see above) + _fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text); + } + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index cf53e698ee..7a75e128f3 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -27,6 +27,7 @@ #include "neverhood/module.h" #include "neverhood/scene.h" #include "neverhood/module1000.h" +#include "neverhood/graphics.h" namespace Neverhood { @@ -424,6 +425,29 @@ protected: uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2208 : public Scene { +public: + Scene2208(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2208(); +protected: + FontSurface *_fontSurface; + BaseSurface *_backgroundSurface; + BaseSurface *_topBackgroundSurface; + BaseSurface *_bottomBackgroundSurface; + TextResource _textResource; + int16 _backgroundScrollY; + int16 _newRowIndex; + int16 _currRowIndex; + int16 _rowScrollY; + int16 _maxRowIndex; + int16 _visibleRowsCount; + Common::Array _strings; // TODO: Move to TextResource + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createFontSurface(); + void drawRow(int16 rowIndex); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index edb204c92d..b4bc333e98 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -49,6 +49,7 @@ struct NPoint; struct GameState { int sceneNum; + int which; int field2; }; diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index 28fa81b87a..bd1d6b2c8d 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -114,7 +114,7 @@ void Palette::startFadeToWhite(int counter) { } void Palette::update() { - debug("Palette::update() _status = %d", _status); + debug(2, "Palette::update() _status = %d", _status); if (_status == 1) { if (_palCounter > 1) { for (int i = 0; i < 256; i++) { diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index a88491424c..351e51a3e9 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -125,7 +125,53 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, ddRect.y1 = 0; } - debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); + //debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); + + blit(surface, destX, destY, ddRect, transparent); + + // Useful for debugging + //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); + //_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); + //_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255); + +} + +void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent) { + + int16 destX, destY; + NRect ddRect; + + if (x + drawRect.width >= clipRect.x2) + ddRect.x2 = clipRect.x2 - drawRect.x - x; + else + ddRect.x2 = drawRect.x + drawRect.width; + + if (x < clipRect.x1) { + destX = clipRect.x1; + ddRect.x1 = clipRect.x1 + drawRect.x - x; + } else { + destX = x; + ddRect.x1 = drawRect.x; + } + + if (y + drawRect.height >= clipRect.y2) + ddRect.y2 = clipRect.y2 + drawRect.y - y; + else + ddRect.y2 = drawRect.y + drawRect.height; + + if (y < clipRect.y1) { + destY = clipRect.y1; + ddRect.y1 = clipRect.y1 + drawRect.y - y; + } else { + destY = y; + ddRect.y1 = drawRect.y; + } + + blit(surface, destX, destY, ddRect, transparent); + +} + +void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent) { const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); @@ -151,11 +197,6 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, } } - // Useful for debugging - //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); - //_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); - //_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255); - } void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) { @@ -176,4 +217,73 @@ void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &dra } +void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent) { + + int16 x, y; + bool xflag, yflag; + NDrawRect newDrawRect; + + x = sysRect.x; + if (sysRect.width <= x || -sysRect.width >= x) { + x = x % sysRect.width; + } + if (x < 0) + x += sysRect.width; + + y = sysRect.y; + if (y >= sysRect.height || -sysRect.height >= y) { + y = y % sysRect.height; + } + if (y < 0) + y += sysRect.height; + + xflag = x <= 0; + yflag = y <= 0; + + newDrawRect.x = x; + newDrawRect.width = sysRect.width - x; + if (drawRect.width < newDrawRect.width) { + xflag = true; + newDrawRect.width = drawRect.width; + } + + newDrawRect.y = y; + newDrawRect.height = sysRect.height - y; + if (drawRect.height < newDrawRect.height) { + yflag = true; + newDrawRect.height = drawRect.height; + } + + drawSurface3(surface, drawRect.x, drawRect.y, newDrawRect, clipRect, transparent); + + if (!xflag) { + newDrawRect.x = 0; + newDrawRect.y = y; + newDrawRect.width = x + drawRect.width - sysRect.width; + newDrawRect.height = sysRect.height - y; + if (drawRect.height < newDrawRect.height) + newDrawRect.height = drawRect.height; + drawSurface3(surface, sysRect.width + drawRect.x - x, drawRect.y, newDrawRect, clipRect, transparent); + } + + if (!yflag) { + newDrawRect.x = x; + newDrawRect.y = 0; + newDrawRect.width = sysRect.width - x; + newDrawRect.height = y + drawRect.height - sysRect.height; + if (drawRect.width < newDrawRect.width) + newDrawRect.width = drawRect.width; + drawSurface3(surface, drawRect.x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent); + } + + if (!xflag && !yflag) { + newDrawRect.x = 0; + newDrawRect.y = 0; + newDrawRect.width = x + drawRect.width - sysRect.width; + newDrawRect.height = y + drawRect.height - sysRect.height; + drawSurface3(surface, sysRect.width + drawRect.x - x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent); + } + +} + } // End of namespace Neverhood diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 922ad481f3..e813e63f20 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -43,7 +43,10 @@ public: void updatePalette(); void clear(); void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent); + void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent); + void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent); void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); + void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent); protected: NeverhoodEngine *_vm; Graphics::Surface *_backScreen; -- cgit v1.2.3 From 904f7ac33520a3b578ad46bb3b1552074ae57326 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 9 Sep 2011 09:04:09 +0000 Subject: NEVERHOOD: Add tables for Scene2242 --- devtools/create_neverhood/tables.h | 13 +++++++++++++ dists/engine-data/neverhood.dat | Bin 9904 -> 10504 bytes 2 files changed, 13 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 597e67f4b1..5f54df94ba 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -75,6 +75,9 @@ static const uint32 rectListOffsets[] = { // Scene2207 3, 0x004B38B8, 1, 0x004B3948, + // Scene2242 + 1, 0x004B3DC8, + 1, 0x004B3E18, 0, 0 }; @@ -222,6 +225,16 @@ static const uint32 messageListOffsets[] = { 2, 0x004B37D8, 2, 0x004B3958, 3, 0x004B3920, + // Scene2242 + 1, 0x004B3C18, + 1, 0x004B3D60, + 1, 0x004B3D48, + 1, 0x004B3C20, + 2, 0x004B3D50, + 5, 0x004B3CF8, + 5, 0x004B3D20, + 4, 0x004B3CB8, + 4, 0x004B3CD8, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index fb991ee18f..d21794333b 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 9133d17cdf33a96fcb0423576e69d888323f2b00 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 9 Sep 2011 09:04:28 +0000 Subject: NEVERHOOD: Implement Scene2242 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 95 +++++++++++++++++++++++- engines/neverhood/klayman.h | 11 +++ engines/neverhood/module2200.cpp | 156 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2200.h | 12 +++ 5 files changed, 274 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 920893c650..d9237b9f60 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 7; + _vm->gameState().sceneNum = 41; createModule2200(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 3e90cf13f6..a20f91b383 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -440,6 +440,14 @@ void Klayman::sub421310() { ///////////////////////////////////////////////////////////////// +void Klayman::sub41CE70() { + _x4 = _x; + if (!_flagE1 && !_flagE2 && !_flagE3) { + setCallback2(NULL); + sub41C7B0(); + } +} + void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) { _resourceHandle = _vm->_res->useResource(fileHash); if (_resourceHandle != -1) { @@ -3751,7 +3759,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4837: - // TODO sub41CE70(); + sub41CE70(); break; case 0x483F: sub41CD00(param.asInteger()); @@ -3921,4 +3929,89 @@ void KmScene2207::sub4425A0() { SetMessageHandler(&Klayman::handleMessage41D360); } +KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmScene2242::xUpdate() { + setGlobalVar(0x18288913, _frameIndex); +} + +uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&KmScene2242::sub444D20)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + +void KmScene2242::sub444D20() { + int16 frameIndex = (int16)getGlobalVar(0x18288913) + 1; + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetAnimationCallback3(&Klayman::sub41FA40); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7187905d66..a5abc0f520 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -113,6 +113,8 @@ public: void sub41F9E0(); void sub41FA40(); void sub41FB30(); + + void sub41CE70(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); @@ -421,6 +423,15 @@ protected: void sub4425A0(); }; +class KmScene2242 : public Klayman { +public: + KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub444D20(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 2fb3eecc91..eb2829c279 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -248,6 +248,9 @@ void Module2200::createScene2208(int which) { } void Module2200::createScene2209(int which) { + _vm->gameState().sceneNum = 8; + _childObject = new Scene2208(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2209); } void Module2200::createScene2210(int which) { @@ -347,6 +350,9 @@ void Module2200::createScene2241(int which) { } void Module2200::createScene2242(int which) { + _vm->gameState().sceneNum = 41; + _childObject = new Scene2242(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2242); } void Module2200::createScene2243(int which) { @@ -487,6 +493,14 @@ void Module2200::updateScene2208() { } void Module2200::updateScene2209() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene2206(3); + _childObject->handleUpdate(); + } } void Module2200::updateScene2210() { @@ -586,6 +600,22 @@ void Module2200::updateScene2241() { } void Module2200::updateScene2242() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2248(0); + _childObject->handleUpdate(); + } else if (_field20 == 2) { + createScene2208(0); + _childObject->handleUpdate(); + } else { + createScene2241(1); + _childObject->handleUpdate(); + } + } } void Module2200::updateScene2243() { @@ -2623,4 +2653,130 @@ void Scene2208::drawRow(int16 rowIndex) { } } +static const int16 kScene2242XPositions[] = { + 68, + 158 +}; + +static const uint32 kScene2242MessageListIds2[] = { + 0x004B3CB8, + 0x004B3CD8 +}; + +static const uint32 kScene2242MessageListIds1[] = { + 0x004B3CF8, + 0x004B3D20 +}; + +Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _isKlaymanInLight(false) { + + Palette2 *palette2; + + _surfaceFlag = true; + SetMessageHandler(&Scene2242::handleMessage); + SetUpdateHandler(&Scene2242::update); + + setGlobalVar(0x4D080E54,1); + + if (getGlobalVar(0x4D080E54)) { + _background = addBackground(new DirtyBackground(_vm, 0x11840E24, 0, 0)); + _palette = new Palette(_vm, 0x11840E24); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x40E20110, NULL)); + setRectList(0x004B3DC8); + } else { + _background = addBackground(new DirtyBackground(_vm, 0x25848E24, 0, 0)); + palette2 = new Palette2(_vm, 0x25848E24); + _palette = palette2; + _palette->usePalette(); + addEntity(palette2); + ((Palette2*)_palette)->copyBasePalette(0, 256, 0); + _palette->addPalette(0x68033B1C, 0, 65, 0); + _mouseCursor = addSprite(new Mouse433(_vm, 0x48E20250, NULL)); + setRectList(0x004B3E18); + } + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 10, 1100, 464, 435, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + + if (which < 0) { + _klayman = new KmScene2242(_vm, this, 200, 430); + setMessageList(0x004B3C18); + } else if (which == 1) { + _klayman = new KmScene2242(_vm, this, 530, 430); + setMessageList(0x004B3D60); + } else if (which == 2) { + _klayman = new KmScene2242(_vm, this, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430); + setMessageList(0x004B3D48); + if (getGlobalVar(0xC0418A02)) + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmScene2242(_vm, this, 0, 430); + setMessageList(0x004B3C20); + } + addSprite(_klayman); + + _klayman->setSoundFlag(true); + +} + +Scene2242::~Scene2242() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +void Scene2242::update() { + if (!getGlobalVar(0x4D080E54)) { + if (_isKlaymanInLight && _klayman->getX() < 440) { + ((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + _isKlaymanInLight = false; + } else if (!_isKlaymanInLight && _klayman->getX() >= 440) { + ((Palette2*)_palette)->addPalette(0x25848E24, 0, 65, 0); + ((Palette2*)_palette)->startFadeToPalette(12); + _isKlaymanInLight = true; + } + } + Scene::update(); +} + +uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) { + sub4448D0(); + } + break; + case 0x4826: + if (sender == _asTape) { + _klayman->sendEntityMessage(0x1014, _asTape, this); + setMessageList(0x004B3D50); + } + break; + } + return messageResult; +} + +void Scene2242::sub4448D0() { + int index; + if (_mouseClickPos.x < 108) { + setGlobalVar(0xC8C28808, 0x04290188); + setGlobalVar(0x48A68852, 42); + setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart1")); + index = 0; + } else { + setGlobalVar(0xC8C28808, 0x04290188); + setGlobalVar(0x48A68852, 43); + setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2")); + index = 1; + } + setGlobalVar(0x49C40058, (_mouseClickPos.x - 100) / 7); + if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) { + setMessageList2(kScene2242MessageListIds1[index]); + } else { + setMessageList2(kScene2242MessageListIds2[index]); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 7a75e128f3..d06f30bf46 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -448,6 +448,18 @@ protected: void drawRow(int16 rowIndex); }; +class Scene2242 : public Scene { +public: + Scene2242(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2242(); +protected: + Sprite *_asTape; + bool _isKlaymanInLight; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub4448D0(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2200_H */ -- cgit v1.2.3 From 49658b6b5a0537010680f25248f2912114021b85 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 9 Sep 2011 09:04:57 +0000 Subject: NEVERHOOD: Forgot to remove debug code --- engines/neverhood/module2200.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index eb2829c279..15e1ca4c4e 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2677,8 +2677,6 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); - setGlobalVar(0x4D080E54,1); - if (getGlobalVar(0x4D080E54)) { _background = addBackground(new DirtyBackground(_vm, 0x11840E24, 0, 0)); _palette = new Palette(_vm, 0x11840E24); -- cgit v1.2.3 From b16f34c376d16ca98fa7ef18e9781a30b159c918 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 9 Sep 2011 09:30:27 +0000 Subject: NEVERHOOD: Add Scene2248 --- engines/neverhood/module2200.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 15e1ca4c4e..515e4bd0ad 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -371,6 +371,19 @@ void Module2200::createScene2247(int which) { } void Module2200::createScene2248(int which) { + _vm->gameState().sceneNum = 47; + if (!getGlobalVar(0x98109F12)) { + if (getGlobalVar(0x4D080E54)) + _childObject = new Class152(_vm, this, 0x83110287, 0x10283839); + else + _childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C); + } else { + if (getGlobalVar(0x4D080E54)) + _childObject = new Class152(_vm, this, 0x48632087, 0x3208348E); + else + _childObject = new Class152(_vm, this, 0x08C74886, 0x74882084); + } + SetUpdateHandler(&Module2200::updateScene2248); } void Module2200::updateScene2201() { @@ -634,6 +647,14 @@ void Module2200::updateScene2247() { } void Module2200::updateScene2248() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene2242(1); + _childObject->handleUpdate(); + } } // Scene2201 -- cgit v1.2.3 From 9b151cefc352a8f42c005a7406d4b694aa4a221c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 12 Sep 2011 19:09:01 +0000 Subject: NEVERHOOD: Implement HallOfRecordsScene (and all HoR scenes) and Scene2247 - Load SceneInfo140 from neverhood.dat - Some renaming --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/gamevars.cpp | 2 +- engines/neverhood/klayman.cpp | 204 +++++-- engines/neverhood/klayman.h | 18 + engines/neverhood/module2200.cpp | 1169 +++++++++++++++++++++++++++++++++++--- engines/neverhood/module2200.h | 76 ++- engines/neverhood/scene.cpp | 1 - engines/neverhood/staticdata.cpp | 21 + engines/neverhood/staticdata.h | 11 + 9 files changed, 1335 insertions(+), 169 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d9237b9f60..31330f97f5 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -242,7 +242,7 @@ void GameModule::startup() { createModule2000(-1); #endif #if 1 - _vm->gameState().sceneNum = 41; + _vm->gameState().sceneNum = 46; createModule2200(-1); #endif } diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index e0cae80105..3e4e60438a 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -102,7 +102,7 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) { } int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) { - debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash); + //debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash); int16 subVarIndex = findSubVarIndex(varIndex, subNameHash); if (subVarIndex == -1) { subVarIndex = addSubVar(varIndex, subNameHash, 0); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index a20f91b383..e0359fc28f 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -150,7 +150,7 @@ uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FD90() { - // TODO _soundResource1.stop(0); + _soundResource1.stop(); } void Klayman::sub41FDA0() { @@ -195,7 +195,7 @@ void Klayman::sub41FE00() { } void Klayman::sub41FE50() { - // TODO _soundResource1.stop(0); + _soundResource1.stop(); } uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -485,7 +485,6 @@ bool Klayman::sub41CF10(AnimationCb callback) { } void Klayman::sub41C7B0() { - //debug("Klayman::sub41C7B0()"); if (_callback1Cb) { AnimationCb cb = _callback1Cb; _callback1Cb = NULL; @@ -515,7 +514,6 @@ void Klayman::sub41C790() { } void Klayman::sub41FC80() { - //ok if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) { _status2 = 1; _flagE5 = true; @@ -555,7 +553,6 @@ void Klayman::update41D0F0() { } uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41D360(%04X)", messageNum); Sprite::handleMessage(messageNum, param, sender); uint32 messageResult = xHandleMessage(messageNum, param); switch (messageNum) { @@ -603,7 +600,6 @@ void Klayman::sub41FF00() { } uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41D480(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -614,7 +610,6 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FCF0() { - //ok _status2 = 1; _flagE5 = true; setFileHash(0x5420E254, 0, -1); @@ -624,7 +619,6 @@ void Klayman::sub41FCF0() { } uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41F140(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -640,7 +634,6 @@ uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, E void Klayman::sub41C930(int16 x, bool flag) { - //debug("Klayman::sub41C930(%d, %d)", x, flag); int16 xdiff = ABS(x - _x); if (x == _x) { _x4 = x; @@ -690,8 +683,6 @@ void Klayman::sub4211B0() { } uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok - //debug("Klayman::handleMessage41E920(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -720,7 +711,6 @@ bool Klayman::sub41CEB0(AnimationCb callback3) { } void Klayman::spriteUpdate41F250() { - //debug("Klayman::spriteUpdate41F250()"); int16 xdiff = _x4 - _x; @@ -752,7 +742,6 @@ void Klayman::spriteUpdate41F250() { } void Klayman::spriteUpdate41F5F0() { - //debug("Klayman::spriteUpdate41F5F0()"); int16 xdiff = _x4 - _x; @@ -817,7 +806,6 @@ void Klayman::sub41FBB0() { } uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41DD80(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -848,7 +836,6 @@ uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, E } void Klayman::sub41CD70(int16 x) { - //debug("Klayman::sub41CD70(%d)", x); if (x > _x) { if (ABS(x - _x) <= 105) { sub41CAC0(x); @@ -884,7 +871,6 @@ void Klayman::sub41FB30() { } uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41EC70(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -924,7 +910,6 @@ void Klayman::spriteUpdate41F300() { } uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41EB70(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1063,7 +1048,6 @@ void Klayman::sub41FF80() { } uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41D4C0(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1101,7 +1085,6 @@ void Klayman::sub420120() { } uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41DAD0(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1182,7 +1165,6 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { } void Klayman::sub41CAC0(int16 x) { - //debug("Klayman::sub41CAC0(%d)", x); int16 xdiff = ABS(x - _x); if (x == _x) { _x4 = x; @@ -1272,7 +1254,6 @@ void Klayman::spriteUpdate41F780() { } uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41DF10(%04X)", messageNum); uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1318,7 +1299,6 @@ void Klayman::sub4208F0() { } uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("Klayman::handleMessage41EEF0(%04X)", messageNum); uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2039,7 +2019,6 @@ KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { - //debug("KmScene1001::xHandleMessage() messageNum = %04X", messageNum); switch (messageNum) { case 0x4001: case 0x4800: @@ -2125,7 +2104,6 @@ void KmScene1001::sub44FA50() { } uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { - //debug("KmScene1001::handleMessage44FA00(%04X)", messageNum); uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2160,8 +2138,6 @@ void KmScene1002::xUpdate() { } uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { - //ok - //debug("KmScene1002::xHandleMessage(%04X)", messageNum); switch (messageNum) { case 0x2001: setCallback2(AnimationCallback(&KmScene1002::sub449E90)); @@ -2263,7 +2239,6 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene1002::update4497D0() { - //debug("KmScene1002::update4497D0()"); Klayman::update(); if (_counter1 != 0 && (--_counter1 == 0)) { _surface->setVisible(true); @@ -2272,7 +2247,6 @@ void KmScene1002::update4497D0() { } uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2299,7 +2273,6 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok switch (messageNum) { case 0x4811: _soundResource1.play(0x5252A0E4); @@ -2323,7 +2296,6 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2376,7 +2348,6 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2395,7 +2366,6 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: @@ -2420,7 +2390,6 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender) { - //ok uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2433,10 +2402,8 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶ } void KmScene1002::spriteUpdate449DC0() { - //debug("KmScene1002::spriteUpdate449DC0()"); AnimatedSprite::updateDeltaXY(); HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); - //debug("$$$ hitRect->type = %04X", hitRect->type); if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; processDelta(); @@ -2446,7 +2413,6 @@ void KmScene1002::spriteUpdate449DC0() { } void KmScene1002::sub449E20() { - //debug("KmScene1002::sub449E20()"); if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) { _status2 = 2; _flagE5 = false; @@ -2460,7 +2426,6 @@ void KmScene1002::sub449E20() { } void KmScene1002::sub449E90() { - //debug("KmScene1002::sub449E90()"); _soundResource1.play(0x56548280); _status2 = 0; _flagE5 = false; @@ -2472,8 +2437,6 @@ void KmScene1002::sub449E90() { } void KmScene1002::sub449EF0() { - //ok - //debug("KmScene1002::sub449EF0()"); _counter1 = 1; _status2 = 0; _flagE5 = false; @@ -2491,8 +2454,6 @@ void KmScene1002::sub449EF0() { } void KmScene1002::sub449F70() { - //ok - //debug("KmScene1002::sub449F70()"); _parentScene->sendMessage(0x1024, 1, this); _soundResource1.play(0x41648271); _status2 = 1; @@ -2511,8 +2472,6 @@ void KmScene1002::sub449F70() { } void KmScene1002::sub44A050() { - //ok - //debug("KmScene1002::sub44A050()"); _counter1 = 1; _status2 = 0; _flagE5 = false; @@ -2526,8 +2485,6 @@ void KmScene1002::sub44A050() { } void KmScene1002::sub44A0D0() { - //ok - //debug("KmScene1002::sub44A0D0()"); _counter1 = 1; _status2 = 0; _flagE5 = false; @@ -2541,8 +2498,6 @@ void KmScene1002::sub44A0D0() { } void KmScene1002::sub44A150() { - //ok - //debug("KmScene1002::sub44A150()"); _parentScene->sendMessage(0x1024, 1, this); _soundResource1.play(0x41648271); _status2 = 1; @@ -2561,15 +2516,11 @@ void KmScene1002::sub44A150() { } void KmScene1002::sub44A230() { - //ok - //debug("KmScene1002::sub44A230()"); setDoDeltaX(2); sub41FC80(); } void KmScene1002::sub44A250() { - //ok - //debug("KmScene1002::sub44A250()"); if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) { _parentScene->sendMessage(0x1024, 3, this); _status2 = 2; @@ -2583,8 +2534,6 @@ void KmScene1002::sub44A250() { } void KmScene1002::sub44A2C0() { - //ok - //debug("KmScene1002::sub44A2C0()"); if (_attachedSprite) { _x = ((Sprite*)_attachedSprite)->getX(); _attachedSprite->sendMessage(0x4807, 0, this); @@ -2600,8 +2549,6 @@ void KmScene1002::sub44A2C0() { } void KmScene1002::sub44A330() { - //ok - //debug("KmScene1002::sub44A330()"); _status2 = 2; _flagE5 = true; setDoDeltaX(0); @@ -2612,8 +2559,6 @@ void KmScene1002::sub44A330() { } void KmScene1002::sub44A370() { - //ok - //debug("KmScene1002::sub44A370()"); _status2 = 1; _flagE5 = false; setFileHash(0x35AA8059, 0, -1); @@ -2624,13 +2569,10 @@ void KmScene1002::sub44A370() { } void KmScene1002::sub44A3C0() { - //debug("KmScene1002::sub44A3C0()"); _parentScene->sendMessage(0x1024, 1, this); } void KmScene1002::sub44A3E0() { - //ok - //debug("KmScene1002::sub44A3E0()"); if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) { _status2 = 2; _flagE4 = false; @@ -2645,8 +2587,6 @@ void KmScene1002::sub44A3E0() { } void KmScene1002::sub44A460() { - //ok - //debug("KmScene1002::sub44A460()"); _flagE4 = false; _flagE5 = true; setFileHash2(0x5C01A870, 0x01084280, 0); @@ -4000,7 +3940,145 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene2242::sub444D20() { - int16 frameIndex = (int16)getGlobalVar(0x18288913) + 1; + int16 frameIndex = (int16)getGlobalVar(0x18288913); + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetAnimationCallback3(&Klayman::sub41FA40); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); +} + +KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmHallOfRecords::xUpdate() { + setGlobalVar(0x18288913, _frameIndex); +} + +uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&KmHallOfRecords::sub43B130)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481F: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + +void KmHallOfRecords::sub43B130() { + int16 frameIndex = (int16)getGlobalVar(0x18288913); + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _flagE1 = true; + _flagE5 = true; + setFileHash(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetAnimationCallback3(&Klayman::sub41FA40); + setCallback1(AnimationCallback(&Klayman::sub41FB30)); +} + +KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmScene2247::xUpdate() { + setGlobalVar(0x18288913, _frameIndex); +} + +uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&KmScene2247::sub453520)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481F: + if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + +void KmScene2247::sub453520() { + int16 frameIndex = (int16)getGlobalVar(0x18288913); if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a5abc0f520..12862e39ae 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -432,6 +432,24 @@ protected: void sub444D20(); }; +class KmHallOfRecords : public Klayman { +public: + KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub43B130(); +}; + +class KmScene2247 : public Klayman { +public: + KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub453520(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 515e4bd0ad..fe6f36cc45 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -254,99 +254,195 @@ void Module2200::createScene2209(int which) { } void Module2200::createScene2210(int which) { + _vm->gameState().sceneNum = 9; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180); + SetUpdateHandler(&Module2200::updateScene2210); } void Module2200::createScene2211(int which) { + _vm->gameState().sceneNum = 10; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198); + SetUpdateHandler(&Module2200::updateScene2211); } void Module2200::createScene2212(int which) { + _vm->gameState().sceneNum = 11; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0); + SetUpdateHandler(&Module2200::updateScene2212); } void Module2200::createScene2213(int which) { + _vm->gameState().sceneNum = 12; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8); + SetUpdateHandler(&Module2200::updateScene2213); } - + void Module2200::createScene2214(int which) { + _vm->gameState().sceneNum = 13; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0); + SetUpdateHandler(&Module2200::updateScene2214); } void Module2200::createScene2215(int which) { + _vm->gameState().sceneNum = 14; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8); + SetUpdateHandler(&Module2200::updateScene2215); } void Module2200::createScene2216(int which) { + _vm->gameState().sceneNum = 15; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210); + SetUpdateHandler(&Module2200::updateScene2216); } void Module2200::createScene2217(int which) { + _vm->gameState().sceneNum = 16; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228); + SetUpdateHandler(&Module2200::updateScene2217); } void Module2200::createScene2218(int which) { + _vm->gameState().sceneNum = 17; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240); + SetUpdateHandler(&Module2200::updateScene2218); } void Module2200::createScene2219(int which) { + _vm->gameState().sceneNum = 18; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258); + SetUpdateHandler(&Module2200::updateScene2219); } void Module2200::createScene2220(int which) { + _vm->gameState().sceneNum = 19; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270); + SetUpdateHandler(&Module2200::updateScene2220); } void Module2200::createScene2221(int which) { + _vm->gameState().sceneNum = 20; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288); + SetUpdateHandler(&Module2200::updateScene2221); } void Module2200::createScene2222(int which) { + _vm->gameState().sceneNum = 21; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0); + SetUpdateHandler(&Module2200::updateScene2222); } void Module2200::createScene2223(int which) { + _vm->gameState().sceneNum = 22; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8); + SetUpdateHandler(&Module2200::updateScene2223); } void Module2200::createScene2224(int which) { + _vm->gameState().sceneNum = 23; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0); + SetUpdateHandler(&Module2200::updateScene2224); } void Module2200::createScene2225(int which) { + _vm->gameState().sceneNum = 24; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8); + SetUpdateHandler(&Module2200::updateScene2225); } void Module2200::createScene2226(int which) { + _vm->gameState().sceneNum = 25; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300); + SetUpdateHandler(&Module2200::updateScene2226); } void Module2200::createScene2227(int which) { + _vm->gameState().sceneNum = 26; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318); + SetUpdateHandler(&Module2200::updateScene2227); } void Module2200::createScene2228(int which) { + _vm->gameState().sceneNum = 27; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330); + SetUpdateHandler(&Module2200::updateScene2228); } void Module2200::createScene2229(int which) { + _vm->gameState().sceneNum = 28; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348); + SetUpdateHandler(&Module2200::updateScene2229); } void Module2200::createScene2230(int which) { + _vm->gameState().sceneNum = 29; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360); + SetUpdateHandler(&Module2200::updateScene2230); } void Module2200::createScene2231(int which) { + _vm->gameState().sceneNum = 30; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378); + SetUpdateHandler(&Module2200::updateScene2231); } void Module2200::createScene2232(int which) { + _vm->gameState().sceneNum = 31; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390); + SetUpdateHandler(&Module2200::updateScene2232); } void Module2200::createScene2233(int which) { + _vm->gameState().sceneNum = 32; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8); + SetUpdateHandler(&Module2200::updateScene2233); } void Module2200::createScene2234(int which) { + _vm->gameState().sceneNum = 33; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0); + SetUpdateHandler(&Module2200::updateScene2234); } void Module2200::createScene2235(int which) { + _vm->gameState().sceneNum = 34; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8); + SetUpdateHandler(&Module2200::updateScene2235); } void Module2200::createScene2236(int which) { + _vm->gameState().sceneNum = 35; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0); + SetUpdateHandler(&Module2200::updateScene2236); } void Module2200::createScene2237(int which) { + _vm->gameState().sceneNum = 36; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408); + SetUpdateHandler(&Module2200::updateScene2237); } void Module2200::createScene2238(int which) { + _vm->gameState().sceneNum = 37; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420); + SetUpdateHandler(&Module2200::updateScene2238); } void Module2200::createScene2239(int which) { + _vm->gameState().sceneNum = 38; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438); + SetUpdateHandler(&Module2200::updateScene2239); } void Module2200::createScene2240(int which) { + _vm->gameState().sceneNum = 39; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450); + SetUpdateHandler(&Module2200::updateScene2240); } void Module2200::createScene2241(int which) { + _vm->gameState().sceneNum = 40; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468); + SetUpdateHandler(&Module2200::updateScene2241); } void Module2200::createScene2242(int which) { @@ -356,18 +452,33 @@ void Module2200::createScene2242(int which) { } void Module2200::createScene2243(int which) { + _vm->gameState().sceneNum = 42; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480); + SetUpdateHandler(&Module2200::updateScene2243); } void Module2200::createScene2244(int which) { + _vm->gameState().sceneNum = 43; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498); + SetUpdateHandler(&Module2200::updateScene2244); } void Module2200::createScene2245(int which) { + _vm->gameState().sceneNum = 44; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0); + SetUpdateHandler(&Module2200::updateScene2245); } void Module2200::createScene2246(int which) { + _vm->gameState().sceneNum = 45; + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8); + SetUpdateHandler(&Module2200::updateScene2246); } void Module2200::createScene2247(int which) { + _vm->gameState().sceneNum = 46; + _childObject = new Scene2247(_vm, this, which); + SetUpdateHandler(&Module2200::updateScene2247); } void Module2200::createScene2248(int which) { @@ -420,14 +531,12 @@ void Module2200::updateScene2203() { _childObject = NULL; if (_field20 == 1) { createScene2205(0); - _childObject->handleUpdate(); } else if (_field20 == 2) { createScene2204(0); - _childObject->handleUpdate(); } else { createScene2201(1); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); } } @@ -449,14 +558,12 @@ void Module2200::updateScene2205() { _childObject = NULL; if (_field20 == 1) { createScene2206(0); - _childObject->handleUpdate(); } else if (_field20 == 2) { createScene2205(2); - _childObject->handleUpdate(); } else { createScene2203(1); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); } } @@ -468,17 +575,14 @@ void Module2200::updateScene2206() { _childObject = NULL; if (_field20 == 1) { createScene2247(0); - _childObject->handleUpdate(); } else if (_field20 == 2) { createScene2207(0); - _childObject->handleUpdate(); } else if (_field20 == 3) { createScene2209(0); - _childObject->handleUpdate(); } else { createScene2205(1); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); } } @@ -499,8 +603,123 @@ void Module2200::updateScene2208() { _done = false; delete _childObject; _childObject = NULL; - // TODO - createScene2206(2); + // This is madness! + switch (_vm->gameState().which) { + case 4: + createScene2205(2); + break; + case 9: + createScene2210(2); + break; + case 10: + createScene2211(2); + break; + case 11: + createScene2212(2); + break; + case 12: + createScene2213(2); + break; + case 13: + createScene2214(2); + break; + case 14: + createScene2215(2); + break; + case 15: + createScene2216(2); + break; + case 16: + createScene2217(2); + break; + case 17: + createScene2218(2); + break; + case 18: + createScene2219(2); + break; + case 19: + createScene2220(2); + break; + case 20: + createScene2221(2); + break; + case 21: + createScene2222(2); + break; + case 22: + createScene2223(2); + break; + case 23: + createScene2224(2); + break; + case 24: + createScene2225(2); + break; + case 25: + createScene2226(2); + break; + case 26: + createScene2227(2); + break; + case 27: + createScene2228(2); + break; + case 28: + createScene2229(2); + break; + case 29: + createScene2230(2); + break; + case 30: + createScene2231(2); + break; + case 31: + createScene2232(2); + break; + case 32: + createScene2233(2); + break; + case 33: + createScene2234(2); + break; + case 34: + createScene2235(2); + break; + case 35: + createScene2236(2); + break; + case 36: + createScene2237(2); + break; + case 37: + createScene2238(2); + break; + case 38: + createScene2239(2); + break; + case 39: + createScene2240(2); + break; + case 40: + createScene2241(2); + break; + case 41: + createScene2242(2); + break; + case 42: + createScene2243(2); + break; + case 43: + createScene2244(2); + break; + case 44: + createScene2245(2); + break; + case 46: + createScene2247(2); + break; + } _childObject->handleUpdate(); } } @@ -517,99 +736,547 @@ void Module2200::updateScene2209() { } void Module2200::updateScene2210() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2211(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2247(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2211() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2212(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2210(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2212() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2213(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2211(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2213() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2214(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2212(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2214() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2215(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2213(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2215() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2216(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2214(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2216() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2217(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2215(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2217() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2218(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2216(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2218() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2219(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2217(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2219() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2220(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2218(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2220() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2221(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2219(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2221() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2222(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2220(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2222() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2223(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2221(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2223() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2224(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2222(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2224() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2225(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2223(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2225() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2226(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2224(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2226() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2227(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2225(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2227() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2228(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2226(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2228() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2229(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2227(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2229() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2230(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2228(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2230() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2231(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2229(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2231() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2232(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2230(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2232() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2233(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2231(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2233() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2234(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2232(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2234() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2235(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2233(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2235() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2243(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2234(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2236() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2237(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2246(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2237() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2238(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2236(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2238() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2239(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2237(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2239() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2240(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2238(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2240() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2241(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2239(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2241() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2242(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2240(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2242() { @@ -632,18 +1299,88 @@ void Module2200::updateScene2242() { } void Module2200::updateScene2243() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2244(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2235(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2244() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2245(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2243(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2245() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2246(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2244(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2246() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2236(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2245(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2247() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene2210(0); + } else if (_field20 == 2) { + createScene2208(0); + } else { + createScene2206(1); + } + _childObject->handleUpdate(); + } } void Module2200::updateScene2248() { @@ -1245,7 +1982,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2002: _isTileMoving = false; _doneMovingTileSprite = (Sprite*)sender; - if (param.asInteger() >= 0 && param.asInteger() <= 2) { + if (param.asInteger() <= 2) { _surfacePriority = 100; } else if (param.asInteger() >= 3 && param.asInteger() <= 5) { _surfacePriority = 300; @@ -1318,7 +2055,7 @@ static const uint32 kAsScene2203DoorFileHashes[] = { 0x1A488110 }; -AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index) +AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index) : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _index(index) { @@ -2101,7 +2838,7 @@ void AsScene2207Elevator::moveToY(int16 y) { } if (_destPointIndex != _pointIndex) { - if (_destPointIndex == 0 || _destPointIndex == _pointArray->size() - 1) { + if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) { _destPointIndexDelta = 0; } else if (_destPointIndex < _pointIndex) { _destPointIndexDelta = -2; @@ -2116,12 +2853,73 @@ void AsScene2207Elevator::moveToY(int16 y) { } -Class500::Class500(NeverhoodEngine *vm, Scene *parentScene) +AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207Lever::handleMessage); + createSurface(1010, 71, 73); + setDoDeltaX(doDeltaX); + setFileHash(0x80880090, 0, -1); + _newHashListIndex = 0; + _x = x; + _y = y; +} + +uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x3002: + removeCallbacks(); + setFileHash1(); + break; + case 0x4807: + stLeverUp(); + break; + case 0x480F: + stLeverDown(); + break; + case 0x482A: + _parentScene->sendMessage(0x1022, 990, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1010, this); + break; + } + return messageResult; +} + +void AsScene2207Lever::stLeverDown() { + setFileHash(0x80880090, 1, -1); + setCallback1(AnimationCallback(&AsScene2207Lever::stLeverDownEvent)); + _soundResource.play(0x40581882); +} + +void AsScene2207Lever::stLeverDownEvent() { + _parentScene->sendMessage(0x480F, 0, this); +} + +void AsScene2207Lever::stLeverUp() { + setFileHash(0x80880090, 6, -1); + setCallback1(AnimationCallback(&AsScene2207Lever::stLeverUpEvent)); + _playBackwards = true; + _soundResource.play(0x40581882); +} + +void AsScene2207Lever::stLeverUpEvent() { + _parentScene->sendMessage(0x4807, 0, this); +} + +AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _soundResource4(vm), _flag1(true) { + _soundResource3(vm), _soundResource4(vm), _idle(true) { SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class500::handleMessage); + SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); createSurface1(0xCCFD6090, 100); _x = 309; _y = 320; @@ -2132,15 +2930,15 @@ Class500::Class500(NeverhoodEngine *vm, Scene *parentScene) _soundResource4.load(0xD4226080); } -Class500::~Class500() { +AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { // TODO Sound1ChList_sub_407AF0(0x80D00820); } -uint32 Class500::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (!_flag1) { + if (!_idle) { if (param.asInteger() == 0x3423093) { // TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true); // TODO Sound1ChList_playLooping(0x12121943); @@ -2162,10 +2960,10 @@ uint32 Class500::handleMessage(int messageNum, const MessageParam ¶m, Entity } break; case 0x2006: - sub441D50(); + stStartAnimation(); break; case 0x2007: - sub441D90(); + stStopAnimation(); break; case 0x3002: removeCallbacks(); @@ -2174,36 +2972,36 @@ uint32 Class500::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class500::sub441D50() { - if (!_flag1) { +void AsScene2207WallRobotAnimation::stStartAnimation() { + if (!_idle) { SetAnimationCallback3(NULL); } else { setFileHash(0xCCFD6090, 0, -1); - _flag1 = false; + _idle = false; _surface->setVisible(true); } } -void Class500::sub441D90() { - SetAnimationCallback3(&Class500::sub441DA0); +void AsScene2207WallRobotAnimation::stStopAnimation() { + SetAnimationCallback3(&AsScene2207WallRobotAnimation::cbStopAnimation); } -void Class500::sub441DA0() { +void AsScene2207WallRobotAnimation::cbStopAnimation() { setFileHash1(); _soundResource1.stop(); _soundResource2.stop(); _soundResource3.stop(); _soundResource4.stop(); // TODO Sound1ChList_deleteSoundByHash(0x12121943); - _flag1 = true; + _idle = true; _surface->setVisible(false); } -Class501::Class501(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _flag1(true) { +AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _idle(true) { SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class501::handleMessage); + SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage); createSurface1(0x8CAA0099, 100); _x = 309; _y = 320; @@ -2211,14 +3009,14 @@ Class501::Class501(NeverhoodEngine *vm) _newHashListIndex = 0; } -uint32 Class501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2006: - sub441FA0(); + stStartAnimation(); break; case 0x2007: - sub441FE0(); + stStopAnimation(); break; case 0x3002: removeCallbacks(); @@ -2227,27 +3025,27 @@ uint32 Class501::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class501::sub441FA0() { - if (!_flag1) { +void AsScene2207WallCannonAnimation::stStartAnimation() { + if (!_idle) { SetAnimationCallback3(NULL); } else { _surface->setVisible(true); setFileHash(0x8CAA0099, 0, -1); - _flag1 = false; + _idle = false; } } -void Class501::sub441FE0() { - SetAnimationCallback3(&Class501::sub441FF0); +void AsScene2207WallCannonAnimation::stStopAnimation() { + SetAnimationCallback3(&AsScene2207WallCannonAnimation::cbStopAnimation); } -void Class501::sub441FF0() { +void AsScene2207WallCannonAnimation::cbStopAnimation() { setFileHash1(); _surface->setVisible(false); - _flag1 = true; + _idle = true; } -Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index) +SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index) : StaticSprite(vm, fileHash, 100) { _x = 330; @@ -2257,13 +3055,13 @@ Class597::Class597(NeverhoodEngine *vm, uint32 fileHash, int index) Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), - _flag1(true), _elevatorSurfacePriority(0) { - - _vm->gameModule()->initScene3009Vars(); + _klaymanAtElevator(true), _elevatorSurfacePriority(0) { //DEBUG setGlobalVar(0x4D080E54, 1); + _vm->gameModule()->initScene3009Vars(); + if (!getSubVar(0x40050052, 0x88460852)) setSubVar(0x40050052, 0x88460852, 1); @@ -2293,21 +3091,21 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); -// _class487 = addSprite(new Class487(_vm, this, 527, 333, 0)); -// _vm->_collisionMan->addSprite(_class487); + _asLever = addSprite(new AsScene2207Lever(_vm, this, 527, 333, 0)); + _vm->_collisionMan->addSprite(_asLever); - _class500 = addSprite(new Class500(_vm, this)); - _class501 = addSprite(new Class501(_vm)); + _asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this)); + _asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm)); - _class500->getSurface()->setVisible(false); - _class501->getSurface()->setVisible(false); + _asWallRobotAnimation->getSurface()->setVisible(false); + _asWallCannonAnimation->getSurface()->setVisible(false); _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0)); -// _class487->getSurface()->getClipRect().x1 = 0; -// _class487->getSurface()->getClipRect().y1 = 0; -// _class487->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width; -// _class487->getSurface()->getClipRect().y2 = 480; + _asLever->getSurface()->getClipRect().x1 = 0; + _asLever->getSurface()->getClipRect().y1 = 0; + _asLever->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width; + _asLever->getSurface()->getClipRect().y2 = 480; _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; @@ -2330,14 +3128,14 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200)); - addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0)); - addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1)); - addSprite(new Class597(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2)); + addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0)); + addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1)); + addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2)); _asTape = NULL; - _class487 = NULL; - _class500 = NULL; - _class501 = NULL; + _asLever = NULL; + _asWallRobotAnimation = NULL; + _asWallCannonAnimation = NULL; _ssButton = NULL; _klayman->getSurface()->getClipRect().x1 = 0; @@ -2371,7 +3169,7 @@ void Scene2207::update() { _elevatorSurfacePriority = 0; } if (_klayman->getY() == 423) { - _flag1 = _klayman->getX() > 459 && _klayman->getX() < 525; + _klaymanAtElevator = _klayman->getX() > 459 && _klayman->getX() < 525; } } @@ -2380,7 +3178,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0014F275) { - if (_flag1) { + if (_klaymanAtElevator) { _asElevator->sendMessage(0x2000, _mouseClickPos.y, this); _klayman->sendEntityMessage(0x1014, _asElevator, this); _klayman->sendMessage(0x2001, 0, this); @@ -2388,7 +3186,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit messageList402220(); } } else if (param.asInteger() == 0x34569073) { - if (_flag1) { + if (_klaymanAtElevator) { _messageListFlag1 = true; _asElevator->sendMessage(0x2000, 0, this); _klayman->sendEntityMessage(0x1014, _asElevator, this); @@ -2397,7 +3195,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit messageList402220(); } } else if (param.asInteger() == 0x4054C877) { - if (_flag1) { + if (_klaymanAtElevator) { _asElevator->sendMessage(0x2000, 480, this); _klayman->sendEntityMessage(0x1014, _asElevator, this); _klayman->sendMessage(0x2001, 0, this); @@ -2425,8 +3223,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit _messageListFlag1 = false; break; case 0x4807: - _class500->sendMessage(0x2007, 0, this); - _class501->sendMessage(0x2007, 0, this); + _asWallRobotAnimation->sendMessage(0x2007, 0, this); + _asWallCannonAnimation->sendMessage(0x2007, 0, this); break; case 0x480B: if (sender == _ssButton) { @@ -2440,10 +3238,10 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480F: - _class500->sendMessage(0x2006, 0, this); - _class501->sendMessage(0x2006, 0, this); - _class500->getSurface()->setVisible(true); - _class501->getSurface()->setVisible(true); + _asWallRobotAnimation->sendMessage(0x2006, 0, this); + _asWallCannonAnimation->sendMessage(0x2006, 0, this); + _asWallRobotAnimation->getSurface()->setVisible(true); + _asWallCannonAnimation->getSurface()->setVisible(true); break; case 0x4826: if (sender == _asTape) { @@ -2451,7 +3249,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit _klayman->sendEntityMessage(0x1014, _asTape, this); setMessageList(0x004B3958); } - } else if (_flag1) { + } else if (_klaymanAtElevator) { SetMessageHandler(&Scene2207::handleMessage2); _asElevator->sendMessage(0x2000, 347, this); _klayman->sendEntityMessage(0x1014, _asElevator, this); @@ -2471,7 +3269,7 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Enti case 0x2004: SetMessageHandler(&Scene2207::handleMessage); _klayman->sendMessage(0x2005, 0, this); -// _klayman->sendEntityMessage(0x1014, _class487, this); + _klayman->sendEntityMessage(0x1014, _asLever, this); setMessageList(0x004B3920); setRectList(0x004B3948); break; @@ -2653,7 +3451,7 @@ void Scene2208::drawRow(int16 rowIndex) { sourceRect.width = 640; sourceRect.height = 48; _background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true); - } else if (rowIndex >= _maxRowIndex - 5) { + } else if (rowIndex > _maxRowIndex - 5) { sourceRect.x = 0; sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48; sourceRect.width = 640; @@ -2666,7 +3464,7 @@ void Scene2208::drawRow(int16 rowIndex) { sourceRect.width = 640; sourceRect.height = 48; _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true); - if (rowIndex < _strings.size()) { + if (rowIndex < (int)_strings.size()) { const char *text = _strings[rowIndex]; // TODO/CHECKME: Use temporary string up to '{' character (see above) _fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text); @@ -2764,7 +3562,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x800C6694) { - sub4448D0(); + readClickedColumn(); } break; case 0x4826: @@ -2777,7 +3575,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -void Scene2242::sub4448D0() { +void Scene2242::readClickedColumn() { int index; if (_mouseClickPos.x < 108) { setGlobalVar(0xC8C28808, 0x04290188); @@ -2790,7 +3588,7 @@ void Scene2242::sub4448D0() { setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2")); index = 1; } - setGlobalVar(0x49C40058, (_mouseClickPos.x - 100) / 7); + setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7); if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) { setMessageList2(kScene2242MessageListIds1[index]); } else { @@ -2798,4 +3596,213 @@ void Scene2242::sub4448D0() { } } +static const int16 kHallOfRecordsKlaymanXPos[] = { + 68, + 157, + 246, + 335, + 424, + 513, + 602 +}; + +static const uint32 kHallOfRecordsSceneMessageListIds2[] = { + 0x004B2978, + 0x004B2998, + 0x004B29B8, + 0x004B29D8, + 0x004B29F8, + 0x004B2A18, + 0x004B2A38 +}; + +static const uint32 kHallOfRecordsSceneMessageListIds1[] = { + 0x004B2A58, + 0x004B2A80, + 0x004B2AA8, + 0x004B2AD0, + 0x004B2AF8, + 0x004B2B20, + 0x004B2B48 +}; + +HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id) + : Scene(vm, parentModule, true) { + + _sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id); + + _surfaceFlag = true; + SetMessageHandler(&HallOfRecordsScene::handleMessage); + SetUpdateHandler(&Scene::update); + + if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) { + setRectList(0x004B2BF8); + _background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename2, 0, 0)); + _palette = new Palette(_vm, _sceneInfo140->bgFilename2); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL)); + } else { + setRectList(0x004B2BB8); + _background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename1, 0, 0)); + _palette = new Palette(_vm, _sceneInfo140->bgFilename1); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL)); + } + + if (which < 0) { + _klayman = new KmHallOfRecords(_vm, this, 200, 430); + setMessageList(0x004B2900); + } else if (which == 1) { + _klayman = new KmHallOfRecords(_vm, this, 640, 430); + setMessageList(0x004B2910); + } else if (which == 2) { + _klayman = new KmHallOfRecords(_vm, this, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430); + setMessageList(0x004B2B70); + if (getGlobalVar(0xC0418A02)) + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmHallOfRecords(_vm, this, 0, 430); + setMessageList(0x004B2908); + } + addSprite(_klayman); + + _klayman->setSoundFlag(true); + _klayman->setKlaymanTable2(); + +} + +HallOfRecordsScene::~HallOfRecordsScene() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) { + readClickedColumn(); + } + break; + } + return messageResult; +} + +void HallOfRecordsScene::readClickedColumn() { + int16 index = (_mouseClickPos.x - 23) / 89; + if (index >= _sceneInfo140->count) { + setMessageList2(0x004B2920); + } else { + setGlobalVar(0x48A68852, _sceneInfo140->xPosIndex + index); + setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7); + setGlobalVar(0xC8C28808, _sceneInfo140->txFilename); + if (index == 0 && _sceneInfo140->bgFilename3) { + setGlobalVar(0x4CE79018, _sceneInfo140->bgFilename3); + } else { + setGlobalVar(0x4CE79018, 0); + } + if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) { + setMessageList2(kHallOfRecordsSceneMessageListIds1[index]); + } else { + setMessageList2(kHallOfRecordsSceneMessageListIds2[index]); + } + } +} + +static const int16 kScene2247XPositions[] = { + 513, + 602 +}; + +static const uint32 kScene2247MessageListIds2[] = { + 0x004B54A0, + 0x004B54C0 +}; + +static const uint32 kScene2247MessageListIds1[] = { + 0x004B54E0, + 0x004B5508 +}; + +Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + //DEBUG + setGlobalVar(0x4D080E54, 1); + + _surfaceFlag = true; + SetMessageHandler(&Scene2247::handleMessage); + SetUpdateHandler(&Scene::update); + + if (getGlobalVar(0x4D080E54)) { + setRectList(0x004B5588); + _background = addBackground(new DirtyBackground(_vm, 0x40339414, 0, 0)); + _palette = new Palette(_vm, 0x40339414); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL)); + } else { + setRectList(0x004B55C8); + _background = addBackground(new DirtyBackground(_vm, 0x071963E5, 0, 0)); + _palette = new Palette(_vm, 0x071963E5); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL)); + } + + if (which < 0) { + _klayman = new KmScene2247(_vm, this, 200, 430); + setMessageList(0x004B5428); + } else if (which == 1) { + _klayman = new KmScene2247(_vm, this, 640, 430); + setMessageList(0x004B5438); + } else if (which == 2) { + _klayman = new KmScene2247(_vm, this, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430); + if (getGlobalVar(0xC0418A02)) + _klayman->setDoDeltaX(1); + setMessageList(0x004B5530); + } else { + _klayman = new KmScene2247(_vm, this, 0, 430); + setMessageList(0x004B5430); + } + addSprite(_klayman); + + _klayman->setSoundFlag(true); + +} + +Scene2247::~Scene2247() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + // TODO: Debug stuff + case 0x100D: + if (param.asInteger() == 0x800C6694) { + readClickedColumn(); + } + break; + } + return messageResult; +} + +void Scene2247::readClickedColumn() { + int index; + if (_mouseClickPos.x < 553) { + setGlobalVar(0xC8C28808, 0x0008E486); + setGlobalVar(0x4CE79018, calcHash("bgFatherHeader")); + index = 0; + } else { + setGlobalVar(0xC8C28808, 0x03086004); + setGlobalVar(0x4CE79018, calcHash("bgQuaterHeader")); + index = 1; + } + setGlobalVar(0x48A68852, 0); + setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7); + if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) { + setMessageList2(kScene2247MessageListIds1[index]); + } else { + setMessageList2(kScene2247MessageListIds2[index]); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index d06f30bf46..4dfd827460 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -259,12 +259,12 @@ protected: class AsScene2203Door : public AnimatedSprite { public: - AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, int index); + AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index); protected: Scene *_parentScene; SoundResource _soundResource; Sprite *_otherDoor; - int _index; + uint _index; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void openDoor(); void closeDoor(); @@ -371,36 +371,49 @@ protected: void moveToY(int16 y); }; -class Class500 : public AnimatedSprite { +class AsScene2207Lever : public AnimatedSprite { public: - Class500(NeverhoodEngine *vm, Scene *parentScene); - ~Class500(); + AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stLeverDown(); + void stLeverDownEvent(); + void stLeverUp(); + void stLeverUpEvent(); +}; + +class AsScene2207WallRobotAnimation : public AnimatedSprite { +public: + AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene); + ~AsScene2207WallRobotAnimation(); protected: SoundResource _soundResource1; SoundResource _soundResource2; SoundResource _soundResource3; SoundResource _soundResource4; - bool _flag1; + bool _idle; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub441D50(); - void sub441D90(); - void sub441DA0(); + void stStartAnimation(); + void stStopAnimation(); + void cbStopAnimation(); }; -class Class501 : public AnimatedSprite { +class AsScene2207WallCannonAnimation : public AnimatedSprite { public: - Class501(NeverhoodEngine *vm); + AsScene2207WallCannonAnimation(NeverhoodEngine *vm); protected: - bool _flag1; + bool _idle; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub441FA0(); - void sub441FE0(); - void sub441FF0(); + void stStartAnimation(); + void stStopAnimation(); + void cbStopAnimation(); }; -class Class597 : public StaticSprite { +class SsScene2207Symbol : public StaticSprite { public: - Class597(NeverhoodEngine *vm, uint32 fileHash, int index); + SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index); }; class Scene2207 : public Scene { @@ -414,12 +427,12 @@ protected: Sprite *_ssMaskPart2; Sprite *_ssMaskPart3; Sprite *_asTape; - Sprite *_class487; - Sprite *_class500; - Sprite *_class501; + Sprite *_asLever; + Sprite *_asWallRobotAnimation; + Sprite *_asWallCannonAnimation; Sprite *_ssButton; int _elevatorSurfacePriority; - bool _flag1; + bool _klaymanAtElevator; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); @@ -457,7 +470,26 @@ protected: bool _isKlaymanInLight; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub4448D0(); + void readClickedColumn(); +}; + +class HallOfRecordsScene : public Scene { +public: + HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id); + ~HallOfRecordsScene(); +protected: + SceneInfo140 *_sceneInfo140; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void readClickedColumn(); +}; + +class Scene2247 : public Scene { +public: + Scene2247(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2247(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void readClickedColumn(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 2a01bc2869..8192216432 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -234,7 +234,6 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s // TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y); break; case 1: // mouse clicked - debug("mouse clicked"); _mouseClicked = true; _mouseClickPos = param.asPoint(); break; diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 42af4975ea..d897d7a342 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -125,6 +125,21 @@ void StaticData::load(const char *filename) { _navigationLists[id] = navigationList; } + // Load SceneInfo140 items + uint32 sceneInfo140ItemsCount = fd.readUint32LE(); + debug("sceneInfo140ItemsCount: %d", sceneInfo140ItemsCount); + for (uint32 i = 0; i < sceneInfo140ItemsCount; i++) { + SceneInfo140 *sceneInfo140 = new SceneInfo140(); + uint32 id = fd.readUint32LE(); + sceneInfo140->bgFilename1 = fd.readUint32LE(); + sceneInfo140->bgFilename2 = fd.readUint32LE(); + sceneInfo140->txFilename = fd.readUint32LE(); + sceneInfo140->bgFilename3 = fd.readUint32LE(); + sceneInfo140->xPosIndex = fd.readByte(); + sceneInfo140->count = fd.readByte(); + _sceneInfo140Items[id] = sceneInfo140; + } + } HitRectList *StaticData::getHitRectList(uint32 id) { @@ -151,4 +166,10 @@ NavigationList *StaticData::getNavigationList(uint32 id) { return _navigationLists[id]; } +SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) { + if (!_sceneInfo140Items[id]) + error("StaticData::getSceneInfo140Item() SceneInfo140 with id %08X not found", id); + return _sceneInfo140Items[id]; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index c19c060487..2a0cc9072c 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -68,6 +68,15 @@ struct NavigationItem { typedef Common::Array NavigationList; +struct SceneInfo140 { + uint32 bgFilename1; + uint32 bgFilename2; + uint32 txFilename; + uint32 bgFilename3; + byte xPosIndex; + byte count; +}; + class StaticData { public: StaticData(); @@ -77,11 +86,13 @@ public: RectList *getRectList(uint32 id); MessageList *getMessageList(uint32 id); NavigationList *getNavigationList(uint32 id); + SceneInfo140 *getSceneInfo140Item(uint32 id); protected: Common::HashMap _hitRectLists; Common::HashMap _rectLists; Common::HashMap _messageLists; Common::HashMap _navigationLists; + Common::HashMap _sceneInfo140Items; }; } // End of namespace Neverhood -- cgit v1.2.3 From 5214284271d0ae050e5f33fe66d0fc0b8cbb94af Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 13 Sep 2011 12:56:46 +0000 Subject: NEVERHOOD: Add tables for Scene1302 --- devtools/create_neverhood/create_neverhood.cpp | 33 +++++++++++++- devtools/create_neverhood/tables.h | 57 +++++++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 10504 -> 12938 bytes 3 files changed, 89 insertions(+), 1 deletion(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 1efc6161c4..2d11931f5a 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -87,6 +87,7 @@ struct HitRect { uint16 messageNum; void load(uint32 offset) { + printf("Loading HitRect @ %08X...\n", offset); byte *item = getData(offset); x1 = READ_LE_UINT16(item + 0); y1 = READ_LE_UINT16(item + 2); @@ -116,6 +117,7 @@ struct MessageItem { MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {} void load(uint32 offset) { + printf("Loading MessageItem @ %08X...\n", offset); byte *item = getData(offset); messageNum = READ_LE_UINT16(item + 0); messageParam = READ_LE_UINT32(item + 4); @@ -138,6 +140,7 @@ struct SubRectItem { uint32 messageListOffset; void load(uint32 offset) { + printf("Loading SubRectItem @ %08X...\n", offset); byte *item = getData(offset); x1 = READ_LE_UINT16(item + 0); y1 = READ_LE_UINT16(item + 2); @@ -170,6 +173,7 @@ struct RectItem { std::vector subRectItems; void load(uint32 offset) { + printf("Loading RectItem @ %08X...\n", offset); byte *item = getData(offset); uint32 subItemOffset; x1 = READ_LE_UINT16(item + 0); @@ -213,6 +217,7 @@ struct NavigationItem { uint32 mouseCursorFileHash; void load(uint32 offset) { + printf("Loading NavigationItem @ %08X...\n", offset); byte *item = getData(offset); fileHash = READ_LE_UINT32(item + 0); leftSmackerFileHash = READ_LE_UINT32(item + 4); @@ -240,6 +245,7 @@ struct NavigationItem { }; struct SceneInfo140Item { + uint32 id; uint32 bgFilename1; uint32 bgFilename2; uint32 txFilename; @@ -249,6 +255,7 @@ struct SceneInfo140Item { void load(uint32 offset) { byte *item = getData(offset); + id = offset; // Only save the hashes instead of the full names bgFilename1 = calcHash(getStringP(READ_LE_UINT32(item + 0))); bgFilename2 = calcHash(getStringP(READ_LE_UINT32(item + 4))); @@ -259,6 +266,7 @@ struct SceneInfo140Item { } void save(FILE *fd) { + writeUint32LE(fd, id); writeUint32LE(fd, bgFilename1); writeUint32LE(fd, bgFilename2); writeUint32LE(fd, txFilename); @@ -353,6 +361,30 @@ public: add(MessageItem(0x100D, 0x42845B19)); add(MessageItem(0x4805, 1)); return true; + // Scene 1302 rings + case 0x004B0888: + add(MessageItem(0x4800, 218)); + add(MessageItem(0x100D, 0x4A845A00)); + add(MessageItem(0x4805, 1)); + return true; + case 0x004B08A0: + add(MessageItem(0x4800, 218 + 32)); + add(MessageItem(0x100D, 0x43807801)); + return true; + case 0x004B08B0: + add(MessageItem(0x4800, 218 + 32 + 32)); + add(MessageItem(0x100D, 0x46C26A01)); + add(MessageItem(0x4805, 1)); + return true; + case 0x004B08C8: + add(MessageItem(0x4800, 218 + 32 + 32 + 32)); + add(MessageItem(0x100D, 0x468C7B11)); + return true; + case 0x004B08D8: + add(MessageItem(0x4800, 218 + 32 + 32 + 32 + 32)); + add(MessageItem(0x100D, 0x42845B19)); + add(MessageItem(0x4805, 4)); + return true; } return false; } @@ -360,7 +392,6 @@ public: }; class NavigationList : public StaticDataList { - }; template diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 5f54df94ba..7f80b8c633 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -27,6 +27,8 @@ static const uint32 hitRectListOffsets[] = { 1, 0x004B4138, // Scene1201 4, 0x004AEBD0, + // Scene1302 + 1, 0x004B0858, // Scene1705 1, 0x004B69D8, // Scene2203 @@ -51,6 +53,8 @@ static const uint32 rectListOffsets[] = { 1, 0x004AEDC8, 1, 0x004AEE18, 1, 0x004AED88, + // Scene1302 + 2, 0x004B0A38, // Scene1401 1, 0x004B6758, // Scene1402 @@ -78,6 +82,12 @@ static const uint32 rectListOffsets[] = { // Scene2242 1, 0x004B3DC8, 1, 0x004B3E18, + // HallOfRecordsScene + 1, 0x004B2BF8, + 1, 0x004B2BB8, + // Scene2247 + 1, 0x004B5588, + 1, 0x004B55C8, 0, 0 }; @@ -123,6 +133,18 @@ static const uint32 messageListOffsets[] = { 2, 0x004AECD0, 2, 0x004AECE0, 2, 0x004AED38, + // Scene1302 + 4, 0x004B08F0, + 3, 0x004B0920, + 1, 0x004B0950, + 2, 0x004B0940, + 1, 0x004B0938, + 2, 0x004B0910, + 1, 0x004B0968, + 2, 0x004B0878, + 4, 0x004B0978, + 1, 0x004B0870, + 1, 0x004B0868, // Scene1401 1, 0x004B65C8, 1, 0x004B65D0, @@ -235,10 +257,45 @@ static const uint32 messageListOffsets[] = { 5, 0x004B3D20, 4, 0x004B3CB8, 4, 0x004B3CD8, + // HallOfRecordsScene + 1, 0x004B2900, + 2, 0x004B2910, + 1, 0x004B2B70, + 1, 0x004B2908, + 2, 0x004B2920, + 4, 0x004B2978, + 4, 0x004B2998, + 4, 0x004B29B8, + 4, 0x004B29D8, + 4, 0x004B29F8, + 4, 0x004B2A18, + 4, 0x004B2A38, + 5, 0x004B2A58, + 5, 0x004B2A80, + 5, 0x004B2AA8, + 5, 0x004B2AD0, + 5, 0x004B2AF8, + 5, 0x004B2B20, + 5, 0x004B2B48, + // Scene2247 + 1, 0x004B5428, + 2, 0x004B5438, + 1, 0x004B5530, + 1, 0x004B5430, + 4, 0x004B54A0, + 4, 0x004B54C0, + 5, 0x004B54E0, + 5, 0x004B5508, 0, 0 }; static const uint32 navigationListOffsets[] = { + // Module1300 + 6, 0x004B2718, + 2, 0x004B27A8, + 2, 0x004B27D8, + 2, 0x004B2808, + 2, 0x004B2838, // Module1700 2, 0x004AE8B8, 3, 0x004AE8E8, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index d21794333b..decb83b0f7 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From d4030b7a9ffc2a907c80948024f3ee369a08c760 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 13 Sep 2011 12:57:06 +0000 Subject: NEVERHOOD: Start with Module1300 and implement Scene1302 --- engines/neverhood/gamemodule.cpp | 31 +- engines/neverhood/gamemodule.h | 2 + engines/neverhood/module.mk | 1 + engines/neverhood/module1000.cpp | 5 +- engines/neverhood/module1300.cpp | 664 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 132 ++++++++ 6 files changed, 831 insertions(+), 4 deletions(-) create mode 100644 engines/neverhood/module1300.cpp create mode 100644 engines/neverhood/module1300.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 31330f97f5..f4159f3087 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -25,6 +25,7 @@ #include "neverhood/graphics.h" #include "neverhood/module1000.h" #include "neverhood/module1200.h" +#include "neverhood/module1300.h" #include "neverhood/module1400.h" #include "neverhood/module1500.h" #include "neverhood/module1700.h" @@ -241,10 +242,14 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule2000(-1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 46; createModule2200(-1); #endif +#if 1 + _vm->gameState().sceneNum = 1; + createModule1300(-1); +#endif } void GameModule::createModule1000(int which) { @@ -292,6 +297,30 @@ void GameModule::updateModule1200() { } } +void GameModule::createModule1300(int which) { + setGlobalVar(0x91080831, 0x0061C090); + _childObject = new Module1300(_vm, this, which); + SetUpdateHandler(&GameModule::updateModule1300); +} + +void GameModule::updateModule1300() { + if (!_childObject) + return; + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + // TODO _gameState.clear(); + // TODO GameModule_handleKeyEscape + } else { + // TODO createModule2900(0); + _childObject->handleUpdate(); + } + } +} + void GameModule::createModule1400(int which) { setGlobalVar(0x91080831, 0x00AD0012); _childObject = new Module1400(_vm, this, which); diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 9ef1b92464..ef199f772a 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -55,6 +55,8 @@ protected: void updateModule1000(); void createModule1200(int which); void updateModule1200(); + void createModule1300(int which); + void updateModule1300(); void createModule1400(int which); void updateModule1400(); void createModule1500(int which); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 9122eaffab..1b4d6e4dc3 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -13,6 +13,7 @@ MODULE_OBJS = \ module.o \ module1000.o \ module1200.o \ + module1300.o \ module1400.o \ module1500.o \ module1700.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 3387e2e74e..5e1ae6fde3 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1045,7 +1045,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - if (!flag) { + if (!_flag) { if (getGlobalVar(0x8306F218)) { setDoDeltaX(1); _x = 366; @@ -1110,7 +1110,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag break; case 0x480B: setDoDeltaX(param.asInteger() != 0 ? 1 : 0); - if (_flag) { + if (!_flag) { if (getGlobalVar(0x8306F218)) { sub448560(); } else { @@ -1143,7 +1143,6 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag } break; case 0x4810: - debug("trap collision"); sub448780(); break; case 0x482A: diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp new file mode 100644 index 0000000000..7c7beb7cd4 --- /dev/null +++ b/engines/neverhood/module1300.cpp @@ -0,0 +1,664 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1300.h" +#include "neverhood/module1000.h" +#include "neverhood/diskplayerscene.h" +#include "neverhood/navigationscene.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module1300(%d)", which); + + // TODO Music18hList_add(0x61C090, 0x203197); + // TODO Sound1ChList_addSoundResources(0x61C090, dword_4B2868, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, 0, 50, 600, 20, 150); + // TODO Sound1ChList_sub_407C70(0x61C090, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + + if (which < 0) { + switch (_vm->gameState().sceneNum) { + case 1: + createScene1302(-1); + break; + case 2: + createScene1303(-1); + break; + case 3: + createScene1304(-1); + break; + case 4: + createScene1305(-1); + break; + case 5: + createScene1306(-1); + break; + case 6: + createScene1307(-1); + break; + case 7: + createScene1308(-1); + break; + case 8: + createScene1309(-1); + break; + case 9: + createScene1310(-1); + break; + case 10: + createScene1311(-1); + break; + case 11: + createScene1312(-1); + break; + case 12: + createScene1313(-1); + break; + case 13: + createScene1314(-1); + break; + case 14: + createScene1315(-1); + break; + case 15: + createScene1316(-1); + break; + case 16: + createScene1317(-1); + break; + case 17: + createScene1318(-1); + break; + default: + createScene1312(0); + } + } else { + switch (which) { + case 0: + createScene1312(0); + break; + case 1: + createScene1314(0); + break; + case 2: + createScene1315(0); + break; + case 3: + createScene1316(0); + break; + case 4: + createScene1308(0); + break; + case 5: + createScene1306(1); + break; + case 6: + createScene1306(5); + break; + case 7: + createScene1304(0); + break; + case 8: + createScene1302(0); + break; + case 9: + createScene1303(0); + break; + case 10: + createScene1307(0); + break; + case 11: + createScene1305(0); + break; + default: + createScene1313(0); + break; + } + } + +} + +Module1300::~Module1300() { + // TODO Sound1ChList_sub_407A50(0x61C090); +} + +void Module1300::createScene1302(int which) { + _vm->gameState().sceneNum = 1; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1302(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1302); +} + +void Module1300::createScene1303(int which) { +} + +void Module1300::createScene1304(int which) { +} + +void Module1300::createScene1305(int which) { +} + +void Module1300::createScene1306(int which) { +} + +void Module1300::createScene1307(int which) { +} + +void Module1300::createScene1308(int which) { +} + +void Module1300::createScene1309(int which) { +} + +void Module1300::createScene1310(int which) { +} + +void Module1300::createScene1311(int which) { +} + +void Module1300::createScene1312(int which) { + _vm->gameState().sceneNum = 11; + createNavigationScene(0x004B27A8, which); + SetUpdateHandler(&Module1300::updateScene1312); + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); +} + +void Module1300::createScene1313(int which) { + _vm->gameState().sceneNum = 12; + createNavigationScene(0x004B2718, which); + SetUpdateHandler(&Module1300::updateScene1313); + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); +} + +void Module1300::createScene1314(int which) { + _vm->gameState().sceneNum = 13; + createNavigationScene(0x004B27D8, which); + SetUpdateHandler(&Module1300::updateScene1314); + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); +} + +void Module1300::createScene1315(int which) { + _vm->gameState().sceneNum = 14; + createNavigationScene(0x004B2808, which); + SetUpdateHandler(&Module1300::updateScene1315); + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); +} + +void Module1300::createScene1316(int which) { + _vm->gameState().sceneNum = 15; + createNavigationScene(0x004B2838, which); + SetUpdateHandler(&Module1300::updateScene1316); + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); +} + +void Module1300::createScene1317(int which) { +} + +void Module1300::createScene1318(int which) { +} + +void Module1300::updateScene1302() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 1) { + createScene1305(0); + } else { + createScene1308(1); + } + _childObject->handleUpdate(); + } +} + +void Module1300::updateScene1303() { +} + +void Module1300::updateScene1304() { +} + +void Module1300::updateScene1305() { +} + +void Module1300::updateScene1306() { +} + +void Module1300::updateScene1307() { +} + +void Module1300::updateScene1308() { +} + +void Module1300::updateScene1309() { +} + +void Module1300::updateScene1310() { +} + +void Module1300::updateScene1311() { +} + +void Module1300::updateScene1312() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1313(0); + } else if (_field20 == 1) { + createScene1312(1); + } + _childObject->handleUpdate(); + } +} + +void Module1300::updateScene1313() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + switch (_field20) { + case 0: + createScene1315(1); + break; + case 1: + createScene1316(1); + break; + case 3: + createScene1312(1); + break; + case 5: + createScene1314(1); + break; + } + _childObject->handleUpdate(); + } +} + +void Module1300::updateScene1314() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1313(2); + } else if (_field20 == 1) { + createScene1308(0); + } + _childObject->handleUpdate(); + } +} + +void Module1300::updateScene1315() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1313(3); + } else if (_field20 == 1) { + createScene1310(-1); + } + _childObject->handleUpdate(); + } +} + +void Module1300::updateScene1316() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1313(4); + } else if (_field20 == 1) { + createScene1304(0); + } + _childObject->handleUpdate(); + } +} + +void Module1300::updateScene1317() { +} + +void Module1300::updateScene1318() { +} + +AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene) { + + _x = 320; + _y = 240; + createSurface1(0x88148150, 500); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1302Bridge::handleMessage); + if (!getGlobalVar(0x13206309)) { + setFileHash(0x88148150, 0, -1); + _newHashListIndex = 0; + } else { + setFileHash(0x88148150, -1, -1); + _newHashListIndex = -2; + } + _soundResource1.load(0x68895082); + _soundResource2.load(0x689BD0C1); +} + +uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + stLowerBridge(); + break; + case 0x4809: + stRaiseBridge(); + break; + } + return messageResult; +} + +void AsScene1302Bridge::stLowerBridge() { + setFileHash(0x88148150, 0, -1); + SetAnimationCallback3(&AsScene1302Bridge::cbLowerBridgeEvent); + _soundResource2.play(); +} + +void AsScene1302Bridge::stRaiseBridge() { + setFileHash(0x88148150, 7, -1); + _playBackwards = true; + _newHashListIndex = 0; + _soundResource1.play(); +} + +void AsScene1302Bridge::cbLowerBridgeEvent() { + _parentScene->sendMessage(0x2032, 0, this); + setFileHash(0x88148150, -1, -1); + _newHashListIndex = -2; +} + +SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) + : StaticSprite(vm, 0x11122122, 200), _soundResource1(vm), _soundResource2(vm) { + + SetUpdateHandler(&SsScene1302Fence::update); + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteCallback(NULL); + _firstY = _y; + if (getGlobalVar(0x80101B1E)) + _y += 152; + _soundResource1.load(0x7A00400C); + _soundResource2.load(0x78184098); +} + +void SsScene1302Fence::update() { + handleSpriteUpdate(); + StaticSprite::update(); +} + +uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + _soundResource1.play(); + SetSpriteCallback(&SsScene1302Fence::suMoveDown); + SetMessageHandler(NULL); + break; + case 0x4809: + _soundResource2.play(); + SetSpriteCallback(&SsScene1302Fence::suMoveUp); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +void SsScene1302Fence::suMoveDown() { + if (_y < _firstY + 152) + _y += 8; + else { + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteCallback(NULL); + } +} + +void SsScene1302Fence::suMoveUp() { + if (_y > _firstY) + _y -= 8; + else { + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteCallback(NULL); + } +} + +Class595::Class595(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 0xB0420130, 1015), _parentScene(parentScene) { + + SetMessageHandler(&Class595::handleMessage); +} + +uint32 Class595::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x482A: + _parentScene->sendMessage(0x1022, 995, this); + break; + case 0x482B: + _parentScene->sendMessage(0x1022, 1015, this); + break; + } + return messageResult; +} + +Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm) { + + SetMessageHandler(&Scene1302::handleMessage); + _vm->_collisionMan->setHitRects(0x004B0858); + setRectList(0x004B0A38); + + _background = addBackground(new DirtyBackground(_vm, 0x420643C4, 0, 0)); + _palette = new Palette(_vm, 0x420643C4); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL)); + + _class595 = addSprite(new Class595(_vm, this)); + _sprite1 = addSprite(new StaticSprite(_vm, 0x942FC224, 300)); + _sprite2 = addSprite(new StaticSprite(_vm, 0x70430830, 1200)); + _sprite2->getSurface()->setVisible(false); + _sprite3 = addSprite(new StaticSprite(_vm, 0x16E01E20, 1100)); + + _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false)); + _asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x13206309))); + _asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getSurface()->getDrawRect().y, false)); + _asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x80101B1E))); + _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getSurface()->getDrawRect().y, false)); + + _asBridge = addSprite(new AsScene1302Bridge(_vm, this)); + _ssFence = addSprite(new SsScene1302Fence(_vm)); + _ssFence->getSurface()->getClipRect().x1 = 0; + _ssFence->getSurface()->getClipRect().y1 = 0; + _ssFence->getSurface()->getClipRect().x2 = 640; + _ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; + + if (which < 0) { + _klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364); + setMessageList(0x004B0868); + } else { + _klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330); + setMessageList(0x004B0870); + } + addSprite(_klayman); + + _klayman->getSurface()->getClipRect().x1 = 0; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + + _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true)); + _vm->_collisionMan->addSprite(_asVenusFlyTrap); + + _klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this); + +} + +uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4A845A00) { + _klayman->sendEntityMessage(0x1014, _asRing1, this); + } else if (param.asInteger() == 0x43807801) { + if (!getGlobalVar(0x13206309)) { + _klayman->sendEntityMessage(0x1014, _asRing2, this); + if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) { + setMessageList(0x004B0940); + } else { + setMessageList(0x004B0938); + } + } else { + setMessageList(0x004B0950); + } + messageResult = 1; + } else if (param.asInteger() == 0x46C26A01) { + _klayman->sendEntityMessage(0x1014, _asRing3, this); + } else if (param.asInteger() == 0x468C7B11) { + if (!getGlobalVar(0x80101B1E)) { + _klayman->sendEntityMessage(0x1014, _asRing4, this); + if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) { + setMessageList(0x004B0940); + } else { + setMessageList(0x004B0938); + } + } else { + setMessageList(0x004B0950); + } + messageResult = 1; + } else if (param.asInteger() == 0x42845B19) { + _klayman->sendEntityMessage(0x1014, _asRing5, this); + } else if (param.asInteger() == 0x430A6060) { + if (getGlobalVar(0x13206309)) { + setMessageList2(0x004B0910); + } else { + messageList402220(); + } + } else if (param.asInteger() == 0x012E2070) { + if (getGlobalVar(0x13206309)) { + setMessageList2(0x004B0968); + } else { + messageList402220(); + } + } else if (param.asInteger() == 0x11C40840) { + if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) { + setMessageList(0x004B0878); + } else { + setMessageList(0x004B0978); + } + } + break; + case 0x2000: + if (_klayman->getY() > 360) { + _klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this); + setMessageList2(0x004B08F0); + } else { + setMessageList2(0x004B0920); + } + break; + case 0x2002: + if (_klayman->getX() > 545) { + _parentModule->sendMessage(0x1009, 1, this); + } + break; + case 0x2032: + _sprite2->getSurface()->setVisible(true); + break; + case 0x4806: + _parentModule->sendMessage(0x1024, 2, this); + if (sender == _asRing1) { + _soundResource.play(0x665198C0); + } else if (sender == _asRing2) { + _asBridge->sendMessage(0x4808, 0, this); + setGlobalVar(0x13206309, 1); + } else if (sender == _asRing3) { + _soundResource.play(0xE2D389C0); + } else if (sender == _asRing4) { + _ssFence->sendMessage(0x4808, 0, this); + setGlobalVar(0x80101B1E, 1); + } else if (sender == _asRing5) { + _soundResource.play(0x40428A09); + } + break; + case 0x4807: + if (sender == _asRing2) { + _asBridge->sendMessage(0x4809, 0, this); + setGlobalVar(0x13206309, 0); + _sprite2->getSurface()->setVisible(false); + } else if (sender == _asRing4) { + _ssFence->sendMessage(0x4809, 0, this); + setGlobalVar(0x80101B1E, 0); + } else if (sender == _asVenusFlyTrap) { + if (getGlobalVar(0x13206309)) { + _asRing2->sendMessage(0x4807, 0, this); + } else { + _asRing4->sendMessage(0x4807, 0, this); + } + } + break; + case 0x480F: + if (sender == _asRing2) { + _soundResource.play(0x60755842); + _asBridge->sendMessage(0x4808, 0, this); + setGlobalVar(0x13206309, 1); + } else if (sender == _asRing4) { + _soundResource.play(0x60755842); + _ssFence->sendMessage(0x4808, 0, this); + setGlobalVar(0x80101B1E, 1); + } + break; + case 0x482A: + _asVenusFlyTrap->sendMessage(0x482B, 0, this); + break; + case 0x482B: + _asVenusFlyTrap->sendMessage(0x482A, 0, this); + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h new file mode 100644 index 0000000000..25dde469b9 --- /dev/null +++ b/engines/neverhood/module1300.h @@ -0,0 +1,132 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1300_H +#define NEVERHOOD_MODULE1300_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1300 + +class Module1300 : public Module { +public: + Module1300(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1300(); +protected: + uint32 _musicFileHash; + void createScene1302(int which); + void createScene1303(int which); + void createScene1304(int which); + void createScene1305(int which); + void createScene1306(int which); + void createScene1307(int which); + void createScene1308(int which); + void createScene1309(int which); + void createScene1310(int which); + void createScene1311(int which); + void createScene1312(int which); + void createScene1313(int which); + void createScene1314(int which); + void createScene1315(int which); + void createScene1316(int which); + void createScene1317(int which); + void createScene1318(int which); + void updateScene1302(); + void updateScene1303(); + void updateScene1304(); + void updateScene1305(); + void updateScene1306(); + void updateScene1307(); + void updateScene1308(); + void updateScene1309(); + void updateScene1310(); + void updateScene1311(); + void updateScene1312(); + void updateScene1313(); + void updateScene1314(); + void updateScene1315(); + void updateScene1316(); + void updateScene1317(); + void updateScene1318(); +}; + +class AsScene1302Bridge : public AnimatedSprite { +public: + AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stLowerBridge(); + void stRaiseBridge(); + void cbLowerBridgeEvent(); +}; + +class SsScene1302Fence : public StaticSprite { +public: + SsScene1302Fence(NeverhoodEngine *vm); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + int16 _firstY; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveDown(); + void suMoveUp(); +}; + +class Class595 : public StaticSprite { +public: + Class595(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1302 : public Scene { +public: + Scene1302(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource; + Sprite *_asVenusFlyTrap; + Sprite *_asBridge; + Sprite *_ssFence; + Sprite *_asRing1; + Sprite *_asRing2; + Sprite *_asRing3; + Sprite *_asRing4; + Sprite *_asRing5; + Sprite *_class595; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1300_H */ -- cgit v1.2.3 From b5fc6ed2c0db21d132873fb8d35510bc8c186899 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 13 Sep 2011 15:07:10 +0000 Subject: NEVERHOOD: Add tables for Scene1303 --- devtools/create_neverhood/tables.h | 5 +++++ dists/engine-data/neverhood.dat | Bin 12938 -> 13044 bytes 2 files changed, 5 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 7f80b8c633..bcd758404d 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -55,6 +55,8 @@ static const uint32 rectListOffsets[] = { 1, 0x004AED88, // Scene1302 2, 0x004B0A38, + // Scene1303 + 1, 0x004AF9E8, // Scene1401 1, 0x004B6758, // Scene1402 @@ -145,6 +147,9 @@ static const uint32 messageListOffsets[] = { 4, 0x004B0978, 1, 0x004B0870, 1, 0x004B0868, + // Scene1303 + 1, 0x004AF9A0, + 2, 0x004AF9B8, // Scene1401 1, 0x004B65C8, 1, 0x004B65D0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index decb83b0f7..bb53d46640 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 9d6e3b95758a16c1b2a441aa5f206c50593202fd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 13 Sep 2011 15:07:48 +0000 Subject: NEVERHOOD: Add Scene1303 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 86 ++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 13 +++++ engines/neverhood/module1300.cpp | 109 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 20 +++++++ 5 files changed, 229 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index f4159f3087..8b984e211f 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -247,7 +247,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 1; + _vm->gameState().sceneNum = 2; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index e0359fc28f..d8b1dbee7d 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2892,6 +2892,92 @@ void KmScene1201::sub40E040() { } } +KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4804: + setCallback2(AnimationCallback(&KmScene1303::sub4161D0)); + break; + case 0x483B: + setCallback2(AnimationCallback(&KmScene1303::sub4162B0)); + break; + case 0x483C: + setCallback2(AnimationCallback(&KmScene1303::sub416210)); + break; + } + return 0; +} + +uint32 KmScene1303::handleMessage4160A0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == calcHash("PopBalloon")) { + _parentScene->sendMessage(0x2000, 0, this); + } else if (param.asInteger() == 0x02B20220) { + _soundResource1.play(0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + _soundResource1.play(0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + _soundResource1.play(0x44051000); + } + break; + } + return messageResult; +} + +void KmScene1303::update4161A0() { + Klayman::update(); + _counter3++; + if (_counter3 >= _counter3Max) + sub416250(); +} + +void KmScene1303::sub4161D0() { + _status2 = 0; + _flagE5 = true; + setFileHash(0xAC20C012, 8, 37); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&Klayman::handleMessage41D480); + SetAnimationCallback3(&KmScene1303::sub416250); +} + +void KmScene1303::sub416210() { + _status2 = 1; + _flagE5 = false; + setFileHash(0xAC20C012, 43, 49); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&Klayman::handleMessage41D480); +} + +void KmScene1303::sub416250() { + _counter3 = 0; + _status2 = 0; + _flagE5 = true; + _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + setFileHash(0xAC20C012, 38, 42); + SetUpdateHandler(&KmScene1303::update4161A0); + SetSpriteCallback(NULL); + SetMessageHandler(&Klayman::handleMessage41D360); + _newHashListIndex = 42; +} + +void KmScene1303::sub4162B0() { + _status2 = 0; + _flagE5 = false; + setFileHash(0x2426932E, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1303::handleMessage4160A0); +} + // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 12862e39ae..31a96f7cc7 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -322,6 +322,19 @@ protected: void sub40E040(); }; +class KmScene1303 : public Klayman { +public: + KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage4160A0(int messageNum, const MessageParam ¶m, Entity *sender); + void update4161A0(); + void sub4161D0(); + void sub416210(); + void sub416250(); + void sub4162B0(); +}; + class KmScene1401 : public Klayman { public: KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 7c7beb7cd4..d893e8f483 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -155,6 +155,11 @@ void Module1300::createScene1302(int which) { } void Module1300::createScene1303(int which) { + _vm->gameState().sceneNum = 2; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1303(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1303); } void Module1300::createScene1304(int which) { @@ -243,6 +248,14 @@ void Module1300::updateScene1302() { } void Module1300::updateScene1303() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1306(3); + _childObject->handleUpdate(); + } } void Module1300::updateScene1304() { @@ -661,4 +674,100 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + + // TODO createSurface3(200, dword_4AF9F8); + createSurface(200, 640, 480); //TODO: Remeove once the line above is done + _x = 289; + _y = 390; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1303Balloon::handleMessage); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + setFileHash(0x800278D2, 0, -1); +} + +uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x2000: + stPopBalloon(); + break; + } + return messageResult; +} + +uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x020B0003) { + _soundResource.play(0x742B0055); + } + break; + case 0x3002: + _soundResource.play(0x470007EE); + setFileHash1(); + SetMessageHandler(NULL); + _surface->setVisible(false); + break; + } + return messageResult; +} + +void AsScene1303Balloon::stPopBalloon() { + setFileHash(0xAC004CD0, 0, -1); + SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped); +} + +Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene1303::handleMessage); + setRectList(0x004AF9E8); + + _background = addBackground(new DirtyBackground(_vm, 0x01581A9C, 0, 0)); + _palette = new Palette(_vm, 0x01581A9C); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x81A9801D, NULL)); + + if (!getGlobalVar(0xAC00C0D0)) { + _asBalloon = addSprite(new AsScene1303Balloon(_vm, this)); + _vm->_collisionMan->addSprite(_asBalloon); + } + + _sprite1 = addSprite(new StaticSprite(_vm, 0xA014216B, 1100)); + + _klayman = new KmScene1303(_vm, this, 207, 332); + addSprite(_klayman); + setMessageList(0x004AF9A0); + + _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + +} + +uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + setGlobalVar(0xAC00C0D0, 1); + _asBalloon->sendMessage(0x2000, 0, this); + break; + case 0x4826: + if (sender == _asBalloon && getGlobalVar(0x31C63C51)) { + setMessageList(0x004AF9B8); + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 25dde469b9..edabe4f3a9 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -127,6 +127,26 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class AsScene1303Balloon : public AnimatedSprite { +public: + AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender); + void stPopBalloon(); +}; + +class Scene1303 : public Scene { +public: + Scene1303(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_asBalloon; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ -- cgit v1.2.3 From 4c7930bd342740c2dd89eb1477c6b4b47ba41ca3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Sep 2011 08:50:33 +0000 Subject: NEVERHOOD: Add tables for Scene1304 --- devtools/create_neverhood/tables.h | 8 ++++++++ dists/engine-data/neverhood.dat | Bin 13044 -> 13286 bytes 2 files changed, 8 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index bcd758404d..30ae94da27 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -57,6 +57,8 @@ static const uint32 rectListOffsets[] = { 2, 0x004B0A38, // Scene1303 1, 0x004AF9E8, + // Scene1304 + 1, 0x004B91A8, // Scene1401 1, 0x004B6758, // Scene1402 @@ -150,6 +152,12 @@ static const uint32 messageListOffsets[] = { // Scene1303 1, 0x004AF9A0, 2, 0x004AF9B8, + // Scene1304 + 1, 0x004B90E8, + 1, 0x004B90F0, + 2, 0x004B9158, + 2, 0x004B9130, + 2, 0x004B9140, // Scene1401 1, 0x004B65C8, 1, 0x004B65D0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index bb53d46640..4b510ceb28 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 086879a4aac6ef0d9662293dfb6a7dce4d61cb57 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Sep 2011 08:51:24 +0000 Subject: NEVERHOOD: Add Scene1304 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 53 ++++++++++++++++++ engines/neverhood/klayman.h | 7 +++ engines/neverhood/module1300.cpp | 113 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 18 +++++++ engines/neverhood/module1400.cpp | 7 +-- 6 files changed, 196 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 8b984e211f..4c70ff203b 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -247,7 +247,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 2; + _vm->gameState().sceneNum = 3; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index d8b1dbee7d..57e1274dc2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2978,6 +2978,59 @@ void KmScene1303::sub4162B0() { SetMessageHandler(&KmScene1303::handleMessage4160A0); } +KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + +} + +uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 31a96f7cc7..77c4160794 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -335,6 +335,13 @@ protected: void sub4162B0(); }; +class KmScene1304 : public Klayman { +public: + KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene1401 : public Klayman { public: KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index d893e8f483..c6dfd3886b 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1300.h" #include "neverhood/module1000.h" +#include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" @@ -163,6 +164,11 @@ void Module1300::createScene1303(int which) { } void Module1300::createScene1304(int which) { + _vm->gameState().sceneNum = 3; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1304(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1304); } void Module1300::createScene1305(int which) { @@ -259,6 +265,14 @@ void Module1300::updateScene1303() { } void Module1300::updateScene1304() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1316(0); + _childObject->handleUpdate(); + } } void Module1300::updateScene1305() { @@ -770,4 +784,103 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) + : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { + + if (getGlobalVar(0x31C63C51)) { + _surface->setVisible(false); + SetMessageHandler(NULL); + } else { + SetMessageHandler(&Class544::handleMessage); + } +} + +uint32 Class544::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + _parentScene->sendMessage(0x4826, 0, this); + messageResult = 1; + break; + case 0x4806: + setGlobalVar(0x31C63C51, 1); + _surface->setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene1304::handleMessage); + setRectList(0x004B91A8); + + _background = addBackground(new DirtyBackground(_vm, 0x062C0214, 0, 0)); + _palette = new Palette(_vm, 0x062C0214); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL)); + + if (getGlobalVar(0xAC00C0D0)) { + _class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347)); + _vm->_collisionMan->addSprite(_class545); + } else { + _class545 = addSprite(new AnimatedSprite(_vm, 0x80106018, 100, 279, 48)); + // TODO _class545->setUpdateDeltaXY(); + } + + if (!getGlobalVar(0x31C63C51)) { + _class544 = addSprite(new Class544(_vm, this, 1100, 278, 347)); + _vm->_collisionMan->addSprite(_class544); + } else { + _class544 = NULL; + } + + _sprite1 = addSprite(new StaticSprite(_vm, 0x0562E621, 1100)); + addSprite(new StaticSprite(_vm, 0x012AE033, 1100)); + addSprite(new StaticSprite(_vm, 0x090AF033, 1100)); + + if (which < 0) { + _klayman = new KmScene1304(_vm, this, 217, 347); + setMessageList(0x004B90E8); + } else { + _klayman = new KmScene1304(_vm, this, 100, 347); + setMessageList(0x004B90F0); + } + addSprite(_klayman); + + _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + +} + +uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x415634A4) { + if (getGlobalVar(0xAC00C0D0)) { + messageList402220(); + } else { + setMessageList(0x004B9158); + } + } + break; + case 0x4826: + if (sender == _class544) { + _klayman->sendEntityMessage(0x1014, _class544, this); + setMessageList(0x004B9130); + } else if (sender == _class545) { + _klayman->sendEntityMessage(0x1014, _class545, this); + setMessageList(0x004B9140); + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index edabe4f3a9..ca53147331 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -147,6 +147,24 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class544 : public AnimatedSprite { +public: + Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1304 : public Scene { +public: + Scene1304(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_class545; + Sprite *_class544; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 52e5ae73c2..7835520273 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1400.h" #include "neverhood/module1000.h" +#include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" #include "neverhood/gamemodule.h" @@ -1456,7 +1457,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _class401_1->getSurface()->setVisible(false); _class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995)); - + _class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995)); _asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011); @@ -1578,8 +1579,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL)); if (getGlobalVar(0x13382860) == 5) { - // TODO _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); - // TODO _vm->_collisionMan->addSprite(_class545); + _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); + _vm->_collisionMan->addSprite(_class545); } _sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100)); -- cgit v1.2.3 From a29c62ce5a801e245a44daa680f5c109f965f750 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Sep 2011 09:18:42 +0000 Subject: NEVERHOOD: Add tables for Scene1305 --- devtools/create_neverhood/tables.h | 5 +++++ dists/engine-data/neverhood.dat | Bin 13286 -> 13404 bytes 2 files changed, 5 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 30ae94da27..207f2f75ed 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -59,6 +59,8 @@ static const uint32 rectListOffsets[] = { 1, 0x004AF9E8, // Scene1304 1, 0x004B91A8, + // Scene1305 + 1, 0x004B6E98, // Scene1401 1, 0x004B6758, // Scene1402 @@ -158,6 +160,9 @@ static const uint32 messageListOffsets[] = { 2, 0x004B9158, 2, 0x004B9130, 2, 0x004B9140, + // Scene1305 + 1, 0x004B6E40, + 1, 0x004B6E48, // Scene1401 1, 0x004B65C8, 1, 0x004B65D0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 4b510ceb28..7e94af3990 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From a6cb31c9c3b4d516b5cfe4d93ccb94cc4c62c9d1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Sep 2011 09:18:53 +0000 Subject: NEVERHOOD: Add Scene1305 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 43 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 9 +++++++++ engines/neverhood/module1300.cpp | 40 +++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 7 +++++++ 5 files changed, 100 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 4c70ff203b..1487e8c9b2 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -247,7 +247,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 3; + _vm->gameState().sceneNum = 4; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 57e1274dc2..3f03faad85 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2981,6 +2981,7 @@ void KmScene1303::sub4162B0() { KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty } uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3031,6 +3032,48 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene1305::KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + setCallback2(AnimationCallback(&KmScene1305::sub46BEF0)); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + } + return 0; +} + +void KmScene1305::sub46BEF0() { + _soundResource1.play(0x41648271); + _status2 = 1; + _flagE5 = false; + setFileHash2(0x000BAB02, 0x88003000, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&Klayman::handleMessage41D480); + SetAnimationCallback3(&KmScene1305::sub46BF60); +} + +void KmScene1305::sub46BF60() { + setDoDeltaX(2); + sub41FC80(); +} + // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 77c4160794..c269e91ed0 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -342,6 +342,15 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene1305 : public Klayman { +public: + KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub46BEF0(); + void sub46BF60(); +}; + class KmScene1401 : public Klayman { public: KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index c6dfd3886b..4814f41260 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -172,6 +172,11 @@ void Module1300::createScene1304(int which) { } void Module1300::createScene1305(int which) { + _vm->gameState().sceneNum = 4; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1305(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1305); } void Module1300::createScene1306(int which) { @@ -276,6 +281,14 @@ void Module1300::updateScene1304() { } void Module1300::updateScene1305() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1317(-1); + _childObject->handleUpdate(); + } } void Module1300::updateScene1306() { @@ -883,4 +896,31 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene1305::handleMessage); + setRectList(0x004B6E98); + + _background = addBackground(new DirtyBackground(_vm, 0x28801B64, 0, 0)); + _palette = new Palette(_vm, 0x28801B64); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL)); + + if (which < 0) { + _klayman = new KmScene1305(_vm, this, 212, 441); + setMessageList(0x004B6E40); + } else { + _klayman = new KmScene1305(_vm, this, 212, 441); + setMessageList(0x004B6E48); + } + addSprite(_klayman); + +} + +uint32 Scene1305::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + return Scene::handleMessage(messageNum, param, sender); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index ca53147331..03e3d6e92d 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -165,6 +165,13 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene1305 : public Scene { +public: + Scene1305(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ -- cgit v1.2.3 From 089ada55ba0eb1ba877921e9fd175ff16a9b7320 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Sep 2011 13:16:40 +0000 Subject: NEVERHOOD: Add tables for Scene1306 --- devtools/create_neverhood/tables.h | 16 ++++++++++++++++ dists/engine-data/neverhood.dat | Bin 13404 -> 14050 bytes 2 files changed, 16 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 207f2f75ed..54eed45c78 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -61,6 +61,9 @@ static const uint32 rectListOffsets[] = { 1, 0x004B91A8, // Scene1305 1, 0x004B6E98, + // Scene1306 + 1, 0x004AFD28, + 1, 0x004AFD18, // Scene1401 1, 0x004B6758, // Scene1402 @@ -163,6 +166,19 @@ static const uint32 messageListOffsets[] = { // Scene1305 1, 0x004B6E40, 1, 0x004B6E48, + // Scene1306 + 1, 0x004AFAD0, + 2, 0x004AFAF0, + 1, 0x004AFBC8, + 1, 0x004AFC30, + 4, 0x004AFC38, + 2, 0x004AFB00, + 1, 0x004AFBD0, + 4, 0x004AFBD8, + 2, 0x004AFAE0, + 1, 0x004AFAD8, + 2, 0x004AFC58, + 2, 0x004AFC68, // Scene1401 1, 0x004B65C8, 1, 0x004B65D0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 7e94af3990..3d08f66ee7 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 30ff790a0756466bfcd19b1193e9efb4e2bb377c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Sep 2011 13:16:51 +0000 Subject: NEVERHOOD: Add Scene1306 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 157 +++++++++++++++++++++ engines/neverhood/klayman.h | 11 ++ engines/neverhood/module1300.cpp | 290 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 36 +++++ engines/neverhood/sprite.h | 3 +- 6 files changed, 497 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 1487e8c9b2..93ea6c5066 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -247,7 +247,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 4; + _vm->gameState().sceneNum = 5; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 3f03faad85..739c8ad6fa 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3074,6 +3074,163 @@ void KmScene1305::sub46BF60() { sub41FC80(); } +KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + _flag1 = false; +} + +uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _flag1 = param.asInteger() != 0; + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub421350)); + else + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + } else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481A: + setCallback2(AnimationCallback(&Klayman::sub420680)); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub4214D0)); + else + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub421510)); + else + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x482E: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub421030)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420FE0)); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4210C0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub421070)); + } + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x4835: + _parentScene->sendMessage(0x2000, 1, this); + _flag1 = true; + setCallback2(AnimationCallback(&Klayman::sub4212C0)); + break; + case 0x4836: + _parentScene->sendMessage(0x2000, 0, this); + _flag1 = false; + setCallback2(AnimationCallback(&Klayman::sub421310)); + break; + case 0x483D: + sub417D40(); + break; + case 0x483E: + sub417D80(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return messageResult; +} + +void KmScene1306::sub417D40() { + _status2 = 0; + _flagE5 = false; + setFileHash(0xEE084A04, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1306::handleMessage417CB0); +} + +void KmScene1306::sub417D80() { + _status2 = 0; + _flagE5 = false; + setFileHash(0xB86A4274, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1306::handleMessage417CB0); +} + +uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + _soundResource1.play(0x85B10BB8); + } else if (param.asInteger() == 0x4E6A0CA0) { + _soundResource1.play(0xC5B709B0); + } + } + return messageResult; +} + // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index c269e91ed0..118e8131e3 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -351,6 +351,17 @@ protected: void sub46BF60(); }; +class KmScene1306 : public Klayman { +public: + KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag1; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage417CB0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub417D40(); + void sub417D80(); +}; + class KmScene1401 : public Klayman { public: KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 4814f41260..f437ddc730 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1300.h" #include "neverhood/module1000.h" +#include "neverhood/module1200.h" #include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" #include "neverhood/navigationscene.h" @@ -180,6 +181,11 @@ void Module1300::createScene1305(int which) { } void Module1300::createScene1306(int which) { + _vm->gameState().sceneNum = 5; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1306(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1306); } void Module1300::createScene1307(int which) { @@ -292,6 +298,24 @@ void Module1300::updateScene1305() { } void Module1300::updateScene1306() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 2) { + createScene1309(0); + _childObject->handleUpdate(); + } else if (_field20 == 3) { + createScene1303(0); + _childObject->handleUpdate(); + } else if (_field20 == 0) { + _parentModule->sendMessage(0x1009, 0, this); + } else if (_field20 == 1) { + createScene1311(-1); + _childObject->handleUpdate(); + } + } } void Module1300::updateScene1307() { @@ -923,4 +947,270 @@ uint32 Scene1305::handleMessage(int messageNum, const MessageParam ¶m, Entit return Scene::handleMessage(messageNum, param, sender); } +AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), + _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true), + _countdown(0) { + + _x = 320; + _y = 240; + createSurface1(0x043B0270, 100); + setFileHash(0x043B0270, 0, -1); + _newHashListIndex = 0; + SetMessageHandler(&AsScene1306Elevator::handleMessage); + _soundResource1.load(0x1C100E83); + _soundResource2.load(0x1C08CEC5); + _soundResource3.load(0x5D011E87); +} + +void AsScene1306Elevator::update() { + if (_isUp && _countdown != 0 && (--_countdown == 0)) { + stGoingDown(); + } + AnimatedSprite::update(); + if (_frameIndex == 7) { + _soundResource3.play(); + _asElevatorDoor->getSurface()->setVisible(false); + } +} + +void AsScene1306Elevator::upGoingDown() { + AnimatedSprite::update(); + if (_frameIndex == 5) { + _asElevatorDoor->getSurface()->setVisible(true); + } +} + +uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + if (_isUp) + _countdown = 144; + messageResult = _isUp ? 1 : 0; + break; + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + if (_isDown) + stGoingUp(); + break; + } + return messageResult; +} + +void AsScene1306Elevator::stGoingUp() { + _surface->setVisible(true); + _isDown = false; + SetUpdateHandler(&AsScene1306Elevator::update); + setFileHash(0x043B0270, 0, -1); + SetAnimationCallback3(&AsScene1306Elevator::cbGoingUpEvent); + _soundResource1.play(); +} + +void AsScene1306Elevator::cbGoingUpEvent() { + SetUpdateHandler(&AsScene1306Elevator::update); + _parentScene->sendMessage(0x4808, 0, this); + _isUp = true; + _countdown = 144; + setFileHash1(); + _surface->setVisible(false); +} + +void AsScene1306Elevator::stGoingDown() { + SetUpdateHandler(&AsScene1306Elevator::upGoingDown); + _isUp = false; + _surface->setVisible(true); + setFileHash(0x043B0270, -1, -1); + _playBackwards = true; + SetAnimationCallback3(&AsScene1306Elevator::cbGoingDownEvent); + _soundResource2.play(); +} + +void AsScene1306Elevator::cbGoingDownEvent() { + _isDown = true; + _parentScene->sendMessage(0x4809, 0, this); + SetUpdateHandler(&AsScene1306Elevator::update); + setFileHash1(); +} + +Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) + setGlobalVar(0x13382860, 4); + + _surfaceFlag = true; + SetMessageHandler(&Scene1306::handleMessage); + + _background = addBackground(new DirtyBackground(_vm, 0x05303114, 0, 0)); + _palette = new Palette(_vm, 0x05303114); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x0311005B, NULL)); + + if (!getGlobalVar(0x13382860)) { + _class545 = addSprite(new Class545(_vm, this, 2, 1100, 435, 445)); + _vm->_collisionMan->addSprite(_class545); + } + + _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x404A36A0, 100, 0x440C1000)); + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 19, 1100, 359, 445, 0x9148A011)); + + _asElevatorDoor = new AnimatedSprite(_vm, 0x043B0270, 90, 320, 240); + _asElevatorDoor->setFileHash(0x043B0270, 6, -1); + _asElevatorDoor->setNewHashListIndex(6); + addSprite(_asElevatorDoor); + + _asElevator = addSprite(new AsScene1306Elevator(_vm, this, _asElevatorDoor)); + + _sprite1 = addSprite(new StaticSprite(_vm, 0x036A1EE0, 80)); + + addSprite(new StaticSprite(_vm, 0x00042313, 1100)); + + if (which < 0) { + _klayman = new KmScene1306(_vm, this, 380, 440); + setMessageList(0x004AFAD0); + sendMessage(0x2000, 0, this); + _vm->_collisionMan->addSprite(_asTape); + } else if (which == 1) { + _klayman = new KmScene1306(_vm, this, 136, 440); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004AFAF0); + sendMessage(0x2000, 1, this); + _vm->_collisionMan->addSprite(_asTape); + } else if (which == 2) { + if (getGlobalVar(0xC0418A02)) { + _klayman = new KmScene1306(_vm, this, 515, 440); + _klayman->setDoDeltaX(1); + } else { + _klayman = new KmScene1306(_vm, this, 355, 440); + } + setMessageList(0x004AFBC8); + sendMessage(0x2000, 0, this); + _vm->_collisionMan->addSprite(_asTape); + } else if (which == 3) { + _klayman = new KmScene1306(_vm, this, 534, 440); + setMessageList(0x004AFC30); + sendMessage(0x2000, 0, this); + _vm->_collisionMan->addSprite(_asTape); + } else if (which == 4) { + _klayman = new KmScene1306(_vm, this, 136, 440); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004AFC38); + sendMessage(0x2000, 1, this); + _vm->_collisionMan->addSprite(_asTape); + } else if (which == 5) { + _klayman = new KmScene1306(_vm, this, 136, 440); + _klayman->sendMessage(0x2000, 1, this); + setMessageList(0x004AFB00); + sendMessage(0x2000, 1, this); + _vm->_collisionMan->addSprite(_asTape); + } else { + _klayman = new KmScene1306(_vm, this, 286, 408); + setSurfacePriority(_asElevator->getSurface(), 1100); + setSurfacePriority(_asElevatorDoor->getSurface(), 1090); + setSurfacePriority(_sprite1->getSurface(), 1080); + sendMessage(0x2000, 0, this); + SetMessageHandler(&Scene1306::handleMessage416EB0); + clearRectList(); + _asElevator->sendMessage(0x4808, 0, this); + } + addSprite(_klayman); + +} + +Scene1306::~Scene1306() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +if (messageNum) debug("%04X", messageNum); + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) { + _klayman->sendEntityMessage(0x1014, _ssButton, this); + } else if (param.asInteger() == 0x01C66840) { + if (_asElevator->sendMessage(0x2001, 0, this) != 0) { + setMessageList(0x004AFBD8); + } else { + setMessageList(0x004AFAE0); + } + } else if (param.asInteger() == 0x8E646E00) { + setMessageList(0x004AFAD8); + clearRectList(); + SetMessageHandler(&Scene1306::handleMessage416EB0); + } + break; + case 0x2000: + if (param.asInteger() != 0) { + setRectList(0x004AFD28); + _klayman->setKlaymanTable3(); + } else { + setRectList(0x004AFD18); + _klayman->setKlaymanTable1(); + } + break; + case 0x480B: + if (sender == _ssButton) { + _asElevator->sendMessage(0x4808, 0, this); + } + break; + case 0x4826: + if (sender == _class545) { + if (_klayman->getX() >= 249) { + _klayman->sendEntityMessage(0x1014, _class545, this); + setMessageList(0x004AFC58); + } + } else if (sender == _asTape) { + if (_klayman->getX() >= 249) { + _klayman->sendEntityMessage(0x1014, _class545, this); + setMessageList(0x004AFC68); + } + } + break; + case 0x482A: + setSurfacePriority(_asElevator->getSurface(), 1100); + setSurfacePriority(_asElevatorDoor->getSurface(), 1090); + setSurfacePriority(_sprite1->getSurface(), 1080); + break; + case 0x482B: + setSurfacePriority(_asElevator->getSurface(), 100); + setSurfacePriority(_asElevatorDoor->getSurface(), 90); + setSurfacePriority(_sprite1->getSurface(), 80); + sendMessage(0x2000, 0, this); + _vm->_collisionMan->addSprite(_asTape); + break; + } + return 0; +} + +uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + setMessageList(0x004AFBD0); + SetMessageHandler(&Scene1306::handleMessage); + break; + case 0x4809: + _parentModule->sendMessage(0x1009, 1, this); + break; + case 0x482A: + setSurfacePriority(_asElevator->getSurface(), 1100); + setSurfacePriority(_asElevatorDoor->getSurface(), 1090); + setSurfacePriority(_sprite1->getSurface(), 1080); + break; + case 0x482B: + setSurfacePriority(_asElevator->getSurface(), 100); + setSurfacePriority(_asElevatorDoor->getSurface(), 90); + setSurfacePriority(_sprite1->getSurface(), 80); + sendMessage(0x2000, 0, this); + _vm->_collisionMan->addSprite(_asTape); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 03e3d6e92d..33f5fb5c9f 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -172,6 +172,42 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class AsScene1306Elevator : public AnimatedSprite { +public: + AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor); +protected: + Scene *_parentScene; + AnimatedSprite *_asElevatorDoor; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + bool _isUp; + bool _isDown; + int _countdown; + void update(); + void upGoingDown(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stGoingUp(); + void cbGoingUpEvent(); + void stGoingDown(); + void cbGoingDownEvent(); +}; + +class Scene1306 : public Scene { +public: + Scene1306(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene1306(); +protected: + Sprite *_ssButton; + Sprite *_asTape; + AnimatedSprite *_asElevatorDoor; + Sprite *_asElevator; + Sprite *_sprite1; + Sprite *_class545; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 7ec5d9124a..16d79319fd 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -114,6 +114,8 @@ public: void clearRepl(); uint32 getCurrAnimFileHash() const { return _currAnimFileHash; } int16 getFrameIndex() const { return _frameIndex; } + void setNewHashListIndex(int value) { _newHashListIndex = value; } + void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4); protected: typedef void (AnimatedSprite::*AnimationCb)(); AnimResource _animResource; @@ -154,7 +156,6 @@ protected: void updateFrameIndex(); void updateFrameInfo(); void createSurface1(uint32 fileHash, int surfacePriority); - void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4); void setFileHash1(); void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5); void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); -- cgit v1.2.3 From e13b8740c9b6d3bfa74ca583aea3f1d101b78bc9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 15 Sep 2011 08:02:40 +0000 Subject: NEVERHOOD: Add Scene1307 --- engines/neverhood/gamemodule.cpp | 39 +++- engines/neverhood/gamemodule.h | 1 + engines/neverhood/module1300.cpp | 386 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module1300.h | 46 +++++ 4 files changed, 470 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 93ea6c5066..277b55da7c 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -85,6 +85,43 @@ void GameModule::handleMouseDown(int16 x, int16 y) { } } +void GameModule::initScene1307Vars() { + + if (getSubVar(0x40050052, 0x25400B10)) + return; + + for (uint i = 0; i < 3; i++) { + bool more; + do { + more = false; + setSubVar(0x0C10A000, i, _vm->_rnd->getRandomNumber(16 - 1)); + if (i > 0) { + for (uint j = 0; j < i && !more; j++) { + more = getSubVar(0x0C10A000, j) == getSubVar(0x0C10A000, i); + } + } + } while (more); + } + + for (uint i = 0; i < 3; i++) { + bool more; + do { + more = false; + setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1)); + if (i > 0) { + for (uint j = 0; j < i && !more; j++) { + more = getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i); + } + } + if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i)) + more = true; + } while (more); + } + + setSubVar(0x40050052, 0x25400B10, 1); + +} + void GameModule::initScene1405Vars() { // TODO: Give better names @@ -247,7 +284,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 6; createModule1300(-1); #endif } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index ef199f772a..02f16c552b 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -37,6 +37,7 @@ public: void startup(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); + void initScene1307Vars(); void initScene1405Vars(); void initScene3009Vars(); protected: diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index f437ddc730..27f8a11f75 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -24,6 +24,7 @@ #include "neverhood/module1000.h" #include "neverhood/module1200.h" #include "neverhood/module2200.h" +#include "neverhood/gamemodule.h" #include "neverhood/diskplayerscene.h" #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" @@ -189,6 +190,11 @@ void Module1300::createScene1306(int which) { } void Module1300::createScene1307(int which) { + _vm->gameState().sceneNum = 6; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1307(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1307); } void Module1300::createScene1308(int which) { @@ -319,6 +325,14 @@ void Module1300::updateScene1306() { } void Module1300::updateScene1307() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1308(2); + _childObject->handleUpdate(); + } } void Module1300::updateScene1308() { @@ -1126,7 +1140,6 @@ Scene1306::~Scene1306() { } uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { -if (messageNum) debug("%04X", messageNum); Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1213,4 +1226,375 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, return 0; } +static const uint32 kAsScene1307KeyResourceList1[] = { + 0x0438069C, + 0x45B0023C, + 0x05700217 +}; + +static const uint32 kAsScene1307KeyResourceList2[] = { + 0x04441334, + 0x061433F0, + 0x06019390 +}; + +static const uint32 kAsScene1307KeyResourceList3[] = { + 0x11A80030, + 0x178812B1, + 0x1488121C +}; + +static const uint32 *kAsScene1307KeyResourceLists[] = { + kAsScene1307KeyResourceList1, + kAsScene1307KeyResourceList2, + kAsScene1307KeyResourceList3 +}; + +static const int kAsScene1307KeySurfacePriorities[] = { + 700, + 500, + 300, + 100 +}; + +const uint kAsScene1307KeyPointsCount = 12; + +static const NPoint kAsScene1307KeyPoints[] = { + {-2, 0}, + {-5, 0}, + { 5, 0}, + {12, 0}, + {17, 0}, + {25, 0}, + {16, -2}, + {10, -6}, + { 0, -7}, + {-7, -3}, + {-3, 4}, + { 2, 2} +}; + +const uint kAsScene1307KeyFrameIndicesCount = 20; + +static const int16 kAsScene1307KeyFrameIndices[] = { + 1, 4, 8, 11, 15, 16, 17, 17, 17, 16, + 15, 14, 12, 10, 9, 7, 5, 3, 2, 1 +}; + +const int kAsScene1307KeyDivValue = 200; + +const int16 kAsScene1307KeyXDelta = 70; +const int16 kAsScene1307KeyYDelta = -12; + +AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), + _soundResource4(vm), _parentScene(parentScene), _index(index), _clipRects(clipRects), + _isClickable(true) { + + NPoint pt; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + + _dataResource.load(0x22102142); + _pointList = _dataResource.getPointArray(0xAC849240); + + pt = (*_pointList)[getSubVar(0xA010B810, _index)]; + _x = pt.x; + _y = pt.y; + + // TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], fileHashes); + createSurface(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], 640, 480); //TODO: Remeove once the line above is done + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1307Key::handleMessage); + + setFileHash(fileHashes[0], 0, -1); + + _soundResource1.load(0xDC4A1280); + _soundResource2.load(0xCC021233); + _soundResource3.load(0xC4C23844); + _soundResource3.load(0xC4523208); + +} + +uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_isClickable) { + _parentScene->sendMessage(0x4826, 0, this); + stRemoveKey(); + messageResult = 1; + } + break; + case 0x2000: + _isClickable = param.asInteger() != 0; + break; + case 0x2001: + setSubVar(0xA010B810, _index, param.asInteger()); + stMoveKey(); + break; + case 0x2003: + _soundResource4.play(); + stUnlock(); + break; + case 0x2004: + _soundResource3.play(); + stInsert(); + break; + } + return messageResult; +} + +void AsScene1307Key::suRemoveKey() { + if (_pointIndex < kAsScene1307KeyPointsCount) { + _x += kAsScene1307KeyPoints[_pointIndex].x; + _y += kAsScene1307KeyPoints[_pointIndex].y; + processDelta(); + _pointIndex++; + } else { + SetSpriteCallback(NULL); + } +} + +void AsScene1307Key::suInsertKey() { + if (_pointIndex < kAsScene1307KeyPointsCount) { + _x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x; + _y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y; + processDelta(); + _pointIndex++; + if (_pointIndex == 7) + _soundResource1.play(); + } else { + SetSpriteCallback(NULL); + _parentScene->sendMessage(0x2002, 0, this); + } +} + +void AsScene1307Key::suMoveKey() { + if (_pointIndex < kAsScene1307KeyFrameIndicesCount) { + _frameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; + _x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue; + _y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue; + processDelta(); + _pointIndex++; + } else { + NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)]; + _x = pt.x + kAsScene1307KeyXDelta; + _y = pt.y + kAsScene1307KeyYDelta; + stInsertKey(); + } +} + +void AsScene1307Key::stRemoveKey() { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + _pointIndex = 0; + SetSpriteCallback(&AsScene1307Key::suRemoveKey); + setFileHash(fileHashes[0], 0, -1); + _soundResource2.play(); +} + +void AsScene1307Key::stInsertKey() { + _pointIndex = 0; + _parentScene->sendMessage(0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], this); + _surface->getClipRect() = _clipRects[getSubVar(0xA010B810, _index) % 4]; + SetSpriteCallback(&AsScene1307Key::suInsertKey); + _newHashListIndex = -2; +} + +void AsScene1307Key::stMoveKey() { + NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)]; + int16 newX = pt.x + kAsScene1307KeyXDelta; + int16 newY = pt.y + kAsScene1307KeyYDelta; + _parentScene->sendMessage(0x1022, 1000, this); + _surface->getClipRect().x1 = 0; + _surface->getClipRect().y1 = 0; + _surface->getClipRect().x2 = 640; + _surface->getClipRect().y2 = 480; + _prevX = _x; + _prevY = _y; + if (newX == _x && newY == _y) { + stInsertKey(); + } else { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + _pointIndex = 0; + _frameIndex = 0; + _deltaX = newX - _x; + _deltaY = newY - _y; + SetSpriteCallback(&AsScene1307Key::suMoveKey); + setFileHash(fileHashes[0], 0, -1); + } +} + +void AsScene1307Key::stUnlock() { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + setFileHash(fileHashes[1], 0, -1); + _newHashListIndex = -2; +} + +void AsScene1307Key::stInsert() { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + setFileHash(fileHashes[2], 0, -1); + _newHashListIndex = -2; +} + +Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm), _countdown(0), + _asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { + + //DEBUG + setSubVar(0x08D0AB11, 0, 1); + setSubVar(0x08D0AB11, 1, 1); + setSubVar(0x08D0AB11, 2, 1); + + Sprite *tempSprite; + + _vm->gameModule()->initScene1307Vars(); + + _dataResource.load(0x22102142); + _keyHolePoints = _dataResource.getPointArray(0xAC849240); + + for (uint i = 0; i < 16; i++) { + NPoint pt = (*_keyHolePoints)[i]; + _keyHoleRects[i].x1 = pt.x - 15; + _keyHoleRects[i].y1 = pt.y - 15; + _keyHoleRects[i].x2 = pt.x + 15; + _keyHoleRects[i].y2 = pt.y + 15; + } + + _surfaceFlag = true; + SetMessageHandler(&Scene1307::handleMessage); + SetUpdateHandler(&Scene1307::update); + + _background = addBackground(new DirtyBackground(_vm, 0xA8006200, 0, 0)); + _palette = new Palette(_vm, 0xA8006200); + _palette->usePalette(); + addEntity(_palette); + _mouseCursor = addSprite(new Mouse435(_vm, 0x06204A88, 20, 620)); + + tempSprite = addSprite(new StaticSprite(_vm, 0x00A3621C, 800)); + _clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = 640; + _clipRects[0].y2 = 480; + + tempSprite = addSprite(new StaticSprite(_vm, 0x00A3641C, 600)); + _clipRects[1].x1 = tempSprite->getSurface()->getDrawRect().x; + _clipRects[1].y1 = 0; + _clipRects[1].x2 = 640; + _clipRects[1].y2 = 480; + + tempSprite = addSprite(new StaticSprite(_vm, 0x00A3681C, 400)); + _clipRects[2].x1 = tempSprite->getSurface()->getDrawRect().x; + _clipRects[2].y1 = 0; + _clipRects[2].x2 = 640; + _clipRects[2].y2 = 480; + + tempSprite = addSprite(new StaticSprite(_vm, 0x00A3701C, 200)); + _clipRects[3].x1 = tempSprite->getSurface()->getDrawRect().x; + _clipRects[3].y1 = 0; + _clipRects[3].x2 = 640; + _clipRects[3].y2 = 480; + + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { + if (getSubVar(0x08D0AB11, keyIndex)) { + _asKeys[keyIndex] = addSprite(new AsScene1307Key(_vm, this, keyIndex, _clipRects)); + _vm->_collisionMan->addSprite(_asKeys[keyIndex]); + } else { + _asKeys[keyIndex] = NULL; + } + } + + _soundResource.load(0x68E25540); + +} + +void Scene1307::update() { + Scene::update(); + if (_countdown && (--_countdown == 0)) { + _doLeaveScene = true; + } else if (_countdown == 20) { + _palette->startFadeToWhite(40); + } + if (_doLeaveScene && !_soundResource.isPlaying()) { + _parentModule->sendMessage(0x1009, 1, this); + setGlobalVar(0x80455A41, 1); + } +} + +uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO Debug stuff + if (!_isPuzzleSolved) { + if (param.asPoint().x > 20 && param.asPoint().x < 620) { + if (_asCurrKey && !_isInsertingKey) { + int16 mouseX = param.asPoint().x; + int16 mouseY = param.asPoint().y; + uint clickedKeyHoleIndex; + for (clickedKeyHoleIndex = 0; clickedKeyHoleIndex < 16; clickedKeyHoleIndex++) { + if (mouseX >= _keyHoleRects[clickedKeyHoleIndex].x1 && mouseX <= _keyHoleRects[clickedKeyHoleIndex].x2 && + mouseY >= _keyHoleRects[clickedKeyHoleIndex].y1 && mouseY <= _keyHoleRects[clickedKeyHoleIndex].y2) + break; + } + if (clickedKeyHoleIndex < 16) { + // Check if the clicked keyhole is already occupied with a key + bool occupied = false; + for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) { + if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex] != _asCurrKey) { + if (getSubVar(0xA010B810, keyIndex) == clickedKeyHoleIndex) + occupied = true; + } + } + if (!occupied) { + // If the keyhole is free, insert the current key + _asCurrKey->sendMessage(0x2001, clickedKeyHoleIndex, this); + _isInsertingKey = true; + _mouseClicked = false; + } + } + } + } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) { + _parentModule->sendMessage(0x1009, 0, this); + } + } + break; + // TODO Debug stuff + case 0x2002: + // Check if all keys are in the correct keyholes + if (getSubVar(0x08D0AB11, 0) && getSubVar(0xA010B810, 0) == getSubVar(0x0C10A000, 0) && + getSubVar(0x08D0AB11, 1) && getSubVar(0xA010B810, 1) == getSubVar(0x0C10A000, 1) && + getSubVar(0x08D0AB11, 2) && getSubVar(0xA010B810, 2) == getSubVar(0x0C10A000, 2)) { + // Play unlock animations for all keys + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { + if (_asKeys[keyIndex]) + _asKeys[keyIndex]->sendMessage(0x2003, 1, this); + } + _soundResource.play(); + _isPuzzleSolved = true; + _countdown = 47; + } else { + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { + if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) { + _asKeys[keyIndex]->sendMessage(0x2000, 1, this); + } + } + _asCurrKey->sendMessage(0x2004, 1, this); + } + _asCurrKey = NULL; + _isInsertingKey = false; + break; + case 0x4826: + _asCurrKey = (Sprite*)sender; + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { + if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) { + _asKeys[keyIndex]->sendMessage(0x2000, 0, this); + } + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 33f5fb5c9f..80b2774817 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -208,6 +208,52 @@ protected: uint32 handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender); }; +class AsScene1307Key : public AnimatedSprite { +public: + AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + NPointArray *_pointList; + uint _pointIndex; + int _frameIndex; + uint _index; + NRect *_clipRects; + bool _isClickable; + int16 _prevX, _prevY; + int16 _deltaX, _deltaY; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suRemoveKey(); + void suInsertKey(); + void suMoveKey(); + void stRemoveKey(); + void stInsertKey(); + void stMoveKey(); + void stUnlock(); + void stInsert(); +}; + +class Scene1307 : public Scene { +public: + Scene1307(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource; + NPointArray *_keyHolePoints; + NRect _keyHoleRects[16]; + NRect _clipRects[4]; + Sprite *_asKeys[3]; + int _countdown; + Sprite *_asCurrKey; + bool _isInsertingKey; + bool _doLeaveScene; + bool _isPuzzleSolved; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ -- cgit v1.2.3 From 85a216737cd1a8c8946dfd4ac7eafd68caeb6c09 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 15 Sep 2011 11:48:01 +0000 Subject: NEVERHOOD: Add tables for Scene1308 --- devtools/create_neverhood/tables.h | 16 ++++++++++++++++ dists/engine-data/neverhood.dat | Bin 14050 -> 14630 bytes 2 files changed, 16 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 54eed45c78..ef32a226f6 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -64,6 +64,10 @@ static const uint32 rectListOffsets[] = { // Scene1306 1, 0x004AFD28, 1, 0x004AFD18, + // Scene1308 + 1, 0x004B5990, + 1, 0x004B5980, + 1, 0x004B59A0, // Scene1401 1, 0x004B6758, // Scene1402 @@ -179,6 +183,18 @@ static const uint32 messageListOffsets[] = { 1, 0x004AFAD8, 2, 0x004AFC58, 2, 0x004AFC68, + // Scene1308 + 1, 0x004B57C0, + 1, 0x004B57C8, + 1, 0x004B58B0, + 3, 0x004B57D0, + 3, 0x004B57E8, + 2, 0x004B5868, + 4, 0x004B5848, + 3, 0x004B5830, + 2, 0x004B5800, + 2, 0x004B5868, + 2, 0x004B58E0, // Scene1401 1, 0x004B65C8, 1, 0x004B65D0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 3d08f66ee7..f9026134de 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 3e122b002c08162fdbc841e9df8a73c95358b0a4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 15 Sep 2011 11:48:51 +0000 Subject: NEVERHOOD: Add Scene1308 (renaming of stuff todo) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 135 ++++++++++++++ engines/neverhood/klayman.h | 10 + engines/neverhood/module1300.cpp | 394 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 68 +++++++ 5 files changed, 608 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 277b55da7c..6e7eb157a1 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -284,7 +284,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 6; + _vm->gameState().sceneNum = 7; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 739c8ad6fa..26f9d1afae 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3231,6 +3231,141 @@ uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam ¶ return messageResult; } +KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + _flag1 = false; +} + +uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x480A: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420600)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420550)); + } + break; + case 0x480D: + setCallback2(AnimationCallback(&KmScene1001::sub420C50)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481A: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&KmScene1308::sub456150)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420680)); + } + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x4827: + setCallback2(AnimationCallback(&Klayman::sub420E20)); + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + +uint32 KmScene1308::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (!_flag1 && param.asInteger() == 0x06040580) { + setFileHash3(0xDC409440, 0x46431401, 0); + } else if (_flag1 && param.asInteger() == 0x46431401) { + _flag1 = false; + setFileHash2(0xDC409440, 0x01084280, 0); + } else if (param.asInteger() == 0x062A1510) { + _soundResource1.play(0x41688704); + } else if (param.asInteger() == 0x02B20220) { + _soundResource1.play(0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + _soundResource1.play(0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + _soundResource1.play(0x44051000); + } else if (param.asInteger() == 0x0E4C8141) { + _soundResource1.play(0xDC4A1280); + } + break; + } + return messageResult; +} + +void KmScene1308::sub456150() { + if (!sub41CF10(AnimationCallback(&KmScene1308::sub456150))) { + _status2 = 2; + _flag1 = false; + for (uint i = 0; i < 3; i++) { + if (getSubVar(0x0090EA95, i)) { + bool more; + setSubVar(0x08D0AB11, i, 1); + setSubVar(0x0090EA95, i, 0); + do { + more = false; + setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1)); + for (uint j = 0; j < i && !more; j++) { + if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i)) + more = true; + } + if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i)) + more = true; + } while (more); + _flag1 = true; + } + } + if (!_flag1) { + setCallback2(NULL); + sub41C7B0(); + } else { + _flagE5 = false; + setFileHash(0xDC409440, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetMessageHandler(&KmScene1308::handleMessage); + _flag1 = false; + } + } +} + // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 118e8131e3..a5381c8dd1 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -362,6 +362,16 @@ protected: void sub417D80(); }; +class KmScene1308 : public Klayman { +public: + KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag1; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub456150(); +}; + class KmScene1401 : public Klayman { public: KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 27f8a11f75..c5d2870c87 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -23,6 +23,7 @@ #include "neverhood/module1300.h" #include "neverhood/module1000.h" #include "neverhood/module1200.h" +#include "neverhood/module1400.h" #include "neverhood/module2200.h" #include "neverhood/gamemodule.h" #include "neverhood/diskplayerscene.h" @@ -198,6 +199,11 @@ void Module1300::createScene1307(int which) { } void Module1300::createScene1308(int which) { + _vm->gameState().sceneNum = 7; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1308(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1308); } void Module1300::createScene1309(int which) { @@ -336,6 +342,20 @@ void Module1300::updateScene1307() { } void Module1300::updateScene1308() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_field20 == 0) { + createScene1314(0); + } else if (_field20 == 1) { + createScene1302(0); + } else if (_field20 == 2) { + createScene1307(0); + } + _childObject->handleUpdate(); + } } void Module1300::updateScene1309() { @@ -1597,4 +1617,378 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +static const uint32 kScene1308FileHashes[] = { + 0x08006320, + 0x10006320, + 0x20006320, + 0x40006320, + 0x80006320, + 0x00006321, + 0x00006322, + 0x00006324, + 0x00006328, + 0x08306320, + 0x10306320, + 0x20306320, + 0x40306320, + 0x80306320, + 0x00306321, + 0x00306322 +}; + +Class549::Class549(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _soundResource(vm), + _parentScene(parentScene) { + + SetMessageHandler(&Class549::handleMessage); + _surface->setVisible(false); + setFileHash1(); +} + +uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + sub455470(); + break; + case 0x4809: + sub4554F0(); + break; + } + return messageResult; +} + +void Class549::sub455470() { + setFileHash(0xBA0AE050, 0, -1); + _surface->setVisible(true); + SetAnimationCallback3(&Class549::hide); + _soundResource.play(calcHash("fxDoorOpen38")); +} + +void Class549::hide() { + _parentScene->sendMessage(0x2000, 0, this); + setFileHash1(); + _surface->setVisible(false); +} + +void Class549::sub4554F0() { + setFileHash(0xBA0AE050, -1, -1); + _playBackwards = true; + _surface->setVisible(true); + SetAnimationCallback3(&Class549::sub455550); + _soundResource.play(calcHash("fxDoorClose38")); +} + +void Class549::sub455550() { + _parentScene->sendMessage(0x2001, 0, this); + setFileHash1(); +} + +Class592::Class592(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _soundResource(vm), + _parentScene(parentScene) { + + SetMessageHandler(&Class592::handleMessage); + SetAnimationCallback3(&Class592::sub455710); + _soundResource.play(0x51456049); +} + +uint32 Class592::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class592::sub455710() { + setFileHash(0x6238B191, 0, -1); + SetAnimationCallback3(&Class592::sub455740); + _x = 580; + _y = 383; +} + +void Class592::sub455740() { + _parentScene->sendMessage(0x2004, 0, this); + setFileHash1(); + _surface->setVisible(false); +} + +Class593::Class593(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) { + + SetMessageHandler(&Class593::handleMessage); + _surface->setVisible(false); + setFileHash1(); + Entity::_priority = 1200; +} + +uint32 Class593::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + sub4558F0(); + break; + case 0x2003: + sub455920(); + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void Class593::sub4558F0() { + setFileHash(0x80180A10, 0, -1); + _surface->setVisible(false); + _newHashListIndex = -2; +} + +void Class593::sub455920() { + setFileHash(0x80180A10, -1, -1); + _playBackwards = true; + SetAnimationCallback3(&Class593::sub455950); +} + +void Class593::sub455950() { + _parentScene->sendMessage(0x2003, 0, this); + setFileHash1(); + _surface->setVisible(false); +} + +Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index) + : StaticSprite(vm, fileHash, 100) { + + _surface->setVisible(false); + _x = _spriteResource.getPosition().x + index * 20; + StaticSprite::update(); +} + +Class513::Class513(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100), _soundResource(vm) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class513::handleMessage); + _x = 286; + _y = 429; + createSurface1(0xA282C472, 100); + setFileHash(0xA282C472, 0, -1); +} + +uint32 Class513::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x66382026) { + _soundResource.play(0x0CD84468); + } else if (param.asInteger() == 0x6E28061C) { + _soundResource.play(0x78C8402C); + } else if (param.asInteger() == 0x462F0410) { + _soundResource.play(0x60984E28); + } + break; + } + return messageResult; +} + +Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _flag1(false) { + + _vm->gameModule()->initScene1307Vars(); + + _surfaceFlag = true; + SetMessageHandler(&Scene1308::handleMessage); + + _background = addBackground(new DirtyBackground(_vm, 0x41024202, 0, 0)); + _palette = new Palette(_vm, 0x41024202); + _palette->usePalette(); + _mouseCursor = addSprite(new Mouse433(_vm, 0x24206418, NULL)); + + _asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011)); + _vm->_collisionMan->addSprite(_asTape); + + if (getGlobalVar(0x01023818)) { + addSprite(new Class513(_vm)); + addSprite(new AnimatedSprite(_vm, 0x461A1490, 200, 235, 429)); + } + + _sprite1 = addSprite(new StaticSprite(_vm, 0x0A042060, 1100)); + _class549 = addSprite(new Class549(_vm, this)); + _class593 = addSprite(new Class593(_vm, this)); + + _class601_1 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0)); + _class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1)); + _class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2)); + + _sprite2 = addSprite(new StaticSprite(_vm, 0x40043120, 995)); + _sprite3 = addSprite(new StaticSprite(_vm, 0x43003100, 995)); + _sprite4 = NULL; + + if (which < 0) { + _klayman = new KmScene1308(_vm, this, 380, 440); + setMessageList(0x004B57C0); + if (getGlobalVar(0x80455A41)) { + _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + setRectList(0x004B5990); + } else { + _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + setRectList(0x004B5980); + } + } else if (which == 1) { + _klayman = new KmScene1308(_vm, this, 640, 440); + setMessageList(0x004B57C8); + if (getGlobalVar(0x80455A41)) { + _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + setRectList(0x004B5990); + } else { + _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + setRectList(0x004B5980); + } + } else if (which == 2) { + _klayman = new KmScene1308(_vm, this, 475, 440); + setMessageList(0x004B58B0); + if (getGlobalVar(0x80455A41)) { + _sprite5 = addSprite(new Class592(_vm, this)); + _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + _sprite4->getSurface()->setVisible(false); + } else { + _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + setRectList(0x004B5980); + } + } else { + _klayman = new KmScene1308(_vm, this, 41, 440); + setMessageList(0x004B57D0); + _class549->sendMessage(0x4808, 0, this); + _sprite1->getSurface()->setVisible(false); + if (getGlobalVar(0x80455A41)) { + _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + _klayman->getSurface()->setVisible(false); + } else { + _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + _klayman->getSurface()->setVisible(false); + } + } + addSprite(_klayman); + + if (_sprite4) { + _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = _sprite4->getSurface()->getDrawRect().x + _sprite4->getSurface()->getDrawRect().width; + _klayman->getSurface()->getClipRect().y2 = 480; + } else { + _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; + _klayman->getSurface()->getClipRect().y1 = 0; + _klayman->getSurface()->getClipRect().x2 = 640; + _klayman->getSurface()->getClipRect().y2 = 480; + } + + if (getGlobalVar(0x04A105B3) == 4) { + _class489 = new Class489(_vm, this, _klayman, 0); + addSprite(_class489); + _vm->_collisionMan->addSprite(_class489); + _class489->getSurface()->getClipRect().x1 = 0; + _class489->getSurface()->getClipRect().y1 = 0; + _class489->getSurface()->getClipRect().x2 = 0; + _class489->getSurface()->getClipRect().y2 = _sprite2->getSurface()->getDrawRect().y + _sprite2->getSurface()->getDrawRect().height; + _class489->setRepl(64, 0); + } else { + _class489 = NULL; + } + +} + +uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x88C11390) { + setRectList(0x004B59A0); + _flag1 = true; + } else if (param.asInteger() == 0x08821382) { + _klayman->sendEntityMessage(0x1014, _class489, this); + if (getGlobalVar(0x80455A41)) { + setRectList(0x004B5990); + } else { + setRectList(0x004B5980); + } + _flag1 = false; + } else if (param.asInteger() == 0x4AC68808) { + clearRectList(); + _class549->sendMessage(0x4809, 0, this); + _sprite1->getSurface()->setVisible(false); + _klayman->getSurface()->setVisible(false); + } + break; + case 0x1022: + if (sender == _class489) { + if (param.asInteger() >= 1000) + setSurfacePriority(_sprite3->getSurface(), 1100); + else + setSurfacePriority(_sprite3->getSurface(), 995); + } + break; + case 0x2000: + if (getGlobalVar(0x80455A41)) { + setRectList(0x004B5990); + } else { + setRectList(0x004B5980); + } + setMessageList(0x004B57E8); + _sprite1->getSurface()->setVisible(true); + _klayman->getSurface()->setVisible(true); + break; + case 0x2001: + _parentModule->sendMessage(0x1009, 0, this); + break; + case 0x2003: + _class601_1->getSurface()->setVisible(false); + _class601_2->getSurface()->setVisible(false); + _class601_3->getSurface()->setVisible(false); + break; + case 0x2004: + _sprite4->getSurface()->setVisible(true); + setRectList(0x004B5990); + break; + case 0x4807: + _class593->sendMessage(0x2003, 0, this); + break; + case 0x480F: + _class593->sendMessage(0x2002, 0, this); + _class601_1->getSurface()->setVisible(true); + _class601_2->getSurface()->setVisible(true); + _class601_3->getSurface()->setVisible(true); + break; + case 0x4826: + if (sender == _class489) { + if (_flag1) { + setMessageList2(0x004B5868); + } else { + if (param.asInteger() == 1) { + _klayman->sendMessage(0x1014, _class489, this); + setMessageList2(0x004B5848); + } else if (_class489->sendMessage(0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1, this) != 0) { + _klayman->sendEntityMessage(0x1014, _class489, this); + setMessageList2(0x004B5830); + } else { + setMessageList2(0x004B5800); + } + } + } else if (sender == _asTape) { + if (_flag1) { + setMessageList2(0x004B5868); + } else if (_messageListStatus != 2) { + _klayman->sendMessage(0x1014, _asTape, this); + setMessageList2(0x004B58E0); + } + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 80b2774817..8e142022cd 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -254,6 +254,74 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class549 : public AnimatedSprite { +public: + Class549(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub455470(); + void hide(); + void sub4554F0(); + void sub455550(); +}; + +class Class592 : public AnimatedSprite { +public: + Class592(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub455710(); + void sub455740(); +}; + +class Class593 : public AnimatedSprite { +public: + Class593(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub4558F0(); + void sub455920(); + void sub455950(); +}; + +class Class601 : public StaticSprite { +public: + Class601(NeverhoodEngine *vm, uint32 fileHash, int index); +}; + +class Class513 : public AnimatedSprite { +public: + Class513(NeverhoodEngine *vm); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1308 : public Scene { +public: + Scene1308(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asTape; + Sprite *_class549; + Sprite *_class593; + Sprite *_class601_1; + Sprite *_class601_2; + Sprite *_class601_3; + AnimatedSprite *_class489; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_sprite5; + bool _flag1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ -- cgit v1.2.3 From 38378d2090ef637c632e7d867d9519f57ef5db6e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 15 Sep 2011 13:16:22 +0000 Subject: NEVERHOOD: Add Scene1317 - Fix SmackerPlayer (last frame was dropped, this hopefully doesn't break other stuff...) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module1300.cpp | 181 ++++++++++++++++++++++++++++++++++++ engines/neverhood/module1300.h | 26 ++++++ engines/neverhood/smackerplayer.cpp | 20 +++- engines/neverhood/smackerplayer.h | 2 +- 5 files changed, 226 insertions(+), 5 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 6e7eb157a1..fc2ca8ed03 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -284,7 +284,7 @@ void GameModule::startup() { createModule2200(-1); #endif #if 1 - _vm->gameState().sceneNum = 7; + _vm->gameState().sceneNum = 16; createModule1300(-1); #endif } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index c5d2870c87..7de50b11cb 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -207,6 +207,11 @@ void Module1300::createScene1308(int which) { } void Module1300::createScene1309(int which) { + _vm->gameState().sceneNum = 8; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 1); + SetUpdateHandler(&Module1300::updateScene1309); } void Module1300::createScene1310(int which) { @@ -256,6 +261,11 @@ void Module1300::createScene1316(int which) { } void Module1300::createScene1317(int which) { + _vm->gameState().sceneNum = 16; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1317(_vm, this, which); + SetUpdateHandler(&Module1300::updateScene1317); } void Module1300::createScene1318(int which) { @@ -359,6 +369,14 @@ void Module1300::updateScene1308() { } void Module1300::updateScene1309() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1306(2); + _childObject->handleUpdate(); + } } void Module1300::updateScene1310() { @@ -452,6 +470,14 @@ void Module1300::updateScene1316() { } void Module1300::updateScene1317() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + createScene1318(-1); + _childObject->handleUpdate(); + } } void Module1300::updateScene1318() { @@ -1991,4 +2017,159 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + SetMessageHandler(&Scene1317::handleMessage); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); + _mouseCursor = addSprite(new Mouse433(_vm, 0x08284011, NULL)); + _mouseCursor->getSurface()->setVisible(false); + _smackerFileHash = 0; + _smackerFlag1 = false; +} + +void Scene1317::update() { + if (_smackerFileHash) { + _smackerPlayer->open(_smackerFileHash, _smackerFlag1); + _smackerFileHash = 0; + } + Scene::update(); +} + +void Scene1317::upChooseKing() { + if (!_klaymanBlinks && _klaymanBlinkCountdown != 0 && (--_klaymanBlinkCountdown == 0)) + _klaymanBlinks = true; + + if (!_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) { + _smackerPlayer->rewind(); + } else if (_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) { + _smackerPlayer->rewind(); + _klaymanBlinks = false; + _klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; + } + + if (!_klaymanBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0)) + stNoDecisionYet(); + + if (_smackerFileHash) { + _smackerPlayer->open(_smackerFileHash, _smackerFlag1); + _smackerFileHash = 0; + } + + Scene::update(); + +} + +uint32 Scene1317::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + stChooseKing(); + break; + } + return messageResult; +} + +uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x >= 21 && param.asPoint().y >= 24 && + param.asPoint().x <= 261 && param.asPoint().y <= 280) { + stHoborgAsKing(); + } else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 && + param.asPoint().x <= 399 && param.asPoint().y <= 379) { + stKlaymanAsKing(); + } else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 && + param.asPoint().x <= 418 && param.asPoint().y <= 474) { + stKlaymanAsKing(); + } + break; + } + return messageResult; +} + +uint32 Scene1317::hmNoDecisionYet(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + stChooseKing(); + break; + } + return messageResult; +} + +uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + stEndMovie(); + break; + } + return messageResult; +} + +uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + _parentModule->sendMessage(0x1009, 0, this); + break; + } + return messageResult; +} + +uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + _parentModule->sendMessage(0x1009, 0, this); + break; + } + return messageResult; +} + +void Scene1317::stChooseKing() { + _mouseCursor->getSurface()->setVisible(true); + SetMessageHandler(&Scene1317::hmChooseKing); + SetUpdateHandler(&Scene1317::upChooseKing); + _smackerFileHash = 0x10982841; + _smackerFlag1 = true; + _decisionCountdown = 450; + _klaymanBlinks = false; + _klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; +} + +void Scene1317::stNoDecisionYet() { + _mouseCursor->getSurface()->setVisible(false); + SetMessageHandler(&Scene1317::hmNoDecisionYet); + SetUpdateHandler(&Scene1317::update); + _smackerFileHash = 0x20982841; + _smackerFlag1 = false; +} + +void Scene1317::stHoborgAsKing() { + _mouseCursor->getSurface()->setVisible(false); + SetMessageHandler(&Scene1317::hmHoborgAsKing); + SetUpdateHandler(&Scene1317::update); + _smackerFileHash = 0x40982841; + _smackerFlag1 = false; +} + +void Scene1317::stKlaymanAsKing() { + _mouseCursor->getSurface()->setVisible(false); + SetMessageHandler(&Scene1317::hmKlaymanAsKing); + SetUpdateHandler(&Scene1317::update); + _smackerFileHash = 0x80982841; + _smackerFlag1 = false; +} + +void Scene1317::stEndMovie() { + _mouseCursor->getSurface()->setVisible(false); + SetMessageHandler(&Scene1317::hmEndMovie); + SetUpdateHandler(&Scene1317::update); + _smackerFileHash = 0x40800711; + _smackerFlag1 = false; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 8e142022cd..0e9837cc96 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -26,6 +26,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/smackerplayer.h" namespace Neverhood { @@ -322,6 +323,31 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene1317 : public Scene { +public: + Scene1317(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SmackerPlayer *_smackerPlayer; + bool _klaymanBlinks; + int _klaymanBlinkCountdown; + int _decisionCountdown; + uint32 _smackerFileHash; + bool _smackerFlag1; + void update(); + void upChooseKing(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmNoDecisionYet(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmKlaymanAsKing(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender); + void stChooseKing(); + void stNoDecisionYet(); + void stHoborgAsKing(); + void stKlaymanAsKing(); + void stEndMovie(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1300_H */ diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 39f49cb6e7..0ebec5ee9f 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -170,10 +170,9 @@ void SmackerPlayer::update() { _dirtyFlag = false; } +#if 0 if (!_smackerDecoder->endOfVideo()) { - updateFrame(); - if (_smackerDecoder->endOfVideo() && !_keepLastFrame) { // Inform the scene about the end of the video playback if (_scene) { @@ -187,8 +186,23 @@ void SmackerPlayer::update() { } _flag2 = false; } - } +#endif + + if (!_smackerDecoder->endOfVideo()) { + updateFrame(); + } else if (!_keepLastFrame) { + // Inform the scene about the end of the video playback + if (_scene) { + _scene->sendMessage(0x3002, 0, this); + } + _flag2 = true; + } else { + rewind(); + updateFrame(); + _flag2 = false; + } + } void SmackerPlayer::updateFrame() { diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index fb7f6daa96..883cb52245 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -59,6 +59,7 @@ public: uint32 getFrameNumber(); uint getStatus(); void setDrawPos(int16 x, int16 y); + void rewind(); protected: Scene *_scene; Palette *_palette; @@ -72,7 +73,6 @@ protected: bool _flag2; bool _dirtyFlag; int _drawX, _drawY; - void rewind(); void update(); void updateFrame(); void updatePalette(); -- cgit v1.2.3 From a21f9ef891d32487b0f6a57651aee2d8f7106a40 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 15 Sep 2011 14:38:42 +0000 Subject: NEVERHOOD: Add Scene1310 and Scene1311 --- engines/neverhood/module1300.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 7de50b11cb..04f4a2e8ed 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -215,9 +215,19 @@ void Module1300::createScene1309(int which) { } void Module1300::createScene1310(int which) { + _vm->gameState().sceneNum = 9; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createSmackerScene(0x20082818, true, true, false); + SetUpdateHandler(&Module1300::updateScene1310); } void Module1300::createScene1311(int which) { + _vm->gameState().sceneNum = 10; + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createSmackerScene(0x20082828, true, true, false); + SetUpdateHandler(&Module1300::updateScene1310); } void Module1300::createScene1312(int which) { @@ -269,6 +279,7 @@ void Module1300::createScene1317(int which) { } void Module1300::createScene1318(int which) { + // TODO: Credits scene } void Module1300::updateScene1302() { @@ -380,6 +391,17 @@ void Module1300::updateScene1309() { } void Module1300::updateScene1310() { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + if (_vm->gameState().sceneNum == 9) + createScene1315(0); + else + createScene1306(0); + _childObject->handleUpdate(); + } } void Module1300::updateScene1311() { -- cgit v1.2.3 From b757e22f881797f51fa1fb951dd78a88d3ae15d9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Sep 2011 12:23:26 +0000 Subject: NEVERHOOD: Multiple changes to make the game logic code cleaner (hopefully :) - Introduce Scene::insertStaticSprite to create static sprites instead of the old "addSprite(new StaticSprite" (not used everywhere yet) - Introduce macro InsertKlayman to create the Klayman object - Change sendMessage semantics from "receiver->sendMessage(num,arg,sender)" to "sendMessage(receiver,num,arg)", the sender is always the sending object ("this") - Similar changes using macros will follow - And fixed a bug in the elevator --- engines/neverhood/collisionman.cpp | 2 +- engines/neverhood/diskplayerscene.cpp | 6 +- engines/neverhood/entity.h | 19 +-- engines/neverhood/gamemodule.cpp | 16 +-- engines/neverhood/klayman.cpp | 192 +++++++++++++-------------- engines/neverhood/klayman.h | 9 +- engines/neverhood/module.cpp | 4 +- engines/neverhood/module1000.cpp | 241 +++++++++++++--------------------- engines/neverhood/module1200.cpp | 46 +++---- engines/neverhood/module1300.cpp | 165 +++++++++++------------ engines/neverhood/module1400.cpp | 126 +++++++++--------- engines/neverhood/module1500.cpp | 8 +- engines/neverhood/module1700.cpp | 24 ++-- engines/neverhood/module1800.cpp | 8 +- engines/neverhood/module2000.cpp | 18 +-- engines/neverhood/module2200.cpp | 174 ++++++++++++------------ engines/neverhood/module2300.cpp | 32 +---- engines/neverhood/module3000.cpp | 40 +++--- engines/neverhood/navigationscene.cpp | 20 +-- engines/neverhood/scene.cpp | 52 +++++--- engines/neverhood/scene.h | 5 + engines/neverhood/smackerplayer.cpp | 4 +- engines/neverhood/smackerscene.cpp | 6 +- engines/neverhood/sprite.cpp | 6 +- 24 files changed, 587 insertions(+), 636 deletions(-) diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index 4296b91a10..a1314bfe0f 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -98,7 +98,7 @@ void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, for (Common::Array::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) { Sprite *collSprite = *iter; if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getRect())) { - collSprite->sendMessage(messageNum, messageParam, sprite); + sprite->sendMessage(collSprite, messageNum, messageParam); } } } diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index dd2c837dbd..3eeef9204d 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -225,10 +225,10 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p case 0x1011: if (!_diskplayerScene->getFlag3()) { if (_isPlaying) { - _diskplayerScene->sendMessage(0x2001, 0, this); + sendMessage(_diskplayerScene, 0x2001, 0); release(); } else { - _diskplayerScene->sendMessage(0x2000, 0, this); + sendMessage(_diskplayerScene, 0x2000, 0); press(); } } @@ -500,7 +500,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, case 0x0001: // TODO: Debug/Cheat if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else if (!_flag3 && param.asPoint().x > 38 && param.asPoint().x < 598 && param.asPoint().y > 400 && param.asPoint().y < 460) { diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index e49aa94e08..582e93f77f 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -96,20 +96,23 @@ public: (this->*_updateHandlerCb)(); } bool hasMessageHandler() const { return _messageHandlerCb != NULL; } - uint32 sendMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug(2, "sendMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); + uint32 receiveMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; } // NOTE: These were overloaded before for the various message parameter types // it caused some problems so each type gets its own sendMessage variant now - uint32 sendMessage(int messageNum, uint32 param, Entity *sender) { - return sendMessage(messageNum, MessageParam(param), sender); + uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam ¶m) { + return receiver->receiveMessage(messageNum, param, this); } - uint32 sendPointMessage(int messageNum, const NPoint ¶m, Entity *sender) { - return sendMessage(messageNum, MessageParam(param), sender); + uint32 sendMessage(Entity *receiver, int messageNum, uint32 param) { + return receiver->receiveMessage(messageNum, MessageParam(param), this); } - uint32 sendEntityMessage(int messageNum, Entity *param, Entity *sender) { - return sendMessage(messageNum, MessageParam((Entity*)param), sender); + uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint ¶m) { + return receiver->receiveMessage(messageNum, MessageParam(param), this); + } + uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param) { + return receiver->receiveMessage(messageNum, MessageParam((Entity*)param), this); } int getPriority() const { return _priority; } // Shortcuts for game variable access diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index fc2ca8ed03..650287b473 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -71,7 +71,7 @@ void GameModule::handleMouseMove(int16 x, int16 y) { mousePos.x = x; mousePos.y = y; debug(2, "GameModule::handleMouseMove(%d, %d)", x, y); - _childObject->sendPointMessage(0, mousePos, this); + sendPointMessage(_childObject, 0, mousePos); } } @@ -81,7 +81,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) { mousePos.x = x; mousePos.y = y; debug(2, "GameModule::handleMouseDown(%d, %d)", x, y); - _childObject->sendPointMessage(1, mousePos, this); + sendPointMessage(_childObject, 1, mousePos); } } @@ -267,9 +267,9 @@ void GameModule::startup() { //createModule1700(-1); //createModule1700(1); //createModule1400(-1); -#if 0 - _vm->gameState().sceneNum = 10; - createModule3000(-1); +#if 1 + _vm->gameState().sceneNum = 1; + createModule1000(-1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -280,11 +280,11 @@ void GameModule::startup() { createModule2000(-1); #endif #if 0 - _vm->gameState().sceneNum = 46; + _vm->gameState().sceneNum = 0; createModule2200(-1); #endif -#if 1 - _vm->gameState().sceneNum = 16; +#if 0 + _vm->gameState().sceneNum = 5; createModule1300(-1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 26f9d1afae..e0ca57ceca 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -57,7 +57,7 @@ static const KlaymanTableItem klaymanTable4[] = { // Klayman -Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority) +Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), _counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false), @@ -360,7 +360,7 @@ uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0xC1380080) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x4806, 0, this); + sendMessage(_attachedSprite, 0x4806, 0); _soundResource1.play(0xC8004340); } } else if (param.asInteger() == 0x02B20220) { @@ -499,7 +499,7 @@ void Klayman::sub41C7B0() { removeCallbackList(); #endif } else { - _parentScene->sendMessage(0x1006, 0, this); + sendMessage(_parentScene, 0x1006, 0); } } @@ -975,15 +975,15 @@ void Klayman::spriteUpdate41F320() { _deltaX = 0; if (xdiff == 0) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } else if (_status3 == 3 && xdiff < 30) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } else if (_status3 == 3 && xdiff < 150 && _frameIndex >= 6) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdelta; @@ -1026,9 +1026,9 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } break; } @@ -1053,7 +1053,7 @@ uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0xC1380080) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x4806, 0, this); + sendMessage(_attachedSprite, 0x4806, 0); } _soundResource1.play(0x40208200); } else if (param.asInteger() == 0x02B20220) { @@ -1090,7 +1090,7 @@ uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0x0D01B294) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x480B, 0, this); + sendMessage(_attachedSprite, 0x480B, 0); } } else if (param.asInteger() == 0x32180101) { _soundResource1.play(0x4924AAC4); @@ -1375,7 +1375,7 @@ void Klayman::sub4201C0() { SetMessageHandler(&Klayman::handleMessage41D790); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetAnimationCallback3(&Klayman::sub420340); - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1384,15 +1384,15 @@ uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0x168050A0) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x4806, 0, this); + sendMessage(_attachedSprite, 0x4806, 0); } _flagE5 = true; } else if (param.asInteger() == 0x320AC306) { _soundResource1.play(0x5860C640); } else if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } break; } @@ -1430,7 +1430,7 @@ void Klayman::sub420290() { SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D880); SetAnimationCallback3(&Klayman::sub420380); - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } } @@ -1440,14 +1440,14 @@ uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0x168050A0) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x4806, 0, this); + sendMessage(_attachedSprite, 0x4806, 0); } } else if (param.asInteger() == 0x320AC306) { _soundResource1.play(0x5860C640); } else if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } break; } @@ -1475,7 +1475,7 @@ void Klayman::sub4203C0() { _status2 = 1; _flagE5 = false; if (_attachedSprite) { - _attachedSprite->sendMessage(0x4807, 0, this); + sendMessage(_attachedSprite, 0x4807, 0); _attachedSprite = NULL; } setFileHash(0xB869A4B9, 0, -1); @@ -1597,11 +1597,11 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, E } if (_statusE0 == 1) { if (_y4 >= _y - 30) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } } else { if (_y4 <= _y) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } } } @@ -1651,9 +1651,9 @@ uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x80C110B5) { - _parentScene->sendMessage(0x482A, 0, this); + sendMessage(_parentScene, 0x482A, 0); } else if (param.asInteger() == 0x110010D1) { - _parentScene->sendMessage(0x482B, 0, this); + sendMessage(_parentScene, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { if (_soundFlag) { _soundResource1.play(0x48498E46); @@ -1795,7 +1795,7 @@ void Klayman::sub420F20() { void Klayman::spriteUpdate41F5A0() { if (!_flagF8 && ABS(_x4 - _x) < 80) { - _parentScene->sendMessage(0x4829, 0, this); + sendMessage(_parentScene, 0x4829, 0); _flagF8 = true; } AnimatedSprite::updateDeltaXY(); @@ -1812,7 +1812,7 @@ void Klayman::sub420600() { } void Klayman::sub420660() { - _attachedSprite->sendMessage(0x4807, 0, this); + sendMessage(_attachedSprite, 0x4807, 0); } uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1820,9 +1820,9 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0x01084280) { if (_attachedSprite) - _attachedSprite->sendMessage(0x480B, _doDeltaX ? 1 : 0, this); + sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); } else if (param.asInteger() == 0x02421405) { - if (_flagE4 && _attachedSprite->hasMessageHandler() && _attachedSprite->sendMessage(0x480C, _doDeltaX ? 1 : 0, this) != 0) { + if (_flagE4 && _attachedSprite->hasMessageHandler() && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { sub4205C0(); } else { setCallback1(AnimationCallback(&Klayman::sub420660)); @@ -1869,7 +1869,7 @@ void Klayman::sub420C50() { if (_flagF7) { sub420D50(); } else { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); setFileHash(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); @@ -1882,7 +1882,7 @@ void Klayman::sub420C50() { void Klayman::sub420CD0() { setFileHash(0x0D318140, 0, -1); - _attachedSprite->sendMessage(0x480F, 0, this); + sendMessage(_attachedSprite, 0x480F, 0); SetAnimationCallback3(&Klayman::sub420D10); } @@ -1900,14 +1900,14 @@ void Klayman::sub420D50() { SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); - _attachedSprite->sendMessage(0x4807, 0, this); + sendMessage(_attachedSprite, 0x4807, 0); SetAnimationCallback3(&Klayman::sub420DA0); _flagE5 = false; } void Klayman::sub420DA0() { setFileHash(0x0D318140, 0, -1); - _attachedSprite->sendMessage(0x480F, 0, this); + sendMessage(_attachedSprite, 0x480F, 0); SetAnimationCallback3(&Klayman::sub420DE0); } @@ -1927,7 +1927,7 @@ void Klayman::sub420E20() { SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); - _attachedSprite->sendMessage(0x4807, 0, this); + sendMessage(_attachedSprite, 0x4807, 0); SetAnimationCallback3(&Klayman::sub420E90); _flagE5 = false; _flagF7 = false; @@ -1942,7 +1942,7 @@ void Klayman::sub420E90() { } void Klayman::sub420EB0() { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } void Klayman::sub420680() { @@ -2002,7 +2002,7 @@ uint32 Klayman::handleMessage41DD20(int messageNum, const MessageParam ¶m, E case 0x100D: if (param.asInteger() == 0x040D4186) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x4808, 0, this); + sendMessage(_attachedSprite, 0x4808, 0); } } break; @@ -2078,7 +2078,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4836: if (param.asInteger() == 1) { - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); setCallback2(AnimationCallback(&Klayman::sub4211F0)); } break; @@ -2108,7 +2108,7 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x480F, 0, this); + sendMessage(_attachedSprite, 0x480F, 0); } break; } @@ -2117,8 +2117,8 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶ // KmScene1002 -KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _class599(class599), _ssLadderArch(ssLadderArch), _otherSprite(NULL), +KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _status(0) { setKlaymanTable1(); @@ -2197,21 +2197,21 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41CCE0(param.asInteger()); break; case 0x4820: - _parentScene->sendMessage(0x2005, 0, this); + sendMessage(_parentScene, 0x2005, 0); setCallback2(AnimationCallback(&Klayman::sub420970)); break; case 0x4821: - _parentScene->sendMessage(0x2005, 0, this); + sendMessage(_parentScene, 0x2005, 0); _y4 = param.asInteger(); setCallback2(AnimationCallback(&Klayman::sub4209D0)); break; case 0x4822: - _parentScene->sendMessage(0x2005, 0, this); + sendMessage(_parentScene, 0x2005, 0); _y4 = param.asInteger(); setCallback2(AnimationCallback(&Klayman::sub420AD0)); break; case 0x4823: - _parentScene->sendMessage(0x2006, 0, this); + sendMessage(_parentScene, 0x2006, 0); setCallback2(AnimationCallback(&Klayman::sub420BC0)); break; case 0x482E: @@ -2252,19 +2252,19 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶ case 0x100D: if (param.asInteger() == 0x168050A0) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x480F, 0, this); + sendMessage(_attachedSprite, 0x480F, 0); } } else if (param.asInteger() == 0x586B0300) { if (_otherSprite) { - _otherSprite->sendMessage(0x480E, 1, this); + sendMessage(_otherSprite, 0x480E, 1); } } else if (param.asInteger() == 0x4AB28209) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } } else if (param.asInteger() == 0x88001184) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } } break; @@ -2301,12 +2301,12 @@ uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶ case 0x100D: if (param.asInteger() == 0x942D2081) { _flagE5 = false; - _attachedSprite->sendMessage(0x2003, 0, this); + sendMessage(_attachedSprite, 0x2003, 0); } else if (param.asInteger() == 0xDA600012) { sub44A370(); } else if (param.asInteger() == 0x0D01B294) { _flagE5 = false; - _attachedSprite->sendMessage(0x480B, 0, this); + sendMessage(_attachedSprite, 0x480B, 0); } break; } @@ -2318,12 +2318,12 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶ case 0x100D: if (param.asInteger() == 0x01084280) { if (_attachedSprite) { - _attachedSprite->sendMessage(0x480B, (uint32)_doDeltaX, this); + sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX); } } else if (param.asInteger() == 0x02421405) { if (_flagE4) { if (_attachedSprite) { - if (_attachedSprite->sendMessage(0x480C, (uint32)_doDeltaX, this) != 0) { + if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) { sub44A460(); } } @@ -2331,9 +2331,9 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶ SetMessageHandler(&KmScene1002::handleMessage449BA0); } } else if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { _soundResource1.play(0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { @@ -2352,9 +2352,9 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { _soundResource1.play(0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { @@ -2407,7 +2407,7 @@ void KmScene1002::spriteUpdate449DC0() { if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; processDelta(); - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } _vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0); } @@ -2421,7 +2421,7 @@ void KmScene1002::sub449E20() { SetSpriteCallback(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1002::handleMessage449800); SetAnimationCallback3(&Klayman::sub420420); - _attachedSprite->sendMessage(0x482B, 0, this); + sendMessage(_attachedSprite, 0x482B, 0); } } @@ -2449,12 +2449,12 @@ void KmScene1002::sub449EF0() { SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); SetAnimationCallback3(&KmScene1002::sub449F70); - _class599->sendMessage(0x482A, 0, this); - _ssLadderArch->sendMessage(0x482A, 0, this); + sendMessage(_class599, 0x482A, 0); + sendMessage(_ssLadderArch, 0x482A, 0); } void KmScene1002::sub449F70() { - _parentScene->sendMessage(0x1024, 1, this); + sendMessage(_parentScene, 0x1024, 1); _soundResource1.play(0x41648271); _status2 = 1; _flagE5 = false; @@ -2464,11 +2464,11 @@ void KmScene1002::sub449F70() { SetSpriteCallback(NULL); SetMessageHandler(&KmScene1002::handleMessage41D480); SetAnimationCallback3(&KmScene1002::sub44A230); - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; - _class599->sendMessage(0x482B, 0, this); - _ssLadderArch->sendMessage(0x482B, 0, this); + sendMessage(_class599, 0x482B, 0); + sendMessage(_ssLadderArch, 0x482B, 0); } void KmScene1002::sub44A050() { @@ -2480,8 +2480,8 @@ void KmScene1002::sub44A050() { SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); SetMessageHandler(&Klayman::handleMessage41D480); SetAnimationCallback3(&KmScene1002::sub449F70); - _class599->sendMessage(0x482A, 0, this); - _ssLadderArch->sendMessage(0x482A, 0, this); + sendMessage(_class599, 0x482A, 0); + sendMessage(_ssLadderArch, 0x482A, 0); } void KmScene1002::sub44A0D0() { @@ -2493,12 +2493,12 @@ void KmScene1002::sub44A0D0() { SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); SetAnimationCallback3(&KmScene1002::sub44A150); - _class599->sendMessage(0x482A, 0, this); - _ssLadderArch->sendMessage(0x482A, 0, this); + sendMessage(_class599, 0x482A, 0); + sendMessage(_ssLadderArch, 0x482A, 0); } void KmScene1002::sub44A150() { - _parentScene->sendMessage(0x1024, 1, this); + sendMessage(_parentScene, 0x1024, 1); _soundResource1.play(0x41648271); _status2 = 1; _flagE5 = false; @@ -2508,11 +2508,11 @@ void KmScene1002::sub44A150() { SetMessageHandler(&KmScene1002::handleMessage41D480); SetSpriteCallback(NULL); SetAnimationCallback3(&KmScene1002::sub44A230); - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; - _class599->sendMessage(0x482B, 0, this); - _ssLadderArch->sendMessage(0x482B, 0, this); + sendMessage(_class599, 0x482B, 0); + sendMessage(_ssLadderArch, 0x482B, 0); } void KmScene1002::sub44A230() { @@ -2522,7 +2522,7 @@ void KmScene1002::sub44A230() { void KmScene1002::sub44A250() { if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) { - _parentScene->sendMessage(0x1024, 3, this); + sendMessage(_parentScene, 0x1024, 3); _status2 = 2; _flagE5 = false; setFileHash(0xB93AB151, 0, -1); @@ -2536,7 +2536,7 @@ void KmScene1002::sub44A250() { void KmScene1002::sub44A2C0() { if (_attachedSprite) { _x = ((Sprite*)_attachedSprite)->getX(); - _attachedSprite->sendMessage(0x4807, 0, this); + sendMessage(_attachedSprite, 0x4807, 0); _attachedSprite = NULL; } _status2 = 2; @@ -2569,7 +2569,7 @@ void KmScene1002::sub44A370() { } void KmScene1002::sub44A3C0() { - _parentScene->sendMessage(0x1024, 1, this); + sendMessage(_parentScene, 0x1024, 1); } void KmScene1002::sub44A3E0() { @@ -2597,7 +2597,7 @@ void KmScene1002::sub44A460() { } void KmScene1002::sub44A4B0() { - _attachedSprite->sendMessage(0x482A, 0, this); + sendMessage(_attachedSprite, 0x482A, 0); } // KmScene1004 @@ -2628,30 +2628,30 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&KmScene1004::sub478170)); break; case 0x4820: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); setCallback2(AnimationCallback(&Klayman::sub420970)); break; case 0x4821: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _y4 = param.asInteger(); setCallback2(AnimationCallback(&Klayman::sub4209D0)); break; case 0x4822: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _y4 = param.asInteger(); setCallback2(AnimationCallback(&Klayman::sub420AD0)); break; case 0x4823: - _parentScene->sendMessage(0x2001, 0, this); + sendMessage(_parentScene, 0x2001, 0); setCallback2(AnimationCallback(&Klayman::sub420BC0)); break; case 0x4824: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _y4 = _dataResource.getPoint(param.asInteger()).y; setCallback2(AnimationCallback(&Klayman::sub4209D0)); break; case 0x4825: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _y4 = _dataResource.getPoint(param.asInteger()).y; setCallback2(AnimationCallback(&Klayman::sub420AD0)); break; @@ -2674,7 +2674,7 @@ uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam ¶ case 0x100D: if (param.asInteger() == 0x04684052) { _flagE5 = true; - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); } break; } @@ -2818,7 +2818,7 @@ uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam ¶ if (param.asInteger() == 0x01084280) { _soundResource1.play(0x405002D8); if (_attachedSprite) { - _attachedSprite->sendMessage(0x480B, 0, this); + sendMessage(_attachedSprite, 0x480B, 0); } } else if (param.asInteger() == 0x02421405) { if (_countdown != 0) { @@ -2876,7 +2876,7 @@ void KmScene1201::sub40DFA0() { SetSpriteCallback(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::handleMessage40DEA0); SetAnimationCallback3(&Klayman::sub41FC80); - _class464->sendMessage(0x2006, 0, this); + sendMessage(_class464, 0x2006, 0); _soundResource1.play(0x62E0A356); } } @@ -2918,7 +2918,7 @@ uint32 KmScene1303::handleMessage4160A0(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == calcHash("PopBalloon")) { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); } else if (param.asInteger() == 0x02B20220) { _soundResource1.play(0xC5408620); } else if (param.asInteger() == 0x0A720138) { @@ -3175,12 +3175,12 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&Klayman::sub421160)); break; case 0x4835: - _parentScene->sendMessage(0x2000, 1, this); + sendMessage(_parentScene, 0x2000, 1); _flag1 = true; setCallback2(AnimationCallback(&Klayman::sub4212C0)); break; case 0x4836: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _flag1 = false; setCallback2(AnimationCallback(&Klayman::sub421310)); break; @@ -3702,12 +3702,12 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&Klayman::sub421160)); break; case 0x4835: - _parentScene->sendMessage(0x2000, 1, this); + sendMessage(_parentScene, 0x2000, 1); _flag = true; setCallback2(AnimationCallback(&Klayman::sub4212C0)); break; case 0x4836: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _flag = false; setCallback2(AnimationCallback(&Klayman::sub421310)); break; @@ -3741,7 +3741,7 @@ void KmScene1705::spriteUpdate468A30() { if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; processDelta(); - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } } @@ -3821,12 +3821,12 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { setCallback2(AnimationCallback(&Klayman::sub421160)); break; case 0x4835: - _parentScene->sendMessage(0x2000, 1, this); + sendMessage(_parentScene, 0x2000, 1); _flag = true; setCallback2(AnimationCallback(&Klayman::sub4212C0)); break; case 0x4836: - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _flag = false; setCallback2(AnimationCallback(&Klayman::sub421310)); break; @@ -4189,14 +4189,14 @@ void KmScene2206::spriteUpdate482450() { _yDelta++; _y += _yDelta; if (_y > 600) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } } void KmScene2206::sub482490() { if (!sub41CF10(AnimationCallback(&KmScene2206::sub482490))) { _status2 = 1; - _parentScene->sendMessage(0x4803, 0, this); + sendMessage(_parentScene, 0x4803, 0); _flagE5 = false; _yDelta = 0; setFileHash(0x5420E254, 0, -1); @@ -4322,7 +4322,7 @@ void KmScene2207::sub4424B0() { void KmScene2207::sub442520() { setFileHash(0x0D318140, 0, -1); SetAnimationCallback3(&KmScene2207::sub442560); - _attachedSprite->sendMessage(0x480F, 0, this); + sendMessage(_attachedSprite, 0x480F, 0); } void KmScene2207::sub442560() { diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a5381c8dd1..23bd110568 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -41,7 +41,8 @@ struct KlaymanTableItem { class Klayman : public AnimatedSprite { public: - Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000); + Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); + void init() { } void update(); @@ -259,7 +260,11 @@ protected: class KmScene1002 : public Klayman { public: - KmScene1002(NeverhoodEngine *vm, Entity *parentScene, Sprite *class599, Sprite *ssLadderArch, int16 x, int16 y); + KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + void init(Sprite *class599, Sprite *ssLadderArch) { + _class599 = class599; + _ssLadderArch = ssLadderArch; + } protected: Sprite *_class599; Sprite *_ssLadderArch; diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index edf67c7ea3..c38b96e199 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -47,7 +47,7 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * switch (messageNum) { case 0x0008: if (_parentModule) - _parentModule->sendMessage(8, 0, this); + sendMessage(_parentModule, 8, 0); return 0; case 0x1009: _field24 = -1; @@ -67,7 +67,7 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * return 0; default: if (_childObject && sender == _parentModule) - return _childObject->sendMessage(messageNum, param, sender); + return sender->sendMessage(_childObject, messageNum, param); } return 0; } diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 5e1ae6fde3..011ea9e1de 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -67,7 +67,6 @@ Module1000::~Module1000() { void Module1000::createScene1001(int which) { _vm->gameState().sceneNum = 0; _childObject = new Scene1001(_vm, this, which); - // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3); // TODO Music18hList_play(0x061880C6, 0, 0, 1); SetUpdateHandler(&Module1000::updateScene1001); } @@ -75,7 +74,6 @@ void Module1000::createScene1001(int which) { void Module1000::createScene1002(int which) { _vm->gameState().sceneNum = 1; _childObject = new Scene1002(_vm, this, which); - // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); // TODO Music18hList_play(0x061880C6, 0, 0, 1); SetUpdateHandler(&Module1000::updateScene1002); } @@ -91,7 +89,6 @@ void Module1000::createScene1004(int which) { _vm->gameState().sceneNum = 3; _childObject = new Scene1004(_vm, this, which); SetUpdateHandler(&Module1000::updateScene1004); - // TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1); // TODO Music18hList_stop(0x061880C6, 0, 2); } @@ -106,7 +103,6 @@ void Module1000::createScene1005(int which) { void Module1000::updateScene1001() { _childObject->handleUpdate(); if (_done) { - debug("SCENE 1001 DONE; _field20 = %d", _field20); _done = false; delete _childObject; _childObject = NULL; @@ -118,30 +114,16 @@ void Module1000::updateScene1001() { _childObject->handleUpdate(); } } - if (_field24 >= 0) { - if (_field24 == 2) { - // TODO ResourceTable_multiLoad(&_resourceTable2, &_resourceTable1, &_resourceTable3); - _field24 = -1; - } else { - // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable1); - _field24 = -1; - } - } - if (_field26 >= 0) { - // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable2, &_resourceTable3); - _field26 = -1; - } } void Module1000::updateScene1002() { _childObject->handleUpdate(); if (_done) { - debug("SCENE 1002 DONE; _field20 = %d", _field20); _done = false; delete _childObject; _childObject = NULL; if (_field20 == 1) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else if (_field20 == 2) { createScene1004(0); _childObject->handleUpdate(); @@ -150,27 +132,6 @@ void Module1000::updateScene1002() { _childObject->handleUpdate(); } } - if (_field24 >= 0) { - if (_field24 == 1) { - _parentModule->sendMessage(0x100A, 0, this); - } else if (_field24 == 2) { - // TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1); - } else { - // TODO ResourceTable_multiLoad(&_resourceTable1, &_resourceTable3); - } - _field24 = -1; - } - if (_field26 >= 0) { - if (_field26 == 1) { - _parentModule->sendMessage(0x1023, 0, this); - } else { - // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); - } - _field26 = -1; - } - if (_field28 >= 0) { - _field28 = -1; - } } void Module1000::updateScene1003() { @@ -187,7 +148,6 @@ void Module1000::updateScene1003() { void Module1000::updateScene1004() { _childObject->handleUpdate(); if (_done) { - debug("SCENE 1004 DONE; _field20 = %d", _field20); _done = false; delete _childObject; _childObject = NULL; @@ -199,22 +159,11 @@ void Module1000::updateScene1004() { _childObject->handleUpdate(); } } - if (_field24 >= 0) { - if (_field24 == 0) { - // TODO ResourceTable_multiLoad(&_resourceTable3, &_resourceTable4, &_resourceTable1); - } - _field24 = -1; - } - if (_field26 >= 0) { - // TODO ResourceTable_multiLoad(&_resourceTable4, &_resourceTable3, &_resourceTable1); - _field26 = -1; - } } void Module1000::updateScene1005() { _childObject->handleUpdate(); if (_done) { - debug("SCENE 1005 DONE"); // TODO Music18hList_stop(_musicFileHash, 0, 1); _done = false; delete _childObject; @@ -323,7 +272,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ case 0x100D: if (param.asInteger() == 0x00352100) { if (_asDoor) { - _asDoor->sendMessage(0x2000, 0, this); + sendMessage(_asDoor, 0x2000, 0); } } else if (param.asInteger() == 0x0A1A0109) { _soundResource.play(0x66410886); @@ -388,13 +337,13 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m switch (messageNum) { case 0x100D: if (param.asInteger() == 0x00C0C444) { - _parentScene->sendMessage(0x480F, 0, this); + sendMessage(_parentScene, 0x480F, 0); } else if (param.asInteger() == 0xC41A02C0) { _soundResource.play(0x40581882); } break; case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x3002: @@ -405,10 +354,10 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m setFileHash(0x04A98C36, 0, -1); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -434,7 +383,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x480B: - _parentScene->sendMessage(0x480B, 0, this); + sendMessage(_parentScene, 0x480B, 0); _surface->setVisible(true); _countdown = 8; _soundResource.play(_soundFileHash); @@ -483,7 +432,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } addSprite(_klayman); - tempSprite = addSprite(new StaticSprite(_vm, 0x2080A3A8, 1300)); + tempSprite = insertStaticSprite(0x2080A3A8, 1300); // TODO: This sucks somehow, find a better way _klayman->getSurface()->getClipRect().x1 = 0; @@ -503,13 +452,13 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1)); - addSprite(new StaticSprite(_vm, 0x809861A6, 950)); - addSprite(new StaticSprite(_vm, 0x89C03848, 1100)); + insertStaticSprite(0x809861A6, 950); + insertStaticSprite(0x89C03848, 1100); _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0)); if (getGlobalVar(0x03C698DA) == 0) { - tempSprite = addSprite(new StaticSprite(_vm, 0x8C066150, 200)); + tempSprite = insertStaticSprite(0x8C066150, 200); _asWindow = addSprite(new AsScene1001Window(_vm)); _asWindow->getSurface()->getClipRect().x1 = tempSprite->getSurface()->getDrawRect().x; _asWindow->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; @@ -534,18 +483,18 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x000D: if (param.asInteger() == 0x188B2105) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); messageResult = 1; } break; case 0x100D: if (param.asInteger() == 0x00342624) { - _klayman->sendMessage(0x1014, _asLever, this); + sendEntityMessage(_klayman, 0x1014, _asLever); setMessageList2(0x004B4910); messageResult = 1; } else if (param.asInteger() == 0x21E64A00) { @@ -556,7 +505,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit } messageResult = 1; } else if (param.asInteger() == 0x040424D0) { - _klayman->sendMessage(0x1014, _ssButton, this); + sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x80006358) { if (getGlobalVar(0x03C698DA)) { setMessageList(0x004B4938); @@ -570,12 +519,12 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (_asWindow) { - _asWindow->sendMessage(0x2001, 0, this); + sendMessage(_asWindow, 0x2001, 0); } break; case 0x480F: if (_asHammer) { - _asHammer->sendMessage(0x2000, 0, this); + sendMessage(_asHammer, 0x2000, 0); } break; } @@ -594,10 +543,10 @@ uint32 SsScene1002LadderArch::handleMessage(int messageNum, const MessageParam & uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x482A: - _parentScene->sendMessage(0x1022, 995, this); + sendMessage(_parentScene, 0x1022, 995); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1015, this); + sendMessage(_parentScene, 0x1022, 1015); break; } return messageResult; @@ -613,10 +562,10 @@ uint32 Class599::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x482A: - _parentScene->sendMessage(0x1022, 995, this); + sendMessage(_parentScene, 0x1022, 995); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1015, this); + sendMessage(_parentScene, 0x1022, 1015); break; } return messageResult; @@ -666,7 +615,7 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam & switch (messageNum) { case 0x4806: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - _parentScene->sendMessage(0x4806, 0, this); + sendMessage(_parentScene, 0x4806, 0); SetMessageHandler(&AsScene1002Ring::handleMessage447760); if (_flag1) { setFileHash(0x87502558, 0, -1); @@ -676,15 +625,15 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam & break; case 0x480F: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - _parentScene->sendMessage(0x480F, 0, this); + sendMessage(_parentScene, 0x480F, 0); SetMessageHandler(&AsScene1002Ring::handleMessage447890); setFileHash(0x861A2020, 0, -1); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -703,16 +652,16 @@ uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam & } break; case 0x4807: - _parentScene->sendMessage(0x4807, 0, this); + sendMessage(_parentScene, 0x4807, 0); setDoDeltaX(_vm->_rnd->getRandomNumber(1)); setFileHash(0x8258A030, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447A00); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -726,10 +675,10 @@ uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam & SetMessageHandler(&AsScene1002Ring::handleMessage447930); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -739,16 +688,16 @@ uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam & uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4807: - _parentScene->sendMessage(0x4807, 0, this); + sendMessage(_parentScene, 0x4807, 0); setDoDeltaX(_vm->_rnd->getRandomNumber(1)); setFileHash(0x8258A030, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447A00); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -766,10 +715,10 @@ uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam & setFileHash(0xA85C4011, 0, -1); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -891,7 +840,7 @@ uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessagePara switch (messageNum) { case 0x100D: if (param.asInteger() == 0xA61CA1C2) { - _class505->sendMessage(0x2004, 0, this); + sendMessage(_class505, 0x2004, 0); } else if (param.asInteger() == 0x14CE0620) { _soundResource.play(); } @@ -1025,7 +974,7 @@ uint32 Class426::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x480B: - _parentScene->sendMessage(0x480B, 0, this); + sendMessage(_parentScene, 0x480B, 0); _status = 1; _countdown = 4; _surface->setVisible(true); @@ -1098,12 +1047,12 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag case 0x1011: if (_flag) { if (_x >= 154 && _x <= 346) { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); messageResult = 1; } } else { if (_x >= 174 && _x <= 430) { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); messageResult = 1; } } @@ -1146,10 +1095,10 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag sub448780(); break; case 0x482A: - _parentScene->sendMessage(0x1022, 995, this); + sendMessage(_parentScene, 0x1022, 995); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1015, this); + sendMessage(_parentScene, 0x1022, 1015); break; } return messageResult; @@ -1174,14 +1123,14 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag } else if (param.asInteger() == 0x41881801) { if (_flag) { if (_x > 330) { - _klayman->sendMessage(0x4811, 2, this); + sendMessage(_klayman, 0x4811, 2); } else if (_x > 265) { - _klayman->sendMessage(0x4811, 0, this); + sendMessage(_klayman, 0x4811, 0); } else { - _klayman->sendMessage(0x4811, 0, this); + sendMessage(_klayman, 0x4811, 0); } } else { - _klayman->sendMessage(0x4811, 0, this); + sendMessage(_klayman, 0x4811, 0); } } else if (param.asInteger() == 0x522200A0) { _soundResource.play(0x931080C8); @@ -1191,10 +1140,10 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag removeCallbacks(); break; case 0x482A: - _parentScene->sendMessage(0x1022, 995, this); + sendMessage(_parentScene, 0x1022, 995); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1015, this); + sendMessage(_parentScene, 0x1022, 1015); break; } return messageResult; @@ -1216,7 +1165,7 @@ void AsScene1002VenusFlyTrap::sub448530() { } void AsScene1002VenusFlyTrap::sub448560() { - _parentScene->sendMessage(0x4807, 0, this); + sendMessage(_parentScene, 0x4807, 0); setFileHash(0x82292851, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); @@ -1287,7 +1236,7 @@ void AsScene1002VenusFlyTrap::sub448780() { } else { setDoDeltaX(_x > 320 ? 1 : 0); } - _klayman->sendMessage(0x2001, 0, this); + sendMessage(_klayman, 0x2001, 0); setFileHash(0x8C2C80D4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); @@ -1426,7 +1375,7 @@ uint32 Class479::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { - _parentScene->sendMessage(0x1022, 1200, this); + sendMessage(_parentScene, 0x1022, 1200); _flag1 = true; _savedClipRect = _surface->getClipRect(); _surface->getClipRect().x1 = 0; @@ -1434,7 +1383,7 @@ uint32 Class479::handleMessage(int messageNum, const MessageParam ¶m, Entity _surface->getClipRect().x2 = 640; _surface->getClipRect().y2 = 480; } else if (param.asInteger() == 0x88001184) { - _parentScene->sendMessage(0x1022, 1000, this); + sendMessage(_parentScene, 0x1022, 1000); if (_flag1) { _surface->getClipRect() = _savedClipRect; } @@ -1464,19 +1413,19 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _flag = false; - addSprite(new StaticSprite(_vm, 0x06149428, 1100)); - addSprite(new StaticSprite(_vm, 0x312C8774, 1100)); + insertStaticSprite(0x06149428, 1100); + insertStaticSprite(0x312C8774, 1100); _ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this)); - _ssLadderArchPart1 = addSprite(new StaticSprite(_vm, 0x060000A0, 1200)); - _ssLadderArchPart2 = addSprite(new StaticSprite(_vm, 0xB2A423B0, 1100)); - _ssLadderArchPart3 = addSprite(new StaticSprite(_vm, 0x316E0772, 1100)); + _ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200); + _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); + _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); _class599 = addSprite(new Class599(_vm, this)); if (which < 0) { if (_vm->_gameState.field2 == 0) { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); + InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); _klayman->getSurface()->getClipRect().x1 = 31; @@ -1486,7 +1435,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 379, 435); + InsertKlayman(KmScene1002, 379, 435, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; @@ -1496,7 +1445,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); } } else if (which == 1) { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 650, 435); + InsertKlayman(KmScene1002, 650, 435, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; @@ -1506,7 +1455,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _vm->_gameState.field2 = 1; } else if (which == 2) { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 68, 645); + InsertKlayman(KmScene1002, 68, 645, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4298); _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; @@ -1515,9 +1464,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _vm->_gameState.field2 = 1; - _klayman->sendMessage(0x4820, 0, this); + sendMessage(_klayman, 0x4820, 0); } else { - _klayman = new KmScene1002(_vm, this, _class599, _ssLadderArch, 90, 226); + InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4470); _klayman->getSurface()->getClipRect().x1 = 31; @@ -1531,11 +1480,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_gameState.field2 = 0; } - addSprite(_klayman); - _mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL)); - tempSprite = addSprite(new StaticSprite(_vm, 0xB3242310, 825)); + tempSprite = insertStaticSprite(0xB3242310, 825); tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x; tempClipRect.y1 = tempSprite->getSurface()->getDrawRect().y; tempClipRect.x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; @@ -1558,7 +1505,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asVenusFlyTrap); - _klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this); + sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); _class506 = addSprite(new Class506(_vm)); @@ -1587,7 +1534,7 @@ void Scene1002::update() { } if (_flag1BE && _klayman->getY() > 422) { - _parentModule->sendMessage(0x1024, 1, this); + sendMessage(_parentModule, 0x1024, 1); _flag1BE = false; } @@ -1602,14 +1549,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { setGlobalVar(0x8306F218, 1); setGlobalVar(0x1B144052, 3); - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } break; case 0x000D: if (param.asInteger() == 0x48848178) { setGlobalVar(0x8306F218, 1); setGlobalVar(0x1B144052, 3); - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } messageResult = 1; break; @@ -1624,15 +1571,15 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit messageResult = 1; } else if (param.asInteger() == 0x4A845A00) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _asRing1, this); + sendEntityMessage(_klayman, 0x1014, _asRing1); } else if (param.asInteger() == 0x43807801) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _asRing2, this); + sendEntityMessage(_klayman, 0x1014, _asRing2); } else if (param.asInteger() == 0x46C26A01) { if (getGlobalVar(0x8306F218)) { setMessageList(0x004B44B8); } else { - _klayman->sendEntityMessage(0x1014, _asRing3, this); + sendEntityMessage(_klayman, 0x1014, _asRing3); if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) { setGlobalVar(0x2B514304, 1); setMessageList(0x004B44A8); @@ -1644,12 +1591,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit messageResult = 1; } else if (param.asInteger() == 0x468C7B11) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _asRing4, this); + sendEntityMessage(_klayman, 0x1014, _asRing4); } else if (param.asInteger() == 0x42845B19) { // TODO _resourceTable4.load(); - _klayman->sendEntityMessage(0x1014, _asRing5, this); + sendEntityMessage(_klayman, 0x1014, _asRing5); } else if (param.asInteger() == 0xC0A07458) { - _klayman->sendEntityMessage(0x1014, _class426, this); + sendEntityMessage(_klayman, 0x1014, _class426); } break; case 0x1024: @@ -1658,14 +1605,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 3) { // TODO _resourceTable2.load(); } - _parentModule->sendMessage(0x1024, param, this); + sendMessage(_parentModule, 0x1024, param.asInteger()); break; case 0x2000: if (_flag) { setMessageList2(0x004B43D0); } else { if (_klayman->getY() > 420) { - _klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this); + sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap); setMessageList2(0x004B4480); } else if (_klayman->getY() > 227) { setMessageList2(0x004B41E0); @@ -1686,7 +1633,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B43A0); break; case 0x4806: - _parentModule->sendMessage(0x1024, 2, this); + sendMessage(_parentModule, 0x1024, 2); _flag1BE = true; if (sender == _asRing1) { setGlobalVar(0x4DE80AC0, 0); @@ -1697,8 +1644,8 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (sender == _asRing3) { setGlobalVar(0x4DE80AC0, 0); _soundResource2.play(); - _asDoor->sendMessage(0x4808, 0, this); - _class506->sendMessage(0x4808, 0, this); + sendMessage(_asDoor, 0x4808, 0); + sendMessage(_class506, 0x4808, 0); } else if (sender == _asRing4) { setGlobalVar(0x4DE80AC0, 0); _soundResource1.play(0xE0558848); @@ -1710,22 +1657,22 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x4807: if (sender == _asRing3) { _soundResource3.play(); - _asDoor->sendMessage(0x4809, 0, this); - _class506->sendMessage(0x4809, 0, this); + sendMessage(_asDoor, 0x4809, 0); + sendMessage(_class506, 0x4809, 0); } else if (sender == _asVenusFlyTrap) { if (getGlobalVar(0x8306F218)) { - _asRing3->sendMessage(0x4807, 0, this); + sendMessage(_asRing3, 0x4807, 0); } } break; case 0x480B: - _klayman->sendEntityMessage(0x1014, _asDoorSpy, this); + sendEntityMessage(_klayman, 0x1014, _asDoorSpy); break; case 0x480F: setGlobalVar(0x4DE80AC0, 0); _soundResource2.play(); - _asDoor->sendMessage(0x4808, 0, this); - _class506->sendMessage(0x4808, 0, this); + sendMessage(_asDoor, 0x4808, 0); + sendMessage(_class506, 0x4808, 0); break; } return messageResult; @@ -1751,7 +1698,7 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; } @@ -1837,10 +1784,10 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) _class478 = addSprite(new Class478(_vm, _klayman)); - addSprite(new StaticSprite(_vm, 0x800034A0, 1100)); - addSprite(new StaticSprite(_vm, 0x64402020, 1100)); - addSprite(new StaticSprite(_vm, 0x3060222E, 1300)); - tempSprite = addSprite(new StaticSprite(_vm, 0x0E002004, 1300)); + insertStaticSprite(0x800034A0, 1100); + insertStaticSprite(0x64402020, 1100); + insertStaticSprite(0x3060222E, 1300); + tempSprite = insertStaticSprite(0x0E002004, 1300); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; @@ -1874,7 +1821,7 @@ uint32 Scene1004::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B7C70); break; case 0x2002: - _asTrashCan->sendMessage(0x2002, 0, this); + sendMessage(_asTrashCan, 0x2002, 0); break; } return messageResult; @@ -1909,14 +1856,14 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) _background = addBackground(new DirtyBackground(_vm, 0x2800E011, 0, 0)); _palette = new Palette(_vm, 0x2800E011); _palette->usePalette(); - addSprite(new StaticSprite(_vm, 0x492D5AD7, 100)); + insertStaticSprite(0x492D5AD7, 100); _mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620)); } else { _background = addBackground(new DirtyBackground(_vm, 0x8870A546, 0, 0)); _palette = new Palette(_vm, 0x8870A546); _palette->usePalette(); - addSprite(new StaticSprite(_vm, 0x40D1E0A9, 100)); - addSprite(new StaticSprite(_vm, 0x149C00A6, 100)); + insertStaticSprite(0x40D1E0A9, 100); + insertStaticSprite(0x149C00A6, 100); _mouseCursor = addSprite(new Mouse435(_vm, 0x0A54288F, 20, 620)); } @@ -1929,7 +1876,7 @@ uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index ff494e7ed5..163fc63a15 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -97,11 +97,11 @@ void Module1200::updateScene1201() { createScene1202(0); _childObject->handleUpdate(); } else if (_moduleDoneStatus == 2) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { createScene1203(-1); } else { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } } } @@ -245,7 +245,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4806: @@ -417,13 +417,13 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == 0x092870C0) { - _class466->sendMessage(0x2006, 0, this); + sendMessage(_class466, 0x2006, 0); } else if (param.asInteger() == 0x11CA0144) { _soundResource.play(0x51800A04); } break; case 0x1011: - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); messageResult = 1; case 0x480B: if (!_flag) { @@ -570,7 +570,7 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam uint32 messageResult = handleMessage40C2D0(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x2001, 0, this); + sendMessage(_parentScene, 0x2001, 0); messageResult = 1; break; case 0x4806: @@ -693,8 +693,8 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar case 0x100D: if (param.asInteger() == 0x02060018) { _soundResource.play(0xCD298116); - _parentScene->sendMessage(0x4814, 0, this); - _klayman->sendMessage(0x4814, 0, this); + sendMessage(_parentScene, 0x4814, 0); + sendMessage(_klayman, 0x4814, 0); } break; case 0x3002: @@ -1014,12 +1014,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x07053000) { _flag = true; - _asCreature->sendMessage(0x2004, 0, this); + sendMessage(_asCreature, 0x2004, 0); } else if (param.asInteger() == 0x140E5744) { - _asCreature->sendMessage(0x2005, 0, this); + sendMessage(_asCreature, 0x2005, 0); } else if (param.asInteger() == 0x40253C40) { _messageListFlag = false; - _asCreature->sendMessage(0x2006, 0, this); + sendMessage(_asCreature, 0x2006, 0); } else if (param.asInteger() == 0x090EB048) { if (_klayman->getX() < 572) { setMessageList2(0x004AEC90); @@ -1032,16 +1032,16 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit if (!getGlobalVar(0x0112090A)) { setMessageList2(0x004AECB0); } else { - _klayman->sendEntityMessage(0x1014, _asMatch, this); + sendEntityMessage(_klayman, 0x1014, _asMatch); setMessageList2(0x004AECC0); } break; case 0x2002: if (getGlobalVar(0x20A0C516)) { - _klayman->sendEntityMessage(0x1014, _asTntMan, this); + sendEntityMessage(_klayman, 0x1014, _asTntMan); setMessageList2(0x004AECF0); } else if (getGlobalVar(0x0112090A) == 3) { - _klayman->sendEntityMessage(0x1014, _asTntMan, this); + sendEntityMessage(_klayman, 0x1014, _asTntMan); if (_klayman->getX() > _asTntMan->getX()) { setMessageList(0x004AECD0); } else { @@ -1054,12 +1054,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - _klayman->sendEntityMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004AED38); } break; case 0x4829: - _asRightDoor->sendMessage(0x4829, 0, this); + sendMessage(_asRightDoor, 0x4829, 0); break; } return messageResult; @@ -1131,7 +1131,7 @@ uint32 AsScene1202TntItem::handleMessage453FE0(int messageNum, const MessagePara uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x2000, _index, this); + sendMessage(_parentScene, 0x2000, _index); messageResult = 1; break; case 0x2001: @@ -1174,7 +1174,7 @@ void AsScene1202TntItem::sub454100() { } void AsScene1202TntItem::sub454160() { - _parentScene->sendMessage(0x2002, _index, this); + sendMessage(_parentScene, 0x2002, _index); sub4540A0(); } @@ -1230,7 +1230,7 @@ void Scene1202::update() { Scene::update(); if (_soundFlag) { if (!_soundResource4.isPlaying()) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } else if (_counter == 0 && isSolved()) { SetMessageHandler(&Scene1202::handleMessage453D90); @@ -1240,8 +1240,8 @@ void Scene1202::update() { _soundFlag = true; } else if (_index >= 0 && _counter == 0) { int index2 = kScene1202Table[_index]; - _asTntItems[_index]->sendMessage(0x2001, getSubVar(0x10055D14, index2), this); - _asTntItems[index2]->sendMessage(0x2001, getSubVar(0x10055D14, _index), this); + sendMessage(_asTntItems[_index], 0x2001, getSubVar(0x10055D14, index2)); + sendMessage(_asTntItems[index2], 0x2001, getSubVar(0x10055D14, _index)); int temp = getSubVar(0x10055D14, index2); setSubVar(0x10055D14, index2, getSubVar(0x10055D14, _index)); setSubVar(0x10055D14, _index, temp); @@ -1263,7 +1263,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam ¶m, case 0x0001: // TODO: Debug/Cheat stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x000D: @@ -1287,7 +1287,7 @@ uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 04f4a2e8ed..b8b7b8b54f 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -336,6 +336,7 @@ void Module1300::updateScene1306() { _done = false; delete _childObject; _childObject = NULL; + debug("_field20 = %d", _field20); if (_field20 == 2) { createScene1309(0); _childObject->handleUpdate(); @@ -343,7 +344,7 @@ void Module1300::updateScene1306() { createScene1303(0); _childObject->handleUpdate(); } else if (_field20 == 0) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else if (_field20 == 1) { createScene1311(-1); _childObject->handleUpdate(); @@ -397,9 +398,9 @@ void Module1300::updateScene1310() { delete _childObject; _childObject = NULL; if (_vm->gameState().sceneNum == 9) - createScene1315(0); - else createScene1306(0); + else + createScene1315(0); _childObject->handleUpdate(); } } @@ -554,7 +555,7 @@ void AsScene1302Bridge::stRaiseBridge() { } void AsScene1302Bridge::cbLowerBridgeEvent() { - _parentScene->sendMessage(0x2032, 0, this); + sendMessage(_parentScene, 0x2032, 0); setFileHash(0x88148150, -1, -1); _newHashListIndex = -2; } @@ -622,10 +623,10 @@ uint32 Class595::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x482A: - _parentScene->sendMessage(0x1022, 995, this); + sendMessage(_parentScene, 0x1022, 995); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1015, this); + sendMessage(_parentScene, 0x1022, 1015); break; } return messageResult; @@ -663,10 +664,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; if (which < 0) { - _klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364); +// _klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364); setMessageList(0x004B0868); } else { - _klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330); +// _klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330); setMessageList(0x004B0870); } addSprite(_klayman); @@ -679,7 +680,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true)); _vm->_collisionMan->addSprite(_asVenusFlyTrap); - _klayman->sendEntityMessage(0x2007, _asVenusFlyTrap, this); + sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); } @@ -689,10 +690,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4A845A00) { - _klayman->sendEntityMessage(0x1014, _asRing1, this); + sendEntityMessage(_klayman, 0x1014, _asRing1); } else if (param.asInteger() == 0x43807801) { if (!getGlobalVar(0x13206309)) { - _klayman->sendEntityMessage(0x1014, _asRing2, this); + sendEntityMessage(_klayman, 0x1014, _asRing2); if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) { setMessageList(0x004B0940); } else { @@ -703,10 +704,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } messageResult = 1; } else if (param.asInteger() == 0x46C26A01) { - _klayman->sendEntityMessage(0x1014, _asRing3, this); + sendEntityMessage(_klayman, 0x1014, _asRing3); } else if (param.asInteger() == 0x468C7B11) { if (!getGlobalVar(0x80101B1E)) { - _klayman->sendEntityMessage(0x1014, _asRing4, this); + sendEntityMessage(_klayman, 0x1014, _asRing4); if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) { setMessageList(0x004B0940); } else { @@ -717,7 +718,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } messageResult = 1; } else if (param.asInteger() == 0x42845B19) { - _klayman->sendEntityMessage(0x1014, _asRing5, this); + sendEntityMessage(_klayman, 0x1014, _asRing5); } else if (param.asInteger() == 0x430A6060) { if (getGlobalVar(0x13206309)) { setMessageList2(0x004B0910); @@ -740,7 +741,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2000: if (_klayman->getY() > 360) { - _klayman->sendEntityMessage(0x1014, _asVenusFlyTrap, this); + sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap); setMessageList2(0x004B08F0); } else { setMessageList2(0x004B0920); @@ -748,23 +749,23 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2002: if (_klayman->getX() > 545) { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } break; case 0x2032: _sprite2->getSurface()->setVisible(true); break; case 0x4806: - _parentModule->sendMessage(0x1024, 2, this); + sendMessage(_parentModule, 0x1024, 2); if (sender == _asRing1) { _soundResource.play(0x665198C0); } else if (sender == _asRing2) { - _asBridge->sendMessage(0x4808, 0, this); + sendMessage(_asBridge, 0x4808, 0); setGlobalVar(0x13206309, 1); } else if (sender == _asRing3) { _soundResource.play(0xE2D389C0); } else if (sender == _asRing4) { - _ssFence->sendMessage(0x4808, 0, this); + sendMessage(_ssFence, 0x4808, 0); setGlobalVar(0x80101B1E, 1); } else if (sender == _asRing5) { _soundResource.play(0x40428A09); @@ -772,36 +773,36 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4807: if (sender == _asRing2) { - _asBridge->sendMessage(0x4809, 0, this); + sendMessage(_asBridge, 0x4809, 0); setGlobalVar(0x13206309, 0); _sprite2->getSurface()->setVisible(false); } else if (sender == _asRing4) { - _ssFence->sendMessage(0x4809, 0, this); + sendMessage(_ssFence, 0x4809, 0); setGlobalVar(0x80101B1E, 0); } else if (sender == _asVenusFlyTrap) { if (getGlobalVar(0x13206309)) { - _asRing2->sendMessage(0x4807, 0, this); + sendMessage(_asRing2, 0x4807, 0); } else { - _asRing4->sendMessage(0x4807, 0, this); + sendMessage(_asRing4, 0x4807, 0); } } break; case 0x480F: if (sender == _asRing2) { _soundResource.play(0x60755842); - _asBridge->sendMessage(0x4808, 0, this); + sendMessage(_asBridge, 0x4808, 0); setGlobalVar(0x13206309, 1); } else if (sender == _asRing4) { _soundResource.play(0x60755842); - _ssFence->sendMessage(0x4808, 0, this); + sendMessage(_ssFence, 0x4808, 0); setGlobalVar(0x80101B1E, 1); } break; case 0x482A: - _asVenusFlyTrap->sendMessage(0x482B, 0, this); + sendMessage(_asVenusFlyTrap, 0x482B, 0); break; case 0x482B: - _asVenusFlyTrap->sendMessage(0x482A, 0, this); + sendMessage(_asVenusFlyTrap, 0x482A, 0); break; } return messageResult; @@ -824,7 +825,7 @@ uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam &par uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x2000: @@ -864,7 +865,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1303::handleMessage); setRectList(0x004AF9E8); - _background = addBackground(new DirtyBackground(_vm, 0x01581A9C, 0, 0)); + setBackground(0x01581A9C); _palette = new Palette(_vm, 0x01581A9C); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x81A9801D, NULL)); @@ -892,7 +893,7 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x2000: setGlobalVar(0xAC00C0D0, 1); - _asBalloon->sendMessage(0x2000, 0, this); + sendMessage(_asBalloon, 0x2000, 0); break; case 0x4826: if (sender == _asBalloon && getGlobalVar(0x31C63C51)) { @@ -918,7 +919,7 @@ uint32 Class544::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4806: @@ -937,7 +938,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1304::handleMessage); setRectList(0x004B91A8); - _background = addBackground(new DirtyBackground(_vm, 0x062C0214, 0, 0)); + setBackground(0x062C0214); _palette = new Palette(_vm, 0x062C0214); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL)); @@ -991,10 +992,10 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _class544) { - _klayman->sendEntityMessage(0x1014, _class544, this); + sendEntityMessage(_klayman, 0x1014, _class544); setMessageList(0x004B9130); } else if (sender == _class545) { - _klayman->sendEntityMessage(0x1014, _class545, this); + sendEntityMessage(_klayman, 0x1014, _class545); setMessageList(0x004B9140); } break; @@ -1093,7 +1094,7 @@ void AsScene1306Elevator::stGoingUp() { void AsScene1306Elevator::cbGoingUpEvent() { SetUpdateHandler(&AsScene1306Elevator::update); - _parentScene->sendMessage(0x4808, 0, this); + sendMessage(_parentScene, 0x4808, 0); _isUp = true; _countdown = 144; setFileHash1(); @@ -1112,7 +1113,7 @@ void AsScene1306Elevator::stGoingDown() { void AsScene1306Elevator::cbGoingDownEvent() { _isDown = true; - _parentScene->sendMessage(0x4809, 0, this); + sendMessage(_parentScene, 0x4809, 0); SetUpdateHandler(&AsScene1306Elevator::update); setFileHash1(); } @@ -1154,13 +1155,13 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { _klayman = new KmScene1306(_vm, this, 380, 440); setMessageList(0x004AFAD0); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 1) { _klayman = new KmScene1306(_vm, this, 136, 440); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFAF0); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { @@ -1170,34 +1171,34 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) _klayman = new KmScene1306(_vm, this, 355, 440); } setMessageList(0x004AFBC8); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 3) { _klayman = new KmScene1306(_vm, this, 534, 440); setMessageList(0x004AFC30); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 4) { _klayman = new KmScene1306(_vm, this, 136, 440); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFC38); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 5) { _klayman = new KmScene1306(_vm, this, 136, 440); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFB00); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else { _klayman = new KmScene1306(_vm, this, 286, 408); setSurfacePriority(_asElevator->getSurface(), 1100); setSurfacePriority(_asElevatorDoor->getSurface(), 1090); setSurfacePriority(_sprite1->getSurface(), 1080); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); SetMessageHandler(&Scene1306::handleMessage416EB0); clearRectList(); - _asElevator->sendMessage(0x4808, 0, this); + sendMessage(_asElevator, 0x4808, 0); } addSprite(_klayman); @@ -1212,9 +1213,9 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x402064D8) { - _klayman->sendEntityMessage(0x1014, _ssButton, this); + sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x01C66840) { - if (_asElevator->sendMessage(0x2001, 0, this) != 0) { + if (sendMessage(_asElevator, 0x2001, 0) != 0) { setMessageList(0x004AFBD8); } else { setMessageList(0x004AFAE0); @@ -1236,18 +1237,18 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (sender == _ssButton) { - _asElevator->sendMessage(0x4808, 0, this); + sendMessage(_asElevator, 0x4808, 0); } break; case 0x4826: if (sender == _class545) { if (_klayman->getX() >= 249) { - _klayman->sendEntityMessage(0x1014, _class545, this); + sendEntityMessage(_klayman, 0x1014, _class545); setMessageList(0x004AFC58); } } else if (sender == _asTape) { if (_klayman->getX() >= 249) { - _klayman->sendEntityMessage(0x1014, _class545, this); + sendEntityMessage(_klayman, 0x1014, _class545); setMessageList(0x004AFC68); } } @@ -1261,7 +1262,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit setSurfacePriority(_asElevator->getSurface(), 100); setSurfacePriority(_asElevatorDoor->getSurface(), 90); setSurfacePriority(_sprite1->getSurface(), 80); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); break; } @@ -1276,7 +1277,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, SetMessageHandler(&Scene1306::handleMessage); break; case 0x4809: - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); break; case 0x482A: setSurfacePriority(_asElevator->getSurface(), 1100); @@ -1287,7 +1288,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, setSurfacePriority(_asElevator->getSurface(), 100); setSurfacePriority(_asElevatorDoor->getSurface(), 90); setSurfacePriority(_sprite1->getSurface(), 80); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); break; } @@ -1389,7 +1390,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x1011: if (_isClickable) { - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); stRemoveKey(); messageResult = 1; } @@ -1434,7 +1435,7 @@ void AsScene1307Key::suInsertKey() { _soundResource1.play(); } else { SetSpriteCallback(NULL); - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); } } @@ -1463,7 +1464,7 @@ void AsScene1307Key::stRemoveKey() { void AsScene1307Key::stInsertKey() { _pointIndex = 0; - _parentScene->sendMessage(0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], this); + sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]); _surface->getClipRect() = _clipRects[getSubVar(0xA010B810, _index) % 4]; SetSpriteCallback(&AsScene1307Key::suInsertKey); _newHashListIndex = -2; @@ -1473,7 +1474,7 @@ void AsScene1307Key::stMoveKey() { NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)]; int16 newX = pt.x + kAsScene1307KeyXDelta; int16 newY = pt.y + kAsScene1307KeyYDelta; - _parentScene->sendMessage(0x1022, 1000, this); + sendMessage(_parentScene, 0x1022, 1000); _surface->getClipRect().x1 = 0; _surface->getClipRect().y1 = 0; _surface->getClipRect().x2 = 640; @@ -1584,7 +1585,7 @@ void Scene1307::update() { _palette->startFadeToWhite(40); } if (_doLeaveScene && !_soundResource.isPlaying()) { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); setGlobalVar(0x80455A41, 1); } } @@ -1617,14 +1618,14 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit } if (!occupied) { // If the keyhole is free, insert the current key - _asCurrKey->sendMessage(0x2001, clickedKeyHoleIndex, this); + sendMessage(_asCurrKey, 0x2001, clickedKeyHoleIndex); _isInsertingKey = true; _mouseClicked = false; } } } } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } break; @@ -1637,7 +1638,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit // Play unlock animations for all keys for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (_asKeys[keyIndex]) - _asKeys[keyIndex]->sendMessage(0x2003, 1, this); + sendMessage(_asKeys[keyIndex], 0x2003, 1); } _soundResource.play(); _isPuzzleSolved = true; @@ -1645,10 +1646,10 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit } else { for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) { - _asKeys[keyIndex]->sendMessage(0x2000, 1, this); + sendMessage(_asKeys[keyIndex], 0x2000, 1); } } - _asCurrKey->sendMessage(0x2004, 1, this); + sendMessage(_asCurrKey, 0x2004, 1); } _asCurrKey = NULL; _isInsertingKey = false; @@ -1657,7 +1658,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit _asCurrKey = (Sprite*)sender; for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) { - _asKeys[keyIndex]->sendMessage(0x2000, 0, this); + sendMessage(_asKeys[keyIndex], 0x2000, 0); } } break; @@ -1717,7 +1718,7 @@ void Class549::sub455470() { } void Class549::hide() { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); setFileHash1(); _surface->setVisible(false); } @@ -1731,7 +1732,7 @@ void Class549::sub4554F0() { } void Class549::sub455550() { - _parentScene->sendMessage(0x2001, 0, this); + sendMessage(_parentScene, 0x2001, 0); setFileHash1(); } @@ -1762,7 +1763,7 @@ void Class592::sub455710() { } void Class592::sub455740() { - _parentScene->sendMessage(0x2004, 0, this); + sendMessage(_parentScene, 0x2004, 0); setFileHash1(); _surface->setVisible(false); } @@ -1804,7 +1805,7 @@ void Class593::sub455920() { } void Class593::sub455950() { - _parentScene->sendMessage(0x2003, 0, this); + sendMessage(_parentScene, 0x2003, 0); setFileHash1(); _surface->setVisible(false); } @@ -1911,7 +1912,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } else { _klayman = new KmScene1308(_vm, this, 41, 440); setMessageList(0x004B57D0); - _class549->sendMessage(0x4808, 0, this); + sendMessage(_class549, 0x4808, 0); _sprite1->getSurface()->setVisible(false); if (getGlobalVar(0x80455A41)) { _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); @@ -1958,7 +1959,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B59A0); _flag1 = true; } else if (param.asInteger() == 0x08821382) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); if (getGlobalVar(0x80455A41)) { setRectList(0x004B5990); } else { @@ -1967,7 +1968,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit _flag1 = false; } else if (param.asInteger() == 0x4AC68808) { clearRectList(); - _class549->sendMessage(0x4809, 0, this); + sendMessage(_class549, 0x4809, 0); _sprite1->getSurface()->setVisible(false); _klayman->getSurface()->setVisible(false); } @@ -1991,7 +1992,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit _klayman->getSurface()->setVisible(true); break; case 0x2001: - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; case 0x2003: _class601_1->getSurface()->setVisible(false); @@ -2003,10 +2004,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B5990); break; case 0x4807: - _class593->sendMessage(0x2003, 0, this); + sendMessage(_class593, 0x2003, 0); break; case 0x480F: - _class593->sendMessage(0x2002, 0, this); + sendMessage(_class593, 0x2002, 0); _class601_1->getSurface()->setVisible(true); _class601_2->getSurface()->setVisible(true); _class601_3->getSurface()->setVisible(true); @@ -2017,10 +2018,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList2(0x004B5868); } else { if (param.asInteger() == 1) { - _klayman->sendMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B5848); - } else if (_class489->sendMessage(0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1, this) != 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + } else if (sendMessage(_class489, 0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1) != 0) { + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B5830); } else { setMessageList2(0x004B5800); @@ -2030,7 +2031,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_flag1) { setMessageList2(0x004B5868); } else if (_messageListStatus != 2) { - _klayman->sendMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList2(0x004B58E0); } } @@ -2135,7 +2136,7 @@ uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam ¶m, Ent uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; } return messageResult; @@ -2145,7 +2146,7 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity * uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; } return messageResult; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 7835520273..60e52794f7 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -133,7 +133,7 @@ void Module1400::updateScene1401() { createScene1404(0); _childObject->handleUpdate(); } else { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } } @@ -505,7 +505,7 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4807: @@ -534,10 +534,10 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity } break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; case 0x4828: sub435040(); @@ -552,14 +552,14 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, case 0x1011: if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 && param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) { - _parentScene->sendMessage(0x4826, 1, this); + sendMessage(_parentScene, 0x4826, 1); } else { - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); } messageResult = 1; break; case 0x4807: - _parentScene->sendMessage(0x4807, 0, this); + sendMessage(_parentScene, 0x4807, 0); sub434F80(); break; case 0x480B: @@ -583,10 +583,10 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, sub434EC0(); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -610,11 +610,11 @@ void Class489::spriteUpdate434B60() { sub434C80(); if (_remX == _x) { if (getGlobalVar(0x04A10F33) == 0 && _class489Item->flag4 != 0) { - _parentScene->sendMessage(0x1019, 0, this); + sendMessage(_parentScene, 0x1019, 0); incGlobalVar(0x04A105B3, -1); setGlobalVar(0x04A10F33, kClass489Items[getGlobalVar(0x04A105B3)].varIndex1); } else if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex1 && _class489Item->flag != 0) { - _parentScene->sendMessage(0x1019, 1, this); + sendMessage(_parentScene, 0x1019, 1); incGlobalVar(0x04A105B3, +1); setGlobalVar(0x04A10F33, 0); } @@ -666,7 +666,7 @@ void Class489::sub434C80() { void Class489::sub434D80() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { - _class525->sendMessage(0x483A, 0, this); + sendMessage(_class525, 0x483A, 0); setFileHash1(); SetMessageHandler(&Sprite::handleMessage); SetSpriteCallback(NULL); @@ -713,7 +713,7 @@ void Class489::sub434EC0() { } void Class489::sub434F40() { - _parentScene->sendMessage(0x480F, 0, this); + sendMessage(_parentScene, 0x480F, 0); setFileHash(0xD833207F, 0, -1); SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage4348E0); @@ -799,12 +799,12 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _class489 = addSprite(new Class489(_vm, this, _klayman, _class525)); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x04A10F33) == 6) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); _klayman->setX(_class489->getX() + 100); _klayman->processDelta(); setMessageList(0x004B6670); } else if (getGlobalVar(0x04A10F33) == 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); _klayman->setX(_class489->getX() - 100); _klayman->processDelta(); setMessageList(0x004B6670); @@ -821,7 +821,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().y2 = 480; if (which == 0 && _class489 && _class489->hasMessageHandler()) { - _class489->sendMessage(0x482B, 0, this); + sendMessage(_class489, 0x482B, 0); } _class528 = addSprite(new Class528(_vm, _klayman, which == 1)); @@ -843,11 +843,11 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02144CB1) { - _klayman->sendEntityMessage(0x1014, _class427, this); + sendEntityMessage(_klayman, 0x1014, _class427); } else if (param.asInteger() == 0x402064D8) { - _klayman->sendEntityMessage(0x1014, _ssButton, this); + sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x01C66840) { - if (_class528->hasMessageHandler() && _class528->sendMessage(0x2001, 0, this) != 0) { + if (_class528->hasMessageHandler() && sendMessage(_class528, 0x2001, 0) != 0) { setMessageList(0x004B6690); } else { setMessageList(0x004B66B0); @@ -856,30 +856,30 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x1019: if (param.asInteger() != 0) { - _parentModule->sendMessage(0x1009, 2, this); + sendMessage(_parentModule, 0x1009, 2); } else { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } break; case 0x480B: if (sender == _class427) { - _class525->sendMessage(0x2000, 0, this); + sendMessage(_class525, 0x2000, 0); if (!getGlobalVar(0x01023818)) { - _class526->sendMessage(0x4839, 0, this); - _class527->sendMessage(0x4839, 0, this); + sendMessage(_class526, 0x4839, 0); + sendMessage(_class527, 0x4839, 0); setGlobalVar(0x01023818, 1); } if (_class489 && _class489->getX() > 404 && _class489->getX() < 504) { - _class489 ->sendMessage(0x4839, 0, this); + sendMessage(_class489 , 0x4839, 0); } } else if (sender == _ssButton) { - _ssButton->sendMessage(0x4808, 0, this); + sendMessage(_ssButton, 0x4808, 0); } break; case 0x4826: if (sender == _class489) { - if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B6658); } else { setMessageList2(0x004B65F0); @@ -889,13 +889,13 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x482A: _sprite1->getSurface()->setVisible(true); if (_class489) { - _class489->sendMessage(0x482B, 0, this); + sendMessage(_class489, 0x482B, 0); } break; case 0x482B: _sprite1->getSurface()->setVisible(false); if (_class489) { - _class489->sendMessage(0x482A, 0, this); + sendMessage(_class489, 0x482A, 0); } break; } @@ -955,19 +955,19 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Class482::sub428500() { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); setFileHash1(); _surface->setVisible(false); } void Class482::sub428530() { - _parentScene->sendMessage(0x2001, 0, this); + sendMessage(_parentScene, 0x2001, 0); setFileHash1(); _surface->setVisible(false); } void Class482::sub428560() { - _parentScene->sendMessage(0x2003, 0, this); + sendMessage(_parentScene, 0x2003, 0); setFileHash1(); } @@ -1035,12 +1035,12 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x4A10F33) == 4) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); _klayman->setX(_class489->getX() + 100); _klayman->processDelta(); setMessageList(0x004B0BD0); } else if (getGlobalVar(0x4A10F33) == 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); _klayman->setX(_class489->getX() - 100); _klayman->processDelta(); setMessageList(0x004B0BD0); @@ -1086,21 +1086,21 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x00F43389) { if (getGlobalVar(0x70A1189C)) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else { clearRectList(); _klayman->getSurface()->setVisible(false); _mouseCursor->getSurface()->setVisible(false); - _class482->sendMessage(0x2002, 0, this); + sendMessage(_class482, 0x2002, 0); sub428220(); } } break; case 0x1019: if (param.asInteger()) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } break; case 0x2000: @@ -1110,15 +1110,15 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2001: sub428230(); - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; case 0x2003: sub428230(); break; case 0x4826: if (sender == _class489) { - if (_class489->sendMessage(0x408C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + if (sendMessage(_class489, 0x408C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B0BB8); } else { setMessageList2(0x004B0B68); @@ -1249,7 +1249,7 @@ void AsScene1407Mouse::suWalkTo() { xdelta = -_deltaX; _deltaX = 0; if (_walkDestX == _x) { - sendMessage(0x1019, 0, this); + sendMessage(this, 0x1019, 0); } else { _x += xdelta; processDelta(); @@ -1362,7 +1362,7 @@ void AsScene1407Mouse::stArriveAtHole() { _x = kScene1407MouseHoles[_nextHoleIndex].x; _y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex]; if (_nextHoleIndex == 1) { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _walkDestX = 512; stWalkToDest(); _surface->setVisible(true); @@ -1396,7 +1396,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1407::update() { Scene::update(); if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) { _ssResetButton->getSurface()->setVisible(false); } @@ -1410,17 +1410,17 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO: Debug/Cheat stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { // Exit scene - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 && param.asPoint().y >= 62 && param.asPoint().y <= 90) { // The reset button was clicked - _asMouse->sendMessage(0x2001, 0, this); + sendMessage(_asMouse, 0x2001, 0); _ssResetButton->getSurface()->setVisible(true); _soundResource.play(0x44045000); _resetButtonCountdown = 12; } else { // Handle the mouse - _asMouse->sendMessage(messageNum, param, this); + sendMessage(_asMouse, messageNum, param); } } break; @@ -1487,7 +1487,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) addSprite(_class489); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x04A10F33) == 4) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); _klayman->setX(_class489->getX() + 100); _klayman->processDelta(); setMessageList(0x004B1F70); @@ -1509,13 +1509,13 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B2008); _flag = true; } else if (param.asInteger() == 0x08821382) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); setRectList(0x004B1FF8); _flag = false; } break; case 0x1019: - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; case 0x1022: if (sender == _class489) { @@ -1537,10 +1537,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_flag) { setMessageList2(0x004B1FA8); } else if (param.asInteger() == 1) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B1F88); - } else if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + } else if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B1F58); } else { setMessageList2(0x004B1F28); @@ -1549,7 +1549,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_flag) { setMessageList2(0x004B1FA8); } else if (_messageListStatus != 2) { - _klayman->sendEntityMessage(0x1014, sender, this); + sendEntityMessage(_klayman, 0x1014, sender); setMessageList2(0x004B1FB8); } } @@ -1612,7 +1612,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x04A10F33) == 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + sendEntityMessage(_klayman, 0x1014, _class489); _klayman->setX(_class489->getX() - 100); _klayman->processDelta(); setMessageList(0x004B8CB8); @@ -1647,21 +1647,21 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x1019: - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; case 0x4826: if (sender == _class489) { - if (_class489->sendMessage(0x480C, _klayman->getX() > _class489->getX() ? 1 : 0, this) != 0) { - _klayman->sendEntityMessage(0x1014, _class489, this); + if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _class489); setMessageList2(0x004B8CA0); } else { setMessageList2(0x004B8C40); } } else if (sender == _asTape && _messageListStatus != 2) { - _klayman->sendEntityMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B8CD0); } else if (sender == _class545 && _messageListStatus != 2) { - _klayman->sendEntityMessage(0x1014, _class545, this); + sendEntityMessage(_klayman, 0x1014, _class545); setMessageList(0x004B8D18); } break; @@ -1757,7 +1757,7 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, case 0x1011: if (getSubVar(0xCCE0280F, _index) == 0 && _parentScene->getCountdown() == 0) { show(); - _parentScene->sendMessage(0x2000, _index, this); + sendMessage(_parentScene, 0x2000, _index); } messageResult = 1; break; @@ -1841,7 +1841,7 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x0001: // TODO: Debug/Cheat stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x000D: diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 9506f8032e..40b15b3622 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -63,14 +63,14 @@ void Module1500::update() { if (_flag) { createScene1503(); } else { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 3: createScene1501(); break; default: - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); break; } } @@ -91,7 +91,7 @@ void Module1500::createScene1502() { } void Module1500::createScene1503() { - _parentModule->sendMessage(0x0800, 0, this); + sendMessage(_parentModule, 0x0800, 0); _vm->gameState().sceneNum = 2; createSmackerScene(0x001A0005, true, true, true); SetUpdateHandler(&Module1500::update); @@ -148,7 +148,7 @@ void Scene1501::update() { _countdown1--; if (_countdown1 == 0) { _vm->_screen->clear(); - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) { _countdown1 = 12; diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index e6cbe62b10..b281b38464 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -161,7 +161,7 @@ void Module1700::updateScene1705() { _done = false; delete _childObject; _childObject = NULL; - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } } @@ -211,7 +211,7 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4806: @@ -264,43 +264,43 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { _klayman = new KmScene1705(_vm, this, 231, 434); setMessageList(0x004B69E8); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else if (which == 1) { _klayman = new KmScene1705(_vm, this, 431, 434); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A08); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else if (which == 2) { _klayman = new KmScene1705(_vm, this, 431, 434); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6AA0); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else if (which == 3) { _klayman = new KmScene1705(_vm, this, 431, 434); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A18); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else { _klayman = new KmScene1705(_vm, this, 231, 74); - _klayman->sendMessage(0x2000, 0, this); + sendMessage(_klayman, 0x2000, 0); setMessageList(0x004B69F0); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); tempSprite = addSprite(new StaticSprite(_vm, 0x30303822, 1100)); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; @@ -339,7 +339,7 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _class606 && _klayman->getX() <= 318) { - _klayman->sendEntityMessage(0x1014, sender, this); + sendEntityMessage(_klayman, 0x1014, sender); setMessageList(0x004B6AC0); } break; diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index e2c88dc2b6..f503848661 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -196,12 +196,12 @@ void Module1800::updateScene1803() { createScene1801(2); _childObject->handleUpdate(); } else if (_field20 == 3) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else if (_field20 == 6) { createScene1809(-1); _childObject->handleUpdate(); } else if (_field20 == 7) { - _parentModule->sendMessage(0x1009, 3, this); + sendMessage(_parentModule, 0x1009, 3); } } } @@ -251,7 +251,7 @@ void Module1800::updateScene1806() { delete _childObject; _childObject = NULL; if (_field20 == 0) { - _parentModule->sendMessage(0x1009, 2, this); + sendMessage(_parentModule, 0x1009, 2); } else if (_field20 == 1) { createScene1805(3); _childObject->handleUpdate(); @@ -271,7 +271,7 @@ void Module1800::updateScene1809() { _done = false; delete _childObject; _childObject = NULL; - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); // TODO GameState stuff } } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 9f45db218c..1af7799196 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -89,7 +89,7 @@ void Module2000::updateScene2001() { delete _childObject; _childObject = NULL; if (_field20 == 1) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } else { createScene2002(0); } @@ -144,26 +144,26 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { _klayman = new KmScene2001(_vm, this, 300, 345); setMessageList(0x004B3538); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); } else if (which == 1) { _klayman = new KmScene2001(_vm, this, 116, 345); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3540); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); } else if (which == 2) { _klayman = new KmScene2001(_vm, this, 116, 345); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B35F0); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); } else if (which == 3) { _klayman = new KmScene2001(_vm, this, 116, 345); - _klayman->sendMessage(0x2000, 1, this); + sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3550); - sendMessage(0x2000, 1, this); + sendMessage(this, 0x2000, 1); } else { _klayman = new KmScene2001(_vm, this, 390, 345); setMessageList(0x004B3530); - sendMessage(0x2000, 0, this); + sendMessage(this, 0x2000, 0); _klayman->setDoDeltaX(1); } addSprite(_klayman); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index fe6f36cc45..3faad252bc 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -508,7 +508,7 @@ void Module2200::updateScene2201() { } else if (_field20 == 2) { createScene2202(0); } else { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } } @@ -1529,22 +1529,22 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _rect2.y2 = 480; if (!getGlobalVar(0x404290D5)) { - addSprite(new StaticSprite(_vm, 0x00026027, 900)); + insertStaticSprite(0x00026027, 900); } - tempSprite = addSprite(new StaticSprite(_vm, 0x030326A0, 1100)); + tempSprite = insertStaticSprite(0x030326A0, 1100); _rect1.x1 = tempSprite->getSurface()->getDrawRect().x; - addSprite(new StaticSprite(_vm, 0x811DA061, 1100)); + insertStaticSprite(0x811DA061, 1100); - tempSprite = addSprite(new StaticSprite(_vm, 0x11180022, 1100)); + tempSprite = insertStaticSprite(0x11180022, 1100); _rect2.x1 = tempSprite->getSurface()->getDrawRect().x; - tempSprite = addSprite(new StaticSprite(_vm, 0x0D411130, 1100)); + tempSprite = insertStaticSprite(0x0D411130, 1100); _rect1.y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; _rect2.y1 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; - _doorLightSprite = addSprite(new StaticSprite(_vm, 0xA4062212, 900)); + _doorLightSprite = insertStaticSprite(0xA4062212, 900); if (which < 0) { _klayman = new KmScene2201(_vm, this, 300, 427, &_rect1, 2); @@ -1595,9 +1595,9 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x402064D8) { - _klayman->sendEntityMessage(0x1014, _ssDoorButton, this); + sendEntityMessage(_klayman, 0x1014, _ssDoorButton); } else if (param.asInteger() == 0x35803198) { - if (_asDoor->hasMessageHandler() && _asDoor->sendMessage(0x2000, 0, this)) { + if (_asDoor->hasMessageHandler() && sendMessage(_asDoor, 0x2000, 0)) { setMessageList(0x004B81A0); } else { setMessageList(0x004B81B8); @@ -1620,12 +1620,12 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (sender == _ssDoorButton) { - _asDoor->sendMessage(0x4808, 0, this); + sendMessage(_asDoor, 0x4808, 0); } break; case 0x4826: if (sender == _asTape) { - _klayman->sendEntityMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B81C8); } break; @@ -1705,7 +1705,7 @@ uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam & switch (messageNum) { case 0x1011: if (!_isMoving && !getGlobalVar(0x404290D5)) { - _parentScene->sendMessage(0x2000, _tileIndex, this); + sendMessage(_parentScene, 0x2000, _tileIndex); } messageResult = 1; break; @@ -1878,7 +1878,7 @@ void SsScene2202PuzzleTile::stopMoving() { _needRefresh = true; SetSpriteCallback(NULL); _isMoving = false; - _parentScene->sendMessage(0x2002, _tileIndex, this); + sendMessage(_parentScene, 0x2002, _tileIndex); } Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1912,9 +1912,9 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) } } - addSprite(new StaticSprite(_vm, 0x55C043B8, 200)); - addSprite(new StaticSprite(_vm, 0x85500158, 400)); - addSprite(new StaticSprite(_vm, 0x25547028, 600)); + insertStaticSprite(0x55C043B8, 200); + insertStaticSprite(0x85500158, 400); + insertStaticSprite(0x25547028, 600); _soundResource1.load(0x68E25540); _soundResource2.load(0x40400457); @@ -1932,7 +1932,7 @@ void Scene2202::update() { Scene::update(); if (_leaveScene && !_soundResource2.isPlaying()) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } if (_isSolved && !_soundResource1.isPlaying()) { @@ -1945,7 +1945,7 @@ void Scene2202::update() { int16 value = getFreeTileIndex(_movingTileIndex); if (value != -1) { setSurfacePriority(_movingTileSprite->getSurface(), 700); - _movingTileSprite->sendMessage(0x2001, value, this); + sendMessage(_movingTileSprite, 0x2001, value); _movingTileSprite = NULL; _isTileMoving = true; } @@ -1969,7 +1969,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x0001: // TODO Debug stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x000D: @@ -2039,7 +2039,7 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4806: @@ -2078,9 +2078,9 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x1011: if (_index == getGlobalVar(0x9A500914)) - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); else - _parentScene->sendMessage(0x2001, 0, this); + sendMessage(_parentScene, 0x2001, 0); messageResult = 1; break; case 0x2000: @@ -2088,17 +2088,17 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, break; case 0x3002: if (_index == getGlobalVar(0x9A500914)) - _parentScene->sendMessage(0x4808, 0, this); + sendMessage(_parentScene, 0x4808, 0); setFileHash1(); break; case 0x4808: setGlobalVar(0x9A500914, _index); - _otherDoor->sendMessage(0x4809, 0, this); + sendMessage(_otherDoor, 0x4809, 0); openDoor(); break; case 0x4809: closeDoor(); - _parentScene->sendMessage(0x2003, 0, this); + sendMessage(_parentScene, 0x2003, 0); break; } return messageResult; @@ -2142,8 +2142,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _asLeftDoor = addSprite(new AsScene2203Door(_vm, this, 0)); _asRightDoor = addSprite(new AsScene2203Door(_vm, this, 1)); - _ssSmallLeftDoor = addSprite(new StaticSprite(_vm, 0x542CC072, 1100)); - _ssSmallRightDoor = addSprite(new StaticSprite(_vm, 0x0A2C0432, 1100)); + _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); + _ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100); _leftDoorClipRect.x1 = _ssSmallLeftDoor->getSurface()->getDrawRect().x; _leftDoorClipRect.y1 = 0; @@ -2155,8 +2155,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _rightDoorClipRect.x2 = _ssSmallRightDoor->getSurface()->getDrawRect().x + _ssSmallRightDoor->getSurface()->getDrawRect().width; _rightDoorClipRect.y2 = 480; - _asLeftDoor->sendEntityMessage(0x2000, _asRightDoor, this); - _asRightDoor->sendEntityMessage(0x2000, _asLeftDoor, this); + sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); + sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); _vm->_collisionMan->addSprite(_asLeftDoor); _vm->_collisionMan->addSprite(_asRightDoor); @@ -2201,7 +2201,7 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2001: - _klayman->sendEntityMessage(0x1014, sender, this); + sendEntityMessage(_klayman, 0x1014, sender); if (sender == _asLeftDoor) { setMessageList2(0x004B83B0); } else { @@ -2233,10 +2233,10 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - _klayman->sendEntityMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B83E0); } else if (sender == _class545) { - _klayman->sendEntityMessage(0x1014, _class545, this); + sendEntityMessage(_klayman, 0x1014, _class545); setMessageList(0x004B83F0); } break; @@ -2352,7 +2352,7 @@ void Scene2205::update() { _palette->addPalette(0x0008028D, 0, 256, 0); _background->load(0x0008028D); _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); - _ssDoorFrame->sendMessage(0x2000, 0, this); + sendMessage(_ssDoorFrame, 0x2000, 0); ((Mouse433*)_mouseCursor)->load(0x80289008); ((Mouse433*)_mouseCursor)->updateCursor(); _isLightOn = true; @@ -2360,7 +2360,7 @@ void Scene2205::update() { _palette->addPalette(0xD00A028D, 0, 256, 0); _background->load(0xD00A028D); _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); - _ssDoorFrame->sendMessage(0x2000, 0, this); + sendMessage(_ssDoorFrame, 0x2000, 0); ((Mouse433*)_mouseCursor)->load(0xA0289D08); ((Mouse433*)_mouseCursor)->updateCursor(); _isKlaymanInLight = true; @@ -2394,7 +2394,7 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x2841369C) { setMessageList(0x004B0630); } else if (param.asInteger() == 0x402064D8) { - _klayman->sendEntityMessage(0x1014, _ssLightSwitch, this); + sendEntityMessage(_klayman, 0x1014, _ssLightSwitch); } break; case 0x480B: @@ -2531,7 +2531,7 @@ uint32 Class607::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x4806: @@ -2555,9 +2555,9 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { fileHash = 0x41983216; - _sprite1 = addSprite(new StaticSprite(_vm, 0x2201266A, 100)); - _sprite2 = addSprite(new StaticSprite(_vm, 0x3406A333, 300)); - _sprite3 = addSprite(new StaticSprite(_vm, 0x24A223A2, 100)); + _sprite1 = insertStaticSprite(0x2201266A, 100); + _sprite2 = insertStaticSprite(0x3406A333, 300); + _sprite3 = insertStaticSprite(0x24A223A2, 100); _sprite4 = addSprite(new Class603(_vm, 0x26133023)); _sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; _sprite4->getSurface()->getClipRect().y1 = 0; @@ -2570,9 +2570,9 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _class604 = addSprite(new Class604(_vm, 0x085E25E0)); } else { fileHash = 0xE0102A45; - _sprite1 = addSprite(new StaticSprite(_vm, 0x1C1106B8, 100)); - _sprite2 = addSprite(new StaticSprite(_vm, 0x020462E0, 300)); - _sprite3 = addSprite(new StaticSprite(_vm, 0x900626A2, 100)); + _sprite1 = insertStaticSprite(0x1C1106B8, 100); + _sprite2 = insertStaticSprite(0x020462E0, 300); + _sprite3 = insertStaticSprite(0x900626A2, 100); _sprite4 = addSprite(new Class603(_vm, 0x544822A8)); _sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; _sprite4->getSurface()->getClipRect().y1 = 0; @@ -2644,7 +2644,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asInteger() == 0x800C6694) { sub481B00(); } else if (param.asInteger() == 0x402064D8) { - _klayman->sendEntityMessage(0x1014, _sprite5, this); + sendEntityMessage(_klayman, 0x1014, _sprite5); } else if (param.asInteger() == 0x11C40840) { if (getGlobalVar(0x18890C91)) setMessageList(0x004B8948); @@ -2653,19 +2653,19 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4803: - _class604->sendMessage(0x4803, 0, this); + sendMessage(_class604, 0x4803, 0); break; case 0x480B: if (sender == _sprite5) { setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1); if (getGlobalVar(0x18890C91)) - _sprite4->sendMessage(0x4808, 0, this); + sendMessage(_sprite4, 0x4808, 0); else - _sprite4->sendMessage(0x4809, 0, this); + sendMessage(_sprite4, 0x4809, 0); } break; case 0x4826: - _klayman->sendEntityMessage(0x1014, _class607, this); + sendEntityMessage(_klayman, 0x1014, _class607); setMessageList(0x004B8988); break; case 0x482A: @@ -2779,7 +2779,7 @@ void AsScene2207Elevator::update() { if (_destPointIndex + _destPointIndexDelta < _pointIndex) { _pointIndex--; if (_pointIndex == 0) - _parentScene->sendMessage(0x2003, 0, this); + sendMessage(_parentScene, 0x2003, 0); setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); _newHashListIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { @@ -2793,15 +2793,15 @@ void AsScene2207Elevator::update() { } if (_pointIndex > 20 && _surface->getPriority() != 900) { - _parentScene->sendMessage(0x2002, 900, this); + sendMessage(_parentScene, 0x2002, 900); } else if (_pointIndex < 20 && _surface->getPriority() != 1100) { - _parentScene->sendMessage(0x2002, 1100, this); + sendMessage(_parentScene, 0x2002, 1100); } AnimatedSprite::update(); if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) { - _parentScene->sendMessage(0x2004, 0, this); + sendMessage(_parentScene, 0x2004, 0); _isMoving = false; } @@ -2870,7 +2870,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - _parentScene->sendMessage(0x4826, 0, this); + sendMessage(_parentScene, 0x4826, 0); messageResult = 1; break; case 0x3002: @@ -2884,10 +2884,10 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m stLeverDown(); break; case 0x482A: - _parentScene->sendMessage(0x1022, 990, this); + sendMessage(_parentScene, 0x1022, 990); break; case 0x482B: - _parentScene->sendMessage(0x1022, 1010, this); + sendMessage(_parentScene, 0x1022, 1010); break; } return messageResult; @@ -2900,7 +2900,7 @@ void AsScene2207Lever::stLeverDown() { } void AsScene2207Lever::stLeverDownEvent() { - _parentScene->sendMessage(0x480F, 0, this); + sendMessage(_parentScene, 0x480F, 0); } void AsScene2207Lever::stLeverUp() { @@ -2911,7 +2911,7 @@ void AsScene2207Lever::stLeverUp() { } void AsScene2207Lever::stLeverUpEvent() { - _parentScene->sendMessage(0x4807, 0, this); + sendMessage(_parentScene, 0x4807, 0); } AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) @@ -3084,9 +3084,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL)); - _ssMaskPart1 = addSprite(new StaticSprite(_vm, 0xE20A28A0, 1200)); - _ssMaskPart2 = addSprite(new StaticSprite(_vm, 0x688F62A5, 1100)); - _ssMaskPart3 = addSprite(new StaticSprite(_vm, 0x0043B038, 1100)); + _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); + _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); + _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); _asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); @@ -3126,7 +3126,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL)); - _ssMaskPart1 = addSprite(new StaticSprite(_vm, 0x980E46A4, 1200)); + _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0)); addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1)); @@ -3154,9 +3154,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B38B8); - _klayman->sendEntityMessage(0x1014, _asElevator, this); - _klayman->sendMessage(0x2001, 0, this); - _asElevator->sendMessage(0x2000, 480, this); + sendEntityMessage(_klayman, 0x1014, _asElevator); + sendMessage(_klayman, 0x2001, 0); + sendMessage(_asElevator, 0x2000, 480); _soundResource2.load(calcHash("fxFogHornSoft")); @@ -3179,35 +3179,35 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x0014F275) { if (_klaymanAtElevator) { - _asElevator->sendMessage(0x2000, _mouseClickPos.y, this); - _klayman->sendEntityMessage(0x1014, _asElevator, this); - _klayman->sendMessage(0x2001, 0, this); + sendMessage(_asElevator, 0x2000, _mouseClickPos.y); + sendEntityMessage(_klayman, 0x1014, _asElevator); + sendMessage(_klayman, 0x2001, 0); } else { messageList402220(); } } else if (param.asInteger() == 0x34569073) { if (_klaymanAtElevator) { _messageListFlag1 = true; - _asElevator->sendMessage(0x2000, 0, this); - _klayman->sendEntityMessage(0x1014, _asElevator, this); - _klayman->sendMessage(0x2001, 0, this); + sendMessage(_asElevator, 0x2000, 0); + sendEntityMessage(_klayman, 0x1014, _asElevator); + sendMessage(_klayman, 0x2001, 0); } else { messageList402220(); } } else if (param.asInteger() == 0x4054C877) { if (_klaymanAtElevator) { - _asElevator->sendMessage(0x2000, 480, this); - _klayman->sendEntityMessage(0x1014, _asElevator, this); - _klayman->sendMessage(0x2001, 0, this); + sendMessage(_asElevator, 0x2000, 480); + sendEntityMessage(_klayman, 0x1014, _asElevator); + sendMessage(_klayman, 0x2001, 0); } else { messageList402220(); } } else if (param.asInteger() == 0x0CBC6211) { - _klayman->sendEntityMessage(0x1014, _asElevator, this); - _klayman->sendMessage(0x2001, 0, this); + sendEntityMessage(_klayman, 0x1014, _asElevator); + sendMessage(_klayman, 0x2001, 0); setRectList(0x004B38B8); } else if (param.asInteger() == 0x402064D8) { - _klayman->sendEntityMessage(0x1014, _ssButton, this); + sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x231DA241) { if (_ssButton) { setMessageList(0x004B38F0); @@ -3223,8 +3223,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit _messageListFlag1 = false; break; case 0x4807: - _asWallRobotAnimation->sendMessage(0x2007, 0, this); - _asWallCannonAnimation->sendMessage(0x2007, 0, this); + sendMessage(_asWallRobotAnimation, 0x2007, 0); + sendMessage(_asWallCannonAnimation, 0x2007, 0); break; case 0x480B: if (sender == _ssButton) { @@ -3238,22 +3238,22 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480F: - _asWallRobotAnimation->sendMessage(0x2006, 0, this); - _asWallCannonAnimation->sendMessage(0x2006, 0, this); + sendMessage(_asWallRobotAnimation, 0x2006, 0); + sendMessage(_asWallCannonAnimation, 0x2006, 0); _asWallRobotAnimation->getSurface()->setVisible(true); _asWallCannonAnimation->getSurface()->setVisible(true); break; case 0x4826: if (sender == _asTape) { if (_klayman->getY() == 423) { - _klayman->sendEntityMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B3958); } } else if (_klaymanAtElevator) { SetMessageHandler(&Scene2207::handleMessage2); - _asElevator->sendMessage(0x2000, 347, this); - _klayman->sendEntityMessage(0x1014, _asElevator, this); - _klayman->sendMessage(0x2001, 0, this); + sendMessage(_asElevator, 0x2000, 347); + sendEntityMessage(_klayman, 0x1014, _asElevator); + sendMessage(_klayman, 0x2001, 0); } break; } @@ -3268,8 +3268,8 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Enti break; case 0x2004: SetMessageHandler(&Scene2207::handleMessage); - _klayman->sendMessage(0x2005, 0, this); - _klayman->sendEntityMessage(0x1014, _asLever, this); + sendMessage(_klayman, 0x2005, 0); + sendEntityMessage(_klayman, 0x1014, _asLever); setMessageList(0x004B3920); setRectList(0x004B3948); break; @@ -3421,7 +3421,7 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 40 || param.asPoint().x >= 600) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; } @@ -3567,7 +3567,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - _klayman->sendEntityMessage(0x1014, _asTape, this); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B3D50); } break; diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 6bd10bbf12..19861ac7ca 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -134,19 +134,9 @@ void Module2300::updateScene2301() { createScene2302(4); _childObject->handleUpdate(); } else { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } - if (_field24 >= 0) { - if (_field24 == 0) { - _parentModule->sendMessage(0x100A, 0, this); - } - _field24 = -1; - } - if (_field26 >= 0) { - _parentModule->sendMessage(0x1023, 0, this); - _field26 = -1; - } } void Module2300::updateScene2302() { @@ -185,9 +175,9 @@ void Module2300::updateScene2302() { createScene2304(1); _childObject->handleUpdate(); } else if (_field20 == 5) { - _parentModule->sendMessage(0x1009, 3, this); + sendMessage(_parentModule, 0x1009, 3); } else { - _parentModule->sendMessage(0x1009, 4, this); + sendMessage(_parentModule, 0x1009, 4); } } } @@ -199,7 +189,7 @@ void Module2300::updateScene2303() { delete _childObject; _childObject = NULL; if (_field20 == 1) { - _parentModule->sendMessage(0x1009, 3, this); + sendMessage(_parentModule, 0x1009, 3); } else { createScene2302(5); _childObject->handleUpdate(); @@ -229,24 +219,12 @@ void Module2300::updateScene2304() { delete _childObject; _childObject = NULL; if (_field20 == 1) { - _parentModule->sendMessage(0x1009, 2, this); + sendMessage(_parentModule, 0x1009, 2); } else { createScene2302(1); _childObject->handleUpdate(); } } - if (_field24 >= 0) { - if (_field24 == 0) { - _parentModule->sendMessage(0x100A, 2, this); - } - _field24 = -1; - } - if (_field26 >= 0) { - if (_field26 == 1) { - _parentModule->sendMessage(0x1023, 2, this); - } - _field26 = -1; - } } void Module2300::updateScene2305() { diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 51940bacd0..2c819a459e 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -286,7 +286,7 @@ void Module3000::updateScene3002() { createScene3010(-1); _childObject->handleUpdate(); } else if (_moduleDoneStatus == 1) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } else { if (_moduleDoneStatus == 0) { @@ -298,7 +298,7 @@ void Module3000::updateScene3002() { _childObject->handleUpdate(); } } else if (_moduleDoneStatus == 1) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } } @@ -325,7 +325,7 @@ void Module3000::updateScene3002b() { createScene3009(-1); break; case 11: - _parentModule->sendMessage(0x1009, 3, this); + sendMessage(_parentModule, 0x1009, 3); break; case 12: createScene3002(0); @@ -431,7 +431,7 @@ void Module3000::updateScene3005() { delete _childObject; _childObject = NULL; if (_moduleDoneStatus == 0) { - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } else if (_moduleDoneStatus == 1) { createScene3008(-1); _childObject->handleUpdate(); @@ -650,7 +650,7 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc void SsScene3009FireCannonButton::update() { StaticSprite::update(); if (_flag1 && !_soundResource.isPlaying()) { - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _surface->setVisible(false); } } @@ -794,7 +794,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; _soundResource.play(); - _asSymbol->sendMessage(0x2005, _incrDecr, this); + sendMessage(_asSymbol, 0x2005, _incrDecr); } messageResult = 1; break; @@ -827,7 +827,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message switch (messageNum) { case 0x1011: if (_enabled) { - _parentScene->sendMessage(0x2002, 0, this); + sendMessage(_parentScene, 0x2002, 0); } messageResult = 1; break; @@ -857,7 +857,7 @@ uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const Messa switch (messageNum) { case 0x1011: if (_enabled) { - _parentScene->sendMessage(0x2004, 0, this); + sendMessage(_parentScene, 0x2004, 0); } messageResult = 1; break; @@ -942,9 +942,9 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶ _newHashListIndex = _symbolIndex; setSubVar(0x00000914, _index, _symbolIndex); if (_index / 3 == 0) { - _parentScene->sendMessage(0x2001, 0, this); + sendMessage(_parentScene, 0x2001, 0); } else { - _parentScene->sendMessage(0x2003, 0, this); + sendMessage(_parentScene, 0x2003, 0); } messageResult = 1; break; @@ -1025,7 +1025,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) // DEBUG: Set the correct code for (int i = 0; i < 6; i++) setSubVar(0x00000914, i, _correctSymbols[i]); - sendMessage(0x2003, 0, this); + sendMessage(this, 0x2003, 0); //setGlobalVar(0x610210B7, 1); } @@ -1108,7 +1108,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO: Debug stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) { setGlobalVar(0x20580A86, 0); - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x000D: @@ -1191,7 +1191,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene3009::playExtVideo() { setGlobalVar(0x20580A86, _cannonLocation); setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]); - _parentModule->sendMessage(0x1009, 1, this); + sendMessage(_parentModule, 0x1009, 1); } bool Scene3009::isSymbolsPart1Solved() { @@ -1303,9 +1303,9 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar _soundResource3.play(); _surface->setVisible(true); _buttonLocked = true; - _parentScene->sendMessage(0x2000, _buttonIndex, this); + sendMessage(_parentScene, 0x2000, _buttonIndex); } else { - _parentScene->sendMessage(0x2002, _buttonIndex, this); + sendMessage(_parentScene, 0x2002, _buttonIndex); } _needRefresh = true; StaticSprite::update(); @@ -1418,7 +1418,7 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) { void AsScene3010DeadBolt::stIdleMessage() { setFileHash1(); SetMessageHandler(&Sprite::handleMessage); - _parentScene->sendMessage(0x2001, _boltIndex, this); + sendMessage(_parentScene, 0x2001, _boltIndex); } void AsScene3010DeadBolt::lock() { @@ -1454,7 +1454,7 @@ void AsScene3010DeadBolt::stDisabled() { void AsScene3010DeadBolt::stDisabledMessage() { _surface->setVisible(false); - _parentScene->sendMessage(0x2003, _boltIndex, this); + sendMessage(_parentScene, 0x2003, _boltIndex); } Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1513,7 +1513,7 @@ void Scene3010::update() { _checkUnlocked = false; } if (_countdown != 0 && (--_countdown == 0)) { - _parentModule->sendMessage(0x1009, _doorUnlocked ? 1 : 0, this); + sendMessage(_parentModule, 0x1009, _doorUnlocked ? 1 : 0); } } @@ -1646,7 +1646,7 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶ if (_countdown == 0) { _surface->setVisible(true); _countdown = 4; - _parentScene->sendMessage(0x2000, 0, this); + sendMessage(_parentScene, 0x2000, 0); _soundResource.play(); } messageResult = 1; @@ -1797,7 +1797,7 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x2000: diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 7bc1551250..6b36571252 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -55,7 +55,7 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint _vm->_screen->clear(); - _parentModule->sendMessage(0x100A, _navigationIndex, this); + sendMessage(_parentModule, 0x100A, _navigationIndex); } @@ -68,7 +68,7 @@ int NavigationScene::getNavigationAreaType() { NPoint mousePos; mousePos.x = _mouseCursor->getX(); mousePos.y = _mouseCursor->getY(); - return _mouseCursor->sendPointMessage(0x2064, mousePos, this); + return sendPointMessage(_mouseCursor, 0x2064, mousePos); } void NavigationScene::update() { @@ -80,7 +80,7 @@ void NavigationScene::update() { _smackerFileHash = 0; } else if (_smackerDone) { if (_done) { - _parentModule->sendMessage(0x1009, _navigationIndex, this); + sendMessage(_parentModule, 0x1009, _navigationIndex); } else { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; createMouseCursor(); @@ -93,7 +93,7 @@ void NavigationScene::update() { _smackerDone = false; _smackerPlayer->open(navigationItem.fileHash, true); _vm->_screen->clear(); - _parentModule->sendMessage(0x100A, _navigationIndex, this); + sendMessage(_parentModule, 0x100A, _navigationIndex); } } Scene::update(); @@ -103,7 +103,7 @@ uint32 NavigationScene::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x0000: if (_interactive) - _mouseCursor->sendMessage(0x4002, param, this); + sendMessage(_mouseCursor, 0x4002, param); break; case 0x0001: if (_interactive) @@ -144,7 +144,7 @@ void NavigationScene::createMouseCursor() { } _mouseCursor = addSprite(new NavigationMouse(_vm, mouseCursorFileHash, areaType)); - _mouseCursor->sendPointMessage(0x4002, _vm->getMousePos(), this); + sendPointMessage(_mouseCursor, 0x4002, _vm->getMousePos()); } @@ -153,7 +153,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; bool oldSoundFlag1 = _soundFlag1; bool oldSoundFlag2 = _soundFlag2; - uint32 direction = _mouseCursor->sendPointMessage(0x2064, mousePos, this); + uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos); switch (direction) { // TODO: Merge cases 0 and 1? @@ -170,7 +170,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(0x4200189E, _navigationIndex); } else { - _parentModule->sendMessage(0x1009, _navigationIndex, this); + sendMessage(_parentModule, 0x1009, _navigationIndex); } break; case 1: @@ -186,14 +186,14 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(0x4200189E, _navigationIndex); } else { - _parentModule->sendMessage(0x1009, _navigationIndex, this); + sendMessage(_parentModule, 0x1009, _navigationIndex); } break; case 2: case 3: case 4: if (navigationItem.middleFlag) { - _parentModule->sendMessage(0x1009, _navigationIndex, this); + sendMessage(_parentModule, 0x1009, _navigationIndex); } else if (navigationItem.middleSmackerFileHash != 0) { _smackerFileHash = navigationItem.middleSmackerFileHash; _interactive = false; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 8192216432..c6f9f127fb 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -178,6 +178,18 @@ Background *Scene::addBackground(Background *background) { return background; } +void Scene::setBackground(uint32 fileHash, bool dirtyBackground) { + _background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0)); +} + +void Scene::changeBackground(uint32 fileHash) { + _background->load(fileHash); +} + +Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { + return addSprite(new StaticSprite(_vm, fileHash, surfacePriority)); +} + SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) { addEntity(smackerPlayer); addSurface(smackerPlayer->getSurface()); @@ -202,12 +214,12 @@ void Scene::update() { if (_klayman) { // TODO: Merge later if (_klayman->hasMessageHandler() && - _klayman->sendMessage(0x1008, 0, this) != 0 && + sendMessage(_klayman, 0x1008, 0) != 0 && _messageListFlag && queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; } else if (_klayman->hasMessageHandler() && - _klayman->sendMessage(0x1008, 0, this) != 0 && + sendMessage(_klayman, 0x1008, 0) != 0 && _messageListFlag) { _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); } @@ -230,7 +242,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s switch (messageNum) { case 0: // mouse moved if (_mouseCursor && _mouseCursor->hasMessageHandler()) - _mouseCursor->sendMessage(0x4002, param, this); + sendMessage(_mouseCursor, 0x4002, param); // TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y); break; case 1: // mouse clicked @@ -253,13 +265,13 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s #endif break; case 6: - _parentModule->sendMessage(0x1009, param, this); + sendMessage(_parentModule, 0x1009, param); break; case 0x1006: if (_messageListFlag1) { _messageListFlag1 = false; if (_messageListIndex == _messageListCount) - _klayman->sendMessage(0x4004, 0, this); + sendMessage(_klayman, 0x4004, 0); else { runMessageList(); } @@ -269,7 +281,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s if (_messageListFlag1) { _messageListFlag1 = false; _messageList = NULL; - _klayman->sendMessage(0x4004, 0, this); + sendMessage(_klayman, 0x4004, 0); } break; case 0x101D: @@ -281,7 +293,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s case 0x101E: if (_prevVisible && _mouseCursor) { _mouseCursor->getSurface()->setVisible(false); - // TODO _mouseCursor->sendMessage(0x4002, g_Screen->_mousePos, this); + // TODO sendMessage(_mouseCursor, 0x4002, g_Screen->_mousePos); } break; case 0x1022: @@ -322,7 +334,7 @@ bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) { Sprite *sprite = _vm->_collisionMan->getSprite(i); if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && - sprite->sendPointMessage(0x1011, _mouseClickPos, this) != 0) { + sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) { return true; } } @@ -369,7 +381,7 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool _messageListFlag = messageListFlag; _systemCallbackFlag = systemCallbackFlag; _messageListStatus = 1; - _klayman->sendMessage(0x101C, 0, this); + sendMessage(_klayman, 0x101C, 0); // DEBUG: Show message list for (uint i = 0; i < messageList->size(); i++) { @@ -397,7 +409,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool if (_messageListStatus == 1) { if (messageList != _messageList2) { if (_messageValue >= 0) { - _parentModule->sendMessage(0x1023, _messageValue, this); + sendMessage(_parentModule, 0x1023, _messageValue); _messageValue = -1; } _messageList2 = messageList; @@ -407,7 +419,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool } else if (_messageListStatus == 2) { if (messageList == _messageList2) { if (_messageValue >= 0) { - _parentModule->sendMessage(0x1023, _messageValue, this); + sendMessage(_parentModule, 0x1023, _messageValue); _messageValue = -1; } _messageList2 = messageList; @@ -416,7 +428,7 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool } } else { if (_messageValue >= 0) { - _parentModule->sendMessage(0x1023, _messageValue, this); + sendMessage(_parentModule, 0x1023, _messageValue); _messageValue = -1; } _messageList2 = messageList; @@ -449,22 +461,22 @@ void Scene::runMessageList() { _messageListIndex++; if (_messageListIndex == _messageListCount) { - _klayman->sendMessage(0x1021, 0, this); + sendMessage(_klayman, 0x1021, 0); } if (_systemCallbackFlag) { messageNum = convertMessageNum(messageNum); } if (messageNum != 0x4003) { if (messageNum == 0x1009 || messageNum == 0x1024) { - _parentModule->sendMessage(messageNum, messageParam, this); + sendMessage(_parentModule, messageNum, messageParam); } else if (messageNum == 0x100A) { _messageValue = messageParam; - _parentModule->sendMessage(messageNum, messageParam, this); + sendMessage(_parentModule, messageNum, messageParam); } else if (messageNum == 0x4001) { _messageListFlag1 = true; - _klayman->sendPointMessage(0x4001, _mouseClickPos, this); + sendPointMessage(_klayman, 0x4001, _mouseClickPos); } else if (messageNum == 0x100D) { - if (this->hasMessageHandler() && this->sendMessage(0x100D, messageParam, this) != 0) + if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0) continue; } else if (messageNum == 0x101A) { _messageListStatus = 0; @@ -473,13 +485,13 @@ void Scene::runMessageList() { } else if (messageNum == 0x1020) { _messageListFlag = false; } else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) { - if (this->hasMessageHandler() && this->sendMessage(messageNum, messageParam, this) != 0) { + if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) { _messageListFlag2 = false; return; } } else { _messageListFlag1 = true; - if (_klayman->hasMessageHandler() && _klayman->sendMessage(messageNum, messageParam, this) != 0) { + if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) { _messageListFlag1 = false; } } @@ -499,7 +511,7 @@ void Scene::messageList402220() { _messageListFlag1 = false; _messageList = NULL; _messageListFlag = true; - _klayman->sendMessage(0x4004, 0, this); + sendMessage(_klayman, 0x4004, 0); } void Scene::setRectList(uint32 id) { diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index e3ed273d42..067e86f5fc 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -37,6 +37,8 @@ namespace Neverhood { +#define InsertKlayman(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) + class Scene : public Entity { public: Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); @@ -50,6 +52,9 @@ public: void setSurfacePriority(BaseSurface *surface, int priority); void deleteSprite(Sprite **sprite); Background *addBackground(Background *background); + void setBackground(uint32 fileHash, bool dirtyBackground = true); + void changeBackground(uint32 fileHash); + Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); protected: diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 0ebec5ee9f..9ae7e14eed 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -176,7 +176,7 @@ void SmackerPlayer::update() { if (_smackerDecoder->endOfVideo() && !_keepLastFrame) { // Inform the scene about the end of the video playback if (_scene) { - _scene->sendMessage(0x3002, 0, this); + sendMessage(_scene, 0x3002, 0); } _flag2 = true; } else { @@ -194,7 +194,7 @@ void SmackerPlayer::update() { } else if (!_keepLastFrame) { // Inform the scene about the end of the video playback if (_scene) { - _scene->sendMessage(0x3002, 0, this); + sendMessage(_scene, 0x3002, 0); } _flag2 = true; } else { diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index ace77f9284..ae290631a9 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -73,7 +73,7 @@ void SmackerScene::nextVideo() { uint32 smackerFileHash = _fileHashList[_fileHashListIndex]; if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) { // Not a Smacker file - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); return; } _fieldDF = getSubVar(0x00800410, smackerFileHash); @@ -89,7 +89,7 @@ void SmackerScene::nextVideo() { _smackerPlayer->open(smackerFileHash, false); } } else { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } } @@ -111,7 +111,7 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam ¶m, En break; case 0x000C: if (_canAbort) { - _parentModule->sendMessage(0x1009, 0, this); + sendMessage(_parentModule, 0x1009, 0); } break; case 0x3002: diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index deb54af8e1..828c0dd08e 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -392,7 +392,7 @@ void AnimatedSprite::updateFrameIndex() { } else { // Inform self about end of current animation // The caller can then e.g. set a new animation fileHash - sendMessage(0x3002, 0, this); + sendMessage(this, 0x3002, 0); if (_fileHash1 == 0) _frameIndex = 0; } @@ -400,7 +400,7 @@ void AnimatedSprite::updateFrameIndex() { if (_frameIndex > 0) { _frameIndex--; } else { - sendMessage(0x3002, 0, this); + sendMessage(this, 0x3002, 0); if (_fileHash1 == 0) _frameIndex = _frameIndex2; } @@ -424,7 +424,7 @@ void AnimatedSprite::updateFrameInfo() { _needRefresh = true; if (frameInfo.frameHash != 0) { - sendMessage(0x100D, frameInfo.frameHash, this); + sendMessage(this, 0x100D, frameInfo.frameHash); } } -- cgit v1.2.3 From cac9a090e7fad2a9d8951b969816d0199c7133a8 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Sep 2011 12:30:49 +0000 Subject: NEVERHOOD: Use insertStaticSprite --- engines/neverhood/module1200.cpp | 22 +++++++++--------- engines/neverhood/module1300.cpp | 48 ++++++++++++++++++++-------------------- engines/neverhood/module1400.cpp | 18 +++++++-------- engines/neverhood/module1700.cpp | 4 ++-- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module3000.cpp | 2 +- 6 files changed, 48 insertions(+), 48 deletions(-) diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 163fc63a15..5a564ccfa1 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -816,16 +816,16 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); - tempSprite = addSprite(new StaticSprite(_vm, 0x03C82530, 100)); + tempSprite = insertStaticSprite(0x03C82530, 100); topY1 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; - tempSprite = addSprite(new StaticSprite(_vm, 0x88182069, 200)); + tempSprite = insertStaticSprite(0x88182069, 200); topY2 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; - tempSprite = addSprite(new StaticSprite(_vm, 0x476014E0, 300)); + tempSprite = insertStaticSprite(0x476014E0, 300); topY3 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; - tempSprite = addSprite(new StaticSprite(_vm, 0x04063110, 500)); + tempSprite = insertStaticSprite(0x04063110, 500); topY4 = tempSprite->getY() + 1; _class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1)); @@ -834,12 +834,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _class466->getSurface()->getClipRect().x2 = 640; _class466->getSurface()->getClipRect().y2 = 480; - addSprite(new StaticSprite(_vm, 0x400B04B0, 1200)); + insertStaticSprite(0x400B04B0, 1200); - tempSprite = addSprite(new StaticSprite(_vm, 0x40295462, 1200)); + tempSprite = insertStaticSprite(0x40295462, 1200); x1 = tempSprite->getX(); - tempSprite = addSprite(new StaticSprite(_vm, 0xA29223FA, 1200)); + tempSprite = insertStaticSprite(0xA29223FA, 1200); x2 = tempSprite->getX() + tempSprite->getSurface()->getDrawRect().width; class464 = addSprite(new Class464(_vm)); @@ -892,7 +892,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x000CF819)) { - addSprite(new StaticSprite(_vm, 0x10002ED8, 500)); + insertStaticSprite(0x10002ED8, 500); if (!getGlobalVar(0x0A18CA33)) { AsScene1201TntMan *asTntMan; asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1); @@ -940,7 +940,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } else { - addSprite(new StaticSprite(_vm, 0x8E8A1981, 900)); + insertStaticSprite(0x8E8A1981, 900); uint32 tntIndex = 0; while (tntIndex < 18) { @@ -968,7 +968,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } - tempSprite = addSprite(new StaticSprite(_vm, 0x63D400BC, 900)); + tempSprite = insertStaticSprite(0x63D400BC, 900); _asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman)); _asLeftDoor->getSurface()->getClipRect().x1 = x1; @@ -1207,7 +1207,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTntItems[i]); } - addSprite(new StaticSprite(_vm, 0x8E8419C1, 1100)); + insertStaticSprite(0x8E8419C1, 1100); if (getGlobalVar(0x000CF819)) { SetMessageHandler(&Scene1202::handleMessage453D90); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index b8b7b8b54f..d148018d47 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -645,10 +645,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL)); _class595 = addSprite(new Class595(_vm, this)); - _sprite1 = addSprite(new StaticSprite(_vm, 0x942FC224, 300)); - _sprite2 = addSprite(new StaticSprite(_vm, 0x70430830, 1200)); + _sprite1 = insertStaticSprite(0x942FC224, 300); + _sprite2 = insertStaticSprite(0x70430830, 1200); _sprite2->getSurface()->setVisible(false); - _sprite3 = addSprite(new StaticSprite(_vm, 0x16E01E20, 1100)); + _sprite3 = insertStaticSprite(0x16E01E20, 1100); _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false)); _asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x13206309))); @@ -875,7 +875,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asBalloon); } - _sprite1 = addSprite(new StaticSprite(_vm, 0xA014216B, 1100)); + _sprite1 = insertStaticSprite(0xA014216B, 1100); _klayman = new KmScene1303(_vm, this, 207, 332); addSprite(_klayman); @@ -958,9 +958,9 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) _class544 = NULL; } - _sprite1 = addSprite(new StaticSprite(_vm, 0x0562E621, 1100)); - addSprite(new StaticSprite(_vm, 0x012AE033, 1100)); - addSprite(new StaticSprite(_vm, 0x090AF033, 1100)); + _sprite1 = insertStaticSprite(0x0562E621, 1100); + insertStaticSprite(0x012AE033, 1100); + insertStaticSprite(0x090AF033, 1100); if (which < 0) { _klayman = new KmScene1304(_vm, this, 217, 347); @@ -1148,9 +1148,9 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) _asElevator = addSprite(new AsScene1306Elevator(_vm, this, _asElevatorDoor)); - _sprite1 = addSprite(new StaticSprite(_vm, 0x036A1EE0, 80)); + _sprite1 = insertStaticSprite(0x036A1EE0, 80); - addSprite(new StaticSprite(_vm, 0x00042313, 1100)); + insertStaticSprite(0x00042313, 1100); if (which < 0) { _klayman = new KmScene1306(_vm, this, 380, 440); @@ -1540,25 +1540,25 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); _mouseCursor = addSprite(new Mouse435(_vm, 0x06204A88, 20, 620)); - tempSprite = addSprite(new StaticSprite(_vm, 0x00A3621C, 800)); + tempSprite = insertStaticSprite(0x00A3621C, 800); _clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x; _clipRects[0].y1 = 0; _clipRects[0].x2 = 640; _clipRects[0].y2 = 480; - tempSprite = addSprite(new StaticSprite(_vm, 0x00A3641C, 600)); + tempSprite = insertStaticSprite(0x00A3641C, 600); _clipRects[1].x1 = tempSprite->getSurface()->getDrawRect().x; _clipRects[1].y1 = 0; _clipRects[1].x2 = 640; _clipRects[1].y2 = 480; - tempSprite = addSprite(new StaticSprite(_vm, 0x00A3681C, 400)); + tempSprite = insertStaticSprite(0x00A3681C, 400); _clipRects[2].x1 = tempSprite->getSurface()->getDrawRect().x; _clipRects[2].y1 = 0; _clipRects[2].x2 = 640; _clipRects[2].y2 = 480; - tempSprite = addSprite(new StaticSprite(_vm, 0x00A3701C, 200)); + tempSprite = insertStaticSprite(0x00A3701C, 200); _clipRects[3].x1 = tempSprite->getSurface()->getDrawRect().x; _clipRects[3].y1 = 0; _clipRects[3].x2 = 640; @@ -1866,7 +1866,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) addSprite(new AnimatedSprite(_vm, 0x461A1490, 200, 235, 429)); } - _sprite1 = addSprite(new StaticSprite(_vm, 0x0A042060, 1100)); + _sprite1 = insertStaticSprite(0x0A042060, 1100); _class549 = addSprite(new Class549(_vm, this)); _class593 = addSprite(new Class593(_vm, this)); @@ -1874,28 +1874,28 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1)); _class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2)); - _sprite2 = addSprite(new StaticSprite(_vm, 0x40043120, 995)); - _sprite3 = addSprite(new StaticSprite(_vm, 0x43003100, 995)); + _sprite2 = insertStaticSprite(0x40043120, 995); + _sprite3 = insertStaticSprite(0x43003100, 995); _sprite4 = NULL; if (which < 0) { _klayman = new KmScene1308(_vm, this, 380, 440); setMessageList(0x004B57C0); if (getGlobalVar(0x80455A41)) { - _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + _sprite4 = insertStaticSprite(0x0101A624, 1100); setRectList(0x004B5990); } else { - _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + _sprite5 = insertStaticSprite(0x080811A0, 100); setRectList(0x004B5980); } } else if (which == 1) { _klayman = new KmScene1308(_vm, this, 640, 440); setMessageList(0x004B57C8); if (getGlobalVar(0x80455A41)) { - _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + _sprite4 = insertStaticSprite(0x0101A624, 1100); setRectList(0x004B5990); } else { - _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + _sprite5 = insertStaticSprite(0x080811A0, 100); setRectList(0x004B5980); } } else if (which == 2) { @@ -1903,10 +1903,10 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B58B0); if (getGlobalVar(0x80455A41)) { _sprite5 = addSprite(new Class592(_vm, this)); - _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + _sprite4 = insertStaticSprite(0x0101A624, 1100); _sprite4->getSurface()->setVisible(false); } else { - _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + _sprite5 = insertStaticSprite(0x080811A0, 100); setRectList(0x004B5980); } } else { @@ -1915,10 +1915,10 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(_class549, 0x4808, 0); _sprite1->getSurface()->setVisible(false); if (getGlobalVar(0x80455A41)) { - _sprite4 = addSprite(new StaticSprite(_vm, 0x0101A624, 1100)); + _sprite4 = insertStaticSprite(0x0101A624, 1100); _klayman->getSurface()->setVisible(false); } else { - _sprite5 = addSprite(new StaticSprite(_vm, 0x080811A0, 100)); + _sprite5 = insertStaticSprite(0x080811A0, 100); _klayman->getSurface()->setVisible(false); } } diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 60e52794f7..5dc74787a1 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -769,11 +769,11 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _class527 = addSprite(new Class527(_vm, _class525)); } - _sprite3 = addSprite(new StaticSprite(_vm, 0xA82BA811, 1100)); - addSprite(new StaticSprite(_vm, 0x0A116C60, 1100)); + _sprite3 = insertStaticSprite(0xA82BA811, 1100); + insertStaticSprite(0x0A116C60, 1100); _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0)); - _sprite1 = addSprite(new StaticSprite(_vm, 0x38EA100C, 1005)); - _sprite2 = addSprite(new StaticSprite(_vm, 0x98D0223C, 1200)); + _sprite1 = insertStaticSprite(0x38EA100C, 1005); + _sprite2 = insertStaticSprite(0x98D0223C, 1200); _sprite2->getSurface()->setVisible(false); if (which < 0) { @@ -1388,7 +1388,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) _mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620)); _asMouse = addSprite(new AsScene1407Mouse(_vm, this)); - _ssResetButton = addSprite(new StaticSprite(_vm, 0x12006600, 100)); + _ssResetButton = insertStaticSprite(0x12006600, 100); _ssResetButton->getSurface()->setVisible(false); } @@ -1453,12 +1453,12 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL)); - _class401_1 = addSprite(new StaticSprite(_vm, 0x01102A33, 100)); + _class401_1 = insertStaticSprite(0x01102A33, 100); _class401_1->getSurface()->setVisible(false); - _class401_2 = addSprite(new StaticSprite(_vm, 0x04442520, 995)); + _class401_2 = insertStaticSprite(0x04442520, 995); - _class401_3 = addSprite(new StaticSprite(_vm, 0x08742271, 995)); + _class401_3 = insertStaticSprite(0x08742271, 995); _asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011); addSprite(_asTape1); @@ -1583,7 +1583,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_class545); } - _sprite1 = addSprite(new StaticSprite(_vm, 0x1900A1F8, 1100)); + _sprite1 = insertStaticSprite(0x1900A1F8, 1100); _asTape = addSprite(new AsScene1201Tape(_vm, this, 14, 1100, 281, 411, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index b281b38464..30fe95297b 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -254,7 +254,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1)); addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2)); - _sprite = addSprite(new StaticSprite(_vm, 0x31313A22, 1100)); + _sprite = insertStaticSprite(0x31313A22, 1100); _class606 = addSprite(new Class606(_vm, this, 15, 1100, 238, 439, 0x02363852)); _vm->_collisionMan->addSprite(_class606); @@ -301,7 +301,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(_klayman, 0x2000, 0); setMessageList(0x004B69F0); sendMessage(this, 0x2000, 0); - tempSprite = addSprite(new StaticSprite(_vm, 0x30303822, 1100)); + tempSprite = insertStaticSprite(0x30303822, 1100); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 1af7799196..ecd4e705a3 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -139,7 +139,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL)); - _class401 = addSprite(new StaticSprite(_vm, 0x0D641724, 1100)); + _class401 = insertStaticSprite(0x0D641724, 1100); if (which < 0) { _klayman = new KmScene2001(_vm, this, 300, 345); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 2c819a459e..009895cb25 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1000,7 +1000,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _smackerPlayer->setDrawPos(89, 37); _palette->usePalette(); - addSprite(new StaticSprite(_vm, 0x8540252C, 400)); + insertStaticSprite(0x8540252C, 400); for (int i = 0; i < 2; i++) { _ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i); -- cgit v1.2.3 From 4a88ce37ddfc66d124e0e7bb8f6e3f87f993083a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Sep 2011 13:23:03 +0000 Subject: NEVERHOOD: Use InsertKlayman --- engines/neverhood/klayman.cpp | 19 +++++++++-- engines/neverhood/klayman.h | 11 +++---- engines/neverhood/module1000.cpp | 29 ++++++++--------- engines/neverhood/module1200.cpp | 16 ++++----- engines/neverhood/module1300.cpp | 44 +++++++++++-------------- engines/neverhood/module1400.cpp | 34 +++++++++---------- engines/neverhood/module1700.cpp | 12 +++---- engines/neverhood/module2000.cpp | 11 +++---- engines/neverhood/module2200.cpp | 70 ++++++++++++++++++---------------------- engines/neverhood/scene.h | 3 +- 10 files changed, 118 insertions(+), 131 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index e0ca57ceca..7102870f1e 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2125,6 +2125,11 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } +void KmScene1002::init(Sprite *class599, Sprite *ssLadderArch) { + _class599 = class599; + _ssLadderArch = ssLadderArch; +} + void KmScene1002::xUpdate() { if (_x >= 250 && _x <= 435 && _y >= 420) { if (_status == 0) { @@ -2692,14 +2697,18 @@ void KmScene1004::sub478170() { // KmScene1201 -KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) { +KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) { // TODO setKlaymanTable(dword_4AEF10, 3); _flagF6 = true; } +void KmScene1201::init(Entity *class464) { + _class464 = class464; +} + uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: @@ -3872,7 +3881,7 @@ void KmScene2001::sub440270() { SetMessageHandler(&KmScene2001::handleMessage4401A0); } -KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk) +KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) // TODO: NRect *rect1, int16 unk in Klayman ctor : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -3880,6 +3889,10 @@ KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 _flagF6 = false; } +void KmScene2201::init(NRect *clipRects, int clipRectsCount) { + // TODO +} + uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 23bd110568..a25176eefd 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -261,10 +261,7 @@ protected: class KmScene1002 : public Klayman { public: KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); - void init(Sprite *class599, Sprite *ssLadderArch) { - _class599 = class599; - _ssLadderArch = ssLadderArch; - } + void init(Sprite *class599, Sprite *ssLadderArch); protected: Sprite *_class599; Sprite *_ssLadderArch; @@ -310,7 +307,8 @@ protected: class KmScene1201 : public Klayman { public: - KmScene1201(NeverhoodEngine *vm, Entity *parentScene, Entity *class464, int16 x, int16 y); + KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + void init(Entity *class464); protected: Entity *_class464; int _countdown; @@ -431,7 +429,8 @@ protected: class KmScene2201 : public Klayman { public: - KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *rect1, int16 unk); + KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + void init(NRect *clipRects, int clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 011ea9e1de..7c3c3ba138 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -410,27 +410,26 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { setRectList(0x004B49F0); - _klayman = new KmScene1001(_vm, this, 200, 433); + InsertKlayman(KmScene1001, 200, 433); setMessageList(0x004B4888); } else if (which == 1) { setRectList(0x004B49F0); - _klayman = new KmScene1001(_vm, this, 640, 433); + InsertKlayman(KmScene1001, 640, 433); setMessageList(0x004B4898); } else if (which == 2) { setRectList(0x004B49F0); if (getGlobalVar(0xC0418A02)) { - _klayman = new KmScene1001(_vm, this, 390, 433); + InsertKlayman(KmScene1001, 390, 433); _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene1001(_vm, this, 300, 433); + InsertKlayman(KmScene1001, 300, 433); } setMessageList(0x004B4970); } else { setRectList(0x004B4A00); - _klayman = new KmScene1001(_vm, this, 200, 433); + InsertKlayman(KmScene1001, 200, 433); setMessageList(0x004B4890); } - addSprite(_klayman); tempSprite = insertStaticSprite(0x2080A3A8, 1300); @@ -1425,7 +1424,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { if (_vm->_gameState.field2 == 0) { - InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch)); + InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); _klayman->getSurface()->getClipRect().x1 = 31; @@ -1435,7 +1434,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { - InsertKlayman(KmScene1002, 379, 435, (_class599, _ssLadderArch)); + InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; @@ -1445,7 +1444,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); } } else if (which == 1) { - InsertKlayman(KmScene1002, 650, 435, (_class599, _ssLadderArch)); + InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; @@ -1455,7 +1454,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _vm->_gameState.field2 = 1; } else if (which == 2) { - InsertKlayman(KmScene1002, 68, 645, (_class599, _ssLadderArch)); + InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4298); _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; @@ -1466,7 +1465,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_gameState.field2 = 1; sendMessage(_klayman, 0x4820, 0); } else { - InsertKlayman(KmScene1002, 90, 226, (_class599, _ssLadderArch)); + InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4470); _klayman->getSurface()->getClipRect().x1 = 31; @@ -1766,20 +1765,18 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { setRectList(0x004B7C70); - _klayman = new KmScene1004(_vm, this, 330, 327); + InsertKlayman(KmScene1004, 330, 327); setMessageList(0x004B7C18); } else if (which == 1) { setRectList(0x004B7C70); - _klayman = new KmScene1004(_vm, this, 330, 327); + InsertKlayman(KmScene1004, 330, 327); setMessageList(0x004B7C08); } else { loadDataResource(0x01900A04); - _klayman = new KmScene1004(_vm, this, _dataResource.getPoint(0x80052A29).x, 27); + InsertKlayman(KmScene1004, _dataResource.getPoint(0x80052A29).x, 27); setMessageList(0x004B7BF0); } - addSprite(_klayman); - updatePaletteArea(); _class478 = addSprite(new Class478(_vm, _klayman)); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 5a564ccfa1..212fc874c6 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -845,29 +845,29 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) class464 = addSprite(new Class464(_vm)); if (which < 0) { - _klayman = new KmScene1201(_vm, this, class464, 364, 333); + InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464)); setMessageList(0x004AEC08); } else if (which == 3) { - _klayman = new KmScene1201(_vm, this, class464, 400, 329); + InsertKlaymanInitArgs(KmScene1201, 400, 329, (class464)); setMessageList(0x004AEC08); } else if (which == 2) { if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { - _klayman = new KmScene1201(_vm, this, class464, 374, 333); + InsertKlaymanInitArgs(KmScene1201, 374, 333, (class464)); setMessageList(0x004AEC08); } else { - _klayman = new KmScene1201(_vm, this, class464, 640, 329); + InsertKlaymanInitArgs(KmScene1201, 640, 329, (class464)); setMessageList(0x004AEC20); } } else if (which == 1) { if (getGlobalVar(0xC0418A02)) { - _klayman = new KmScene1201(_vm, this, class464, 364, 333); + InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464)); _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene1201(_vm, this, class464, 246, 333); + InsertKlaymanInitArgs(KmScene1201, 246, 333, (class464)); } setMessageList(0x004AEC30); } else { - _klayman = new KmScene1201(_vm, this, class464, 0, 336); + InsertKlaymanInitArgs(KmScene1201, 0, 336, (class464)); setMessageList(0x004AEC10); } @@ -877,8 +877,6 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().y2 = 480; _klayman->setRepl(64, 0); - addSprite(_klayman); - if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { _background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0)); _palette = new Palette(_vm, 0x4019A2C4); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index d148018d47..8085eb681c 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -664,13 +664,12 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; if (which < 0) { -// _klayman = new KmScene1002(_vm, this, _class595, NULL, 380, 364); + InsertKlaymanInitArgs(KmScene1002, 380, 364, (_class595, NULL)); setMessageList(0x004B0868); } else { -// _klayman = new KmScene1002(_vm, this, _class595, NULL, 293, 330); + InsertKlaymanInitArgs(KmScene1002, 293, 330, (_class595, NULL)); setMessageList(0x004B0870); } - addSprite(_klayman); _klayman->getSurface()->getClipRect().x1 = 0; _klayman->getSurface()->getClipRect().y1 = 0; @@ -877,8 +876,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0xA014216B, 1100); - _klayman = new KmScene1303(_vm, this, 207, 332); - addSprite(_klayman); + InsertKlayman(KmScene1303, 207, 332); setMessageList(0x004AF9A0); _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; @@ -963,13 +961,12 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x090AF033, 1100); if (which < 0) { - _klayman = new KmScene1304(_vm, this, 217, 347); + InsertKlayman(KmScene1304, 217, 347); setMessageList(0x004B90E8); } else { - _klayman = new KmScene1304(_vm, this, 100, 347); + InsertKlayman(KmScene1304, 100, 347); setMessageList(0x004B90F0); } - addSprite(_klayman); _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; _klayman->getSurface()->getClipRect().y1 = 0; @@ -1016,13 +1013,12 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) _mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL)); if (which < 0) { - _klayman = new KmScene1305(_vm, this, 212, 441); + InsertKlayman(KmScene1305, 212, 441); setMessageList(0x004B6E40); } else { - _klayman = new KmScene1305(_vm, this, 212, 441); + InsertKlayman(KmScene1305, 212, 441); setMessageList(0x004B6E48); } - addSprite(_klayman); } @@ -1153,45 +1149,45 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x00042313, 1100); if (which < 0) { - _klayman = new KmScene1306(_vm, this, 380, 440); + InsertKlayman(KmScene1306, 380, 440); setMessageList(0x004AFAD0); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 1) { - _klayman = new KmScene1306(_vm, this, 136, 440); + InsertKlayman(KmScene1306, 136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFAF0); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - _klayman = new KmScene1306(_vm, this, 515, 440); + InsertKlayman(KmScene1306, 515, 440); _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene1306(_vm, this, 355, 440); + InsertKlayman(KmScene1306, 355, 440); } setMessageList(0x004AFBC8); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 3) { - _klayman = new KmScene1306(_vm, this, 534, 440); + InsertKlayman(KmScene1306, 534, 440); setMessageList(0x004AFC30); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 4) { - _klayman = new KmScene1306(_vm, this, 136, 440); + InsertKlayman(KmScene1306, 136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFC38); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 5) { - _klayman = new KmScene1306(_vm, this, 136, 440); + InsertKlayman(KmScene1306, 136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFB00); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else { - _klayman = new KmScene1306(_vm, this, 286, 408); + InsertKlayman(KmScene1306, 286, 408); setSurfacePriority(_asElevator->getSurface(), 1100); setSurfacePriority(_asElevatorDoor->getSurface(), 1090); setSurfacePriority(_sprite1->getSurface(), 1080); @@ -1200,7 +1196,6 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) clearRectList(); sendMessage(_asElevator, 0x4808, 0); } - addSprite(_klayman); } @@ -1879,7 +1874,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _sprite4 = NULL; if (which < 0) { - _klayman = new KmScene1308(_vm, this, 380, 440); + InsertKlayman(KmScene1308, 380, 440); setMessageList(0x004B57C0); if (getGlobalVar(0x80455A41)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1889,7 +1884,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else if (which == 1) { - _klayman = new KmScene1308(_vm, this, 640, 440); + InsertKlayman(KmScene1308, 640, 440); setMessageList(0x004B57C8); if (getGlobalVar(0x80455A41)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1899,7 +1894,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else if (which == 2) { - _klayman = new KmScene1308(_vm, this, 475, 440); + InsertKlayman(KmScene1308, 475, 440); setMessageList(0x004B58B0); if (getGlobalVar(0x80455A41)) { _sprite5 = addSprite(new Class592(_vm, this)); @@ -1910,7 +1905,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else { - _klayman = new KmScene1308(_vm, this, 41, 440); + InsertKlayman(KmScene1308, 41, 440); setMessageList(0x004B57D0); sendMessage(_class549, 0x4808, 0); _sprite1->getSurface()->setVisible(false); @@ -1922,7 +1917,6 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->setVisible(false); } } - addSprite(_klayman); if (_sprite4) { _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 5dc74787a1..b4f07447d1 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -777,23 +777,22 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2->getSurface()->setVisible(false); if (which < 0) { - _klayman = new KmScene1401(_vm, this, 380, 447); + InsertKlayman(KmScene1401, 380, 447); setMessageList(0x004B65C8); _sprite1->getSurface()->setVisible(false); } else if (which == 1) { - _klayman = new KmScene1401(_vm, this, 0, 447); + InsertKlayman(KmScene1401, 0, 447); setMessageList(0x004B65D0); _sprite1->getSurface()->setVisible(false); } else if (which == 2) { - _klayman = new KmScene1401(_vm, this, 660, 447); + InsertKlayman(KmScene1401, 660, 447); setMessageList(0x004B65D8); _sprite1->getSurface()->setVisible(false); } else { - _klayman = new KmScene1401(_vm, this, 290, 413); + InsertKlayman(KmScene1401, 290, 413); setMessageList(0x004B65E8); _sprite1->getSurface()->setVisible(false); } - addSprite(_klayman); if (getGlobalVar(0x04A105B3) == 2) { _class489 = addSprite(new Class489(_vm, this, _klayman, _class525)); @@ -994,16 +993,16 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B0C98); if (which < 0) { - _klayman = new KmScene1402(_vm, this, 377, 391); + InsertKlayman(KmScene1402, 377, 391); setMessageList(0x004B0B48); if (!getGlobalVar(0x70A1189C)) { _class482 = addSprite(new Class482(_vm, this, 0)); } } else if (which == 1) { - _klayman = new KmScene1402(_vm, this, 42, 391); + InsertKlayman(KmScene1402, 42, 391); setMessageList(0x004B0B50); } else if (which == 2) { - _klayman = new KmScene1402(_vm, this, 377, 391); + InsertKlayman(KmScene1402, 377, 391); setMessageList(0x004B0B60); _klayman->setDoDeltaX(1); if (getGlobalVar(0x70A1189C)) { @@ -1015,14 +1014,13 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _class482 = addSprite(new Class482(_vm, this, 0)); } } else { - _klayman = new KmScene1402(_vm, this, 513, 391); + InsertKlayman(KmScene1402, 513, 391); setMessageList(0x004B0B58); if (!getGlobalVar(0x70A1189C)) { _class482 = addSprite(new Class482(_vm, this, 2)); sub428220(); } } - addSprite(_klayman); if (_class482) { _class482->getSurface()->getClipRect().x1 = 0; @@ -1471,13 +1469,12 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _asTape2->setRepl(64, 0); if (which < 0) { - _klayman = new KmScene1403(_vm, this, 380, 463); + InsertKlayman(KmScene1403, 380, 463); setMessageList(0x004B1F18); } else { - _klayman = new KmScene1403(_vm, this, 640, 463); + InsertKlayman(KmScene1403, 640, 463); setMessageList(0x004B1F20); } - addSprite(_klayman); _klayman->setRepl(64, 0); if (getGlobalVar(0x04A105B3) == 4) { @@ -1589,24 +1586,23 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); if (which < 0) { - _klayman = new KmScene1404(_vm, this, 376, 406); + InsertKlayman(KmScene1404, 376, 406); setMessageList(0x004B8C28); } else if (which == 1) { - _klayman = new KmScene1404(_vm, this, 376, 406); + InsertKlayman(KmScene1404, 376, 406); setMessageList(0x004B8C30); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - _klayman = new KmScene1404(_vm, this, 347, 406); + InsertKlayman(KmScene1404, 347, 406); _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene1404(_vm, this, 187, 406); + InsertKlayman(KmScene1404, 187, 406); } setMessageList(0x004B8D28); } else { - _klayman = new KmScene1404(_vm, this, 30, 406); + InsertKlayman(KmScene1404, 30, 406); setMessageList(0x004B8C38); } - addSprite(_klayman); if (getGlobalVar(0x04A105B3) == 3) { _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 30fe95297b..43a30f9b22 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -262,7 +262,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) which = 4; if (which < 0) { - _klayman = new KmScene1705(_vm, this, 231, 434); + InsertKlayman(KmScene1705, 231, 434); setMessageList(0x004B69E8); sendMessage(this, 0x2000, 0); _klayman->getSurface()->getClipRect().x1 = 0; @@ -270,7 +270,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else if (which == 1) { - _klayman = new KmScene1705(_vm, this, 431, 434); + InsertKlayman(KmScene1705, 431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A08); sendMessage(this, 0x2000, 1); @@ -279,7 +279,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else if (which == 2) { - _klayman = new KmScene1705(_vm, this, 431, 434); + InsertKlayman(KmScene1705, 431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6AA0); sendMessage(this, 0x2000, 1); @@ -288,7 +288,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else if (which == 3) { - _klayman = new KmScene1705(_vm, this, 431, 434); + InsertKlayman(KmScene1705, 431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A18); sendMessage(this, 0x2000, 1); @@ -297,7 +297,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; _klayman->getSurface()->getClipRect().y2 = 480; } else { - _klayman = new KmScene1705(_vm, this, 231, 74); + InsertKlayman(KmScene1705, 231, 74); sendMessage(_klayman, 0x2000, 0); setMessageList(0x004B69F0); sendMessage(this, 0x2000, 0); @@ -308,8 +308,6 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->getSurface()->getClipRect().y2 = 480; } - addSprite(_klayman); - } void Scene1705::update() { diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index ecd4e705a3..bca54eb1f0 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -142,31 +142,30 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) _class401 = insertStaticSprite(0x0D641724, 1100); if (which < 0) { - _klayman = new KmScene2001(_vm, this, 300, 345); + InsertKlayman(KmScene2001, 300, 345); setMessageList(0x004B3538); sendMessage(this, 0x2000, 0); } else if (which == 1) { - _klayman = new KmScene2001(_vm, this, 116, 345); + InsertKlayman(KmScene2001, 116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3540); sendMessage(this, 0x2000, 1); } else if (which == 2) { - _klayman = new KmScene2001(_vm, this, 116, 345); + InsertKlayman(KmScene2001, 116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B35F0); sendMessage(this, 0x2000, 1); } else if (which == 3) { - _klayman = new KmScene2001(_vm, this, 116, 345); + InsertKlayman(KmScene2001, 116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3550); sendMessage(this, 0x2000, 1); } else { - _klayman = new KmScene2001(_vm, this, 390, 345); + InsertKlayman(KmScene2001, 390, 345); setMessageList(0x004B3530); sendMessage(this, 0x2000, 0); _klayman->setDoDeltaX(1); } - addSprite(_klayman); _klayman->getSurface()->getClipRect().x1 = _class401->getSurface()->getDrawRect().x; _klayman->getSurface()->getClipRect().y1 = 0; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 3faad252bc..27fb21ac6f 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -1547,29 +1547,28 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _doorLightSprite = insertStaticSprite(0xA4062212, 900); if (which < 0) { - _klayman = new KmScene2201(_vm, this, 300, 427, &_rect1, 2); + InsertKlaymanInitArgs(KmScene2201, 300, 427, (&_rect1, 2)); setMessageList(0x004B8118); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); } else if (which == 1) { - _klayman = new KmScene2201(_vm, this, 412, 393, &_rect1, 2); + InsertKlaymanInitArgs(KmScene2201, 412, 393, (&_rect1, 2)); setMessageList(0x004B8130); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - _klayman = new KmScene2201(_vm, this, 379, 427, &_rect1, 2); + InsertKlaymanInitArgs(KmScene2201, 379, 427, (&_rect1, 2)); _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene2201(_vm, this, 261, 427, &_rect1, 2); + InsertKlaymanInitArgs(KmScene2201, 261, 427, (&_rect1, 2)); } setMessageList(0x004B8178); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); } else { NPoint pt = _dataResource.getPoint(0x0304D8DC); - _klayman = new KmScene2201(_vm, this, pt.x, pt.y, &_rect1, 2); + InsertKlaymanInitArgs(KmScene2201, pt.x, pt.y, (&_rect1, 2)); setMessageList(0x004B8120); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true)); } - addSprite(_klayman); addSprite(new AsScene2201CeilingFan(_vm)); @@ -2162,24 +2161,23 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asRightDoor); if (which < 0) { - _klayman = new KmScene2203(_vm, this, 200, 427); + InsertKlayman(KmScene2203, 200, 427); setMessageList(0x004B8340); } else if (which == 1) { - _klayman = new KmScene2203(_vm, this, 640, 427); + InsertKlayman(KmScene2203, 640, 427); setMessageList(0x004B8350); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - _klayman = new KmScene2203(_vm, this, 362, 427); + InsertKlayman(KmScene2203, 362, 427); _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene2203(_vm, this, 202, 427); + InsertKlayman(KmScene2203, 202, 427); } setMessageList(0x004B8358); } else { - _klayman = new KmScene2203(_vm, this, 0, 427); + InsertKlayman(KmScene2203, 0, 427); setMessageList(0x004B8348); } - addSprite(_klayman); if (getGlobalVar(0x9A500914)) { _ssSmallLeftDoor->getSurface()->setVisible(false); @@ -2315,25 +2313,24 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm)); if (which < 0) { - _klayman = new KmScene2205(_vm, this, 320, 417); + InsertKlayman(KmScene2205, 320, 417); setMessageList(0x004B0658); if (!getGlobalVar(0x4D080E54)) { _palette->addPalette(0x68033B1C, 0, 65, 0); } _isKlaymanInLight = false; } else if (which == 1) { - _klayman = new KmScene2205(_vm, this, 640, 417); + InsertKlayman(KmScene2205, 640, 417); setMessageList(0x004B0648); if (!getGlobalVar(0x4D080E54)) { _palette->addPalette(0x68033B1C, 0, 65, 0); } _isKlaymanInLight = false; } else { - _klayman = new KmScene2205(_vm, this, 0, 417); + InsertKlayman(KmScene2205, 0, 417); setMessageList(0x004B0640); _isKlaymanInLight = true; } - addSprite(_klayman); _klayman->getSurface()->getClipRect().x1 = _ssDoorFrame->getSurface()->getDrawRect().x; _klayman->getSurface()->getClipRect().y1 = 0; @@ -2606,27 +2603,26 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_class607); if (which < 0) { - _klayman = new KmScene2206(_vm, this, 200, 430); + InsertKlayman(KmScene2206, 200, 430); setMessageList(0x004B88A8); } else if (which == 1) { - _klayman = new KmScene2206(_vm, this, 640, 430); + InsertKlayman(KmScene2206, 640, 430); setMessageList(0x004B88B8); } else if (which == 2) { - _klayman = new KmScene2206(_vm, this, 205, 396); + InsertKlayman(KmScene2206, 205, 396); setMessageList(0x004B88C8); _palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0); sub4819D0(); _soundResource.play(0x53B8284A); } else if (which == 3) { - _klayman = new KmScene2206(_vm, this, kScene2206XPositions[getGlobalVar(0x48A68852)], 430); + InsertKlayman(KmScene2206, kScene2206XPositions[getGlobalVar(0x48A68852)], 430); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); setMessageList(0x004B8A70); } else { - _klayman = new KmScene2206(_vm, this, 0, 430); + InsertKlayman(KmScene2206, 0, 430); setMessageList(0x004B88B0); } - addSprite(_klayman); _klayman->setSoundFlag(true); _klayman->setKlaymanTable2(); @@ -3069,8 +3065,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2207::update); _surfaceFlag = true; - _klayman = new KmScene2207(_vm, this, 0, 0); // CHECKME: Stack vars are uninitialized?! - addSprite(_klayman); + InsertKlayman(KmScene2207, 0, 0); _klayman->setRepl(64, 0); setMessageList(0x004B38E8); @@ -3518,21 +3513,20 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); if (which < 0) { - _klayman = new KmScene2242(_vm, this, 200, 430); + InsertKlayman(KmScene2242, 200, 430); setMessageList(0x004B3C18); } else if (which == 1) { - _klayman = new KmScene2242(_vm, this, 530, 430); + InsertKlayman(KmScene2242, 530, 430); setMessageList(0x004B3D60); } else if (which == 2) { - _klayman = new KmScene2242(_vm, this, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430); + InsertKlayman(KmScene2242, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430); setMessageList(0x004B3D48); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); } else { - _klayman = new KmScene2242(_vm, this, 0, 430); + InsertKlayman(KmScene2242, 0, 430); setMessageList(0x004B3C20); } - addSprite(_klayman); _klayman->setSoundFlag(true); @@ -3650,21 +3644,20 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule } if (which < 0) { - _klayman = new KmHallOfRecords(_vm, this, 200, 430); + InsertKlayman(KmHallOfRecords, 200, 430); setMessageList(0x004B2900); } else if (which == 1) { - _klayman = new KmHallOfRecords(_vm, this, 640, 430); + InsertKlayman(KmHallOfRecords, 640, 430); setMessageList(0x004B2910); } else if (which == 2) { - _klayman = new KmHallOfRecords(_vm, this, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430); + InsertKlayman(KmHallOfRecords, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430); setMessageList(0x004B2B70); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); } else { - _klayman = new KmHallOfRecords(_vm, this, 0, 430); + InsertKlayman(KmHallOfRecords, 0, 430); setMessageList(0x004B2908); } - addSprite(_klayman); _klayman->setSoundFlag(true); _klayman->setKlaymanTable2(); @@ -3748,21 +3741,20 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) } if (which < 0) { - _klayman = new KmScene2247(_vm, this, 200, 430); + InsertKlayman(KmScene2247, 200, 430); setMessageList(0x004B5428); } else if (which == 1) { - _klayman = new KmScene2247(_vm, this, 640, 430); + InsertKlayman(KmScene2247, 640, 430); setMessageList(0x004B5438); } else if (which == 2) { - _klayman = new KmScene2247(_vm, this, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430); + InsertKlayman(KmScene2247, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); setMessageList(0x004B5530); } else { - _klayman = new KmScene2247(_vm, this, 0, 430); + InsertKlayman(KmScene2247, 0, 430); setMessageList(0x004B5430); } - addSprite(_klayman); _klayman->setSoundFlag(true); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 067e86f5fc..9b928bb19c 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -37,7 +37,8 @@ namespace Neverhood { -#define InsertKlayman(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) +#define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman) +#define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) class Scene : public Entity { public: -- cgit v1.2.3 From 5d63bef6a25a990603444026a8cb033108410019 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Sep 2011 13:38:19 +0000 Subject: NEVERHOOD: Use setBackground --- engines/neverhood/module1000.cpp | 12 ++++++------ engines/neverhood/module1200.cpp | 6 +++--- engines/neverhood/module1300.cpp | 10 +++++----- engines/neverhood/module1400.cpp | 10 +++++----- engines/neverhood/module1500.cpp | 2 +- engines/neverhood/module1700.cpp | 2 +- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2200.cpp | 28 ++++++++++++++-------------- engines/neverhood/module3000.cpp | 6 +++--- 9 files changed, 39 insertions(+), 39 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 7c3c3ba138..1e5b0765ea 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -403,7 +403,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->setHitRects(0x004B4860); _surfaceFlag = false; - _background = addBackground(new DirtyBackground(_vm, 0x4086520E, 0, 0)); + setBackground(0x4086520E); _palette = new Palette(_vm, 0x4086520E); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x6520A400, NULL)); @@ -1406,7 +1406,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x12C23307, 0, 0)); + setBackground(0x12C23307); _palette = new Palette(_vm, 0x12C23307); _palette->usePalette(); @@ -1686,7 +1686,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF SetMessageHandler(&Class152::handleMessage); - _background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0)); + setBackground(backgroundFileHash); _palette = new Palette(_vm, backgroundFileHash); _palette->usePalette(); _mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620)); @@ -1748,7 +1748,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1004::update); SetMessageHandler(&Scene1004::handleMessage); - _background = addBackground(new DirtyBackground(_vm, 0x50C03005, 0, 0)); + setBackground(0x50C03005); if (getGlobalVar(0x0D0A14D10)) { palette2 = new Palette2(_vm, 0xA30BA329); @@ -1850,13 +1850,13 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; if (getGlobalVar(0xD0A14D10)) { - _background = addBackground(new DirtyBackground(_vm, 0x2800E011, 0, 0)); + setBackground(0x2800E011); _palette = new Palette(_vm, 0x2800E011); _palette->usePalette(); insertStaticSprite(0x492D5AD7, 100); _mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620)); } else { - _background = addBackground(new DirtyBackground(_vm, 0x8870A546, 0, 0)); + setBackground(0x8870A546); _palette = new Palette(_vm, 0x8870A546); _palette->usePalette(); insertStaticSprite(0x40D1E0A9, 100); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 212fc874c6..a12f1cca09 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -878,12 +878,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setRepl(64, 0); if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { - _background = addBackground(new DirtyBackground(_vm, 0x4019A2C4, 0, 0)); + setBackground(0x4019A2C4); _palette = new Palette(_vm, 0x4019A2C4); _palette->usePalette(); _asRightDoor = NULL; } else { - _background = addBackground(new DirtyBackground(_vm, 0x40206EC5, 0, 0)); + setBackground(0x40206EC5); _palette = new Palette(_vm, 0x40206EC5); _palette->usePalette(); _asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2)); @@ -1188,7 +1188,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x60210ED5, 0, 0)); + setBackground(0x60210ED5); palette2 = new Palette2(_vm, 0x60210ED5); palette2->usePalette(); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 8085eb681c..46597e0b78 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -639,7 +639,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->setHitRects(0x004B0858); setRectList(0x004B0A38); - _background = addBackground(new DirtyBackground(_vm, 0x420643C4, 0, 0)); + setBackground(0x420643C4); _palette = new Palette(_vm, 0x420643C4); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL)); @@ -1007,7 +1007,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1305::handleMessage); setRectList(0x004B6E98); - _background = addBackground(new DirtyBackground(_vm, 0x28801B64, 0, 0)); + setBackground(0x28801B64); _palette = new Palette(_vm, 0x28801B64); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL)); @@ -1123,7 +1123,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; SetMessageHandler(&Scene1306::handleMessage); - _background = addBackground(new DirtyBackground(_vm, 0x05303114, 0, 0)); + setBackground(0x05303114); _palette = new Palette(_vm, 0x05303114); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x0311005B, NULL)); @@ -1529,7 +1529,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1307::handleMessage); SetUpdateHandler(&Scene1307::update); - _background = addBackground(new DirtyBackground(_vm, 0xA8006200, 0, 0)); + setBackground(0xA8006200); _palette = new Palette(_vm, 0xA8006200); _palette->usePalette(); addEntity(_palette); @@ -1848,7 +1848,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; SetMessageHandler(&Scene1308::handleMessage); - _background = addBackground(new DirtyBackground(_vm, 0x41024202, 0, 0)); + setBackground(0x41024202); _palette = new Palette(_vm, 0x41024202); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x24206418, NULL)); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index b4f07447d1..4dac2a76be 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -756,7 +756,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B6758); _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x08221FA5, 0, 0)); + setBackground(0x08221FA5); _palette = new Palette(_vm, 0x08221FA5); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x21FA108A, NULL)); @@ -1380,7 +1380,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1407::handleMessage); SetUpdateHandler(&Scene1407::update); - _background = addBackground(new DirtyBackground(_vm, 0x00442225, 0, 0)); + setBackground(0x00442225); _palette = new Palette(_vm, 0x00442225); _palette->usePalette(); _mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620)); @@ -1446,7 +1446,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B1FF8); _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x2110A234, 0, 0)); + setBackground(0x2110A234); _palette = new Palette(_vm, 0x2110A234); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL)); @@ -1569,7 +1569,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B8D80); - _background = addBackground(new DirtyBackground(_vm, 0xAC0B006F, 0, 0)); + setBackground(0xAC0B006F); _palette = new Palette(_vm, 0xAC0B006F); _palette->addPalette(0x00801510, 0, 65, 0); _palette->usePalette(); @@ -1784,7 +1784,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene1405Vars(); _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x0C0C007D, 0, 0)); + setBackground(0x0C0C007D); _palette = new Palette(_vm, 0x0C0C007D); _palette->usePalette(); _mouseCursor = addSprite(new Mouse435(_vm, 0xC00790C8, 20, 620)); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 40b15b3622..a014844e87 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -118,7 +118,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, backgroundFileHash, 0, 0)); + setBackground(backgroundFileHash); palette2 = new Palette2(_vm); palette2->usePalette(); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 43a30f9b22..a36d35816e 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -239,7 +239,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x03118226, 0, 0)); + setBackground(0x03118226); palette2 = new Palette2(_vm, 0x03118226); palette2->addPalette(0x91D3A391, 0, 64, 0); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index bca54eb1f0..2b6a647885 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -134,7 +134,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; SetMessageHandler(&Scene2001::handleMessage); - _background = addBackground(new DirtyBackground(_vm, 0xA6417244, 0, 0)); + setBackground(0xA6417244); _palette = new Palette(_vm, 0xA6417244); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL)); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 27fb21ac6f..62aec282c7 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -1507,7 +1507,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x04104242); loadHitRectList(); - _background = addBackground(new DirtyBackground(_vm, 0x40008208, 0, 0)); + setBackground(0x40008208); _palette = new Palette(_vm, 0x40008208); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x0820C408, NULL)); @@ -1892,7 +1892,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x08100A0C, 0, 0)); + setBackground(0x08100A0C); palette2 = new Palette2(_vm, 0x08100A0C); _palette = palette2; _palette->usePalette(); @@ -2123,7 +2123,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2203::handleMessage); _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x82C80334, 0, 0)); + setBackground(0x82C80334); _palette = new Palette(_vm, 0x82C80334); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x80330824, NULL)); @@ -2288,7 +2288,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { _isLightOn = true; - _background = addBackground(new DirtyBackground(_vm, 0x0008028D, 0, 0)); + setBackground(0x0008028D); palette2 = new Palette2(_vm, 0x0008028D); _palette = palette2; _palette->usePalette(); @@ -2298,7 +2298,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) addSprite(_ssLightSwitch); } else { _isLightOn = false; - _background = addBackground(new DirtyBackground(_vm, 0xD00A028D, 0, 0)); + setBackground(0xD00A028D); palette2 = new Palette2(_vm, 0xD00A028D); _palette = palette2; _palette->usePalette(); @@ -2587,7 +2587,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _class604->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; _class604->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; - _background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0)); + setBackground(fileHash); palette2 = new Palette2(_vm, fileHash); _palette = palette2; @@ -3074,7 +3074,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { - _background = addBackground(new DirtyBackground(_vm, 0x88C00241, 0, 0)); + setBackground(0x88C00241); _palette = new Palette(_vm, 0x88C00241); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL)); @@ -3116,7 +3116,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(0x81890D14, 1); - _background = addBackground(new DirtyBackground(_vm, 0x05C02A55, 0, 0)); + setBackground(0x05C02A55); _palette = new Palette(_vm, 0x05C02A55); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL)); @@ -3492,13 +3492,13 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2242::update); if (getGlobalVar(0x4D080E54)) { - _background = addBackground(new DirtyBackground(_vm, 0x11840E24, 0, 0)); + setBackground(0x11840E24); _palette = new Palette(_vm, 0x11840E24); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x40E20110, NULL)); setRectList(0x004B3DC8); } else { - _background = addBackground(new DirtyBackground(_vm, 0x25848E24, 0, 0)); + setBackground(0x25848E24); palette2 = new Palette2(_vm, 0x25848E24); _palette = palette2; _palette->usePalette(); @@ -3631,13 +3631,13 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) { setRectList(0x004B2BF8); - _background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename2, 0, 0)); + setBackground(_sceneInfo140->bgFilename2); _palette = new Palette(_vm, _sceneInfo140->bgFilename2); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL)); } else { setRectList(0x004B2BB8); - _background = addBackground(new DirtyBackground(_vm, _sceneInfo140->bgFilename1, 0, 0)); + setBackground(_sceneInfo140->bgFilename1); _palette = new Palette(_vm, _sceneInfo140->bgFilename1); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL)); @@ -3728,13 +3728,13 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { setRectList(0x004B5588); - _background = addBackground(new DirtyBackground(_vm, 0x40339414, 0, 0)); + setBackground(0x40339414); _palette = new Palette(_vm, 0x40339414); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL)); } else { setRectList(0x004B55C8); - _background = addBackground(new DirtyBackground(_vm, 0x071963E5, 0, 0)); + setBackground(0x071963E5); _palette = new Palette(_vm, 0x071963E5); _palette->usePalette(); _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL)); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 009895cb25..cc617a3fbc 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -971,7 +971,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_screen->clear(); - _background = addBackground(new DirtyBackground(_vm, 0xD000420C, 0, 0)); + setBackground(0xD000420C); _palette = new Palette(_vm, 0xD000420C); _mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620)); @@ -1470,7 +1470,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x80802626, 0, 0)); + setBackground(0x80802626); _palette = new Palette(_vm, 0x80802626); _palette->usePalette(); @@ -1724,7 +1724,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) // TODO _vm->gameModule()->initScene3011Vars(); _index1 = getGlobalVar(0x2414C2F2); - _background = addBackground(new DirtyBackground(_vm, 0x92124A04, 0, 0)); + setBackground(0x92124A04); palette2 = new Palette2(_vm, 0xA4070114); addEntity(palette2); -- cgit v1.2.3 From c30e16628e01b5be671330b24ed73d1294205f6b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Sep 2011 20:02:07 +0000 Subject: NEVERHOOD: Add Module::updateChild and use it (in most places) --- engines/neverhood/gamemodule.cpp | 110 ++------------- engines/neverhood/module.cpp | 13 ++ engines/neverhood/module.h | 1 + engines/neverhood/module1000.cpp | 30 +--- engines/neverhood/module1200.cpp | 59 +++----- engines/neverhood/module1200.h | 3 - engines/neverhood/module1300.cpp | 91 ++----------- engines/neverhood/module1400.cpp | 46 +------ engines/neverhood/module1500.cpp | 7 +- engines/neverhood/module1700.cpp | 24 +--- engines/neverhood/module1800.cpp | 63 ++------- engines/neverhood/module2000.cpp | 18 +-- engines/neverhood/module2200.cpp | 288 +++++++-------------------------------- engines/neverhood/module2300.cpp | 88 +++++------- engines/neverhood/module3000.cpp | 200 +++++++++++---------------- engines/neverhood/module3000.h | 2 - engines/neverhood/sprite.cpp | 4 - engines/neverhood/sprite.h | 10 +- 18 files changed, 254 insertions(+), 803 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 650287b473..6ef58e4fae 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -268,8 +268,8 @@ void GameModule::startup() { //createModule1700(1); //createModule1400(-1); #if 1 - _vm->gameState().sceneNum = 1; - createModule1000(-1); + _vm->gameState().sceneNum = 0; + createModule1200(-1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -296,14 +296,7 @@ void GameModule::createModule1000(int which) { } void GameModule::updateModule1000() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - // TODO _resourceTable3.load(); - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createModule2300(0); _childObject->handleUpdate(); } @@ -316,13 +309,7 @@ void GameModule::createModule1200(int which) { } void GameModule::updateModule1200() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { error("// TODO createModule2600(0);"); // TODO createModule2600(0); @@ -341,13 +328,7 @@ void GameModule::createModule1300(int which) { } void GameModule::updateModule1300() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { // TODO _gameState.clear(); // TODO GameModule_handleKeyEscape @@ -365,13 +346,7 @@ void GameModule::createModule1400(int which) { } void GameModule::updateModule1400() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { error("WEIRD!"); } else { @@ -389,13 +364,7 @@ void GameModule::createModule1500(int which) { } void GameModule::updateModule1500() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createModule1000(0); _childObject->handleUpdate(); } @@ -408,13 +377,7 @@ void GameModule::createModule1700(int which) { } void GameModule::updateModule1700() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { debug("Module1700 done; _field20 = %d", _field20); if (_field20 == 1) { // TODO createModule2900(3); @@ -433,13 +396,7 @@ void GameModule::createModule1800(int which) { } void GameModule::updateModule1800() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { // TODO GameState_clear(); // TODO GameModule_handleKeyEscape(); @@ -463,13 +420,7 @@ void GameModule::createModule2000(int which) { } void GameModule::updateModule2000() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { // TODO createModule2900(4); _childObject->handleUpdate(); } @@ -482,13 +433,7 @@ void GameModule::createModule2200(int which) { } void GameModule::updateModule2200() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createModule2300(1); _childObject->handleUpdate(); } @@ -501,40 +446,19 @@ void GameModule::createModule2300(int which) { } void GameModule::updateModule2300() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createModule2200(0); - _childObject->handleUpdate(); } else if (_field20 == 2) { createModule1200(0); - _childObject->handleUpdate(); } else if (_field20 == 3) { // TODO createModule2400(0); - // TODO _childObject->handleUpdate(); } else if (_field20 == 4) { // TODO createModule3000(0); - // TODO _childObject->handleUpdate(); } else { createModule1000(1); - _childObject->handleUpdate(); - } - } - if (_field24 >= 0) { - if (_field24 == 2) { - // TODO _resourceTable4.load(); - } else if (_field24 == 0) { - // TODO _resourceTable3.load(); } - _field24 = -1; - } - if (_field26 >= 0) { - _field26 = -1; + _childObject->handleUpdate(); } } @@ -549,13 +473,7 @@ void GameModule::createModule3000(int which) { } void GameModule::updateModule3000() { - if (!_childObject) - return; - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { // TODO createModule1900(0); // TODO _childObject->handleUpdate(); diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index c38b96e199..6d49838c49 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -89,4 +89,17 @@ void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, _childObject = smackerScene; } +bool Module::updateChild() { + if (_childObject) { + _childObject->handleUpdate(); + if (_done) { + _done = false; + delete _childObject; + _childObject = NULL; + return false; + } + } + return true; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 470fe36c98..a37fd522aa 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -53,6 +53,7 @@ protected: NavigationScene *navigationScene(); void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); + bool updateChild(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 1e5b0765ea..51e1d1959d 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -101,11 +101,7 @@ void Module1000::createScene1005(int which) { } void Module1000::updateScene1001() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 2) { createScene1003(0); _childObject->handleUpdate(); @@ -117,11 +113,7 @@ void Module1000::updateScene1001() { } void Module1000::updateScene1002() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { sendMessage(_parentModule, 0x1009, 0); } else if (_field20 == 2) { @@ -135,22 +127,14 @@ void Module1000::updateScene1002() { } void Module1000::updateScene1003() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1001(2); _childObject->handleUpdate(); } } void Module1000::updateScene1004() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene1005(0); _childObject->handleUpdate(); @@ -162,12 +146,8 @@ void Module1000::updateScene1004() { } void Module1000::updateScene1005() { - _childObject->handleUpdate(); - if (_done) { + if (!updateChild()) { // TODO Music18hList_stop(_musicFileHash, 0, 1); - _done = false; - delete _childObject; - _childObject = NULL; createScene1004(1); _childObject->handleUpdate(); } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index a12f1cca09..fa0bea0e94 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -25,10 +25,12 @@ namespace Neverhood { Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _moduleDone(false) { + : Module(vm, parentModule) { // TODO _resourceTable.setResourceList(0x004B3E68); SetMessageHandler(&Module1200::handleMessage); + + debug("Module1200: which = %d", which); if (which < 0) { switch (_vm->gameState().sceneNum) { @@ -56,17 +58,6 @@ Module1200::~Module1200() { // TODO Music18hList_deleteGroup(0x00478311); } -uint32 Module1200::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Module::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1009: - _moduleDone = true; - _moduleDoneStatus = param.asInteger(); - break; - } - return messageResult; -} - void Module1200::createScene1201(int which) { _vm->gameState().sceneNum = 0; _childObject = new Scene1201(_vm, this, which); @@ -88,41 +79,31 @@ void Module1200::createScene1203(int which) { } void Module1200::updateScene1201() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; - if (_moduleDoneStatus == 1) { + if (!updateChild()) { + if (_field20 == 1) { createScene1202(0); _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 2) { - sendMessage(_parentModule, 0x1009, 0); - } else if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { - createScene1203(-1); + } else if (_field20 == 2) { + if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { + createScene1203(-1); + } else { + sendMessage(_parentModule, 0x1009, 1); + } } else { - sendMessage(_parentModule, 0x1009, 1); + sendMessage(_parentModule, 0x1009, 0); } } } void Module1200::updateScene1202() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1201(1); _childObject->handleUpdate(); } } void Module1200::updateScene1203() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1201(3); _childObject->handleUpdate(); // TODO Music18hList_play(0x62222CAE, 0, 0, 1); @@ -788,15 +769,6 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) int16 x1, x2; Sprite *tempSprite, *class464; - // TODO _resourceTable2.setResourceList(ex_sub_41C730(), true); - if (getGlobalVar(0x0A18CA33)) { - // TODO _resourceTable1.setResourceList(0x004AEA10, true); - } else if (getGlobalVar(0x0A310817)) { - // TODO _resourceTable1.setResourceList(0x004AEA70, true); - } else { - // TODO _resourceTable1.setResourceList(0x004AEB18, true); - } - SetUpdateHandler(&Scene1201::update); SetMessageHandler(&Scene1201::handleMessage); @@ -844,6 +816,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) class464 = addSprite(new Class464(_vm)); + debug("Scene1201: which = %d", which); + if (which < 0) { InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464)); setMessageList(0x004AEC08); @@ -1006,7 +980,6 @@ void Scene1201::update() { } uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Scene1201::handleMessage(%04X)", messageNum); uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index 3ffed442d9..df1ed41b2c 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -37,9 +37,6 @@ public: virtual ~Module1200(); protected: // TODO ResourceTable _resourceTable; - bool _moduleDone; - uint32 _moduleDoneStatus; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createScene1201(int which); void createScene1202(int which); void createScene1203(int which); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 46597e0b78..149af4a071 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -283,11 +283,7 @@ void Module1300::createScene1318(int which) { } void Module1300::updateScene1302() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene1305(0); } else { @@ -298,45 +294,28 @@ void Module1300::updateScene1302() { } void Module1300::updateScene1303() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1306(3); _childObject->handleUpdate(); } } void Module1300::updateScene1304() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1316(0); _childObject->handleUpdate(); } } void Module1300::updateScene1305() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1317(-1); _childObject->handleUpdate(); } } void Module1300::updateScene1306() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; - debug("_field20 = %d", _field20); + if (!updateChild()) { if (_field20 == 2) { createScene1309(0); _childObject->handleUpdate(); @@ -353,22 +332,14 @@ void Module1300::updateScene1306() { } void Module1300::updateScene1307() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1308(2); _childObject->handleUpdate(); } } void Module1300::updateScene1308() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1314(0); } else if (_field20 == 1) { @@ -381,22 +352,14 @@ void Module1300::updateScene1308() { } void Module1300::updateScene1309() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1306(2); _childObject->handleUpdate(); } } void Module1300::updateScene1310() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_vm->gameState().sceneNum == 9) createScene1306(0); else @@ -409,11 +372,7 @@ void Module1300::updateScene1311() { } void Module1300::updateScene1312() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1313(0); } else if (_field20 == 1) { @@ -424,11 +383,7 @@ void Module1300::updateScene1312() { } void Module1300::updateScene1313() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { switch (_field20) { case 0: createScene1315(1); @@ -448,11 +403,7 @@ void Module1300::updateScene1313() { } void Module1300::updateScene1314() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1313(2); } else if (_field20 == 1) { @@ -463,11 +414,7 @@ void Module1300::updateScene1314() { } void Module1300::updateScene1315() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1313(3); } else if (_field20 == 1) { @@ -478,11 +425,7 @@ void Module1300::updateScene1315() { } void Module1300::updateScene1316() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1313(4); } else if (_field20 == 1) { @@ -493,11 +436,7 @@ void Module1300::updateScene1316() { } void Module1300::updateScene1317() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1318(-1); _childObject->handleUpdate(); } diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 4dac2a76be..edc47f5a56 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -121,11 +121,7 @@ void Module1400::createScene1407(int which) { } void Module1400::updateScene1401() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene1402(0); _childObject->handleUpdate(); @@ -139,14 +135,7 @@ void Module1400::updateScene1401() { } void Module1400::updateScene1402() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; - - debug("Scene1402: _field20 = %d", _field20); - + if (!updateChild()) { if (_field20 == 1) { createScene1403(0); _childObject->handleUpdate(); @@ -161,23 +150,14 @@ void Module1400::updateScene1402() { } void Module1400::updateScene1403() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1402(1); _childObject->handleUpdate(); } } void Module1400::updateScene1404() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; - debug("Scene1404; _field20 = %d", _field20); + if (!updateChild()) { if (_field20 == 1) { createScene1405(0); _childObject->handleUpdate(); @@ -192,33 +172,21 @@ void Module1400::updateScene1404() { } void Module1400::updateScene1405() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1404(1); _childObject->handleUpdate(); } } void Module1400::updateScene1406() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1404(2); _childObject->handleUpdate(); } } void Module1400::updateScene1407() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene1402(2); _childObject->handleUpdate(); } diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index a014844e87..b942d8b836 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -50,11 +50,7 @@ Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, boo } void Module1500::update() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 0: createScene1502(); @@ -77,7 +73,6 @@ void Module1500::update() { } void Module1500::createScene1501() { - debug("createScene1501"); _vm->gameState().sceneNum = 0; _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); SetUpdateHandler(&Module1500::update); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index a36d35816e..528161ea2b 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -100,11 +100,7 @@ void Module1700::createScene1705(int which) { } void Module1700::updateScene1701() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_vm->gameState().sceneNum == 3) { createScene1705(0); _childObject->handleUpdate(); @@ -117,11 +113,7 @@ void Module1700::updateScene1701() { } void Module1700::updateScene1702() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1703(0); _childObject->handleUpdate(); @@ -133,11 +125,7 @@ void Module1700::updateScene1702() { } void Module1700::updateScene1703() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1704(-1); _childObject->handleUpdate(); @@ -156,11 +144,7 @@ void Module1700::updateScene1703() { } void Module1700::updateScene1705() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { sendMessage(_parentModule, 0x1009, 1); } } diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index f503848661..d3dc4b6e9e 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -146,17 +146,7 @@ void Module1800::createScene1809(int which) { } void Module1800::updateScene1801() { - _childObject->handleUpdate(); -#if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (navigationScene->soundFlag1 && navigationScene->index == 2) { - // TODO Sound1ChList_sub_4080B0(false); - } -#endif - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene1805(0); _childObject->handleUpdate(); @@ -167,6 +157,13 @@ void Module1800::updateScene1801() { createScene1804(0); _childObject->handleUpdate(); } + } else { +#if 0 // TODO + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (navigationScene->soundFlag1 && navigationScene->index == 2) { + // TODO Sound1ChList_sub_4080B0(false); + } +#endif } } @@ -187,11 +184,7 @@ void Module1800::updateScene1802() { } void Module1800::updateScene1803() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 2) { createScene1801(2); _childObject->handleUpdate(); @@ -207,49 +200,33 @@ void Module1800::updateScene1803() { } void Module1800::updateScene1804() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1804b(-1); - _childObject->handleUpdate(); } else if (_field20 == 1) { createScene1801(1); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); } } void Module1800::updateScene1805() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { createScene1807(-1); - _childObject->handleUpdate(); } else if (_field20 == 1) { createScene1806(0); - _childObject->handleUpdate(); } else if (_field20 == 2) { createScene1801(3); - _childObject->handleUpdate(); } else if (_field20 == 3) { createScene1805(3); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); } } void Module1800::updateScene1806() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { sendMessage(_parentModule, 0x1009, 2); } else if (_field20 == 1) { @@ -257,20 +234,10 @@ void Module1800::updateScene1806() { _childObject->handleUpdate(); } } - if (_field24 >= 0) { - if (_field24 == 1) { - // TODO _resourceTable.setResourceList(ex_sub_42EDA0(0), true); - } - _field24 = -1; - } } void Module1800::updateScene1809() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { sendMessage(_parentModule, 0x1009, 1); // TODO GameState stuff } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 2b6a647885..130235512c 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -83,11 +83,7 @@ void Module2000::createScene2003(int which) { } void Module2000::updateScene2001() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { sendMessage(_parentModule, 0x1009, 0); } else { @@ -97,11 +93,7 @@ void Module2000::updateScene2001() { } void Module2000::updateScene2002() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 0) { if (getGlobalVar(0x98109F12)) { createScene2002(0); @@ -117,11 +109,7 @@ void Module2000::updateScene2002() { } void Module2000::updateScene2003() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene2002(0); } } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 62aec282c7..321fab1484 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -498,11 +498,7 @@ void Module2200::createScene2248(int which) { } void Module2200::updateScene2201() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2203(0); } else if (_field20 == 2) { @@ -514,21 +510,13 @@ void Module2200::updateScene2201() { } void Module2200::updateScene2202() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene2201(2); } } void Module2200::updateScene2203() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2205(0); } else if (_field20 == 2) { @@ -541,21 +529,13 @@ void Module2200::updateScene2203() { } void Module2200::updateScene2204() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene2203(2); } } void Module2200::updateScene2205() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2206(0); } else if (_field20 == 2) { @@ -568,11 +548,7 @@ void Module2200::updateScene2205() { } void Module2200::updateScene2206() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2247(0); } else if (_field20 == 2) { @@ -587,22 +563,14 @@ void Module2200::updateScene2206() { } void Module2200::updateScene2207() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene2206(2); _childObject->handleUpdate(); } } void Module2200::updateScene2208() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { // This is madness! switch (_vm->gameState().which) { case 4: @@ -725,22 +693,14 @@ void Module2200::updateScene2208() { } void Module2200::updateScene2209() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene2206(3); _childObject->handleUpdate(); } } void Module2200::updateScene2210() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2211(0); } else if (_field20 == 2) { @@ -753,11 +713,7 @@ void Module2200::updateScene2210() { } void Module2200::updateScene2211() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2212(0); } else if (_field20 == 2) { @@ -770,11 +726,7 @@ void Module2200::updateScene2211() { } void Module2200::updateScene2212() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2213(0); } else if (_field20 == 2) { @@ -787,11 +739,7 @@ void Module2200::updateScene2212() { } void Module2200::updateScene2213() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2214(0); } else if (_field20 == 2) { @@ -804,11 +752,7 @@ void Module2200::updateScene2213() { } void Module2200::updateScene2214() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2215(0); } else if (_field20 == 2) { @@ -821,11 +765,7 @@ void Module2200::updateScene2214() { } void Module2200::updateScene2215() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2216(0); } else if (_field20 == 2) { @@ -838,11 +778,7 @@ void Module2200::updateScene2215() { } void Module2200::updateScene2216() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2217(0); } else if (_field20 == 2) { @@ -855,11 +791,7 @@ void Module2200::updateScene2216() { } void Module2200::updateScene2217() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2218(0); } else if (_field20 == 2) { @@ -872,11 +804,7 @@ void Module2200::updateScene2217() { } void Module2200::updateScene2218() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2219(0); } else if (_field20 == 2) { @@ -889,11 +817,7 @@ void Module2200::updateScene2218() { } void Module2200::updateScene2219() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2220(0); } else if (_field20 == 2) { @@ -906,11 +830,7 @@ void Module2200::updateScene2219() { } void Module2200::updateScene2220() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2221(0); } else if (_field20 == 2) { @@ -923,11 +843,7 @@ void Module2200::updateScene2220() { } void Module2200::updateScene2221() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2222(0); } else if (_field20 == 2) { @@ -940,11 +856,7 @@ void Module2200::updateScene2221() { } void Module2200::updateScene2222() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2223(0); } else if (_field20 == 2) { @@ -957,11 +869,7 @@ void Module2200::updateScene2222() { } void Module2200::updateScene2223() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2224(0); } else if (_field20 == 2) { @@ -974,11 +882,7 @@ void Module2200::updateScene2223() { } void Module2200::updateScene2224() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2225(0); } else if (_field20 == 2) { @@ -991,11 +895,7 @@ void Module2200::updateScene2224() { } void Module2200::updateScene2225() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2226(0); } else if (_field20 == 2) { @@ -1008,11 +908,7 @@ void Module2200::updateScene2225() { } void Module2200::updateScene2226() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2227(0); } else if (_field20 == 2) { @@ -1025,11 +921,7 @@ void Module2200::updateScene2226() { } void Module2200::updateScene2227() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2228(0); } else if (_field20 == 2) { @@ -1042,11 +934,7 @@ void Module2200::updateScene2227() { } void Module2200::updateScene2228() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2229(0); } else if (_field20 == 2) { @@ -1059,11 +947,7 @@ void Module2200::updateScene2228() { } void Module2200::updateScene2229() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2230(0); } else if (_field20 == 2) { @@ -1076,11 +960,7 @@ void Module2200::updateScene2229() { } void Module2200::updateScene2230() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2231(0); } else if (_field20 == 2) { @@ -1093,11 +973,7 @@ void Module2200::updateScene2230() { } void Module2200::updateScene2231() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2232(0); } else if (_field20 == 2) { @@ -1110,11 +986,7 @@ void Module2200::updateScene2231() { } void Module2200::updateScene2232() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2233(0); } else if (_field20 == 2) { @@ -1127,11 +999,7 @@ void Module2200::updateScene2232() { } void Module2200::updateScene2233() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2234(0); } else if (_field20 == 2) { @@ -1144,11 +1012,7 @@ void Module2200::updateScene2233() { } void Module2200::updateScene2234() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2235(0); } else if (_field20 == 2) { @@ -1161,11 +1025,7 @@ void Module2200::updateScene2234() { } void Module2200::updateScene2235() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2243(0); } else if (_field20 == 2) { @@ -1178,11 +1038,7 @@ void Module2200::updateScene2235() { } void Module2200::updateScene2236() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2237(0); } else if (_field20 == 2) { @@ -1195,11 +1051,7 @@ void Module2200::updateScene2236() { } void Module2200::updateScene2237() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2238(0); } else if (_field20 == 2) { @@ -1212,11 +1064,7 @@ void Module2200::updateScene2237() { } void Module2200::updateScene2238() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2239(0); } else if (_field20 == 2) { @@ -1229,11 +1077,7 @@ void Module2200::updateScene2238() { } void Module2200::updateScene2239() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2240(0); } else if (_field20 == 2) { @@ -1246,11 +1090,7 @@ void Module2200::updateScene2239() { } void Module2200::updateScene2240() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2241(0); } else if (_field20 == 2) { @@ -1263,11 +1103,7 @@ void Module2200::updateScene2240() { } void Module2200::updateScene2241() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2242(0); } else if (_field20 == 2) { @@ -1280,11 +1116,7 @@ void Module2200::updateScene2241() { } void Module2200::updateScene2242() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2248(0); _childObject->handleUpdate(); @@ -1299,11 +1131,7 @@ void Module2200::updateScene2242() { } void Module2200::updateScene2243() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2244(0); } else if (_field20 == 2) { @@ -1316,11 +1144,7 @@ void Module2200::updateScene2243() { } void Module2200::updateScene2244() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2245(0); } else if (_field20 == 2) { @@ -1333,11 +1157,7 @@ void Module2200::updateScene2244() { } void Module2200::updateScene2245() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2246(0); } else if (_field20 == 2) { @@ -1350,11 +1170,7 @@ void Module2200::updateScene2245() { } void Module2200::updateScene2246() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2236(0); } else if (_field20 == 2) { @@ -1367,11 +1183,7 @@ void Module2200::updateScene2246() { } void Module2200::updateScene2247() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2210(0); } else if (_field20 == 2) { @@ -1384,11 +1196,7 @@ void Module2200::updateScene2247() { } void Module2200::updateScene2248() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene2242(1); _childObject->handleUpdate(); } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 19861ac7ca..60f8134929 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -125,11 +125,7 @@ void Module2300::createScene2305(int which) { } void Module2300::updateScene2301() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2302(4); _childObject->handleUpdate(); @@ -140,28 +136,7 @@ void Module2300::updateScene2301() { } void Module2300::updateScene2302() { - _childObject->handleUpdate(); -#if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && - navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { - _volume++; - Sound1ChList_setVolume(0x90F0D1C3, _volume); - } -#endif -#if 0 // TODO - if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && - navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { - Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64); - Sound1ChList_setVolume(0x48498E46, 70); - Sound1ChList_setVolume(0x50399F64, 70); - } -#endif - if (_done) { - debug("SCENE 2302 DONE; _field20 = %d", _field20); - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { createScene2301(0); _childObject->handleUpdate(); @@ -179,15 +154,28 @@ void Module2300::updateScene2302() { } else { sendMessage(_parentModule, 0x1009, 4); } + } else { +#if 0 // TODO + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && + navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { + _volume++; + Sound1ChList_setVolume(0x90F0D1C3, _volume); + } +#endif +#if 0 // TODO + if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && + navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { + Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64); + Sound1ChList_setVolume(0x48498E46, 70); + Sound1ChList_setVolume(0x50399F64, 70); + } +#endif } } void Module2300::updateScene2303() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { sendMessage(_parentModule, 0x1009, 3); } else { @@ -195,44 +183,30 @@ void Module2300::updateScene2303() { _childObject->handleUpdate(); } } - if (_field24 >= 0) { - if (_field24 == 1) { - // TODO _resourceTable1.setResourceList(ex_sub_479D00(0), true); - // TODO _resourceTable2.loadResources(); - } - _field24 = -1; - } } void Module2300::updateScene2304() { - _childObject->handleUpdate(); -#if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && - navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { - _volume--; - Sound1ChList_setVolume(0x90F0D1C3, _volume); - } -#endif - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { if (_field20 == 1) { sendMessage(_parentModule, 0x1009, 2); } else { createScene2302(1); _childObject->handleUpdate(); } + } else { +#if 0 // TODO + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && + navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { + _volume--; + Sound1ChList_setVolume(0x90F0D1C3, _volume); + } +#endif } } void Module2300::updateScene2305() { - _childObject->handleUpdate(); - if (_done) { - _done = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { // TODO Sound1ChList_sub_4080B0(false); createScene2302(2); _childObject->handleUpdate(); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index cc617a3fbc..bccc72352b 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -27,7 +27,7 @@ namespace Neverhood { Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _moduleDone(false), _soundVolume(0) { + : Module(vm, parentModule), _soundVolume(0) { debug("Create Module3000(%d)", which); @@ -95,25 +95,12 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) createScene3006(1); } - SetMessageHandler(&Module3000::handleMessage); - } Module3000::~Module3000() { // TODO Sound1ChList_sub_407A50(0x81293110); } -uint32 Module3000::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Module::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1009: - _moduleDone = true; - _moduleDoneStatus = param.asInteger(); - break; - } - return messageResult; -} - void Module3000::createScene3002(int which) { _vm->gameState().sceneNum = 1; if (!getGlobalVar(0x01BA1A52)) { @@ -276,20 +263,20 @@ void Module3000::updateScene3002() { } } #endif - if (_moduleDone) { + if (_done) { int areaType = navigationScene()->getNavigationAreaType(); - _moduleDone = false; + _done = false; delete _childObject; _childObject = NULL; if (!getGlobalVar(0x01BA1A52)) { - if (_moduleDoneStatus == 0) { + if (_field20 == 0) { createScene3010(-1); _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 1) { + } else if (_field20 == 1) { sendMessage(_parentModule, 0x1009, 0); } } else { - if (_moduleDoneStatus == 0) { + if (_field20 == 0) { if (areaType == 2) { createScene3003(0); _childObject->handleUpdate(); @@ -297,7 +284,7 @@ void Module3000::updateScene3002() { //createScene3002b(-1); _childObject->handleUpdate(); } - } else if (_moduleDoneStatus == 1) { + } else if (_field20 == 1) { sendMessage(_parentModule, 0x1009, 0); } } @@ -305,11 +292,7 @@ void Module3000::updateScene3002() { } void Module3000::updateScene3002b() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 1: if (getGlobalVar(0x01BA1A52)) { @@ -339,79 +322,51 @@ void Module3000::updateScene3002b() { } void Module3000::updateScene3003() { - _childObject->handleUpdate(); -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); - if (_flag && _soundVolume > 1 && frameNumber % 2) { - _soundVolume--; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); - } - if (navigationIndex == 0) { - if (frameNumber == 35) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); - } - } else if (navigationIndex == 1) { - if (frameNumber == 55) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); - } - } - } -#endif - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); if (_flag) { _soundVolume = 0; // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); } - if (_moduleDoneStatus == 0) { + if (_field20 == 0) { createScene3004(0); _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 1) { + } else if (_field20 == 1) { setGlobalVar(0x01BA1A52, 0); createScene3002(1); _childObject->handleUpdate(); } - } -} - -void Module3000::updateScene3004() { - _childObject->handleUpdate(); + } else { #if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); - if (navigationIndex == 2) { - if (frameNumber == 40) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); - } - if (_flag && _soundVolume < 90 && frameNumber % 2) { - if (frameNumber == 0) - _soundVolume = 40; - else - _soundVolume++; + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (_flag && _soundVolume > 1 && frameNumber % 2) { + _soundVolume--; // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); } + if (navigationIndex == 0) { + if (frameNumber == 35) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 1) { + if (frameNumber == 55) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } + } } - } #endif - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; - - debug("_moduleDoneStatus = %d", _moduleDoneStatus); - - if (_moduleDoneStatus == 1) { + } +} + +void Module3000::updateScene3004() { + if (!updateChild()) { + if (_field20 == 1) { createScene3005(0); _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 3) { + } else if (_field20 == 3) { createScene3011(-1); _childObject->handleUpdate(); } else if (getGlobalVar(0x09221A62)) { @@ -421,54 +376,64 @@ void Module3000::updateScene3004() { createScene3003(1); _childObject->handleUpdate(); } + } else { +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (navigationIndex == 2) { + if (frameNumber == 40) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + } + } + } +#endif } } void Module3000::updateScene3005() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; - if (_moduleDoneStatus == 0) { + if (!updateChild()) { + if (_field20 == 0) { sendMessage(_parentModule, 0x1009, 1); - } else if (_moduleDoneStatus == 1) { + } else if (_field20 == 1) { createScene3008(-1); _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 2) { + } else if (_field20 == 2) { createScene3004(3); _childObject->handleUpdate(); } } - // NOTE: Skipped resource preloading stuff } void Module3000::updateScene3006() { - _childObject->handleUpdate(); -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { - // TODO Sound1ChList_sub_4080B0(false); - } -#endif - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; - if (_moduleDoneStatus == 0) { + if (!updateChild()) { + if (_field20 == 0) { createScene3007(0); - _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 1) { + } else if (_field20 == 1) { createScene3004(0); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); + } else { +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { + // TODO Sound1ChList_sub_4080B0(false); + } +#endif } } void Module3000::updateScene3007() { _childObject->handleUpdate(); - if (_moduleDone) { + if (_done) { int areaType = navigationScene()->getNavigationAreaType(); - _moduleDone = false; + _done = false; delete _childObject; _childObject = NULL; if (areaType == 4) { @@ -482,14 +447,9 @@ void Module3000::updateScene3007() { } void Module3000::updateScene3009() { - _childObject->handleUpdate(); - // TODO... - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { _flag = getGlobalVar(0x10938830); // CHECKME - if (_moduleDoneStatus != 1) { + if (_field20 != 1) { // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0): createScene3005(1); _childObject->handleUpdate(); @@ -505,15 +465,11 @@ void Module3000::updateScene3009() { } void Module3000::updateScene3010() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; - if (_moduleDoneStatus == 0 || _moduleDoneStatus == 2) { + if (!updateChild()) { + if (_field20 == 0 || _field20 == 2) { createScene3002(0); _childObject->handleUpdate(); - } else if (_moduleDoneStatus == 1) { + } else if (_field20 == 1) { createScene3002b(-1); _childObject->handleUpdate(); } @@ -521,11 +477,7 @@ void Module3000::updateScene3010() { } void Module3000::updateScene3011() { - _childObject->handleUpdate(); - if (_moduleDone) { - _moduleDone = false; - delete _childObject; - _childObject = NULL; + if (!updateChild()) { createScene3004(3); _childObject->handleUpdate(); } diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 64a4b76817..63e5261207 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -35,8 +35,6 @@ public: Module3000(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module3000(); protected: - bool _moduleDone; - int _moduleDoneStatus; int _soundVolume; bool _flag; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 828c0dd08e..9dc1d8bc7e 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -117,12 +117,8 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfac StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) : Sprite(vm, 0), _spriteResource(vm) { - - debug("StaticSprite::StaticSprite(%08X)", fileHash); - _name = "StaticSprite"; init(fileHash, surfacePriority, x, y, width, height); - } void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 16d79319fd..ff1830469d 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -31,8 +31,8 @@ namespace Neverhood { #define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback); debug(2, "SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback -#define SetFilterX(callback) _filterXCb = static_cast (callback); debug("SetFilterX(" #callback ")") -#define SetFilterY(callback) _filterYCb = static_cast (callback); debug("SetFilterY(" #callback ")") +#define SetFilterX(callback) _filterXCb = static_cast (callback); debug(2, "SetFilterX(" #callback ")") +#define SetFilterY(callback) _filterYCb = static_cast (callback); debug(2, "SetFilterY(" #callback ")") const int16 kDefPosition = -32768; @@ -99,9 +99,9 @@ protected: void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); }; -#define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback); debug("SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback -#define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback); debug("SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback -#define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback); debug("SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback +#define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback); debug(2, "SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback +#define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback); debug(2, "SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback +#define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback); debug(2, "SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback #define AnimationCallback(callback) static_cast (callback) class AnimatedSprite : public Sprite { -- cgit v1.2.3 From fad64afa441b686b721fcba6084b083fa4436529 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Sep 2011 20:37:24 +0000 Subject: NEVERHOOD: Remove unused resource preloading stuff (probably resource preloading is not needed since the original game ran off slow double/quad-speed cd drives and preloading reduced stuttering while playing back then) - Add Klayman animation speedup --- engines/neverhood/gamemodule.cpp | 41 +++++----- engines/neverhood/klayman.cpp | 19 ++--- engines/neverhood/klayman.h | 2 + engines/neverhood/module.cpp | 13 +-- engines/neverhood/module.h | 3 +- engines/neverhood/module1000.cpp | 8 +- engines/neverhood/module1200.cpp | 4 +- engines/neverhood/module1300.cpp | 34 ++++---- engines/neverhood/module1400.cpp | 12 +-- engines/neverhood/module1700.cpp | 10 +-- engines/neverhood/module1800.cpp | 30 +++---- engines/neverhood/module2000.cpp | 8 +- engines/neverhood/module2200.cpp | 170 +++++++++++++++++++-------------------- engines/neverhood/module2300.cpp | 16 ++-- engines/neverhood/module3000.cpp | 35 ++++---- engines/neverhood/sprite.h | 1 + 16 files changed, 197 insertions(+), 209 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 6ef58e4fae..efd191eb0c 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -238,20 +238,17 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti _someFlag1 = true; return messageResult; case 0x1009: - _field24 = -1; - _field26 = -1; - _field28 = -1; - _field20 = param.asInteger(); + _moduleResult = param.asInteger(); _done = true; return messageResult; case 0x100A: - _field24 = (int16)param.asInteger(); + // Unused resource preloading message return messageResult; case 0x101F: _field2C = true; return messageResult; case 0x1023: - _field26 = (int16)param.asInteger(); + // Unused resource preloading message return messageResult; } return messageResult; @@ -310,7 +307,7 @@ void GameModule::createModule1200(int which) { void GameModule::updateModule1200() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { error("// TODO createModule2600(0);"); // TODO createModule2600(0); // TODO _childObject->handleUpdate(); @@ -329,7 +326,7 @@ void GameModule::createModule1300(int which) { void GameModule::updateModule1300() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { // TODO _gameState.clear(); // TODO GameModule_handleKeyEscape } else { @@ -347,7 +344,7 @@ void GameModule::createModule1400(int which) { void GameModule::updateModule1400() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { error("WEIRD!"); } else { // TODO createModule1600(1); @@ -378,8 +375,8 @@ void GameModule::createModule1700(int which) { void GameModule::updateModule1700() { if (!updateChild()) { - debug("Module1700 done; _field20 = %d", _field20); - if (_field20 == 1) { + debug("Module1700 done; _moduleResult = %d", _moduleResult); + if (_moduleResult == 1) { // TODO createModule2900(3); // TODO _childObject->handleUpdate(); } else { @@ -397,13 +394,13 @@ void GameModule::createModule1800(int which) { void GameModule::updateModule1800() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { // TODO GameState_clear(); // TODO GameModule_handleKeyEscape(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { // TODO createModule2700(0); // TODO _childObject->handleUpdate(); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { // TODO createModule3000(3); // TODO _childObject->handleUpdate(); } else { @@ -447,13 +444,13 @@ void GameModule::createModule2300(int which) { void GameModule::updateModule2300() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createModule2200(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createModule1200(0); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { // TODO createModule2400(0); - } else if (_field20 == 4) { + } else if (_moduleResult == 4) { // TODO createModule3000(0); } else { createModule1000(1); @@ -474,15 +471,15 @@ void GameModule::createModule3000(int which) { void GameModule::updateModule3000() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { // TODO createModule1900(0); // TODO _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { // WEIRD: Sets the errorFlag - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createModule1800(3); _childObject->handleUpdate(); - } else if (_field20 == 4) { + } else if (_moduleResult == 4) { // TODO createModule3000(0); // TODO _childObject->handleUpdate(); } else { diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 7102870f1e..b5d266e30f 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -1340,15 +1340,13 @@ void Klayman::sub41FC40() { } uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam ¶m, Entity *sender) { + int16 speedUpFrameIndex; switch (messageNum) { case 0x1008: - debug("case 0x1008"); -#if 0 // TODO - if (_frameIndex < getHashListIndexByString("SpeedUp")) { - setFileHash(0xAC20C012, getHashListIndexByString("SpeedUp"), -1) - _y = 435; + speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); + if (_frameIndex < speedUpFrameIndex) { + setFileHash(0xAC20C012, speedUpFrameIndex, -1); } -#endif return 0; case 0x100D: if (param.asInteger() == 0x32180101) { @@ -2371,16 +2369,15 @@ uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶ } uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender) { + int16 speedUpFrameIndex; uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: - debug("case 0x1008"); -#if 0 // TODO - if (_frameIndex < getHashListIndexByString("SpeedUp")) { - setFileHash(0x35AA8059, getHashListIndexByString("SpeedUp"), -1) + speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); + if (_frameIndex < speedUpFrameIndex) { + setFileHash(0x35AA8059, speedUpFrameIndex, -1); _y = 435; } -#endif messageResult = 0; break; case 0x100D: diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a25176eefd..3f15b8fb28 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -34,6 +34,8 @@ namespace Neverhood { class Klayman; +const uint32 kKlaymanSpeedUpHash = 0x004A2148; + struct KlaymanTableItem { int value; void (Klayman::*callback)(); diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 6d49838c49..78775ceba1 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -28,7 +28,7 @@ namespace Neverhood { Module::Module(NeverhoodEngine *vm, Module *parentModule) : Entity(vm, 0), _parentModule(parentModule), _childObject(NULL), - _done(false), _field24(-1), _field26(-1), _field28(-1) { + _done(false) { SetMessageHandler(&Module::handleMessage); @@ -50,20 +50,13 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * sendMessage(_parentModule, 8, 0); return 0; case 0x1009: - _field24 = -1; - _field26 = -1; - _field28 = -1; - _field20 = param.asInteger(); + _moduleResult = param.asInteger(); _done = true; return 0; case 0x100A: - _field24 = (int16)param.asInteger(); - return 0; case 0x1023: - _field26 = (int16)param.asInteger(); - return 0; case 0x1024: - _field28 = (int16)param.asInteger(); + // Unused resource preloading messages return 0; default: if (_childObject && sender == _parentModule) diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index a37fd522aa..2f272d71b6 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -47,8 +47,7 @@ protected: Module *_parentModule; Entity *_childObject; bool _done; - int16 _field24, _field26, _field28; - uint32 _field20; + uint32 _moduleResult; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); NavigationScene *navigationScene(); void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 51e1d1959d..8185430d16 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -102,7 +102,7 @@ void Module1000::createScene1005(int which) { void Module1000::updateScene1001() { if (!updateChild()) { - if (_field20 == 2) { + if (_moduleResult == 2) { createScene1003(0); _childObject->handleUpdate(); } else { @@ -114,9 +114,9 @@ void Module1000::updateScene1001() { void Module1000::updateScene1002() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { sendMessage(_parentModule, 0x1009, 0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1004(0); _childObject->handleUpdate(); } else { @@ -135,7 +135,7 @@ void Module1000::updateScene1003() { void Module1000::updateScene1004() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1005(0); _childObject->handleUpdate(); } else { diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index fa0bea0e94..9e198cc67c 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -80,10 +80,10 @@ void Module1200::createScene1203(int which) { void Module1200::updateScene1201() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1202(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { createScene1203(-1); } else { diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 149af4a071..189ee2c2ff 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -284,7 +284,7 @@ void Module1300::createScene1318(int which) { void Module1300::updateScene1302() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1305(0); } else { createScene1308(1); @@ -316,15 +316,15 @@ void Module1300::updateScene1305() { void Module1300::updateScene1306() { if (!updateChild()) { - if (_field20 == 2) { + if (_moduleResult == 2) { createScene1309(0); _childObject->handleUpdate(); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createScene1303(0); _childObject->handleUpdate(); - } else if (_field20 == 0) { + } else if (_moduleResult == 0) { sendMessage(_parentModule, 0x1009, 0); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1311(-1); _childObject->handleUpdate(); } @@ -340,11 +340,11 @@ void Module1300::updateScene1307() { void Module1300::updateScene1308() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1314(0); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1302(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1307(0); } _childObject->handleUpdate(); @@ -373,9 +373,9 @@ void Module1300::updateScene1311() { void Module1300::updateScene1312() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1313(0); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1312(1); } _childObject->handleUpdate(); @@ -384,7 +384,7 @@ void Module1300::updateScene1312() { void Module1300::updateScene1313() { if (!updateChild()) { - switch (_field20) { + switch (_moduleResult) { case 0: createScene1315(1); break; @@ -404,9 +404,9 @@ void Module1300::updateScene1313() { void Module1300::updateScene1314() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1313(2); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1308(0); } _childObject->handleUpdate(); @@ -415,9 +415,9 @@ void Module1300::updateScene1314() { void Module1300::updateScene1315() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1313(3); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1310(-1); } _childObject->handleUpdate(); @@ -426,9 +426,9 @@ void Module1300::updateScene1315() { void Module1300::updateScene1316() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1313(4); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1304(0); } _childObject->handleUpdate(); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index edc47f5a56..7f55272228 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -122,10 +122,10 @@ void Module1400::createScene1407(int which) { void Module1400::updateScene1401() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1402(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1404(0); _childObject->handleUpdate(); } else { @@ -136,10 +136,10 @@ void Module1400::updateScene1401() { void Module1400::updateScene1402() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1403(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1407(-1); _childObject->handleUpdate(); } else { @@ -158,10 +158,10 @@ void Module1400::updateScene1403() { void Module1400::updateScene1404() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1405(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1406(-1); _childObject->handleUpdate(); } else { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 528161ea2b..0aea8d1f24 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -114,10 +114,10 @@ void Module1700::updateScene1701() { void Module1700::updateScene1702() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1703(0); _childObject->handleUpdate(); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1702(1); _childObject->handleUpdate(); } @@ -126,13 +126,13 @@ void Module1700::updateScene1702() { void Module1700::updateScene1703() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1704(-1); _childObject->handleUpdate(); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1702(1); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { if (!_soundResource.isPlaying()) { // TODO _soundResource.setVolume(60); _soundResource.play(0x58B45E58); diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index d3dc4b6e9e..31a156461d 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -147,13 +147,13 @@ void Module1800::createScene1809(int which) { void Module1800::updateScene1801() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene1805(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1802(-1); _childObject->handleUpdate(); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createScene1804(0); _childObject->handleUpdate(); } @@ -185,15 +185,15 @@ void Module1800::updateScene1802() { void Module1800::updateScene1803() { if (!updateChild()) { - if (_field20 == 2) { + if (_moduleResult == 2) { createScene1801(2); _childObject->handleUpdate(); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { sendMessage(_parentModule, 0x1009, 0); - } else if (_field20 == 6) { + } else if (_moduleResult == 6) { createScene1809(-1); _childObject->handleUpdate(); - } else if (_field20 == 7) { + } else if (_moduleResult == 7) { sendMessage(_parentModule, 0x1009, 3); } } @@ -201,9 +201,9 @@ void Module1800::updateScene1803() { void Module1800::updateScene1804() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1804b(-1); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1801(1); } _childObject->handleUpdate(); @@ -212,13 +212,13 @@ void Module1800::updateScene1804() { void Module1800::updateScene1805() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene1807(-1); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1806(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene1801(3); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createScene1805(3); } _childObject->handleUpdate(); @@ -227,9 +227,9 @@ void Module1800::updateScene1805() { void Module1800::updateScene1806() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { sendMessage(_parentModule, 0x1009, 2); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene1805(3); _childObject->handleUpdate(); } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 130235512c..bedc9d4b08 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -84,7 +84,7 @@ void Module2000::createScene2003(int which) { void Module2000::updateScene2001() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { sendMessage(_parentModule, 0x1009, 0); } else { createScene2002(0); @@ -94,15 +94,15 @@ void Module2000::updateScene2001() { void Module2000::updateScene2002() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { if (getGlobalVar(0x98109F12)) { createScene2002(0); } else { createScene2003(-1); } - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene2002(1); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2001(0); } } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 321fab1484..2db0eb4bb9 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -499,9 +499,9 @@ void Module2200::createScene2248(int which) { void Module2200::updateScene2201() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2203(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2202(0); } else { sendMessage(_parentModule, 0x1009, 0); @@ -517,9 +517,9 @@ void Module2200::updateScene2202() { void Module2200::updateScene2203() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2205(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2204(0); } else { createScene2201(1); @@ -536,9 +536,9 @@ void Module2200::updateScene2204() { void Module2200::updateScene2205() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2206(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2205(2); } else { createScene2203(1); @@ -549,11 +549,11 @@ void Module2200::updateScene2205() { void Module2200::updateScene2206() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2247(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2207(0); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createScene2209(0); } else { createScene2205(1); @@ -701,9 +701,9 @@ void Module2200::updateScene2209() { void Module2200::updateScene2210() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2211(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2247(1); @@ -714,9 +714,9 @@ void Module2200::updateScene2210() { void Module2200::updateScene2211() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2212(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2210(1); @@ -727,9 +727,9 @@ void Module2200::updateScene2211() { void Module2200::updateScene2212() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2213(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2211(1); @@ -740,9 +740,9 @@ void Module2200::updateScene2212() { void Module2200::updateScene2213() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2214(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2212(1); @@ -753,9 +753,9 @@ void Module2200::updateScene2213() { void Module2200::updateScene2214() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2215(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2213(1); @@ -766,9 +766,9 @@ void Module2200::updateScene2214() { void Module2200::updateScene2215() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2216(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2214(1); @@ -779,9 +779,9 @@ void Module2200::updateScene2215() { void Module2200::updateScene2216() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2217(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2215(1); @@ -792,9 +792,9 @@ void Module2200::updateScene2216() { void Module2200::updateScene2217() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2218(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2216(1); @@ -805,9 +805,9 @@ void Module2200::updateScene2217() { void Module2200::updateScene2218() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2219(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2217(1); @@ -818,9 +818,9 @@ void Module2200::updateScene2218() { void Module2200::updateScene2219() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2220(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2218(1); @@ -831,9 +831,9 @@ void Module2200::updateScene2219() { void Module2200::updateScene2220() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2221(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2219(1); @@ -844,9 +844,9 @@ void Module2200::updateScene2220() { void Module2200::updateScene2221() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2222(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2220(1); @@ -857,9 +857,9 @@ void Module2200::updateScene2221() { void Module2200::updateScene2222() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2223(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2221(1); @@ -870,9 +870,9 @@ void Module2200::updateScene2222() { void Module2200::updateScene2223() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2224(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2222(1); @@ -883,9 +883,9 @@ void Module2200::updateScene2223() { void Module2200::updateScene2224() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2225(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2223(1); @@ -896,9 +896,9 @@ void Module2200::updateScene2224() { void Module2200::updateScene2225() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2226(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2224(1); @@ -909,9 +909,9 @@ void Module2200::updateScene2225() { void Module2200::updateScene2226() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2227(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2225(1); @@ -922,9 +922,9 @@ void Module2200::updateScene2226() { void Module2200::updateScene2227() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2228(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2226(1); @@ -935,9 +935,9 @@ void Module2200::updateScene2227() { void Module2200::updateScene2228() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2229(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2227(1); @@ -948,9 +948,9 @@ void Module2200::updateScene2228() { void Module2200::updateScene2229() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2230(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2228(1); @@ -961,9 +961,9 @@ void Module2200::updateScene2229() { void Module2200::updateScene2230() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2231(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2229(1); @@ -974,9 +974,9 @@ void Module2200::updateScene2230() { void Module2200::updateScene2231() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2232(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2230(1); @@ -987,9 +987,9 @@ void Module2200::updateScene2231() { void Module2200::updateScene2232() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2233(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2231(1); @@ -1000,9 +1000,9 @@ void Module2200::updateScene2232() { void Module2200::updateScene2233() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2234(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2232(1); @@ -1013,9 +1013,9 @@ void Module2200::updateScene2233() { void Module2200::updateScene2234() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2235(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2233(1); @@ -1026,9 +1026,9 @@ void Module2200::updateScene2234() { void Module2200::updateScene2235() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2243(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2234(1); @@ -1039,9 +1039,9 @@ void Module2200::updateScene2235() { void Module2200::updateScene2236() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2237(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2246(1); @@ -1052,9 +1052,9 @@ void Module2200::updateScene2236() { void Module2200::updateScene2237() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2238(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2236(1); @@ -1065,9 +1065,9 @@ void Module2200::updateScene2237() { void Module2200::updateScene2238() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2239(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2237(1); @@ -1078,9 +1078,9 @@ void Module2200::updateScene2238() { void Module2200::updateScene2239() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2240(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2238(1); @@ -1091,9 +1091,9 @@ void Module2200::updateScene2239() { void Module2200::updateScene2240() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2241(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2239(1); @@ -1104,9 +1104,9 @@ void Module2200::updateScene2240() { void Module2200::updateScene2241() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2242(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2240(1); @@ -1117,10 +1117,10 @@ void Module2200::updateScene2241() { void Module2200::updateScene2242() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2248(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); _childObject->handleUpdate(); } else { @@ -1132,9 +1132,9 @@ void Module2200::updateScene2242() { void Module2200::updateScene2243() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2244(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2235(1); @@ -1145,9 +1145,9 @@ void Module2200::updateScene2243() { void Module2200::updateScene2244() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2245(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2243(1); @@ -1158,9 +1158,9 @@ void Module2200::updateScene2244() { void Module2200::updateScene2245() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2246(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2244(1); @@ -1171,9 +1171,9 @@ void Module2200::updateScene2245() { void Module2200::updateScene2246() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2236(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2245(1); @@ -1184,9 +1184,9 @@ void Module2200::updateScene2246() { void Module2200::updateScene2247() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2210(0); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2208(0); } else { createScene2206(1); diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 60f8134929..ce9250a9b6 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -126,7 +126,7 @@ void Module2300::createScene2305(int which) { void Module2300::updateScene2301() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2302(4); _childObject->handleUpdate(); } else { @@ -137,19 +137,19 @@ void Module2300::updateScene2301() { void Module2300::updateScene2302() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene2301(0); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene2303(1); _childObject->handleUpdate(); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createScene2302(3); _childObject->handleUpdate(); - } else if (_field20 == 4) { + } else if (_moduleResult == 4) { createScene2304(1); _childObject->handleUpdate(); - } else if (_field20 == 5) { + } else if (_moduleResult == 5) { sendMessage(_parentModule, 0x1009, 3); } else { sendMessage(_parentModule, 0x1009, 4); @@ -176,7 +176,7 @@ void Module2300::updateScene2302() { void Module2300::updateScene2303() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { sendMessage(_parentModule, 0x1009, 3); } else { createScene2302(5); @@ -187,7 +187,7 @@ void Module2300::updateScene2303() { void Module2300::updateScene2304() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { sendMessage(_parentModule, 0x1009, 2); } else { createScene2302(1); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index bccc72352b..cfcacaf693 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -269,14 +269,14 @@ void Module3000::updateScene3002() { delete _childObject; _childObject = NULL; if (!getGlobalVar(0x01BA1A52)) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene3010(-1); _childObject->handleUpdate(); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { sendMessage(_parentModule, 0x1009, 0); } } else { - if (_field20 == 0) { + if (_moduleResult == 0) { if (areaType == 2) { createScene3003(0); _childObject->handleUpdate(); @@ -284,7 +284,7 @@ void Module3000::updateScene3002() { //createScene3002b(-1); _childObject->handleUpdate(); } - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { sendMessage(_parentModule, 0x1009, 0); } } @@ -328,10 +328,10 @@ void Module3000::updateScene3003() { _soundVolume = 0; // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); } - if (_field20 == 0) { + if (_moduleResult == 0) { createScene3004(0); _childObject->handleUpdate(); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { setGlobalVar(0x01BA1A52, 0); createScene3002(1); _childObject->handleUpdate(); @@ -363,10 +363,10 @@ void Module3000::updateScene3003() { void Module3000::updateScene3004() { if (!updateChild()) { - if (_field20 == 1) { + if (_moduleResult == 1) { createScene3005(0); _childObject->handleUpdate(); - } else if (_field20 == 3) { + } else if (_moduleResult == 3) { createScene3011(-1); _childObject->handleUpdate(); } else if (getGlobalVar(0x09221A62)) { @@ -400,12 +400,12 @@ void Module3000::updateScene3004() { void Module3000::updateScene3005() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { sendMessage(_parentModule, 0x1009, 1); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene3008(-1); _childObject->handleUpdate(); - } else if (_field20 == 2) { + } else if (_moduleResult == 2) { createScene3004(3); _childObject->handleUpdate(); } @@ -414,9 +414,9 @@ void Module3000::updateScene3005() { void Module3000::updateScene3006() { if (!updateChild()) { - if (_field20 == 0) { + if (_moduleResult == 0) { createScene3007(0); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene3004(0); } _childObject->handleUpdate(); @@ -449,7 +449,7 @@ void Module3000::updateScene3007() { void Module3000::updateScene3009() { if (!updateChild()) { _flag = getGlobalVar(0x10938830); // CHECKME - if (_field20 != 1) { + if (_moduleResult != 1) { // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0): createScene3005(1); _childObject->handleUpdate(); @@ -466,13 +466,12 @@ void Module3000::updateScene3009() { void Module3000::updateScene3010() { if (!updateChild()) { - if (_field20 == 0 || _field20 == 2) { + if (_moduleResult == 0 || _moduleResult == 2) { createScene3002(0); - _childObject->handleUpdate(); - } else if (_field20 == 1) { + } else if (_moduleResult == 1) { createScene3002b(-1); - _childObject->handleUpdate(); } + _childObject->handleUpdate(); } } diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index ff1830469d..f17b2d4216 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -114,6 +114,7 @@ public: void clearRepl(); uint32 getCurrAnimFileHash() const { return _currAnimFileHash; } int16 getFrameIndex() const { return _frameIndex; } + int16 getFrameIndex(uint32 frameHash) { return _animResource.getFrameIndex(frameHash); } void setNewHashListIndex(int value) { _newHashListIndex = value; } void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4); protected: -- cgit v1.2.3 From 02fe0bc65de94217afdc856c181be8dd761870cf Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 07:37:32 +0000 Subject: NEVERHOOD: Merge scene-specific createSceneXXX/updateSceneXXX methods into createScene and updateScene (for Module2200 only so far) --- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/module2200.cpp | 1552 ++++++++++++-------------------------- engines/neverhood/module2200.h | 98 +-- 3 files changed, 491 insertions(+), 1165 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index efd191eb0c..abe61d2877 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -264,7 +264,7 @@ void GameModule::startup() { //createModule1700(-1); //createModule1700(1); //createModule1400(-1); -#if 1 +#if 0 _vm->gameState().sceneNum = 0; createModule1200(-1); #endif @@ -276,8 +276,8 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule2000(-1); #endif -#if 0 - _vm->gameState().sceneNum = 0; +#if 1 + _vm->gameState().sceneNum = 2; createModule2200(-1); #endif #if 0 diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 2db0eb4bb9..c8eca785b3 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -36,1172 +36,592 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) // TODO: Music18hList_add(0x11391412, 0x601C908C); if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else { + createScene(0, 0); + } + +} + +Module2200::~Module2200() { + // TODO Sound1ChList_sub_407A50(0x11391412); +} + +void Module2200::createScene(int sceneNum, int which) { + // CHECKME if this can be used regardless of the new sceneNum + if (sceneNum == 7 && which >= 0) + _vm->gameState().which = _vm->gameState().sceneNum; + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _childObject = new Scene2201(_vm, this, which); + break; + case 1: + // TODO Music18hList_play(0x601C908C, 0, 2, 1); + _childObject = new Scene2202(_vm, this, which); + break; + case 2: + // TODO Music18hList_play(0x601C908C, 0, 2, 1); + _childObject = new Scene2203(_vm, this, which); + break; + case 3: + // TODO Music18hList_stop(0x601C908C, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 3); + break; + case 4: + // TODO Music18hList_stop(0x601C908C, 0, 2); + _childObject = new Scene2205(_vm, this, which); + break; + case 5: + // TODO Music18hList_stop(0x601C908C, 0, 2); + _childObject = new Scene2206(_vm, this, which); + break; + case 6: + _childObject = new Scene2207(_vm, this, which); + break; + case 7: + _childObject = new Scene2208(_vm, this, which); + break; + case 8: + _childObject = new Scene2208(_vm, this, which); + break; + case 9: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180); + break; + case 10: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198); + break; + case 11: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0); + break; + case 12: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8); + break; + case 13: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0); + break; + case 14: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8); + break; + case 15: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210); + break; + case 16: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228); + break; + case 17: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240); + break; + case 18: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258); + break; + case 19: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270); + break; + case 20: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288); + break; + case 21: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0); + break; + case 22: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8); + break; + case 23: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0); + break; + case 24: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8); + break; + case 25: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300); + break; + case 26: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318); + break; + case 27: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330); + break; + case 28: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348); + break; + case 29: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360); + break; + case 30: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378); + break; + case 31: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390); + break; + case 32: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8); + break; + case 33: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0); + break; + case 34: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8); + break; + case 35: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0); + break; + case 36: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408); + break; + case 37: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420); + break; + case 38: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438); + break; + case 39: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450); + break; + case 40: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468); + break; + case 41: + _childObject = new Scene2242(_vm, this, which); + break; + case 42: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480); + break; + case 43: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498); + break; + case 44: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0); + break; + case 45: + _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8); + break; + case 46: + _childObject = new Scene2247(_vm, this, which); + break; + case 47: + if (!getGlobalVar(0x98109F12)) { + if (getGlobalVar(0x4D080E54)) + _childObject = new Class152(_vm, this, 0x83110287, 0x10283839); + else + _childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C); + } else { + if (getGlobalVar(0x4D080E54)) + _childObject = new Class152(_vm, this, 0x48632087, 0x3208348E); + else + _childObject = new Class152(_vm, this, 0x08C74886, 0x74882084); + } + break; + } + SetUpdateHandler(&Module2200::updateScene); + _childObject->handleUpdate(); +} + +void Module2200::updateScene() { + if (!updateChild()) { switch (_vm->gameState().sceneNum) { - default: - createScene2201(-1); + case 0: + if (_moduleResult == 1) { + createScene(2, 0); + } else if (_moduleResult == 2) { + createScene(1, 0); + } else { + sendMessage(_parentModule, 0x1009, 0); + } break; case 1: - createScene2202(-1); + createScene(0, 2); break; case 2: - createScene2203(-1); + if (_moduleResult == 1) { + createScene(4, 0); + } else if (_moduleResult == 2) { + createScene(3, 0); + } else { + createScene(0, 1); + } break; case 3: - createScene2204(-1); + createScene(2, 2); break; case 4: - createScene2205(-1); + if (_moduleResult == 1) { + createScene(5, 0); + } else if (_moduleResult == 2) { + createScene(4, 2); + } else { + createScene(2, 1); + } break; case 5: - createScene2206(-1); + if (_moduleResult == 1) { + createScene(46, 0); + } else if (_moduleResult == 2) { + createScene(6, 0); + } else if (_moduleResult == 3) { + createScene(8, 0); + } else { + createScene(4, 1); + } break; case 6: - createScene2207(-1); + createScene(5, 2); break; case 7: - createScene2208(-1); + createScene(_vm->gameState().which, 2); break; case 8: - createScene2209(-1); + createScene(5, 3); break; case 9: - createScene2210(-1); + if (_moduleResult == 1) { + createScene(10, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(46, 1); + } break; case 10: - createScene2211(-1); + if (_moduleResult == 1) { + createScene(11, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(9, 1); + } break; case 11: - createScene2212(-1); + if (_moduleResult == 1) { + createScene(12, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(10, 1); + } break; case 12: - createScene2213(-1); + if (_moduleResult == 1) { + createScene(13, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(11, 1); + } break; case 13: - createScene2214(-1); + if (_moduleResult == 1) { + createScene(14, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(12, 1); + } break; case 14: - createScene2215(-1); + if (_moduleResult == 1) { + createScene(15, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(13, 1); + } break; case 15: - createScene2216(-1); + if (_moduleResult == 1) { + createScene(16, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(14, 1); + } break; case 16: - createScene2217(-1); + if (_moduleResult == 1) { + createScene(17, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(15, 1); + } break; case 17: - createScene2218(-1); + if (_moduleResult == 1) { + createScene(18, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(16, 1); + } break; case 18: - createScene2219(-1); + if (_moduleResult == 1) { + createScene(19, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(17, 1); + } break; case 19: - createScene2220(-1); + if (_moduleResult == 1) { + createScene(20, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(18, 1); + } break; case 20: - createScene2221(-1); + if (_moduleResult == 1) { + createScene(21, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(19, 1); + } break; case 21: - createScene2222(-1); + if (_moduleResult == 1) { + createScene(22, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(20, 1); + } break; case 22: - createScene2223(-1); + if (_moduleResult == 1) { + createScene(23, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(21, 1); + } break; case 23: - createScene2224(-1); + if (_moduleResult == 1) { + createScene(24, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(22, 1); + } break; case 24: - createScene2225(-1); + if (_moduleResult == 1) { + createScene(25, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(23, 1); + } break; case 25: - createScene2226(-1); + if (_moduleResult == 1) { + createScene(26, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(24, 1); + } break; case 26: - createScene2227(-1); + if (_moduleResult == 1) { + createScene(27, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(25, 1); + } break; case 27: - createScene2228(-1); + if (_moduleResult == 1) { + createScene(28, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(26, 1); + } break; case 28: - createScene2229(-1); + if (_moduleResult == 1) { + createScene(29, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(27, 1); + } break; case 29: - createScene2230(-1); + if (_moduleResult == 1) { + createScene(30, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(28, 1); + } break; case 30: - createScene2231(-1); + if (_moduleResult == 1) { + createScene(31, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(29, 1); + } break; case 31: - createScene2232(-1); + if (_moduleResult == 1) { + createScene(32, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(30, 1); + } break; case 32: - createScene2233(-1); + if (_moduleResult == 1) { + createScene(33, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(31, 1); + } break; case 33: - createScene2234(-1); + if (_moduleResult == 1) { + createScene(34, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(32, 1); + } break; case 34: - createScene2235(-1); + if (_moduleResult == 1) { + createScene(42, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(33, 1); + } break; case 35: - createScene2236(-1); + if (_moduleResult == 1) { + createScene(36, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(45, 1); + } break; case 36: - createScene2237(-1); + if (_moduleResult == 1) { + createScene(37, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(35, 1); + } break; case 37: - createScene2238(-1); + if (_moduleResult == 1) { + createScene(38, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(36, 1); + } break; case 38: - createScene2239(-1); + if (_moduleResult == 1) { + createScene(39, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(37, 1); + } break; case 39: - createScene2240(-1); + if (_moduleResult == 1) { + createScene(40, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(38, 1); + } break; case 40: - createScene2241(-1); + if (_moduleResult == 1) { + createScene(41, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(39, 1); + } break; case 41: - createScene2242(-1); + if (_moduleResult == 1) { + createScene(47, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(40, 1); + } break; case 42: - createScene2243(-1); + if (_moduleResult == 1) { + createScene(43, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(34, 1); + } break; case 43: - createScene2244(-1); + if (_moduleResult == 1) { + createScene(44, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(42, 1); + } break; case 44: - createScene2245(-1); + if (_moduleResult == 1) { + createScene(45, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(43, 1); + } break; case 45: - createScene2246(-1); + if (_moduleResult == 1) { + createScene(35, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(44, 1); + } break; case 46: - createScene2247(-1); + if (_moduleResult == 1) { + createScene(9, 0); + } else if (_moduleResult == 2) { + createScene(7, 0); + } else { + createScene(5, 1); + } break; case 47: - createScene2248(-1); + createScene(41, 1); break; } - } else { - createScene2201(0); } - -} - -Module2200::~Module2200() { - // TODO Sound1ChList_sub_407A50(0x11391412); -} - -void Module2200::createScene2201(int which) { - _vm->gameState().sceneNum = 0; - _childObject = new Scene2201(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2201); -} - -void Module2200::createScene2202(int which) { - // TODO Music18hList_play(0x601C908C, 0, 2, 1); - _vm->gameState().sceneNum = 1; - _childObject = new Scene2202(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2202); -} - -void Module2200::createScene2203(int which) { - // TODO Music18hList_play(0x601C908C, 0, 2, 1); - _vm->gameState().sceneNum = 2; - _childObject = new Scene2203(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2203); -} - -void Module2200::createScene2204(int which) { - _vm->gameState().sceneNum = 3; - // TODO Music18hList_stop(0x601C908C, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 3); - SetUpdateHandler(&Module2200::updateScene2204); -} - -void Module2200::createScene2205(int which) { - _vm->gameState().sceneNum = 4; - // TODO Music18hList_stop(0x601C908C, 0, 2); - _childObject = new Scene2205(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2205); -} - -void Module2200::createScene2206(int which) { - _vm->gameState().sceneNum = 5; - // TODO Music18hList_stop(0x601C908C, 0, 2); - _childObject = new Scene2206(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2206); -} - -void Module2200::createScene2207(int which) { - _vm->gameState().sceneNum = 6; - _childObject = new Scene2207(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2207); -} - -void Module2200::createScene2208(int which) { - if (which >= 0) - _vm->gameState().which = _vm->gameState().sceneNum; - _vm->gameState().sceneNum = 7; - _childObject = new Scene2208(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2208); -} - -void Module2200::createScene2209(int which) { - _vm->gameState().sceneNum = 8; - _childObject = new Scene2208(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2209); -} - -void Module2200::createScene2210(int which) { - _vm->gameState().sceneNum = 9; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180); - SetUpdateHandler(&Module2200::updateScene2210); -} - -void Module2200::createScene2211(int which) { - _vm->gameState().sceneNum = 10; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198); - SetUpdateHandler(&Module2200::updateScene2211); -} - -void Module2200::createScene2212(int which) { - _vm->gameState().sceneNum = 11; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0); - SetUpdateHandler(&Module2200::updateScene2212); -} - -void Module2200::createScene2213(int which) { - _vm->gameState().sceneNum = 12; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8); - SetUpdateHandler(&Module2200::updateScene2213); -} - -void Module2200::createScene2214(int which) { - _vm->gameState().sceneNum = 13; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0); - SetUpdateHandler(&Module2200::updateScene2214); -} - -void Module2200::createScene2215(int which) { - _vm->gameState().sceneNum = 14; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8); - SetUpdateHandler(&Module2200::updateScene2215); -} - -void Module2200::createScene2216(int which) { - _vm->gameState().sceneNum = 15; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210); - SetUpdateHandler(&Module2200::updateScene2216); -} - -void Module2200::createScene2217(int which) { - _vm->gameState().sceneNum = 16; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228); - SetUpdateHandler(&Module2200::updateScene2217); -} - -void Module2200::createScene2218(int which) { - _vm->gameState().sceneNum = 17; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240); - SetUpdateHandler(&Module2200::updateScene2218); -} - -void Module2200::createScene2219(int which) { - _vm->gameState().sceneNum = 18; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258); - SetUpdateHandler(&Module2200::updateScene2219); -} - -void Module2200::createScene2220(int which) { - _vm->gameState().sceneNum = 19; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270); - SetUpdateHandler(&Module2200::updateScene2220); -} - -void Module2200::createScene2221(int which) { - _vm->gameState().sceneNum = 20; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288); - SetUpdateHandler(&Module2200::updateScene2221); -} - -void Module2200::createScene2222(int which) { - _vm->gameState().sceneNum = 21; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0); - SetUpdateHandler(&Module2200::updateScene2222); -} - -void Module2200::createScene2223(int which) { - _vm->gameState().sceneNum = 22; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8); - SetUpdateHandler(&Module2200::updateScene2223); -} - -void Module2200::createScene2224(int which) { - _vm->gameState().sceneNum = 23; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0); - SetUpdateHandler(&Module2200::updateScene2224); -} - -void Module2200::createScene2225(int which) { - _vm->gameState().sceneNum = 24; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8); - SetUpdateHandler(&Module2200::updateScene2225); -} - -void Module2200::createScene2226(int which) { - _vm->gameState().sceneNum = 25; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300); - SetUpdateHandler(&Module2200::updateScene2226); -} - -void Module2200::createScene2227(int which) { - _vm->gameState().sceneNum = 26; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318); - SetUpdateHandler(&Module2200::updateScene2227); -} - -void Module2200::createScene2228(int which) { - _vm->gameState().sceneNum = 27; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330); - SetUpdateHandler(&Module2200::updateScene2228); -} - -void Module2200::createScene2229(int which) { - _vm->gameState().sceneNum = 28; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348); - SetUpdateHandler(&Module2200::updateScene2229); -} - -void Module2200::createScene2230(int which) { - _vm->gameState().sceneNum = 29; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360); - SetUpdateHandler(&Module2200::updateScene2230); -} - -void Module2200::createScene2231(int which) { - _vm->gameState().sceneNum = 30; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378); - SetUpdateHandler(&Module2200::updateScene2231); -} - -void Module2200::createScene2232(int which) { - _vm->gameState().sceneNum = 31; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390); - SetUpdateHandler(&Module2200::updateScene2232); -} - -void Module2200::createScene2233(int which) { - _vm->gameState().sceneNum = 32; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8); - SetUpdateHandler(&Module2200::updateScene2233); -} - -void Module2200::createScene2234(int which) { - _vm->gameState().sceneNum = 33; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0); - SetUpdateHandler(&Module2200::updateScene2234); -} - -void Module2200::createScene2235(int which) { - _vm->gameState().sceneNum = 34; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8); - SetUpdateHandler(&Module2200::updateScene2235); -} - -void Module2200::createScene2236(int which) { - _vm->gameState().sceneNum = 35; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0); - SetUpdateHandler(&Module2200::updateScene2236); -} - -void Module2200::createScene2237(int which) { - _vm->gameState().sceneNum = 36; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408); - SetUpdateHandler(&Module2200::updateScene2237); -} - -void Module2200::createScene2238(int which) { - _vm->gameState().sceneNum = 37; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420); - SetUpdateHandler(&Module2200::updateScene2238); -} - -void Module2200::createScene2239(int which) { - _vm->gameState().sceneNum = 38; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438); - SetUpdateHandler(&Module2200::updateScene2239); -} - -void Module2200::createScene2240(int which) { - _vm->gameState().sceneNum = 39; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450); - SetUpdateHandler(&Module2200::updateScene2240); -} - -void Module2200::createScene2241(int which) { - _vm->gameState().sceneNum = 40; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468); - SetUpdateHandler(&Module2200::updateScene2241); -} - -void Module2200::createScene2242(int which) { - _vm->gameState().sceneNum = 41; - _childObject = new Scene2242(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2242); -} - -void Module2200::createScene2243(int which) { - _vm->gameState().sceneNum = 42; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480); - SetUpdateHandler(&Module2200::updateScene2243); -} - -void Module2200::createScene2244(int which) { - _vm->gameState().sceneNum = 43; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498); - SetUpdateHandler(&Module2200::updateScene2244); -} - -void Module2200::createScene2245(int which) { - _vm->gameState().sceneNum = 44; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0); - SetUpdateHandler(&Module2200::updateScene2245); -} - -void Module2200::createScene2246(int which) { - _vm->gameState().sceneNum = 45; - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8); - SetUpdateHandler(&Module2200::updateScene2246); -} - -void Module2200::createScene2247(int which) { - _vm->gameState().sceneNum = 46; - _childObject = new Scene2247(_vm, this, which); - SetUpdateHandler(&Module2200::updateScene2247); } -void Module2200::createScene2248(int which) { - _vm->gameState().sceneNum = 47; - if (!getGlobalVar(0x98109F12)) { - if (getGlobalVar(0x4D080E54)) - _childObject = new Class152(_vm, this, 0x83110287, 0x10283839); - else - _childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C); - } else { - if (getGlobalVar(0x4D080E54)) - _childObject = new Class152(_vm, this, 0x48632087, 0x3208348E); - else - _childObject = new Class152(_vm, this, 0x08C74886, 0x74882084); - } - SetUpdateHandler(&Module2200::updateScene2248); -} - -void Module2200::updateScene2201() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2203(0); - } else if (_moduleResult == 2) { - createScene2202(0); - } else { - sendMessage(_parentModule, 0x1009, 0); - } - } -} - -void Module2200::updateScene2202() { - if (!updateChild()) { - createScene2201(2); - } -} - -void Module2200::updateScene2203() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2205(0); - } else if (_moduleResult == 2) { - createScene2204(0); - } else { - createScene2201(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2204() { - if (!updateChild()) { - createScene2203(2); - } -} - -void Module2200::updateScene2205() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2206(0); - } else if (_moduleResult == 2) { - createScene2205(2); - } else { - createScene2203(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2206() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2247(0); - } else if (_moduleResult == 2) { - createScene2207(0); - } else if (_moduleResult == 3) { - createScene2209(0); - } else { - createScene2205(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2207() { - if (!updateChild()) { - createScene2206(2); - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2208() { - if (!updateChild()) { - // This is madness! - switch (_vm->gameState().which) { - case 4: - createScene2205(2); - break; - case 9: - createScene2210(2); - break; - case 10: - createScene2211(2); - break; - case 11: - createScene2212(2); - break; - case 12: - createScene2213(2); - break; - case 13: - createScene2214(2); - break; - case 14: - createScene2215(2); - break; - case 15: - createScene2216(2); - break; - case 16: - createScene2217(2); - break; - case 17: - createScene2218(2); - break; - case 18: - createScene2219(2); - break; - case 19: - createScene2220(2); - break; - case 20: - createScene2221(2); - break; - case 21: - createScene2222(2); - break; - case 22: - createScene2223(2); - break; - case 23: - createScene2224(2); - break; - case 24: - createScene2225(2); - break; - case 25: - createScene2226(2); - break; - case 26: - createScene2227(2); - break; - case 27: - createScene2228(2); - break; - case 28: - createScene2229(2); - break; - case 29: - createScene2230(2); - break; - case 30: - createScene2231(2); - break; - case 31: - createScene2232(2); - break; - case 32: - createScene2233(2); - break; - case 33: - createScene2234(2); - break; - case 34: - createScene2235(2); - break; - case 35: - createScene2236(2); - break; - case 36: - createScene2237(2); - break; - case 37: - createScene2238(2); - break; - case 38: - createScene2239(2); - break; - case 39: - createScene2240(2); - break; - case 40: - createScene2241(2); - break; - case 41: - createScene2242(2); - break; - case 42: - createScene2243(2); - break; - case 43: - createScene2244(2); - break; - case 44: - createScene2245(2); - break; - case 46: - createScene2247(2); - break; - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2209() { - if (!updateChild()) { - createScene2206(3); - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2210() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2211(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2247(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2211() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2212(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2210(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2212() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2213(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2211(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2213() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2214(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2212(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2214() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2215(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2213(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2215() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2216(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2214(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2216() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2217(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2215(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2217() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2218(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2216(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2218() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2219(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2217(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2219() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2220(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2218(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2220() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2221(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2219(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2221() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2222(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2220(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2222() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2223(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2221(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2223() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2224(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2222(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2224() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2225(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2223(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2225() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2226(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2224(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2226() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2227(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2225(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2227() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2228(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2226(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2228() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2229(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2227(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2229() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2230(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2228(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2230() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2231(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2229(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2231() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2232(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2230(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2232() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2233(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2231(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2233() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2234(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2232(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2234() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2235(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2233(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2235() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2243(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2234(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2236() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2237(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2246(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2237() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2238(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2236(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2238() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2239(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2237(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2239() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2240(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2238(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2240() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2241(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2239(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2241() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2242(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2240(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2242() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2248(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene2208(0); - _childObject->handleUpdate(); - } else { - createScene2241(1); - _childObject->handleUpdate(); - } - } -} - -void Module2200::updateScene2243() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2244(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2235(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2244() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2245(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2243(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2245() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2246(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2244(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2246() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2236(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2245(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2247() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2210(0); - } else if (_moduleResult == 2) { - createScene2208(0); - } else { - createScene2206(1); - } - _childObject->handleUpdate(); - } -} - -void Module2200::updateScene2248() { - if (!updateChild()) { - createScene2242(1); - _childObject->handleUpdate(); - } -} - // Scene2201 AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 4dfd827460..76a59509f2 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -38,102 +38,8 @@ public: Module2200(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2200(); protected: - void createScene2201(int which); - void createScene2202(int which); - void createScene2203(int which); - void createScene2204(int which); - void createScene2205(int which); - void createScene2206(int which); - void createScene2207(int which); - void createScene2208(int which); - void createScene2209(int which); - void createScene2210(int which); - void createScene2211(int which); - void createScene2212(int which); - void createScene2213(int which); - void createScene2214(int which); - void createScene2215(int which); - void createScene2216(int which); - void createScene2217(int which); - void createScene2218(int which); - void createScene2219(int which); - void createScene2220(int which); - void createScene2221(int which); - void createScene2222(int which); - void createScene2223(int which); - void createScene2224(int which); - void createScene2225(int which); - void createScene2226(int which); - void createScene2227(int which); - void createScene2228(int which); - void createScene2229(int which); - void createScene2230(int which); - void createScene2231(int which); - void createScene2232(int which); - void createScene2233(int which); - void createScene2234(int which); - void createScene2235(int which); - void createScene2236(int which); - void createScene2237(int which); - void createScene2238(int which); - void createScene2239(int which); - void createScene2240(int which); - void createScene2241(int which); - void createScene2242(int which); - void createScene2243(int which); - void createScene2244(int which); - void createScene2245(int which); - void createScene2246(int which); - void createScene2247(int which); - void createScene2248(int which); - void updateScene2201(); - void updateScene2202(); - void updateScene2203(); - void updateScene2204(); - void updateScene2205(); - void updateScene2206(); - void updateScene2207(); - void updateScene2208(); - void updateScene2209(); - void updateScene2210(); - void updateScene2211(); - void updateScene2212(); - void updateScene2213(); - void updateScene2214(); - void updateScene2215(); - void updateScene2216(); - void updateScene2217(); - void updateScene2218(); - void updateScene2219(); - void updateScene2220(); - void updateScene2221(); - void updateScene2222(); - void updateScene2223(); - void updateScene2224(); - void updateScene2225(); - void updateScene2226(); - void updateScene2227(); - void updateScene2228(); - void updateScene2229(); - void updateScene2230(); - void updateScene2231(); - void updateScene2232(); - void updateScene2233(); - void updateScene2234(); - void updateScene2235(); - void updateScene2236(); - void updateScene2237(); - void updateScene2238(); - void updateScene2239(); - void updateScene2240(); - void updateScene2241(); - void updateScene2242(); - void updateScene2243(); - void updateScene2244(); - void updateScene2245(); - void updateScene2246(); - void updateScene2247(); - void updateScene2248(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene2201 -- cgit v1.2.3 From 67fe73352b5de401b184a54195beba2438da5b8d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 07:49:46 +0000 Subject: NEVERHOOD: Merge createSceneXXX/updateSceneXXX methods into createScene and updateScene for Module1000 --- engines/neverhood/gamemodule.cpp | 8 +- engines/neverhood/module1000.cpp | 164 +++++++++++++++------------------------ engines/neverhood/module1000.h | 16 +--- 3 files changed, 69 insertions(+), 119 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index abe61d2877..1c76027ddf 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -276,13 +276,13 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule2000(-1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 2; createModule2200(-1); #endif -#if 0 - _vm->gameState().sceneNum = 5; - createModule1300(-1); +#if 1 + _vm->gameState().sceneNum = 0; + createModule1000(-1); #endif } diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 8185430d16..22bc5cc108 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -35,27 +35,11 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Music18hList_add(0x03294419, _musicFileHash); if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 0: - createScene1001(-1); - break; - case 1: - createScene1002(-1); - break; - case 2: - createScene1003(-1); - break; - case 3: - createScene1004(-1); - break; - case 4: - createScene1005(-1); - break; - } + createScene(_vm->gameState().sceneNum, -1); } else if (which == 0) { - createScene1001(0); + createScene(0, 0); } else if (which == 1) { - createScene1002(1); + createScene(1, 1); } } @@ -64,95 +48,73 @@ Module1000::~Module1000() { // TODO Music18hList_deleteGroup(0x03294419); } -void Module1000::createScene1001(int which) { - _vm->gameState().sceneNum = 0; - _childObject = new Scene1001(_vm, this, which); - // TODO Music18hList_play(0x061880C6, 0, 0, 1); - SetUpdateHandler(&Module1000::updateScene1001); -} - -void Module1000::createScene1002(int which) { - _vm->gameState().sceneNum = 1; - _childObject = new Scene1002(_vm, this, which); - // TODO Music18hList_play(0x061880C6, 0, 0, 1); - SetUpdateHandler(&Module1000::updateScene1002); -} - -void Module1000::createScene1003(int which) { - _vm->gameState().sceneNum = 2; - _childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00); - SetUpdateHandler(&Module1000::updateScene1003); - // TODO Music18hList_play(0x061880C6, 0, 0); -} - -void Module1000::createScene1004(int which) { - _vm->gameState().sceneNum = 3; - _childObject = new Scene1004(_vm, this, which); - SetUpdateHandler(&Module1000::updateScene1004); - // TODO Music18hList_stop(0x061880C6, 0, 2); -} - -void Module1000::createScene1005(int which) { - _vm->gameState().sceneNum = 4; - _childObject = new Scene1005(_vm, this, which); - // TODO Music18hList_stop(0x061880C6, 0, 0); - // TODO Music18hList_play(_musicFileHash, 0, 0, 1); - SetUpdateHandler(&Module1000::updateScene1005); -} - -void Module1000::updateScene1001() { - if (!updateChild()) { - if (_moduleResult == 2) { - createScene1003(0); - _childObject->handleUpdate(); - } else { - createScene1002(0); - _childObject->handleUpdate(); - } +void Module1000::createScene(int sceneNum, int which) { + debug("Module1000::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Music18hList_play(0x061880C6, 0, 0, 1); + _childObject = new Scene1001(_vm, this, which); + break; + case 1: + // TODO Music18hList_play(0x061880C6, 0, 0, 1); + _childObject = new Scene1002(_vm, this, which); + break; + case 2: + // TODO Music18hList_play(0x061880C6, 0, 0); + _childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00); + break; + case 3: + // TODO Music18hList_stop(0x061880C6, 0, 2); + _childObject = new Scene1004(_vm, this, which); + break; + case 4: + // TODO Music18hList_stop(0x061880C6, 0, 0); + // TODO Music18hList_play(_musicFileHash, 0, 0, 1); + _childObject = new Scene1005(_vm, this, which); + break; } + SetUpdateHandler(&Module1000::updateScene); + _childObject->handleUpdate(); } -void Module1000::updateScene1002() { - if (!updateChild()) { - if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 0); - } else if (_moduleResult == 2) { - createScene1004(0); - _childObject->handleUpdate(); - } else { - createScene1001(1); - _childObject->handleUpdate(); - } - } -} - -void Module1000::updateScene1003() { - if (!updateChild()) { - createScene1001(2); - _childObject->handleUpdate(); - } -} - -void Module1000::updateScene1004() { +void Module1000::updateScene() { if (!updateChild()) { - if (_moduleResult == 1) { - createScene1005(0); - _childObject->handleUpdate(); - } else { - createScene1002(2); - _childObject->handleUpdate(); + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 2) { + createScene(2, 0); + } else { + createScene(1, 0); + } + break; + case 1: + if (_moduleResult == 1) { + sendMessage(_parentModule, 0x1009, 0); + } else if (_moduleResult == 2) { + createScene(3, 0); + } else { + createScene(0, 1); + } + break; + case 2: + createScene(0, 2); + break; + case 3: + if (_moduleResult == 1) { + createScene(4, 0); + } else { + createScene(1, 2); + } + break; + case 4: + // TODO Music18hList_stop(_musicFileHash, 0, 1); + createScene(3, 1); + break; } } } - -void Module1000::updateScene1005() { - if (!updateChild()) { - // TODO Music18hList_stop(_musicFileHash, 0, 1); - createScene1004(1); - _childObject->handleUpdate(); - } -} - + // Scene1001 AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 385ac1094d..a7046ce1a4 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -37,20 +37,8 @@ public: virtual ~Module1000(); protected: uint32 _musicFileHash; - // TODO ResourceTable _resourceTable1; - // TODO ResourceTable _resourceTable2; - // TODO ResourceTable _resourceTable3; - // TODO ResourceTable _resourceTable4; - void createScene1001(int which); - void createScene1002(int which); - void createScene1003(int which); - void createScene1004(int which); - void createScene1005(int which); - void updateScene1001(); - void updateScene1002(); - void updateScene1003(); - void updateScene1004(); - void updateScene1005(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene1001 -- cgit v1.2.3 From d24907d1bb1650093e4ff7f0d008ce87350226b6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 08:00:56 +0000 Subject: NEVERHOOD: Rename Palette2::addPalette to addBasePalette to prepare the merge of the Palette/Palette2 classes --- engines/neverhood/gamemodule.cpp | 6 +++--- engines/neverhood/module1000.cpp | 8 ++++---- engines/neverhood/module1500.cpp | 2 +- engines/neverhood/module1700.cpp | 6 +++--- engines/neverhood/module2200.cpp | 16 ++++++++-------- engines/neverhood/module3000.cpp | 4 ++-- engines/neverhood/palette.cpp | 4 ++-- engines/neverhood/palette.h | 2 +- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 1c76027ddf..103d53df95 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -276,11 +276,11 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule2000(-1); #endif -#if 0 - _vm->gameState().sceneNum = 2; +#if 1 + _vm->gameState().sceneNum = 4; createModule2200(-1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 0; createModule1000(-1); #endif diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 22bc5cc108..77620b89ff 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1694,10 +1694,10 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x0D0A14D10)) { palette2 = new Palette2(_vm, 0xA30BA329); - palette2->addPalette(0xA30BA329, 0, 256, 0); + palette2->addBasePalette(0xA30BA329, 0, 256, 0); } else { palette2 = new Palette2(_vm, 0x50C03005); - palette2->addPalette(0x50C03005, 0, 256, 0); + palette2->addBasePalette(0x50C03005, 0, 256, 0); } _palette = palette2; _palette->usePalette(); @@ -1770,13 +1770,13 @@ void Scene1004::updatePaletteArea() { if (_klayman->getY() < 150) { if (_paletteAreaStatus != 0) { _paletteAreaStatus = 0; - ((Palette2*)_palette)->addPalette(0x406B0D10, 0, 64, 0); + ((Palette2*)_palette)->addBasePalette(0x406B0D10, 0, 64, 0); ((Palette2*)_palette)->startFadeToPalette(12); } } else { if (_paletteAreaStatus != 1) { _paletteAreaStatus = 1; - ((Palette2*)_palette)->addPalette(0x24332243, 0, 64, 0); + ((Palette2*)_palette)->addBasePalette(0x24332243, 0, 64, 0); ((Palette2*)_palette)->startFadeToPalette(12); } } diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index b942d8b836..5735f24a46 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -119,7 +119,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun palette2->usePalette(); _palette = palette2; addEntity(_palette); - palette2->addPalette(backgroundFileHash, 0, 256, 0); + palette2->addBasePalette(backgroundFileHash, 0, 256, 0); palette2->startFadeToPalette(12); /* diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 0aea8d1f24..baa37d015a 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -226,7 +226,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x03118226); palette2 = new Palette2(_vm, 0x03118226); - palette2->addPalette(0x91D3A391, 0, 64, 0); + palette2->addBasePalette(0x91D3A391, 0, 64, 0); palette2->copyBasePalette(0, 256, 0); palette2->usePalette(); _palette = palette2; @@ -297,11 +297,11 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1705::update() { Scene::update(); if (_klayman->getX() < 224 && _paletteArea != 0) { - ((Palette2*)_palette)->addPalette(0xF2210C15, 0, 64, 0); + ((Palette2*)_palette)->addBasePalette(0xF2210C15, 0, 64, 0); ((Palette2*)_palette)->startFadeToPalette(12); _paletteArea = 0; } else if (_klayman->getX() >= 224 && _paletteArea == 0) { - ((Palette2*)_palette)->addPalette(0x91D3A391, 0, 64, 0); + ((Palette2*)_palette)->addBasePalette(0x91D3A391, 0, 64, 0); ((Palette2*)_palette)->startFadeToPalette(12); _paletteArea = 1; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index c8eca785b3..b637a39a05 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -1536,7 +1536,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) addSprite(_ssLightSwitch); } - palette2->addPalette(0xD00A028D, 0, 256, 0); + palette2->addBasePalette(0xD00A028D, 0, 256, 0); _ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm)); @@ -1598,11 +1598,11 @@ void Scene2205::update() { if (!getGlobalVar(0x4D080E54)) { if (_isKlaymanInLight && _klayman->getX() > 85) { - ((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0); + ((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0); ((Palette2*)_palette)->startFadeToPalette(12); _isKlaymanInLight = false; } else if (!_isKlaymanInLight && _klayman->getX() <= 85) { - ((Palette2*)_palette)->addPalette(0xD00A028D, 0, 65, 0); + ((Palette2*)_palette)->addBasePalette(0xD00A028D, 0, 65, 0); ((Palette2*)_palette)->startFadeToPalette(12); _isKlaymanInLight = true; } @@ -1822,7 +1822,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); addEntity(palette2); - palette2->addPalette(fileHash, 0, 256, 0); + palette2->addBasePalette(fileHash, 0, 256, 0); if (!getGlobalVar(0x4D080E54)) { _palette->addPalette(0x0263D144, 0, 65, 0); @@ -1904,7 +1904,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2206::sub481950() { if (getGlobalVar(0x4D080E54)) { - ((Palette2*)_palette)->addPalette(0x41983216, 0, 65, 0); + ((Palette2*)_palette)->addBasePalette(0x41983216, 0, 65, 0); ((Palette2*)_palette)->startFadeToPalette(12); } setSurfacePriority(_sprite1->getSurface(), 100); @@ -1919,7 +1919,7 @@ void Scene2206::sub481950() { void Scene2206::sub4819D0() { if (!getGlobalVar(0x4D080E54)) { - ((Palette2*)_palette)->addPalette(0xB103B604, 0, 65, 0); + ((Palette2*)_palette)->addBasePalette(0xB103B604, 0, 65, 0); ((Palette2*)_palette)->startFadeToPalette(12); } setSurfacePriority(_sprite1->getSurface(), 1100); @@ -2767,11 +2767,11 @@ Scene2242::~Scene2242() { void Scene2242::update() { if (!getGlobalVar(0x4D080E54)) { if (_isKlaymanInLight && _klayman->getX() < 440) { - ((Palette2*)_palette)->addPalette(0x68033B1C, 0, 65, 0); + ((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0); ((Palette2*)_palette)->startFadeToPalette(12); _isKlaymanInLight = false; } else if (!_isKlaymanInLight && _klayman->getX() >= 440) { - ((Palette2*)_palette)->addPalette(0x25848E24, 0, 65, 0); + ((Palette2*)_palette)->addBasePalette(0x25848E24, 0, 65, 0); ((Palette2*)_palette)->startFadeToPalette(12); _isKlaymanInLight = true; } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index cfcacaf693..7c4ed1a464 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1762,13 +1762,13 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene3011::fadeIn() { Palette2 *palette2 = (Palette2*)_palette; - palette2->addPalette(0x92124A04, 0, 256, 0); + palette2->addBasePalette(0x92124A04, 0, 256, 0); palette2->startFadeToPalette(24); } void Scene3011::fadeOut() { Palette2 *palette2 = (Palette2*)_palette; - palette2->addPalette(0xA4070114, 0, 256, 0); + palette2->addBasePalette(0xA4070114, 0, 256, 0); palette2->startFadeToPalette(24); } diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index bd1d6b2c8d..a060a41870 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -70,7 +70,7 @@ void Palette::usePalette() { } void Palette::addPalette(const char *filename, int toIndex, int count, int fromIndex) { - // TODO: addPalette(calcHash(filename), toIndex, count, fromIndex); + addPalette(calcHash(filename), toIndex, count, fromIndex); } void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) { @@ -179,7 +179,7 @@ void Palette2::copyBasePalette(int toIndex, int count, int fromIndex) { memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4); } -void Palette2::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) { +void Palette2::addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex) { PaletteResource paletteResource(_vm); if (toIndex + count > 256) count = 256 - toIndex; diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 01f63e8e7e..9d2a7bc1f6 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -62,7 +62,7 @@ public: Palette2(NeverhoodEngine *vm, uint32 fileHash); virtual ~Palette2(); void copyBasePalette(int toIndex, int count, int fromIndex); - void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); + void addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex); void startFadeToPalette(int counter); public: byte *_basePalette; -- cgit v1.2.3 From 71ea4d5877a58809b994fb906d81516541c6e8e6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 08:25:23 +0000 Subject: NEVERHOOD: Merge Palette2 class into Palette --- engines/neverhood/module1000.cpp | 18 +++---- engines/neverhood/module1200.cpp | 7 +-- engines/neverhood/module1500.cpp | 11 ++-- engines/neverhood/module1700.cpp | 18 +++---- engines/neverhood/module2200.cpp | 62 +++++++++------------- engines/neverhood/module3000.cpp | 19 +++---- engines/neverhood/palette.cpp | 110 ++++++++++++++++----------------------- engines/neverhood/palette.h | 19 ++----- 8 files changed, 103 insertions(+), 161 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 77620b89ff..cf215361c9 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1682,7 +1682,6 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _paletteAreaStatus(-1) { - Palette2 *palette2; Sprite *tempSprite; _surfaceFlag = true; @@ -1693,13 +1692,12 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x50C03005); if (getGlobalVar(0x0D0A14D10)) { - palette2 = new Palette2(_vm, 0xA30BA329); - palette2->addBasePalette(0xA30BA329, 0, 256, 0); + _palette = new Palette(_vm, 0xA30BA329); + _palette->addBasePalette(0xA30BA329, 0, 256, 0); } else { - palette2 = new Palette2(_vm, 0x50C03005); - palette2->addBasePalette(0x50C03005, 0, 256, 0); + _palette = new Palette(_vm, 0x50C03005); + _palette->addBasePalette(0x50C03005, 0, 256, 0); } - _palette = palette2; _palette->usePalette(); addEntity(_palette); @@ -1770,14 +1768,14 @@ void Scene1004::updatePaletteArea() { if (_klayman->getY() < 150) { if (_paletteAreaStatus != 0) { _paletteAreaStatus = 0; - ((Palette2*)_palette)->addBasePalette(0x406B0D10, 0, 64, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x406B0D10, 0, 64, 0); + _palette->startFadeToPalette(12); } } else { if (_paletteAreaStatus != 1) { _paletteAreaStatus = 1; - ((Palette2*)_palette)->addBasePalette(0x24332243, 0, 64, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x24332243, 0, 64, 0); + _palette->startFadeToPalette(12); } } } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 9e198cc67c..3901f83eb9 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -1154,8 +1154,6 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _flag(true), _soundFlag(false), _counter(0), _index(-1) { - Palette2 *palette2; - SetMessageHandler(&Scene1202::handleMessage453C10); SetUpdateHandler(&Scene1202::update); @@ -1163,9 +1161,8 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x60210ED5); - palette2 = new Palette2(_vm, 0x60210ED5); - palette2->usePalette(); - _palette = palette2; + _palette = new Palette(_vm, 0x60210ED5); + _palette->usePalette(); addEntity(_palette); _paletteResource.load(0x60250EB5); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 5735f24a46..7c03e9b941 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -106,8 +106,6 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3); - Palette2 *palette2; - SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); @@ -115,12 +113,11 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun setBackground(backgroundFileHash); - palette2 = new Palette2(_vm); - palette2->usePalette(); - _palette = palette2; + _palette = new Palette(_vm); + _palette->usePalette(); addEntity(_palette); - palette2->addBasePalette(backgroundFileHash, 0, 256, 0); - palette2->startFadeToPalette(12); + _palette->addBasePalette(backgroundFileHash, 0, 256, 0); + _palette->startFadeToPalette(12); /* if (soundFileHash != 0) { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index baa37d015a..33e690813d 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -210,7 +210,6 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam ¶m, Entity Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _paletteArea(1) { - Palette2 *palette2; Sprite *tempSprite; setGlobalVar(0xE7498218, 1); @@ -225,11 +224,10 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x03118226); - palette2 = new Palette2(_vm, 0x03118226); - palette2->addBasePalette(0x91D3A391, 0, 64, 0); - palette2->copyBasePalette(0, 256, 0); - palette2->usePalette(); - _palette = palette2; + _palette = new Palette(_vm, 0x03118226); + _palette->addBasePalette(0x91D3A391, 0, 64, 0); + _palette->copyBasePalette(0, 256, 0); + _palette->usePalette(); addEntity(_palette); _mouseCursor = addSprite(new Mouse433(_vm, 0x18222039, NULL)); @@ -297,12 +295,12 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1705::update() { Scene::update(); if (_klayman->getX() < 224 && _paletteArea != 0) { - ((Palette2*)_palette)->addBasePalette(0xF2210C15, 0, 64, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0xF2210C15, 0, 64, 0); + _palette->startFadeToPalette(12); _paletteArea = 0; } else if (_klayman->getX() >= 224 && _paletteArea == 0) { - ((Palette2*)_palette)->addBasePalette(0x91D3A391, 0, 64, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x91D3A391, 0, 64, 0); + _palette->startFadeToPalette(12); _paletteArea = 1; } } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index b637a39a05..2219679d06 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -1112,8 +1112,6 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _isSolved(false), _leaveScene(false), _isTileMoving(false), _movingTileSprite(NULL), _doneMovingTileSprite(NULL) { - Palette2 *palette2; - // TODO initScene2201Vars(); SetMessageHandler(&Scene2202::handleMessage); SetUpdateHandler(&Scene2202::update); @@ -1121,10 +1119,9 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x08100A0C); - palette2 = new Palette2(_vm, 0x08100A0C); - _palette = palette2; + _palette = new Palette(_vm, 0x08100A0C); _palette->usePalette(); - addEntity(palette2); + addEntity(_palette); _mouseCursor = addSprite(new Mouse435(_vm, 0x00A08089, 20, 620)); //DEBUG! @@ -1506,8 +1503,6 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - Palette2 *palette2; - SetMessageHandler(&Scene2205::handleMessage); SetUpdateHandler(&Scene2205::update); @@ -1517,26 +1512,24 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { _isLightOn = true; setBackground(0x0008028D); - palette2 = new Palette2(_vm, 0x0008028D); - _palette = palette2; + _palette = new Palette(_vm, 0x0008028D); _palette->usePalette(); - addEntity(palette2); + addEntity(_palette); _mouseCursor = addSprite(new Mouse433(_vm, 0x80289008, NULL)); _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0); addSprite(_ssLightSwitch); } else { _isLightOn = false; setBackground(0xD00A028D); - palette2 = new Palette2(_vm, 0xD00A028D); - _palette = palette2; + _palette = new Palette(_vm, 0xD00A028D); _palette->usePalette(); - addEntity(palette2); + addEntity(_palette); _mouseCursor = addSprite(new Mouse433(_vm, 0xA0289D08, NULL)); _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0); addSprite(_ssLightSwitch); } - palette2->addBasePalette(0xD00A028D, 0, 256, 0); + _palette->addBasePalette(0xD00A028D, 0, 256, 0); _ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm)); @@ -1598,12 +1591,12 @@ void Scene2205::update() { if (!getGlobalVar(0x4D080E54)) { if (_isKlaymanInLight && _klayman->getX() > 85) { - ((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x68033B1C, 0, 65, 0); + _palette->startFadeToPalette(12); _isKlaymanInLight = false; } else if (!_isKlaymanInLight && _klayman->getX() <= 85) { - ((Palette2*)_palette)->addBasePalette(0xD00A028D, 0, 65, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0xD00A028D, 0, 65, 0); + _palette->startFadeToPalette(12); _isKlaymanInLight = true; } } @@ -1772,7 +1765,6 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource(vm) { uint32 fileHash; - Palette2 *palette2; SetUpdateHandler(&Scene::update); SetMessageHandler(&Scene2206::handleMessage); @@ -1817,12 +1809,11 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(fileHash); - palette2 = new Palette2(_vm, fileHash); - _palette = palette2; + _palette = new Palette(_vm, fileHash); _palette->usePalette(); - addEntity(palette2); + addEntity(_palette); - palette2->addBasePalette(fileHash, 0, 256, 0); + _palette->addBasePalette(fileHash, 0, 256, 0); if (!getGlobalVar(0x4D080E54)) { _palette->addPalette(0x0263D144, 0, 65, 0); @@ -1904,8 +1895,8 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2206::sub481950() { if (getGlobalVar(0x4D080E54)) { - ((Palette2*)_palette)->addBasePalette(0x41983216, 0, 65, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x41983216, 0, 65, 0); + _palette->startFadeToPalette(12); } setSurfacePriority(_sprite1->getSurface(), 100); setSurfacePriority(_sprite2->getSurface(), 300); @@ -1919,8 +1910,8 @@ void Scene2206::sub481950() { void Scene2206::sub4819D0() { if (!getGlobalVar(0x4D080E54)) { - ((Palette2*)_palette)->addBasePalette(0xB103B604, 0, 65, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); } setSurfacePriority(_sprite1->getSurface(), 1100); setSurfacePriority(_sprite2->getSurface(), 1300); @@ -2713,8 +2704,6 @@ static const uint32 kScene2242MessageListIds1[] = { Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _isKlaymanInLight(false) { - Palette2 *palette2; - _surfaceFlag = true; SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); @@ -2727,11 +2716,10 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B3DC8); } else { setBackground(0x25848E24); - palette2 = new Palette2(_vm, 0x25848E24); - _palette = palette2; + _palette = new Palette(_vm, 0x25848E24); _palette->usePalette(); - addEntity(palette2); - ((Palette2*)_palette)->copyBasePalette(0, 256, 0); + addEntity(_palette); + _palette->copyBasePalette(0, 256, 0); _palette->addPalette(0x68033B1C, 0, 65, 0); _mouseCursor = addSprite(new Mouse433(_vm, 0x48E20250, NULL)); setRectList(0x004B3E18); @@ -2767,12 +2755,12 @@ Scene2242::~Scene2242() { void Scene2242::update() { if (!getGlobalVar(0x4D080E54)) { if (_isKlaymanInLight && _klayman->getX() < 440) { - ((Palette2*)_palette)->addBasePalette(0x68033B1C, 0, 65, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x68033B1C, 0, 65, 0); + _palette->startFadeToPalette(12); _isKlaymanInLight = false; } else if (!_isKlaymanInLight && _klayman->getX() >= 440) { - ((Palette2*)_palette)->addBasePalette(0x25848E24, 0, 65, 0); - ((Palette2*)_palette)->startFadeToPalette(12); + _palette->addBasePalette(0x25848E24, 0, 65, 0); + _palette->startFadeToPalette(12); _isKlaymanInLight = true; } } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 7c4ed1a464..9bcd79a5e8 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1668,8 +1668,6 @@ void AsScene3011Symbol::change(int index, bool flag) { Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) { - Palette2 *palette2; - _surfaceFlag = true; // TODO _vm->gameModule()->initScene3011Vars(); @@ -1677,10 +1675,9 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x92124A04); - palette2 = new Palette2(_vm, 0xA4070114); - addEntity(palette2); - palette2->usePalette(); - _palette = palette2; + _palette = new Palette(_vm, 0xA4070114); + _palette->usePalette(); + addEntity(_palette); _mouseCursor = addSprite(new Mouse435(_vm, 0x24A00929, 20, 620)); @@ -1761,15 +1758,13 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene3011::fadeIn() { - Palette2 *palette2 = (Palette2*)_palette; - palette2->addBasePalette(0x92124A04, 0, 256, 0); - palette2->startFadeToPalette(24); + _palette->addBasePalette(0x92124A04, 0, 256, 0); + _palette->startFadeToPalette(24); } void Scene3011::fadeOut() { - Palette2 *palette2 = (Palette2*)_palette; - palette2->addBasePalette(0xA4070114, 0, 256, 0); - palette2->startFadeToPalette(24); + _palette->addBasePalette(0xA4070114, 0, 256, 0); + _palette->startFadeToPalette(24); } } // End of namespace Neverhood diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index a060a41870..481e0e5058 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -29,32 +29,28 @@ namespace Neverhood { // Palette Palette::Palette(NeverhoodEngine *vm) : Entity(vm, 0) { - _status = 0; - _palette = new byte[1024]; + init(); memset(_palette, 0, 1024); SetUpdateHandler(&Palette::update); } Palette::Palette(NeverhoodEngine *vm, byte *palette) : Entity(vm, 0) { - _status = 0; - _palette = new byte[1024]; + init(); memcpy(_palette, palette, 1024); SetUpdateHandler(&Palette::update); } Palette::Palette(NeverhoodEngine *vm, const char *filename) : Entity(vm, 0) { PaletteResource paletteResource(_vm); - _status = 0; - _palette = new byte[1024]; - // TODO: paletteResource.load(calcHash(filename)); - // paletteResource.copyPalette(_palette); + init(); + paletteResource.load(calcHash(filename)); + paletteResource.copyPalette(_palette); SetUpdateHandler(&Palette::update); } Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) { PaletteResource paletteResource(_vm); - _status = 0; - _palette = new byte[1024]; + init(); paletteResource.load(fileHash); paletteResource.copyPalette(_palette); SetUpdateHandler(&Palette::update); @@ -63,6 +59,13 @@ Palette::Palette(NeverhoodEngine *vm, uint32 fileHash) : Entity(vm, 0) { Palette::~Palette() { _vm->_screen->unsetPaletteData(_palette); delete[] _palette; + delete[] _basePalette; +} + +void Palette::init() { + _status = 0; + _palette = new byte[1024]; + _basePalette = new byte[1024]; } void Palette::usePalette() { @@ -82,6 +85,14 @@ void Palette::addPalette(uint32 fileHash, int toIndex, int count, int fromIndex) _vm->_screen->testPalette(_palette); } +void Palette::addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex) { + PaletteResource paletteResource(_vm); + if (toIndex + count > 256) + count = 256 - toIndex; + paletteResource.load(fileHash); + memcpy(_basePalette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4); +} + void Palette::copyPalette(const byte *palette, int toIndex, int count, int fromIndex) { if (toIndex + count > 256) count = 256 - toIndex; @@ -89,8 +100,14 @@ void Palette::copyPalette(const byte *palette, int toIndex, int count, int fromI _vm->_screen->testPalette(_palette); } +void Palette::copyBasePalette(int toIndex, int count, int fromIndex) { + if (toIndex + count > 256) + count = 256 - toIndex; + memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4); +} + void Palette::startFadeToBlack(int counter) { - debug("Palette::startFadeToBlack(%d)", counter); + debug(2, "Palette::startFadeToBlack(%d)", counter); if (counter == 0) counter = 1; _fadeToR = 0; @@ -102,7 +119,7 @@ void Palette::startFadeToBlack(int counter) { } void Palette::startFadeToWhite(int counter) { - debug("Palette::startFadeToWhite(%d)", counter); + debug(2, "Palette::startFadeToWhite(%d)", counter); if (counter == 0) counter = 1; _fadeToR = 255; @@ -113,6 +130,15 @@ void Palette::startFadeToWhite(int counter) { _status = 1; } +void Palette::startFadeToPalette(int counter) { + debug(2, "Palette::startFadeToPalette(%d)", counter); + if (counter == 0) + counter = 1; + _palCounter = counter; + _fadeStep = 255 / counter; + _status = 2; +} + void Palette::update() { debug(2, "Palette::update() _status = %d", _status); if (_status == 1) { @@ -126,39 +152,6 @@ void Palette::update() { memset(_palette, 0, 1024); _status = 0; } - } -} - -void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) { - #define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep) - FADE(rgb[0], toR); - FADE(rgb[1], toG); - FADE(rgb[2], toB); - #undef FADE -} - -// Palette2 - -Palette2::Palette2(NeverhoodEngine *vm) - : Palette(vm) { - _basePalette = new byte[1024]; - SetUpdateHandler(&Palette2::update); -} - -Palette2::Palette2(NeverhoodEngine *vm, uint32 fileHash) - : Palette(vm, fileHash) { - _basePalette = new byte[1024]; - SetUpdateHandler(&Palette2::update); -} - -Palette2::~Palette2() { - delete _basePalette; -} - -void Palette2::update() { - debug("Palette2::update() _status = %d", _status); - if (_status == 1) { - Palette::update(); } else if (_status == 2) { if (_palCounter > 1) { for (int i = 0; i < 256; i++) { @@ -173,27 +166,12 @@ void Palette2::update() { } } -void Palette2::copyBasePalette(int toIndex, int count, int fromIndex) { - if (toIndex + count > 256) - count = 256 - toIndex; - memcpy(_basePalette + toIndex * 4, _palette + fromIndex * 4, count * 4); -} - -void Palette2::addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex) { - PaletteResource paletteResource(_vm); - if (toIndex + count > 256) - count = 256 - toIndex; - paletteResource.load(fileHash); - memcpy(_basePalette + toIndex * 4, paletteResource.palette() + fromIndex * 4, count * 4); -} - -void Palette2::startFadeToPalette(int counter) { - debug("Palette2::startFadeToPalette(%d)", counter); - if (counter == 0) - counter = 1; - _palCounter = counter; - _fadeStep = 255 / counter; - _status = 2; +void Palette::fadeColor(byte *rgb, byte toR, byte toG, byte toB) { + #define FADE(color, toColor) color += _fadeStep < toColor - color ? _fadeStep : (-_fadeStep <= toColor - color ? toColor - color : -_fadeStep) + FADE(rgb[0], toR); + FADE(rgb[1], toG); + FADE(rgb[2], toB); + #undef FADE } } // End of namespace Neverhood diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 9d2a7bc1f6..79660130e1 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -39,15 +39,20 @@ public: // Create from resource with fileHash Palette(NeverhoodEngine *vm, uint32 fileHash); virtual ~Palette(); + void init(); void usePalette(); void addPalette(const char *filename, int toIndex, int count, int fromIndex); void addPalette(uint32 fileHash, int toIndex, int count, int fromIndex); + void addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex); void copyPalette(const byte *palette, int toIndex, int count, int fromIndex); + void copyBasePalette(int toIndex, int count, int fromIndex); void startFadeToBlack(int counter); void startFadeToWhite(int counter); + void startFadeToPalette(int counter); protected: int _status; byte *_palette; + byte *_basePalette; int _palCounter; byte _fadeToR, _fadeToG, _fadeToB; int _fadeStep; @@ -55,20 +60,6 @@ protected: void fadeColor(byte *rgb, byte toR, byte toG, byte toB); }; -class Palette2 : public Palette { -public: - Palette2(NeverhoodEngine *vm); - // TODO: Other ctors - Palette2(NeverhoodEngine *vm, uint32 fileHash); - virtual ~Palette2(); - void copyBasePalette(int toIndex, int count, int fromIndex); - void addBasePalette(uint32 fileHash, int toIndex, int count, int fromIndex); - void startFadeToPalette(int counter); -public: - byte *_basePalette; - void update(); -}; - } // End of namespace Neverhood #endif /* NEVERHOOD_PALETTE_H */ -- cgit v1.2.3 From 0ec039c5b05d03d470ae120e008c1577279ff6ed Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 09:12:43 +0000 Subject: NEVERHOOD: Merge the three mouse classes into Mouse, introduce insertMouse433 etc. methods and use them --- engines/neverhood/diskplayerscene.cpp | 8 +- engines/neverhood/module1000.cpp | 12 +- engines/neverhood/module1200.cpp | 4 +- engines/neverhood/module1300.cpp | 28 +-- engines/neverhood/module1400.cpp | 20 +-- engines/neverhood/module1700.cpp | 2 +- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2200.cpp | 38 ++-- engines/neverhood/module3000.cpp | 8 +- engines/neverhood/mouse.cpp | 326 ++++++++++------------------------ engines/neverhood/mouse.h | 37 ++-- engines/neverhood/navigationscene.cpp | 8 +- engines/neverhood/scene.cpp | 27 +++ engines/neverhood/scene.h | 7 +- 14 files changed, 205 insertions(+), 322 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 3eeef9204d..d0d7ec2426 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -391,8 +391,8 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _class650 = new DiskplayerSlot(_vm, this, 20, 0); addEntity(_class650); - _mouseCursor = addSprite(new Mouse435(_vm, 0x000408A8, 20, 620)); - _mouseCursor->getSurface()->setVisible(false); + insertMouse435(0x000408A8, 20, 620); + showMouse(false); _smackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true); addEntity(_smackerPlayer); @@ -457,7 +457,7 @@ void DiskplayerScene::update() { } _diskIndex = 0; stop(); - _mouseCursor->getSurface()->setVisible(true); + showMouse(true); _flag3 = false; } } @@ -480,7 +480,7 @@ void DiskplayerScene::update() { _playButton->press(); _tuneInCountdown = 2; } else { - _mouseCursor->getSurface()->setVisible(true); + showMouse(true); _diskSlots[_diskIndex]->activate(); } } diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index cf215361c9..4539b37050 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -348,7 +348,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x4086520E); _palette = new Palette(_vm, 0x4086520E); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x6520A400, NULL)); + insertMouse433(0x6520A400); if (which < 0) { setRectList(0x004B49F0); @@ -1421,7 +1421,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_gameState.field2 = 0; } - _mouseCursor = addSprite(new Mouse433(_vm, 0x23303124, NULL)); + insertMouse433(0x23303124); tempSprite = insertStaticSprite(0xB3242310, 825); tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x; @@ -1631,7 +1631,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF setBackground(backgroundFileHash); _palette = new Palette(_vm, backgroundFileHash); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse435(_vm, cursorFileHash, 20, 620)); + insertMouse435(cursorFileHash, 20, 620); } uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1701,7 +1701,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse433(_vm, 0x03001504, NULL)); + insertMouse433(0x03001504); if (which < 0) { setRectList(0x004B7C70); @@ -1794,14 +1794,14 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0x2800E011); _palette->usePalette(); insertStaticSprite(0x492D5AD7, 100); - _mouseCursor = addSprite(new Mouse435(_vm, 0x0E015288, 20, 620)); + insertMouse435(0x0E015288, 20, 620); } else { setBackground(0x8870A546); _palette = new Palette(_vm, 0x8870A546); _palette->usePalette(); insertStaticSprite(0x40D1E0A9, 100); insertStaticSprite(0x149C00A6, 100); - _mouseCursor = addSprite(new Mouse435(_vm, 0x0A54288F, 20, 620)); + insertMouse435(0x0A54288F, 20, 620); } drawTextToBackground(); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 3901f83eb9..c050abcf68 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -783,7 +783,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } } - _mouseCursor = addSprite(new Mouse433(_vm, 0x9A2C0409, NULL)); + insertMouse433(0x9A2C0409); _asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); @@ -1168,7 +1168,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) _paletteResource.load(0x60250EB5); _paletteResource.copyPalette(_paletteData); - _mouseCursor = addSprite(new Mouse435(_vm, 0x10ED160A, 20, 620)); + insertMouse435(0x10ED160A, 20, 620); for (int i = 0; i < 18; i++) { _asTntItems[i] = addSprite(new AsScene1202TntItem(_vm, this, i)); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 189ee2c2ff..af2390cb86 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -581,7 +581,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x420643C4); _palette = new Palette(_vm, 0x420643C4); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x643C0428, NULL)); + insertMouse433(0x643C0428); _class595 = addSprite(new Class595(_vm, this)); _sprite1 = insertStaticSprite(0x942FC224, 300); @@ -806,7 +806,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x01581A9C); _palette = new Palette(_vm, 0x01581A9C); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x81A9801D, NULL)); + insertMouse433(0x81A9801D); if (!getGlobalVar(0xAC00C0D0)) { _asBalloon = addSprite(new AsScene1303Balloon(_vm, this)); @@ -878,7 +878,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x062C0214); _palette = new Palette(_vm, 0x062C0214); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0xC021006A, NULL)); + insertMouse433(0xC021006A); if (getGlobalVar(0xAC00C0D0)) { _class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347)); @@ -949,7 +949,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x28801B64); _palette = new Palette(_vm, 0x28801B64); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x01B60280, NULL)); + insertMouse433(0x01B60280); if (which < 0) { InsertKlayman(KmScene1305, 212, 441); @@ -1065,7 +1065,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x05303114); _palette = new Palette(_vm, 0x05303114); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x0311005B, NULL)); + insertMouse433(0x0311005B); if (!getGlobalVar(0x13382860)) { _class545 = addSprite(new Class545(_vm, this, 2, 1100, 435, 445)); @@ -1472,7 +1472,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0xA8006200); _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse435(_vm, 0x06204A88, 20, 620)); + insertMouse435(0x06204A88, 20, 620); tempSprite = insertStaticSprite(0x00A3621C, 800); _clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x; @@ -1790,7 +1790,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x41024202); _palette = new Palette(_vm, 0x41024202); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x24206418, NULL)); + insertMouse433(0x24206418); _asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); @@ -1978,8 +1978,8 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1317::handleMessage); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); - _mouseCursor = addSprite(new Mouse433(_vm, 0x08284011, NULL)); - _mouseCursor->getSurface()->setVisible(false); + insertMouse433(0x08284011); + showMouse(false); _smackerFileHash = 0; _smackerFlag1 = false; } @@ -2086,7 +2086,7 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity * } void Scene1317::stChooseKing() { - _mouseCursor->getSurface()->setVisible(true); + showMouse(true); SetMessageHandler(&Scene1317::hmChooseKing); SetUpdateHandler(&Scene1317::upChooseKing); _smackerFileHash = 0x10982841; @@ -2097,7 +2097,7 @@ void Scene1317::stChooseKing() { } void Scene1317::stNoDecisionYet() { - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); SetMessageHandler(&Scene1317::hmNoDecisionYet); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x20982841; @@ -2105,7 +2105,7 @@ void Scene1317::stNoDecisionYet() { } void Scene1317::stHoborgAsKing() { - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); SetMessageHandler(&Scene1317::hmHoborgAsKing); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x40982841; @@ -2113,7 +2113,7 @@ void Scene1317::stHoborgAsKing() { } void Scene1317::stKlaymanAsKing() { - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); SetMessageHandler(&Scene1317::hmKlaymanAsKing); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x80982841; @@ -2121,7 +2121,7 @@ void Scene1317::stKlaymanAsKing() { } void Scene1317::stEndMovie() { - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); SetMessageHandler(&Scene1317::hmEndMovie); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x40800711; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 7f55272228..d59cbd8812 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -727,7 +727,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x08221FA5); _palette = new Palette(_vm, 0x08221FA5); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x21FA108A, NULL)); + insertMouse433(0x21FA108A); // TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0)); _class525 = addSprite(new Class525(_vm)); @@ -949,7 +949,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0x231482F0); _palette->addPalette(0x91D3A391, 0, 64, 0); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x482F4239, NULL)); + insertMouse433(0x482F4239); _class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100)); _class454_2 = addSprite(new Class454(_vm, 0x10A02120, 1100)); @@ -976,7 +976,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x70A1189C)) { _class482 = addSprite(new Class482(_vm, this, 1)); clearRectList(); - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); sub428220(); } else { _class482 = addSprite(new Class482(_vm, this, 0)); @@ -1056,7 +1056,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit } else { clearRectList(); _klayman->getSurface()->setVisible(false); - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); sendMessage(_class482, 0x2002, 0); sub428220(); } @@ -1071,7 +1071,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2000: sub428230(); - _mouseCursor->getSurface()->setVisible(true); + showMouse(true); setRectList(0x004B0C48); break; case 0x2001: @@ -1351,7 +1351,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x00442225); _palette = new Palette(_vm, 0x00442225); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse435(_vm, 0x4222100C, 20, 620)); + insertMouse435(0x4222100C, 20, 620); _asMouse = addSprite(new AsScene1407Mouse(_vm, this)); _ssResetButton = insertStaticSprite(0x12006600, 100); @@ -1397,7 +1397,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // The mouse got the cheese (nomnom) setGlobalVar(0x70A1189C, 1); _soundResource.play(0x68E25540); - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); _puzzleSolvedCountdown = 72; break; } @@ -1417,7 +1417,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x2110A234); _palette = new Palette(_vm, 0x2110A234); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x0A230219, NULL)); + insertMouse433(0x0A230219); _class401_1 = insertStaticSprite(0x01102A33, 100); _class401_1->getSurface()->setVisible(false); @@ -1541,7 +1541,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0xAC0B006F); _palette->addPalette(0x00801510, 0, 65, 0); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0xB006BAC8, NULL)); + insertMouse433(0xB006BAC8); if (getGlobalVar(0x13382860) == 5) { _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); @@ -1755,7 +1755,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x0C0C007D); _palette = new Palette(_vm, 0x0C0C007D); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse435(_vm, 0xC00790C8, 20, 620)); + insertMouse435(0xC00790C8, 20, 620); // TODO: Some debug code: Leave two matching tiles open for (int i = 0; i < 48; i++) diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 33e690813d..2b0f25d163 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -230,7 +230,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse433(_vm, 0x18222039, NULL)); + insertMouse433(0x18222039); addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0)); addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1)); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index bedc9d4b08..cf7256bce8 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -125,7 +125,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xA6417244); _palette = new Palette(_vm, 0xA6417244); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x17240A6C, NULL)); + insertMouse433(0x17240A6C); _class401 = insertStaticSprite(0x0D641724, 1100); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 2219679d06..3bc3797152 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -738,7 +738,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x40008208); _palette = new Palette(_vm, 0x40008208); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x0820C408, NULL)); + insertMouse433(0x0820C408); _asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011)); _vm->_collisionMan->addSprite(_asTape); @@ -1122,7 +1122,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0x08100A0C); _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse435(_vm, 0x00A08089, 20, 620)); + insertMouse435(0x00A08089, 20, 620); //DEBUG! for (uint32 index = 0; index < 9; index++) @@ -1351,7 +1351,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x82C80334); _palette = new Palette(_vm, 0x82C80334); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x80330824, NULL)); + insertMouse433(0x80330824); _vm->_collisionMan->setHitRects(0x004B8320); @@ -1515,7 +1515,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0x0008028D); _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse433(_vm, 0x80289008, NULL)); + insertMouse433(0x80289008); _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0); addSprite(_ssLightSwitch); } else { @@ -1524,7 +1524,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _palette = new Palette(_vm, 0xD00A028D); _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse433(_vm, 0xA0289D08, NULL)); + insertMouse433(0xA0289D08); _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0); addSprite(_ssLightSwitch); } @@ -1571,16 +1571,14 @@ void Scene2205::update() { _background->load(0x0008028D); _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); sendMessage(_ssDoorFrame, 0x2000, 0); - ((Mouse433*)_mouseCursor)->load(0x80289008); - ((Mouse433*)_mouseCursor)->updateCursor(); + changeMouseCursor(0x80289008); _isLightOn = true; } else if (_isLightOn && !getGlobalVar(0x4D080E54)) { _palette->addPalette(0xD00A028D, 0, 256, 0); _background->load(0xD00A028D); _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); sendMessage(_ssDoorFrame, 0x2000, 0); - ((Mouse433*)_mouseCursor)->load(0xA0289D08); - ((Mouse433*)_mouseCursor)->updateCursor(); + changeMouseCursor(0xA0289D08); _isKlaymanInLight = true; if (_klayman->getX() > 85) { _palette->addPalette(0x68033B1C, 0, 65, 0); @@ -1782,7 +1780,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _sprite4->getSurface()->getClipRect().y2 = 480; setRectList(0x004B8AF8); _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0)); - _mouseCursor = addSprite(new Mouse433(_vm, 0x83212411, NULL)); + insertMouse433(0x83212411); _class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x5E00E262)); _class604 = addSprite(new Class604(_vm, 0x085E25E0)); } else { @@ -1797,7 +1795,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _sprite4->getSurface()->getClipRect().y2 = 480; setRectList(0x004B8B58); _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0)); - _mouseCursor = addSprite(new Mouse433(_vm, 0x02A41E09, NULL)); + insertMouse433(0x02A41E09); _class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x52032563)); _class604 = addSprite(new Class604(_vm, 0x317831A0)); } @@ -2296,7 +2294,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x88C00241); _palette = new Palette(_vm, 0x88C00241); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x00245884, NULL)); + insertMouse433(0x00245884); _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); @@ -2338,7 +2336,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x05C02A55); _palette = new Palette(_vm, 0x05C02A55); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x02A51054, NULL)); + insertMouse433(0x02A51054); _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); @@ -2537,7 +2535,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); addEntity(_palette); // Why? - _mouseCursor = addSprite(new Mouse435(_vm, 0x0028D089, 40, 600)); + insertMouse435(0x0028D089, 40, 600); createFontSurface(); @@ -2712,7 +2710,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x11840E24); _palette = new Palette(_vm, 0x11840E24); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x40E20110, NULL)); + insertMouse433(0x40E20110); setRectList(0x004B3DC8); } else { setBackground(0x25848E24); @@ -2721,7 +2719,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); _palette->copyBasePalette(0, 256, 0); _palette->addPalette(0x68033B1C, 0, 65, 0); - _mouseCursor = addSprite(new Mouse433(_vm, 0x48E20250, NULL)); + insertMouse433(0x48E20250); setRectList(0x004B3E18); } @@ -2850,13 +2848,13 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule setBackground(_sceneInfo140->bgFilename2); _palette = new Palette(_vm, _sceneInfo140->bgFilename2); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL)); + insertMouse433(0x14320138); } else { setRectList(0x004B2BB8); setBackground(_sceneInfo140->bgFilename1); _palette = new Palette(_vm, _sceneInfo140->bgFilename1); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x63A40028, NULL)); + insertMouse433(0x63A40028); } if (which < 0) { @@ -2947,13 +2945,13 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x40339414); _palette = new Palette(_vm, 0x40339414); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x3941040B, NULL)); + insertMouse433(0x3941040B); } else { setRectList(0x004B55C8); setBackground(0x071963E5); _palette = new Palette(_vm, 0x071963E5); _palette->usePalette(); - _mouseCursor = addSprite(new Mouse433(_vm, 0x14320138, NULL)); + insertMouse433(0x14320138); } if (which < 0) { diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 9bcd79a5e8..c28d0eb478 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -924,7 +924,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xD000420C); _palette = new Palette(_vm, 0xD000420C); - _mouseCursor = addSprite(new Mouse435(_vm, 0x04208D08, 20, 620)); + insertMouse435(0x04208D08, 20, 620); _ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this)); _vm->_collisionMan->addSprite(_ssFireCannonButton); @@ -1438,7 +1438,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) } if (which == 0) { - _mouseCursor = addSprite(new Mouse435(_vm, 0x02622800, 20, 620)); + insertMouse435(0x02622800, 20, 620); } _soundResource.load(0x68E25540); @@ -1475,7 +1475,7 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO: Debug stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) { if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) { - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); if (!_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { _countdown = 1; } else { @@ -1679,7 +1679,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) _palette->usePalette(); addEntity(_palette); - _mouseCursor = addSprite(new Mouse435(_vm, 0x24A00929, 20, 620)); + insertMouse435(0x24A00929, 20, 620); for (int i = 0; i < 12; i++) { _asSymbols[i] = new AsScene3011Symbol(_vm, i, true); diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 1eaf0cb843..03b1478c55 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -26,146 +26,66 @@ namespace Neverhood { // TODO: Use CursorMan -Mouse433::Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect) - : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0) { +Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect) + : StaticSprite(vm, 2000), _mouseType(kMouseType433), + _mouseCursorResource(vm), _frameNum(0) { - debug(7, "Mouse433::Mouse433(%08X)", fileHash); - - if (mouseRect) { - _mouseRect = *mouseRect; - } else { - _mouseRect.x1 = -1; - _mouseRect.y1 = -1; - _mouseRect.x2 = -1; - _mouseRect.y2 = -1; - } - _mouseCursorResource.load(fileHash); - _x = _vm->getMouseX(); - _y = _vm->getMouseY(); + _mouseRect = mouseRect; + init(fileHash); if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 && _y >= _mouseRect.y1 && _y <= _mouseRect.y2) { _mouseCursorResource.setCursorNum(1); } else { _mouseCursorResource.setCursorNum(4); } - createSurface(2000, 32, 32); - SetUpdateHandler(&Mouse433::update); - SetMessageHandler(&Mouse433::handleMessage); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = 32; - _drawRect.height = 32; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = 32; - _deltaRect.height = 32; - processDelta(); - _needRefresh = true; updateCursor(); } -void Mouse433::load(uint32 fileHash) { - _mouseCursorResource.load(fileHash); - _needRefresh = true; -} - -void Mouse433::update() { - debug(7, "Mouse433::update()"); - updateCursor(); - _frameNum++; - if (_frameNum >= 6) - _frameNum = 0; - _needRefresh = _frameNum % 2 == 0; -} - -uint32 Mouse433::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug(7, "Mouse433::handleMessage(%04X)", messageNum); - uint32 messageResult = 0; - if (messageNum != 5) { - messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4002: - _x = param.asPoint().x; - _y = param.asPoint().y; - if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 && - _y >= _mouseRect.y1 && _y <= _mouseRect.y2) { - _mouseCursorResource.setCursorNum(1); - } else { - _mouseCursorResource.setCursorNum(4); - } - processDelta(); - break; - } - } else { - // TODO: Debug stuff - } - return messageResult; -} - -void Mouse433::updateCursor() { - debug(7, "Mouse433::updateCursor()"); +Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) + : StaticSprite(vm, 2000), _mouseType(kMouseType435), + _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) { - if (!_surface) - return; - - if (_doDeltaX) { - _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); - } else { - _surface->getDrawRect().x = filterX(_x + _drawRect.x); - } - - if (_doDeltaY) { - _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); + init(fileHash); + if (_x <= _x1) { + _mouseCursorResource.setCursorNum(6); + } else if (_x >= _x2) { + _mouseCursorResource.setCursorNum(5); } else { - _surface->getDrawRect().y = filterY(_y + _drawRect.y); + _mouseCursorResource.setCursorNum(4); } + updateCursor(); +} - if (_needRefresh) { - _needRefresh = false; - _drawRect = _mouseCursorResource.getRect(); - _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); - } +Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int type) + : StaticSprite(vm, 2000), _mouseType(kMouseTypeNavigation), + _mouseCursorResource(vm), _type(type), _frameNum(0) { + init(fileHash); + _mouseCursorResource.setCursorNum(0); } -Mouse435::Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) - : StaticSprite(vm, 2000), _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) { - - debug(7, "Mouse435::Mouse435(%08X)", fileHash); - +void Mouse::init(uint32 fileHash) { _mouseCursorResource.load(fileHash); _x = _vm->getMouseX(); - _y = _vm->getMouseY(); - if (_x <= _x1) { - _mouseCursorResource.setCursorNum(6); - } else if (_x >= _x2) { - _mouseCursorResource.setCursorNum(5); - } else { - _mouseCursorResource.setCursorNum(4); - } + _y = _vm->getMouseY(); createSurface(2000, 32, 32); - SetUpdateHandler(&Mouse435::update); - SetMessageHandler(&Mouse435::handleMessage); + SetUpdateHandler(&Mouse::update); + SetMessageHandler(&Mouse::handleMessage); _drawRect.x = 0; _drawRect.y = 0; _drawRect.width = 32; _drawRect.height = 32; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = 32; - _deltaRect.height = 32; + _deltaRect = _drawRect; processDelta(); _needRefresh = true; - updateCursor(); } -void Mouse435::load(uint32 fileHash) { +void Mouse::load(uint32 fileHash) { _mouseCursorResource.load(fileHash); _needRefresh = true; } -void Mouse435::update() { - debug(7, "Mouse435::update()"); +void Mouse::update() { updateCursor(); _frameNum++; if (_frameNum >= 6) @@ -173,22 +93,61 @@ void Mouse435::update() { _needRefresh = _frameNum % 2 == 0; } -uint32 Mouse435::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug(7, "Mouse435::handleMessage(%04X)", messageNum); +uint32 Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug(7, "Mouse::handleMessage(%04X)", messageNum); uint32 messageResult = 0; if (messageNum != 5) { messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { - case 0x4002: + case 0x2064: _x = param.asPoint().x; _y = param.asPoint().y; - if (_x <= _x1) { - _mouseCursorResource.setCursorNum(6); - } else if (_x >= _x2) { - _mouseCursorResource.setCursorNum(5); - } else { - _mouseCursorResource.setCursorNum(4); + switch (_type) { + case 1: + if (_x >= 320) + messageResult = 1; + else + messageResult = 0; + break; + case 2: + default: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else + messageResult = 2; + break; + case 3: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else + messageResult = 4; + break; + case 4: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else if (_y >= 150) + messageResult = 2; + else + messageResult = 3; + break; + case 5: + if (_y >= 240) + messageResult = 4; + else + messageResult = 3; + break; } + break; + case 0x4002: + _x = param.asPoint().x; + _y = param.asPoint().y; + updateCursorNum(); processDelta(); break; } @@ -198,8 +157,7 @@ uint32 Mouse435::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Mouse435::updateCursor() { - debug(7, "Mouse435::updateCursor()"); +void Mouse::updateCursor() { if (!_surface) return; @@ -224,91 +182,26 @@ void Mouse435::updateCursor() { } -// NavigationMouse - -NavigationMouse::NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type) - : StaticSprite(vm, 2000), _mouseCursorResource(vm), _type(type), _frameNum(0) { - - _mouseCursorResource.load(fileHash); - _mouseCursorResource.setCursorNum(0); - _x = _vm->getMouseX(); - _y = _vm->getMouseY(); - createSurface(2000, 32, 32); - SetUpdateHandler(&NavigationMouse::update); - SetMessageHandler(&NavigationMouse::handleMessage); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = 32; - _drawRect.height = 32; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = 32; - _deltaRect.height = 32; - processDelta(); - _needRefresh = true; - updateCursor(); -} - -void NavigationMouse::update() { - updateCursor(); - _frameNum++; - if (_frameNum >= 6) - _frameNum = 0; - _needRefresh = _frameNum % 2 == 0; -} - -uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("NavigationMouse: _type = %d", _type); - uint32 messageResult = 0; - switch (messageNum) { - case 0x2064: - _x = param.asPoint().x; - _y = param.asPoint().y; - switch (_type) { - case 1: - if (_x >= 320) - messageResult = 1; - else - messageResult = 0; - break; - case 2: - default: - if (_x < 100) - messageResult = 0; - else if (_x > 540) - messageResult = 1; - else - messageResult = 2; - break; - case 3: - if (_x < 100) - messageResult = 0; - else if (_x > 540) - messageResult = 1; - else - messageResult = 4; - break; - case 4: - if (_x < 100) - messageResult = 0; - else if (_x > 540) - messageResult = 1; - else if (_y >= 150) - messageResult = 2; - else - messageResult = 3; - break; - case 5: - if (_y >= 240) - messageResult = 4; - else - messageResult = 3; - break; +void Mouse::updateCursorNum() { + switch (_mouseType) { + case kMouseType433: + if (_x >= _mouseRect.x1 && _x <= _mouseRect.x2 && + _y >= _mouseRect.y1 && _y <= _mouseRect.y2) { + _mouseCursorResource.setCursorNum(1); + } else { + _mouseCursorResource.setCursorNum(4); } break; - case 0x4002: - _x = param.asPoint().x; - _y = param.asPoint().y; + case kMouseType435: + if (_x <= _x1) { + _mouseCursorResource.setCursorNum(6); + } else if (_x >= _x2) { + _mouseCursorResource.setCursorNum(5); + } else { + _mouseCursorResource.setCursorNum(4); + } + break; + case kMouseTypeNavigation: switch (_type) { case 1: if (_x >= 320) @@ -348,36 +241,9 @@ uint32 NavigationMouse::handleMessage(int messageNum, const MessageParam ¶m, _mouseCursorResource.setCursorNum(3); break; } - _needRefresh = true; - processDelta(); break; } - return messageResult; -} - -void NavigationMouse::updateCursor() { - - if (!_surface) - return; - - if (_doDeltaX) { - _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); - } else { - _surface->getDrawRect().x = filterX(_x + _drawRect.x); - } - - if (_doDeltaY) { - _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); - } else { - _surface->getDrawRect().y = filterY(_y + _drawRect.y); - } - - if (_needRefresh) { - _needRefresh = false; - _drawRect = _mouseCursorResource.getRect(); - _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); - } - + } } // End of namespace Neverhood diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index 65dcb27856..0b4f6b81db 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -30,43 +30,30 @@ namespace Neverhood { -class Mouse433 : public StaticSprite { -public: - Mouse433(NeverhoodEngine *vm, uint32 fileHash, NRect *mouseRect); - void load(uint32 fileHash); - void updateCursor(); -protected: - MouseCursorResource _mouseCursorResource; - int _frameNum; - NRect _mouseRect; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +enum MouseType { + kMouseType433, + kMouseType435, + kMouseTypeNavigation }; -class Mouse435 : public StaticSprite { +class Mouse : public StaticSprite { public: - Mouse435(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2); + Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect); + Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2); + Mouse(NeverhoodEngine *vm, uint32 fileHash, int _type); void load(uint32 fileHash); void updateCursor(); protected: + MouseType _mouseType; MouseCursorResource _mouseCursorResource; int _frameNum; + NRect _mouseRect; int16 _x1; int16 _x2; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class NavigationMouse : public StaticSprite { -public: - NavigationMouse(NeverhoodEngine *vm, uint32 fileHash, int type); - void load(uint32 fileHash); - void updateCursor(); -protected: - MouseCursorResource _mouseCursorResource; - int _frameNum; int _type; + void init(uint32 fileHash); void update(); + void updateCursorNum(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 6b36571252..7a3161cb47 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -73,7 +73,7 @@ int NavigationScene::getNavigationAreaType() { void NavigationScene::update() { if (_smackerFileHash != 0) { - _mouseCursor->getSurface()->setVisible(false); + showMouse(false); _smackerPlayer->open(_smackerFileHash, false); _vm->_screen->clear(); _smackerDone = false; @@ -84,7 +84,7 @@ void NavigationScene::update() { } else { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; createMouseCursor(); - _mouseCursor->getSurface()->setVisible(true); + showMouse(true); _soundFlag2 = false; _soundFlag1 = false; _interactive = true; @@ -127,7 +127,7 @@ void NavigationScene::createMouseCursor() { int areaType; if (_mouseCursor) { - deleteSprite(&_mouseCursor); + deleteSprite((Sprite**)&_mouseCursor); } mouseCursorFileHash = navigationItem.mouseCursorFileHash; @@ -143,7 +143,7 @@ void NavigationScene::createMouseCursor() { areaType = 1; } - _mouseCursor = addSprite(new NavigationMouse(_vm, mouseCursorFileHash, areaType)); + insertNavigationMouse(mouseCursorFileHash, areaType); sendPointMessage(_mouseCursor, 0x4002, _vm->getMousePos()); } diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index c6f9f127fb..5072d5339d 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -190,6 +190,33 @@ Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { return addSprite(new StaticSprite(_vm, fileHash, surfacePriority)); } +void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) { + NRect rect(-1, -1, -1, -1); + if (mouseRect) + rect = *mouseRect; + _mouseCursor = new Mouse(_vm, 0x0820C408, rect); + addSprite(_mouseCursor); +} + +void Scene::insertMouse435(uint32 fileHash, int16 x1, int16 x2) { + _mouseCursor = new Mouse(_vm, fileHash, x1, x2); + addSprite(_mouseCursor); +} + +void Scene::insertNavigationMouse(uint32 fileHash, int type) { + _mouseCursor = new Mouse(_vm, fileHash, type); + addSprite(_mouseCursor); +} + +void Scene::showMouse(bool visible) { + _mouseCursor->getSurface()->setVisible(visible); +} + +void Scene::changeMouseCursor(uint32 fileHash) { + _mouseCursor->load(fileHash); + _mouseCursor->updateCursor(); +} + SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) { addEntity(smackerPlayer); addSurface(smackerPlayer->getSurface()); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 9b928bb19c..31dd61db6d 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -56,6 +56,11 @@ public: void setBackground(uint32 fileHash, bool dirtyBackground = true); void changeBackground(uint32 fileHash); Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); + void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL); + void insertMouse435(uint32 fileHash, int16 x1, int16 x2); + void insertNavigationMouse(uint32 fileHash, int type); + void showMouse(bool visible); + void changeMouseCursor(uint32 fileHash); SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); protected: @@ -74,7 +79,7 @@ protected: HitRectList _hitRectList; int _rectType; // TODO 0000008E field_8E dw ? - Sprite *_mouseCursor; + Mouse *_mouseCursor; Klayman *_klayman; Palette *_palette; Background *_background; -- cgit v1.2.3 From a4c34cedd5b7e97104cfb53b90f9808c4204dcf1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 09:30:51 +0000 Subject: NEVERHOOD: Merge createSceneXXX/updateSceneXXX methods into createScene and updateScene for Module1200 --- engines/neverhood/module1200.cpp | 97 +++++++++++++++++----------------------- engines/neverhood/module1200.h | 9 +--- 2 files changed, 43 insertions(+), 63 deletions(-) diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index c050abcf68..ff0493713c 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -33,21 +33,11 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) debug("Module1200: which = %d", which); if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 0: - createScene1201(-1); - break; - case 1: - createScene1202(-1); - break; - case 2: - createScene1203(-1); - break; - } + createScene(_vm->gameState().sceneNum, -1); } else if (which == 1) { - createScene1201(2); + createScene(0, 2); } else { - createScene1201(0); + createScene(0, 0); } // TODO Music18hList_add(0x00478311, 0x62222CAE); @@ -58,58 +48,53 @@ Module1200::~Module1200() { // TODO Music18hList_deleteGroup(0x00478311); } -void Module1200::createScene1201(int which) { - _vm->gameState().sceneNum = 0; - _childObject = new Scene1201(_vm, this, which); - SetUpdateHandler(&Module1200::updateScene1201); -} - -void Module1200::createScene1202(int which) { - _vm->gameState().sceneNum = 1; - _childObject = new Scene1202(_vm, this, which); - SetUpdateHandler(&Module1200::updateScene1202); -} - -void Module1200::createScene1203(int which) { - _vm->gameState().sceneNum = 2; - // TODO Music18hList_stop(0x62222CAE, 0, 0); - createSmackerScene(0x31890001, true, true, false); - setGlobalVar(0x2A02C07B, 1); - SetUpdateHandler(&Module1200::updateScene1203); +void Module1200::createScene(int sceneNum, int which) { + debug("Module1200::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _childObject = new Scene1201(_vm, this, which); + break; + case 1: + _childObject = new Scene1202(_vm, this, which); + break; + case 2: + // TODO Music18hList_stop(0x62222CAE, 0, 0); + createSmackerScene(0x31890001, true, true, false); + setGlobalVar(0x2A02C07B, 1); + break; + } + SetUpdateHandler(&Module1200::updateScene); + _childObject->handleUpdate(); } -void Module1200::updateScene1201() { +void Module1200::updateScene() { if (!updateChild()) { - if (_moduleResult == 1) { - createScene1202(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { - createScene1203(-1); + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + createScene(1, 0); + } else if (_moduleResult == 2) { + if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { + createScene(2, -1); + } else { + sendMessage(_parentModule, 0x1009, 1); + } } else { - sendMessage(_parentModule, 0x1009, 1); + sendMessage(_parentModule, 0x1009, 0); } - } else { - sendMessage(_parentModule, 0x1009, 0); + break; + case 1: + createScene(0, 1); + break; + case 2: + // TODO Music18hList_play(0x62222CAE, 0, 0, 1); + createScene(0, 3); + break; } } } -void Module1200::updateScene1202() { - if (!updateChild()) { - createScene1201(1); - _childObject->handleUpdate(); - } -} - -void Module1200::updateScene1203() { - if (!updateChild()) { - createScene1201(3); - _childObject->handleUpdate(); - // TODO Music18hList_play(0x62222CAE, 0, 0, 1); - } -} - // Scene1201 static const uint32 kScene1201InitArray[] = { diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index df1ed41b2c..a34bd958e6 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -36,13 +36,8 @@ public: Module1200(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1200(); protected: - // TODO ResourceTable _resourceTable; - void createScene1201(int which); - void createScene1202(int which); - void createScene1203(int which); - void updateScene1201(); - void updateScene1202(); - void updateScene1203(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene1201 -- cgit v1.2.3 From 17ad070a9c6c0fd86d1f60d90b331eb59b19cf7b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 13:00:54 +0000 Subject: NEVERHOOD: Move createSceneXXX/updateSceneXXX methods They are merged into createScene and updateScene for the other already implemented modules (I hope I didn't break too much :) --- engines/neverhood/gamemodule.cpp | 17 +- engines/neverhood/module.cpp | 8 +- engines/neverhood/module.h | 8 + engines/neverhood/module1300.cpp | 536 +++++++++++-------------------- engines/neverhood/module1300.h | 36 +-- engines/neverhood/module1400.cpp | 219 +++++-------- engines/neverhood/module1400.h | 16 +- engines/neverhood/module1500.cpp | 76 ++--- engines/neverhood/module1500.h | 7 +- engines/neverhood/module1700.cpp | 158 ++++----- engines/neverhood/module1700.h | 12 +- engines/neverhood/module1800.cpp | 291 +++++++---------- engines/neverhood/module1800.h | 22 +- engines/neverhood/module2000.cpp | 105 +++--- engines/neverhood/module2000.h | 8 +- engines/neverhood/module2300.cpp | 241 ++++++-------- engines/neverhood/module2300.h | 14 +- engines/neverhood/module3000.cpp | 640 +++++++++++++++---------------------- engines/neverhood/module3000.h | 26 +- engines/neverhood/smackerscene.cpp | 4 +- 20 files changed, 908 insertions(+), 1536 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 103d53df95..e6bd99e990 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -276,7 +276,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule2000(-1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 4; createModule2200(-1); #endif @@ -284,6 +284,10 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule1000(-1); #endif +#if 1 + _vm->gameState().sceneNum = 12; + createModule3000(-1); +#endif } void GameModule::createModule1000(int which) { @@ -375,7 +379,6 @@ void GameModule::createModule1700(int which) { void GameModule::updateModule1700() { if (!updateChild()) { - debug("Module1700 done; _moduleResult = %d", _moduleResult); if (_moduleResult == 1) { // TODO createModule2900(3); // TODO _childObject->handleUpdate(); @@ -401,8 +404,8 @@ void GameModule::updateModule1800() { // TODO createModule2700(0); // TODO _childObject->handleUpdate(); } else if (_moduleResult == 3) { - // TODO createModule3000(3); - // TODO _childObject->handleUpdate(); + createModule3000(3); + _childObject->handleUpdate(); } else { // TODO createModule2800(0); // TODO _childObject->handleUpdate(); @@ -451,7 +454,7 @@ void GameModule::updateModule2300() { } else if (_moduleResult == 3) { // TODO createModule2400(0); } else if (_moduleResult == 4) { - // TODO createModule3000(0); + createModule3000(0); } else { createModule1000(1); } @@ -480,8 +483,8 @@ void GameModule::updateModule3000() { createModule1800(3); _childObject->handleUpdate(); } else if (_moduleResult == 4) { - // TODO createModule3000(0); - // TODO _childObject->handleUpdate(); + createModule3000(0); + _childObject->handleUpdate(); } else { createModule2300(4); _childObject->handleUpdate(); diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 78775ceba1..c58c924c3a 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -28,7 +28,7 @@ namespace Neverhood { Module::Module(NeverhoodEngine *vm, Module *parentModule) : Entity(vm, 0), _parentModule(parentModule), _childObject(NULL), - _done(false) { + _done(false), _sceneType(kSceneTypeNormal) { SetMessageHandler(&Module::handleMessage); @@ -71,11 +71,13 @@ NavigationScene *Module::navigationScene() { } void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes) { + _sceneType = kSceneTypeNavigation; _childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes); } void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort) { SmackerScene *smackerScene; + _sceneType = kSceneTypeSmacker; smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort); smackerScene->setFileHash(fileHash); smackerScene->nextVideo(); @@ -87,8 +89,12 @@ bool Module::updateChild() { _childObject->handleUpdate(); if (_done) { _done = false; + // Save the last area type if it's a NavigationScene for further processing + if (_sceneType == kSceneTypeNavigation) + _navigationAreaType = navigationScene()->getNavigationAreaType(); delete _childObject; _childObject = NULL; + _sceneType = kSceneTypeNormal; return false; } } diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 2f272d71b6..c0fdaa79b5 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -38,6 +38,12 @@ namespace Neverhood { class NavigationScene; +enum SceneType { + kSceneTypeNormal, + kSceneTypeSmacker, + kSceneTypeNavigation +}; + class Module : public Entity { public: Module(NeverhoodEngine *vm, Module *parentModule); @@ -48,6 +54,8 @@ protected: Entity *_childObject; bool _done; uint32 _moduleResult; + SceneType _sceneType; + int _navigationAreaType; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); NavigationScene *navigationScene(); void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index af2390cb86..518568cdb0 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -35,8 +35,6 @@ namespace Neverhood { Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - debug("Create Module1300(%d)", which); - // TODO Music18hList_add(0x61C090, 0x203197); // TODO Sound1ChList_addSoundResources(0x61C090, dword_4B2868, true); // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, 0, 50, 600, 20, 150); @@ -45,406 +43,250 @@ Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Sound1ChList_setVolume(0x50399F64, 70); if (which < 0) { - switch (_vm->gameState().sceneNum) { + if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17) + createScene(_vm->gameState().sceneNum, -1); + else + createScene(11, 0); + } else { + switch (which) { + case 0: + createScene(11, 0); + break; case 1: - createScene1302(-1); + createScene(13, 0); break; case 2: - createScene1303(-1); + createScene(14, 0); break; case 3: - createScene1304(-1); + createScene(15, 0); break; case 4: - createScene1305(-1); + createScene(7, 0); break; case 5: - createScene1306(-1); + createScene(5, 1); break; case 6: - createScene1307(-1); + createScene(5, 5); break; case 7: - createScene1308(-1); + createScene(3, 0); break; case 8: - createScene1309(-1); + createScene(1, 0); break; case 9: - createScene1310(-1); + createScene(2, 0); break; case 10: - createScene1311(-1); + createScene(6, 0); break; case 11: - createScene1312(-1); - break; - case 12: - createScene1313(-1); - break; - case 13: - createScene1314(-1); - break; - case 14: - createScene1315(-1); - break; - case 15: - createScene1316(-1); - break; - case 16: - createScene1317(-1); - break; - case 17: - createScene1318(-1); + createScene(4, 0); break; default: - createScene1312(0); - } - } else { - switch (which) { - case 0: - createScene1312(0); + createScene(12, 0); break; + } + } + +} + +Module1300::~Module1300() { + // TODO Sound1ChList_sub_407A50(0x61C090); +} + +void Module1300::createScene(int sceneNum, int which) { + debug("Module1300::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 1: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1302(_vm, this, which); + break; + case 2: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1303(_vm, this, which); + break; + case 3: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1304(_vm, this, which); + break; + case 4: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1305(_vm, this, which); + break; + case 5: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1306(_vm, this, which); + break; + case 6: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1307(_vm, this, which); + break; + case 7: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_play(0x203197, 0, 2, 1); + _childObject = new Scene1308(_vm, this, which); + break; + case 8: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 1); + break; + case 9: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createSmackerScene(0x20082818, true, true, false); + break; + case 10: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createSmackerScene(0x20082828, true, true, false); + break; + case 11: + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createNavigationScene(0x004B27A8, which); + break; + case 12: + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createNavigationScene(0x004B2718, which); + break; + case 13: + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createNavigationScene(0x004B27D8, which); + break; + case 14: + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createNavigationScene(0x004B2808, which); + break; + case 15: + // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + createNavigationScene(0x004B2838, which); + break; + case 16: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); + // TODO Music18hList_stop(0x203197, 0, 2); + _childObject = new Scene1317(_vm, this, which); + break; + case 17: + // TODO: Credits scene + break; + } + SetUpdateHandler(&Module1300::updateScene); + _childObject->handleUpdate(); +} + +void Module1300::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { case 1: - createScene1314(0); + if (_moduleResult == 1) { + createScene(4, 0); + } else { + createScene(7, 1); + } break; case 2: - createScene1315(0); + createScene(5, 3); break; case 3: - createScene1316(0); + createScene(15, 0); break; case 4: - createScene1308(0); + createScene(16, -1); break; case 5: - createScene1306(1); + if (_moduleResult == 2) { + createScene(8, 0); + } else if (_moduleResult == 3) { + createScene(2, 0); + } else if (_moduleResult == 0) { + sendMessage(_parentModule, 0x1009, 0); + } else if (_moduleResult == 1) { + createScene(10, -1); + } break; case 6: - createScene1306(5); + createScene(7, 2); break; case 7: - createScene1304(0); + if (_moduleResult == 0) { + createScene(13, 0); + } else if (_moduleResult == 1) { + createScene(1, 0); + } else if (_moduleResult == 2) { + createScene(6, 0); + } break; case 8: - createScene1302(0); + createScene(5, 2); break; case 9: - createScene1303(0); + createScene(5, 0); break; case 10: - createScene1307(0); + createScene(14, 0); break; case 11: - createScene1305(0); + if (_moduleResult == 0) + createScene(12, 0); + else if (_moduleResult == 1) + createScene(11, 1); break; - default: - createScene1313(0); + case 12: + if (_moduleResult == 0) + createScene(14, 1); + else if (_moduleResult == 1) + createScene(15, 1); + else if (_moduleResult == 3) + createScene(11, 1); + else if (_moduleResult == 5) + createScene(13, 1); break; - } - } - -} - -Module1300::~Module1300() { - // TODO Sound1ChList_sub_407A50(0x61C090); -} - -void Module1300::createScene1302(int which) { - _vm->gameState().sceneNum = 1; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); - _childObject = new Scene1302(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1302); -} - -void Module1300::createScene1303(int which) { - _vm->gameState().sceneNum = 2; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); - _childObject = new Scene1303(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1303); -} - -void Module1300::createScene1304(int which) { - _vm->gameState().sceneNum = 3; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); - _childObject = new Scene1304(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1304); -} - -void Module1300::createScene1305(int which) { - _vm->gameState().sceneNum = 4; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); - _childObject = new Scene1305(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1305); -} - -void Module1300::createScene1306(int which) { - _vm->gameState().sceneNum = 5; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); - _childObject = new Scene1306(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1306); -} - -void Module1300::createScene1307(int which) { - _vm->gameState().sceneNum = 6; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); - _childObject = new Scene1307(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1307); -} - -void Module1300::createScene1308(int which) { - _vm->gameState().sceneNum = 7; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); - _childObject = new Scene1308(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1308); -} - -void Module1300::createScene1309(int which) { - _vm->gameState().sceneNum = 8; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 1); - SetUpdateHandler(&Module1300::updateScene1309); -} - -void Module1300::createScene1310(int which) { - _vm->gameState().sceneNum = 9; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); - createSmackerScene(0x20082818, true, true, false); - SetUpdateHandler(&Module1300::updateScene1310); -} - -void Module1300::createScene1311(int which) { - _vm->gameState().sceneNum = 10; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); - createSmackerScene(0x20082828, true, true, false); - SetUpdateHandler(&Module1300::updateScene1310); -} - -void Module1300::createScene1312(int which) { - _vm->gameState().sceneNum = 11; - createNavigationScene(0x004B27A8, which); - SetUpdateHandler(&Module1300::updateScene1312); - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); -} - -void Module1300::createScene1313(int which) { - _vm->gameState().sceneNum = 12; - createNavigationScene(0x004B2718, which); - SetUpdateHandler(&Module1300::updateScene1313); - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); -} - -void Module1300::createScene1314(int which) { - _vm->gameState().sceneNum = 13; - createNavigationScene(0x004B27D8, which); - SetUpdateHandler(&Module1300::updateScene1314); - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); -} - -void Module1300::createScene1315(int which) { - _vm->gameState().sceneNum = 14; - createNavigationScene(0x004B2808, which); - SetUpdateHandler(&Module1300::updateScene1315); - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); -} - -void Module1300::createScene1316(int which) { - _vm->gameState().sceneNum = 15; - createNavigationScene(0x004B2838, which); - SetUpdateHandler(&Module1300::updateScene1316); - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); -} - -void Module1300::createScene1317(int which) { - _vm->gameState().sceneNum = 16; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); - _childObject = new Scene1317(_vm, this, which); - SetUpdateHandler(&Module1300::updateScene1317); -} - -void Module1300::createScene1318(int which) { - // TODO: Credits scene -} - -void Module1300::updateScene1302() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene1305(0); - } else { - createScene1308(1); - } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1303() { - if (!updateChild()) { - createScene1306(3); - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1304() { - if (!updateChild()) { - createScene1316(0); - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1305() { - if (!updateChild()) { - createScene1317(-1); - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1306() { - if (!updateChild()) { - if (_moduleResult == 2) { - createScene1309(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 3) { - createScene1303(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 0) { - sendMessage(_parentModule, 0x1009, 0); - } else if (_moduleResult == 1) { - createScene1311(-1); - _childObject->handleUpdate(); - } - } -} - -void Module1300::updateScene1307() { - if (!updateChild()) { - createScene1308(2); - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1308() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1314(0); - } else if (_moduleResult == 1) { - createScene1302(0); - } else if (_moduleResult == 2) { - createScene1307(0); - } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1309() { - if (!updateChild()) { - createScene1306(2); - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1310() { - if (!updateChild()) { - if (_vm->gameState().sceneNum == 9) - createScene1306(0); - else - createScene1315(0); - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1311() { -} - -void Module1300::updateScene1312() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1313(0); - } else if (_moduleResult == 1) { - createScene1312(1); - } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1313() { - if (!updateChild()) { - switch (_moduleResult) { - case 0: - createScene1315(1); + case 13: + if (_moduleResult == 0) { + createScene(12, 2); + } else if (_moduleResult == 1) { + createScene(7, 0); + } break; - case 1: - createScene1316(1); + case 14: + if (_moduleResult == 0) { + createScene(12, 3); + } else if (_moduleResult == 1) { + createScene(9, -1); + } break; - case 3: - createScene1312(1); + case 15: + if (_moduleResult == 0) { + createScene(12, 4); + } else if (_moduleResult == 1) { + createScene(3, 0); + } break; - case 5: - createScene1314(1); + case 16: + createScene(17, -1); + break; + case 17: + // TODO break; } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1314() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1313(2); - } else if (_moduleResult == 1) { - createScene1308(0); - } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1315() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1313(3); - } else if (_moduleResult == 1) { - createScene1310(-1); - } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1316() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1313(4); - } else if (_moduleResult == 1) { - createScene1304(0); - } - _childObject->handleUpdate(); - } -} - -void Module1300::updateScene1317() { - if (!updateChild()) { - createScene1318(-1); - _childObject->handleUpdate(); } } -void Module1300::updateScene1318() { -} - AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene) { diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 0e9837cc96..27e2540407 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -38,40 +38,8 @@ public: virtual ~Module1300(); protected: uint32 _musicFileHash; - void createScene1302(int which); - void createScene1303(int which); - void createScene1304(int which); - void createScene1305(int which); - void createScene1306(int which); - void createScene1307(int which); - void createScene1308(int which); - void createScene1309(int which); - void createScene1310(int which); - void createScene1311(int which); - void createScene1312(int which); - void createScene1313(int which); - void createScene1314(int which); - void createScene1315(int which); - void createScene1316(int which); - void createScene1317(int which); - void createScene1318(int which); - void updateScene1302(); - void updateScene1303(); - void updateScene1304(); - void updateScene1305(); - void updateScene1306(); - void updateScene1307(); - void updateScene1308(); - void updateScene1309(); - void updateScene1310(); - void updateScene1311(); - void updateScene1312(); - void updateScene1313(); - void updateScene1314(); - void updateScene1315(); - void updateScene1316(); - void updateScene1317(); - void updateScene1318(); + void createScene(int sceneNum, int which); + void updateScene(); }; class AsScene1302Bridge : public AnimatedSprite { diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index d59cbd8812..32918b1424 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -31,36 +31,13 @@ namespace Neverhood { Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - debug("Create Module1400(%d)", which); - // TODO Music18hList_add(0x00AD0012, 0x06333232); // TODO Music18hList_add(0x00AD0012, 0x624A220E); if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 1: - createScene1402(-1); - break; - case 2: - createScene1403(-1); - break; - case 3: - createScene1404(-1); - break; - case 4: - createScene1405(-1); - break; - case 5: - createScene1406(-1); - break; - case 6: - createScene1407(-1); - break; - default: - createScene1401(-1); - } + createScene(_vm->gameState().sceneNum, -1); } else { - createScene1401(0); + createScene(0, 0); } } @@ -69,129 +46,91 @@ Module1400::~Module1400() { // TODO Music18hList_deleteGroup(0x00AD0012); } -void Module1400::createScene1401(int which) { - _vm->gameState().sceneNum = 0; - // TODO Music18hList_play(0x06333232, 0, 2, 1); - _childObject = new Scene1401(_vm, this, which); - SetUpdateHandler(&Module1400::updateScene1401); -} - -void Module1400::createScene1402(int which) { - _vm->gameState().sceneNum = 1; - // TODO Music18hList_stop(0x06333232, 0, 2); - // TODO Music18hList_stop(0x624A220E, 0, 2); - _childObject = new Scene1402(_vm, this, which); - SetUpdateHandler(&Module1400::updateScene1402); -} - -void Module1400::createScene1403(int which) { - _vm->gameState().sceneNum = 2; - // TODO Music18hList_stop(0x06333232, 0, 2); - // TODO Music18hList_play(0x624A220E, 0, 2, 1); - _childObject = new Scene1403(_vm, this, which); - SetUpdateHandler(&Module1400::updateScene1403); -} - -void Module1400::createScene1404(int which) { - _vm->gameState().sceneNum = 3; - // TODO Music18hList_play(0x06333232, 0, 2, 1); - _childObject = new Scene1404(_vm, this, which); - SetUpdateHandler(&Module1400::updateScene1404); -} - -void Module1400::createScene1405(int which) { - _vm->gameState().sceneNum = 4; - // TODO Music18hList_play(0x06333232, 0, 2, 1); - _childObject = new Scene1405(_vm, this, which); - SetUpdateHandler(&Module1400::updateScene1405); -} - -void Module1400::createScene1406(int which) { - _vm->gameState().sceneNum = 5; - // TODO Music18hList_stop(0x06333232, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 2); - SetUpdateHandler(&Module1400::updateScene1406); -} - -void Module1400::createScene1407(int which) { - _vm->gameState().sceneNum = 6; - // TODO Music18hList_stop(0x06333232, 0, 2); - _childObject = new Scene1407(_vm, this, which); - SetUpdateHandler(&Module1400::updateScene1407); -} - -void Module1400::updateScene1401() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene1402(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene1404(0); - _childObject->handleUpdate(); - } else { - sendMessage(_parentModule, 0x1009, 0); - } - } -} - -void Module1400::updateScene1402() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene1403(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene1407(-1); - _childObject->handleUpdate(); - } else { - createScene1401(1); - _childObject->handleUpdate(); - } - } -} - -void Module1400::updateScene1403() { - if (!updateChild()) { - createScene1402(1); - _childObject->handleUpdate(); +void Module1400::createScene(int sceneNum, int which) { + debug("Module1400::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Music18hList_play(0x06333232, 0, 2, 1); + _childObject = new Scene1401(_vm, this, which); + break; + case 1: + // TODO Music18hList_stop(0x06333232, 0, 2); + // TODO Music18hList_stop(0x624A220E, 0, 2); + _childObject = new Scene1402(_vm, this, which); + break; + case 2: + // TODO Music18hList_stop(0x06333232, 0, 2); + // TODO Music18hList_play(0x624A220E, 0, 2, 1); + _childObject = new Scene1403(_vm, this, which); + break; + case 3: + // TODO Music18hList_play(0x06333232, 0, 2, 1); + _childObject = new Scene1404(_vm, this, which); + break; + case 4: + // TODO Music18hList_play(0x06333232, 0, 2, 1); + _childObject = new Scene1405(_vm, this, which); + break; + case 5: + // TODO Music18hList_stop(0x06333232, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 2); + break; + case 6: + // TODO Music18hList_stop(0x06333232, 0, 2); + _childObject = new Scene1407(_vm, this, which); + break; } + SetUpdateHandler(&Module1400::updateScene); + _childObject->handleUpdate(); } -void Module1400::updateScene1404() { +void Module1400::updateScene() { if (!updateChild()) { - if (_moduleResult == 1) { - createScene1405(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene1406(-1); - _childObject->handleUpdate(); - } else { - createScene1401(2); - _childObject->handleUpdate(); + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + createScene(1, 0); + } else if (_moduleResult == 2) { + createScene(3, 0); + } else { + sendMessage(_parentModule, 0x1009, 0); + } + break; + case 1: + if (_moduleResult == 1) { + createScene(2, 0); + } else if (_moduleResult == 2) { + createScene(6, -1); + } else { + createScene(0, 1); + } + break; + case 2: + createScene(1, 1); + break; + case 3: + if (_moduleResult == 1) { + createScene(4, 0); + } else if (_moduleResult == 2) { + createScene(5, -1); + } else { + createScene(0, 2); + } + break; + case 4: + createScene(3, 1); + break; + case 5: + createScene(3, 2); + break; + case 6: + createScene(1, 2); + break; } } } -void Module1400::updateScene1405() { - if (!updateChild()) { - createScene1404(1); - _childObject->handleUpdate(); - } -} - -void Module1400::updateScene1406() { - if (!updateChild()) { - createScene1404(2); - _childObject->handleUpdate(); - } -} - -void Module1400::updateScene1407() { - if (!updateChild()) { - createScene1402(2); - _childObject->handleUpdate(); - } -} - // Scene1401 Class525::Class525(NeverhoodEngine *vm) diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 72afb4f15a..7b4d95761b 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -35,20 +35,8 @@ public: Module1400(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1400(); protected: - void createScene1401(int which); - void createScene1402(int which); - void createScene1403(int which); - void createScene1404(int which); - void createScene1405(int which); - void createScene1406(int which); - void createScene1407(int which); - void updateScene1401(); - void updateScene1402(); - void updateScene1403(); - void updateScene1404(); - void updateScene1405(); - void updateScene1406(); - void updateScene1407(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene1401 diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 7c03e9b941..09567f5392 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -27,43 +27,51 @@ namespace Neverhood { Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag) : Module(vm, parentModule), _flag(flag) { - debug("Create Module1500(%d)", which); - if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 1: - createScene1502(); - break; - case 2: - createScene1503(); - break; - case 3: - createScene1504(); - break; - default: - createScene1501(); - } + createScene(_vm->gameState().sceneNum, -1); } else { - createScene1504(); + createScene(3, -1); } } -void Module1500::update() { +void Module1500::createScene(int sceneNum, int which) { + debug("Module1500::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); + break; + case 1: + _childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48); + break; + case 2: + sendMessage(_parentModule, 0x0800, 0); + createSmackerScene(0x001A0005, true, true, true); + break; + case 3: + _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); + break; + } + SetUpdateHandler(&Module1500::updateScene); + _childObject->handleUpdate(); +} + +void Module1500::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 0: - createScene1502(); + createScene(1, -1); break; case 1: if (_flag) { - createScene1503(); + createScene(2, -1); } else { sendMessage(_parentModule, 0x1009, 0); } break; case 3: - createScene1501(); + createScene(0, -1); break; default: sendMessage(_parentModule, 0x1009, 0); @@ -72,40 +80,12 @@ void Module1500::update() { } } -void Module1500::createScene1501() { - _vm->gameState().sceneNum = 0; - _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); - SetUpdateHandler(&Module1500::update); -} - -void Module1500::createScene1502() { - debug("createScene1502"); - _vm->gameState().sceneNum = 1; - _childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48); - SetUpdateHandler(&Module1500::update); -} - -void Module1500::createScene1503() { - sendMessage(_parentModule, 0x0800, 0); - _vm->gameState().sceneNum = 2; - createSmackerScene(0x001A0005, true, true, true); - SetUpdateHandler(&Module1500::update); -} - -void Module1500::createScene1504() { - _vm->gameState().sceneNum = 3; - _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); - SetUpdateHandler(&Module1500::update); -} - // Scene1501 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) : Scene(vm, parentModule, true), _soundResource(vm), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) { - debug("Create Scene1501(%08X, %08X, %d, %d)", backgroundFileHash, soundFileHash, countdown2, countdown3); - SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h index 87b2a0b9ae..eeabec0618 100644 --- a/engines/neverhood/module1500.h +++ b/engines/neverhood/module1500.h @@ -37,11 +37,8 @@ public: Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag); protected: bool _flag; - void update(); - void createScene1501(); - void createScene1502(); - void createScene1503(); - void createScene1504(); + void createScene(int sceneNum, int which); + void updateScene(); }; class Scene1501 : public Scene { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 2b0f25d163..9188dab2b0 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -27,36 +27,19 @@ namespace Neverhood { Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource(vm) { - debug("Create Module1700(%d)", which); - // TODO Music18hList_add(0x04212331); // TODO Sound1ChList_addSoundResources(0x04212331, dword_4AE930, true); // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 50, 600, 5, 150); // TODO Sound1ChList_sub_407C70(0x04212331, 0x41861371, 0x43A2507F, 0); if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 0: - createScene1701(-1); - break; - case 1: - createScene1702(-1); - break; - case 2: - createScene1703(-1); - break; - case 3: - createScene1704(-1); - break; - default: - createScene1705(-1); - } + createScene(_vm->gameState().sceneNum, -1); } else if (which == 0) { - createScene1701(-1); + createScene(0, -1); } else if (which == 1) { - createScene1705(1); + createScene(4, 1); } else { - createScene1705(3); + createScene(4, 3); } } @@ -65,90 +48,71 @@ Module1700::~Module1700() { // TODO Sound1ChList_sub_407A50(0x04212331); } -void Module1700::createScene1701(int which) { - _vm->gameState().sceneNum = 0; - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); - createSmackerScene(0x3028A005, true, true, false); - SetUpdateHandler(&Module1700::updateScene1701); -} - -void Module1700::createScene1702(int which) { - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004AE8B8, which); - SetUpdateHandler(&Module1700::updateScene1702); -} - -void Module1700::createScene1703(int which) { - _vm->gameState().sceneNum = 2; - createNavigationScene(0x004AE8E8, which); - SetUpdateHandler(&Module1700::updateScene1703); -} - -void Module1700::createScene1704(int which) { - _vm->gameState().sceneNum = 3; - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); - createSmackerScene(0x01190041, true, true, false); - SetUpdateHandler(&Module1700::updateScene1701); -} - -void Module1700::createScene1705(int which) { - _vm->gameState().sceneNum = 4; - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); - // TODO Music18hList_play(0x31114225, 0, 2, 1); - _childObject = new Scene1705(_vm, this, which); - SetUpdateHandler(&Module1700::updateScene1705); -} - -void Module1700::updateScene1701() { - if (!updateChild()) { - if (_vm->gameState().sceneNum == 3) { - createScene1705(0); - _childObject->handleUpdate(); - } else { - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0); - createScene1702(0); - _childObject->handleUpdate(); - } - } -} - -void Module1700::updateScene1702() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1703(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 1) { - createScene1702(1); - _childObject->handleUpdate(); - } +void Module1700::createScene(int sceneNum, int which) { + debug("Module1700::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + createSmackerScene(0x3028A005, true, true, false); + break; + case 1: + createNavigationScene(0x004AE8B8, which); + break; + case 2: + createNavigationScene(0x004AE8E8, which); + break; + case 3: + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + createSmackerScene(0x01190041, true, true, false); + break; + case 4: + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + // TODO Music18hList_play(0x31114225, 0, 2, 1); + _childObject = new Scene1705(_vm, this, which); + break; } + SetUpdateHandler(&Module1700::updateScene); + _childObject->handleUpdate(); } -void Module1700::updateScene1703() { +void Module1700::updateScene() { if (!updateChild()) { - if (_moduleResult == 0) { - createScene1704(-1); - _childObject->handleUpdate(); - } else if (_moduleResult == 1) { - createScene1702(1); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - if (!_soundResource.isPlaying()) { - // TODO _soundResource.setVolume(60); - _soundResource.play(0x58B45E58); + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0); + createScene(1, 0); + break; + case 1: + if (_moduleResult == 0) { + createScene(2, 0); + } else if (_moduleResult == 1) { + createScene(1, 1); + } + break; + case 2: + if (_moduleResult == 0) { + createScene(3, -1); + } else if (_moduleResult == 1) { + createScene(1, 1); + } else if (_moduleResult == 2) { + if (!_soundResource.isPlaying()) { + // TODO _soundResource.setVolume(60); + _soundResource.play(0x58B45E58); + } + createScene(2, 2); } - createScene1703(2); - _childObject->handleUpdate(); + break; + case 3: + createScene(4, 0); + break; + case 4: + sendMessage(_parentModule, 0x1009, 1); + break; } } } - -void Module1700::updateScene1705() { - if (!updateChild()) { - sendMessage(_parentModule, 0x1009, 1); - } -} - + // Scene1705 static const uint32 kScene1705FileHashes[] = { diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h index 0fefa72122..f7388484b2 100644 --- a/engines/neverhood/module1700.h +++ b/engines/neverhood/module1700.h @@ -36,16 +36,8 @@ public: virtual ~Module1700(); protected: SoundResource _soundResource; - void update(); - void createScene1701(int which); - void createScene1702(int which); - void createScene1703(int which); - void createScene1704(int which); - void createScene1705(int which); - void updateScene1701(); - void updateScene1702(); - void updateScene1703(); - void updateScene1705(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene1705 diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 31a156461d..d5aa789cbf 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -28,218 +28,143 @@ namespace Neverhood { Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - debug("Create Module1800(%d)", which); - // TODO Sound1ChList_addSoundResources(0x04A14718, dword_4AFE70); // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 1, 50, 600, 10, 150); // TODO Sound1ChList_sub_407C70(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 2) { + createScene(5, 0); + } else if (which == 3) { + createScene(0, 0); + } else { + createScene(3, 1); + } + +} + +Module1800::~Module1800() { + // TODO Sound1ChList_sub_407A50(0x04A14718); +} + +void Module1800::createScene(int sceneNum, int which) { + static const byte kNavigationTypes00[] = {1, 0, 2, 0}; + static const byte kNavigationTypes01[] = {5}; + debug("Module1800::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + createNavigationScene(0x004AFD38, which, kNavigationTypes00); + break; + case 1: + createNavigationScene(0x004AFD98, which, kNavigationTypes01); + break; + case 2: + createSmackerScene(0x006C0085, true, true, false); + break; + case 3: + createNavigationScene(0x004AFDB0, which); + break; + case 4: + createNavigationScene(0x004AFDE0, which); + break; + case 5: + createNavigationScene(0x004AFE40, which); + break; + case 6: + // TODO Sound1ChList_sub_407A50(0x04A14718); + createSmackerScene(0x08D84010, true, true, false); + break; + case 7: + // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0); + createSmackerScene(0x0168B121, true, true, false); + break; + case 8: + // TODO _childObject = new CreditsScene(_vm, this, 0); + break; + case 9: + // NOTE: Newly introduced sceneNum 9 (was duplicate 3 with own update handler) + createSmackerScene(0x0A840C01, true, true, false); + break; + } + SetUpdateHandler(&Module1800::updateScene); + _childObject->handleUpdate(); +} + +void Module1800::updateScene() { + if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 0: - createScene1801(-1); + if (_moduleResult == 1) { + createScene(4, 0); + } else if (_moduleResult == 2) { + createScene(1, -1); + } else if (_moduleResult == 3) { + createScene(3, 0); + } break; case 1: - createScene1802(-1); + if (_navigationAreaType == 3) { + createScene(7, -1); + } else { + createScene(2, -1); + } break; case 2: - createScene1803(-1); + createScene(0, 2); break; - default: case 3: - createScene1804(-1); + if (_moduleResult == 0) { + createScene(9, -1); + } else if (_moduleResult == 1) { + createScene(0, 1); + } break; case 4: - createScene1805(-1); + if (_moduleResult == 0) { + createScene(6, -1); + } else if (_moduleResult == 1) { + createScene(5, 0); + } else if (_moduleResult == 2) { + createScene(0, 3); + } else if (_moduleResult == 3) { + createScene(4, 3); + } break; case 5: - createScene1806(-1); + if (_moduleResult == 0) { + sendMessage(_parentModule, 0x1009, 2); + } else if (_moduleResult == 1) { + createScene(4, 3); + } break; case 6: - createScene1807(-1); + createScene(8, -1); break; case 7: - createScene1808(-1); + sendMessage(_parentModule, 0x1009, 3); break; case 8: - createScene1809(-1); + sendMessage(_parentModule, 0x1009, 1); + // TODO GameState stuff + break; + case 9: + sendMessage(_parentModule, 0x1009, 0); break; - } - } else if (which == 2) { - createScene1806(0); - } else if (which == 3) { - createScene1801(0); - } else { - createScene1804(1); - } - -} - -Module1800::~Module1800() { - // TODO Sound1ChList_sub_407A50(0x04A14718); -} - -void Module1800::createScene1801(int which) { - static const byte kNavigationTypes[] = {1, 0, 2, 0}; - _vm->gameState().sceneNum = 0; - createNavigationScene(0x004AFD38, which, kNavigationTypes); - SetUpdateHandler(&Module1800::updateScene1801); -} - -void Module1800::createScene1802(int which) { - static const byte kNavigationTypes[] = {5}; - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004AFD98, which, kNavigationTypes); - SetUpdateHandler(&Module1800::updateScene1802); -} - -void Module1800::createScene1803(int which) { - _vm->gameState().sceneNum = 2; - createSmackerScene(0x006C0085, true, true, false); - SetUpdateHandler(&Module1800::updateScene1803); -} - -void Module1800::createScene1804(int which) { - _vm->gameState().sceneNum = 3; - createNavigationScene(0x004AFDB0, which); - SetUpdateHandler(&Module1800::updateScene1804); -} - -void Module1800::createScene1804b(int which) { - _vm->gameState().sceneNum = 3; - createSmackerScene(0x0A840C01, true, true, false); - SetUpdateHandler(&Module1800::updateScene1803); -} - -void Module1800::createScene1805(int which) { - _vm->gameState().sceneNum = 4; - createNavigationScene(0x004AFDE0, which); - SetUpdateHandler(&Module1800::updateScene1805); -} - -void Module1800::createScene1806(int which) { - _vm->gameState().sceneNum = 5; - createNavigationScene(0x004AFE40, which); - SetUpdateHandler(&Module1800::updateScene1806); -} - -void Module1800::createScene1807(int which) { - _vm->gameState().sceneNum = 6; - createSmackerScene(0x08D84010, true, true, false); - SetUpdateHandler(&Module1800::updateScene1803); - // TODO Sound1ChList_sub_407A50(0x04A14718); -} - -void Module1800::createScene1808(int which) { - _vm->gameState().sceneNum = 7; - // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0); - createSmackerScene(0x0168B121, true, true, false); - SetUpdateHandler(&Module1800::updateScene1803); -} - -void Module1800::createScene1809(int which) { -#if 0 // TODO - _vm->gameState().sceneNum = 8; - _childObject = new CreditsScene(_vm, this, 0); - SetUpdateHandler(&Module1800::updateScene1809); -#endif -} - -void Module1800::updateScene1801() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene1805(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene1802(-1); - _childObject->handleUpdate(); - } else if (_moduleResult == 3) { - createScene1804(0); - _childObject->handleUpdate(); } } else { + switch (_vm->gameState().sceneNum) { + case 0: #if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (navigationScene->soundFlag1 && navigationScene->index == 2) { - // TODO Sound1ChList_sub_4080B0(false); - } + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (navigationScene->soundFlag1 && navigationScene->index == 2) { + // TODO Sound1ChList_sub_4080B0(false); + } #endif - } -} - -void Module1800::updateScene1802() { - _childObject->handleUpdate(); - if (_done) { - int areaType = navigationScene()->getNavigationAreaType(); - _done = false; - delete _childObject; - _childObject = NULL; - if (areaType == 3) { - createScene1808(-1); - } else { - createScene1803(-1); - } - _childObject->handleUpdate(); - } -} - -void Module1800::updateScene1803() { - if (!updateChild()) { - if (_moduleResult == 2) { - createScene1801(2); - _childObject->handleUpdate(); - } else if (_moduleResult == 3) { - sendMessage(_parentModule, 0x1009, 0); - } else if (_moduleResult == 6) { - createScene1809(-1); - _childObject->handleUpdate(); - } else if (_moduleResult == 7) { - sendMessage(_parentModule, 0x1009, 3); - } - } -} - -void Module1800::updateScene1804() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1804b(-1); - } else if (_moduleResult == 1) { - createScene1801(1); - } - _childObject->handleUpdate(); - } -} - -void Module1800::updateScene1805() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene1807(-1); - } else if (_moduleResult == 1) { - createScene1806(0); - } else if (_moduleResult == 2) { - createScene1801(3); - } else if (_moduleResult == 3) { - createScene1805(3); - } - _childObject->handleUpdate(); - } -} - -void Module1800::updateScene1806() { - if (!updateChild()) { - if (_moduleResult == 0) { - sendMessage(_parentModule, 0x1009, 2); - } else if (_moduleResult == 1) { - createScene1805(3); - _childObject->handleUpdate(); + break; } } } - -void Module1800::updateScene1809() { - if (!updateChild()) { - sendMessage(_parentModule, 0x1009, 1); - // TODO GameState stuff - } -} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h index 13d4790a8c..8ec8dfecea 100644 --- a/engines/neverhood/module1800.h +++ b/engines/neverhood/module1800.h @@ -36,26 +36,8 @@ public: Module1800(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1800(); protected: - // TODO ResourceTable _resourceTable; - void createScene1801(int which); - void createScene1802(int which); - void createScene1803(int which); - void createScene1804(int which); - void createScene1804b(int which); - void createScene1805(int which); - void createScene1806(int which); - void createScene1807(int which); - void createScene1808(int which); - void createScene1809(int which); - void updateScene1801(); - void updateScene1802(); - void updateScene1803(); - void updateScene1804(); - void updateScene1805(); - void updateScene1806(); - void updateScene1807(); - void updateScene1808(); - void updateScene1809(); + void createScene(int sceneNum, int which); + void updateScene(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index cf7256bce8..a30bb93541 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -29,24 +29,12 @@ namespace Neverhood { Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - debug("Create Module2000(%d)", which); - if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 0: - createScene2001(-1); - break; - case 2: - createScene2003(-1); - break; - default: - createScene2002(-1); - break; - } + createScene(_vm->gameState().sceneNum, -1); } else if (which == 0) { - createScene2001(3); + createScene(0, 3); } else if (which == 1) { - createScene2001(1); + createScene(0, 1); } } @@ -55,65 +43,56 @@ Module2000::~Module2000() { // TODO Sound1ChList_sub_407A50(0x81293110); } -void Module2000::createScene2001(int which) { - _vm->gameState().sceneNum = 0; - _childObject = new Scene2001(_vm, this, which); - SetUpdateHandler(&Module2000::updateScene2001); - _childObject->handleUpdate(); -} - -void Module2000::createScene2002(int which) { - _vm->gameState().sceneNum = 1; - if (getGlobalVar(0x98109F12)) { - createNavigationScene(0x004B7B48, which); - } else { - createNavigationScene(0x004B7B00, which); +void Module2000::createScene(int sceneNum, int which) { + debug("Module2000::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _childObject = new Scene2001(_vm, this, which); + break; + case 1: + createNavigationScene(getGlobalVar(0x98109F12) ? 0x004B7B48 : 0x004B7B00, which); + break; + case 2: + setGlobalVar(0x98109F12, 1); + setSubVar(0x2C145A98, 1, 1); + createSmackerScene(0x204B2031, true, true, false); + break; } - SetUpdateHandler(&Module2000::updateScene2002); + SetUpdateHandler(&Module2000::updateScene); _childObject->handleUpdate(); } -void Module2000::createScene2003(int which) { - _vm->gameState().sceneNum = 2; - setGlobalVar(0x98109F12, 1); - setSubVar(0x2C145A98, 1, 1); - createSmackerScene(0x204B2031, true, true, false); - SetUpdateHandler(&Module2000::updateScene2003); - _childObject->handleUpdate(); -} - -void Module2000::updateScene2001() { - if (!updateChild()) { - if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 0); - } else { - createScene2002(0); - } - } -} - -void Module2000::updateScene2002() { +void Module2000::updateScene() { if (!updateChild()) { - if (_moduleResult == 0) { - if (getGlobalVar(0x98109F12)) { - createScene2002(0); + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + sendMessage(_parentModule, 0x1009, 0); } else { - createScene2003(-1); + createScene(1, 0); + } + break; + case 1: + if (_moduleResult == 0) { + if (getGlobalVar(0x98109F12)) { + createScene(1, 0); + } else { + createScene(2, -1); + } + } else if (_moduleResult == 1) { + createScene(1, 1); + } else if (_moduleResult == 2) { + createScene(0, 0); } - } else if (_moduleResult == 1) { - createScene2002(1); - } else if (_moduleResult == 2) { - createScene2001(0); + break; + case 2: + createScene(1, 0); + break; } } } -void Module2000::updateScene2003() { - if (!updateChild()) { - createScene2002(0); - } -} - // Scene2001 Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h index 23ac8a8e9f..8e741b357e 100644 --- a/engines/neverhood/module2000.h +++ b/engines/neverhood/module2000.h @@ -36,12 +36,8 @@ public: virtual ~Module2000(); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene2001(int which); - void createScene2002(int which); - void createScene2003(int which); - void updateScene2001(); - void updateScene2002(); - void updateScene2003(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene2001 diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index ce9250a9b6..dd4144f74f 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -27,8 +27,6 @@ namespace Neverhood { Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _volume(0) { - debug("Create Module2300(%d)", which); - // TODO Sound1ChList_addSoundResources(0x1A214010, dword_4B6938, true); // TODO Sound1ChList_setSoundValuesMulti(dword_4B6938, true, 50, 600, 10, 10, 150); @@ -45,33 +43,17 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Sound1ChList_sub_407C70(0x1A214010, 0x41861371, 0x43A2507F, 0); if (which < 0) { - switch (_vm->gameState().sceneNum) { - case 0: - createScene2301(-1); - break; - case 1: - createScene2302(-1); - break; - case 2: - createScene2303(-1); - break; - case 3: - createScene2304(-1); - break; - case 4: - createScene2305(-1); - break; - } + createScene(_vm->gameState().sceneNum, -1); } else if (which == 1) { - createScene2303(0); + createScene(2, 0); } else if (which == 2) { - createScene2304(0); + createScene(3, 0); } else if (which == 3) { - createScene2305(-1); + createScene(4, -1); } else if (which == 4) { - createScene2302(3); + createScene(1, 3); } else { - createScene2301(1); + createScene(0, 1); } } @@ -80,136 +62,119 @@ Module2300::~Module2300() { // TODO Sound1ChList_sub_407A50(0x1A214010); } -void Module2300::createScene2301(int which) { - _vm->gameState().sceneNum = 0; - createNavigationScene(0x004B67B8, which); - SetUpdateHandler(&Module2300::updateScene2301); -} - -void Module2300::createScene2302(int which) { - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004B67E8, which); - SetUpdateHandler(&Module2300::updateScene2302); - if (_flag) { - _volume = 15; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 15); - } -} - -void Module2300::createScene2303(int which) { - _vm->gameState().sceneNum = 2; - createNavigationScene(0x004B6878, which); - SetUpdateHandler(&Module2300::updateScene2303); -} - -void Module2300::createScene2304(int which) { - _vm->gameState().sceneNum = 3; - if (getGlobalVar(0x10938830)) { - createNavigationScene(0x004B68F0, which); - } else { - // TODO Sound1ChList_setVolume(0x90F0D1C3, _volume); - createNavigationScene(0x004B68A8, which); +void Module2300::createScene(int sceneNum, int which) { + debug("Module2300::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + createNavigationScene(0x004B67B8, which); + break; + case 1: + createNavigationScene(0x004B67E8, which); if (_flag) { - _volume = 87; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 87); + _volume = 15; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 15); } - } - SetUpdateHandler(&Module2300::updateScene2304); -} - -void Module2300::createScene2305(int which) { - _vm->gameState().sceneNum = 4; - // TODO Sound1ChList_sub_4080B0(true); - createSmackerScene(0x20080A0B, true, true, false); - SetUpdateHandler(&Module2300::updateScene2305); -} - -void Module2300::updateScene2301() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene2302(4); - _childObject->handleUpdate(); + break; + case 2: + createNavigationScene(0x004B6878, which); + break; + case 3: + if (getGlobalVar(0x10938830)) { + createNavigationScene(0x004B68F0, which); } else { - sendMessage(_parentModule, 0x1009, 0); + // TODO Sound1ChList_setVolume(0x90F0D1C3, _volume); + createNavigationScene(0x004B68A8, which); + if (_flag) { + _volume = 87; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 87); + } } + break; + case 4: + // TODO Sound1ChList_sub_4080B0(true); + createSmackerScene(0x20080A0B, true, true, false); + break; } + SetUpdateHandler(&Module2300::updateScene); + _childObject->handleUpdate(); } -void Module2300::updateScene2302() { +void Module2300::updateScene() { if (!updateChild()) { - if (_moduleResult == 1) { - createScene2301(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene2303(1); - _childObject->handleUpdate(); - } else if (_moduleResult == 3) { - createScene2302(3); - _childObject->handleUpdate(); - } else if (_moduleResult == 4) { - createScene2304(1); - _childObject->handleUpdate(); - } else if (_moduleResult == 5) { - sendMessage(_parentModule, 0x1009, 3); - } else { - sendMessage(_parentModule, 0x1009, 4); + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + createScene(1, 4); + } else { + sendMessage(_parentModule, 0x1009, 0); + } + break; + case 1: + if (_moduleResult == 1) { + createScene(0, 0); + } else if (_moduleResult == 2) { + createScene(2, 1); + } else if (_moduleResult == 3) { + createScene(1, 3); + } else if (_moduleResult == 4) { + createScene(3, 1); + } else if (_moduleResult == 5) { + sendMessage(_parentModule, 0x1009, 3); + } else { + sendMessage(_parentModule, 0x1009, 4); + } + break; + case 2: + if (_moduleResult == 1) { + sendMessage(_parentModule, 0x1009, 3); + } else { + createScene(1, 5); + } + break; + case 3: + if (_moduleResult == 1) { + sendMessage(_parentModule, 0x1009, 2); + } else { + createScene(1, 1); + } + break; + case 4: + // TODO Sound1ChList_sub_4080B0(false); + createScene(1, 2); + break; } } else { + switch (_vm->gameState().sceneNum) { + case 1: #if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && - navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { - _volume++; - Sound1ChList_setVolume(0x90F0D1C3, _volume); - } + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && + navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { + _volume++; + Sound1ChList_setVolume(0x90F0D1C3, _volume); + } #endif #if 0 // TODO - if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && - navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { - Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64); - Sound1ChList_setVolume(0x48498E46, 70); - Sound1ChList_setVolume(0x50399F64, 70); - } + if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && + navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { + Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64); + Sound1ChList_setVolume(0x48498E46, 70); + Sound1ChList_setVolume(0x50399F64, 70); + } #endif - } -} - -void Module2300::updateScene2303() { - if (!updateChild()) { - if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 3); - } else { - createScene2302(5); - _childObject->handleUpdate(); - } - } -} - -void Module2300::updateScene2304() { - if (!updateChild()) { - if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 2); - } else { - createScene2302(1); - _childObject->handleUpdate(); - } - } else { + break; + case 3: #if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && - navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { - _volume--; - Sound1ChList_setVolume(0x90F0D1C3, _volume); - } + NavigationScene *navigationScene = (NavigationScene*)_childObject; + if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && + navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { + _volume--; + Sound1ChList_setVolume(0x90F0D1C3, _volume); + } #endif - } -} - -void Module2300::updateScene2305() { - if (!updateChild()) { - // TODO Sound1ChList_sub_4080B0(false); - createScene2302(2); - _childObject->handleUpdate(); + break; + } } } diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h index 9f705db6d5..722255978c 100644 --- a/engines/neverhood/module2300.h +++ b/engines/neverhood/module2300.h @@ -36,20 +36,10 @@ public: Module2300(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2300(); protected: - // TODO ResourceTable _resourceTable1; - // TODO ResourceTable _resourceTable2; bool _flag; int _volume; - void createScene2301(int which); - void createScene2302(int which); - void createScene2303(int which); - void createScene2304(int which); - void createScene2305(int which); - void updateScene2301(); - void updateScene2302(); - void updateScene2303(); - void updateScene2304(); - void updateScene2305(); + void createScene(int sceneNum, int which); + void updateScene(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index c28d0eb478..219f595593 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -29,8 +29,6 @@ namespace Neverhood { Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundVolume(0) { - debug("Create Module3000(%d)", which); - // TODO Sound1ChList_addSoundResources(0x81293110, dword_4B7FC8, true); // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 1, 50, 600, 5, 150); // TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 20000, 30000, 20000, 30000); @@ -46,53 +44,15 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) } if (which < 0) { - switch (_vm->gameState().sceneNum) { - default: - case 1: - createScene3002(-1); - break; - case 2: - createScene3003(-1); - break; - case 3: - createScene3004(-1); - break; - case 4: - createScene3005(-1); - break; - case 5: - createScene3006(-1); - break; - case 6: - createScene3007(-1); - break; - case 7: - createScene3008(-1); - break; - case 8: - createScene3009(-1); - break; - case 9: - createScene3010(-1); - break; - case 10: - createScene3011(-1); - break; - case 11: - createScene3012(-1); - break; - case 12: - createScene3013(-1); - break; - } + createScene(_vm->gameState().sceneNum, -1); } else if (which == 0) { - createScene3002(0); + createScene(1, 0); } else if (which == 1) { - createScene3005(2); + createScene(4, 2); } else if (which == 2) { - createScene3005(1); + createScene(4, 1); } else if (which == 3) { - createScene3006(1); + createScene(5, 1); } } @@ -101,384 +61,296 @@ Module3000::~Module3000() { // TODO Sound1ChList_sub_407A50(0x81293110); } -void Module3000::createScene3002(int which) { - _vm->gameState().sceneNum = 1; - if (!getGlobalVar(0x01BA1A52)) { - createNavigationScene(0x004B7C80, which); - } else if (getGlobalVar(0x10938830)) { - createNavigationScene(0x004B7CE0, which); - } else { - createNavigationScene(0x004B7CB0, which); - } - SetUpdateHandler(&Module3000::updateScene3002); -} - -void Module3000::createScene3002b(int which) { - _vm->gameState().sceneNum = 1; - if (!getGlobalVar(0x01BA1A52)) { - if (getGlobalVar(0x10938830)) { - createSmackerScene(0x00940021, true, true, false); +void Module3000::createScene(int sceneNum, int which) { + static const byte kNavigationTypes05[] = {3, 0}; + static const byte kNavigationTypes06[] = {5}; + debug("Module3000::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 1: + if (!getGlobalVar(0x01BA1A52)) { + createNavigationScene(0x004B7C80, which); + } else if (getGlobalVar(0x10938830)) { + createNavigationScene(0x004B7CE0, which); } else { - createSmackerScene(0x01140021, true, true, false); + createNavigationScene(0x004B7CB0, which); + } + break; + case 2: + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + if (_flag) { + _soundVolume = 90; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 90); } - } else { if (getGlobalVar(0x10938830)) { - createSmackerScene(0x001011B1, true, true, false); + createNavigationScene(0x004B7D58, which); } else { - createSmackerScene(0x001021B1, true, true, false); + createNavigationScene(0x004B7D10, which); } + break; + case 3: + if (getGlobalVar(0x09221A62)) + createNavigationScene(0x004B7E60, which); + else if (getGlobalVar(0x10938830)) + createNavigationScene(0x004B7DA0, which); + else + createNavigationScene(0x004B7E00, which); + break; + case 4: + if (getGlobalVar(0x09221A62)) + createNavigationScene(0x004B7F20, which); + else + createNavigationScene(0x004B7EC0, which); + break; + case 5: + createNavigationScene(0x004B7F80, which, kNavigationTypes05); + break; + case 6: + createNavigationScene(0x004B7FB0, which, kNavigationTypes06); + break; + case 7: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); + if (!getSubVar(0x40050052, 0x089809C2)) { + setSubVar(0x40050052, 0x089809C2, 1); + createSmackerScene(0x90022001, true, true, false); + } else + createSmackerScene(0x98022001, true, true, false); + break; + case 8: + _childObject = new Scene3009(_vm, this, which); + break; + case 9: + _childObject = new Scene3010(_vm, this, 0); + break; + case 10: + _childObject = new Scene3011(_vm, this, 0); + break; + case 11: + // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); + if (!getSubVar(0x40050052, 0x10130993)) { + setSubVar(0x40050052, 0x10130993, 1); + createSmackerScene(0x31093019, true, true, false); + } else + createSmackerScene(0x20093019, true, true, false); + break; + case 12: + _childObject = new Scene3010(_vm, this, 1); + break; + // NOTE: Newly introduced sceneNums + case 1001: + if (!getGlobalVar(0x01BA1A52)) + if (getGlobalVar(0x10938830)) + createSmackerScene(0x00940021, true, true, false); + else + createSmackerScene(0x01140021, true, true, false); + else + if (getGlobalVar(0x10938830)) + createSmackerScene(0x001011B1, true, true, false); + else + createSmackerScene(0x001021B1, true, true, false); + setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1); + break; + case 1006: + createSmackerScene(0x080810C5, true, true, false); + break; + case 1008: + createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false); + break; } - SetUpdateHandler(&Module3000::updateScene3002b); - setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1); -} - -void Module3000::createScene3003(int which) { - _vm->gameState().sceneNum = 2; - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); - if (_flag) { - _soundVolume = 90; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 90); - } - if (getGlobalVar(0x10938830)) { - createNavigationScene(0x004B7D58, which); - } else { - createNavigationScene(0x004B7D10, which); - } - SetUpdateHandler(&Module3000::updateScene3003); -} - -void Module3000::createScene3004(int which) { - _vm->gameState().sceneNum = 3; - if (getGlobalVar(0x09221A62)) { - createNavigationScene(0x004B7E60, which); - } else if (getGlobalVar(0x10938830)) { - createNavigationScene(0x004B7DA0, which); - } else { - createNavigationScene(0x004B7E00, which); - } - SetUpdateHandler(&Module3000::updateScene3004); -} - -void Module3000::createScene3005(int which) { - _vm->gameState().sceneNum = 4; - if (getGlobalVar(0x09221A62)) { - createNavigationScene(0x004B7F20, which); - } else { - createNavigationScene(0x004B7EC0, which); - } - SetUpdateHandler(&Module3000::updateScene3005); -} - -void Module3000::createScene3006(int which) { - static const byte kNavigationTypes[] = {3, 0}; - _vm->gameState().sceneNum = 5; - createNavigationScene(0x004B7F80, which, kNavigationTypes); - SetUpdateHandler(&Module3000::updateScene3006); -} - -void Module3000::createScene3007(int which) { - static const byte kNavigationTypes[] = {5}; - _vm->gameState().sceneNum = 6; - createNavigationScene(0x004B7FB0, which, kNavigationTypes); - SetUpdateHandler(&Module3000::updateScene3007); -} - -void Module3000::createScene3008(int which) { - _vm->gameState().sceneNum = 7; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); - if (!getSubVar(0x40050052, 0x089809C2)) { - setSubVar(0x40050052, 0x089809C2, 1); - createSmackerScene(0x90022001, true, true, false); - } else { - createSmackerScene(0x98022001, true, true, false); - } - SetUpdateHandler(&Module3000::updateScene3002b); -} - -void Module3000::createScene3009(int which) { - _vm->gameState().sceneNum = 8; - _childObject = new Scene3009(_vm, this, which); - SetUpdateHandler(&Module3000::updateScene3009); -} - -void Module3000::createScene3010(int which) { - _vm->gameState().sceneNum = 9; - _childObject = new Scene3010(_vm, this, 0); - SetUpdateHandler(&Module3000::updateScene3010); -} - -void Module3000::createScene3011(int which) { - _vm->gameState().sceneNum = 10; - _childObject = new Scene3011(_vm, this, 0); - SetUpdateHandler(&Module3000::updateScene3011); -} - -void Module3000::createScene3012(int which) { - _vm->gameState().sceneNum = 11; - // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); - if (!getSubVar(0x40050052, 0x10130993)) { - setSubVar(0x40050052, 0x10130993, 1); - createSmackerScene(0x31093019, true, true, false); - } else { - createSmackerScene(0x20093019, true, true, false); - } - SetUpdateHandler(&Module3000::updateScene3002b); -} - -void Module3000::createScene3013(int which) { - _vm->gameState().sceneNum = 12; - _childObject = new Scene3010(_vm, this, 1); - SetUpdateHandler(&Module3000::updateScene3002b); -} - -void Module3000::updateScene3002() { + SetUpdateHandler(&Module3000::updateScene); _childObject->handleUpdate(); -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); - if (navigationIndex == 1) { - if (frameNumber == 0) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); - } else if (frameNumber == 100) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); - } - } else if (navigationIndex == 0) { - if (frameNumber == 0) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); - } else if (frameNumber == 10) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); - } - if (_flag && _soundVolume < 90 && frameNumber % 2) { - if (frameNumber == 0) - _soundVolume = 40; - else - _soundVolume++; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); - } - } - } -#endif - if (_done) { - int areaType = navigationScene()->getNavigationAreaType(); - _done = false; - delete _childObject; - _childObject = NULL; - if (!getGlobalVar(0x01BA1A52)) { - if (_moduleResult == 0) { - createScene3010(-1); - _childObject->handleUpdate(); - } else if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 0); - } - } else { - if (_moduleResult == 0) { - if (areaType == 2) { - createScene3003(0); - _childObject->handleUpdate(); - } else { - //createScene3002b(-1); - _childObject->handleUpdate(); - } - } else if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 0); - } - } - } } -void Module3000::updateScene3002b() { +void Module3000::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 1: - if (getGlobalVar(0x01BA1A52)) { - createScene3002(0); - _childObject->handleUpdate(); + if (!getGlobalVar(0x01BA1A52)) { + if (_moduleResult == 0) + createScene(9, -1); + else if (_moduleResult == 1) + sendMessage(_parentModule, 0x1009, 0); } else { - createScene3013(-1); - _childObject->handleUpdate(); + if (_moduleResult == 0) + if (_navigationAreaType == 2) + createScene(2, 0); + else + createScene(1001, -1); + else if (_moduleResult == 1) + sendMessage(_parentModule, 0x1009, 0); } break; + case 2: + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + if (_flag) { + _soundVolume = 0; + // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); + } + if (_moduleResult == 0) { + createScene(3, 0); + } else if (_moduleResult == 1) { + setGlobalVar(0x01BA1A52, 0); + createScene(1, 1); + } + break; + case 3: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 3) + createScene(10, -1); + else if (getGlobalVar(0x09221A62)) + createScene(5, 0); + else + createScene(2, 1); + break; + case 4: + if (_moduleResult == 0) + sendMessage(_parentModule, 0x1009, 1); + else if (_moduleResult == 1) + createScene(7, -1); + else if (_moduleResult == 2) + createScene(3, 3); + break; + case 5: + if (_moduleResult == 0) + createScene(6, 0); + else if (_moduleResult == 1) + createScene(3, 0); + break; + case 6: + if (_navigationAreaType == 4) + createScene(11, -1); + else + createScene(1006, -1); + break; case 7: + createScene(8, -1); + break; case 8: - createScene3009(-1); + _flag = getGlobalVar(0x10938830); // CHECKME + if (_moduleResult != 1) { + // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0): + createScene(4, 1); + } else if (getGlobalVar(0xF0402B0A)) { + createScene(1008, -1); + } else { + // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0); + createScene(4, 1); + } + break; + case 9: + if (_moduleResult == 0 || _moduleResult == 2) + createScene(1, 0); + else if (_moduleResult == 1) + createScene(1001, -1); + break; + case 10: + createScene(3, 3); break; case 11: sendMessage(_parentModule, 0x1009, 3); break; case 12: - createScene3002(0); - _childObject->handleUpdate(); + createScene(1, 0); break; - default: - createScene3006(0); + case 1001: + if (getGlobalVar(0x01BA1A52)) + createScene(1, 0); + else + createScene(12, -1); + break; + case 1006: + createScene(5, 0); + break; + case 1008: + createScene(8, -1); break; - } - } -} - -void Module3000::updateScene3003() { - if (!updateChild()) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); - if (_flag) { - _soundVolume = 0; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); - } - if (_moduleResult == 0) { - createScene3004(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 1) { - setGlobalVar(0x01BA1A52, 0); - createScene3002(1); - _childObject->handleUpdate(); } } else { + switch (_vm->gameState().sceneNum) { + case 1: #if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); - if (_flag && _soundVolume > 1 && frameNumber % 2) { - _soundVolume--; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (navigationIndex == 1) { + if (frameNumber == 0) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } else if (frameNumber == 100) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 0) { + if (frameNumber == 0) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } else if (frameNumber == 10) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + } + } } - if (navigationIndex == 0) { - if (frameNumber == 35) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); +#endif + break; + case 2: +#if 0 // ALL TODO + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (_flag && _soundVolume > 1 && frameNumber % 2) { + _soundVolume--; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); } - } else if (navigationIndex == 1) { - if (frameNumber == 55) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); + if (navigationIndex == 0) { + if (frameNumber == 35) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 1) { + if (frameNumber == 55) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO Sound1ChList_setVolume(0x48498E46, 70); + // TODO Sound1ChList_setVolume(0x50399F64, 70); + } } } - } #endif - } -} - -void Module3000::updateScene3004() { - if (!updateChild()) { - if (_moduleResult == 1) { - createScene3005(0); - _childObject->handleUpdate(); - } else if (_moduleResult == 3) { - createScene3011(-1); - _childObject->handleUpdate(); - } else if (getGlobalVar(0x09221A62)) { - createScene3006(0); - _childObject->handleUpdate(); - } else { - createScene3003(1); - _childObject->handleUpdate(); - } - } else { + break; + case 3: #if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); - if (navigationIndex == 2) { - if (frameNumber == 40) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); - } - if (_flag && _soundVolume < 90 && frameNumber % 2) { - if (frameNumber == 0) - _soundVolume = 40; - else - _soundVolume++; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + if (navigationScene()->getSoundFlag1()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getIndex(); + if (navigationIndex == 2) { + if (frameNumber == 40) { + // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + } } } - } #endif - } -} - -void Module3000::updateScene3005() { - if (!updateChild()) { - if (_moduleResult == 0) { - sendMessage(_parentModule, 0x1009, 1); - } else if (_moduleResult == 1) { - createScene3008(-1); - _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - createScene3004(3); - _childObject->handleUpdate(); - } - } -} - -void Module3000::updateScene3006() { - if (!updateChild()) { - if (_moduleResult == 0) { - createScene3007(0); - } else if (_moduleResult == 1) { - createScene3004(0); - } - _childObject->handleUpdate(); - } else { + break; + case 5: #if 0 // ALL TODO - if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { - // TODO Sound1ChList_sub_4080B0(false); - } + if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { + // TODO Sound1ChList_sub_4080B0(false); + } #endif - } -} - -void Module3000::updateScene3007() { - _childObject->handleUpdate(); - if (_done) { - int areaType = navigationScene()->getNavigationAreaType(); - _done = false; - delete _childObject; - _childObject = NULL; - if (areaType == 4) { - createScene3012(-1); - _childObject->handleUpdate(); - } else { - createSmackerScene(0x080810C5, true, true, false); - SetUpdateHandler(&Module3000::updateScene3002b); - } - } -} - -void Module3000::updateScene3009() { - if (!updateChild()) { - _flag = getGlobalVar(0x10938830); // CHECKME - if (_moduleResult != 1) { - // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0): - createScene3005(1); - _childObject->handleUpdate(); - } else if (getGlobalVar(0xF0402B0A)) { - createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false); - SetUpdateHandler(&Module3000::updateScene3002b); - } else { - // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0); - createScene3005(1); - _childObject->handleUpdate(); - } - } -} - -void Module3000::updateScene3010() { - if (!updateChild()) { - if (_moduleResult == 0 || _moduleResult == 2) { - createScene3002(0); - } else if (_moduleResult == 1) { - createScene3002b(-1); + break; } - _childObject->handleUpdate(); - } -} - -void Module3000::updateScene3011() { - if (!updateChild()) { - createScene3004(3); - _childObject->handleUpdate(); } } diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 63e5261207..2764c83490 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -37,30 +37,8 @@ public: protected: int _soundVolume; bool _flag; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene3002(int which); - void createScene3002b(int which); - void createScene3003(int which); - void createScene3004(int which); - void createScene3005(int which); - void createScene3006(int which); - void createScene3007(int which); - void createScene3008(int which); - void createScene3009(int which); - void createScene3010(int which); - void createScene3011(int which); - void createScene3012(int which); - void createScene3013(int which); - void updateScene3002(); - void updateScene3002b(); - void updateScene3003(); - void updateScene3004(); - void updateScene3005(); - void updateScene3006(); - void updateScene3007(); - void updateScene3009(); - void updateScene3010(); - void updateScene3011(); + void createScene(int sceneNum, int which); + void updateScene(); }; // Scene3009 diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index ae290631a9..c24bf6ac49 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -81,9 +81,7 @@ void SmackerScene::nextVideo() { setSubVar(0x00800410, smackerFileHash, 1); } if (_fileHashListIndex == 0) { - _smackerPlayer = new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false); - addEntity(_smackerPlayer); - addSurface(_smackerPlayer->getSurface()); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false)); // TODO? Screen.hSmack = _smackerPlayer; } else { _smackerPlayer->open(smackerFileHash, false); -- cgit v1.2.3 From 10ff1590305eff85e97ad84f33a0397b54d1341d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 13:16:41 +0000 Subject: NEVERHOOD: Move createModuleXXX/updateModuleXXX methods There are merged into createModule and updateModule in the GameModule class --- engines/neverhood/gamemodule.cpp | 361 ++++++++++++++++----------------------- engines/neverhood/gamemodule.h | 32 +--- 2 files changed, 146 insertions(+), 247 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e6bd99e990..8cdd98ed32 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -38,31 +38,22 @@ namespace Neverhood { GameModule::GameModule(NeverhoodEngine *vm) - : Module(vm, NULL) { + : Module(vm, NULL), _moduleNum(-1) { // Other initializations moved to actual engine class - // TODO - // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); - SetMessageHandler(&GameModule::handleMessage); - } GameModule::~GameModule() { // TODO Sound1ChList_sub_407AF0(0x2D0031); - delete _childObject; _childObject = NULL; - // TODO: Set palette to black but probably not neccessary - // TODO Sound1ChList_sub_408480(); - // TODO Set debug vars (maybe) - } void GameModule::handleMouseMove(int16 x, int16 y) { @@ -87,6 +78,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) { void GameModule::initScene1307Vars() { + // Exit if it's already initialized if (getSubVar(0x40050052, 0x25400B10)) return; @@ -256,238 +248,171 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM -// createModule1500(0); // Logos and intro video //Real -// createModule1000(-1); -// createModule2300(2); - //createModule1200(-1); - //createModule1800(-1); - //createModule1700(-1); - //createModule1700(1); - //createModule1400(-1); +// createModule(1500, 0); // Logos and intro video //Real #if 0 _vm->gameState().sceneNum = 0; - createModule1200(-1); + createModule(1200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; - createModule1800(-1); + createModule(1800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; - createModule2000(-1); + createModule(2000, -1); #endif #if 0 _vm->gameState().sceneNum = 4; - createModule2200(-1); + createModule(2200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; - createModule1000(-1); + createModule(1000, -1); #endif #if 1 _vm->gameState().sceneNum = 12; - createModule3000(-1); + createModule(3000, -1); #endif } -void GameModule::createModule1000(int which) { - setGlobalVar(0x91080831, 0x03294419); - _childObject = new Module1000(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1000); -} - -void GameModule::updateModule1000() { - if (!updateChild()) { - createModule2300(0); - _childObject->handleUpdate(); - } -} - -void GameModule::createModule1200(int which) { - setGlobalVar(0x91080831, 0x00478311); - _childObject = new Module1200(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1200); -} - -void GameModule::updateModule1200() { - if (!updateChild()) { - if (_moduleResult == 1) { - error("// TODO createModule2600(0);"); - // TODO createModule2600(0); - // TODO _childObject->handleUpdate(); - } else { - createModule2300(2); - _childObject->handleUpdate(); - } - } -} - -void GameModule::createModule1300(int which) { - setGlobalVar(0x91080831, 0x0061C090); - _childObject = new Module1300(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1300); -} - -void GameModule::updateModule1300() { - if (!updateChild()) { - if (_moduleResult == 1) { - // TODO _gameState.clear(); - // TODO GameModule_handleKeyEscape - } else { - // TODO createModule2900(0); - _childObject->handleUpdate(); - } - } -} - -void GameModule::createModule1400(int which) { - setGlobalVar(0x91080831, 0x00AD0012); - _childObject = new Module1400(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1400); -} - -void GameModule::updateModule1400() { - if (!updateChild()) { - if (_moduleResult == 1) { - error("WEIRD!"); - } else { - // TODO createModule1600(1); - // TODO _childObject->handleUpdate(); - } - } -} - -void GameModule::createModule1500(int which) { - _someFlag1 = false; - setGlobalVar(0x91080831, 0x00F10114); - _childObject = new Module1500(_vm, this, which, true); - SetUpdateHandler(&GameModule::updateModule1500); -} - -void GameModule::updateModule1500() { - if (!updateChild()) { - createModule1000(0); - _childObject->handleUpdate(); - } -} - -void GameModule::createModule1700(int which) { - setGlobalVar(0x91080831, 0x04212331); - _childObject = new Module1700(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1700); -} - -void GameModule::updateModule1700() { - if (!updateChild()) { - if (_moduleResult == 1) { - // TODO createModule2900(3); - // TODO _childObject->handleUpdate(); - } else { - // TODO createModule1600(2); - // TODO _childObject->handleUpdate(); - } - } -} - -void GameModule::createModule1800(int which) { - setGlobalVar(0x91080831, 0x04A14718); - _childObject = new Module1800(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule1800); -} - -void GameModule::updateModule1800() { - if (!updateChild()) { - if (_moduleResult == 1) { - // TODO GameState_clear(); - // TODO GameModule_handleKeyEscape(); - } else if (_moduleResult == 2) { - // TODO createModule2700(0); - // TODO _childObject->handleUpdate(); - } else if (_moduleResult == 3) { - createModule3000(3); - _childObject->handleUpdate(); - } else { - // TODO createModule2800(0); - // TODO _childObject->handleUpdate(); - } - } -} - -void GameModule::createModule2000(int which) { - setGlobalVar(0x91080831, 0x08250000); - _childObject = new Module2000(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule2000); -} - -void GameModule::updateModule2000() { - if (!updateChild()) { - // TODO createModule2900(4); - _childObject->handleUpdate(); - } -} - -void GameModule::createModule2200(int which) { - setGlobalVar(0x91080831, 0x11391412); - _childObject = new Module2200(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule2200); -} - -void GameModule::updateModule2200() { - if (!updateChild()) { - createModule2300(1); - _childObject->handleUpdate(); +void GameModule::createModule(int moduleNum, int which) { + debug("GameModule::createModule(%d, %d)", moduleNum, which); + _moduleNum = moduleNum; + switch (_moduleNum) { + case 1000: + setGlobalVar(0x91080831, 0x03294419); + _childObject = new Module1000(_vm, this, which); + break; + case 1200: + setGlobalVar(0x91080831, 0x00478311); + _childObject = new Module1200(_vm, this, which); + break; + case 1300: + setGlobalVar(0x91080831, 0x0061C090); + _childObject = new Module1300(_vm, this, which); + break; + case 1400: + setGlobalVar(0x91080831, 0x00AD0012); + _childObject = new Module1400(_vm, this, which); + break; + case 1500: + _someFlag1 = false; + setGlobalVar(0x91080831, 0x00F10114); + _childObject = new Module1500(_vm, this, which, true); + break; + case 1700: + setGlobalVar(0x91080831, 0x04212331); + _childObject = new Module1700(_vm, this, which); + break; + case 1800: + setGlobalVar(0x91080831, 0x04A14718); + _childObject = new Module1800(_vm, this, which); + break; + case 2000: + setGlobalVar(0x91080831, 0x08250000); + _childObject = new Module2000(_vm, this, which); + break; + case 2200: + setGlobalVar(0x91080831, 0x11391412); + _childObject = new Module2200(_vm, this, which); + break; + case 2300: + setGlobalVar(0x91080831, 0x1A214010); + _childObject = new Module2300(_vm, this, which); + break; + case 3000: + setGlobalVar(0x91080831, 0x81293110); + _childObject = new Module3000(_vm, this, which); + break; + default: + error("GameModule::createModule() Could not create module %d", moduleNum); } + SetUpdateHandler(&GameModule::updateModule); + _childObject->handleUpdate(); } -void GameModule::createModule2300(int which) { - setGlobalVar(0x91080831, 0x1A214010); - _childObject = new Module2300(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule2300); -} - -void GameModule::updateModule2300() { +void GameModule::updateModule() { if (!updateChild()) { - if (_moduleResult == 1) { - createModule2200(0); - } else if (_moduleResult == 2) { - createModule1200(0); - } else if (_moduleResult == 3) { - // TODO createModule2400(0); - } else if (_moduleResult == 4) { - createModule3000(0); - } else { - createModule1000(1); - } - _childObject->handleUpdate(); - } -} - -void GameModule::createModule2400(int which) { - error("createModule2400"); -} - -void GameModule::createModule3000(int which) { - setGlobalVar(0x91080831, 0x81293110); - _childObject = new Module3000(_vm, this, which); - SetUpdateHandler(&GameModule::updateModule3000); -} - -void GameModule::updateModule3000() { - if (!updateChild()) { - if (_moduleResult == 1) { - // TODO createModule1900(0); - // TODO _childObject->handleUpdate(); - } else if (_moduleResult == 2) { - // WEIRD: Sets the errorFlag - } else if (_moduleResult == 3) { - createModule1800(3); - _childObject->handleUpdate(); - } else if (_moduleResult == 4) { - createModule3000(0); - _childObject->handleUpdate(); - } else { - createModule2300(4); - _childObject->handleUpdate(); + switch (_moduleNum) { + case 1000: + createModule(2300, 0); + break; + case 1200: + if (_moduleResult == 1) { + createModule(2600, 0); + } else { + createModule(2300, 2); + } + break; + case 1300: + if (_moduleResult == 1) { + // TODO _gameState.clear(); + // TODO GameModule_handleKeyEscape + } else { + createModule(2900, 0); + } + break; + case 1400: + if (_moduleResult == 1) { + error("WEIRD!"); + } else { + createModule(1600, 1); + } + break; + case 1500: + createModule(1000, 0); + break; + case 1700: + if (_moduleResult == 1) { + createModule(2900, 3); + } else { + createModule(1600, 2); + } + break; + case 1800: + if (_moduleResult == 1) { + // TODO GameState_clear(); + // TODO GameModule_handleKeyEscape(); + } else if (_moduleResult == 2) { + createModule(2700, 0); + } else if (_moduleResult == 3) { + createModule(3000, 3); + } else { + createModule(2800, 0); + } + break; + case 2000: + createModule(2900, 4); + break; + case 2200: + createModule(2300, 1); + break; + case 2300: + if (_moduleResult == 1) { + createModule(2200, 0); + } else if (_moduleResult == 2) { + createModule(1200, 0); + } else if (_moduleResult == 3) { + createModule(2400, 0); + } else if (_moduleResult == 4) { + createModule(3000, 0); + } else { + createModule(1000, 1); + } + break; + case 3000: + if (_moduleResult == 1) { + createModule(1900, 0); + } else if (_moduleResult == 2) { + // WEIRD: Sets the errorFlag + } else if (_moduleResult == 3) { + createModule(1800, 3); + } else if (_moduleResult == 4) { + createModule(3000, 0); + } else { + createModule(2300, 4); + } + break; } } } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 02f16c552b..6da7123125 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -45,36 +45,10 @@ protected: bool _someFlag1; bool _field2C; uint32 _counter; - /* TODO - ResourceTable _resourceTable1; - ResourceTable _resourceTable2; - ResourceTable _resourceTable3; - ResourceTable _resourceTable4; - */ + int _moduleNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createModule1000(int which); - void updateModule1000(); - void createModule1200(int which); - void updateModule1200(); - void createModule1300(int which); - void updateModule1300(); - void createModule1400(int which); - void updateModule1400(); - void createModule1500(int which); - void updateModule1500(); - void createModule1700(int which); - void updateModule1700(); - void createModule1800(int which); - void updateModule1800(); - void createModule2000(int which); - void updateModule2000(); - void createModule2200(int which); - void updateModule2200(); - void createModule2300(int which); - void updateModule2300(); - void createModule2400(int which); - void createModule3000(int which); - void updateModule3000(); + void createModule(int moduleNum, int which); + void updateModule(); }; } // End of namespace Neverhood -- cgit v1.2.3 From fa695229bed037257099e6c082f7e50be1119882 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 14:11:35 +0000 Subject: NEVERHOOD: Add Sprite::setVisible and use it instead of direct access to the surface member --- engines/neverhood/module1000.cpp | 52 ++++++++++++++--------------- engines/neverhood/module1200.cpp | 24 +++++++------- engines/neverhood/module1300.cpp | 70 ++++++++++++++++++++-------------------- engines/neverhood/module1400.cpp | 62 +++++++++++++++++------------------ engines/neverhood/module1700.cpp | 4 +-- engines/neverhood/module2200.cpp | 42 ++++++++++++------------ engines/neverhood/module3000.cpp | 62 +++++++++++++++++------------------ engines/neverhood/sprite.h | 1 + 8 files changed, 159 insertions(+), 158 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 4539b37050..1cc4b43dbb 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -174,7 +174,7 @@ void AsScene1001Door::callback1() { break; case 3: setFileHash1(); - _surface->setVisible(false); + setVisible(false); break; default: setFileHash(0x624C0498, 0, -1); @@ -193,7 +193,7 @@ void AsScene1001Door::callback2() { void AsScene1001Door::callback3() { _soundResource1.play(); setFileHash1(); - _surface->setVisible(false); + setVisible(false); } AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) @@ -255,7 +255,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ case 0x3002: SetMessageHandler(NULL); setGlobalVar(0x03C698DA, 1); - _surface->setVisible(false); + setVisible(false); break; } return 0; @@ -310,14 +310,14 @@ SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentSce _priority = 1100; _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; - _surface->setVisible(false); + setVisible(false); SetUpdateHandler(&SsCommonButtonSprite::update); SetMessageHandler(&SsCommonButtonSprite::handleMessage); } void SsCommonButtonSprite::update() { if (_countdown != 0 && (--_countdown) == 0) { - _surface->setVisible(false); + setVisible(false); } } @@ -326,7 +326,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x480B: sendMessage(_parentScene, 0x480B, 0); - _surface->setVisible(true); + setVisible(true); _countdown = 8; _soundResource.play(_soundFileHash); break; @@ -740,7 +740,7 @@ Class505::Class505(NeverhoodEngine *vm) : AnimatedSprite(vm, 1400) { createSurface(1025, 88, 165); - _surface->setVisible(false); + setVisible(false); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class505::handleMessage); } @@ -752,11 +752,11 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam ¶m, Entity _x = ((Sprite*)sender)->getX() - 98; _y = ((Sprite*)sender)->getY() - 111; setFileHash(0x0422255A, 0, -1); - _surface->setVisible(true); + setVisible(true); break; case 0x3002: setFileHash1(); - _surface->setVisible(false); + setVisible(false); break; } return messageResult; @@ -844,7 +844,7 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _surface->setVisible(false); + setVisible(false); _needRefresh = true; SetUpdateHandler(&Class426::update); @@ -906,7 +906,7 @@ void Class426::update() { _countdown = 4; } else if (_status == 3) { _status = 0; - _surface->setVisible(false); + setVisible(false); } } } @@ -918,7 +918,7 @@ uint32 Class426::handleMessage(int messageNum, const MessageParam ¶m, Entity sendMessage(_parentScene, 0x480B, 0); _status = 1; _countdown = 4; - _surface->setVisible(true); + setVisible(true); _soundResource.play(_soundFileHash); break; } @@ -1195,7 +1195,7 @@ Class506::Class506(NeverhoodEngine *vm) setFileHash(0x004A4495, -1, -1); _newHashListIndex = -2; } else { - _surface->setVisible(false); + setVisible(false); } SetUpdateHandler(&Class506::update); SetMessageHandler(&Class506::handleMessage4491B0); @@ -1241,7 +1241,7 @@ void Class506::sub449250() { setFileHash(0x004A4495, 0, -1); SetMessageHandler(&Class506::handleMessage4491B0); _newHashListIndex = -2; - _surface->setVisible(true); + setVisible(true); } void Class506::sub449280() { @@ -1249,11 +1249,11 @@ void Class506::sub449280() { _playBackwards = true; SetMessageHandler(&Class506::handleMessage449210); SetAnimationCallback3(&Class506::sub4492C0); - _surface->setVisible(true); + setVisible(true); } void Class506::sub4492C0() { - _surface->setVisible(false); + setVisible(false); setFileHash1(); } @@ -1263,26 +1263,26 @@ Class478::Class478(NeverhoodEngine *vm, Klayman *klayman) createSurface(1200, 40, 163); SetUpdateHandler(&Class478::update); SetMessageHandler(&Sprite::handleMessage); - _surface->setVisible(false); + setVisible(false); } void Class478::update() { if (_klayman->getCurrAnimFileHash() == 0x3A292504) { setFileHash(0xBA280522, _frameIndex, -1); _newHashListIndex = _klayman->getFrameIndex(); - _surface->setVisible(true); + setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); } else if (_klayman->getCurrAnimFileHash() == 0x122D1505) { setFileHash(0x1319150C, _frameIndex, -1); _newHashListIndex = _klayman->getFrameIndex(); - _surface->setVisible(true); + setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); } else { - _surface->setVisible(false); + setVisible(false); } AnimatedSprite::update(); } @@ -1294,19 +1294,19 @@ Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman) SetUpdateHandler(&Class479::update); SetMessageHandler(&Class479::handleMessage); createSurface(1000, 33, 41); - _surface->setVisible(false); + setVisible(false); } void Class479::update() { if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) { setFileHash(0x9820C913, _klayman->getFrameIndex(), -1); _newHashListIndex = _klayman->getFrameIndex(); - _surface->setVisible(true); + setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); } else { - _surface->setVisible(false); + setVisible(false); } AnimatedSprite::update(); } @@ -1656,7 +1656,7 @@ AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm) createSurface(800, 56, 50); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1004TrashCan::handleMessage); - _surface->setVisible(false); + setVisible(false); } uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1669,11 +1669,11 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa break; case 0x2002: setFileHash(0xEB312C11, 0, -1); - _surface->setVisible(true); + setVisible(true); break; case 0x3002: setFileHash1(); - _surface->setVisible(false); + setVisible(false); break; } return 0; diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index ff0493713c..9cab544710 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -202,7 +202,7 @@ AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 if (!getSubVar(0x02038314, _nameHash) && !getSubVar(0x02720344, _nameHash)) { SetMessageHandler(&AsScene1201Tape::handleMessage); } else { - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); } } @@ -216,7 +216,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, break; case 0x4806: setSubVar(0x02038314, _nameHash, 1); - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); break; } @@ -283,7 +283,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, _countdown = 25; } else { setFileHash1(); - _surface->setVisible(false); + setVisible(false); } } @@ -310,21 +310,21 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p void AsScene1201RightDoor::sub40D7E0() { setFileHash(0xD088AC30, 0, -1); _newHashListIndex = -2; - _surface->setVisible(true); + setVisible(true); _soundResource.play(calcHash("fxDoorOpen20")); } void AsScene1201RightDoor::sub40D830() { setFileHash(0xD088AC30, -1, -1); _playBackwards = true; - _surface->setVisible(true); + setVisible(true); _soundResource.play(calcHash("fxDoorClose20")); SetAnimationCallback3(&AsScene1201RightDoor::sub40D880); } void AsScene1201RightDoor::sub40D880() { setFileHash1(); - _surface->setVisible(false); + setVisible(false); } Class464::Class464(NeverhoodEngine *vm) @@ -334,7 +334,7 @@ Class464::Class464(NeverhoodEngine *vm) SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class464::handleMessage); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - _surface->setVisible(false); + setVisible(false); } uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -344,11 +344,11 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity _x = 436; _y = 339; setFileHash(0xA060C599, 0, -1); - _surface->setVisible(true); + setVisible(true); break; case 0x3002: setFileHash1(); - _surface->setVisible(false); + setVisible(false); removeCallbacks(); break; } @@ -447,7 +447,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) SetMessageHandler(&Sprite::handleMessage); SetSpriteCallback(&Class465::spriteUpdate40D150); setFileHash(0x828C0411, 0, -1); - _surface->setVisible(false); + setVisible(false); } Class465::~Class465() { @@ -457,7 +457,7 @@ Class465::~Class465() { void Class465::update() { AnimatedSprite::update(); if (getGlobalVar(0x20A0C516)) { - _surface->setVisible(true); + setVisible(true); SetUpdateHandler(&AnimatedSprite::update); // TODO Sound1ChList_addSoundResource(0x041080A4, 0x460A1050, true); // TODO Sound1ChList_playLooping(0x460A1050); @@ -540,7 +540,7 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam messageResult = 1; break; case 0x4806: - _surface->setVisible(false); + setVisible(false); setGlobalVar(0x0112090A, 3); break; } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 518568cdb0..f27952f94c 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -428,7 +428,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _class595 = addSprite(new Class595(_vm, this)); _sprite1 = insertStaticSprite(0x942FC224, 300); _sprite2 = insertStaticSprite(0x70430830, 1200); - _sprite2->getSurface()->setVisible(false); + _sprite2->setVisible(false); _sprite3 = insertStaticSprite(0x16E01E20, 1100); _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false)); @@ -533,7 +533,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2032: - _sprite2->getSurface()->setVisible(true); + _sprite2->setVisible(true); break; case 0x4806: sendMessage(_parentModule, 0x1024, 2); @@ -555,7 +555,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _asRing2) { sendMessage(_asBridge, 0x4809, 0); setGlobalVar(0x13206309, 0); - _sprite2->getSurface()->setVisible(false); + _sprite2->setVisible(false); } else if (sender == _asRing4) { sendMessage(_ssFence, 0x4809, 0); setGlobalVar(0x80101B1E, 0); @@ -627,7 +627,7 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p _soundResource.play(0x470007EE); setFileHash1(); SetMessageHandler(NULL); - _surface->setVisible(false); + setVisible(false); break; } return messageResult; @@ -687,7 +687,7 @@ Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { if (getGlobalVar(0x31C63C51)) { - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); } else { SetMessageHandler(&Class544::handleMessage); @@ -703,7 +703,7 @@ uint32 Class544::handleMessage(int messageNum, const MessageParam ¶m, Entity break; case 0x4806: setGlobalVar(0x31C63C51, 1); - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); break; } @@ -830,14 +830,14 @@ void AsScene1306Elevator::update() { AnimatedSprite::update(); if (_frameIndex == 7) { _soundResource3.play(); - _asElevatorDoor->getSurface()->setVisible(false); + _asElevatorDoor->setVisible(false); } } void AsScene1306Elevator::upGoingDown() { AnimatedSprite::update(); if (_frameIndex == 5) { - _asElevatorDoor->getSurface()->setVisible(true); + _asElevatorDoor->setVisible(true); } } @@ -861,7 +861,7 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa } void AsScene1306Elevator::stGoingUp() { - _surface->setVisible(true); + setVisible(true); _isDown = false; SetUpdateHandler(&AsScene1306Elevator::update); setFileHash(0x043B0270, 0, -1); @@ -875,13 +875,13 @@ void AsScene1306Elevator::cbGoingUpEvent() { _isUp = true; _countdown = 144; setFileHash1(); - _surface->setVisible(false); + setVisible(false); } void AsScene1306Elevator::stGoingDown() { SetUpdateHandler(&AsScene1306Elevator::upGoingDown); _isUp = false; - _surface->setVisible(true); + setVisible(true); setFileHash(0x043B0270, -1, -1); _playBackwards = true; SetAnimationCallback3(&AsScene1306Elevator::cbGoingDownEvent); @@ -1466,7 +1466,7 @@ Class549::Class549(NeverhoodEngine *vm, Scene *parentScene) _parentScene(parentScene) { SetMessageHandler(&Class549::handleMessage); - _surface->setVisible(false); + setVisible(false); setFileHash1(); } @@ -1488,7 +1488,7 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class549::sub455470() { setFileHash(0xBA0AE050, 0, -1); - _surface->setVisible(true); + setVisible(true); SetAnimationCallback3(&Class549::hide); _soundResource.play(calcHash("fxDoorOpen38")); } @@ -1496,13 +1496,13 @@ void Class549::sub455470() { void Class549::hide() { sendMessage(_parentScene, 0x2000, 0); setFileHash1(); - _surface->setVisible(false); + setVisible(false); } void Class549::sub4554F0() { setFileHash(0xBA0AE050, -1, -1); _playBackwards = true; - _surface->setVisible(true); + setVisible(true); SetAnimationCallback3(&Class549::sub455550); _soundResource.play(calcHash("fxDoorClose38")); } @@ -1541,14 +1541,14 @@ void Class592::sub455710() { void Class592::sub455740() { sendMessage(_parentScene, 0x2004, 0); setFileHash1(); - _surface->setVisible(false); + setVisible(false); } Class593::Class593(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) { SetMessageHandler(&Class593::handleMessage); - _surface->setVisible(false); + setVisible(false); setFileHash1(); Entity::_priority = 1200; } @@ -1570,7 +1570,7 @@ uint32 Class593::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class593::sub4558F0() { setFileHash(0x80180A10, 0, -1); - _surface->setVisible(false); + setVisible(false); _newHashListIndex = -2; } @@ -1583,13 +1583,13 @@ void Class593::sub455920() { void Class593::sub455950() { sendMessage(_parentScene, 0x2003, 0); setFileHash1(); - _surface->setVisible(false); + setVisible(false); } Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index) : StaticSprite(vm, fileHash, 100) { - _surface->setVisible(false); + setVisible(false); _x = _spriteResource.getPosition().x + index * 20; StaticSprite::update(); } @@ -1680,7 +1680,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x80455A41)) { _sprite5 = addSprite(new Class592(_vm, this)); _sprite4 = insertStaticSprite(0x0101A624, 1100); - _sprite4->getSurface()->setVisible(false); + _sprite4->setVisible(false); } else { _sprite5 = insertStaticSprite(0x080811A0, 100); setRectList(0x004B5980); @@ -1689,13 +1689,13 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) InsertKlayman(KmScene1308, 41, 440); setMessageList(0x004B57D0); sendMessage(_class549, 0x4808, 0); - _sprite1->getSurface()->setVisible(false); + _sprite1->setVisible(false); if (getGlobalVar(0x80455A41)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); - _klayman->getSurface()->setVisible(false); + _klayman->setVisible(false); } else { _sprite5 = insertStaticSprite(0x080811A0, 100); - _klayman->getSurface()->setVisible(false); + _klayman->setVisible(false); } } @@ -1744,8 +1744,8 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x4AC68808) { clearRectList(); sendMessage(_class549, 0x4809, 0); - _sprite1->getSurface()->setVisible(false); - _klayman->getSurface()->setVisible(false); + _sprite1->setVisible(false); + _klayman->setVisible(false); } break; case 0x1022: @@ -1763,19 +1763,19 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B5980); } setMessageList(0x004B57E8); - _sprite1->getSurface()->setVisible(true); - _klayman->getSurface()->setVisible(true); + _sprite1->setVisible(true); + _klayman->setVisible(true); break; case 0x2001: sendMessage(_parentModule, 0x1009, 0); break; case 0x2003: - _class601_1->getSurface()->setVisible(false); - _class601_2->getSurface()->setVisible(false); - _class601_3->getSurface()->setVisible(false); + _class601_1->setVisible(false); + _class601_2->setVisible(false); + _class601_3->setVisible(false); break; case 0x2004: - _sprite4->getSurface()->setVisible(true); + _sprite4->setVisible(true); setRectList(0x004B5990); break; case 0x4807: @@ -1783,9 +1783,9 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480F: sendMessage(_class593, 0x2002, 0); - _class601_1->getSurface()->setVisible(true); - _class601_2->getSurface()->setVisible(true); - _class601_3->getSurface()->setVisible(true); + _class601_1->setVisible(true); + _class601_2->setVisible(true); + _class601_3->setVisible(true); break; case 0x4826: if (sender == _class489) { diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 32918b1424..f50fb25b79 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -259,7 +259,7 @@ void Class526::spriteUpdate466720() { setFileHash1(); SetSpriteCallback(NULL); SetMessageHandler(NULL); - _surface->setVisible(false); + setVisible(false); } } @@ -297,7 +297,7 @@ void Class527::spriteUpdate466920() { setFileHash1(); SetSpriteCallback(NULL); SetMessageHandler(NULL); - _surface->setVisible(false); + setVisible(false); } } @@ -322,7 +322,7 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) } else { _flag = false; setFileHash1(); - _surface->setVisible(false); + setVisible(false); } } @@ -356,7 +356,7 @@ uint32 Class528::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class528::sub466BF0() { _flag = true; - _surface->setVisible(true); + setVisible(true); setFileHash(0x04551900, 0, -1); _newHashListIndex = -2; _soundResource.play(calcHash("fxDoorOpen24")); @@ -364,7 +364,7 @@ void Class528::sub466BF0() { void Class528::sub466C50() { _flag = false; - _surface->setVisible(true); + setVisible(true); setFileHash(0x04551900, -1, -1); _soundResource.play(calcHash("fxDoorClose24")); _playBackwards = true; @@ -373,7 +373,7 @@ void Class528::sub466C50() { void Class528::sub466CB0() { setFileHash1(); - _surface->setVisible(false); + setVisible(false); } static const Class489Item kClass489Items[] = { @@ -577,7 +577,7 @@ void Class489::sub434D80() { setFileHash1(); SetMessageHandler(&Sprite::handleMessage); SetSpriteCallback(NULL); - _surface->setVisible(false); + setVisible(false); } } @@ -681,24 +681,24 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0)); _sprite1 = insertStaticSprite(0x38EA100C, 1005); _sprite2 = insertStaticSprite(0x98D0223C, 1200); - _sprite2->getSurface()->setVisible(false); + _sprite2->setVisible(false); if (which < 0) { InsertKlayman(KmScene1401, 380, 447); setMessageList(0x004B65C8); - _sprite1->getSurface()->setVisible(false); + _sprite1->setVisible(false); } else if (which == 1) { InsertKlayman(KmScene1401, 0, 447); setMessageList(0x004B65D0); - _sprite1->getSurface()->setVisible(false); + _sprite1->setVisible(false); } else if (which == 2) { InsertKlayman(KmScene1401, 660, 447); setMessageList(0x004B65D8); - _sprite1->getSurface()->setVisible(false); + _sprite1->setVisible(false); } else { InsertKlayman(KmScene1401, 290, 413); setMessageList(0x004B65E8); - _sprite1->getSurface()->setVisible(false); + _sprite1->setVisible(false); } if (getGlobalVar(0x04A105B3) == 2) { @@ -737,10 +737,10 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1401::update() { Scene::update(); if (_class489 && !_flag && _class489->getY() < 360) { - _sprite2->getSurface()->setVisible(true); + _sprite2->setVisible(true); _flag = true; } else { - _sprite2->getSurface()->setVisible(false); + _sprite2->setVisible(false); } } @@ -793,13 +793,13 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x482A: - _sprite1->getSurface()->setVisible(true); + _sprite1->setVisible(true); if (_class489) { sendMessage(_class489, 0x482B, 0); } break; case 0x482B: - _sprite1->getSurface()->setVisible(false); + _sprite1->setVisible(false); if (_class489) { sendMessage(_class489, 0x482A, 0); } @@ -863,13 +863,13 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class482::sub428500() { sendMessage(_parentScene, 0x2000, 0); setFileHash1(); - _surface->setVisible(false); + setVisible(false); } void Class482::sub428530() { sendMessage(_parentScene, 0x2001, 0); setFileHash1(); - _surface->setVisible(false); + setVisible(false); } void Class482::sub428560() { @@ -994,7 +994,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_parentModule, 0x1009, 0); } else { clearRectList(); - _klayman->getSurface()->setVisible(false); + _klayman->setVisible(false); showMouse(false); sendMessage(_class482, 0x2002, 0); sub428220(); @@ -1258,7 +1258,7 @@ void AsScene1407Mouse::stGoThroughHole() { SetMessageHandler(NULL); SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); SetAnimationCallback3(&AsScene1407Mouse::stArriveAtHole); - _surface->setVisible(false); + setVisible(false); _countdown = 12; } @@ -1270,11 +1270,11 @@ void AsScene1407Mouse::stArriveAtHole() { sendMessage(_parentScene, 0x2000, 0); _walkDestX = 512; stWalkToDest(); - _surface->setVisible(true); + setVisible(true); } else { _walkDestX = _x + 14; stWalkToDest(); - _surface->setVisible(true); + setVisible(true); } } @@ -1294,7 +1294,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) _asMouse = addSprite(new AsScene1407Mouse(_vm, this)); _ssResetButton = insertStaticSprite(0x12006600, 100); - _ssResetButton->getSurface()->setVisible(false); + _ssResetButton->setVisible(false); } @@ -1303,7 +1303,7 @@ void Scene1407::update() { if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) { sendMessage(_parentModule, 0x1009, 1); } else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) { - _ssResetButton->getSurface()->setVisible(false); + _ssResetButton->setVisible(false); } } @@ -1320,7 +1320,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit param.asPoint().y >= 62 && param.asPoint().y <= 90) { // The reset button was clicked sendMessage(_asMouse, 0x2001, 0); - _ssResetButton->getSurface()->setVisible(true); + _ssResetButton->setVisible(true); _soundResource.play(0x44045000); _resetButtonCountdown = 12; } else { @@ -1359,7 +1359,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x0A230219); _class401_1 = insertStaticSprite(0x01102A33, 100); - _class401_1->getSurface()->setVisible(false); + _class401_1->setVisible(false); _class401_2 = insertStaticSprite(0x04442520, 995); @@ -1431,10 +1431,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4807: - _class401_1->getSurface()->setVisible(false); + _class401_1->setVisible(false); break; case 0x480F: - _class401_1->getSurface()->setVisible(true); + _class401_1->setVisible(true); break; case 0x4826: if (sender == _class489) { @@ -1634,7 +1634,7 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui _x = kAsScene1405TileItemPositions[_index].x; _y = kAsScene1405TileItemPositions[_index].y; createSurface1(0x844B805C, 1100); - _surface->setVisible(false); + setVisible(false); if (getSubVar(0xCCE0280F, _index)) _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; SetUpdateHandler(&AsScene1405Tile::update); @@ -1672,7 +1672,7 @@ void AsScene1405Tile::show() { if (!_flag) { _flag = true; _soundResource.play(); - _surface->setVisible(true); + setVisible(true); } } @@ -1680,7 +1680,7 @@ void AsScene1405Tile::hide() { if (_flag) { _flag = false; _soundResource.play(); - _surface->setVisible(false); + setVisible(false); } } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 9188dab2b0..58fc83511c 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -144,7 +144,7 @@ Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfa if (!getSubVar(0x02038314, _index) && !getSubVar(0x02720344, _index)) { SetMessageHandler(&Class606::handleMessage); } else { - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); } _deltaRect = _drawRect; @@ -164,7 +164,7 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam ¶m, Entity break; case 0x4806: setSubVar(0x02038314, _index, 1); - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); break; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 3bc3797152..1f118a4d1f 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -650,7 +650,7 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite * } else { setFileHash(0xE2CB0412, 0, -1); _newHashListIndex = 0; - _doorLightSprite->getSurface()->setVisible(false); + _doorLightSprite->setVisible(false); } } @@ -667,10 +667,10 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, case 0x100D: if (param.asInteger() == 0x11001090) { if (_doorOpen) - _doorLightSprite->getSurface()->setVisible(true); + _doorLightSprite->setVisible(true); } else if (param.asInteger() == 0x11283090) { if (!_doorOpen) - _doorLightSprite->getSurface()->setVisible(false); + _doorLightSprite->setVisible(false); } break; case 0x2000: @@ -1254,7 +1254,7 @@ Class545::Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfa if (!getSubVar(0x0090EA95, _index) && !getSubVar(0x08D0AB11, _index)) { SetMessageHandler(&Class545::handleMessage); } else { - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); } } @@ -1268,7 +1268,7 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam ¶m, Entity break; case 0x4806: setSubVar(0x0090EA95, _index, 1); - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); } return messageResult; @@ -1405,10 +1405,10 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x9A500914)) { - _ssSmallLeftDoor->getSurface()->setVisible(false); + _ssSmallLeftDoor->setVisible(false); _klayman->getSurface()->getClipRect() = _rightDoorClipRect; } else { - _ssSmallRightDoor->getSurface()->setVisible(false); + _ssSmallRightDoor->setVisible(false); _klayman->getSurface()->getClipRect() = _leftDoorClipRect; } @@ -1440,17 +1440,17 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2003: if (sender == _asLeftDoor) { - _ssSmallLeftDoor->getSurface()->setVisible(false); + _ssSmallLeftDoor->setVisible(false); } else { - _ssSmallRightDoor->getSurface()->setVisible(false); + _ssSmallRightDoor->setVisible(false); } break; case 0x4808: if (sender == _asLeftDoor) { - _ssSmallLeftDoor->getSurface()->setVisible(true); + _ssSmallLeftDoor->setVisible(true); _klayman->getSurface()->getClipRect() = _leftDoorClipRect; } else { - _ssSmallRightDoor->getSurface()->setVisible(true); + _ssSmallRightDoor->setVisible(true); _klayman->getSurface()->getClipRect() = _rightDoorClipRect; } break; @@ -1734,7 +1734,7 @@ Class607::Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { if (getGlobalVar(0x45080C38)) { - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); } else { SetMessageHandler(&Class607::handleMessage); @@ -1752,7 +1752,7 @@ uint32 Class607::handleMessage(int messageNum, const MessageParam ¶m, Entity break; case 0x4806: setGlobalVar(0x45080C38, 1); - _surface->setVisible(false); + setVisible(false); SetMessageHandler(NULL); break; } @@ -2191,7 +2191,7 @@ void AsScene2207WallRobotAnimation::stStartAnimation() { } else { setFileHash(0xCCFD6090, 0, -1); _idle = false; - _surface->setVisible(true); + setVisible(true); } } @@ -2207,7 +2207,7 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() { _soundResource4.stop(); // TODO Sound1ChList_deleteSoundByHash(0x12121943); _idle = true; - _surface->setVisible(false); + setVisible(false); } AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm) @@ -2242,7 +2242,7 @@ void AsScene2207WallCannonAnimation::stStartAnimation() { if (!_idle) { SetAnimationCallback3(NULL); } else { - _surface->setVisible(true); + setVisible(true); setFileHash(0x8CAA0099, 0, -1); _idle = false; } @@ -2254,7 +2254,7 @@ void AsScene2207WallCannonAnimation::stStopAnimation() { void AsScene2207WallCannonAnimation::cbStopAnimation() { setFileHash1(); - _surface->setVisible(false); + setVisible(false); _idle = true; } @@ -2309,8 +2309,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this)); _asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm)); - _asWallRobotAnimation->getSurface()->setVisible(false); - _asWallCannonAnimation->getSurface()->setVisible(false); + _asWallRobotAnimation->setVisible(false); + _asWallCannonAnimation->setVisible(false); _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0)); @@ -2452,8 +2452,8 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x480F: sendMessage(_asWallRobotAnimation, 0x2006, 0); sendMessage(_asWallCannonAnimation, 0x2006, 0); - _asWallRobotAnimation->getSurface()->setVisible(true); - _asWallCannonAnimation->getSurface()->setVisible(true); + _asWallRobotAnimation->setVisible(true); + _asWallCannonAnimation->setVisible(true); break; case 0x4826: if (sender == _asTape) { diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 219f595593..82bcc54ac4 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -462,7 +462,7 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc _deltaRect.y = 0; _deltaRect.width = _spriteResource.getDimensions().width; _deltaRect.height = _spriteResource.getDimensions().height; - _surface->setVisible(false); + setVisible(false); processDelta(); _needRefresh = true; SetUpdateHandler(&SsScene3009FireCannonButton::update); @@ -474,7 +474,7 @@ void SsScene3009FireCannonButton::update() { StaticSprite::update(); if (_flag1 && !_soundResource.isPlaying()) { sendMessage(_parentScene, 0x2000, 0); - _surface->setVisible(false); + setVisible(false); } } @@ -484,7 +484,7 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP case 0x1011: if (!_flag1 && !_parentScene->sub462E90()) { _flag1 = true; - _surface->setVisible(true); + setVisible(true); _soundResource.play(); } messageResult = 1; @@ -516,9 +516,9 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) void SsScene3009SymbolEdges::update() { if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) { if (_blinkToggle) { - _surface->setVisible(true); + setVisible(true); } else { - _surface->setVisible(false); + setVisible(false); } StaticSprite::update(); _blinkCountdown = 3; @@ -527,19 +527,19 @@ void SsScene3009SymbolEdges::update() { } void SsScene3009SymbolEdges::show() { - _surface->setVisible(true); + setVisible(true); StaticSprite::update(); _blinkCountdown = 0; } void SsScene3009SymbolEdges::hide() { - _surface->setVisible(false); + setVisible(false); StaticSprite::update(); _blinkCountdown = 0; } void SsScene3009SymbolEdges::startBlinking() { - _surface->setVisible(true); + setVisible(true); StaticSprite::update(); _blinkCountdown = 3; _blinkToggle = true; @@ -556,12 +556,12 @@ SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) _drawRect.y = 0; _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; - _surface->setVisible(false); + setVisible(false); _needRefresh = true; } void SsScene3009TargetLine::show() { - _surface->setVisible(true); + setVisible(true); StaticSprite::update(); } @@ -589,7 +589,7 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy void SsScene3009SymbolArrow::hide() { _enabled = false; - _surface->setVisible(false); + setVisible(false); } void SsScene3009SymbolArrow::update() { @@ -633,14 +633,14 @@ AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, createSurface1(0xC2463913, 1200); _needRefresh = true; updatePosition(); - _surface->setVisible(false); + setVisible(false); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage); } void AsScene3009VerticalIndicator::show() { setFileHash(0xC2463913, 0, -1); - _surface->setVisible(true); + setVisible(true); updatePosition(); _enabled = true; } @@ -666,7 +666,7 @@ AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine * createSurface1(0xC0C12954, 1200); _needRefresh = true; updatePosition(); - _surface->setVisible(false); + setVisible(false); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage); if (varValue == 8 || varValue == 9 || varValue == 10) { @@ -706,7 +706,7 @@ void AsScene3009HorizontalIndicator::suMoveRight() { void AsScene3009HorizontalIndicator::show() { setFileHash(0xC0C12954, 0, -1); - _surface->setVisible(true); + setVisible(true); updatePosition(); _enabled = true; } @@ -1105,12 +1105,12 @@ void SsScene3010DeadBoltButton::update() { if (_countdown1 != 0 && (--_countdown1 == 0)) { _soundResource1.play(); - _surface->setVisible(false); + setVisible(false); setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); } if (_countdown2 != 0 && (--_countdown2 == 0)) { - _surface->setVisible(true); + setVisible(true); setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); } @@ -1124,7 +1124,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar if (_buttonEnabled) { _soundResource2.play(); _soundResource3.play(); - _surface->setVisible(true); + setVisible(true); _buttonLocked = true; sendMessage(_parentScene, 0x2000, _buttonIndex); } else { @@ -1142,7 +1142,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar void SsScene3010DeadBoltButton::disableButton() { _buttonLocked = true; setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); - _surface->setVisible(true); + setVisible(true); } void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { @@ -1185,7 +1185,7 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene _soundResource2.load(0x420073DC); } - _surface->setVisible(false); + setVisible(false); stIdle(); if (initUnlocked) unlock(true); @@ -1222,7 +1222,7 @@ void AsScene3010DeadBolt::stIdle() { void AsScene3010DeadBolt::unlock(bool skipAnim) { if (!_unlocked) { - _surface->setVisible(true); + setVisible(true); if (skipAnim) { setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); _newHashListIndex = -2; @@ -1247,7 +1247,7 @@ void AsScene3010DeadBolt::stIdleMessage() { void AsScene3010DeadBolt::lock() { if (!_locked) { _locked = true; - _surface->setVisible(true); + setVisible(true); setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage)); @@ -1266,7 +1266,7 @@ void AsScene3010DeadBolt::setCountdown(int count) { } void AsScene3010DeadBolt::stDisabled() { - _surface->setVisible(true); + setVisible(true); setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage)); @@ -1276,7 +1276,7 @@ void AsScene3010DeadBolt::stDisabled() { } void AsScene3010DeadBolt::stDisabledMessage() { - _surface->setVisible(false); + setVisible(false); sendMessage(_parentScene, 0x2003, _boltIndex); } @@ -1447,7 +1447,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo _deltaRect.y = 0; _deltaRect.width = _spriteResource.getDimensions().width; _deltaRect.height = _spriteResource.getDimensions().height; - _surface->setVisible(false); + setVisible(false); processDelta(); _needRefresh = true; SetUpdateHandler(&SsScene3011Button::update); @@ -1457,7 +1457,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo void SsScene3011Button::update() { StaticSprite::update(); if (_countdown != 0 && (--_countdown == 0)) { - _surface->setVisible(false); + setVisible(false); } } @@ -1467,7 +1467,7 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x1011: if (_countdown == 0) { - _surface->setVisible(true); + setVisible(true); _countdown = 4; sendMessage(_parentScene, 0x2000, 0); _soundResource.play(); @@ -1496,7 +1496,7 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) _soundResource1.load(0x64428609); _soundResource2.load(0x7080023B); } - _surface->setVisible(false); + setVisible(false); _needRefresh = true; SetUpdateHandler(&AnimatedSprite::update); } @@ -1504,7 +1504,7 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) void AsScene3011Symbol::show(bool flag) { _flag2 = flag; setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1); - _surface->setVisible(true); + setVisible(true); if (flag) { _soundResource2.play(); } else { @@ -1514,7 +1514,7 @@ void AsScene3011Symbol::show(bool flag) { void AsScene3011Symbol::hide() { setFileHash1(); - _surface->setVisible(false); + setVisible(false); } void AsScene3011Symbol::stopSound() { @@ -1529,7 +1529,7 @@ void AsScene3011Symbol::change(int index, bool flag) { _index = index; _flag2 = flag; setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1); - _surface->setVisible(true); + setVisible(true); if (flag) { _soundResource2.play(); } else { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index f17b2d4216..1c4008e911 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -57,6 +57,7 @@ public: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void loadDataResource(uint32 fileHash); int16 defFilterY(int16 y); + void setVisible(bool value) { _surface->setVisible(value); } protected: void (Sprite::*_spriteUpdateCb)(); Common::String _spriteUpdateCbName; // For debugging purposes -- cgit v1.2.3 From 2f670690bc1febbd402a5743f400c4463af7ebc7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Sep 2011 14:46:53 +0000 Subject: NEVERHOOD: Add Scene::setPalette for simpled palette creation and use it --- engines/neverhood/diskplayerscene.cpp | 4 ++-- engines/neverhood/entity.h | 8 +++---- engines/neverhood/module1000.cpp | 43 +++++++++++++-------------------- engines/neverhood/module1200.cpp | 9 +++---- engines/neverhood/module1300.cpp | 21 ++++++---------- engines/neverhood/module1400.cpp | 18 +++++--------- engines/neverhood/module1500.cpp | 3 +-- engines/neverhood/module1700.cpp | 3 +-- engines/neverhood/module2000.cpp | 3 +-- engines/neverhood/module2200.cpp | 45 ++++++++++++----------------------- engines/neverhood/module3000.cpp | 23 ++++++------------ engines/neverhood/scene.cpp | 5 ++++ engines/neverhood/scene.h | 1 + 13 files changed, 69 insertions(+), 117 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index d0d7ec2426..ace2b5ba6d 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -353,8 +353,8 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _surfaceFlag = true; - _background = addBackground(new DirtyBackground(_vm, 0x8A000044, 0, 0)); - _palette = new Palette(_vm, kDiskplayerPaletteFileHashes[_which]); + setBackground(0x8A000044); + setPalette(kDiskplayerPaletteFileHashes[_which]); _playButton = new DiskplayerPlayButton(_vm, this); addSprite(_playButton); _vm->_collisionMan->addSprite(_playButton); diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 582e93f77f..924a7a778b 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -103,16 +103,16 @@ public: // NOTE: These were overloaded before for the various message parameter types // it caused some problems so each type gets its own sendMessage variant now uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam ¶m) { - return receiver->receiveMessage(messageNum, param, this); + return receiver ? receiver->receiveMessage(messageNum, param, this) : 0; } uint32 sendMessage(Entity *receiver, int messageNum, uint32 param) { - return receiver->receiveMessage(messageNum, MessageParam(param), this); + return sendMessage(receiver, messageNum, MessageParam(param)); } uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint ¶m) { - return receiver->receiveMessage(messageNum, MessageParam(param), this); + return sendMessage(receiver, messageNum, MessageParam(param)); } uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param) { - return receiver->receiveMessage(messageNum, MessageParam((Entity*)param), this); + return sendMessage(receiver, messageNum, MessageParam((Entity*)param)); } int getPriority() const { return _priority; } // Shortcuts for game variable access diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 1cc4b43dbb..8dda9ed039 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -82,30 +82,27 @@ void Module1000::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 0: - if (_moduleResult == 2) { + if (_moduleResult == 2) createScene(2, 0); - } else { + else createScene(1, 0); - } break; case 1: - if (_moduleResult == 1) { + if (_moduleResult == 1) sendMessage(_parentModule, 0x1009, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(3, 0); - } else { + else createScene(0, 1); - } break; case 2: createScene(0, 2); break; case 3: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(4, 0); - } else { + else createScene(1, 2); - } break; case 4: // TODO Music18hList_stop(_musicFileHash, 0, 1); @@ -213,9 +210,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == 0x00352100) { - if (_asDoor) { - sendMessage(_asDoor, 0x2000, 0); - } + sendMessage(_asDoor, 0x2000, 0); } else if (param.asInteger() == 0x0A1A0109) { _soundResource.play(0x66410886); } @@ -309,7 +304,7 @@ SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentSce : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _soundResource(vm), _countdown(0) { _priority = 1100; - _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; + _soundFileHash = soundFileHash ? soundFileHash : 0x44141000; setVisible(false); SetUpdateHandler(&SsCommonButtonSprite::update); SetMessageHandler(&SsCommonButtonSprite::handleMessage); @@ -346,8 +341,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->setHitRects(0x004B4860); _surfaceFlag = false; setBackground(0x4086520E); - _palette = new Palette(_vm, 0x4086520E); - _palette->usePalette(); + setPalette(0x4086520E); insertMouse433(0x6520A400); if (which < 0) { @@ -1349,8 +1343,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x12C23307); - _palette = new Palette(_vm, 0x12C23307); - _palette->usePalette(); + setPalette(0x12C23307); _flag = false; @@ -1629,8 +1622,7 @@ Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundF SetMessageHandler(&Class152::handleMessage); setBackground(backgroundFileHash); - _palette = new Palette(_vm, backgroundFileHash); - _palette->usePalette(); + setPalette(backgroundFileHash); insertMouse435(cursorFileHash, 20, 620); } @@ -1692,13 +1684,12 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x50C03005); if (getGlobalVar(0x0D0A14D10)) { - _palette = new Palette(_vm, 0xA30BA329); + setPalette(0xA30BA329); _palette->addBasePalette(0xA30BA329, 0, 256, 0); } else { - _palette = new Palette(_vm, 0x50C03005); + setPalette(0x50C03005); _palette->addBasePalette(0x50C03005, 0, 256, 0); } - _palette->usePalette(); addEntity(_palette); insertMouse433(0x03001504); @@ -1791,14 +1782,12 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0xD0A14D10)) { setBackground(0x2800E011); - _palette = new Palette(_vm, 0x2800E011); - _palette->usePalette(); + setPalette(0x2800E011); insertStaticSprite(0x492D5AD7, 100); insertMouse435(0x0E015288, 20, 620); } else { setBackground(0x8870A546); - _palette = new Palette(_vm, 0x8870A546); - _palette->usePalette(); + setPalette(0x8870A546); insertStaticSprite(0x40D1E0A9, 100); insertStaticSprite(0x149C00A6, 100); insertMouse435(0x0A54288F, 20, 620); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 9cab544710..81e61c7fc2 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -838,13 +838,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { setBackground(0x4019A2C4); - _palette = new Palette(_vm, 0x4019A2C4); - _palette->usePalette(); + setPalette(0x4019A2C4); _asRightDoor = NULL; } else { setBackground(0x40206EC5); - _palette = new Palette(_vm, 0x40206EC5); - _palette->usePalette(); + setPalette(0x40206EC5); _asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2)); } @@ -1146,8 +1144,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x60210ED5); - _palette = new Palette(_vm, 0x60210ED5); - _palette->usePalette(); + setPalette(0x60210ED5); addEntity(_palette); _paletteResource.load(0x60250EB5); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index f27952f94c..8f3483ad20 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -421,8 +421,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B0A38); setBackground(0x420643C4); - _palette = new Palette(_vm, 0x420643C4); - _palette->usePalette(); + setPalette(0x420643C4); insertMouse433(0x643C0428); _class595 = addSprite(new Class595(_vm, this)); @@ -646,8 +645,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004AF9E8); setBackground(0x01581A9C); - _palette = new Palette(_vm, 0x01581A9C); - _palette->usePalette(); + setPalette(0x01581A9C); insertMouse433(0x81A9801D); if (!getGlobalVar(0xAC00C0D0)) { @@ -718,8 +716,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B91A8); setBackground(0x062C0214); - _palette = new Palette(_vm, 0x062C0214); - _palette->usePalette(); + setPalette(0x062C0214); insertMouse433(0xC021006A); if (getGlobalVar(0xAC00C0D0)) { @@ -789,8 +786,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B6E98); setBackground(0x28801B64); - _palette = new Palette(_vm, 0x28801B64); - _palette->usePalette(); + setPalette(0x28801B64); insertMouse433(0x01B60280); if (which < 0) { @@ -905,8 +901,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1306::handleMessage); setBackground(0x05303114); - _palette = new Palette(_vm, 0x05303114); - _palette->usePalette(); + setPalette(0x05303114); insertMouse433(0x0311005B); if (!getGlobalVar(0x13382860)) { @@ -1311,8 +1306,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1307::update); setBackground(0xA8006200); - _palette = new Palette(_vm, 0xA8006200); - _palette->usePalette(); + setPalette(0xA8006200); addEntity(_palette); insertMouse435(0x06204A88, 20, 620); @@ -1630,8 +1624,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1308::handleMessage); setBackground(0x41024202); - _palette = new Palette(_vm, 0x41024202); - _palette->usePalette(); + setPalette(0x41024202); insertMouse433(0x24206418); _asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011)); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index f50fb25b79..3f61ceb52d 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -664,8 +664,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x08221FA5); - _palette = new Palette(_vm, 0x08221FA5); - _palette->usePalette(); + setPalette(0x08221FA5); insertMouse433(0x21FA108A); // TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0)); @@ -885,9 +884,8 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _background = addBackground(new Background(_vm, 0x231482F0, 0, 0)); _background->getSurface()->getDrawRect().y = -10; // TODO g_screen->field_26 = 0; - _palette = new Palette(_vm, 0x231482F0); + setPalette(0x231482F0); _palette->addPalette(0x91D3A391, 0, 64, 0); - _palette->usePalette(); insertMouse433(0x482F4239); _class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100)); @@ -1288,8 +1286,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1407::update); setBackground(0x00442225); - _palette = new Palette(_vm, 0x00442225); - _palette->usePalette(); + setPalette(0x00442225); insertMouse435(0x4222100C, 20, 620); _asMouse = addSprite(new AsScene1407Mouse(_vm, this)); @@ -1354,8 +1351,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x2110A234); - _palette = new Palette(_vm, 0x2110A234); - _palette->usePalette(); + setPalette(0x2110A234); insertMouse433(0x0A230219); _class401_1 = insertStaticSprite(0x01102A33, 100); @@ -1477,9 +1473,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B8D80); setBackground(0xAC0B006F); - _palette = new Palette(_vm, 0xAC0B006F); + setPalette(0xAC0B006F); _palette->addPalette(0x00801510, 0, 65, 0); - _palette->usePalette(); insertMouse433(0xB006BAC8); if (getGlobalVar(0x13382860) == 5) { @@ -1692,8 +1687,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x0C0C007D); - _palette = new Palette(_vm, 0x0C0C007D); - _palette->usePalette(); + setPalette(0x0C0C007D); insertMouse435(0xC00790C8, 20, 620); // TODO: Some debug code: Leave two matching tiles open diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 09567f5392..54a46851d6 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -93,8 +93,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun setBackground(backgroundFileHash); - _palette = new Palette(_vm); - _palette->usePalette(); + setPalette(); addEntity(_palette); _palette->addBasePalette(backgroundFileHash, 0, 256, 0); _palette->startFadeToPalette(12); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 58fc83511c..f551911b3a 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -188,10 +188,9 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x03118226); - _palette = new Palette(_vm, 0x03118226); + setPalette(0x03118226); _palette->addBasePalette(0x91D3A391, 0, 64, 0); _palette->copyBasePalette(0, 256, 0); - _palette->usePalette(); addEntity(_palette); insertMouse433(0x18222039); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index a30bb93541..b2e9a0ef5a 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -102,8 +102,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2001::handleMessage); setBackground(0xA6417244); - _palette = new Palette(_vm, 0xA6417244); - _palette->usePalette(); + setPalette(0xA6417244); insertMouse433(0x17240A6C); _class401 = insertStaticSprite(0x0D641724, 1100); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 1f118a4d1f..a0db78829e 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -736,8 +736,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) loadHitRectList(); setBackground(0x40008208); - _palette = new Palette(_vm, 0x40008208); - _palette->usePalette(); + setPalette(0x40008208); insertMouse433(0x0820C408); _asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011)); @@ -1119,8 +1118,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x08100A0C); - _palette = new Palette(_vm, 0x08100A0C); - _palette->usePalette(); + setPalette(0x08100A0C); addEntity(_palette); insertMouse435(0x00A08089, 20, 620); @@ -1349,8 +1347,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x82C80334); - _palette = new Palette(_vm, 0x82C80334); - _palette->usePalette(); + setPalette(0x82C80334); insertMouse433(0x80330824); _vm->_collisionMan->setHitRects(0x004B8320); @@ -1512,8 +1509,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { _isLightOn = true; setBackground(0x0008028D); - _palette = new Palette(_vm, 0x0008028D); - _palette->usePalette(); + setPalette(0x0008028D); addEntity(_palette); insertMouse433(0x80289008); _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0); @@ -1521,8 +1517,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) } else { _isLightOn = false; setBackground(0xD00A028D); - _palette = new Palette(_vm, 0xD00A028D); - _palette->usePalette(); + setPalette(0xD00A028D); addEntity(_palette); insertMouse433(0xA0289D08); _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0); @@ -1807,8 +1802,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(fileHash); - _palette = new Palette(_vm, fileHash); - _palette->usePalette(); + setPalette(fileHash); addEntity(_palette); _palette->addBasePalette(fileHash, 0, 256, 0); @@ -2292,8 +2286,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { setBackground(0x88C00241); - _palette = new Palette(_vm, 0x88C00241); - _palette->usePalette(); + setPalette(0x88C00241); insertMouse433(0x00245884); _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); @@ -2334,8 +2327,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(0x81890D14, 1); setBackground(0x05C02A55); - _palette = new Palette(_vm, 0x05C02A55); - _palette->usePalette(); + setPalette(0x05C02A55); insertMouse433(0x02A51054); _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); @@ -2531,8 +2523,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _background->getSpriteResource().getPosition().y = 480; addBackground(_background); - _palette = new Palette(_vm, 0x08100289); - _palette->usePalette(); + setPalette(0x08100289); addEntity(_palette); // Why? insertMouse435(0x0028D089, 40, 600); @@ -2708,14 +2699,12 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { setBackground(0x11840E24); - _palette = new Palette(_vm, 0x11840E24); - _palette->usePalette(); + setPalette(0x11840E24); insertMouse433(0x40E20110); setRectList(0x004B3DC8); } else { setBackground(0x25848E24); - _palette = new Palette(_vm, 0x25848E24); - _palette->usePalette(); + setPalette(0x25848E24); addEntity(_palette); _palette->copyBasePalette(0, 256, 0); _palette->addPalette(0x68033B1C, 0, 65, 0); @@ -2846,14 +2835,12 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) { setRectList(0x004B2BF8); setBackground(_sceneInfo140->bgFilename2); - _palette = new Palette(_vm, _sceneInfo140->bgFilename2); - _palette->usePalette(); + setPalette(_sceneInfo140->bgFilename2); insertMouse433(0x14320138); } else { setRectList(0x004B2BB8); setBackground(_sceneInfo140->bgFilename1); - _palette = new Palette(_vm, _sceneInfo140->bgFilename1); - _palette->usePalette(); + setPalette(_sceneInfo140->bgFilename1); insertMouse433(0x63A40028); } @@ -2943,14 +2930,12 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x4D080E54)) { setRectList(0x004B5588); setBackground(0x40339414); - _palette = new Palette(_vm, 0x40339414); - _palette->usePalette(); + setPalette(0x40339414); insertMouse433(0x3941040B); } else { setRectList(0x004B55C8); setBackground(0x071963E5); - _palette = new Palette(_vm, 0x071963E5); - _palette->usePalette(); + setPalette(0x071963E5); insertMouse433(0x14320138); } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 82bcc54ac4..e7714c08fd 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -795,7 +795,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_screen->clear(); setBackground(0xD000420C); - _palette = new Palette(_vm, 0xD000420C); + setPalette(0xD000420C); insertMouse435(0x04208D08, 20, 620); _ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this)); @@ -821,7 +821,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo)); _smackerPlayer->setDrawPos(89, 37); - _palette->usePalette(); + _palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage insertStaticSprite(0x8540252C, 400); @@ -1032,7 +1032,7 @@ bool Scene3009::isSymbolsPart2Solved() { } bool Scene3009::sub462E90() { - return /*_flag3 || */_flag4; + return _flag4; } // Scene3010 @@ -1153,10 +1153,7 @@ void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { _drawRect.y = 0; _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = _spriteResource.getDimensions().width; - _deltaRect.height = _spriteResource.getDimensions().height; + _deltaRect = _drawRect; processDelta(); _needRefresh = true; StaticSprite::update(); @@ -1294,8 +1291,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; setBackground(0x80802626); - _palette = new Palette(_vm, 0x80802626); - _palette->usePalette(); + setPalette(0x80802626); for (int i = 0; i < 3; i++) { _asDeadBolts[i] = new AsScene3010DeadBolt(_vm, this, i, which == 1);//CHECKME @@ -1443,10 +1439,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo _drawRect.y = 0; _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = _spriteResource.getDimensions().width; - _deltaRect.height = _spriteResource.getDimensions().height; + _deltaRect = _drawRect; setVisible(false); processDelta(); _needRefresh = true; @@ -1546,9 +1539,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) _index1 = getGlobalVar(0x2414C2F2); setBackground(0x92124A04); - - _palette = new Palette(_vm, 0xA4070114); - _palette->usePalette(); + setPalette(0xA4070114); addEntity(_palette); insertMouse435(0x24A00929, 20, 620); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 5072d5339d..f1ee55420a 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -186,6 +186,11 @@ void Scene::changeBackground(uint32 fileHash) { _background->load(fileHash); } +void Scene::setPalette(uint32 fileHash) { + _palette = fileHash ? new Palette(_vm, fileHash) : new Palette(_vm); + _palette->usePalette(); +} + Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { return addSprite(new StaticSprite(_vm, fileHash, surfacePriority)); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 31dd61db6d..bcae32457e 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -55,6 +55,7 @@ public: Background *addBackground(Background *background); void setBackground(uint32 fileHash, bool dirtyBackground = true); void changeBackground(uint32 fileHash); + void setPalette(uint32 fileHash = 0); Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL); void insertMouse435(uint32 fileHash, int16 x1, int16 x2); -- cgit v1.2.3 From 1b2d496d186c6f838526f51f7d0b3eea70a8b322 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 20 Sep 2011 07:48:17 +0000 Subject: NEVERHOOD: Try to clean up the clipRect stuff a little --- engines/neverhood/graphics.h | 15 +++++ engines/neverhood/module1000.cpp | 119 +++++++++++---------------------------- engines/neverhood/module1000.h | 8 --- engines/neverhood/module1200.cpp | 44 ++++----------- engines/neverhood/module1300.cpp | 72 ++++++----------------- engines/neverhood/module1400.cpp | 60 +++++--------------- engines/neverhood/module1700.cpp | 25 ++------ engines/neverhood/module2000.cpp | 5 +- engines/neverhood/module2200.cpp | 89 ++++++++--------------------- engines/neverhood/scene.h | 5 ++ engines/neverhood/sprite.cpp | 16 ++++++ engines/neverhood/sprite.h | 6 ++ 12 files changed, 148 insertions(+), 316 deletions(-) diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 36bd95e3ab..08fa1f5df0 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -44,14 +44,29 @@ struct NRect { int16 x1, y1, x2, y2; NRect() : x1(0), y1(0), x2(0), y2(0) {} NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {} + void set(int16 x01, int16 y01, int16 x02, int16 y02) { + x1 = x01; + y1 = y01; + x2 = x02; + y2 = y02; + } }; typedef Common::Array NRectArray; +// TODO: Use Common::Rect struct NDrawRect { int16 x, y, width, height; NDrawRect() : x(0), y(0), width(0), height(0) {} NDrawRect(int16 x0, int16 y0, int16 width0, int16 height0) : x(x0), y(y0), width(width0), height(height0) {} + int16 x2() { return x + width; } + int16 y2() { return y + height; } + void set(int16 x0, int16 y0, int16 width0, int16 height0) { + x = x0; + y = y0; + width = width0; + height = height0; + } }; class AnimResource; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 8dda9ed039..ddd3e0aef9 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -369,18 +369,11 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x2080A3A8, 1300); - // TODO: This sucks somehow, find a better way - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(0xD217189D) == 0) { _asDoor = addSprite(new AsScene1001Door(_vm)); - _asDoor->getSurface()->getClipRect().x1 = 0; - _asDoor->getSurface()->getClipRect().y1 = 0; - _asDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; - _asDoor->getSurface()->getClipRect().y2 = 480; + _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); } else { _asDoor = NULL; } @@ -395,10 +388,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x03C698DA) == 0) { tempSprite = insertStaticSprite(0x8C066150, 200); _asWindow = addSprite(new AsScene1001Window(_vm)); - _asWindow->getSurface()->getClipRect().x1 = tempSprite->getSurface()->getDrawRect().x; - _asWindow->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; - _asWindow->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; - _asWindow->getSurface()->getClipRect().y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; + _asWindow->setClipRect(tempSprite->getDrawRect()); } else { _asWindow = NULL; } @@ -526,12 +516,7 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); } - debug("clipY1 = %d", clipY1); - - _surface->getClipRect().x1 = 0; - _surface->getClipRect().y1 = clipY1; - _surface->getClipRect().x2 = 640; - _surface->getClipRect().y2 = 480; + setClipRect(0, clipY1, 640, 480); _x = x; _y = y; @@ -664,7 +649,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) _spriteResource.load2(0x1052370F); createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _surface->getClipRect() = clipRect; + setClipRect(clipRect); _x = 526; @@ -764,7 +749,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0); createSurface(800, 136, 147); - _surface->getClipRect() = clipRect; + setClipRect(clipRect); spriteUpdate448AA0(); _soundResource.load(0xC0C40298); setFileHash(0x586C1D48, 0, 0); @@ -803,17 +788,14 @@ void AsScene1002DoorSpy::spriteUpdate448AA0() { } void AsScene1002DoorSpy::sub448AC0() { - _surface->getClipRect() = _rect; + setClipRect(_rect); _parentScene->setSurfacePriority(getSurface(), 800); setFileHash(0x586C1D48, 0, 0); SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); } void AsScene1002DoorSpy::sub448B10() { - _surface->getClipRect().x1 = 0; - _surface->getClipRect().y1 = 0; - _surface->getClipRect().x2 = 640; - _surface->getClipRect().y2 = 480; + setClipRect(0, 0, 640, 480); _parentScene->setSurfacePriority(getSurface(), 1200); setFileHash(0x586C1D48, 1, -1); SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60); @@ -1313,14 +1295,11 @@ uint32 Class479::handleMessage(int messageNum, const MessageParam ¶m, Entity sendMessage(_parentScene, 0x1022, 1200); _flag1 = true; _savedClipRect = _surface->getClipRect(); - _surface->getClipRect().x1 = 0; - _surface->getClipRect().y1 = 0; - _surface->getClipRect().x2 = 640; - _surface->getClipRect().y2 = 480; + setClipRect(0, 0, 640, 480); } else if (param.asInteger() == 0x88001184) { sendMessage(_parentScene, 0x1022, 1000); if (_flag1) { - _surface->getClipRect() = _savedClipRect; + setClipRect(_savedClipRect); } } break; @@ -1362,54 +1341,39 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); - _klayman->getSurface()->getClipRect().x1 = 31; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height; + _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4270); - _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _class478->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4478); - _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _class478->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; } else if (which == 2) { InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4298); - _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _class478->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; sendMessage(_klayman, 0x4820, 0); } else { InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); _class478 = addSprite(new Class478(_vm, _klayman)); setMessageList(0x004B4470); - _klayman->getSurface()->getClipRect().x1 = 31; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart3->getSurface()->getDrawRect().y + _ssLadderArchPart3->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); + _class478->setClipRect(_klayman->getClipRect()); _class479 = addSprite(new Class479(_vm, this, _klayman)); - _class479->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _class479->setClipRect(_klayman->getClipRect()); _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; } @@ -1417,16 +1381,14 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x23303124); tempSprite = insertStaticSprite(0xB3242310, 825); - tempClipRect.x1 = tempSprite->getSurface()->getDrawRect().x; - tempClipRect.y1 = tempSprite->getSurface()->getDrawRect().y; - tempClipRect.x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - tempClipRect.y2 = _ssLadderArchPart2->getSurface()->getDrawRect().y + _ssLadderArchPart2->getSurface()->getDrawRect().height; + tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, + _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2()); - _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getSurface()->getDrawRect().y, false)); - _asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getSurface()->getDrawRect().y, false)); - _asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getSurface()->getDrawRect().y, getGlobalVar(0x8306F218) != 0)); - _asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getSurface()->getDrawRect().y, false)); - _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getSurface()->getDrawRect().y, false)); + _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getDrawRect().y, false)); + _asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getDrawRect().y, false)); + _asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0)); + _asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getDrawRect().y, false)); + _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getDrawRect().y, false)); _asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect)); @@ -1456,11 +1418,8 @@ Scene1002::~Scene1002() { void Scene1002::update() { Scene::update(); if (!_flag1B4 && _klayman->getY() > 230) { - _klayman->getSurface()->getClipRect().x1 = _ssLadderArch->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _ssLadderArchPart2->getSurface()->getDrawRect().x + _ssLadderArchPart2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _ssLadderArchPart1->getSurface()->getDrawRect().y + _ssLadderArchPart1->getSurface()->getDrawRect().height; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _class478->setClipRect(_klayman->getClipRect()); deleteSprite(&_ssLadderArchPart3); _klayman->clearRepl(); _flag1B4 = true; @@ -1480,6 +1439,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: + // Debug stuff (original) if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { setGlobalVar(0x8306F218, 1); setGlobalVar(0x1B144052, 3); @@ -1487,6 +1447,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x000D: + // Debug stuff (original) if (param.asInteger() == 0x48848178) { setGlobalVar(0x8306F218, 1); setGlobalVar(0x1B144052, 3); @@ -1499,15 +1460,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit if (getGlobalVar(0x8306F218)) { setMessageList(0x004B4428); } else { - // TODO _resourceTable3.load(); setMessageList(0x004B4448); } messageResult = 1; } else if (param.asInteger() == 0x4A845A00) { - // TODO _resourceTable4.load(); sendEntityMessage(_klayman, 0x1014, _asRing1); } else if (param.asInteger() == 0x43807801) { - // TODO _resourceTable4.load(); sendEntityMessage(_klayman, 0x1014, _asRing2); } else if (param.asInteger() == 0x46C26A01) { if (getGlobalVar(0x8306F218)) { @@ -1518,27 +1476,19 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setGlobalVar(0x2B514304, 1); setMessageList(0x004B44A8); } else { - // TODO _resourceTable5.load(); setMessageList(0x004B44A0); } } messageResult = 1; } else if (param.asInteger() == 0x468C7B11) { - // TODO _resourceTable4.load(); sendEntityMessage(_klayman, 0x1014, _asRing4); } else if (param.asInteger() == 0x42845B19) { - // TODO _resourceTable4.load(); sendEntityMessage(_klayman, 0x1014, _asRing5); } else if (param.asInteger() == 0xC0A07458) { sendEntityMessage(_klayman, 0x1014, _class426); } break; case 0x1024: - if (param.asInteger() == 1) { - // TODO _resourceTable3.load(); - } else if (param.asInteger() == 3) { - // TODO _resourceTable2.load(); - } sendMessage(_parentModule, 0x1024, param.asInteger()); break; case 0x2000: @@ -1717,11 +1667,8 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x3060222E, 1300); tempSprite = insertStaticSprite(0x0E002004, 1300); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); + _class478->setClipRect(_klayman->getClipRect()); _asTrashCan = addSprite(new AsScene1004TrashCan(_vm)); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index a7046ce1a4..47b1a91229 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -267,14 +267,6 @@ public: Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Scene1002(); protected: - // TODO ResourceTable _resourceTable1; - // TODO ResourceTable _resourceTable2; - // TODO ResourceTable _resourceTable3; - // TODO ResourceTable _resourceTable4; - // TODO ResourceTable _resourceTable5; - // TODO ResourceTable _resourceTable6; - // TODO ResourceTable _resourceTable7; - // TODO ResourceTable _resourceTable8; Sprite *_asRing1; Sprite *_asRing2; Sprite *_asRing3; diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 81e61c7fc2..62462fc649 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -27,7 +27,6 @@ namespace Neverhood { Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO _resourceTable.setResourceList(0x004B3E68); SetMessageHandler(&Module1200::handleMessage); debug("Module1200: which = %d", which); @@ -188,10 +187,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi } createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _surface->getClipRect().x1 = 0; - _surface->getClipRect().y1 = 0; - _surface->getClipRect().x2 = 640; - _surface->getClipRect().y2 = clipY2; + setClipRect(0, 0, 640, clipY2); _needRefresh = true; StaticSprite::update(); } @@ -774,22 +770,19 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); tempSprite = insertStaticSprite(0x03C82530, 100); - topY1 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; + topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; tempSprite = insertStaticSprite(0x88182069, 200); - topY2 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; + topY2 = tempSprite->getY() + tempSprite->getDrawRect().height; tempSprite = insertStaticSprite(0x476014E0, 300); - topY3 = tempSprite->getY() + tempSprite->getSurface()->getDrawRect().height; + topY3 = tempSprite->getY() + tempSprite->getDrawRect().height; tempSprite = insertStaticSprite(0x04063110, 500); topY4 = tempSprite->getY() + 1; _class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1)); - _class466->getSurface()->getClipRect().x1 = 0; - _class466->getSurface()->getClipRect().y1 = topY4; - _class466->getSurface()->getClipRect().x2 = 640; - _class466->getSurface()->getClipRect().y2 = 480; + _class466->setClipRect(0, topY4, 640, 480); insertStaticSprite(0x400B04B0, 1200); @@ -797,7 +790,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) x1 = tempSprite->getX(); tempSprite = insertStaticSprite(0xA29223FA, 1200); - x2 = tempSprite->getX() + tempSprite->getSurface()->getDrawRect().width; + x2 = tempSprite->getX() + tempSprite->getDrawRect().width; class464 = addSprite(new Class464(_vm)); @@ -830,10 +823,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AEC10); } - _klayman->getSurface()->getClipRect().x1 = x1; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = x2; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(x1, 0, x2, 480); _klayman->setRepl(64, 0); if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { @@ -851,17 +841,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (!getGlobalVar(0x0A18CA33)) { AsScene1201TntMan *asTntMan; asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1); - asTntMan->getSurface()->getClipRect().x1 = x1; - asTntMan->getSurface()->getClipRect().y1 = 0; - asTntMan->getSurface()->getClipRect().x2 = x2; - asTntMan->getSurface()->getClipRect().y2 = 480; + asTntMan->setClipRect(x1, 0, x2, 480); _vm->_collisionMan->addSprite(asTntMan); _asTntMan = addSprite(asTntMan); tempSprite = addSprite(new Class465(_vm, _asTntMan)); - tempSprite->getSurface()->getClipRect().x1 = x1; - tempSprite->getSurface()->getClipRect().y1 = 0; - tempSprite->getSurface()->getClipRect().x2 = x2; - tempSprite->getSurface()->getClipRect().y2 = 480; + tempSprite->setClipRect(x1, 0, x2, 480); asTntMan->setRepl(64, 0); } @@ -926,10 +910,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x63D400BC, 900); _asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman)); - _asLeftDoor->getSurface()->getClipRect().x1 = x1; - _asLeftDoor->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; - _asLeftDoor->getSurface()->getClipRect().x2 = tempSprite->getSurface()->getDrawRect().x + tempSprite->getSurface()->getDrawRect().width; - _asLeftDoor->getSurface()->getClipRect().y2 = 480; + _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) { setGlobalVar(0x0112090A, 1); @@ -944,10 +925,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { _asCreature = addSprite(new AsScene1201Creature(_vm, this, _klayman)); - _asCreature->getSurface()->getClipRect().x1 = x1; - _asCreature->getSurface()->getClipRect().y1 = 0; - _asCreature->getSurface()->getClipRect().x2 = x2; - _asCreature->getSurface()->getClipRect().y2 = 480; + _asCreature->setClipRect(x1, 0, x2, 480); } } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 8f3483ad20..48a8b54e66 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -430,18 +430,15 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2->setVisible(false); _sprite3 = insertStaticSprite(0x16E01E20, 1100); - _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getSurface()->getDrawRect().y, false)); - _asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x13206309))); - _asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getSurface()->getDrawRect().y, false)); - _asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getSurface()->getDrawRect().y, getGlobalVar(0x80101B1E))); - _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getSurface()->getDrawRect().y, false)); + _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getDrawRect().y, false)); + _asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309))); + _asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false)); + _asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E))); + _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false)); _asBridge = addSprite(new AsScene1302Bridge(_vm, this)); _ssFence = addSprite(new SsScene1302Fence(_vm)); - _ssFence->getSurface()->getClipRect().x1 = 0; - _ssFence->getSurface()->getClipRect().y1 = 0; - _ssFence->getSurface()->getClipRect().x2 = 640; - _ssFence->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; + _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); if (which < 0) { InsertKlaymanInitArgs(KmScene1002, 380, 364, (_class595, NULL)); @@ -451,10 +448,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B0870); } - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true)); _vm->_collisionMan->addSprite(_asVenusFlyTrap); @@ -658,10 +652,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) InsertKlayman(KmScene1303, 207, 332); setMessageList(0x004AF9A0); - _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } @@ -746,10 +737,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B90F0); } - _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } @@ -1236,7 +1224,7 @@ void AsScene1307Key::stRemoveKey() { void AsScene1307Key::stInsertKey() { _pointIndex = 0; sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]); - _surface->getClipRect() = _clipRects[getSubVar(0xA010B810, _index) % 4]; + setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]); SetSpriteCallback(&AsScene1307Key::suInsertKey); _newHashListIndex = -2; } @@ -1246,10 +1234,7 @@ void AsScene1307Key::stMoveKey() { int16 newX = pt.x + kAsScene1307KeyXDelta; int16 newY = pt.y + kAsScene1307KeyYDelta; sendMessage(_parentScene, 0x1022, 1000); - _surface->getClipRect().x1 = 0; - _surface->getClipRect().y1 = 0; - _surface->getClipRect().x2 = 640; - _surface->getClipRect().y2 = 480; + setClipRect(0, 0, 640, 480); _prevX = _x; _prevY = _y; if (newX == _x && newY == _y) { @@ -1311,28 +1296,16 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x06204A88, 20, 620); tempSprite = insertStaticSprite(0x00A3621C, 800); - _clipRects[0].x1 = tempSprite->getSurface()->getDrawRect().x; - _clipRects[0].y1 = 0; - _clipRects[0].x2 = 640; - _clipRects[0].y2 = 480; + _clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480); tempSprite = insertStaticSprite(0x00A3641C, 600); - _clipRects[1].x1 = tempSprite->getSurface()->getDrawRect().x; - _clipRects[1].y1 = 0; - _clipRects[1].x2 = 640; - _clipRects[1].y2 = 480; + _clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480); tempSprite = insertStaticSprite(0x00A3681C, 400); - _clipRects[2].x1 = tempSprite->getSurface()->getDrawRect().x; - _clipRects[2].y1 = 0; - _clipRects[2].x2 = 640; - _clipRects[2].y2 = 480; + _clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480); tempSprite = insertStaticSprite(0x00A3701C, 200); - _clipRects[3].x1 = tempSprite->getSurface()->getDrawRect().x; - _clipRects[3].y1 = 0; - _clipRects[3].x2 = 640; - _clipRects[3].y2 = 480; + _clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480); for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (getSubVar(0x08D0AB11, keyIndex)) { @@ -1693,25 +1666,16 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } if (_sprite4) { - _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite4->getSurface()->getDrawRect().x + _sprite4->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480); } else { - _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } if (getGlobalVar(0x04A105B3) == 4) { _class489 = new Class489(_vm, this, _klayman, 0); addSprite(_class489); _vm->_collisionMan->addSprite(_class489); - _class489->getSurface()->getClipRect().x1 = 0; - _class489->getSurface()->getClipRect().y1 = 0; - _class489->getSurface()->getClipRect().x2 = 0; - _class489->getSurface()->getClipRect().y2 = _sprite2->getSurface()->getDrawRect().y + _sprite2->getSurface()->getDrawRect().height; + _class489->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _class489->setRepl(64, 0); } else { _class489 = NULL; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 3f61ceb52d..7bff2940c8 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -714,16 +714,10 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->processDelta(); setMessageList(0x004B6670); } - _class489->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x; - _class489->getSurface()->getClipRect().y1 = _sprite2->getSurface()->getDrawRect().y; - _class489->getSurface()->getClipRect().x2 = 640; - _class489->getSurface()->getClipRect().y2 = 480; + _class489->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); } - _klayman->getSurface()->getClipRect().x1 = _sprite3->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); if (which == 0 && _class489 && _class489->hasMessageHandler()) { sendMessage(_class489, 0x482B, 0); @@ -881,8 +875,8 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1402::handleMessage); - _background = addBackground(new Background(_vm, 0x231482F0, 0, 0)); - _background->getSurface()->getDrawRect().y = -10; + setBackground(0x231482F0); + setBackgroundY(-10); // TODO g_screen->field_26 = 0; setPalette(0x231482F0); _palette->addPalette(0x91D3A391, 0, 64, 0); @@ -928,10 +922,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) } if (_class482) { - _class482->getSurface()->getClipRect().x1 = 0; - _class482->getSurface()->getClipRect().y1 = 0; - _class482->getSurface()->getClipRect().x2 = 640; - _class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + _class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2()); } if (getGlobalVar(0x4A105B3) == 1) { @@ -948,39 +939,27 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->processDelta(); setMessageList(0x004B0BD0); } - _class489->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x; - _class489->getSurface()->getClipRect().y1 = 0; - _class489->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x; - _class489->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + _class489->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2()); } - _klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + _klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2()); } void Scene1402::update() { if (_flag) { - _background->getSurface()->getDrawRect().y = _vm->_rnd->getRandomNumber(10 - 1) - 10; - // TODO g_screen->field_26 = -10 - _background->getSurface()->getDrawRect().y; + setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10); + // TODO g_screen->field_26 = -10 - _background->getDrawRect().y; } else { - _background->getSurface()->getDrawRect().y = -10; + setBackgroundY(-10); // TODO g_screen->field_26 = 0; SetUpdateHandler(&Scene::update); } Scene::update(); if (_class482) { - _class482->getSurface()->getClipRect().x1 = 0; - _class482->getSurface()->getClipRect().y1 = 0; - _class482->getSurface()->getClipRect().x2 = 640; - _class482->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + _class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2()); } - _klayman->getSurface()->getClipRect().x1 = _class454_1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _class454_2->getSurface()->getDrawRect().x + _class454_2->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _class454_3->getSurface()->getDrawRect().y + _class454_3->getSurface()->getDrawRect().height; + _klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2()); } uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1392,10 +1371,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->processDelta(); setMessageList(0x004B1F70); } - _class489->getSurface()->getClipRect().x1 = 0; - _class489->getSurface()->getClipRect().y1 = 0; - _class489->getSurface()->getClipRect().x2 = 640; - _class489->getSurface()->getClipRect().y2 = _class401_2->getSurface()->getDrawRect().y + _class401_2->getSurface()->getDrawRect().height; + _class489->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2()); class489->setRepl(64, 0); } @@ -1515,16 +1491,10 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->processDelta(); setMessageList(0x004B8CB8); } - _class489->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; - _class489->getSurface()->getClipRect().y1 = 0; - _class489->getSurface()->getClipRect().x2 = 640; - _class489->getSurface()->getClipRect().y2 = 480; + _class489->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } - _klayman->getSurface()->getClipRect().x1 = _sprite1->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index f551911b3a..30e4631f23 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -210,47 +210,32 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) InsertKlayman(KmScene1705, 231, 434); setMessageList(0x004B69E8); sendMessage(this, 0x2000, 0); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 1) { InsertKlayman(KmScene1705, 431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A08); sendMessage(this, 0x2000, 1); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 2) { InsertKlayman(KmScene1705, 431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6AA0); sendMessage(this, 0x2000, 1); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 3) { InsertKlayman(KmScene1705, 431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A18); sendMessage(this, 0x2000, 1); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else { InsertKlayman(KmScene1705, 231, 74); sendMessage(_klayman, 0x2000, 0); setMessageList(0x004B69F0); sendMessage(this, 0x2000, 0); tempSprite = insertStaticSprite(0x30303822, 1100); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = tempSprite->getSurface()->getDrawRect().y; - _klayman->getSurface()->getClipRect().x2 = _sprite->getSurface()->getDrawRect().x + _sprite->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, tempSprite->getDrawRect().y, _sprite->getDrawRect().x2(), 480); } } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index b2e9a0ef5a..3977598726 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -133,10 +133,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setDoDeltaX(1); } - _klayman->getSurface()->getClipRect().x1 = _class401->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_class401->getDrawRect().x, 0, 640, 480); } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index a0db78829e..124ace634c 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -760,16 +760,16 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) } tempSprite = insertStaticSprite(0x030326A0, 1100); - _rect1.x1 = tempSprite->getSurface()->getDrawRect().x; + _rect1.x1 = tempSprite->getDrawRect().x; insertStaticSprite(0x811DA061, 1100); tempSprite = insertStaticSprite(0x11180022, 1100); - _rect2.x1 = tempSprite->getSurface()->getDrawRect().x; + _rect2.x1 = tempSprite->getDrawRect().x; tempSprite = insertStaticSprite(0x0D411130, 1100); - _rect1.y2 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; - _rect2.y1 = tempSprite->getSurface()->getDrawRect().y + tempSprite->getSurface()->getDrawRect().height; + _rect1.y2 = tempSprite->getDrawRect().y2(); + _rect2.y1 = tempSprite->getDrawRect().y2(); _doorLightSprite = insertStaticSprite(0xA4062212, 900); @@ -1366,15 +1366,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); _ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100); - _leftDoorClipRect.x1 = _ssSmallLeftDoor->getSurface()->getDrawRect().x; - _leftDoorClipRect.y1 = 0; - _leftDoorClipRect.x2 = 640; - _leftDoorClipRect.y2 = 480; - - _rightDoorClipRect.x1 = 0; - _rightDoorClipRect.y1 = 0; - _rightDoorClipRect.x2 = _ssSmallRightDoor->getSurface()->getDrawRect().x + _ssSmallRightDoor->getSurface()->getDrawRect().width; - _rightDoorClipRect.y2 = 480; + _leftDoorClipRect.set(_ssSmallLeftDoor->getDrawRect().x, 0, 640, 480); + _rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480); sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); @@ -1403,10 +1396,10 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x9A500914)) { _ssSmallLeftDoor->setVisible(false); - _klayman->getSurface()->getClipRect() = _rightDoorClipRect; + _klayman->setClipRect(_rightDoorClipRect); } else { _ssSmallRightDoor->setVisible(false); - _klayman->getSurface()->getClipRect() = _leftDoorClipRect; + _klayman->setClipRect(_leftDoorClipRect); } setRectList(0x004B8420); @@ -1445,10 +1438,10 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x4808: if (sender == _asLeftDoor) { _ssSmallLeftDoor->setVisible(true); - _klayman->getSurface()->getClipRect() = _leftDoorClipRect; + _klayman->setClipRect(_leftDoorClipRect); } else { _ssSmallRightDoor->setVisible(true); - _klayman->getSurface()->getClipRect() = _rightDoorClipRect; + _klayman->setClipRect(_rightDoorClipRect); } break; case 0x4826: @@ -1548,10 +1541,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _isKlaymanInLight = true; } - _klayman->getSurface()->getClipRect().x1 = _ssDoorFrame->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); loadDataResource(0x00144822); _klayman->setSoundFlag(true); @@ -1563,14 +1553,14 @@ void Scene2205::update() { if (!_isLightOn && getGlobalVar(0x4D080E54)) { _palette->addPalette(0x0008028D, 0, 256, 0); - _background->load(0x0008028D); + changeBackground(0x0008028D); _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); sendMessage(_ssDoorFrame, 0x2000, 0); changeMouseCursor(0x80289008); _isLightOn = true; } else if (_isLightOn && !getGlobalVar(0x4D080E54)) { _palette->addPalette(0xD00A028D, 0, 256, 0); - _background->load(0xD00A028D); + changeBackground(0xD00A028D); _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); sendMessage(_ssDoorFrame, 0x2000, 0); changeMouseCursor(0xA0289D08); @@ -1769,10 +1759,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x3406A333, 300); _sprite3 = insertStaticSprite(0x24A223A2, 100); _sprite4 = addSprite(new Class603(_vm, 0x26133023)); - _sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; - _sprite4->getSurface()->getClipRect().y1 = 0; - _sprite4->getSurface()->getClipRect().x2 = 640; - _sprite4->getSurface()->getClipRect().y2 = 480; + _sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8AF8); _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0)); insertMouse433(0x83212411); @@ -1784,10 +1771,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x020462E0, 300); _sprite3 = insertStaticSprite(0x900626A2, 100); _sprite4 = addSprite(new Class603(_vm, 0x544822A8)); - _sprite4->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; - _sprite4->getSurface()->getClipRect().y1 = 0; - _sprite4->getSurface()->getClipRect().x2 = 640; - _sprite4->getSurface()->getClipRect().y2 = 480; + _sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8B58); _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0)); insertMouse433(0x02A41E09); @@ -1795,10 +1779,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _class604 = addSprite(new Class604(_vm, 0x317831A0)); } - _class604->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; - _class604->getSurface()->getClipRect().y1 = 0; - _class604->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; - _class604->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; + _class604->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); setBackground(fileHash); @@ -1894,10 +1875,7 @@ void Scene2206::sub481950() { setSurfacePriority(_sprite2->getSurface(), 300); setSurfacePriority(_sprite3->getSurface(), 100); setSurfacePriority(_sprite4->getSurface(), 200); - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, 0, 640, 480); } void Scene2206::sub4819D0() { @@ -1909,10 +1887,7 @@ void Scene2206::sub4819D0() { setSurfacePriority(_sprite2->getSurface(), 1300); setSurfacePriority(_sprite3->getSurface(), 1100); setSurfacePriority(_sprite4->getSurface(), 1200); - _klayman->getSurface()->getClipRect().x1 = _sprite2->getSurface()->getDrawRect().x; - _klayman->getSurface()->getClipRect().y1 = 0; - _klayman->getSurface()->getClipRect().x2 = _sprite3->getSurface()->getDrawRect().x + _sprite3->getSurface()->getDrawRect().width; - _klayman->getSurface()->getClipRect().y2 = _sprite1->getSurface()->getDrawRect().y + _sprite1->getSurface()->getDrawRect().height; + _klayman->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); } void Scene2206::sub481B00() { @@ -2307,20 +2282,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0)); - _asLever->getSurface()->getClipRect().x1 = 0; - _asLever->getSurface()->getClipRect().y1 = 0; - _asLever->getSurface()->getClipRect().x2 = _ssMaskPart3->getSurface()->getDrawRect().x + _ssMaskPart3->getSurface()->getDrawRect().width; - _asLever->getSurface()->getClipRect().y2 = 480; - - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height; - - _asElevator->getSurface()->getClipRect().x1 = 0; - _asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; - _asElevator->getSurface()->getClipRect().x2 = 640; - _asElevator->getSurface()->getClipRect().y2 = _ssMaskPart2->getSurface()->getDrawRect().y + _ssMaskPart2->getSurface()->getDrawRect().height; + _asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480); + _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); + _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); } else { @@ -2342,15 +2306,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _asWallCannonAnimation = NULL; _ssButton = NULL; - _klayman->getSurface()->getClipRect().x1 = 0; - _klayman->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; - _klayman->getSurface()->getClipRect().x2 = 640; - _klayman->getSurface()->getClipRect().y2 = 480; - - _asElevator->getSurface()->getClipRect().x1 = 0; - _asElevator->getSurface()->getClipRect().y1 = _ssMaskPart1->getSurface()->getDrawRect().y; - _asElevator->getSurface()->getClipRect().x2 = 640; - _asElevator->getSurface()->getClipRect().y2 = 480; + _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); + _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index bcae32457e..fd11509cad 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -40,6 +40,9 @@ namespace Neverhood { #define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman) #define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) +#define InsertSprite(SpriteClass) (SpriteClass*)addSprite(new SpriteClass(_vm)); +#define InsertSpriteInitArgs(SpriteClass, InitArgs) (SpriteClass*)addSprite((new SpriteClass(_vm))-> init InitArgs); + class Scene : public Entity { public: Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); @@ -55,6 +58,8 @@ public: Background *addBackground(Background *background); void setBackground(uint32 fileHash, bool dirtyBackground = true); void changeBackground(uint32 fileHash); + void setBackgroundY(int16 y) { _background->getSurface()->getDrawRect().y = y; } + int16 getBackgroundY() { return _background->getSurface()->getDrawRect().y; } void setPalette(uint32 fileHash = 0); Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL); diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 9dc1d8bc7e..480e9e9299 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -98,6 +98,22 @@ int16 Sprite::defFilterY(int16 y) { return y; } +void Sprite::setClipRect(int16 x1, int16 y1, int16 x2, int16 y2) { + NRect &clipRect = _surface->getClipRect(); + clipRect.x1 = x1; + clipRect.y1 = y1; + clipRect.x2 = x2; + clipRect.y2 = y2; +} + +void Sprite::setClipRect(NRect& clipRect) { + _surface->getClipRect() = clipRect; +} + +void Sprite::setClipRect(NDrawRect& drawRect) { + setClipRect(drawRect.x, drawRect.y, drawRect.x2(), drawRect.y2()); +} + // StaticSprite StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 1c4008e911..59109d6900 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -58,6 +58,12 @@ public: void loadDataResource(uint32 fileHash); int16 defFilterY(int16 y); void setVisible(bool value) { _surface->setVisible(value); } + NDrawRect& getDrawRect() { return _surface->getDrawRect(); } + // Some shortcuts to set the clipRect + NRect& getClipRect() { return _surface->getClipRect(); } + void setClipRect(int16 x1, int16 y1, int16 x2, int16 y2); + void setClipRect(NRect& clipRect); + void setClipRect(NDrawRect& drawRect); protected: void (Sprite::*_spriteUpdateCb)(); Common::String _spriteUpdateCbName; // For debugging purposes -- cgit v1.2.3 From 9aff6337bcfa95ba6ef6c17c9e018470f81407b4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 20 Sep 2011 08:58:07 +0000 Subject: NEVERHOOD: Try to cleanup sprite creation with a templated insertSprite function (only in Module1000 so far) --- engines/neverhood/module1000.cpp | 60 +++++++++++++++++++--------------------- engines/neverhood/scene.h | 33 ++++++++++++++++++++-- engines/neverhood/sprite.h | 1 + 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index ddd3e0aef9..e160a7184d 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -372,28 +372,28 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(0xD217189D) == 0) { - _asDoor = addSprite(new AsScene1001Door(_vm)); + _asDoor = insertSprite(); _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); } else { _asDoor = NULL; } - _asLever = addSprite(new AsScene1001Lever(_vm, this, 150, 433, 1)); + _asLever = insertSprite(this, 150, 433, 1); insertStaticSprite(0x809861A6, 950); insertStaticSprite(0x89C03848, 1100); - _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x15288120, 100, 0)); + _ssButton = insertSprite(this, 0x15288120, 100, 0); if (getGlobalVar(0x03C698DA) == 0) { tempSprite = insertStaticSprite(0x8C066150, 200); - _asWindow = addSprite(new AsScene1001Window(_vm)); + _asWindow = insertSprite(); _asWindow->setClipRect(tempSprite->getDrawRect()); } else { _asWindow = NULL; } - _asHammer = addSprite(new AsScene1001Hammer(_vm, _asDoor)); + _asHammer = insertSprite(_asDoor); } @@ -516,7 +516,7 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); } - setClipRect(0, clipY1, 640, 480); + setClipRect(0, clipY1, 640, 480); _x = x; _y = y; @@ -1329,38 +1329,38 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x06149428, 1100); insertStaticSprite(0x312C8774, 1100); - _ssLadderArch = addSprite(new SsScene1002LadderArch(_vm, this)); + _ssLadderArch = insertSprite(this); _ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200); _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); - _class599 = addSprite(new Class599(_vm, this)); + _class599 = insertSprite(this); if (which < 0) { if (_vm->_gameState.field2 == 0) { InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4478); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; } else if (which == 2) { InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4298); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); @@ -1368,11 +1368,11 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(_klayman, 0x4820, 0); } else { InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); setMessageList(0x004B4470); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); - _class479 = addSprite(new Class479(_vm, this, _klayman)); + _class479 = insertSprite(this, _klayman); _class479->setClipRect(_klayman->getClipRect()); _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; @@ -1384,26 +1384,22 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2()); - _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 258, 191, _class599->getDrawRect().y, false)); - _asRing2 = addSprite(new AsScene1002Ring(_vm, this, false, 297, 189, _class599->getDrawRect().y, false)); - _asRing3 = addSprite(new AsScene1002Ring(_vm, this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0)); - _asRing4 = addSprite(new AsScene1002Ring(_vm, this, false, 334, 191, _class599->getDrawRect().y, false)); - _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 425, 184, _class599->getDrawRect().y, false)); - - _asDoor = addSprite(new AsScene1002Door(_vm, tempClipRect)); - - tempSprite = addSprite(new Class505(_vm)); - - _asDoorSpy = addSprite(new AsScene1002DoorSpy(_vm, tempClipRect, this, _asDoor, tempSprite)); - - _class426 = addSprite(new Class426(_vm, this, 0x00412692, 0x140B60BE, 800, 0)); - _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, false)); - + _asRing1 = insertSprite(this, false, 258, 191, _class599->getDrawRect().y, false); + _asRing2 = insertSprite(this, false, 297, 189, _class599->getDrawRect().y, false); + _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0); + _asRing4 = insertSprite(this, false, 334, 191, _class599->getDrawRect().y, false); + _asRing5 = insertSprite(this, false, 425, 184, _class599->getDrawRect().y, false); + + _asDoor = insertSprite(tempClipRect); + tempSprite = insertSprite(); + _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); + _class426 = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); + _asVenusFlyTrap = insertSprite(this, _klayman, false); _vm->_collisionMan->addSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); - _class506 = addSprite(new Class506(_vm)); + _class506 = insertSprite(); setRectList(0x004B43A0); @@ -1660,7 +1656,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) updatePaletteArea(); - _class478 = addSprite(new Class478(_vm, _klayman)); + _class478 = insertSprite(_klayman); insertStaticSprite(0x800034A0, 1100); insertStaticSprite(0x64402020, 1100); @@ -1670,7 +1666,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); _class478->setClipRect(_klayman->getClipRect()); - _asTrashCan = addSprite(new AsScene1004TrashCan(_vm)); + _asTrashCan = insertSprite(); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index fd11509cad..d0decd2c49 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -40,8 +40,8 @@ namespace Neverhood { #define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman) #define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) -#define InsertSprite(SpriteClass) (SpriteClass*)addSprite(new SpriteClass(_vm)); -#define InsertSpriteInitArgs(SpriteClass, InitArgs) (SpriteClass*)addSprite((new SpriteClass(_vm))-> init InitArgs); +#define InsertSprite(SpriteObj, SpriteClass) SpriteObj = (SpriteClass*)addSprite(new SpriteClass(_vm)); +#define InsertSpriteInitArgs(SpriteObj, SpriteClass, InitArgs) SpriteObj = new SpriteClass(_vm); ((SpriteClass*)(SpriteObj))-> init InitArgs; addSprite(SpriteObj) class Scene : public Entity { public: @@ -69,6 +69,35 @@ public: void changeMouseCursor(uint32 fileHash); SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); + // Some crazy templated functions to make the logic code smaller/simpler (imo!) + template + T* insertSprite() { + return (T*)addSprite(new T(_vm)); + } + template + T* insertSprite(Arg1 arg1) { + return (T*)addSprite(new T(_vm, arg1)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2) { + return (T*)addSprite(new T(_vm, arg1, arg2)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5)); + } + template + T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { + return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6)); + } protected: Module *_parentModule; Common::Array _entities; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 59109d6900..10ebc197b3 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -40,6 +40,7 @@ class Sprite : public Entity { public: Sprite(NeverhoodEngine *vm, int objectPriority); ~Sprite(); + void init() {} BaseSurface *getSurface() { return _surface; } void processDelta(); void setDoDeltaX(int type); -- cgit v1.2.3 From abf78e07eee50df3bd588c924d3c2ddf35a0e956 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 20 Sep 2011 09:39:24 +0000 Subject: NEVERHOOD: Replace InsertKlayman macros with template functions (still weird but nicer) --- engines/neverhood/gamemodule.cpp | 4 +-- engines/neverhood/klayman.cpp | 23 +++----------- engines/neverhood/klayman.h | 10 ++---- engines/neverhood/module1000.cpp | 30 +++++++++--------- engines/neverhood/module1200.cpp | 16 +++++----- engines/neverhood/module1300.cpp | 40 ++++++++++++------------ engines/neverhood/module1400.cpp | 30 +++++++++--------- engines/neverhood/module1700.cpp | 12 ++++---- engines/neverhood/module2000.cpp | 10 +++--- engines/neverhood/module2200.cpp | 66 ++++++++++++++++++++-------------------- engines/neverhood/scene.cpp | 4 +++ engines/neverhood/scene.h | 37 ++++++++++++++++++---- 12 files changed, 147 insertions(+), 135 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 8cdd98ed32..3beb32580f 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -270,8 +270,8 @@ void GameModule::startup() { createModule(1000, -1); #endif #if 1 - _vm->gameState().sceneNum = 12; - createModule(3000, -1); + _vm->gameState().sceneNum = 1; + createModule(1000, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index b5d266e30f..4d4d9c4aa4 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2115,19 +2115,14 @@ uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶ // KmScene1002 -KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), +KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch) + : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _class599(class599), _ssLadderArch(ssLadderArch), _status(0) { setKlaymanTable1(); } -void KmScene1002::init(Sprite *class599, Sprite *ssLadderArch) { - _class599 = class599; - _ssLadderArch = ssLadderArch; -} - void KmScene1002::xUpdate() { if (_x >= 250 && _x <= 435 && _y >= 420) { if (_status == 0) { @@ -2694,18 +2689,14 @@ void KmScene1004::sub478170() { // KmScene1201 -KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) { +KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464) + : Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) { // TODO setKlaymanTable(dword_4AEF10, 3); _flagF6 = true; } -void KmScene1201::init(Entity *class464) { - _class464 = class464; -} - uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: @@ -3878,7 +3869,7 @@ void KmScene2001::sub440270() { SetMessageHandler(&KmScene2001::handleMessage4401A0); } -KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) // TODO: NRect *rect1, int16 unk in Klayman ctor : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -3886,10 +3877,6 @@ KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 _flagF6 = false; } -void KmScene2201::init(NRect *clipRects, int clipRectsCount) { - // TODO -} - uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3f15b8fb28..a4d355726b 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -44,7 +44,6 @@ struct KlaymanTableItem { class Klayman : public AnimatedSprite { public: Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); - void init() { } void update(); @@ -262,8 +261,7 @@ protected: class KmScene1002 : public Klayman { public: - KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); - void init(Sprite *class599, Sprite *ssLadderArch); + KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch); protected: Sprite *_class599; Sprite *_ssLadderArch; @@ -309,8 +307,7 @@ protected: class KmScene1201 : public Klayman { public: - KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); - void init(Entity *class464); + KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464); protected: Entity *_class464; int _countdown; @@ -431,8 +428,7 @@ protected: class KmScene2201 : public Klayman { public: - KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); - void init(NRect *clipRects, int clipRectsCount); + KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index e160a7184d..14bc4a41ea 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -338,7 +338,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1001::handleMessage); - _vm->_collisionMan->setHitRects(0x004B4860); + setHitRects(0x004B4860); _surfaceFlag = false; setBackground(0x4086520E); setPalette(0x4086520E); @@ -346,24 +346,24 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { setRectList(0x004B49F0); - InsertKlayman(KmScene1001, 200, 433); + insertKlayman(200, 433); setMessageList(0x004B4888); } else if (which == 1) { setRectList(0x004B49F0); - InsertKlayman(KmScene1001, 640, 433); + insertKlayman(640, 433); setMessageList(0x004B4898); } else if (which == 2) { setRectList(0x004B49F0); if (getGlobalVar(0xC0418A02)) { - InsertKlayman(KmScene1001, 390, 433); + insertKlayman(390, 433); _klayman->setDoDeltaX(1); } else { - InsertKlayman(KmScene1001, 300, 433); + insertKlayman(300, 433); } setMessageList(0x004B4970); } else { setRectList(0x004B4A00); - InsertKlayman(KmScene1001, 200, 433); + insertKlayman(200, 433); setMessageList(0x004B4890); } @@ -1317,7 +1317,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1002::update); SetMessageHandler(&Scene1002::handleMessage); - _vm->_collisionMan->setHitRects(0x004B4138); + setHitRects(0x004B4138); _surfaceFlag = true; @@ -1338,28 +1338,28 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { if (_vm->_gameState.field2 == 0) { - InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); + insertKlayman(90, 226, _class599, _ssLadderArch); _class478 = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { - InsertKlaymanInitArgs(KmScene1002, 379, 435, (_class599, _ssLadderArch)); + insertKlayman(379, 435, _class599, _ssLadderArch); _class478 = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { - InsertKlaymanInitArgs(KmScene1002, 650, 435, (_class599, _ssLadderArch)); + insertKlayman(650, 435, _class599, _ssLadderArch); _class478 = insertSprite(_klayman); setMessageList(0x004B4478); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _class478->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; } else if (which == 2) { - InsertKlaymanInitArgs(KmScene1002, 68, 645, (_class599, _ssLadderArch)); + insertKlayman(68, 645, _class599, _ssLadderArch); _class478 = insertSprite(_klayman); setMessageList(0x004B4298); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); @@ -1367,7 +1367,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_gameState.field2 = 1; sendMessage(_klayman, 0x4820, 0); } else { - InsertKlaymanInitArgs(KmScene1002, 90, 226, (_class599, _ssLadderArch)); + insertKlayman(90, 226, _class599, _ssLadderArch); _class478 = insertSprite(_klayman); setMessageList(0x004B4470); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); @@ -1642,15 +1642,15 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { setRectList(0x004B7C70); - InsertKlayman(KmScene1004, 330, 327); + insertKlayman(330, 327); setMessageList(0x004B7C18); } else if (which == 1) { setRectList(0x004B7C70); - InsertKlayman(KmScene1004, 330, 327); + insertKlayman(330, 327); setMessageList(0x004B7C08); } else { loadDataResource(0x01900A04); - InsertKlayman(KmScene1004, _dataResource.getPoint(0x80052A29).x, 27); + insertKlayman(_dataResource.getPoint(0x80052A29).x, 27); setMessageList(0x004B7BF0); } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 62462fc649..9c84950a2b 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -753,7 +753,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1201::update); SetMessageHandler(&Scene1201::handleMessage); - _vm->_collisionMan->setHitRects(0x004AEBD0); + setHitRects(0x004AEBD0); _surfaceFlag = true; @@ -797,29 +797,29 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) debug("Scene1201: which = %d", which); if (which < 0) { - InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464)); + insertKlayman(364, 333, class464); setMessageList(0x004AEC08); } else if (which == 3) { - InsertKlaymanInitArgs(KmScene1201, 400, 329, (class464)); + insertKlayman(400, 329, class464); setMessageList(0x004AEC08); } else if (which == 2) { if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { - InsertKlaymanInitArgs(KmScene1201, 374, 333, (class464)); + insertKlayman(374, 333, class464); setMessageList(0x004AEC08); } else { - InsertKlaymanInitArgs(KmScene1201, 640, 329, (class464)); + insertKlayman(640, 329, class464); setMessageList(0x004AEC20); } } else if (which == 1) { if (getGlobalVar(0xC0418A02)) { - InsertKlaymanInitArgs(KmScene1201, 364, 333, (class464)); + insertKlayman(364, 333, class464); _klayman->setDoDeltaX(1); } else { - InsertKlaymanInitArgs(KmScene1201, 246, 333, (class464)); + insertKlayman(246, 333, class464); } setMessageList(0x004AEC30); } else { - InsertKlaymanInitArgs(KmScene1201, 0, 336, (class464)); + insertKlayman(0, 336, class464); setMessageList(0x004AEC10); } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 48a8b54e66..4876135cef 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -417,7 +417,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _soundResource(vm) { SetMessageHandler(&Scene1302::handleMessage); - _vm->_collisionMan->setHitRects(0x004B0858); + setHitRects(0x004B0858); setRectList(0x004B0A38); setBackground(0x420643C4); @@ -441,10 +441,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); if (which < 0) { - InsertKlaymanInitArgs(KmScene1002, 380, 364, (_class595, NULL)); + insertKlayman(380, 364, _class595, (Sprite*)NULL); setMessageList(0x004B0868); } else { - InsertKlaymanInitArgs(KmScene1002, 293, 330, (_class595, NULL)); + insertKlayman(293, 330, _class595, (Sprite*)NULL); setMessageList(0x004B0870); } @@ -649,7 +649,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0xA014216B, 1100); - InsertKlayman(KmScene1303, 207, 332); + insertKlayman(207, 332); setMessageList(0x004AF9A0); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); @@ -730,10 +730,10 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x090AF033, 1100); if (which < 0) { - InsertKlayman(KmScene1304, 217, 347); + insertKlayman(217, 347); setMessageList(0x004B90E8); } else { - InsertKlayman(KmScene1304, 100, 347); + insertKlayman(100, 347); setMessageList(0x004B90F0); } @@ -778,10 +778,10 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x01B60280); if (which < 0) { - InsertKlayman(KmScene1305, 212, 441); + insertKlayman(212, 441); setMessageList(0x004B6E40); } else { - InsertKlayman(KmScene1305, 212, 441); + insertKlayman(212, 441); setMessageList(0x004B6E48); } @@ -913,45 +913,45 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x00042313, 1100); if (which < 0) { - InsertKlayman(KmScene1306, 380, 440); + insertKlayman(380, 440); setMessageList(0x004AFAD0); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 1) { - InsertKlayman(KmScene1306, 136, 440); + insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFAF0); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - InsertKlayman(KmScene1306, 515, 440); + insertKlayman(515, 440); _klayman->setDoDeltaX(1); } else { - InsertKlayman(KmScene1306, 355, 440); + insertKlayman(355, 440); } setMessageList(0x004AFBC8); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 3) { - InsertKlayman(KmScene1306, 534, 440); + insertKlayman(534, 440); setMessageList(0x004AFC30); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 4) { - InsertKlayman(KmScene1306, 136, 440); + insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFC38); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 5) { - InsertKlayman(KmScene1306, 136, 440); + insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFB00); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else { - InsertKlayman(KmScene1306, 286, 408); + insertKlayman(286, 408); setSurfacePriority(_asElevator->getSurface(), 1100); setSurfacePriority(_asElevatorDoor->getSurface(), 1090); setSurfacePriority(_sprite1->getSurface(), 1080); @@ -1621,7 +1621,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _sprite4 = NULL; if (which < 0) { - InsertKlayman(KmScene1308, 380, 440); + insertKlayman(380, 440); setMessageList(0x004B57C0); if (getGlobalVar(0x80455A41)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1631,7 +1631,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else if (which == 1) { - InsertKlayman(KmScene1308, 640, 440); + insertKlayman(640, 440); setMessageList(0x004B57C8); if (getGlobalVar(0x80455A41)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1641,7 +1641,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else if (which == 2) { - InsertKlayman(KmScene1308, 475, 440); + insertKlayman(475, 440); setMessageList(0x004B58B0); if (getGlobalVar(0x80455A41)) { _sprite5 = addSprite(new Class592(_vm, this)); @@ -1652,7 +1652,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else { - InsertKlayman(KmScene1308, 41, 440); + insertKlayman(41, 440); setMessageList(0x004B57D0); sendMessage(_class549, 0x4808, 0); _sprite1->setVisible(false); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 7bff2940c8..b1354584b0 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -683,19 +683,19 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2->setVisible(false); if (which < 0) { - InsertKlayman(KmScene1401, 380, 447); + insertKlayman(380, 447); setMessageList(0x004B65C8); _sprite1->setVisible(false); } else if (which == 1) { - InsertKlayman(KmScene1401, 0, 447); + insertKlayman(0, 447); setMessageList(0x004B65D0); _sprite1->setVisible(false); } else if (which == 2) { - InsertKlayman(KmScene1401, 660, 447); + insertKlayman(660, 447); setMessageList(0x004B65D8); _sprite1->setVisible(false); } else { - InsertKlayman(KmScene1401, 290, 413); + insertKlayman(290, 413); setMessageList(0x004B65E8); _sprite1->setVisible(false); } @@ -892,16 +892,16 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B0C98); if (which < 0) { - InsertKlayman(KmScene1402, 377, 391); + insertKlayman(377, 391); setMessageList(0x004B0B48); if (!getGlobalVar(0x70A1189C)) { _class482 = addSprite(new Class482(_vm, this, 0)); } } else if (which == 1) { - InsertKlayman(KmScene1402, 42, 391); + insertKlayman(42, 391); setMessageList(0x004B0B50); } else if (which == 2) { - InsertKlayman(KmScene1402, 377, 391); + insertKlayman(377, 391); setMessageList(0x004B0B60); _klayman->setDoDeltaX(1); if (getGlobalVar(0x70A1189C)) { @@ -913,7 +913,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _class482 = addSprite(new Class482(_vm, this, 0)); } } else { - InsertKlayman(KmScene1402, 513, 391); + insertKlayman(513, 391); setMessageList(0x004B0B58); if (!getGlobalVar(0x70A1189C)) { _class482 = addSprite(new Class482(_vm, this, 2)); @@ -1351,10 +1351,10 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _asTape2->setRepl(64, 0); if (which < 0) { - InsertKlayman(KmScene1403, 380, 463); + insertKlayman(380, 463); setMessageList(0x004B1F18); } else { - InsertKlayman(KmScene1403, 640, 463); + insertKlayman(640, 463); setMessageList(0x004B1F20); } _klayman->setRepl(64, 0); @@ -1464,21 +1464,21 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); if (which < 0) { - InsertKlayman(KmScene1404, 376, 406); + insertKlayman(376, 406); setMessageList(0x004B8C28); } else if (which == 1) { - InsertKlayman(KmScene1404, 376, 406); + insertKlayman(376, 406); setMessageList(0x004B8C30); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - InsertKlayman(KmScene1404, 347, 406); + insertKlayman(347, 406); _klayman->setDoDeltaX(1); } else { - InsertKlayman(KmScene1404, 187, 406); + insertKlayman(187, 406); } setMessageList(0x004B8D28); } else { - InsertKlayman(KmScene1404, 30, 406); + insertKlayman(30, 406); setMessageList(0x004B8C38); } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 30e4631f23..9547d3447c 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -182,7 +182,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1705::handleMessage); SetUpdateHandler(&Scene1705::update); - _vm->_collisionMan->setHitRects(0x004B69D8); + setHitRects(0x004B69D8); _surfaceFlag = true; @@ -207,30 +207,30 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) which = 4; if (which < 0) { - InsertKlayman(KmScene1705, 231, 434); + insertKlayman(231, 434); setMessageList(0x004B69E8); sendMessage(this, 0x2000, 0); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 1) { - InsertKlayman(KmScene1705, 431, 434); + insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A08); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 2) { - InsertKlayman(KmScene1705, 431, 434); + insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6AA0); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 3) { - InsertKlayman(KmScene1705, 431, 434); + insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A18); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else { - InsertKlayman(KmScene1705, 231, 74); + insertKlayman(231, 74); sendMessage(_klayman, 0x2000, 0); setMessageList(0x004B69F0); sendMessage(this, 0x2000, 0); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 3977598726..b870d823ec 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -108,26 +108,26 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) _class401 = insertStaticSprite(0x0D641724, 1100); if (which < 0) { - InsertKlayman(KmScene2001, 300, 345); + insertKlayman(300, 345); setMessageList(0x004B3538); sendMessage(this, 0x2000, 0); } else if (which == 1) { - InsertKlayman(KmScene2001, 116, 345); + insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3540); sendMessage(this, 0x2000, 1); } else if (which == 2) { - InsertKlayman(KmScene2001, 116, 345); + insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B35F0); sendMessage(this, 0x2000, 1); } else if (which == 3) { - InsertKlayman(KmScene2001, 116, 345); + insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3550); sendMessage(this, 0x2000, 1); } else { - InsertKlayman(KmScene2001, 390, 345); + insertKlayman(390, 345); setMessageList(0x004B3530); sendMessage(this, 0x2000, 0); _klayman->setDoDeltaX(1); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 124ace634c..59dcbfc127 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -774,25 +774,25 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _doorLightSprite = insertStaticSprite(0xA4062212, 900); if (which < 0) { - InsertKlaymanInitArgs(KmScene2201, 300, 427, (&_rect1, 2)); + insertKlayman(300, 427, &_rect1, 2); setMessageList(0x004B8118); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); } else if (which == 1) { - InsertKlaymanInitArgs(KmScene2201, 412, 393, (&_rect1, 2)); + insertKlayman(412, 393, &_rect1, 2); setMessageList(0x004B8130); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - InsertKlaymanInitArgs(KmScene2201, 379, 427, (&_rect1, 2)); + insertKlayman(379, 427, &_rect1, 2); _klayman->setDoDeltaX(1); } else { - InsertKlaymanInitArgs(KmScene2201, 261, 427, (&_rect1, 2)); + insertKlayman(261, 427, &_rect1, 2); } setMessageList(0x004B8178); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); } else { NPoint pt = _dataResource.getPoint(0x0304D8DC); - InsertKlaymanInitArgs(KmScene2201, pt.x, pt.y, (&_rect1, 2)); + insertKlayman(pt.x, pt.y, &_rect1, 2); setMessageList(0x004B8120); _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true)); } @@ -1350,7 +1350,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x82C80334); insertMouse433(0x80330824); - _vm->_collisionMan->setHitRects(0x004B8320); + setHitRects(0x004B8320); if (getGlobalVar(0x13382860) == 1) { _class545 = addSprite(new Class545(_vm, this, 2, 1100, 282, 432)); @@ -1376,21 +1376,21 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asRightDoor); if (which < 0) { - InsertKlayman(KmScene2203, 200, 427); + insertKlayman(200, 427); setMessageList(0x004B8340); } else if (which == 1) { - InsertKlayman(KmScene2203, 640, 427); + insertKlayman(640, 427); setMessageList(0x004B8350); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - InsertKlayman(KmScene2203, 362, 427); + insertKlayman(362, 427); _klayman->setDoDeltaX(1); } else { - InsertKlayman(KmScene2203, 202, 427); + insertKlayman(202, 427); } setMessageList(0x004B8358); } else { - InsertKlayman(KmScene2203, 0, 427); + insertKlayman(0, 427); setMessageList(0x004B8348); } @@ -1496,7 +1496,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2205::handleMessage); SetUpdateHandler(&Scene2205::update); - _vm->_collisionMan->setHitRects(0x004B0620); + setHitRects(0x004B0620); _surfaceFlag = true; if (getGlobalVar(0x4D080E54)) { @@ -1522,21 +1522,21 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm)); if (which < 0) { - InsertKlayman(KmScene2205, 320, 417); + insertKlayman(320, 417); setMessageList(0x004B0658); if (!getGlobalVar(0x4D080E54)) { _palette->addPalette(0x68033B1C, 0, 65, 0); } _isKlaymanInLight = false; } else if (which == 1) { - InsertKlayman(KmScene2205, 640, 417); + insertKlayman(640, 417); setMessageList(0x004B0648); if (!getGlobalVar(0x4D080E54)) { _palette->addPalette(0x68033B1C, 0, 65, 0); } _isKlaymanInLight = false; } else { - InsertKlayman(KmScene2205, 0, 417); + insertKlayman(0, 417); setMessageList(0x004B0640); _isKlaymanInLight = true; } @@ -1795,24 +1795,24 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_class607); if (which < 0) { - InsertKlayman(KmScene2206, 200, 430); + insertKlayman(200, 430); setMessageList(0x004B88A8); } else if (which == 1) { - InsertKlayman(KmScene2206, 640, 430); + insertKlayman(640, 430); setMessageList(0x004B88B8); } else if (which == 2) { - InsertKlayman(KmScene2206, 205, 396); + insertKlayman(205, 396); setMessageList(0x004B88C8); _palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0); sub4819D0(); _soundResource.play(0x53B8284A); } else if (which == 3) { - InsertKlayman(KmScene2206, kScene2206XPositions[getGlobalVar(0x48A68852)], 430); + insertKlayman(kScene2206XPositions[getGlobalVar(0x48A68852)], 430); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); setMessageList(0x004B8A70); } else { - InsertKlayman(KmScene2206, 0, 430); + insertKlayman(0, 430); setMessageList(0x004B88B0); } @@ -2251,7 +2251,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2207::update); _surfaceFlag = true; - InsertKlayman(KmScene2207, 0, 0); + insertKlayman(0, 0); _klayman->setRepl(64, 0); setMessageList(0x004B38E8); @@ -2673,18 +2673,18 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); if (which < 0) { - InsertKlayman(KmScene2242, 200, 430); + insertKlayman(200, 430); setMessageList(0x004B3C18); } else if (which == 1) { - InsertKlayman(KmScene2242, 530, 430); + insertKlayman(530, 430); setMessageList(0x004B3D60); } else if (which == 2) { - InsertKlayman(KmScene2242, kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430); + insertKlayman(kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430); setMessageList(0x004B3D48); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); } else { - InsertKlayman(KmScene2242, 0, 430); + insertKlayman(0, 430); setMessageList(0x004B3C20); } @@ -2802,18 +2802,18 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule } if (which < 0) { - InsertKlayman(KmHallOfRecords, 200, 430); + insertKlayman(200, 430); setMessageList(0x004B2900); } else if (which == 1) { - InsertKlayman(KmHallOfRecords, 640, 430); + insertKlayman(640, 430); setMessageList(0x004B2910); } else if (which == 2) { - InsertKlayman(KmHallOfRecords, kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430); + insertKlayman(kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430); setMessageList(0x004B2B70); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); } else { - InsertKlayman(KmHallOfRecords, 0, 430); + insertKlayman(0, 430); setMessageList(0x004B2908); } @@ -2897,18 +2897,18 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) } if (which < 0) { - InsertKlayman(KmScene2247, 200, 430); + insertKlayman(200, 430); setMessageList(0x004B5428); } else if (which == 1) { - InsertKlayman(KmScene2247, 640, 430); + insertKlayman(640, 430); setMessageList(0x004B5438); } else if (which == 2) { - InsertKlayman(KmScene2247, kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430); + insertKlayman(kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430); if (getGlobalVar(0xC0418A02)) _klayman->setDoDeltaX(1); setMessageList(0x004B5530); } else { - InsertKlayman(KmScene2247, 0, 430); + insertKlayman(0, 430); setMessageList(0x004B5430); } diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index f1ee55420a..8d7fc787ec 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -191,6 +191,10 @@ void Scene::setPalette(uint32 fileHash) { _palette->usePalette(); } +void Scene::setHitRects(uint32 id) { + _vm->_collisionMan->setHitRects(id); +} + Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { return addSprite(new StaticSprite(_vm, fileHash, surfacePriority)); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index d0decd2c49..09d34b5734 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -37,12 +37,6 @@ namespace Neverhood { -#define InsertKlayman(KlaymanClass, X, Y) _klayman = new KlaymanClass(_vm, this, X, Y); addSprite(_klayman) -#define InsertKlaymanInitArgs(KlaymanClass, X, Y, InitArgs) _klayman = new KlaymanClass(_vm, this, X, Y); ((KlaymanClass*)_klayman)->init InitArgs; addSprite(_klayman) - -#define InsertSprite(SpriteObj, SpriteClass) SpriteObj = (SpriteClass*)addSprite(new SpriteClass(_vm)); -#define InsertSpriteInitArgs(SpriteObj, SpriteClass, InitArgs) SpriteObj = new SpriteClass(_vm); ((SpriteClass*)(SpriteObj))-> init InitArgs; addSprite(SpriteObj) - class Scene : public Entity { public: Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); @@ -61,6 +55,7 @@ public: void setBackgroundY(int16 y) { _background->getSurface()->getDrawRect().y = y; } int16 getBackgroundY() { return _background->getSurface()->getDrawRect().y; } void setPalette(uint32 fileHash = 0); + void setHitRects(uint32 id); Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL); void insertMouse435(uint32 fileHash, int16 x1, int16 x2); @@ -70,6 +65,36 @@ public: SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); // Some crazy templated functions to make the logic code smaller/simpler (imo!) + // insertKlayman + template + void insertKlayman() { + _klayman = (T*)addSprite(new T(_vm, this)); + } + template + void insertKlayman(Arg1 arg1) { + _klayman = (T*)addSprite(new T(_vm, this, arg1)); + } + template + void insertKlayman(Arg1 arg1, Arg2 arg2) { + _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2)); + } + template + void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3) { + _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3)); + } + template + void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) { + _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4)); + } + template + void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) { + _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5)); + } + template + void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { + _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5, arg6)); + } + // insertSprite template T* insertSprite() { return (T*)addSprite(new T(_vm)); -- cgit v1.2.3 From 3872efe2a50a881cf4c2f778bee408982a52487e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 20 Sep 2011 18:04:06 +0000 Subject: NEVERHOOD: Start with Module1100 and add Scene1105 --- engines/neverhood/entity.h | 3 + engines/neverhood/gamemodule.cpp | 11 +- engines/neverhood/module.cpp | 9 + engines/neverhood/module.h | 1 + engines/neverhood/module.mk | 1 + engines/neverhood/module1100.cpp | 663 +++++++++++++++++++++++++++++++++++++ engines/neverhood/module1100.h | 128 +++++++ engines/neverhood/module2200.cpp | 307 +++-------------- engines/neverhood/smackerscene.cpp | 2 +- engines/neverhood/smackerscene.h | 4 +- 10 files changed, 859 insertions(+), 270 deletions(-) create mode 100644 engines/neverhood/module1100.cpp create mode 100644 engines/neverhood/module1100.h diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 924a7a778b..9256c13ba8 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -131,6 +131,9 @@ public: void incGlobalVar(uint32 nameHash, int incrValue) { setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue); } + void incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) { + setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue); + } protected: void (Entity::*_updateHandlerCb)(); uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 3beb32580f..c6dc006a8d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -24,6 +24,7 @@ #include "neverhood/graphics.h" #include "neverhood/module1000.h" +#include "neverhood/module1100.h" #include "neverhood/module1200.h" #include "neverhood/module1300.h" #include "neverhood/module1400.h" @@ -269,10 +270,14 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(1000, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif +#if 1 + _vm->gameState().sceneNum = 4; + createModule(1100, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -283,6 +288,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x03294419); _childObject = new Module1000(_vm, this, which); break; + case 1100: + setGlobalVar(0x91080831, 0x0002C818); + _childObject = new Module1100(_vm, this, which); + break; case 1200: setGlobalVar(0x91080831, 0x00478311); _childObject = new Module1200(_vm, this, which); diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index c58c924c3a..79197ed04b 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -84,6 +84,15 @@ void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, _childObject = smackerScene; } +void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort) { + SmackerScene *smackerScene; + _sceneType = kSceneTypeSmacker; + smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort); + smackerScene->setFileHashList(fileHashList); + smackerScene->nextVideo(); + _childObject = smackerScene; +} + bool Module::updateChild() { if (_childObject) { _childObject->handleUpdate(); diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index c0fdaa79b5..2f6ce69d3a 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -60,6 +60,7 @@ protected: NavigationScene *navigationScene(); void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); + void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort); bool updateChild(); }; diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 1b4d6e4dc3..bbbbb02c01 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS = \ klayman.o \ module.o \ module1000.o \ + module1100.o \ module1200.o \ module1300.o \ module1400.o \ diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp new file mode 100644 index 0000000000..3ee3f4c3b3 --- /dev/null +++ b/engines/neverhood/module1100.cpp @@ -0,0 +1,663 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1100.h" +#include "neverhood/gamemodule.h" + +namespace Neverhood { + +Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 1) { + createScene(9, 1); + } else { + createScene(9, 3); + } + + // TODO Sound1ChList_addSoundResources(0x2C818, dword_4B85B0, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B85B0, true, 50, 600, 20, 250); + // TODO Sound1ChList_setSoundValues(0x74E01054, false, 100, 200, 10, 20); + // TODO Sound1ChList_setVolume(0x74E01054, 60); + // TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F); + +} + +Module1100::~Module1100() { + // TODO Sound1ChList_sub_407A50(0x2C818); +} + +void Module1100::createScene(int sceneNum, int which) { + static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0}; + static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0}; + debug("Module1100::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _countdown = 65; + createNavigationScene(0x004B8430, which); + break; + case 1: + _countdown = 50; + createNavigationScene(0x004B8460, which); + break; + case 2: + if (getGlobalVar(0x610210B7)) { + createNavigationScene(0x004B84F0, which); + } else { + createNavigationScene(0x004B8490, which); + } + break; + case 3: + if (getGlobalVar(0x610210B7)) { + createNavigationScene(0x004B8580, which); + } else { + createNavigationScene(0x004B8550, which); + } + break; + case 4: + _childObject = new Scene1105(_vm, this, which); + break; + case 5: + if (getGlobalVar(0x610210B7)) + createSmackerScene(0x04180001, true, false, false); + else + createSmackerScene(0x04180007, true, false, false); + break; + case 6: + // TODO Sound1ChList_sub_407AF0(0x2C818); + createSmackerScene(kSmackerFileHashList06, true, true, false); + break; + case 7: + // TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0); + createSmackerScene(kSmackerFileHashList07, true, true, false); + break; + case 8: +//TODO _childObject = new Scene1109(_vm, this, which); + break; + case 1002: + _countdown = 40; + // TODO Sound1ChList_sub_4080B0(true); + createSmackerScene(0x00012211, true, true, false); + break; + } + SetUpdateHandler(&Module1100::updateScene); + _childObject->handleUpdate(); +} + +void Module1100::updateScene() { + if (!updateChild()) { + debug("_vm->gameState().sceneNum = %d", _vm->gameState().sceneNum); + switch (_vm->gameState().sceneNum) { + case 0: + _countdown = 0; + // TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64); + // TODO Sound1ChList_setVolume(0x48498E46, 65); + // TODO Sound1ChList_setVolume(0x50399F64, 65); + if (_moduleResult == 0) { + createScene(1, 0); + } else if (_moduleResult == 1) { + createScene(8, 0); + } + break; + case 1: + // TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F); + if (getGlobalVar(0x0C0288F4)) { + if (_moduleResult == 0) { + createScene(6, -1); + } else if (_moduleResult == 1) { + createScene(0, 1); + } + } else { + if (_moduleResult == 0) { + createScene(2, 0); + } else if (_moduleResult == 1) { + createScene(0, 1); + } + } + break; + case 2: + // TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0); + if (_navigationAreaType == 3) { + createScene(7, -1); + } else if (_moduleResult == 1) { + createScene(3, 0); + } else if (_moduleResult == 2) { + createScene(1002, -1); + } + break; + case 3: + if (_moduleResult == 0) { + createScene(4, 0); + } else if (_moduleResult == 1) { + createScene(2, 3); + } + break; + case 4: + if (_moduleResult == 0) { + createScene(3, 0); + } else if (_moduleResult == 1) { + createScene(5, -1); + } + break; + case 5: + if (getGlobalVar(0x610210B7)) { + createScene(3, 0); + } else { + createScene(4, 0); + } + break; + case 6: + sendMessage(_parentModule, 0x1009, 1); + break; + case 7: + createScene(2, 2); + break; + case 8: + if (_moduleResult == 0) { + createScene(0, 0); + } else if (_moduleResult == 1) { + sendMessage(_parentModule, 0x1009, 0); + } + break; + case 1002: + _countdown = 0; + // TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64, 0); + createScene(1, 1); + break; + } + } else { + switch (_vm->gameState().sceneNum) { + case 0: +#if 0 // TODO + if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { + Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64); + Sound1ChList_setVolume(0x48498E46, 65); + Sound1ChList_setVolume(0x50399F64, 65); + } +#endif + break; + case 1: +#if 0 // TODO + if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { + Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F); + } +#endif + break; + case 2: + // TODO Sound1ChList_setSoundValues(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0); + break; + case 5: + case 6: + case 7: + case 1002: + if (_countdown != 0 && (--_countdown == 0)) { + // TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64); + // TODO Sound1ChList_setVolume(0x48498E46, 65); + // TODO Sound1ChList_setVolume(0x50399F64, 65); + } + break; + } + } +} + +static const uint32 kScene1105FileHashes[] = { + 0x00028006, + 0x0100A425, + 0x63090415, + 0x082100C4, + 0x0068C607, + 0x00018344, + 0x442090E4, + 0x0400E004, + 0x5020A054, + 0xB14A891E +}; + +static const uint32 kScene1105BackgroundFileHashes[] = { + 0x20018662, + 0x20014202, + 0x20012202, + 0x20010002 // CHECKME: This used ?? +}; + +static const uint32 kSsScene1105SymbolDieFileHashes[] = { + 0, + 0x90898414, + 0x91098414, + 0x92098414, + 0x94098414, + 0x98098414, + 0x80098414, + 0xB0098414, + 0xD0098414, + 0x10098414 +}; + +SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect) + : StaticSprite(vm, fileHash, 200), _soundResource(vm), _parentScene(parentScene), + _countdown(0) { + + _rect = rect; + SetMessageHandler(&SsScene1105Button::handleMessage); + SetUpdateHandler(&SsScene1105Button::update); + setVisible(false); +} + +void SsScene1105Button::update() { + if (_countdown != 0 && (--_countdown == 0)) { + sendMessage(_parentScene, 0x4807, 0); + setVisible(false); + } +} + +uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + } + break; + case 0x480B: + _countdown = 8; + setVisible(true); + _soundResource.play(0x44141000); + break; + } + return messageResult; +} + +SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y) + : StaticSprite(vm, fileHash, 200) { + + _x = x; + _y = y; + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -(_spriteResource.getDimensions().height / 2); + StaticSprite::update(); +} + +void SsScene1105Symbol::hide() { + setVisible(false); + _needRefresh = true; + StaticSprite::update(); +} + +SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y) + : StaticSprite(vm, 1100), _index(index) { + + SetMessageHandler(&SsScene1105SymbolDie::handleMessage); + _x = x; + _y = y; + createSurface(200, 50, 50); + loadSymbolSprite(); +} + +uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + loadSymbolSprite(); + break; + } + return messageResult; +} + +void SsScene1105SymbolDie::loadSymbolSprite() { + load(kSsScene1105SymbolDieFileHashes[getSubVar(0x61084036, _index)], true, false); + _drawRect.x = -(_spriteResource.getDimensions().width / 2); + _drawRect.y = -(_spriteResource.getDimensions().height / 2); + StaticSprite::update(); +} + +void SsScene1105SymbolDie::hide() { + setVisible(false); + _needRefresh = true; + StaticSprite::update(); +} + +AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), + _parentScene(parentScene) { + + // TODO createSurface3(100, dword_4AF4C0); + createSurface(100, 640, 480); //TODO: Remeove once the line above is done + _x = 320; + _y = 240; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1105TeddyBear::handleMessage); + setFileHash(0x65084002, 0, -1); + _newHashListIndex = 0; + setVisible(false); + _needRefresh = true; + updatePosition(); + _soundResource1.load(0xCE840261); + _soundResource2.load(0xCCA41A62); +} + +uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + if (getGlobalVar(0x610210B7)) { + setFileHash(0x6B0C0432, 0, -1); + _soundResource1.play(); + } else { + setFileHash(0x65084002, 0, -1); + _soundResource2.play(); + } + break; + case 0x3002: + sendMessage(_parentScene, 0x2003, 0); + setFileHash1(); + break; + } + return messageResult; +} + +void AsScene1105TeddyBear::show() { + setVisible(true); + _needRefresh = true; + updatePosition(); +} + +void AsScene1105TeddyBear::hide() { + setVisible(false); + _needRefresh = true; + updatePosition(); +} + +SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 900), _soundResource(vm), _parentScene(parentScene), + _countdown(0), _flag1(false) { + + _spriteResource.load2(0x8228A46C); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _deltaRect = _drawRect; + _needRefresh = true; + processDelta(); + setVisible(false); + _soundResource.load(0x44045140); + SetUpdateHandler(&SsScene1105OpenButton::update); + SetMessageHandler(&SsScene1105OpenButton::handleMessage); +} + +void SsScene1105OpenButton::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown == 0)) { + setVisible(false); + sendMessage(_parentScene, 0x2001, 0); + } +} + +uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_flag1) { + _soundResource.play(); + setVisible(true); + _flag1 = true; + _countdown = 4; + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), + _soundResource3(vm), _countdown(0), _flag1(false), _flag2(false), _flag3(false), + _flag4(false), _flag5(false), _backgroundIndex(0) { + + Sprite *ssOpenButton; + + _vm->gameModule()->initScene1405Vars(); + + _surfaceFlag = true; + SetUpdateHandler(&Scene1105::update); + SetMessageHandler(&Scene1105::handleMessage); + + setBackground(0x20010002); + setPalette(0x20010002); + + _asTeddyBear = insertSprite(this); + ssOpenButton = insertSprite(this); + _vm->_collisionMan->addSprite(ssOpenButton); + insertMouse435(0x10006208, 20, 620); + + _soundResource1.load(0x48442057); + _soundResource2.load(0xC025014F); + _soundResource3.load(0x68E25540); + +} + +uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO Debug stuff + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (!_flag2 && _backgroundIndex == 0) { + if (_flag1) { + _flag1 = false; + _backgroundIndex = 15; + SetUpdateHandler(&Scene1105::upClosePanel); + } else + _flag1 = true; + _flag5 = false; + } + } + break; + // TODO Debug stuff + case 0x2001: + showMouse(false); + _backgroundIndex = 24; + SetUpdateHandler(&Scene1105::upOpenPanel); + break; + case 0x2003: + _backgroundIndex = 24; + _flag5 = true; + SetUpdateHandler(&Scene1105::upClosePanel); + break; + case 0x4807: + if (sender == _ssActionButton) { + if (getSubVar(0x7500993A, 0) == getSubVar(0x61084036, 0) && + getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) && + getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) { + setGlobalVar(0x610210B7, 1); + _soundResource3.play(); + _flag3 = true; + } else { + sendMessage(_asTeddyBear, 0x2002, 0); + } + showMouse(false); + _flag2 = true; + } + break; + case 0x4826: + if (_flag1) { + if (sender == _ssActionButton) { + sendMessage(_ssActionButton, 0x480B, 0); + _flag1 = false; + } else if (!getGlobalVar(0x610210B7)) { + if (sender == _ssSymbol1UpButton) { + if (getSubVar(0x61084036, 0) < 9) { + incSubVar(0x61084036, 0, +1); + sendMessage(_ssSymbol1UpButton, 0x480B, 0); + sendMessage(_ssSymbolDice[0], 0x2000, 0); + } + } else if (sender == _ssSymbol1DownButton) { + if (getSubVar(0x61084036, 0) > 1) { + incSubVar(0x61084036, 0, -1); + sendMessage(_ssSymbol1DownButton, 0x480B, 0); + sendMessage(_ssSymbolDice[0], 0x2000, 0); + } + } else if (sender == _ssSymbol2UpButton) { + if (getSubVar(0x61084036, 1) < 9) { + incSubVar(0x61084036, 1, +1); + sendMessage(_ssSymbol2UpButton, 0x480B, 0); + sendMessage(_ssSymbolDice[1], 0x2000, 0); + } + } else if (sender == _ssSymbol2DownButton) { + if (getSubVar(0x61084036, 1) > 1) { + incSubVar(0x61084036, 1, -1); + sendMessage(_ssSymbol2DownButton, 0x480B, 0); + sendMessage(_ssSymbolDice[1], 0x2000, 0); + } + } else if (sender == _ssSymbol3UpButton) { + if (getSubVar(0x61084036, 2) < 9) { + incSubVar(0x61084036, 2, +1); + sendMessage(_ssSymbol3UpButton, 0x480B, 0); + sendMessage(_ssSymbolDice[2], 0x2000, 0); + } + } else if (sender == _ssSymbol3DownButton) { + if (getSubVar(0x61084036, 2) > 1) { + incSubVar(0x61084036, 2, -1); + sendMessage(_ssSymbol3DownButton, 0x480B, 0); + sendMessage(_ssSymbolDice[2], 0x2000, 0); + } + } + } + } + break; + } + return messageResult; +} + +void Scene1105::createObjects() { + _ssSymbols[0] = insertSprite(kScene1105FileHashes[getSubVar(0x13100631, 0)], 161, 304); + _ssSymbols[1] = insertSprite(kScene1105FileHashes[getSubVar(0x13100631, 1)], 294, 304); + _ssSymbols[2] = insertSprite(kScene1105FileHashes[getSubVar(0x13100631, 2)], 440, 304); + + _ssSymbolDice[0] = insertSprite(0, 206, 304); + _ssSymbolDice[1] = insertSprite(1, 339, 304); + _ssSymbolDice[2] = insertSprite(2, 485, 304); + + _ssSymbol1UpButton = insertSprite(this, 0x08002860, NRect(146, 362, 192, 403)); + _vm->_collisionMan->addSprite(_ssSymbol1UpButton); + _ssSymbol1DownButton = insertSprite(this, 0x42012460, NRect(147, 404, 191, 442)); + _vm->_collisionMan->addSprite(_ssSymbol1DownButton); + _ssSymbol2UpButton = insertSprite(this, 0x100030A0, NRect(308, 361, 355, 402)); + _vm->_collisionMan->addSprite(_ssSymbol2UpButton); + _ssSymbol2DownButton = insertSprite(this, 0x840228A0, NRect(306, 406, 352, 445)); + _vm->_collisionMan->addSprite(_ssSymbol2DownButton); + _ssSymbol3UpButton = insertSprite(this, 0x20000120, NRect(476, 358, 509, 394)); + _vm->_collisionMan->addSprite(_ssSymbol3UpButton); + _ssSymbol3DownButton = insertSprite(this, 0x08043121, NRect(463, 401, 508, 438)); + _vm->_collisionMan->addSprite(_ssSymbol3DownButton); + _ssActionButton = insertSprite(this, 0x8248AD35, NRect(280, 170, 354, 245)); + _vm->_collisionMan->addSprite(_ssActionButton); + + _flag1 = true; + + _asTeddyBear->show(); + + // TODO: Find a nicer way + deleteSprite((Sprite**)&_mouseCursor); + insertMouse435(0x18666208, 20, 620); + +} + +void Scene1105::upOpenPanel() { + Scene::update(); + if (_backgroundIndex != 0) { + _backgroundIndex--; + if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { + uint32 backgroundFileHash = kScene1105BackgroundFileHashes[_backgroundIndex / 2]; + changeBackground(backgroundFileHash); + _palette->addPalette(backgroundFileHash, 0, 256, 0); + } + if (_backgroundIndex == 10) { + _soundResource1.play(); + } + if (_backgroundIndex == 0) { + SetUpdateHandler(&Scene1105::update); + _countdown = 2; + } + } +} + +void Scene1105::upClosePanel() { + Scene::update(); + if (_backgroundIndex != 0) { + _backgroundIndex--; + if (_backgroundIndex == 14) { + showMouse(false); + _ssSymbols[0]->hide(); + _ssSymbols[1]->hide(); + _ssSymbols[2]->hide(); + _ssSymbolDice[0]->hide(); + _ssSymbolDice[1]->hide(); + _ssSymbolDice[2]->hide(); + } + if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { + uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME + if (_backgroundIndex == 4) { + _soundResource2.play(); + _asTeddyBear->hide(); + } + changeBackground(backgroundFileHash); + _palette->addPalette(backgroundFileHash, 0, 256, 0); + } + if (_backgroundIndex == 0) { + SetUpdateHandler(&Scene1105::update); + _flag4 = true; + } + } +} + +void Scene1105::update() { + + // DEBUG: Show the correct code + debug("(%d, %d) (%d, %d) (%d, %d)", + getSubVar(0x7500993A, 0), getSubVar(0x61084036, 0), + getSubVar(0x7500993A, 1), getSubVar(0x61084036, 1), + getSubVar(0x7500993A, 2), getSubVar(0x61084036, 2)); + + Scene::update(); + if (_countdown != 0 && (--_countdown == 0)) { + createObjects(); + } + if (_flag4 && !_soundResource2.isPlaying()) { + sendMessage(_parentModule, 0x1009, _flag5); + } + if (_flag3 && !_soundResource3.isPlaying()) { + sendMessage(_asTeddyBear, 0x2002, 0); + _flag3 = false; + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h new file mode 100644 index 0000000000..8d49f8fde3 --- /dev/null +++ b/engines/neverhood/module1100.h @@ -0,0 +1,128 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1100_H +#define NEVERHOOD_MODULE1100_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1100 + +class Module1100 : public Module { +public: + Module1100(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1100(); +protected: + int _countdown; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class SsScene1105Button : public StaticSprite { +public: + SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect); +protected: + Scene *_parentScene; + SoundResource _soundResource; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene1105Symbol : public StaticSprite { +public: + SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y); + void hide(); +}; + +class SsScene1105SymbolDie : public StaticSprite { +public: + SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y); + void hide(); +protected: + uint _index; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void loadSymbolSprite(); +}; + +class AsScene1105TeddyBear : public AnimatedSprite { +public: + AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene); + void show(); + void hide(); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene1105OpenButton : public StaticSprite { +public: + SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource; + int _countdown; + bool _flag1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1105 : public Scene { +public: + Scene1105(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + int _countdown; + int _backgroundIndex; + bool _flag1; + bool _flag2; + bool _flag3; + bool _flag4; + bool _flag5; + AsScene1105TeddyBear *_asTeddyBear; + SsScene1105Symbol *_ssSymbols[3]; + SsScene1105SymbolDie *_ssSymbolDice[3]; + Sprite *_ssSymbol1UpButton; + Sprite *_ssSymbol1DownButton; + Sprite *_ssSymbol2UpButton; + Sprite *_ssSymbol2DownButton; + Sprite *_ssSymbol3UpButton; + Sprite *_ssSymbol3DownButton; + Sprite *_ssActionButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createObjects(); + void upOpenPanel(); + void upClosePanel(); + void update(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1100_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 59dcbfc127..c37cdaced2 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -217,6 +217,9 @@ void Module2200::createScene(int sceneNum, int which) { _childObject->handleUpdate(); } +#define HallOfRecordsSceneLink(nextSceneNum, prevSceneNum) \ + if (_moduleResult == 1) createScene(nextSceneNum, 0); else if (_moduleResult == 2) createScene(7, 0); else createScene(prevSceneNum, 1) + void Module2200::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { @@ -274,346 +277,118 @@ void Module2200::updateScene() { createScene(5, 3); break; case 9: - if (_moduleResult == 1) { - createScene(10, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(46, 1); - } + HallOfRecordsSceneLink(10, 46); break; case 10: - if (_moduleResult == 1) { - createScene(11, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(9, 1); - } + HallOfRecordsSceneLink(11, 9); break; case 11: - if (_moduleResult == 1) { - createScene(12, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(10, 1); - } + HallOfRecordsSceneLink(12, 10); break; case 12: - if (_moduleResult == 1) { - createScene(13, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(11, 1); - } + HallOfRecordsSceneLink(13, 11); break; case 13: - if (_moduleResult == 1) { - createScene(14, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(12, 1); - } + HallOfRecordsSceneLink(14, 12); break; case 14: - if (_moduleResult == 1) { - createScene(15, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(13, 1); - } + HallOfRecordsSceneLink(15, 13); break; case 15: - if (_moduleResult == 1) { - createScene(16, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(14, 1); - } + HallOfRecordsSceneLink(16, 14); break; case 16: - if (_moduleResult == 1) { - createScene(17, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(15, 1); - } + HallOfRecordsSceneLink(17, 15); break; case 17: - if (_moduleResult == 1) { - createScene(18, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(16, 1); - } + HallOfRecordsSceneLink(18, 16); break; case 18: - if (_moduleResult == 1) { - createScene(19, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(17, 1); - } + HallOfRecordsSceneLink(19, 17); break; case 19: - if (_moduleResult == 1) { - createScene(20, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(18, 1); - } + HallOfRecordsSceneLink(20, 18); break; case 20: - if (_moduleResult == 1) { - createScene(21, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(19, 1); - } + HallOfRecordsSceneLink(21, 19); break; case 21: - if (_moduleResult == 1) { - createScene(22, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(20, 1); - } + HallOfRecordsSceneLink(22, 20); break; case 22: - if (_moduleResult == 1) { - createScene(23, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(21, 1); - } + HallOfRecordsSceneLink(23, 21); break; case 23: - if (_moduleResult == 1) { - createScene(24, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(22, 1); - } + HallOfRecordsSceneLink(24, 22); break; case 24: - if (_moduleResult == 1) { - createScene(25, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(23, 1); - } + HallOfRecordsSceneLink(25, 23); break; case 25: - if (_moduleResult == 1) { - createScene(26, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(24, 1); - } + HallOfRecordsSceneLink(26, 24); break; case 26: - if (_moduleResult == 1) { - createScene(27, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(25, 1); - } + HallOfRecordsSceneLink(27, 25); break; case 27: - if (_moduleResult == 1) { - createScene(28, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(26, 1); - } + HallOfRecordsSceneLink(28, 26); break; case 28: - if (_moduleResult == 1) { - createScene(29, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(27, 1); - } + HallOfRecordsSceneLink(29, 27); break; case 29: - if (_moduleResult == 1) { - createScene(30, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(28, 1); - } + HallOfRecordsSceneLink(30, 28); break; case 30: - if (_moduleResult == 1) { - createScene(31, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(29, 1); - } + HallOfRecordsSceneLink(31, 29); break; case 31: - if (_moduleResult == 1) { - createScene(32, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(30, 1); - } + HallOfRecordsSceneLink(32, 30); break; case 32: - if (_moduleResult == 1) { - createScene(33, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(31, 1); - } + HallOfRecordsSceneLink(33, 31); break; case 33: - if (_moduleResult == 1) { - createScene(34, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(32, 1); - } + HallOfRecordsSceneLink(34, 32); break; case 34: - if (_moduleResult == 1) { - createScene(42, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(33, 1); - } + HallOfRecordsSceneLink(42, 33); break; case 35: - if (_moduleResult == 1) { - createScene(36, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(45, 1); - } + HallOfRecordsSceneLink(36, 45); break; case 36: - if (_moduleResult == 1) { - createScene(37, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(35, 1); - } + HallOfRecordsSceneLink(37, 35); break; case 37: - if (_moduleResult == 1) { - createScene(38, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(36, 1); - } + HallOfRecordsSceneLink(38, 36); break; case 38: - if (_moduleResult == 1) { - createScene(39, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(37, 1); - } + HallOfRecordsSceneLink(39, 37); break; case 39: - if (_moduleResult == 1) { - createScene(40, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(38, 1); - } + HallOfRecordsSceneLink(40, 38); break; case 40: - if (_moduleResult == 1) { - createScene(41, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(39, 1); - } + HallOfRecordsSceneLink(41, 39); break; case 41: - if (_moduleResult == 1) { - createScene(47, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(40, 1); - } + HallOfRecordsSceneLink(47, 40); break; case 42: - if (_moduleResult == 1) { - createScene(43, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(34, 1); - } + HallOfRecordsSceneLink(43, 34); break; case 43: - if (_moduleResult == 1) { - createScene(44, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(42, 1); - } + HallOfRecordsSceneLink(44, 42); break; case 44: - if (_moduleResult == 1) { - createScene(45, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(43, 1); - } + HallOfRecordsSceneLink(45, 43); break; case 45: - if (_moduleResult == 1) { - createScene(35, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(44, 1); - } + HallOfRecordsSceneLink(35, 44); break; case 46: - if (_moduleResult == 1) { - createScene(9, 0); - } else if (_moduleResult == 2) { - createScene(7, 0); - } else { - createScene(5, 1); - } + HallOfRecordsSceneLink(9, 5); break; case 47: createScene(41, 1); diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index c24bf6ac49..fe78e5021e 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -59,7 +59,7 @@ void SmackerScene::setFileHash(uint32 fileHash) { _fileHashList = _fileHash; } -void SmackerScene::setFileHashList(uint32 *fileHashList) { +void SmackerScene::setFileHashList(const uint32 *fileHashList) { debug("SmackerScene::setFileHashList(...)"); _fileHashList = fileHashList; } diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h index b3c354c44a..05237664c3 100644 --- a/engines/neverhood/smackerscene.h +++ b/engines/neverhood/smackerscene.h @@ -34,7 +34,7 @@ public: SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort); virtual ~SmackerScene(); void setFileHash(uint32 fileHash); - void setFileHashList(uint32 *fileHashList); + void setFileHashList(const uint32 *fileHashList); void nextVideo(); protected: bool _doubleSurface; @@ -43,7 +43,7 @@ protected: bool _fieldDF; bool _playNextVideoFlag; int _fileHashListIndex; - uint32 *_fileHashList; + const uint32 *_fileHashList; uint32 _fileHash[2]; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 95cfa04e3bdddf15db55ea0859d77cf41e102620 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 21 Sep 2011 07:14:10 +0000 Subject: NEVERHOOD: Add tables for Scene1105 --- devtools/create_neverhood/tables.h | 7 +++++++ dists/engine-data/neverhood.dat | Bin 14630 -> 15030 bytes 2 files changed, 7 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index ef32a226f6..de9098314a 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -340,6 +340,13 @@ static const uint32 messageListOffsets[] = { }; static const uint32 navigationListOffsets[] = { + // Module1100 + 2, 0x004B8430, + 2, 0x004B8460, + 4, 0x004B84F0, + 4, 0x004B8490, + 2, 0x004B8580, + 2, 0x004B8550, // Module1300 6, 0x004B2718, 2, 0x004B27A8, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index f9026134de..9d22f38a17 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 8a08287e7b92d9db70a2eee9a8b76302e282809b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 21 Sep 2011 08:44:55 +0000 Subject: NEVERHOOD: Add tables for Scene1109 --- devtools/create_neverhood/tables.h | 9 +++++++++ dists/engine-data/neverhood.dat | Bin 15030 -> 15398 bytes 2 files changed, 9 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index de9098314a..16c00a7387 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -48,6 +48,9 @@ static const uint32 rectListOffsets[] = { 3, 0x004B43A0, // Scene1004 1, 0x004B7C70, + // Scene1109 + 1, 0x004B63A8, + 1, 0x004B6398, // Scene1201 1, 0x004AEE58, 1, 0x004AEDC8, @@ -134,6 +137,12 @@ static const uint32 messageListOffsets[] = { 2, 0x004B7C08, 1, 0x004B7C18, 2, 0x004B7C20, + // Scene1109 + 1, 0x004B6260, + 2, 0x004B6268, + 4, 0x004B6318, + 2, 0x004B6278, + 1, 0x004B6258, // Scene1201 1, 0x004AEC08, 2, 0x004AEC10, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 9d22f38a17..47123e835b 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 47f1fe141b2205d6ce8999fa1a327310de4a1790 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 21 Sep 2011 08:45:32 +0000 Subject: NEVERHOOD: Add Scene1109 - Also fix some bugs regarding a missing parameter to setMessageList in various scenes --- engines/neverhood/background.cpp | 3 +- engines/neverhood/gamemodule.cpp | 10 ++++- engines/neverhood/klayman.cpp | 96 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 11 +++++ engines/neverhood/module1100.cpp | 60 ++++++++++++++++++++++++- engines/neverhood/module1100.h | 8 ++++ engines/neverhood/module1200.cpp | 2 +- engines/neverhood/module1300.cpp | 2 +- engines/neverhood/module1700.cpp | 6 +-- engines/neverhood/module2000.cpp | 6 +-- engines/neverhood/scene.cpp | 10 ++--- 11 files changed, 196 insertions(+), 18 deletions(-) diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp index 0c522dbe75..e235eaa1b3 100644 --- a/engines/neverhood/background.cpp +++ b/engines/neverhood/background.cpp @@ -62,7 +62,7 @@ void Background::load(uint32 fileHash) { DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority) : Background(vm, objectPriority) { - // TODO _spriteResource.load(calcHash(fileName)); + _spriteResource.load(calcHash(fileName)); createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _surface->drawSpriteResource(_spriteResource); } @@ -85,5 +85,4 @@ void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 heig } - } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c6dc006a8d..4d1c27d4df 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -275,7 +275,7 @@ void GameModule::startup() { createModule(1000, -1); #endif #if 1 - _vm->gameState().sceneNum = 4; + _vm->gameState().sceneNum = 8; createModule(1100, -1); #endif } @@ -353,6 +353,14 @@ void GameModule::updateModule() { createModule(2300, 2); } break; + case 1100: + if (_moduleResult == 0) { + createModule(2900, 2); + } else { + setGlobalVar(0xD0A14D10, 1); + createModule(1300, 0); + } + break; case 1300: if (_moduleResult == 1) { // TODO _gameState.clear(); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 4d4d9c4aa4..4916056ab0 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2687,6 +2687,102 @@ void KmScene1004::sub478170() { SetSpriteCallback(&AnimatedSprite::updateDeltaXY); } +KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + + // Empty +} + +uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2000: + _flag1 = param.asInteger() != 0; + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub421350)); + else + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4804: + if (param.asInteger() != 0) { + _x4 = param.asInteger(); + setCallback2(AnimationCallback(&Klayman::sub41F9E0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FC40)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481D: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub4214D0)); + break; + case 0x481E: + if (_flag) + setCallback2(AnimationCallback(&Klayman::sub421510)); + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _flag1 = true; + setCallback2(AnimationCallback(&Klayman::sub4212C0)); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _flag1 = false; + setCallback2(AnimationCallback(&Klayman::sub421310)); + break; + case 0x483D: + sub461F30(); + break; + case 0x483E: + sub461F70(); + break; + } + return 0; +} + +uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + _soundResource1.play(0x85B10BB8); + } else if (param.asInteger() == 0x4E6A0CA0) { + _soundResource1.play(0xC5B709B0); + } + break; + } + return messageResult; +} + +void KmScene1109::sub461F30() { + _status2 = 0; + _flagE5 = false; + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1109::handleMessage461EA0); + setFileHash(0x2C2A4A1C, 0, -1); +} + +void KmScene1109::sub461F70() { + _status2 = 0; + _flagE5 = false; + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene1109::handleMessage461EA0); + setFileHash(0x3C2E4245, 0, -1); +} + // KmScene1201 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a4d355726b..7b3530c93d 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -305,6 +305,17 @@ protected: void sub478170(); }; +class KmScene1109 : public Klayman { +public: + KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag1; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage461EA0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub461F30(); + void sub461F70(); +}; + class KmScene1201 : public Klayman { public: KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464); diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 3ee3f4c3b3..4bafbd96a1 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -94,7 +94,7 @@ void Module1100::createScene(int sceneNum, int which) { createSmackerScene(kSmackerFileHashList07, true, true, false); break; case 8: -//TODO _childObject = new Scene1109(_vm, this, which); + _childObject = new Scene1109(_vm, this, which); break; case 1002: _countdown = 40; @@ -108,7 +108,6 @@ void Module1100::createScene(int sceneNum, int which) { void Module1100::updateScene() { if (!updateChild()) { - debug("_vm->gameState().sceneNum = %d", _vm->gameState().sceneNum); switch (_vm->gameState().sceneNum) { case 0: _countdown = 0; @@ -660,4 +659,61 @@ void Scene1105::update() { } } +Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, which) { + + _surfaceFlag = true; + SetMessageHandler(&Scene1109::handleMessage); + + setBackground(0x8449E02F); + setPalette(0x8449E02F); + insertMouse433(0x9E02B84C); + + _sprite1 = insertStaticSprite(0x600CEF01, 1100); + + if (which < 0) { + insertKlayman(140, 436); + setMessageList(0x004B6260); + sendMessage(this, 0x2000, 0); + } else if (which == 1) { + insertKlayman(450, 436); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004B6268, false); + sendMessage(this, 0x2000, 1); + } else if (which == 2) { + insertKlayman(450, 436); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004B6318, false); + sendMessage(this, 0x2000, 1); + } else if (which == 3) { + insertKlayman(450, 436); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004B6278, false); + sendMessage(this, 0x2000, 1); + } else { + insertKlayman(0, 436); + setMessageList(0x004B6258); + sendMessage(this, 0x2000, 0); + } + + _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); + +} + +uint32 Scene1109::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004B63A8); + _klayman->setKlaymanTable3(); + } else { + setRectList(0x004B6398); + _klayman->setKlaymanTable1(); + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h index 8d49f8fde3..c46c1dfbca 100644 --- a/engines/neverhood/module1100.h +++ b/engines/neverhood/module1100.h @@ -123,6 +123,14 @@ protected: void update(); }; +class Scene1109 : public Scene { +public: + Scene1109(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1100_H */ diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 9c84950a2b..8853dd0df4 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -971,7 +971,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2002: if (getGlobalVar(0x20A0C516)) { sendEntityMessage(_klayman, 0x1014, _asTntMan); - setMessageList2(0x004AECF0); + setMessageList2(0x004AECF0, false); } else if (getGlobalVar(0x0112090A) == 3) { sendEntityMessage(_klayman, 0x1014, _asTntMan); if (_klayman->getX() > _asTntMan->getX()) { diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 4876135cef..1f3716b2a1 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1719,7 +1719,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit } else { setRectList(0x004B5980); } - setMessageList(0x004B57E8); + setMessageList(0x004B57E8, false); _sprite1->setVisible(true); _klayman->setVisible(true); break; diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 9547d3447c..8140608e8a 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -214,19 +214,19 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 1) { insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004B6A08); + setMessageList(0x004B6A08, false); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 2) { insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004B6AA0); + setMessageList(0x004B6AA0, false); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 3) { insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004B6A18); + setMessageList(0x004B6A18, false); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else { diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index b870d823ec..22ee648731 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -114,17 +114,17 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 1) { insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004B3540); + setMessageList(0x004B3540, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004B35F0); + setMessageList(0x004B35F0, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004B3550); + setMessageList(0x004B3550, false); sendMessage(this, 0x2000, 1); } else { insertKlayman(390, 345); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 8d7fc787ec..441ee1e291 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -249,14 +249,14 @@ void Scene::update() { if (_mouseClicked) { if (_klayman) { // TODO: Merge later - if (_klayman->hasMessageHandler() && + if (_messageListFlag && + _klayman->hasMessageHandler() && sendMessage(_klayman, 0x1008, 0) != 0 && - _messageListFlag && queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; - } else if (_klayman->hasMessageHandler() && - sendMessage(_klayman, 0x1008, 0) != 0 && - _messageListFlag) { + } else if (_messageListFlag && + _klayman->hasMessageHandler() && + sendMessage(_klayman, 0x1008, 0) != 0) { _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); } } else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { -- cgit v1.2.3 From 2445e6aba8e9724737a069eb4e018f8e60015aac Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 23 Sep 2011 15:19:40 +0000 Subject: NEVERHOOD: Add tables for Module1600 and Scene1608 --- devtools/create_neverhood/tables.h | 19 +++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 15398 -> 16288 bytes 2 files changed, 19 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 16c00a7387..01ddd15fc4 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -81,6 +81,9 @@ static const uint32 rectListOffsets[] = { 1, 0x004B2008, // Scene1404 1, 0x004B8D80, + // Scene1608 + 1, 0x004B47D0, + 1, 0x004B4810, // Scene1705 1, 0x004B6B40, 1, 0x004B6B30, @@ -242,6 +245,14 @@ static const uint32 messageListOffsets[] = { 3, 0x004B8CA0, 2, 0x004B8CD0, 2, 0x004B8D18, + // Scene1608 + 1, 0x004B46A8, + 1, 0x004B46B0, + 1, 0x004B47A8, + 3, 0x004B4748, + 2, 0x004B4770, + 2, 0x004B46C8, + 2, 0x004B4760, // Scene1705 1, 0x004B69E8, 2, 0x004B6A08, @@ -362,6 +373,14 @@ static const uint32 navigationListOffsets[] = { 2, 0x004B27D8, 2, 0x004B2808, 2, 0x004B2838, + // Module1600 + 4, 0x004B39D0, + 2, 0x004B3A30, + 2, 0x004B3A60, + 6, 0x004B3A90, + 2, 0x004B3B20, + 2, 0x004B3B50, + 2, 0x004B3B80, // Module1700 2, 0x004AE8B8, 3, 0x004AE8E8, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 47123e835b..5561301a95 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 236ca705e8082184aae61aae5e2d561d09b7043c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 23 Sep 2011 15:21:24 +0000 Subject: NEVERHOOD: Add Module1600 and Scene1608 (stuff will be renamed later) --- engines/neverhood/gamemodule.cpp | 19 +- engines/neverhood/klayman.cpp | 89 ++- engines/neverhood/klayman.h | 8 + engines/neverhood/module.cpp | 4 + engines/neverhood/module.h | 1 + engines/neverhood/module.mk | 1 + engines/neverhood/module1600.cpp | 1387 ++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1600.h | 176 +++++ engines/neverhood/scene.cpp | 4 + engines/neverhood/scene.h | 30 + 10 files changed, 1716 insertions(+), 3 deletions(-) create mode 100644 engines/neverhood/module1600.cpp create mode 100644 engines/neverhood/module1600.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 4d1c27d4df..854a5cc1fe 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -29,6 +29,7 @@ #include "neverhood/module1300.h" #include "neverhood/module1400.h" #include "neverhood/module1500.h" +#include "neverhood/module1600.h" #include "neverhood/module1700.h" #include "neverhood/module1800.h" #include "neverhood/module2000.h" @@ -275,8 +276,9 @@ void GameModule::startup() { createModule(1000, -1); #endif #if 1 - _vm->gameState().sceneNum = 8; - createModule(1100, -1); + _vm->gameState().sceneNum = 7; + _vm->gameState().which = 1; + createModule(1600, -1); #endif } @@ -309,6 +311,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x00F10114); _childObject = new Module1500(_vm, this, which, true); break; + case 1600: + setGlobalVar(0x91080831, 0x01A008D8); + _childObject = new Module1600(_vm, this, which); + break; case 1700: setGlobalVar(0x91080831, 0x04212331); _childObject = new Module1700(_vm, this, which); @@ -379,6 +385,15 @@ void GameModule::updateModule() { case 1500: createModule(1000, 0); break; + case 1600: + if (_moduleResult == 1) { + createModule(1400, 0); + } else if (_moduleResult == 2) { + createModule(1700, 0); + } else { + createModule(2100, 0); + } + break; case 1700: if (_moduleResult == 1) { createModule(2900, 3); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 4916056ab0..27ef84acb2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -282,7 +282,7 @@ void Klayman::sub421350() { SetMessageHandler(&Klayman::handleMessage41D360); _counter3 = 0; _counterMax = 8; - _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + _counter3Max = _vm->_rnd->getRandomNumber(64 - 1) + 24; } void Klayman::update41D1C0() { @@ -3719,6 +3719,93 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { +} + +uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2032: + _flag1 = param.asInteger() != 0; + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub421350)); + else + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub4214D0)); + break; + case 0x481E: + if (_flag) + setCallback2(AnimationCallback(&Klayman::sub421510)); + break; + case 0x481F: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub4208B0)); + } else if (param.asInteger() == 0) { + setCallback2(AnimationCallback(&Klayman::sub420870)); + } else if (param.asInteger() == 4) { + setCallback2(AnimationCallback(&Klayman::sub420930)); + } else if (param.asInteger() == 3) { + setCallback2(AnimationCallback(&Klayman::sub4208F0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub420830)); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x4835: + sendMessage(_parentScene, 0x2032, 1); + _flag1 = true; + setCallback2(AnimationCallback(&Klayman::sub4212C0)); + break; + case 0x4836: + sendMessage(_parentScene, 0x2032, 0); + _flag1 = false; + setCallback2(AnimationCallback(&Klayman::sub421310)); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + // KmScene1705 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7b3530c93d..84cb05acf5 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -413,6 +413,14 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene1608 : public Klayman { +public: + KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag1; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene1705 : public Klayman { public: KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 79197ed04b..5be9a6321f 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -110,4 +110,8 @@ bool Module::updateChild() { return true; } +void Module::leaveModule(uint32 result) { + sendMessage(_parentModule, 0x1009, result); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 2f6ce69d3a..57a42c623b 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -62,6 +62,7 @@ protected: void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort); bool updateChild(); + void leaveModule(uint32 result); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index bbbbb02c01..5a597fb3e2 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -17,6 +17,7 @@ MODULE_OBJS = \ module1300.o \ module1400.o \ module1500.o \ + module1600.o \ module1700.o \ module1800.o \ module2000.o \ diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp new file mode 100644 index 0000000000..a23e7101b4 --- /dev/null +++ b/engines/neverhood/module1600.cpp @@ -0,0 +1,1387 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1600.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1200.h" +#include "neverhood/module2200.h" + +namespace Neverhood { + +Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 1) { + createScene(4, 1); + } else if (which == 2) { + createScene(5, 0); + } else if (which == 3) { + createScene(6, 1); + } else if (which == 4) { + createScene(1, 0); + } else { + createScene(0, 0); + } + + // TODO Sound1ChList_addSoundResources(0x1A008D8, dword_4B3BB0, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B3BB0, true, 50, 600, 5, 150); + // TODO Sound1ChList_sub_407C70(0x1A008D8, 0x41861371, 0x43A2507F, 0); + +} + +Module1600::~Module1600() { + // TODO Sound1ChList_sub_407A50(0x1A008D8); +} + +void Module1600::createScene(int sceneNum, int which) { + debug("Module1600::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + createNavigationScene(0x004B39D0, which); + break; + case 1: + createNavigationScene(0x004B3A30, which); + break; + case 2: + createNavigationScene(0x004B3A60, which); + break; + case 3: + createNavigationScene(0x004B3A90, which); + break; + case 4: + createNavigationScene(0x004B3B20, which); + break; + case 5: + createNavigationScene(0x004B3B50, which); + break; + case 6: + createNavigationScene(0x004B3B80, which); + break; + case 7: + _childObject = new Scene1608(_vm, this, which); + break; + case 8: +//TODO _childObject = new Scene1609(_vm, this, which); + break; + case 1001: + if (getGlobalVar(0xA0808898) == 1) { + createSmackerScene(0x80050200, true, true, false); + } else if (getGlobalVar(0xA0808898) == 2) { + createSmackerScene(0x80090200, true, true, false); + } else { + createSmackerScene(0x80000200, true, true, false); + } + if (getGlobalVar(0xA0808898) >= 2) + setGlobalVar(0xA0808898, 0); + else + incGlobalVar(0xA0808898, +1); + break; + } + SetUpdateHandler(&Module1600::updateScene); + _childObject->handleUpdate(); +} + +void Module1600::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 0) + createScene(2, 0); + else if (_moduleResult == 1) + createScene(1, 0); + else if (_moduleResult == 2) + leaveModule(4); + break; + case 1: + if (_moduleResult == 0) + createScene(1001, -1); + else if (_moduleResult == 1) + createScene(0, 3); + break; + case 2: + if (_moduleResult == 0) + createScene(3, 0); + else if (_moduleResult == 1) + createScene(0, 2); + break; + case 3: + if (_moduleResult == 0) + createScene(5, 0); + else if (_moduleResult == 2) + createScene(6, 0); + else if (_moduleResult == 3) + createScene(2, 1); + else if (_moduleResult == 4) + createScene(4, 0); + break; + case 4: + if (_moduleResult == 0) + leaveModule(1); + else if (_moduleResult == 1) + createScene(3, 1); + break; + case 5: + if (_moduleResult == 0) + leaveModule(2); + else if (_moduleResult == 1) + createScene(3, 3); + break; + case 6: + if (_moduleResult == 0) + createScene(8, -1); + else if (_moduleResult == 1) + createScene(3, 5); + break; + case 7: + createScene(6, 1); + break; + case 8: + if (_moduleResult == 0) + createScene(6, 0); + else + createScene(7, 0); + break; + case 1001: + createScene(1, 0); + break; + } + } +} + +Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : AnimatedSprite(vm, 1000), _parentScene(parentScene) { + + SetUpdateHandler(&Class521::update); + SetMessageHandler(&Class521::handleMessage); + SetSpriteCallback(NULL); + + // TODO createSurface2(200, dword_4AF4C0); + createSurface(200, 640, 480); //TODO: Remove once the line above is done + _x = x; + _y = y; + + _field100 = 0; + _exitDirection = 0; + _currPointIndex = 0; + _againDestPtFlag = 0; + _stepError = 0; + _againDestPointFlag = 0; + _steps = 0; + _flag10E = 0; + _moreY = 0; + _flag10F = 0; + _flag113 = 0; + _flag114 = 1; + _flag11A = 0; + _newDeltaXType = -1; + _field11E = 0; + _pathPoints = NULL; + _rectList = NULL; + + setFileHash(0xD4220027, 0, -1); + setDoDeltaX(getGlobalVar(0x21E60190)); + +} + +Class521::~Class521() { + if (_callback1Cb == AnimationCallback(&Class521::sub45D620)) { + setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190)); + } +} + +void Class521::setPathPoints(NPointArray *pathPoints) { + _pathPoints = pathPoints; +} + +void Class521::update() { + if (_newDeltaXType >= 0) { + setDoDeltaX(_newDeltaXType); + _newDeltaXType = -1; + } + AnimatedSprite::update(); + if (_againDestPtFlag && _moreY == 0 && !_flag10F) { + _againDestPtFlag = 0; + _againDestPointFlag = 0; + sendPointMessage(this, 0x2004, _againDestPt); + } else if (_againDestPointFlag && _moreY == 0 && !_flag10F) { + _againDestPointFlag = 0; + sendMessage(this, 0x2003, _againDestPointIndex); + } + sub45CE10(); + sub45E0A0(); +} + +void Class521::update45C790() { + Class521::update(); + if (++_idleCounter >= _idleCounterMax) + sub45D050(); + sub45E0A0(); +} + +uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1019: + SetSpriteCallback(NULL); + break; + /* NOTE: Implemented in setPathPoints + case 0x2000: + case 0x2001: + */ + case 0x2002: + // Set the current position without moving + _currPointIndex = param.asInteger(); + _stepError = 0; + _x = pathPoint(_currPointIndex).x; + _y = pathPoint(_currPointIndex).y; + break; + case 0x2003: + // Move to a point by its index + { + int newPointIndex = param.asInteger(); + if (_moreY <= 0 && !_flag10F) { + _someX = pathPoint(newPointIndex).x; + _someY = pathPoint(newPointIndex).y; + if (_currPointIndex < newPointIndex) { + moveToNextPoint(); + } else if (_currPointIndex == newPointIndex && _stepError == 0) { + if (_currPointIndex == 0) { + _moreY = 0; + sendMessage(_parentScene, 0x2005, 0); + } else if (_currPointIndex == (int)_pathPoints->size()) { + _moreY = 0; + sendMessage(_parentScene, 0x2006, 0); + } + } else { + moveToPrevPoint(); + } + } else { + _againDestPointFlag = 1; + _againDestPointIndex = newPointIndex; + } + } + break; + case 0x2004: + // Move to the point closest to the parameter point + { + int minMatchIndex = -1; + int minMatchDistance, distance; + NPoint pt = param.asPoint(); + if (_moreY <= 0 && !_flag10F) { + // Check if we're already exiting (or something) + if ((pt.x <= 20 && _exitDirection == 1) || + (pt.x >= 620 && _exitDirection == 3) || + (pt.y <= 20 && _exitDirection == 2) || + (pt.y >= 460 && _exitDirection == 4)) + break; + _someX = pt.x; + _someY = pt.y; + minMatchDistance = calcDistance(_someX, _someY, _x, _y) + 1; + for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) { + distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y); + if (distance >= minMatchDistance) + break; + minMatchDistance = distance; + minMatchIndex = i; + } + for (int i = _currPointIndex; i >= 0; i--) { + distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y); + if (distance >= minMatchDistance) + break; + minMatchDistance = distance; + minMatchIndex = i; + } + if (minMatchIndex == -1) { + if (_currPointIndex == 0) { + moveToPrevPoint(); + } else { + SetSpriteCallback(NULL); + } + } else { + if (minMatchIndex > _currPointIndex) { + moveToNextPoint(); + } else { + moveToPrevPoint(); + } + } + } else { + _againDestPtFlag = 1; + _againDestPt = pt; + } + } + break; + case 0x2007: + _moreY = param.asInteger(); + _steps = 0; + _flag10E = 0; + SetSpriteCallback(&Class521::suMoveToPrevPoint); + _lastDistance = 640; + break; + case 0x2008: + _moreY = param.asInteger(); + _steps = 0; + _flag10E = 0; + SetSpriteCallback(&Class521::suMoveToNextPoint); + _lastDistance = 640; + break; + case 0x2009: + sub45CF80(); + break; + case 0x200A: + sub45CFB0(); + break; + /* NOTE: Implemented in setRectList + case 0x200B: + case 0x200C: + */ + case 0x200E: + sub45D180(); + break; + case 0x200F: + sub45CD00(); + _newDeltaXType = param.asInteger(); + break; + } + return messageResult; +} + +uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Class521::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_flag10F && param.asInteger() == 0x025424A2) { + removeCallbacks(); + } + break; + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +uint32 Class521::handleMessage45CCA0(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x2009: + sub45CF80(); + break; + case 0x3002: + sendMessage(_parentScene, 0x200A, 0); + SetMessageHandler(&Class521::handleMessage); + break; + } + return 0; +} + +void Class521::sub45CD00() { + bool doDeltaX = _doDeltaX; + SetSpriteCallback(NULL); + _againDestPtFlag = 0; + _againDestPointFlag = 0; + _flag10E = 0; + _flag10F = 0; + _flag113 = 0; + _flag114 = 0; + _flag11A = 0; + _rectList = NULL; + SetMessageHandler(&Class521::handleMessage45CC30); + SetAnimationCallback3(&Class521::sub45CFE0); + setFileHash(0x35698F78, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update45C790); + setCallback1(AnimationCallback(&Class521::sub45D040)); + setDoDeltaX(doDeltaX ? 1 : 0); + _currMoveDirection = 0; + _newMoveDirection = 0; + _steps = 0; + _idleCounter = 0; + _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; +} + +void Class521::sub45CDC0() { + if (_value112 == 1) { + _lastDistance = 640; + _flag113 = 0; + _flag10E = 0; + SetSpriteCallback(&Class521::suMoveToNextPoint); + } else if (_value112 == 2) { + _lastDistance = 640; + _flag113 = 0; + _flag10E = 0; + SetSpriteCallback(&Class521::suMoveToPrevPoint); + } +} + +void Class521::sub45CE10() { + if (_flag10E && !_flag113 && !_flag10F) { + removeCallbacks(); + _flag114 = 0; + _flag113 = 1; + setFileHash(0x192ADD30, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45CFE0); + } else if (!_flag10E && _steps && _flag113) { + removeCallbacks(); + _flag113 = 0; + setFileHash(0x9966B138, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45D100); + } else { + bool flag = false; + uint index = 0; + if (_rectList && _rectList->size() > 0) { + while (index < _rectList->size()) { + NRect r = (*_rectList)[index]; + if (_x >= r.x1 && _x <= r.x2 && _y >= r.y1 && _y <= r.y2) + break; + } + if (index < _rectList->size() && !_flag11A) + flag = true; + _flag11A = index < _rectList->size(); + } + if (flag) { + removeCallbacks(); + sub45D0A0(); + } else if (_newMoveDirection != _currMoveDirection && _flag114 && !_flag10F) { + removeCallbacks(); + _currMoveDirection = _newMoveDirection; + sub45D100(); + } + } +} + +void Class521::sub45CF80() { + setFileHash(0xA86A9538, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45CFE0); +} + +void Class521::sub45CFB0() { + setFileHash(0xA86A9538, -1, -1); + _playBackwards = true; + SetMessageHandler(&Class521::handleMessage45CCA0); + SetUpdateHandler(&Class521::update); +} + +void Class521::sub45CFE0() { + setFileHash(0x35698F78, 0, -1); + SetMessageHandler(&Class521::handleMessage); + SetUpdateHandler(&Class521::update45C790); + setCallback1(AnimationCallback(&Class521::sub45D040)); + _idleCounter = 0; + _currMoveDirection = 0; + _newMoveDirection = 0; + _steps = 0; + _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; +} + +void Class521::sub45D040() { + SetUpdateHandler(&Class521::update); +} + +void Class521::sub45D050() { + setFileHash(0xB579A77C, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45CFE0); + _idleCounter = 0; + _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; +} + +void Class521::sub45D0A0() { + _flag10F = 1; + removeCallbacks(); + setFileHash(0x9C220DA4, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + setCallback1(AnimationCallback(&Class521::sub45D0E0)); +} + +void Class521::sub45D0E0() { + _flag10F = 0; + _newMoveDirection = 0; + sub45D100(); +} + +void Class521::sub45D100() { + _flag114 = 1; + if (_currMoveDirection == 1) { + setFileHash(0xD4AA03A4, 0, -1); + } else if (_currMoveDirection == 3) { + setFileHash(0xD00A1364, 0, -1); + } else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) { + sub45D180(); + } else { + setFileHash(0xD4220027, 0, -1); + } + setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0); +} + +void Class521::sub45D180() { + _flag10F = 1; + removeCallbacks(); + setFileHash(0xF46A0324, 0, -1); + _value112 = 0; + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + setCallback1(AnimationCallback(&Class521::sub45D620)); + sub45CDC0(); +} + +void Class521::moveToNextPoint() { + if (_currPointIndex >= (int)_pathPoints->size() - 1) { + _moreY = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2006, 0); + } else { + NPoint nextPt = pathPoint(_currPointIndex + 1); + NPoint currPt = pathPoint(_currPointIndex); + if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && nextPt.x >= currPt.x && + (_currMoveDirection == 4 || _currMoveDirection == 2)) { + if (_currMoveDirection == 4) + _currMoveDirection = 2; + else if (_currMoveDirection == 2) + _currMoveDirection = 4; + if (_flag113) + sub45D390(); + else + sub45D350(); + } else { + if (_steps == 0) { + removeCallbacks(); + _flag113 = 0; + setFileHash(0x9966B138, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45D100); + } + _flag10E = 0; + SetSpriteCallback(&Class521::suMoveToNextPoint); + _lastDistance = 640; + } + } +} + +void Class521::sub45D350() { + removeCallbacks(); + _flag10F = 1; + _flag10E = 1; + setFileHash(0x192ADD30, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45D390); +} + +void Class521::sub45D390() { + removeCallbacks(); + _flag10F = 1; + setFileHash(0xF46A0324, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + setCallback1(AnimationCallback(&Class521::sub45D620)); + _value112 = 1; + sub45CDC0(); +} + +void Class521::moveToPrevPoint() { + if (_currPointIndex == 0 && _stepError == 0) { + _moreY = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2005, 0); + } else { + NPoint prevPt; + NPoint currPt; + if (_stepError == 0) { + prevPt = pathPoint(_currPointIndex - 1); + currPt = pathPoint(_currPointIndex); + } else { + prevPt = pathPoint(_currPointIndex); + currPt = pathPoint(_currPointIndex + 1); + } + if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && currPt.x >= prevPt.x && + (_currMoveDirection == 2 || _currMoveDirection == 4)) { + if (_currMoveDirection == 2) + _currMoveDirection = 4; + else if (_currMoveDirection == 4) + _currMoveDirection = 2; + if (_flag113) + sub45D5D0(); + else + sub45D580(); + } else { + if (_steps == 0) { + removeCallbacks(); + _flag113 = 0; + setFileHash(0x9966B138, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45D100); + } + _flag10E = 0; + SetSpriteCallback(&Class521::suMoveToPrevPoint); + _lastDistance = 640; + } + } +} + +void Class521::sub45D580() { + _flag10F = 1; + _flag10E = 1; + setCallback1(NULL); + setFileHash(0x192ADD30, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + SetAnimationCallback3(&Class521::sub45D5D0); +} + +void Class521::sub45D5D0() { + _flag10F = 1; + setCallback1(NULL); + setFileHash(0xF46A0324, 0, -1); + SetMessageHandler(&Class521::handleMessage45CC30); + SetUpdateHandler(&Class521::update); + setCallback1(AnimationCallback(&Class521::sub45D620)); + _value112 = 2; + sub45CDC0(); +} + +void Class521::sub45D620() { + _flag10F = 0; + _newMoveDirection = 0; + setDoDeltaX(2); + sub45D100(); +} + +void Class521::suMoveToNextPoint() { + int16 newX = _x, newY = _y; + + if (_currPointIndex >= (int)_pathPoints->size()) { + _moreY = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2006, 0); + return; + } + + if (_flag10E) { + if (_steps <= 0) { + sendMessage(this, 0x1019, 0); + return; + } else { + _steps--; + } + } else if (_steps < 11) { + _steps++; + } + + bool firstTime = true; + _anotherY = _steps; + int stepsCtr = _steps; + + while (stepsCtr > 0) { + NPoint pt1; + NPoint pt2 = pathPoint(_currPointIndex); + if (_currPointIndex + 1 >= (int)_pathPoints->size()) + pt1 = pathPoint(0); + else + pt1 = pathPoint(_currPointIndex + 1); + int16 deltaX = ABS(pt1.x - pt2.x); + int16 deltaY = ABS(pt1.y - pt2.y); + if (deltaX >= deltaY) { + _newMoveDirection = 2; + if (pt1.x < pt2.x) + _newMoveDirection = 4; + if (stepsCtr + _stepError >= deltaX) { + stepsCtr -= deltaX; + stepsCtr += _stepError; + _stepError = 0; + _currPointIndex++; + if (_currPointIndex == (int)_pathPoints->size() - 1) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError += stepsCtr; + if (pt1.x >= pt2.x) + newX += stepsCtr; + else + newX -= stepsCtr; + if (pt1.y >= pt2.y) + newY = pt2.y + (deltaY * _stepError) / deltaX; + else + newY = pt2.y - (deltaY * _stepError) / deltaX; + stepsCtr = 0; + } + } else { + _newMoveDirection = 3; + if (pt1.y < pt2.y) + _newMoveDirection = 1; + if (firstTime) { + if (pt1.y >= pt2.y) { + stepsCtr += 7; + } else { + stepsCtr -= 4; + if (stepsCtr < 0) + stepsCtr = 0; + } + _anotherY = stepsCtr; + } + if (stepsCtr + _stepError >= deltaY) { + stepsCtr -= deltaY; + stepsCtr += _stepError; + _stepError = 0; + _currPointIndex++; + if (_currPointIndex == (int)_pathPoints->size() - 1) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError += stepsCtr; + if (pt1.x >= pt2.x) + newX = pt2.x + (deltaX * _stepError) / deltaY; + else + newX = pt2.x - (deltaX * _stepError) / deltaY; + if (pt1.y >= pt2.y) + newY += stepsCtr; + else + newY -= stepsCtr; + stepsCtr = 0; + } + } + firstTime = false; + } + + if (_moreY != 0) { + _x = newX; + _y = newY; + _moreY -= _anotherY; + if (_moreY <= 0) { + _flag10E = 1; + _moreY = 0; + } + } else { + int distance = calcDistance(_someX, _someY, _x, _y); + _x = newX; + _y = newY; + if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { + _exitDirection = 0; + _field100 = 1; + } else if (_field100) { + _someX = pathPoint(_pathPoints->size() - 1).x; + _someY = pathPoint(_pathPoints->size() - 1).y; + _field100 = 0; + if (_x <= 20) + _exitDirection = 1; + else if (_x >= 620) + _exitDirection = 3; + else if (_y <= 20) + _exitDirection = 2; + else if (_y >= 460) + _exitDirection = 4; + if (_exitDirection != 0 && _flag10E) { + _flag10E = 0; + _steps = 11; + } + } + if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || + (_exitDirection == 0 && _lastDistance + 20 < distance)) + _flag10E = 1; + if (distance < _lastDistance) + _lastDistance = distance; + if (_currPointIndex == (int)_pathPoints->size() - 1) { + _flag10E = 1; + _moreY = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2006, 0); + } + } + +} + +void Class521::suMoveToPrevPoint() { + int16 newX = _x, newY = _y; + + if (_currPointIndex == 0 && _stepError == 0) { + _moreY = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2005, 0); + return; + } + + if (_flag10E) { + if (_steps <= 0) { + sendMessage(this, 0x1019, 0); + return; + } else { + _steps--; + } + } else if (_steps < 11) { + _steps++; + } + + bool firstTime = true; + _anotherY = _steps; + int stepsCtr = _steps; + + while (stepsCtr > 0) { + if (_stepError == 0) + _currPointIndex--; + NPoint pt1; + NPoint pt2 = pathPoint(_currPointIndex); + if (_currPointIndex + 1 >= (int)_pathPoints->size()) + pt1 = pathPoint(0); + else + pt1 = pathPoint(_currPointIndex + 1); + int16 deltaX = ABS(pt1.x - pt2.x); + int16 deltaY = ABS(pt1.y - pt2.y); + if (deltaX >= deltaY) { + _newMoveDirection = 4; + if (pt1.x < pt2.x) + _newMoveDirection = 2; + if (_stepError == 0) + _stepError = deltaX; + if (stepsCtr > _stepError) { + stepsCtr -= _stepError; + _stepError = 0; + if (_currPointIndex == 0) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError -= stepsCtr; + if (pt1.x >= pt2.x) + newX -= stepsCtr; + else + newX += stepsCtr; + if (pt1.y >= pt2.y) + newY = pt2.y + (deltaY * _stepError) / deltaX; + else + newY = pt2.y - (deltaY * _stepError) / deltaX; + stepsCtr = 0; + } + } else { + _newMoveDirection = 1; + if (pt1.y < pt2.y) + _newMoveDirection = 3; + if (firstTime) { + if (pt1.y >= pt2.y) { + stepsCtr -= 4; + if (stepsCtr < 0) + stepsCtr = 0; + } else { + stepsCtr += 7; + } + _anotherY = stepsCtr; + } + if (_stepError == 0) + _stepError = deltaY; + if (stepsCtr > _stepError) { + stepsCtr -= _stepError; + _stepError = 0; + if (_currPointIndex == 0) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError -= stepsCtr; + if (pt1.x >= pt2.x) + newX = pt2.x + (deltaX * _stepError) / deltaY; + else + newX = pt2.x - (deltaX * _stepError) / deltaY; + if (pt1.y >= pt2.y) + newY -= stepsCtr; + else + newY += stepsCtr; + stepsCtr = 0; + } + } + firstTime = false; + } + + if (_moreY != 0) { + _x = newX; + _y = newY; + _moreY -= _anotherY; + if (_moreY <= 0) { + _flag10E = 1; + _moreY = 0; + } + } else { + int distance = calcDistance(_someX, _someY, _x, _y); + _x = newX; + _y = newY; + if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { + _exitDirection = 0; + _field100 = 1; + } else if (_field100) { + _someX = pathPoint(0).x; + _someY = pathPoint(0).y; + _field100 = 0; + if (_x <= 20) + _exitDirection = 1; + else if (_x >= 620) + _exitDirection = 3; + else if (_y <= 20) + _exitDirection = 2; + else if (_y >= 460) + _exitDirection = 4; + if (_exitDirection != 0 && _flag10E) { + _flag10E = 0; + _steps = 11; + } + } + if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || + (_exitDirection == 0 && _lastDistance + 20 < distance)) + _flag10E = 1; + if (distance < _lastDistance) + _lastDistance = distance; + if (_currPointIndex == 0 && _stepError == 0) { + _flag10E = 1; + _moreY = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2005, 0); + } + } + +} + +void Class521::sub45E0A0() { + // TODO +} + +int Class521::calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) { + int16 deltaX = ABS(x1 - x2); + int16 deltaY = ABS(y1 - y2); + return sqrt(deltaX * deltaX + deltaY * deltaY); +} + +Class546::Class546(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _soundResource(vm), + _parentScene(parentScene) { + + setVisible(false); + SetMessageHandler(&Class546::handleMessage); + setFileHash1(); +} + +uint32 Class546::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + sub44D710(); + break; + case 0x4809: + sub44D790(); + break; + } + return messageResult; +} + +void Class546::sub44D710() { + setFileHash(0x08C80144, 0, -1); + setVisible(true); + SetAnimationCallback3(&Class546::sub44D760); + _soundResource.play(calcHash("fxDoorOpen23")); +} + +void Class546::sub44D760() { + sendMessage(_parentScene, 0x2033, 0); + setFileHash1(); + setVisible(false); +} + +void Class546::sub44D790() { + setFileHash(0x08C80144, -1, -1); + setVisible(true); + SetAnimationCallback3(&Class546::sub44D7F0); + _soundResource.play(calcHash("fxDoorClose23")); +} + +void Class546::sub44D7F0() { + sendMessage(_parentScene, 0x2034, 0); + setFileHash1(); +} + +Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { + + setDoDeltaX(1); + setFileHash(0x1209E09F, 1, -1); + _newHashListIndex = 1; +} + +Class548::Class548(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { + + setDoDeltaX(1); + _newHashListIndex = 0; +} + +Class518::Class518(NeverhoodEngine *vm, Class521 *class521) + : AnimatedSprite(vm, 1100), _class521(class521) { + + SetUpdateHandler(&Class518::update); + createSurface1(0x60281C10, 150); + setFileHash(0x60281C10, -1, -1); + _newHashListIndex = -2; +} + +void Class518::update() { + _x = _class521->getX(); + _y = _class521->getY(); + AnimatedSprite::update(); +} + +Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _class521(NULL), _countdown1(0) { + + setGlobalVar(0x21E60190, 1); + + _surfaceFlag = true; + SetMessageHandler(&Scene1608::handleMessage44D2A0); + + _class545 = insertSprite(this, 1, 1100, 198, 220); + _vm->_collisionMan->addSprite(_class545); + + if (which < 0) { + if (_vm->gameState().which == 1) + which = 1; + else { + setRectList(0x004B47D0); + insertKlayman(380, 438); + _klayman2 = _klayman; + _flag4 = false; + _class546 = insertSprite(this); + _sprite1 = insertStaticSprite(0x7D0404E8, 1100); + setMessageList(0x004B46A8); + setBackground(0x10080E01); + setPalette(0x10080E01); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + SetUpdateHandler(&Scene1608::update44CE90); + insertMouse433(0x80E05108); + insertStaticSprite(0x4B18F868, 1200); + } + } else if (which == 0) { + _vm->gameState().which = 0; + setRectList(0x004B47D0); + insertKlayman(0, 438); + _klayman2 = _klayman; + _flag4 = false; + setMessageList(0x004B46B0); + setBackground(0x10080E01); + setPalette(0x10080E01); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + insertMouse433(0x80E05108); + _sprite1 = insertStaticSprite(0x7D0404E8, 1100); + _class546 = insertSprite(this); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + SetUpdateHandler(&Scene1608::update44CE90); + sendMessage(_class546, 0x4808, 0); + insertStaticSprite(0x4B18F868, 1200); + } else if (which == 2) { + _vm->gameState().which = 1; + _dataResource.load(0x003C0492); + _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); + setBackground(0x98001604); + setPalette(0x98001604); + _palette->addPalette("paPodRed", 65, 31, 65); + insertMouse433(0x01600988); + _sprite2 = insertStaticSprite(0x491F38A8, 1100); + _class521 = createSprite(this, 375, 227); // Create but don't add to the sprite list yet + _class547 = insertSprite(375, 227); + _class548 = insertSprite(375, 227); + _class521->setVisible(false); + if (getGlobalVar(0xC0418A02)) { + insertKlayman(373, 220); + _klayman->setDoDeltaX(1); + } else { + insertKlayman(283, 220); + } + _klayman2 = _klayman; + setMessageList(0x004B47A8); + SetMessageHandler(&Scene1608::handleMessage44D3C0); + SetUpdateHandler(&Scene1608::update44CED0); + // NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original + _class521->setPathPoints(_roomPathPoints); + sendMessage(_class521, 0x2002, _roomPathPoints->size() - 1); + _sprite3 = insertStaticSprite(0xB47026B0, 1100); + _rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _rect2 = _rect1; + _rect2.y2 = 215; + _klayman->setClipRect(_rect1); + _class521->setClipRect(_rect1); + _class547->setClipRect(_rect1); + _class548->setClipRect(_rect1); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + insertSprite(_class521)->setClipRect(_rect1); + _flag4 = false; + _flag2 = false; + _flag1 = 0; + setRectList(0x004B4810); + } + + // NOTE: Not in the else because 'which' is set to 1 in the true branch + if (which == 1) { + _vm->gameState().which = 1; + _dataResource.load(0x003C0492); + _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); + setBackground(0x98001604); + setPalette(0x98001604); + _palette->addPalette("paPodRed", 65, 31, 65); + insertMouse433(0x01600988); + _class521 = insertSprite(this, 375, 227); + _class547 = insertSprite(375, 227); + _class548 = insertSprite(375, 227); + _sprite2 = insertStaticSprite(0x491F38A8, 1100); + _klayman2 = createSprite(this, 439, 220); // Special Klayman handling... + sendMessage(_klayman2, 0x2032, 1); + _klayman2->setDoDeltaX(1); + SetMessageHandler(&Scene1608::handleMessage44D470); + SetUpdateHandler(&Scene1608::update44D1E0); + _class547->setVisible(false); + _class548->setVisible(false); + // NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original + _class521->setPathPoints(_roomPathPoints); + sendMessage(_class521, 0x2002, 0); + sendMessage(_class521, 0x2008, 90); + _sprite3 = insertStaticSprite(0xB47026B0, 1100); + _rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _rect2 = _rect1; + _rect2.y2 = 215; + _klayman2->setClipRect(_rect1); + _class521->setClipRect(_rect1); + _class547->setClipRect(_rect1); + _class548->setClipRect(_rect1); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + // ... _vm->_collisionMan->addSprite(_asTape); + insertSprite(_class521)->setClipRect(_rect1); + _flag4 = true; + _flag2 = true; + _flag1 = 0; + } + + _palette->addPalette("paKlayRed", 0, 64, 0); + +} + +Scene1608::~Scene1608() { + setGlobalVar(0xC0418A02, _klayman2->isDoDeltaX() ? 1 : 0); + // Weird + if (_flag4) { + delete _klayman2; + } else { + delete _class521; + } +} + +void Scene1608::update44CE90() { + Scene::update(); + if (_countdown1 != 0 && (--_countdown1 == 0)) { + leaveScene(0); + } +} + +void Scene1608::update44CED0() { + Scene::update(); + if (_flag1 == 1) { + removeSurface(_klayman->getSurface()); + removeEntity(_klayman); + addSprite(_class521); + _flag4 = true; + clearRectList(); + SetUpdateHandler(&Scene1608::update44CFE0); + SetMessageHandler(&Scene1608::handleMessage44D510); + _class547->setVisible(false); + _class548->setVisible(false); + _class521->setVisible(true); + sendMessage(_class521, 0x2009, 0); + _class521->handleUpdate(); + _klayman = NULL; + _flag1 = 0; + } + if (_klayman2->getX() <= 375) { + _klayman2->setClipRect(_rect1); + } else { + _klayman2->setClipRect(_rect2); + } +} + +void Scene1608::update44CFE0() { + Scene::update(); + if (_mouseClicked) { + if (_mouseClickPos.x <= 329 && _class521->getX() == 375 && _class521->getY() == 227) { + sendMessage(_class521, 0x200A, 0); + SetUpdateHandler(&Scene1608::update44D0C0); + } else { + sendPointMessage(_class521, 0x2004, _mouseClickPos); + SetMessageHandler(&Scene1608::handleMessage44D470); + SetUpdateHandler(&Scene1608::update44D1E0); + } + _mouseClicked = false; + } + if (_klayman2->getX() <= 375) { + _klayman2->setClipRect(_rect1); + } else { + _klayman2->setClipRect(_rect2); + } +} + +void Scene1608::update44D0C0() { + Scene::update(); + if (_flag1 == 2) { + _klayman = _klayman2; + removeSurface(_class521->getSurface()); + removeEntity(_class521); + addSprite(_klayman); + _flag4 = false; + SetMessageHandler(&Scene1608::handleMessage44D3C0); + SetUpdateHandler(&Scene1608::update44CED0); + setRectList(0x004B4810); + _class547->setVisible(true); + _class548->setVisible(true); + _class521->setVisible(false); + setMessageList(0x004B4748); + runMessageList(); + _klayman->handleUpdate(); + _flag1 = 0; + } + if (_klayman2->getX() <= 375) { + _klayman2->setClipRect(_rect1); + } else { + _klayman2->setClipRect(_rect2); + } +} + +void Scene1608::update44D1E0() { + Scene::update(); + if (_mouseClicked) { + sendPointMessage(_class521, 0x2004, _mouseClickPos); + _mouseClicked = false; + } + if (_class521->getX() < 300) { + if (_flag2) { + _flag2 = false; + _class521->setClipRect(_rect1); + if (!_class521->isDoDeltaX()) + sendMessage(_class521, 0x200E, 0); + } + } else if (!_flag2) { + _flag2 = true; + _class521->setClipRect(_rect3); + } +} + +uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x20250B1A) { + clearRectList(); + _klayman->setVisible(false); + showMouse(false); + _sprite1->setVisible(false); + sendMessage(_class546, 0x4809, 0); + _countdown1 = 28; + } + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klayman2, 0x1014, _asTape); + setMessageList(0x004B4770); + } else if (sender == _class545) { + setMessageList(0x004B46C8); + } + break; + } + return 0; +} + +uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x60842040) { + _flag1 = true; + } + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + case 0x4826: + if (sender == _class545) { + sendEntityMessage(_klayman2, 0x1014, _class545); + setMessageList(0x004B4760); + } + break; + } + return 0; +} + +uint32 Scene1608::handleMessage44D470(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + leaveScene(1); + break; + case 0x2006: + SetMessageHandler(&Scene1608::handleMessage44D510); + SetUpdateHandler(&Scene1608::update44CFE0); + sendMessage(_class521, 0x200F, 1); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200A: + _flag1 = 2; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h new file mode 100644 index 0000000000..9af1a19b39 --- /dev/null +++ b/engines/neverhood/module1600.h @@ -0,0 +1,176 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1600_H +#define NEVERHOOD_MODULE1600_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1600 + +class Module1600 : public Module { +public: + Module1600(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1600(); +protected: + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class Class521 : public AnimatedSprite { +public: + Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); + ~Class521(); + void setPathPoints(NPointArray *pathPoints); +protected: + Scene *_parentScene; + NPointArray *_pathPoints; + NRectArray *_rectList; + int _newMoveDirection; + int _currMoveDirection; + int _exitDirection; + int _currPointIndex; + NPoint _againDestPt; + int _againDestPtFlag; + int _steps; + int _stepError; + int _idleCounter; + int _idleCounterMax; + int _lastDistance; + int _field100; + int _againDestPointFlag; + int _flag10E; + int _moreY; + int _flag10F; + int _flag113; + int _flag114; + int _flag11A; + int _newDeltaXType; + int _field11E; + int _againDestPointIndex; + int _value112; + int _anotherY; + int16 _someX, _someY; + NPoint pathPoint(uint index) { return (*_pathPoints)[index]; } + void update(); + void update45C790(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage45CC30(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage45CCA0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub45CD00(); + void sub45CDC0(); + void sub45CE10(); + void sub45CF80(); + void sub45CFB0(); + void sub45CFE0(); + void sub45D040(); + void sub45D050(); + void sub45D0A0(); + void sub45D0E0(); + void sub45D100(); + void sub45D180(); + void moveToNextPoint(); + void sub45D350(); + void sub45D390(); + void moveToPrevPoint(); + void sub45D580(); + void sub45D5D0(); + void sub45D620(); + void suMoveToNextPoint(); + void suMoveToPrevPoint(); + void sub45E0A0(); + int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2); +}; + +class Class546 : public AnimatedSprite { +public: + Class546(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub44D710(); + void sub44D760(); + void sub44D790(); + void sub44D7F0(); +}; + +class Class547 : public AnimatedSprite { +public: + Class547(NeverhoodEngine *vm, int16 x, int16 y); +}; + +class Class548 : public AnimatedSprite { +public: + Class548(NeverhoodEngine *vm, int16 x, int16 y); +}; + +class Class518 : public AnimatedSprite { +public: + Class518(NeverhoodEngine *vm, Class521 *class521); +protected: + Class521 *_class521; + void update(); +}; + +class Scene1608 : public Scene { +public: + Scene1608(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene1608(); +protected: + Class521 *_class521; + Sprite *_class545; + Sprite *_class546; + Sprite *_class547; + Sprite *_class548; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_asTape; + Klayman *_klayman2; + NRect _rect1; + NRect _rect2; + NRect _rect3; + int _flag1; + bool _flag2; + bool _flag3; + bool _flag4; + int _countdown1; + NPointArray *_roomPathPoints; + void update44CE90(); + void update44CED0(); + void update44CFE0(); + void update44D0C0(); + void update44D1E0(); + uint32 handleMessage44D2A0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage44D3C0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage44D470(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage44D510(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1600_H */ diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 441ee1e291..9a588f283f 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -274,6 +274,10 @@ void Scene::update() { } +void Scene::leaveScene(uint32 result) { + sendMessage(_parentModule, 0x1009, result); +} + uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0: // mouse moved diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 09d34b5734..e962266168 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -64,6 +64,7 @@ public: void changeMouseCursor(uint32 fileHash); SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); + void leaveScene(uint32 result); // Some crazy templated functions to make the logic code smaller/simpler (imo!) // insertKlayman template @@ -123,6 +124,35 @@ public: T* insertSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { return (T*)addSprite(new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6)); } + // createSprite + template + T* createSprite() { + return new T(_vm); + } + template + T* createSprite(Arg1 arg1) { + return new T(_vm, arg1); + } + template + T* createSprite(Arg1 arg1, Arg2 arg2) { + return new T(_vm, arg1, arg2); + } + template + T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3) { + return new T(_vm, arg1, arg2, arg3); + } + template + T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) { + return new T(_vm, arg1, arg2, arg3, arg4); + } + template + T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) { + return new T(_vm, arg1, arg2, arg3, arg4, arg5); + } + template + T* createSprite(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { + return new T(_vm, arg1, arg2, arg3, arg4, arg5, arg6); + } protected: Module *_parentModule; Common::Array _entities; -- cgit v1.2.3 From af2820fd23d152c7fddf77872198a07df680b46d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 23 Sep 2011 15:45:50 +0000 Subject: NEVERHOOD: Add leaveModule and leaveScene (instead of using sendMessage directly) --- engines/neverhood/module1000.cpp | 14 +++++++------- engines/neverhood/module1100.cpp | 6 +++--- engines/neverhood/module1200.cpp | 13 ++++++------- engines/neverhood/module1300.cpp | 16 ++++++++-------- engines/neverhood/module1400.cpp | 24 ++++++++++++------------ engines/neverhood/module1500.cpp | 6 +++--- engines/neverhood/module1700.cpp | 2 +- engines/neverhood/module1800.cpp | 8 ++++---- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2200.cpp | 8 ++++---- engines/neverhood/module2300.cpp | 10 +++++----- engines/neverhood/module3000.cpp | 16 ++++++++-------- 12 files changed, 62 insertions(+), 63 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 14bc4a41ea..26b68e1c9a 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -89,7 +89,7 @@ void Module1000::updateScene() { break; case 1: if (_moduleResult == 1) - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); else if (_moduleResult == 2) createScene(3, 0); else @@ -408,12 +408,12 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; case 0x000D: if (param.asInteger() == 0x188B2105) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); messageResult = 1; } break; @@ -1439,7 +1439,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { setGlobalVar(0x8306F218, 1); setGlobalVar(0x1B144052, 3); - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } break; case 0x000D: @@ -1447,7 +1447,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asInteger() == 0x48848178) { setGlobalVar(0x8306F218, 1); setGlobalVar(0x1B144052, 3); - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } messageResult = 1; break; @@ -1577,7 +1577,7 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; } @@ -1745,7 +1745,7 @@ uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; } diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 4bafbd96a1..740e4875bd 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -168,7 +168,7 @@ void Module1100::updateScene() { } break; case 6: - sendMessage(_parentModule, 0x1009, 1); + leaveModule(1); break; case 7: createScene(2, 2); @@ -177,7 +177,7 @@ void Module1100::updateScene() { if (_moduleResult == 0) { createScene(0, 0); } else if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 1002: @@ -651,7 +651,7 @@ void Scene1105::update() { createObjects(); } if (_flag4 && !_soundResource2.isPlaying()) { - sendMessage(_parentModule, 0x1009, _flag5); + leaveScene(_flag5); } if (_flag3 && !_soundResource3.isPlaying()) { sendMessage(_asTeddyBear, 0x2002, 0); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 8853dd0df4..83a9b5ccd9 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -77,10 +77,10 @@ void Module1200::updateScene() { if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { createScene(2, -1); } else { - sendMessage(_parentModule, 0x1009, 1); + leaveModule(1); } } else { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 1: @@ -1157,9 +1157,8 @@ Scene1202::~Scene1202() { void Scene1202::update() { Scene::update(); if (_soundFlag) { - if (!_soundResource4.isPlaying()) { - sendMessage(_parentModule, 0x1009, 0); - } + if (!_soundResource4.isPlaying()) + leaveScene(0); } else if (_counter == 0 && isSolved()) { SetMessageHandler(&Scene1202::handleMessage453D90); setGlobalVar(0x000CF819, 1); @@ -1191,7 +1190,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam ¶m, case 0x0001: // TODO: Debug/Cheat stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; case 0x000D: @@ -1215,7 +1214,7 @@ uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 1f3716b2a1..75a185b96c 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -214,7 +214,7 @@ void Module1300::updateScene() { } else if (_moduleResult == 3) { createScene(2, 0); } else if (_moduleResult == 0) { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } else if (_moduleResult == 1) { createScene(10, -1); } @@ -522,7 +522,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2002: if (_klayman->getX() > 545) { - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } break; case 0x2032: @@ -1036,7 +1036,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, SetMessageHandler(&Scene1306::handleMessage); break; case 0x4809: - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); break; case 0x482A: setSurfacePriority(_asElevator->getSurface(), 1100); @@ -1328,7 +1328,7 @@ void Scene1307::update() { _palette->startFadeToWhite(40); } if (_doLeaveScene && !_soundResource.isPlaying()) { - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); setGlobalVar(0x80455A41, 1); } } @@ -1368,7 +1368,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit } } } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } } break; @@ -1724,7 +1724,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit _klayman->setVisible(true); break; case 0x2001: - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); break; case 0x2003: _class601_1->setVisible(false); @@ -1868,7 +1868,7 @@ uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam ¶m, Ent uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); break; } return messageResult; @@ -1878,7 +1878,7 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity * uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); break; } return messageResult; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index b1354584b0..0045064314 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -94,7 +94,7 @@ void Module1400::updateScene() { } else if (_moduleResult == 2) { createScene(3, 0); } else { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 1: @@ -755,9 +755,9 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x1019: if (param.asInteger() != 0) { - sendMessage(_parentModule, 0x1009, 2); + leaveScene(2); } else { - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } break; case 0x480B: @@ -968,7 +968,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x00F43389) { if (getGlobalVar(0x70A1189C)) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } else { clearRectList(); _klayman->setVisible(false); @@ -980,9 +980,9 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x1019: if (param.asInteger()) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } else { - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } break; case 0x2000: @@ -992,7 +992,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2001: sub428230(); - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); break; case 0x2003: sub428230(); @@ -1277,7 +1277,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1407::update() { Scene::update(); if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) { - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) { _ssResetButton->setVisible(false); } @@ -1291,7 +1291,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO: Debug/Cheat stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { // Exit scene - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 && param.asPoint().y >= 62 && param.asPoint().y <= 90) { // The reset button was clicked @@ -1391,7 +1391,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x1019: - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); break; case 0x1022: if (sender == _class489) { @@ -1515,7 +1515,7 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x1019: - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); break; case 0x4826: if (sender == _class489) { @@ -1708,7 +1708,7 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x0001: // TODO: Debug/Cheat stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; case 0x000D: diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 54a46851d6..76afb956ff 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -67,14 +67,14 @@ void Module1500::updateScene() { if (_flag) { createScene(2, -1); } else { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 3: createScene(0, -1); break; default: - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); break; } } @@ -119,7 +119,7 @@ void Scene1501::update() { _countdown1--; if (_countdown1 == 0) { _vm->_screen->clear(); - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } } else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) { _countdown1 = 12; diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 8140608e8a..4426a7eb76 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -107,7 +107,7 @@ void Module1700::updateScene() { createScene(4, 0); break; case 4: - sendMessage(_parentModule, 0x1009, 1); + leaveModule(1); break; } } diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index d5aa789cbf..cce72b0a11 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -134,7 +134,7 @@ void Module1800::updateScene() { break; case 5: if (_moduleResult == 0) { - sendMessage(_parentModule, 0x1009, 2); + leaveModule(2); } else if (_moduleResult == 1) { createScene(4, 3); } @@ -143,14 +143,14 @@ void Module1800::updateScene() { createScene(8, -1); break; case 7: - sendMessage(_parentModule, 0x1009, 3); + leaveModule(3); break; case 8: - sendMessage(_parentModule, 0x1009, 1); + leaveModule(1); // TODO GameState stuff break; case 9: - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); break; } } else { diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 22ee648731..9c0843c3e1 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -68,7 +68,7 @@ void Module2000::updateScene() { switch (_vm->gameState().sceneNum) { case 0: if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } else { createScene(1, 0); } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index c37cdaced2..3751a6fe8a 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -229,7 +229,7 @@ void Module2200::updateScene() { } else if (_moduleResult == 2) { createScene(1, 0); } else { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 1: @@ -929,7 +929,7 @@ void Scene2202::update() { Scene::update(); if (_leaveScene && !_soundResource2.isPlaying()) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } if (_isSolved && !_soundResource1.isPlaying()) { @@ -966,7 +966,7 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x0001: // TODO Debug stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; case 0x000D: @@ -2356,7 +2356,7 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 40 || param.asPoint().x >= 600) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index dd4144f74f..1513f7ba40 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -107,7 +107,7 @@ void Module2300::updateScene() { if (_moduleResult == 1) { createScene(1, 4); } else { - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 1: @@ -120,21 +120,21 @@ void Module2300::updateScene() { } else if (_moduleResult == 4) { createScene(3, 1); } else if (_moduleResult == 5) { - sendMessage(_parentModule, 0x1009, 3); + leaveModule(3); } else { - sendMessage(_parentModule, 0x1009, 4); + leaveModule(4); } break; case 2: if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 3); + leaveModule(3); } else { createScene(1, 5); } break; case 3: if (_moduleResult == 1) { - sendMessage(_parentModule, 0x1009, 2); + leaveModule(2); } else { createScene(1, 1); } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index e7714c08fd..f645fb475b 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -169,7 +169,7 @@ void Module3000::updateScene() { if (_moduleResult == 0) createScene(9, -1); else if (_moduleResult == 1) - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } else { if (_moduleResult == 0) if (_navigationAreaType == 2) @@ -177,7 +177,7 @@ void Module3000::updateScene() { else createScene(1001, -1); else if (_moduleResult == 1) - sendMessage(_parentModule, 0x1009, 0); + leaveModule(0); } break; case 2: @@ -205,7 +205,7 @@ void Module3000::updateScene() { break; case 4: if (_moduleResult == 0) - sendMessage(_parentModule, 0x1009, 1); + leaveModule(1); else if (_moduleResult == 1) createScene(7, -1); else if (_moduleResult == 2) @@ -248,7 +248,7 @@ void Module3000::updateScene() { createScene(3, 3); break; case 11: - sendMessage(_parentModule, 0x1009, 3); + leaveModule(3); break; case 12: createScene(1, 0); @@ -931,7 +931,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO: Debug stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) { setGlobalVar(0x20580A86, 0); - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; case 0x000D: @@ -1014,7 +1014,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene3009::playExtVideo() { setGlobalVar(0x20580A86, _cannonLocation); setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]); - sendMessage(_parentModule, 0x1009, 1); + leaveScene(1); } bool Scene3009::isSymbolsPart1Solved() { @@ -1332,7 +1332,7 @@ void Scene3010::update() { _checkUnlocked = false; } if (_countdown != 0 && (--_countdown == 0)) { - sendMessage(_parentModule, 0x1009, _doorUnlocked ? 1 : 0); + leaveScene(_doorUnlocked ? 1 : 0); } } @@ -1608,7 +1608,7 @@ uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - sendMessage(_parentModule, 0x1009, 0); + leaveScene(0); } break; case 0x2000: -- cgit v1.2.3 From 2275141d56a66b8a6262fb2c160cce34c46af119 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 24 Sep 2011 20:37:14 +0000 Subject: NEVERHOOD: Add Scene1609 - Use Scene::insertSprite<> in all scenes --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module1200.cpp | 34 ++++++------- engines/neverhood/module1200.h | 2 +- engines/neverhood/module1300.cpp | 60 +++++++++++----------- engines/neverhood/module1400.cpp | 58 ++++++++++----------- engines/neverhood/module1400.h | 8 +-- engines/neverhood/module1600.cpp | 107 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module1600.h | 19 +++++++ engines/neverhood/module1700.cpp | 8 +-- engines/neverhood/module2200.cpp | 72 +++++++++++++------------- engines/neverhood/module3000.cpp | 50 +++++++----------- engines/neverhood/module3000.h | 2 + 12 files changed, 260 insertions(+), 162 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 854a5cc1fe..960e732ded 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -276,7 +276,7 @@ void GameModule::startup() { createModule(1000, -1); #endif #if 1 - _vm->gameState().sceneNum = 7; + _vm->gameState().sceneNum = 8; _vm->gameState().which = 1; createModule(1600, -1); #endif diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 83a9b5ccd9..ffb4f206ca 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -766,7 +766,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x9A2C0409); - _asTape = addSprite(new AsScene1201Tape(_vm, this, 3, 1100, 243, 340, 0x9148A011)); + _asTape = insertSprite(this, 3, 1100, 243, 340, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); tempSprite = insertStaticSprite(0x03C82530, 100); @@ -781,7 +781,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x04063110, 500); topY4 = tempSprite->getY() + 1; - _class466 = addSprite(new Class466(_vm, getGlobalVar(0x000CF819) && which != 1)); + _class466 = insertSprite(getGlobalVar(0x000CF819) && which != 1); _class466->setClipRect(0, topY4, 640, 480); insertStaticSprite(0x400B04B0, 1200); @@ -792,7 +792,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0xA29223FA, 1200); x2 = tempSprite->getX() + tempSprite->getDrawRect().width; - class464 = addSprite(new Class464(_vm)); + class464 = insertSprite(); debug("Scene1201: which = %d", which); @@ -833,20 +833,18 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } else { setBackground(0x40206EC5); setPalette(0x40206EC5); - _asRightDoor = addSprite(new AsScene1201RightDoor(_vm, _klayman, which == 2)); + _asRightDoor = insertSprite(_klayman, which == 2); } if (getGlobalVar(0x000CF819)) { insertStaticSprite(0x10002ED8, 500); if (!getGlobalVar(0x0A18CA33)) { - AsScene1201TntMan *asTntMan; - asTntMan = new AsScene1201TntMan(_vm, this, _class466, which == 1); - asTntMan->setClipRect(x1, 0, x2, 480); - _vm->_collisionMan->addSprite(asTntMan); - _asTntMan = addSprite(asTntMan); - tempSprite = addSprite(new Class465(_vm, _asTntMan)); + _asTntMan = insertSprite(this, _class466, which == 1); + _asTntMan->setClipRect(x1, 0, x2, 480); + _asTntMan->setRepl(64, 0); + _vm->_collisionMan->addSprite(_asTntMan); + tempSprite = insertSprite(_asTntMan); tempSprite->setClipRect(x1, 0, x2, 480); - asTntMan->setRepl(64, 0); } uint32 tntIndex = 1; @@ -859,7 +857,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) clipY2 = topY2; else clipY2 = topY3; - addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2)); + insertSprite(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2); elemIndex = getSubVar(0x10055D14, tntIndex + 1); if (kScene1201PointArray[elemIndex].y < 175) clipY2 = topY1; @@ -867,7 +865,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) clipY2 = topY2; else clipY2 = topY3; - addSprite(new SsScene1201Tnt(_vm, tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2)); + insertSprite(tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2); tntIndex += 3; } @@ -895,7 +893,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) else clipY2 = topY3; } - addSprite(new SsScene1201Tnt(_vm, tntIndex, getSubVar(0x10055D14, tntIndex), clipY2)); + insertSprite(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2); tntIndex++; } @@ -909,7 +907,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x63D400BC, 900); - _asLeftDoor = addSprite(new AsScene1201LeftDoor(_vm, _klayman)); + _asLeftDoor = insertSprite(_klayman); _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) { @@ -919,12 +917,12 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asMatch = NULL; if (getGlobalVar(0x0112090A) < 3) { - _asMatch = addSprite(new AsScene1201Match(_vm, this)); + _asMatch = insertSprite(this); _vm->_collisionMan->addSprite(_asMatch); } if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { - _asCreature = addSprite(new AsScene1201Creature(_vm, this, _klayman)); + _asCreature = insertSprite(this, _klayman); _asCreature->setClipRect(x1, 0, x2, 480); } @@ -1131,7 +1129,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x10ED160A, 20, 620); for (int i = 0; i < 18; i++) { - _asTntItems[i] = addSprite(new AsScene1202TntItem(_vm, this, i)); + _asTntItems[i] = insertSprite(this, i); _vm->_collisionMan->addSprite(_asTntItems[i]); } diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index a34bd958e6..dc8e903472 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -179,7 +179,7 @@ protected: // TODO ResourceTable _resourceTable1; // TODO ResourceTable _resourceTable2; Sprite *_asMatch; - Sprite *_asTntMan; + AsScene1201TntMan *_asTntMan; Sprite *_asCreature; Sprite *_class466; Sprite *_asLeftDoor; diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 75a185b96c..26b61f0e52 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -424,20 +424,20 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x420643C4); insertMouse433(0x643C0428); - _class595 = addSprite(new Class595(_vm, this)); + _class595 = insertSprite(this); _sprite1 = insertStaticSprite(0x942FC224, 300); _sprite2 = insertStaticSprite(0x70430830, 1200); _sprite2->setVisible(false); _sprite3 = insertStaticSprite(0x16E01E20, 1100); - _asRing1 = addSprite(new AsScene1002Ring(_vm, this, false, 218, 122, _class595->getDrawRect().y, false)); - _asRing2 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309))); - _asRing3 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false)); - _asRing4 = addSprite(new AsScene1002Ring(_vm, this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E))); - _asRing5 = addSprite(new AsScene1002Ring(_vm, this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false)); + _asRing1 = insertSprite(this, false, 218, 122, _class595->getDrawRect().y, false); + _asRing2 = insertSprite(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309)); + _asRing3 = insertSprite(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false); + _asRing4 = insertSprite(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E)); + _asRing5 = insertSprite(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false); - _asBridge = addSprite(new AsScene1302Bridge(_vm, this)); - _ssFence = addSprite(new SsScene1302Fence(_vm)); + _asBridge = insertSprite(this); + _ssFence = insertSprite(); _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); if (which < 0) { @@ -450,7 +450,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); - _asVenusFlyTrap = addSprite(new AsScene1002VenusFlyTrap(_vm, this, _klayman, true)); + _asVenusFlyTrap = insertSprite(this, _klayman, true); _vm->_collisionMan->addSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); @@ -643,7 +643,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x81A9801D); if (!getGlobalVar(0xAC00C0D0)) { - _asBalloon = addSprite(new AsScene1303Balloon(_vm, this)); + _asBalloon = insertSprite(this); _vm->_collisionMan->addSprite(_asBalloon); } @@ -711,15 +711,15 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xC021006A); if (getGlobalVar(0xAC00C0D0)) { - _class545 = addSprite(new Class545(_vm, this, 0, 1100, 278, 347)); + _class545 = insertSprite(this, 0, 1100, 278, 347); _vm->_collisionMan->addSprite(_class545); } else { - _class545 = addSprite(new AnimatedSprite(_vm, 0x80106018, 100, 279, 48)); + _class545 = insertSprite(0x80106018, 100, 279, 48); // TODO _class545->setUpdateDeltaXY(); } if (!getGlobalVar(0x31C63C51)) { - _class544 = addSprite(new Class544(_vm, this, 1100, 278, 347)); + _class544 = insertSprite(this, 1100, 278, 347); _vm->_collisionMan->addSprite(_class544); } else { _class544 = NULL; @@ -893,20 +893,19 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x0311005B); if (!getGlobalVar(0x13382860)) { - _class545 = addSprite(new Class545(_vm, this, 2, 1100, 435, 445)); + _class545 = insertSprite(this, 2, 1100, 435, 445); _vm->_collisionMan->addSprite(_class545); } - _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x404A36A0, 100, 0x440C1000)); + _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); - _asTape = addSprite(new AsScene1201Tape(_vm, this, 19, 1100, 359, 445, 0x9148A011)); + _asTape = insertSprite(this, 19, 1100, 359, 445, 0x9148A011); - _asElevatorDoor = new AnimatedSprite(_vm, 0x043B0270, 90, 320, 240); + _asElevatorDoor = insertSprite(0x043B0270, 90, 320, 240); _asElevatorDoor->setFileHash(0x043B0270, 6, -1); _asElevatorDoor->setNewHashListIndex(6); - addSprite(_asElevatorDoor); - _asElevator = addSprite(new AsScene1306Elevator(_vm, this, _asElevatorDoor)); + _asElevator = insertSprite(this, _asElevatorDoor); _sprite1 = insertStaticSprite(0x036A1EE0, 80); @@ -1309,7 +1308,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (getSubVar(0x08D0AB11, keyIndex)) { - _asKeys[keyIndex] = addSprite(new AsScene1307Key(_vm, this, keyIndex, _clipRects)); + _asKeys[keyIndex] = insertSprite(this, keyIndex, _clipRects); _vm->_collisionMan->addSprite(_asKeys[keyIndex]); } else { _asKeys[keyIndex] = NULL; @@ -1600,21 +1599,21 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x41024202); insertMouse433(0x24206418); - _asTape = addSprite(new AsScene1201Tape(_vm, this, 17, 1100, 502, 445, 0x9148A011)); + _asTape = insertSprite(this, 17, 1100, 502, 445, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); if (getGlobalVar(0x01023818)) { - addSprite(new Class513(_vm)); - addSprite(new AnimatedSprite(_vm, 0x461A1490, 200, 235, 429)); + insertSprite(); + insertSprite(0x461A1490, 200, 235, 429); } _sprite1 = insertStaticSprite(0x0A042060, 1100); - _class549 = addSprite(new Class549(_vm, this)); - _class593 = addSprite(new Class593(_vm, this)); + _class549 = insertSprite(this); + _class593 = insertSprite(this); - _class601_1 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0)); - _class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1)); - _class601_2 = addSprite(new Class601(_vm, kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2)); + _class601_1 = insertSprite(kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0); + _class601_2 = insertSprite(kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1); + _class601_2 = insertSprite(kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2); _sprite2 = insertStaticSprite(0x40043120, 995); _sprite3 = insertStaticSprite(0x43003100, 995); @@ -1644,7 +1643,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(475, 440); setMessageList(0x004B58B0); if (getGlobalVar(0x80455A41)) { - _sprite5 = addSprite(new Class592(_vm, this)); + _sprite5 = insertSprite(this); _sprite4 = insertStaticSprite(0x0101A624, 1100); _sprite4->setVisible(false); } else { @@ -1672,8 +1671,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x04A105B3) == 4) { - _class489 = new Class489(_vm, this, _klayman, 0); - addSprite(_class489); + _class489 = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_class489); _class489->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _class489->setRepl(64, 0); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 0045064314..37fb354b54 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -667,17 +667,17 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x08221FA5); insertMouse433(0x21FA108A); - // TODO _class427 = addSprite(new Class427(_vm, this, 0x980F3124, 0x12192892, 100, 0)); - _class525 = addSprite(new Class525(_vm)); + // TODO _class427 = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); + _class525 = insertSprite(); if (!getGlobalVar(0x01023818)) { - _class526 = addSprite(new Class526(_vm, _class525)); - _class527 = addSprite(new Class527(_vm, _class525)); + _class526 = insertSprite(_class525); + _class527 = insertSprite(_class525); } _sprite3 = insertStaticSprite(0xA82BA811, 1100); insertStaticSprite(0x0A116C60, 1100); - _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0xB84B1100, 100, 0)); + _ssButton = insertSprite(this, 0xB84B1100, 100, 0); _sprite1 = insertStaticSprite(0x38EA100C, 1005); _sprite2 = insertStaticSprite(0x98D0223C, 1200); _sprite2->setVisible(false); @@ -701,7 +701,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x04A105B3) == 2) { - _class489 = addSprite(new Class489(_vm, this, _klayman, _class525)); + _class489 = insertSprite(this, _klayman, _class525); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x04A10F33) == 6) { sendEntityMessage(_klayman, 0x1014, _class489); @@ -719,11 +719,11 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); - if (which == 0 && _class489 && _class489->hasMessageHandler()) { + if (which == 0 && _class489) { sendMessage(_class489, 0x482B, 0); } - _class528 = addSprite(new Class528(_vm, _klayman, which == 1)); + _class528 = insertSprite(_klayman, which == 1); } @@ -746,7 +746,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x402064D8) { sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x01C66840) { - if (_class528->hasMessageHandler() && sendMessage(_class528, 0x2001, 0) != 0) { + if (sendMessage(_class528, 0x2001, 0) != 0) { setMessageList(0x004B6690); } else { setMessageList(0x004B66B0); @@ -882,9 +882,9 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(0x91D3A391, 0, 64, 0); insertMouse433(0x482F4239); - _class454_1 = addSprite(new Class454(_vm, 0x15402D64, 1100)); - _class454_2 = addSprite(new Class454(_vm, 0x10A02120, 1100)); - _class454_3 = addSprite(new Class454(_vm, 0x60882BE0, 1100)); + _class454_1 = insertSprite(0x15402D64, 1100); + _class454_2 = insertSprite(0x10A02120, 1100); + _class454_3 = insertSprite(0x60882BE0, 1100); if (getGlobalVar(0x70A1189C)) setRectList(0x004B0C48); @@ -895,7 +895,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(377, 391); setMessageList(0x004B0B48); if (!getGlobalVar(0x70A1189C)) { - _class482 = addSprite(new Class482(_vm, this, 0)); + _class482 = insertSprite(this, 0); } } else if (which == 1) { insertKlayman(42, 391); @@ -905,18 +905,18 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B0B60); _klayman->setDoDeltaX(1); if (getGlobalVar(0x70A1189C)) { - _class482 = addSprite(new Class482(_vm, this, 1)); + _class482 = insertSprite(this, 1); clearRectList(); showMouse(false); sub428220(); } else { - _class482 = addSprite(new Class482(_vm, this, 0)); + _class482 = insertSprite(this, 0); } } else { insertKlayman(513, 391); setMessageList(0x004B0B58); if (!getGlobalVar(0x70A1189C)) { - _class482 = addSprite(new Class482(_vm, this, 2)); + _class482 = insertSprite(this, 2); sub428220(); } } @@ -926,7 +926,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x4A105B3) == 1) { - _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); + _class489 = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x4A10F33) == 4) { sendEntityMessage(_klayman, 0x1014, _class489); @@ -1268,7 +1268,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x00442225); insertMouse435(0x4222100C, 20, 620); - _asMouse = addSprite(new AsScene1407Mouse(_vm, this)); + _asMouse = insertSprite(this); _ssResetButton = insertStaticSprite(0x12006600, 100); _ssResetButton->setVisible(false); @@ -1340,13 +1340,11 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _class401_3 = insertStaticSprite(0x08742271, 995); - _asTape1 = new AsScene1201Tape(_vm, this, 12, 1100, 201, 468, 0x9148A011); - addSprite(_asTape1); + _asTape1 = insertSprite(this, 12, 1100, 201, 468, 0x9148A011); _vm->_collisionMan->addSprite(_asTape1); _asTape1->setRepl(64, 0); - _asTape2 = new AsScene1201Tape(_vm, this, 16, 1100, 498, 468, 0x9048A093); - addSprite(_asTape2); + _asTape2 = insertSprite(this, 16, 1100, 498, 468, 0x9048A093); _vm->_collisionMan->addSprite(_asTape2); _asTape2->setRepl(64, 0); @@ -1360,10 +1358,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setRepl(64, 0); if (getGlobalVar(0x04A105B3) == 4) { - Class489 *class489; - class489 = new Class489(_vm, this, _klayman, 0); - _class489 = class489; - addSprite(_class489); + _class489 = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x04A10F33) == 4) { sendEntityMessage(_klayman, 0x1014, _class489); @@ -1372,7 +1367,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B1F70); } _class489->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2()); - class489->setRepl(64, 0); + _class489->setRepl(64, 0); } } @@ -1454,13 +1449,13 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xB006BAC8); if (getGlobalVar(0x13382860) == 5) { - _class545 = addSprite(new Class545(_vm, this, 2, 1100, 267, 411)); + _class545 = insertSprite(this, 2, 1100, 267, 411); _vm->_collisionMan->addSprite(_class545); } _sprite1 = insertStaticSprite(0x1900A1F8, 1100); - _asTape = addSprite(new AsScene1201Tape(_vm, this, 14, 1100, 281, 411, 0x9148A011)); + _asTape = insertSprite(this, 14, 1100, 281, 411, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); if (which < 0) { @@ -1483,7 +1478,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x04A105B3) == 3) { - _class489 = addSprite(new Class489(_vm, this, _klayman, 0)); + _class489 = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_class489); if (getGlobalVar(0x04A10F33) == 0) { sendEntityMessage(_klayman, 0x1014, _class489); @@ -1673,8 +1668,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) } for (uint32 index = 0; index < 48; index++) { - _tiles[index] = new AsScene1405Tile(_vm, this, index); - addSprite(_tiles[index]); + _tiles[index] = insertSprite(this, index); _vm->_collisionMan->addSprite(_tiles[index]); if (getSubVar(0xCCE0280F, index)) _tilesLeft--; diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 7b4d95761b..d256b82134 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -143,7 +143,7 @@ public: protected: bool _flag; Sprite *_class427; - Sprite *_class489; + Class489 *_class489; Sprite *_class525; Sprite *_class526; Sprite *_class527; @@ -184,7 +184,7 @@ protected: Sprite *_class454_2; Sprite *_class454_3; Sprite *_class482; - Sprite *_class489; + Class489 *_class489; bool _flag; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -237,7 +237,7 @@ protected: Sprite *_class401_3; AsScene1201Tape *_asTape1; AsScene1201Tape *_asTape2; - Sprite *_class489; + Class489 *_class489; bool _flag; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -251,7 +251,7 @@ public: protected: Sprite *_sprite1; Sprite *_asTape; - Sprite *_class489; + Class489 *_class489; Sprite *_class545; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index a23e7101b4..94b836a26f 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -83,7 +83,7 @@ void Module1600::createScene(int sceneNum, int which) { _childObject = new Scene1608(_vm, this, which); break; case 8: -//TODO _childObject = new Scene1609(_vm, this, which); + _childObject = new Scene1609(_vm, this, which); break; case 1001: if (getGlobalVar(0xA0808898) == 1) { @@ -1384,4 +1384,109 @@ uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam ¶m, return 0; } +Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource(vm), _countdown1(1), + _index1(0), _index3(0), _flag5(true), _flag6(false) { + + // TODO _vm->gameModule()->initScene3011Vars(); + _index2 = getGlobalVar(0x2414C2F2); + + _surfaceFlag = true; + SetMessageHandler(&Scene1609::handleMessage); + SetUpdateHandler(&Scene1609::update); + + setBackground(0x92124A14); + setPalette(0x92124A14); + + for (int i = 0; i < 12; i++) + _asSymbols[i] = insertSprite(i, false); + + _ssButton = insertSprite(this, true); + _vm->_collisionMan->addSprite(_ssButton); + + insertMouse435(0x24A10929, 20, 620); + + _soundResource.load(0x68E25540); + +} + +void Scene1609::update() { + if (!_flag6 && _countdown1 != 0 && (--_countdown1 == 0)) { + if (_flag5) { + _index1++; + if (_index1 >= 12) + _index1 = 0; + _asSymbols[_index3]->change(_index1 + 12, _index1 == (int)getSubVar(0x04909A50, _index2)); + _flag5 = false; + _countdown1 = 36; + } else { + _asSymbols[_index3]->hide(); + _flag5 = true; + _countdown1 = 12; + } + } + if (_flag6 && !_soundResource.isPlaying()) { + leaveScene(1); + } + Scene::update(); +} + +uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO: Debug stuff + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + // TODO: Debug stuff + case 0x2000: + if (!_flag6) { + if (_flag5) + _asSymbols[_index3]->change(_index1 + 12, false); + _asSymbols[_index3]->stopSound(); + _index3++; + if (_index3 >= 12) { + if (testVars()) { + _soundResource.play(); + setGlobalVar(0x2C531AF8, 1); + _flag6 = true; + } else { + _index3 = 0; + for (int i = 0; i < 12; i++) + _asSymbols[i]->hide(); + } + } + _flag5 = true; + _countdown1 = 1; + } + break; + } + return 0; +} + +bool Scene1609::testVars() { + int index1 = 0; + do { + int cmpIndex = _asSymbols[0]->getIndex(); + if (!_asSymbols[0]->getFlag1()) + cmpIndex -= 12; + if ((int)getSubVar(0x04909A50, index1) == cmpIndex) + break; + index1++; + } while(1); + for (int index2 = 0; index2 < 12; index2++) { + int cmpIndex = _asSymbols[index2]->getIndex(); + if (!_asSymbols[index2]->getFlag1()) + cmpIndex -= 12; + if ((int)getSubVar(0x04909A50, index1) != cmpIndex) + return false; + _index1++; + if (_index1 >= 12) + _index1 = 0; + _index2++; + } + return true; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 9af1a19b39..1096377938 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -26,6 +26,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/module3000.h" namespace Neverhood { @@ -171,6 +172,24 @@ protected: uint32 handleMessage44D510(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene1609 : public Scene { +public: + Scene1609(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SoundResource _soundResource; + Sprite *_ssButton; + AsScene3011Symbol *_asSymbols[12]; + int _index1; + int _index2; + int _index3; + int _countdown1; + bool _flag5; + bool _flag6; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + bool testVars(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE1600_H */ diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 4426a7eb76..ae7a7fdc7a 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -195,13 +195,13 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x18222039); - addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0)); - addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1)); - addSprite(new Class602(_vm, kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2)); + insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0); + insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1); + insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2); _sprite = insertStaticSprite(0x31313A22, 1100); - _class606 = addSprite(new Class606(_vm, this, 15, 1100, 238, 439, 0x02363852)); + _class606 = insertSprite(this, 15, 1100, 238, 439, 0x02363852); _vm->_collisionMan->addSprite(_class606); which = 4; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 3751a6fe8a..97729cbb00 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -514,14 +514,14 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x40008208); insertMouse433(0x0820C408); - _asTape = addSprite(new AsScene1201Tape(_vm, this, 7, 1100, 459, 432, 0x9148A011)); + _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _ssDoorButton = addSprite(new Class426(_vm, this, 0xE4A43E29, 0xE4A43E29, 100, 0)); + _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); for (uint32 i = 0; i < 9; i++) { if ((int16)getSubVar(0x484498D0, i) >= 0) { - addSprite(new Class444(_vm, i, (int16)getSubVar(0x484498D0, i))); + insertSprite(i, (int16)getSubVar(0x484498D0, i)); } } @@ -551,11 +551,11 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { insertKlayman(300, 427, &_rect1, 2); setMessageList(0x004B8118); - _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); + _asDoor = insertSprite(_klayman, _doorLightSprite, false); } else if (which == 1) { insertKlayman(412, 393, &_rect1, 2); setMessageList(0x004B8130); - _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); + _asDoor = insertSprite(_klayman, _doorLightSprite, false); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { insertKlayman(379, 427, &_rect1, 2); @@ -564,15 +564,15 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(261, 427, &_rect1, 2); } setMessageList(0x004B8178); - _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, false)); + _asDoor = insertSprite(_klayman, _doorLightSprite, false); } else { NPoint pt = _dataResource.getPoint(0x0304D8DC); insertKlayman(pt.x, pt.y, &_rect1, 2); setMessageList(0x004B8120); - _asDoor = addSprite(new AsScene2201Door(_vm, _klayman, _doorLightSprite, true)); + _asDoor = insertSprite(_klayman, _doorLightSprite, true); } - addSprite(new AsScene2201CeilingFan(_vm)); + insertSprite(); // TODO Sound1ChList_addSoundResource(0x04106220, 0x81212040, true); @@ -598,7 +598,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asInteger() == 0x402064D8) { sendEntityMessage(_klayman, 0x1014, _ssDoorButton); } else if (param.asInteger() == 0x35803198) { - if (_asDoor->hasMessageHandler() && sendMessage(_asDoor, 0x2000, 0)) { + if (sendMessage(_asDoor, 0x2000, 0)) { setMessageList(0x004B81A0); } else { setMessageList(0x004B81B8); @@ -904,7 +904,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) for (uint32 index = 0; index < 9; index++) { int16 value = (int16)getSubVar(0x484498D0, index); if (value >= 0) { - Sprite *puzzleTileSprite = addSprite(new SsScene2202PuzzleTile(_vm, this, index, value)); + Sprite *puzzleTileSprite = insertSprite(this, index, value); _vm->_collisionMan->addSprite(puzzleTileSprite); } } @@ -1128,15 +1128,15 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B8320); if (getGlobalVar(0x13382860) == 1) { - _class545 = addSprite(new Class545(_vm, this, 2, 1100, 282, 432)); + _class545 = insertSprite(this, 2, 1100, 282, 432); _vm->_collisionMan->addSprite(_class545); } - _asTape = addSprite(new AsScene1201Tape(_vm, this, 1, 1100, 435, 432, 0x9148A011)); + _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _asLeftDoor = addSprite(new AsScene2203Door(_vm, this, 0)); - _asRightDoor = addSprite(new AsScene2203Door(_vm, this, 1)); + _asLeftDoor = insertSprite(this, 0); + _asRightDoor = insertSprite(this, 1); _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); _ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100); @@ -1280,21 +1280,19 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x0008028D); addEntity(_palette); insertMouse433(0x80289008); - _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0x2D309030, 100, 0); - addSprite(_ssLightSwitch); + _ssLightSwitch = insertSprite(this, 0x2D339030, 0x2D309030, 100, 0); } else { _isLightOn = false; setBackground(0xD00A028D); setPalette(0xD00A028D); addEntity(_palette); insertMouse433(0xA0289D08); - _ssLightSwitch = new Class426(_vm, this, 0x2D339030, 0xDAC86E84, 100, 0); - addSprite(_ssLightSwitch); + _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); } _palette->addBasePalette(0xD00A028D, 0, 256, 0); - _ssDoorFrame = addSprite(new SsScene2205DoorFrame(_vm)); + _ssDoorFrame = insertSprite(); if (which < 0) { insertKlayman(320, 417); @@ -1533,25 +1531,25 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x2201266A, 100); _sprite2 = insertStaticSprite(0x3406A333, 300); _sprite3 = insertStaticSprite(0x24A223A2, 100); - _sprite4 = addSprite(new Class603(_vm, 0x26133023)); + _sprite4 = insertSprite(0x26133023); _sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8AF8); - _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x0E038022, 100, 0)); + _sprite5 = insertSprite(this, 0x0E038022, 100, 0); insertMouse433(0x83212411); - _class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x5E00E262)); - _class604 = addSprite(new Class604(_vm, 0x085E25E0)); + _class607 = insertSprite(this, 1100, /*464, 433, */0x5E00E262); + _class604 = insertSprite(0x085E25E0); } else { fileHash = 0xE0102A45; _sprite1 = insertStaticSprite(0x1C1106B8, 100); _sprite2 = insertStaticSprite(0x020462E0, 300); _sprite3 = insertStaticSprite(0x900626A2, 100); - _sprite4 = addSprite(new Class603(_vm, 0x544822A8)); + _sprite4 = insertSprite(0x544822A8); _sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8B58); - _sprite5 = addSprite(new SsCommonButtonSprite(_vm, this, 0x16882608, 100, 0)); + _sprite5 = insertSprite(this, 0x16882608, 100, 0); insertMouse433(0x02A41E09); - _class607 = addSprite(new Class607(_vm, this, 1100, /*464, 433, */0x52032563)); - _class604 = addSprite(new Class604(_vm, 0x317831A0)); + _class607 = insertSprite(this, 1100, /*464, 433, */0x52032563); + _class604 = insertSprite(0x317831A0); } _class604->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); @@ -2031,7 +2029,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B38E8); - _asElevator = addSprite(new AsScene2207Elevator(_vm, this)); + _asElevator = insertSprite(this); if (getGlobalVar(0x4D080E54)) { @@ -2043,19 +2041,19 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); - _asTape = addSprite(new AsScene1201Tape(_vm, this, 4, 1100, 277, 428, 0x9148A011)); + _asTape = insertSprite(this, 4, 1100, 277, 428, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _asLever = addSprite(new AsScene2207Lever(_vm, this, 527, 333, 0)); + _asLever = insertSprite(this, 527, 333, 0); _vm->_collisionMan->addSprite(_asLever); - _asWallRobotAnimation = addSprite(new AsScene2207WallRobotAnimation(_vm, this)); - _asWallCannonAnimation = addSprite(new AsScene2207WallCannonAnimation(_vm)); + _asWallRobotAnimation = insertSprite(this); + _asWallCannonAnimation = insertSprite(); _asWallRobotAnimation->setVisible(false); _asWallCannonAnimation->setVisible(false); - _ssButton = addSprite(new SsCommonButtonSprite(_vm, this, 0x2C4061C4, 100, 0)); + _ssButton = insertSprite(this, 0x2C4061C4, 100, 0); _asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480); _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); @@ -2071,9 +2069,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); - addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0)); - addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1)); - addSprite(new SsScene2207Symbol(_vm, kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2)); + insertSprite(kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0); + insertSprite(kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1); + insertSprite(kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2); _asTape = NULL; _asLever = NULL; @@ -2444,7 +2442,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B3E18); } - _asTape = addSprite(new AsScene1201Tape(_vm, this, 10, 1100, 464, 435, 0x9148A011)); + _asTape = insertSprite(this, 10, 1100, 464, 435, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); if (which < 0) { diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index f645fb475b..d979bbb7a8 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -735,15 +735,10 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene updatePosition(); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009Symbol::handleMessage); - - _ssArrowPrev = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 0); - _parentScene->addSprite(_ssArrowPrev); + _ssArrowPrev = _parentScene->insertSprite(this, _index * 2 + 0); _vm->_collisionMan->addSprite(_ssArrowPrev); - - _ssArrowNext = new SsScene3009SymbolArrow(_vm, this, _index * 2 + 1); - _parentScene->addSprite(_ssArrowNext); + _ssArrowNext = _parentScene->insertSprite(this, _index * 2 + 1); _vm->_collisionMan->addSprite(_ssArrowNext); - } uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -798,15 +793,13 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0xD000420C); insertMouse435(0x04208D08, 20, 620); - _ssFireCannonButton = addSprite(new SsScene3009FireCannonButton(_vm, this)); + _ssFireCannonButton = insertSprite(this); _vm->_collisionMan->addSprite(_ssFireCannonButton); - _asVerticalIndicator = new AsScene3009VerticalIndicator(_vm, this, _cannonLocation); - addSprite(_asVerticalIndicator); + _asVerticalIndicator = insertSprite(this, _cannonLocation); _vm->_collisionMan->addSprite(_asVerticalIndicator); - _asHorizontalIndicator = new AsScene3009HorizontalIndicator(_vm, this, _cannonLocation); - addSprite(_asHorizontalIndicator); + _asHorizontalIndicator = insertSprite(this, _cannonLocation); _vm->_collisionMan->addSprite(_asHorizontalIndicator); if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) { @@ -826,16 +819,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x8540252C, 400); for (int i = 0; i < 2; i++) { - _ssSymbolEdges[i] = new SsScene3009SymbolEdges(_vm, i); - addSprite(_ssSymbolEdges[i]); - _ssTargetLines[i] = new SsScene3009TargetLine(_vm, i); - addSprite(_ssTargetLines[i]); + _ssSymbolEdges[i] = insertSprite(i); + _ssTargetLines[i] = insertSprite(i); } - for (int i = 0; i < 6; i++) { - _asSymbols[i] = new AsScene3009Symbol(_vm, this, i); - addSprite(_asSymbols[i]); + _asSymbols[i] = insertSprite(this, i); if (i < 3) _correctSymbols[i] = getSubVar(0x00504B86, i); else @@ -1294,10 +1283,8 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x80802626); for (int i = 0; i < 3; i++) { - _asDeadBolts[i] = new AsScene3010DeadBolt(_vm, this, i, which == 1);//CHECKME - addSprite(_asDeadBolts[i]); - _ssDeadBoltButtons[i] = new SsScene3010DeadBoltButton(_vm, this, i, initCountdown, which == 1);//CHECKME - addSprite(_ssDeadBoltButtons[i]); + _asDeadBolts[i] = insertSprite(this, i, which == 1);//CHECKME + _ssDeadBoltButtons[i] = insertSprite(this, i, initCountdown, which == 1);//CHECKME _vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]); if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i])) initCountdown++; @@ -1533,28 +1520,25 @@ void AsScene3011Symbol::change(int index, bool flag) { Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) { - _surfaceFlag = true; - // TODO _vm->gameModule()->initScene3011Vars(); _index1 = getGlobalVar(0x2414C2F2); + _surfaceFlag = true; + SetMessageHandler(&Scene3011::handleMessage); + SetUpdateHandler(&Scene3011::update); + setBackground(0x92124A04); setPalette(0xA4070114); addEntity(_palette); insertMouse435(0x24A00929, 20, 620); - for (int i = 0; i < 12; i++) { - _asSymbols[i] = new AsScene3011Symbol(_vm, i, true); - addSprite(_asSymbols[i]); - } + for (int i = 0; i < 12; i++) + _asSymbols[i] = insertSprite(i, true); - _ssButton = addSprite(new SsScene3011Button(_vm, this, true)); + _ssButton = insertSprite(this, true); _vm->_collisionMan->addSprite(_ssButton); - SetUpdateHandler(&Scene3011::update); - SetMessageHandler(&Scene3011::handleMessage); - } void Scene3011::update() { diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 2764c83490..2e25a0dec1 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -236,6 +236,8 @@ public: void hide(); void stopSound(); void change(int index, bool flag); + bool getFlag1() { return _flag1; } + int getIndex() { return _index; } protected: SoundResource _soundResource1; SoundResource _soundResource2; -- cgit v1.2.3 From 7a0a0c4b65f29981ca4f19af166d8bdca02c173c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 29 Sep 2011 14:44:11 +0000 Subject: NEVERHOOD: Add Module1900 and Scene1901, Scene1907 (Scene1908 is actually only used in another module...) --- engines/neverhood/gamemodule.cpp | 14 +- engines/neverhood/klayman.cpp | 39 +++ engines/neverhood/klayman.h | 7 + engines/neverhood/module.mk | 1 + engines/neverhood/module1900.cpp | 691 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module1900.h | 150 +++++++++ 6 files changed, 901 insertions(+), 1 deletion(-) create mode 100644 engines/neverhood/module1900.cpp create mode 100644 engines/neverhood/module1900.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 960e732ded..7f74590b68 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -32,6 +32,7 @@ #include "neverhood/module1600.h" #include "neverhood/module1700.h" #include "neverhood/module1800.h" +#include "neverhood/module1900.h" #include "neverhood/module2000.h" #include "neverhood/module2200.h" #include "neverhood/module2300.h" @@ -275,11 +276,15 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 8; _vm->gameState().which = 1; createModule(1600, -1); #endif +#if 1 + _vm->gameState().sceneNum = 6; + createModule(1900, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -323,6 +328,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x04A14718); _childObject = new Module1800(_vm, this, which); break; + case 1900: + setGlobalVar(0x91080831, 0x04E1C09C); + _childObject = new Module1900(_vm, this, which); + break; case 2000: setGlobalVar(0x91080831, 0x08250000); _childObject = new Module2000(_vm, this, which); @@ -413,6 +422,9 @@ void GameModule::updateModule() { createModule(2800, 0); } break; + case 1900: + createModule(3000, 1); + break; case 2000: createModule(2900, 4); break; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 27ef84acb2..873ba68b8e 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3953,6 +3953,45 @@ void KmScene1705::sub468B10() { SetMessageHandler(&KmScene1705::handleMessage4689A0); } +KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481D: + setCallback2(AnimationCallback(&Klayman::sub4207A0)); + break; + case 0x481E: + setCallback2(AnimationCallback(&Klayman::sub4207F0)); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + sub41C7B0(); + break; + case 0x483F: + sub41CD00(param.asInteger()); + break; + case 0x4840: + sub41CD70(param.asInteger()); + break; + } + return 0; +} + KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) { diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 84cb05acf5..5c0429ee32 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -434,6 +434,13 @@ protected: void sub468B10(); }; +class KmScene1901 : public Klayman { +public: + KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2001 : public Klayman { public: KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 5a597fb3e2..6530a7ff8c 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -20,6 +20,7 @@ MODULE_OBJS = \ module1600.o \ module1700.o \ module1800.o \ + module1900.o \ module2000.o \ module2200.o \ module2300.o \ diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp new file mode 100644 index 0000000000..7a34a2bd28 --- /dev/null +++ b/engines/neverhood/module1900.cpp @@ -0,0 +1,691 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module1900.h" +#include "neverhood/gamemodule.h" + +namespace Neverhood { + +Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + // NOTE: The original has a Scene1908 here as well but it's not used here but in another module... + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else { + createScene(0, 0); + } + + // TODO Sound1ChList_addSoundResources(0x04E1C09C, dword_4B8800, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B8800, true, 50, 600, 5, 150); + +} + +Module1900::~Module1900() { + // TODO Sound1ChList_sub_407A50(0x04E1C09C); +} + +void Module1900::createScene(int sceneNum, int which) { + debug("Module1900::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _childObject = new Scene1901(_vm, this, which); + break; + case 6: + _childObject = new Scene1907(_vm, this, which); + break; + } + SetUpdateHandler(&Module1900::updateScene); + _childObject->handleUpdate(); +} + +void Module1900::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + createScene(6, 0); + } else { + leaveModule(0); + } + break; + case 6: + createScene(0, 1); + break; + } + } +} + +// Scene1901 + +Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + _surfaceFlag = true; + + setRectList(0x004B34C8); + + setBackground(0x01303227); + setPalette(0x01303227); + insertMouse433(0x0322301B); + + insertStaticSprite(0x42213133, 1100); + + if (!getGlobalVar(0xA9035F60)) { + insertStaticSprite(0x40A40168, 100); + } else if (getGlobalVar(0x09221A62)) { + insertStaticSprite(0x124404C4, 100); + setGlobalVar(0x2050861A, 1); + } else { + insertStaticSprite(0x02840064, 100); + } + + if (which < 0) { + insertKlayman(120, 380); + setMessageList(0x004B3408); + } else if (which == 1) { + insertKlayman(372, 380); + setMessageList(0x004B3410); + } else { + insertKlayman(0, 380); + setMessageList(0x004B3400); + } + + tempSprite = insertStaticSprite(0x4830A402, 1100); + _klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + +} + +static const NPoint kAsScene1907SymbolGroundPositions[] = { + {160, 310}, + { 90, 340}, + {210, 335}, + {210, 380}, + {310, 340}, + {290, 400}, + {400, 375}, + {370, 435}, + {475, 415} +}; + +static const NPoint kAsScene1907SymbolPluggedInPositions[] = { + {275, 125}, + {244, 125}, + {238, 131}, + {221, 135}, + {199, 136}, + {168, 149}, + {145, 152}, + {123, 154}, + {103, 157} +}; + +static const NPoint kAsScene1907SymbolGroundHitPositions[] = { + {275, 299}, + {244, 299}, + {238, 305}, + {221, 309}, + {199, 310}, + {168, 323}, + {145, 326}, + {123, 328}, + {103, 331} +}; + +static const NPoint kAsScene1907SymbolPluggedInDownPositions[] = { + {275, 136}, + {244, 156}, + {238, 183}, + {221, 207}, + {199, 228}, + {168, 262}, + {145, 285}, + {123, 307}, + {103, 331} +}; + +static const uint32 kAsScene1907SymbolFileHashes[] = { + 0x006A1034, + 0x006A1010, + 0x006A1814, + 0x006A1016, + 0x006A0014, + 0x002A1014, + 0x00EA1014, + 0x206A1014, + 0x046A1414 +}; + +int AsScene1907Symbol::_symbolFlag1 = 0; +int AsScene1907Symbol::_symbolFlag2 = 0; + +AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex) + : AnimatedSprite(vm, 1000 - positionIndex), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), + _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) { + + _symbolFlag1 = 0; + _symbolFlag2 = 0; + + if (getGlobalVar(0xA9035F60)) { + _isPluggedIn = true; + _currPositionIndex = elementIndex; + if (!getGlobalVar(0x09221A62)) { + _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; + } else { + _x = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].y; + } + createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); + _newHashListIndex = -2; + } else { + _isPluggedIn = false; + _currPositionIndex = positionIndex; + _soundResource1.load(0x74231924); + _soundResource2.load(0x36691914); + _soundResource3.load(0x5421D806); + _parentScene->setPositionFree(_currPositionIndex, false); + _x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y; + createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + _newHashListIndex = 0; + } + _deltaRect.set(0, 0, 80, 80); + Sprite::processDelta(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + +} + +void AsScene1907Symbol::update() { + AnimatedSprite::updateAnim(); + handleSpriteUpdate(); + AnimatedSprite::updatePosition(); + if (_symbolFlag1 && !_symbolFlag2) + _symbolFlag1 = 0; +} + +uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isPluggedIn && !_symbolFlag1) { + tryToPlugIn(); + messageResult = 1; + } else { + messageResult = 0; + } + break; + } + return messageResult; +} + +uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void AsScene1907Symbol::suTryToPlugIn() { + _currStep++; + _x -= _deltaX; + _y -= _deltaY; + if (_currStep == 16) { + _x -= _smallDeltaX; + _y -= _smallDeltaY; + SetSpriteCallback(NULL); + } +} + +void AsScene1907Symbol::suFallOff() { + if (_fallOffDelay != 0) { + _fallOffDelay--; + } else { + _y += _yAccel; + _yAccel += 8; + if (_y >= kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) { + _y = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y; + stFallOffHitGround(); + } + } +} + +void AsScene1907Symbol::suFallOffHitGround() { + + if (_x == _someX - _xBreak) + _x -= _smallDeltaX; + else + _x -= _deltaX; + + if (_y == kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) { + _y -= _someY; + } + + if (_currStep < 8) { + _y -= _yAccel; + _yAccel -= 4; + if (_yAccel < 0) + _yAccel = 0; + } else if (_currStep < 15) { + _y += _yAccel; + _yAccel += 4; + } else { + _y = kAsScene1907SymbolGroundPositions[_newPositionIndex].y; + cbFallOffHitGroundEvent(); + } + + _currStep++; +} + +void AsScene1907Symbol::suMoveDown() { + _y += _yIncr; + if (_yIncr < 11) + _yIncr++; + if (_y >= kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y) { + _y = kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y; + _isMoving = false; + SetSpriteCallback(NULL); + } +} + +void AsScene1907Symbol::suMoveUp() { + _y -= _yIncr; + if (getGlobalVar(0x10938830)) { + if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { + _yIncr--; + } else { + _yIncr++; + } + } else { + _yIncr = 2; + } + if (_yIncr > 9) + _yIncr = 9; + else if (_yIncr < 1) + _yIncr = 1; + if (_y < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { + _y = kAsScene1907SymbolPluggedInPositions[_elementIndex].y; + _isMoving = false; + SetSpriteCallback(NULL); + } +} + +void AsScene1907Symbol::tryToPlugIn() { + _isPluggedIn = true; + _symbolFlag2++; + _newPositionIndex = _parentScene->getNextPosition(); + _parentScene->setPositionFree(_currPositionIndex, true); + sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex); + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + SetUpdateHandler(&AsScene1907Symbol::update); + SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn); + SetSpriteCallback(&AsScene1907Symbol::suTryToPlugIn); + _currStep = 0; + _deltaX = (_x - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x) / 16; + _smallDeltaX = _x - _deltaX * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x; + _deltaY = (_y - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y) / 16; + _smallDeltaY = _y - _deltaY * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y; + if (_elementIndex == _newPositionIndex) { + SetAnimationCallback3(&AsScene1907Symbol::stPlugIn); + } else { + _symbolFlag1 = 1; + SetAnimationCallback3(&AsScene1907Symbol::stPlugInFail); + } +} + +void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { + _isPluggedIn = false; + _newPositionIndex = newPositionIndex; + _fallOffDelay = fallOffDelay; + _parentScene->setPositionFree(_newPositionIndex, false); + _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; + _someX = _x; + _someY = _y; + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0); + _playBackwards = true; + _newHashListIndex = -2; + _currStep = 0; + _yAccel = 1; + SetUpdateHandler(&AsScene1907Symbol::update); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteCallback(&AsScene1907Symbol::suFallOff); +} + +void AsScene1907Symbol::stFallOffHitGround() { + _soundResource2.play(); + sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); + // TODO: Meh... + Entity::_priority = 1000 - _newPositionIndex; + _vm->_collisionMan->removeSprite(this); + _vm->_collisionMan->addSprite(this); + SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround); + SetAnimationCallback3(&AsScene1907Symbol::cbFallOffHitGroundEvent); + _newHashListIndex = 0; + _currStep = 0; + _yAccel = 30; + _deltaX = (_x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x) / 15; + _xBreak = _deltaX * 15; + _smallDeltaX = _x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x - _xBreak; + _someY = 0; + if (kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y > kAsScene1907SymbolGroundPositions[_newPositionIndex].y) + _someY = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y - kAsScene1907SymbolGroundPositions[_newPositionIndex].y; +} + +void AsScene1907Symbol::cbFallOffHitGroundEvent() { + _currPositionIndex = _newPositionIndex; + if (_symbolFlag2) + _symbolFlag2--; + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + _newHashListIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteCallback(NULL); + processDelta(); + _soundResource3.play(); +} + +void AsScene1907Symbol::stPlugIn() { + _soundResource1.play(); + _currPositionIndex = _newPositionIndex; + setFileHash1(); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteCallback(NULL); + if (_elementIndex == 8) + sendMessage(_parentScene, 0x2001, 0); +} + +void AsScene1907Symbol::stPlugInFail() { + _currPositionIndex = _newPositionIndex; + setFileHash1(); + _parentScene->plugInFailed(); +} + +void AsScene1907Symbol::moveUp() { + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? + setFileHash1(); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteCallback(&AsScene1907Symbol::suMoveUp); + _yIncr = 1; + _isMoving = true; +} + +void AsScene1907Symbol::moveDown() { + setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? + setFileHash1(); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteCallback(&AsScene1907Symbol::suMoveDown); + _yIncr = 4; + _isMoving = true; +} + +SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol) + : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _AsScene1907Symbol(AsScene1907Symbol), + _countdown1(0) { + + _spriteResource.load2(0x64516424); + createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + setVisible(false); + _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _deltaRect = _drawRect; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + processDelta(); + _needRefresh = true; + _soundResource.load(0x44061000); + SetUpdateHandler(&SsScene1907UpDownButton::update); + SetMessageHandler(&SsScene1907UpDownButton::handleMessage); + if (getGlobalVar(0xA9035F60)) { + if (getGlobalVar(0x09221A62)) + setToDownPosition(); + else + setToUpPosition(); + } +} + +void SsScene1907UpDownButton::update() { + StaticSprite::update(); + if (_countdown1 != 0 && (--_countdown1 == 0)) { + setVisible(false); + sendMessage(_parentScene, 0x2000, 0); + } +} + +uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown1 == 0 && !_AsScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) { + setVisible(true); + _countdown1 = 4; + StaticSprite::update(); + _soundResource.play(); + } + messageResult = 1; + } + return messageResult; +} + +void SsScene1907UpDownButton::setToUpPosition() { + _y = _spriteResource.getPosition().y; + Sprite::processDelta(); + StaticSprite::update(); +} + +void SsScene1907UpDownButton::setToDownPosition() { + _y = _spriteResource.getPosition().y + 174; + Sprite::processDelta(); + StaticSprite::update(); +} + +AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1400) { + + createSurface1(0x110A1061, 1500); + _x = 320; + _y = 240; + setFileHash(0x110A1061, 0, -1); + _newHashListIndex = 0; + setVisible(false); + _needRefresh = true; + AnimatedSprite::updatePosition(); + SetUpdateHandler(&AsScene1907WaterHint::update); + SetMessageHandler(&Sprite::handleMessage); +} + +void AsScene1907WaterHint::update() { + AnimatedSprite::updateAnim(); + AnimatedSprite::updatePosition(); +} + +uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + } + return messageResult; +} + +void AsScene1907WaterHint::show() { + setVisible(true); + setFileHash(0x110A1061, 0, -1); + SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20); + SetAnimationCallback3(&AsScene1907WaterHint::hide); +} + +void AsScene1907WaterHint::hide() { + setFileHash1(); + setVisible(false); + SetMessageHandler(&Sprite::handleMessage); +} + +Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), + _soundResource3(vm), _soundResource4(vm), _currMovingSymbolIndex(0), _pluggedInCount(0), + _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { + + _surfaceFlag = true; + + //setGlobalVar(0x10938830, 1); + + setBackground(0x20628E05); + setPalette(0x20628E05); + + for (int i = 0; i < 9; i++) + _positionFree[i] = true; + + for (int i = 0; i < 9; i++) { + _asSymbols[i] = insertSprite(this, i, getRandomPositionIndex()); + _vm->_collisionMan->addSprite(_asSymbols[i]); + } + + _ssUpDownButton = insertSprite(this, _asSymbols[8]); + _vm->_collisionMan->addSprite(_ssUpDownButton); + + _asWaterHint = insertSprite(); + + insertMouse435(0x28E0120E, 20, 620); + + SetMessageHandler(&Scene1907::handleMessage); + SetUpdateHandler(&Scene1907::update); + + if (getGlobalVar(0xA9035F60)) + _pluggedInCount = 9; + + _soundResource1.load(0x72004A10); + _soundResource2.load(0x22082A12); + _soundResource3.load(0x21100A10); + _soundResource4.load(0x68E25540); + +} + +void Scene1907::update() { + Scene::update(); + + if (_hasPlugInFailed) { + int fallOffDelay = 0; + _hasPlugInFailed = false; + for (int i = 0; i < 9; i++) { + AsScene1907Symbol *asSymbol = _asSymbols[8 - i]; + if (asSymbol->isPluggedIn()) { + asSymbol->fallOff(getRandomPositionIndex(), fallOffDelay); + fallOffDelay += _vm->_rnd->getRandomNumber(10 - 1) + 4; + } + } + } + + if (_moveDownCountdown != 0 && (--_moveDownCountdown == 0)) { + _asSymbols[_currMovingSymbolIndex]->moveDown(); + if (_currMovingSymbolIndex > 0) { + _moveDownCountdown = 2; + _currMovingSymbolIndex--; + } + } + + if (_moveUpCountdown != 0 && (--_moveUpCountdown == 0)) { + _moveDownCountdown = 0; + for (int i = 0; i < 9; i++) + _asSymbols[i]->moveUp(); + } + + if (_countdown3 != 0 && (--_countdown3 == 0)) { + _asWaterHint->show(); + _moveUpCountdown = 4; + } + +} + +uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO DEBUG stuff + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && + !_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) { + leaveScene(0); + } + break; + // TODO Debug stuff + case 0x2000: + if (getGlobalVar(0x09221A62)) { + _soundResource1.play(); + for (int i = 0; i < 9; i++) + _asSymbols[i]->moveUp(); + _ssUpDownButton->setToUpPosition(); + setGlobalVar(0x09221A62, 0); + } else { + if (!getGlobalVar(0x10938830)) { + _soundResource3.play(); + _countdown3 = 5; + } else { + _soundResource2.play(); + _ssUpDownButton->setToDownPosition(); + setGlobalVar(0x09221A62, 1); + } + _moveDownCountdown = 1; + _currMovingSymbolIndex = 8; + } + break; + case 0x2001: + _soundResource4.play(); + setGlobalVar(0xA9035F60, 1); + break; + } + return 0; +} + +void Scene1907::plugInFailed() { + _pluggedInCount = 0; + _hasPlugInFailed = true; +} + +int Scene1907::getRandomPositionIndex() { + bool flag = false; + int index = 0; + for (int i = 0; i < 9; i++) { + if (_positionFree[i]) + flag = true; + } + if (flag) { + flag = false; + while (!flag) { + index = _vm->_rnd->getRandomNumber(9 - 1); + if (_positionFree[index]) + flag = true; + } + } + return index; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h new file mode 100644 index 0000000000..7b41c5780b --- /dev/null +++ b/engines/neverhood/module1900.h @@ -0,0 +1,150 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE1900_H +#define NEVERHOOD_MODULE1900_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/module1200.h" + +namespace Neverhood { + +class Module1900 : public Module { +public: + Module1900(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1900(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1901 + +class Scene1901 : public Scene { +public: + Scene1901(NeverhoodEngine *vm, Module *parentModule, int which); +}; + +// Scene1907 + +class Scene1907; + +class AsScene1907Symbol : public AnimatedSprite { +public: + AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex); + void moveUp(); + void moveDown(); + void fallOff(int newPositionIndex, int fallOffDelay); + bool isPluggedIn() { return _isPluggedIn; } + bool isMoving() { return _isMoving; } +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + Scene1907 *_parentScene; + int _elementIndex; + int _currPositionIndex; + int _newPositionIndex; + bool _isPluggedIn; + bool _isMoving; + int _someX, _someY; + int _xBreak; + int _currStep; + int _yAccel; + int _yIncr; + int _fallOffDelay; + int _deltaX, _smallDeltaX; + int _deltaY, _smallDeltaY; + // Dumb, change if possible + static int _symbolFlag1; + static int _symbolFlag2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender); + void suTryToPlugIn(); + void suFallOff(); + void suFallOffHitGround(); + void suMoveDown(); + void suMoveUp(); + void tryToPlugIn(); + void stFallOffHitGround(); + void cbFallOffHitGroundEvent(); + void stPlugIn(); + void stPlugInFail(); +}; + +class AsScene1907WaterHint : public AnimatedSprite { +public: + AsScene1907WaterHint(NeverhoodEngine *vm); + void show(); +protected: + void update(); + uint32 handleMessage46BA20(int messageNum, const MessageParam ¶m, Entity *sender); + void hide(); +}; + +class SsScene1907UpDownButton : public StaticSprite { +public: + SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol); + void setToUpPosition(); + void setToDownPosition(); +protected: + SoundResource _soundResource; + Scene1907 *_parentScene; + AsScene1907Symbol *_AsScene1907Symbol; + int _countdown1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1907 : public Scene { +public: + Scene1907(NeverhoodEngine *vm, Module *parentModule, int which); + void plugInFailed(); + void setPositionFree(int index, bool value) { _positionFree[index] = value; } + int getNextPosition() { return _pluggedInCount++; } +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + AsScene1907Symbol *_asSymbols[9]; + SsScene1907UpDownButton *_ssUpDownButton; + AsScene1907WaterHint *_asWaterHint; + int _currMovingSymbolIndex; + int _pluggedInCount; + int _moveDownCountdown; + int _moveUpCountdown; + int _countdown3; + bool _hasPlugInFailed; + bool _positionFree[9]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + int getRandomPositionIndex(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE1900_H */ -- cgit v1.2.3 From 729e3ae26ef9c3c039861ef5212ca3588a679ca5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 29 Sep 2011 14:44:31 +0000 Subject: NEVERHOOD: Add tables for Scene1901 --- devtools/create_neverhood/tables.h | 6 ++++++ dists/engine-data/neverhood.dat | Bin 16288 -> 16546 bytes 2 files changed, 6 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 01ddd15fc4..9328bfd939 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -87,6 +87,8 @@ static const uint32 rectListOffsets[] = { // Scene1705 1, 0x004B6B40, 1, 0x004B6B30, + // Scene1901 + 1, 0x004B34C8, // Scene2001 1, 0x004B3680, 1, 0x004B3670, @@ -260,6 +262,10 @@ static const uint32 messageListOffsets[] = { 2, 0x004B6A18, 1, 0x004B69F0, 2, 0x004B6AC0, + // Scene1901 + 1, 0x004B3408, + 1, 0x004B3410, + 1, 0x004B3400, // Scene2001 1, 0x004B3538, 2, 0x004B3540, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 5561301a95..6663e64f0b 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From ced4efc66f68c284a290a88cbeac337021526b5e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 29 Sep 2011 18:30:05 +0000 Subject: NEVERHOOD: Add tables for Scene2101 --- devtools/create_neverhood/tables.h | 15 +++++++++++++++ dists/engine-data/neverhood.dat | Bin 16546 -> 17046 bytes 2 files changed, 15 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 9328bfd939..f0308bd709 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -92,6 +92,9 @@ static const uint32 rectListOffsets[] = { // Scene2001 1, 0x004B3680, 1, 0x004B3670, + // Scene2101 + 1, 0x004B9008, + 1, 0x004B8FF8, // Scene2203 1, 0x004B8420, // Scene2206 @@ -272,6 +275,18 @@ static const uint32 messageListOffsets[] = { 4, 0x004B35F0, 2, 0x004B3550, 1, 0x004B3530, + // Scene2101 + 1, 0x004B8E48, + 3, 0x004B8E50, + 4, 0x004B8F58, + 2, 0x004B8EB0, + 2, 0x004B8EA0, + 1, 0x004B8F50, + 1, 0x004B8F48, + 4, 0x004B8E80, + 1, 0x004B8EC8, + 2, 0x004B8F78, + 3, 0x004B8F00, // Scene2201 1, 0x004B8118, 1, 0x004B8130, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 6663e64f0b..72e81330ba 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 21ebcf2af20bf96c32f5668952dba4ed7797a89c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 29 Sep 2011 18:30:58 +0000 Subject: NEVERHOOD: Add Module2100 and Scene2101 (not complete yet) --- engines/neverhood/gamemodule.cpp | 18 ++- engines/neverhood/klayman.cpp | 151 ++++++++++++++++++++ engines/neverhood/klayman.h | 13 ++ engines/neverhood/module.mk | 1 + engines/neverhood/module2100.cpp | 298 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2100.h | 81 +++++++++++ 6 files changed, 561 insertions(+), 1 deletion(-) create mode 100644 engines/neverhood/module2100.cpp create mode 100644 engines/neverhood/module2100.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7f74590b68..7d463fb3e2 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -34,6 +34,7 @@ #include "neverhood/module1800.h" #include "neverhood/module1900.h" #include "neverhood/module2000.h" +#include "neverhood/module2100.h" #include "neverhood/module2200.h" #include "neverhood/module2300.h" #include "neverhood/module3000.h" @@ -281,10 +282,14 @@ void GameModule::startup() { _vm->gameState().which = 1; createModule(1600, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 6; createModule(1900, -1); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule(2100, 3); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -336,6 +341,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x08250000); _childObject = new Module2000(_vm, this, which); break; + case 2100: + setGlobalVar(0x91080831, 0x10A10C14); + _childObject = new Module2100(_vm, this, which); + break; case 2200: setGlobalVar(0x91080831, 0x11391412); _childObject = new Module2200(_vm, this, which); @@ -428,6 +437,13 @@ void GameModule::updateModule() { case 2000: createModule(2900, 4); break; + case 2100: + if (_moduleResult == 1) { + createModule(2900, 1); + } else { + createModule(1600, 0); + } + break; case 2200: createModule(2300, 1); break; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 873ba68b8e..865c91a7a8 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4091,6 +4091,157 @@ void KmScene2001::sub440270() { SetMessageHandler(&KmScene2001::handleMessage4401A0); } +KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + + // Empty +} + +uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _flag1 = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + sub41C930(param.asPoint().x, false); + break; + case 0x4004: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub421350)); + else + setCallback2(AnimationCallback(&Klayman::sub41FC80)); + break; + case 0x4811: + setCallback2(AnimationCallback(&KmScene2101::sub4862C0)); + break; + case 0x4812: + if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420060)); + } else if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + } else { + setCallback2(AnimationCallback(&Klayman::sub41FF80)); + } + break; + case 0x4816: + if (param.asInteger() == 1) { + setCallback2(AnimationCallback(&Klayman::sub420120)); + } else if (param.asInteger() == 2) { + setCallback2(AnimationCallback(&Klayman::sub420170)); + }else { + setCallback2(AnimationCallback(&Klayman::sub4200D0)); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + sub41C7B0(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_flag1) + setCallback2(AnimationCallback(&Klayman::sub4214D0)); + break; + case 0x481E: + if (_flag) + setCallback2(AnimationCallback(&Klayman::sub421510)); + break; + case 0x4834: + setCallback2(AnimationCallback(&Klayman::sub421160)); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _flag1 = true; + setCallback2(AnimationCallback(&Klayman::sub4212C0)); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _flag1 = false; + setCallback2(AnimationCallback(&Klayman::sub421310)); + break; + case 0x483D: + sub486320(); + break; + case 0x483E: + sub486360(); + break; + } + return messageResult; +} + +uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + int16 speedUpFrameIndex; + switch (messageNum) { + case 0x1008: + speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); + if (_frameIndex < speedUpFrameIndex) { + setFileHash(0x35AA8059, speedUpFrameIndex, -1); + _y = 438; + } + messageResult = 0; + break; + case 0x100D: + if (param.asInteger() == 0x1A1A0785) { + _soundResource1.play(0x40F0A342); + } else if (param.asInteger() == 0x60428026) { + _soundResource1.play(0x40608A59); + } + break; + } + return messageResult; +} + +uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + _soundResource1.play(0x85B10BB8); + } else if (param.asInteger() == 0x4E6A0CA0) { + _soundResource1.play(0xC5B709B0); + } + break; + } + return messageResult; +} + +void KmScene2101::sub4862C0() { + _status2 = 1; + _flagE5 = false; + setFileHash(0x35AA8059, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene2101::handleMessage486160); + _soundResource1.play(0x402E82D4); +} + +void KmScene2101::sub486320() { + _status2 = 0; + _flagE5 = false; + setFileHash(0xFF290E30, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene2101::handleMessage486230); +} + +void KmScene2101::sub486360() { + _status2 = 0; + _flagE5 = false; + setFileHash(0x9A28CA1C, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteCallback(NULL); + SetMessageHandler(&KmScene2101::handleMessage486230); +} + KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) // TODO: NRect *rect1, int16 unk in Klayman ctor : Klayman(vm, parentScene, x, y, 1000, 1000) { diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 5c0429ee32..eb6ab40931 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -452,6 +452,19 @@ protected: void sub440270(); }; +class KmScene2101 : public Klayman { +public: + KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _flag1; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage486160(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage486230(int messageNum, const MessageParam ¶m, Entity *sender); + void sub4862C0(); + void sub486320(); + void sub486360(); +}; + class KmScene2201 : public Klayman { public: KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 6530a7ff8c..9484e2e632 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -22,6 +22,7 @@ MODULE_OBJS = \ module1800.o \ module1900.o \ module2000.o \ + module2100.o \ module2200.o \ module2300.o \ module3000.o \ diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp new file mode 100644 index 0000000000..e07e990dc2 --- /dev/null +++ b/engines/neverhood/module2100.cpp @@ -0,0 +1,298 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2100.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1200.h" + +namespace Neverhood { + +Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + // TODO Music18hList_add(0x10A10C14, 0x11482B95); + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 1) { + createScene(0, 0); + } else if (which == 2) { + createScene(0, 3); + } else { + createScene(0, 1); + } + +} + +Module2100::~Module2100() { + // TODO Music18hList_deleteGroup(0x10A10C14); +} + +void Module2100::createScene(int sceneNum, int which) { + debug("Module2100::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Music18hList_play(0x11482B95, 0, 1, 1); + _childObject = new Scene2101(_vm, this, which); + break; + } + SetUpdateHandler(&Module2100::updateScene); + _childObject->handleUpdate(); +} + +void Module2100::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + setGlobalVar(0x2090590C, 1); + leaveModule(0); + } else { + leaveModule(1); + } + break; + } + } +} + +// Scene2101 + +Class538::Class538(NeverhoodEngine *vm, bool flag) + : AnimatedSprite(vm, 1100), _soundResource(vm) { + + // TODO createSurface3(100, dword_4B9018); + createSurface(100, 640, 480); //TODO: Remove once the line above is done + _x = 320; + _y = 240; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class538::handleMessage); + if (flag) { + setFileHash(0x0C202B9C, -1, -1); + _newHashListIndex = -2; + } else { + setVisible(false); + } +} + +uint32 Class538::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + removeCallbacks(); + break; + case 0x4808: + openDoor(); + break; + case 0x4809: + closeDoor(); + break; + } + return messageResult; +} + +void Class538::openDoor() { + setFileHash(0x0C202B9C, 0, -1); + _newHashListIndex = -2; + setVisible(true); + _soundResource.play(calcHash("fxDoorOpen32")); +} + +void Class538::closeDoor() { + setFileHash(0xC222A8D4, 0, -1); + _newHashListIndex = -2; + setVisible(true); + SetAnimationCallback3(&Class538::hide); + _soundResource.play(calcHash("fxDoorClose32")); +} + +void Class538::hide() { + setFileHash1(); + setVisible(false); +} + +Class539::Class539(NeverhoodEngine *vm, Sprite *klayman) + : AnimatedSprite(vm, 1400), _klayman(klayman) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class539::handleMessage); + createSurface(1200, 88, 165); + setVisible(false); +} + +uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + _x = _klayman->getX(); + _y = _klayman->getY() - 132; + setFileHash(0x0422255A, 0, -1); + setVisible(true); + break; + case 0x3002: + setFileHash1(); + setVisible(false); + break; + } + return messageResult; +} + +Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene2101::handleMessage); + SetUpdateHandler(&Scene2101::update); + + setBackground(0x44242305); + setPalette(0x44242305); + insertMouse433(0x4230144A); + + insertStaticSprite(0x00502330, 1100); + _sprite1 = insertStaticSprite(0x78492010, 1100); + // TODO _class427 = insertSprite(this, 0x72427010, 0x32423010, 200, 0); + _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape1); + _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape2); + + if (which < 0) { + insertKlayman(380, 438); + setMessageList(0x004B8E48); + sendMessage(this, 0x2000, 0); + _class538 = insertSprite(false); + _value1 = 1; + _countdown1 = 0; + } else if (which == 1) { + insertKlayman(640, 438); + setMessageList(0x004B8E50); + sendMessage(this, 0x2000, 0); + _class538 = insertSprite(true); + _value1 = 2; + _countdown1 = 48; + } else if (which == 2) { + insertKlayman(115, 438); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004B8F58); + sendMessage(this, 0x2000, 1); + _class538 = insertSprite(false); + _value1 = 1; + _countdown1 = 0; + } else if (which == 3) { + insertKlayman(115, 438); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004B8EB0); + sendMessage(this, 0x2000, 1); + _class538 = insertSprite(false); + _value1 = 1; + _countdown1 = 0; + } else { + insertKlayman(115, 438); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004B8EA0); + sendMessage(this, 0x2000, 1); + _class538 = insertSprite(false); + _value1 = 1; + _countdown1 = 0; + } + + _class539 = insertSprite(_klayman); + _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); + +} + +void Scene2101::update() { + if (_countdown1 != 0) { + if (_value1 == 2) { + if (--_countdown1 == 0) { + sendMessage(_class538, 0x4809, 0); + _value1 = 1; + } + } else { + if (_klayman->getX() > 575) + _messageListFlag = false; + if (--_countdown1 == 0) { + if (_klayman->getX() < 480) { + sendMessage(_class538, 0x4809, 0); + _value1 = 1; + } else if (_klayman->getX() >= 480 && _klayman->getX() <= 575) { + _klayman->setDoDeltaX(0); + setMessageList2(0x004B8F48); + sendMessage(_class538, 0x4809, 0); + sendMessage(_class539, 0x2001, 0); + _value1 = 1; + } + } + } + } else if (_value1 == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) { + setMessageList2(0x004B8F50); + } + Scene::update(); +} + +uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02144CB1) { + sendEntityMessage(_klayman, 0x1014, _class427); + } else if (param.asInteger() == 0x21E64A00) { + if (_value1 == 0) { + setMessageList(0x004B8E80); + } else { + setMessageList(0x004B8EC8); + } + } else if (param.asInteger() == 0x41442820) { + messageList402220(); + } + break; + case 0x2000: + if (param.asInteger() != 0) { + setRectList(0x004B9008); + _klayman->setKlaymanTable3(); + } else { + setRectList(0x004B8FF8); + _klayman->setKlaymanTable1(); + } + break; + case 0x480B: + if (sender == _class427 && _value1 == 1) { + sendMessage(_class538, 0x4808, 0); + _value1 = 0; + _countdown1 = 90; + } + break; + case 0x4826: + if (sender == _asTape1 || sender == _asTape2) { + if (_klayman->getX() >= 228 && _klayman->getX() <= 500) { + sendEntityMessage(_klayman, 0x1014, sender); + setMessageList(0x004B8F78); + } else if (_klayman->getX() < 228) { + setMessageList2(0x004B8F00); + } + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h new file mode 100644 index 0000000000..3e7f579281 --- /dev/null +++ b/engines/neverhood/module2100.h @@ -0,0 +1,81 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2100_H +#define NEVERHOOD_MODULE2100_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class Module2100 : public Module { +public: + Module2100(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2100(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1901 + +class Class538 : public AnimatedSprite { +public: + Class538(NeverhoodEngine *vm, bool flag); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void openDoor(); + void closeDoor(); + void hide(); +}; + +class Class539 : public AnimatedSprite { +public: + Class539(NeverhoodEngine *vm, Sprite *klayman); +protected: + Sprite *_klayman; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2101 : public Scene { +public: + Scene2101(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_class427; + Sprite *_asTape1; + Sprite *_asTape2; + Sprite *_class538; + Sprite *_class539; + int _countdown1; + int _value1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2100_H */ -- cgit v1.2.3 From a7dcbd0f335023615acdcdef514e614bd6a40f76 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 30 Sep 2011 06:59:17 +0000 Subject: NEVERHOOD: Add floor button ("Class429") to Scene2101 --- engines/neverhood/module2100.cpp | 45 +++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2100.h | 14 +++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index e07e990dc2..fa0d111f8b 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -156,6 +156,49 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } +Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) + : StaticSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _countdown(0), + _fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) { + + SetUpdateHandler(&Class427::update); + SetMessageHandler(&Class427::handleMessage); + if (_soundFileHash == 0) + _soundFileHash = 0x44141000; + createSurface(1010, 61, 30); + if (_fileHash1) { + load(_fileHash1, true, true); + StaticSprite::update(); + } else + setVisible(false); +} + +void Class427::update() { + if (_countdown != 0 && (--_countdown == 0)) { + sendMessage(_parentScene, 0x1022, 1010); + if (_fileHash1) { + load(_fileHash1, true, true); + StaticSprite::update(); + } else + setVisible(false); + } +} + +uint32 Class427::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480B: + sendMessage(_parentScene, 0x480B, 0); + setVisible(true); + sendMessage(_parentScene, 0x1022, 990); + load(_fileHash2, true, true); + StaticSprite::update(); + _countdown = 16; + _soundResource.play(_soundFileHash); + break; + } + return messageResult; +} + Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -169,7 +212,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x00502330, 1100); _sprite1 = insertStaticSprite(0x78492010, 1100); - // TODO _class427 = insertSprite(this, 0x72427010, 0x32423010, 200, 0); + _class427 = insertSprite(this, 0x72427010, 0x32423010, 200, 0); _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); _vm->_collisionMan->addSprite(_asTape1); _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h index 3e7f579281..65846d7ded 100644 --- a/engines/neverhood/module2100.h +++ b/engines/neverhood/module2100.h @@ -60,6 +60,20 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class427 : public StaticSprite { +public: + Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 _soundFileHash; + uint32 _fileHash1, _fileHash2; + int16 _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + + class Scene2101 : public Scene { public: Scene2101(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From 8840c7481924b515032ed310bb999c3003c7dbf7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 30 Sep 2011 07:01:52 +0000 Subject: NEVERHOOD: Add floor button to Scene1401 --- engines/neverhood/gamemodule.cpp | 6 +++++- engines/neverhood/module1400.cpp | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7d463fb3e2..2891bddc2a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -286,10 +286,14 @@ void GameModule::startup() { _vm->gameState().sceneNum = 6; createModule(1900, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 0; createModule(2100, 3); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule(1400, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 37fb354b54..8d42c7fa2c 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1400.h" #include "neverhood/module1000.h" +#include "neverhood/module2100.h" #include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" #include "neverhood/gamemodule.h" @@ -667,7 +668,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x08221FA5); insertMouse433(0x21FA108A); - // TODO _class427 = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); + _class427 = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); _class525 = insertSprite(); if (!getGlobalVar(0x01023818)) { -- cgit v1.2.3 From 9f599a7dfcc2175a8940eacce621f5a15d762314 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 10 Oct 2011 07:51:30 +0000 Subject: NEVERHOOD: Start with Module2600 (missing Scene2609) --- engines/neverhood/gamemodule.cpp | 1 + engines/neverhood/module.mk | 1 + engines/neverhood/module2600.cpp | 199 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2600.h | 45 +++++++++ 4 files changed, 246 insertions(+) create mode 100644 engines/neverhood/module2600.cpp create mode 100644 engines/neverhood/module2600.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 2891bddc2a..a1a1fc3379 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -37,6 +37,7 @@ #include "neverhood/module2100.h" #include "neverhood/module2200.h" #include "neverhood/module2300.h" +#include "neverhood/module2600.h" #include "neverhood/module3000.h" namespace Neverhood { diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 9484e2e632..2eefff9458 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -25,6 +25,7 @@ MODULE_OBJS = \ module2100.o \ module2200.o \ module2300.o \ + module2600.o \ module3000.o \ mouse.o \ navigationscene.o \ diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp new file mode 100644 index 0000000000..0217fe4b71 --- /dev/null +++ b/engines/neverhood/module2600.cpp @@ -0,0 +1,199 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2600.h" + +namespace Neverhood { + +Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 1) { + createScene(4, 1); + } else { + createScene(0, 1); + } + + // TODO Sound1ChList_addSoundResources(0x40271018, dword_4B87E8, true); + // TODO Sound1ChList_setSoundValuesMulti(dword_4B87E8, true, 50, 600, 5, 150); + // TODO Sound1ChList_sub_407C70(0x40271018, 0x41861371, 0x43A2507F); + +} + +Module2600::~Module2600() { + // TODO Sound1ChList_sub_407A50(0x40271018); +} + +void Module2600::createScene(int sceneNum, int which) { + debug("Module2600::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + createNavigationScene(0x004B8608, which); + break; + case 1: + createNavigationScene(0x004B8638, which); + break; + case 2: + createNavigationScene(0x004B86C8, which); + break; + case 3: + if (getGlobalVar(0x0A310817)) { + createNavigationScene(0x004B8758, which); + } else { + createNavigationScene(0x004B86F8, which); + } + break; + case 4: + createNavigationScene(0x004B87B8, which); + break; + case 6: + createNavigationScene(0x004B8698, which); + break; + case 7: + // TODO Sound1ChList_sub_407A50(0x40271018); + createSmackerScene(0x30090001, true, true, false); + break; + case 8: +//TODO _childObject = new Scene2609(_vm, this, which); + break; + case 1002: + if (getGlobalVar(0x40040831) == 1) { + createSmackerScene(0x018C0404, true, true, false); + } else if (getGlobalVar(0x40040831) == 2) { + createSmackerScene(0x018C0407, true, true, false); + } else { + createSmackerScene(0x818C0405, true, true, false); + } + if (getGlobalVar(0x40040831) >= 2) { + setGlobalVar(0x40040831, 0); + } else { + incGlobalVar(0x40040831, +1); + } + break; + case 1003: + createSmackerScene(0x001C0007, true, true, false); + break; + case 1006: + if (getGlobalVar(0x4E0BE910)) { + createSmackerScene(0x049A1181, true, true, false); + } else { + createSmackerScene(0x04981181, true, true, false); + } + break; + case 1008: + if (getGlobalVar(0x4E0BE910)) { + createSmackerScene(0x42B80941, true, true, false); + } else { + createSmackerScene(0x42980941, true, true, false); + } + break; + } + SetUpdateHandler(&Module2600::updateScene); + _childObject->handleUpdate(); +} + +void Module2600::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + createScene(1, 3); + } else { + leaveModule(0); + } + break; + case 1: + if (_moduleResult == 0) { + createScene(6, 0); + } else if (_moduleResult == 1) { + createScene(0, 0); + } else if (_moduleResult == 2) { + createScene(2, 1); + } else if (_moduleResult == 3) { + createScene(3, 0); + } + break; + case 2: + if (_moduleResult == 0) { + createScene(1, 0); + } else if (_moduleResult == 1) { + createScene(1002, -1); + } + break; + case 3: + if (_moduleResult == 0) { + if (getGlobalVar(0x0A310817)) { + createScene(4, 0); + } else { + createScene(1003, -1); + } + } else if (_moduleResult == 2) { + createScene(1, 1); + } else if (_moduleResult == 3) { + if (getGlobalVar(0x0A310817)) { + createScene(4, 0); + } else { + setGlobalVar(0x0A310817, 1); + createScene(7, -1); + } + } + break; + case 4: + if (_moduleResult == 0) { + leaveModule(1); + } else { + createScene(3, 1); + } + break; + case 6: + if (_moduleResult == 0) { + createScene(1006, -1); + } else if (_moduleResult == 1) { + createScene(1, 2); + } + break; + case 7: + leaveModule(0); + break; + case 8: + createScene(1008, -1); + break; + case 1002: + createScene(2, 1); + break; + case 1003: + createScene(3, 0); + break; + case 1006: + createScene(8, -1); + break; + case 1008: + createScene(6, 0); + break; + } + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h new file mode 100644 index 0000000000..66ee360733 --- /dev/null +++ b/engines/neverhood/module2600.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2600_H +#define NEVERHOOD_MODULE2600_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2600 + +class Module2600 : public Module { +public: + Module2600(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2600(); +protected: + void createScene(int sceneNum, int which); + void updateScene(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2600_H */ -- cgit v1.2.3 From 28be9f6f4bb8db60b69bb22e72187dfa80357d9f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 12 Oct 2011 09:52:13 +0000 Subject: NEVERHOOD: Add Scene2609 and hook Module2600 to the GameModule --- engines/neverhood/gamemodule.cpp | 15 ++++- engines/neverhood/module2600.cpp | 136 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2600.h | 31 +++++++++ 3 files changed, 179 insertions(+), 3 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index a1a1fc3379..fa0af0753c 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -292,8 +292,8 @@ void GameModule::startup() { createModule(2100, 3); #endif #if 1 - _vm->gameState().sceneNum = 0; - createModule(1400, -1); + _vm->gameState().sceneNum = 8; + createModule(2600, -1); #endif } @@ -358,6 +358,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x1A214010); _childObject = new Module2300(_vm, this, which); break; + case 2600: + setGlobalVar(0x91080831, 0x40271018); + _childObject = new Module2600(_vm, this, which); + break; case 3000: setGlobalVar(0x91080831, 0x81293110); _childObject = new Module3000(_vm, this, which); @@ -465,6 +469,13 @@ void GameModule::updateModule() { createModule(1000, 1); } break; + case 2600: + if (_moduleResult == 1) { + createModule(2500, 0); + } else { + createModule(1200, 1); + } + break; case 3000: if (_moduleResult == 1) { createModule(1900, 0); diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 0217fe4b71..0163e978ba 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -76,7 +76,7 @@ void Module2600::createScene(int sceneNum, int which) { createSmackerScene(0x30090001, true, true, false); break; case 8: -//TODO _childObject = new Scene2609(_vm, this, which); + _childObject = new Scene2609(_vm, this, which); break; case 1002: if (getGlobalVar(0x40040831) == 1) { @@ -196,4 +196,138 @@ void Module2600::updateScene() { } } +SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm), + _soundResource3(vm), _soundResource4(vm), _parentScene(parentScene), + _countdown(0) { + + _spriteResource.load2(0x825A6923); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + if (!getGlobalVar(0x4E0BE910)) + setVisible(false); + + _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _deltaRect = _drawRect; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + processDelta(); + _needRefresh = true; + + _soundResource1.load(0x10267160); + _soundResource2.load(0x7027FD64); + _soundResource3.load(0x44043000); + _soundResource4.load(0x44045000); + + SetUpdateHandler(&SsScene2609Button::update); + SetMessageHandler(&SsScene2609Button::handleMessage); + +} + +void SsScene2609Button::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown == 0)) { + if (getGlobalVar(0x4E0BE910)) { + setGlobalVar(0x4E0BE910, 0); + sendMessage(_parentScene, 0x2001, 0); + } else { + setGlobalVar(0x4E0BE910, 1); + sendMessage(_parentScene, 0x2002, 0); + } + } +} + +uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + sendMessage(_parentScene, 0x2000, 0); + if (getGlobalVar(0x4E0BE910)) { + setVisible(false); + _soundResource4.play(); + _soundResource2.play(); + _countdown = 12; + } else { + setVisible(true); + _soundResource3.play(); + _soundResource1.play(); + _countdown = 96; + } + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1000) { + + _x = 240; + _y = 420; + setDoDeltaX(1); + createSurface1(0x9C210C90, 1200); + setClipRect(260, 260, 400, 368); + // TODO Sound1ChList_addSoundResource(0xDC2769B0, true); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2609Water::handleMessage); + if (getGlobalVar(0x4E0BE910)) + sendMessage(this, 0x2002, 0); +} + +uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + setFileHash1(); + setVisible(false); + // TODO Sound1ChList_stop(0xDC2769B0); + break; + case 0x2002: + setFileHash(0x9C210C90, 0, -1); + setVisible(true); + // TODO Sound1ChList_playLooping(0xDC2769B0); + break; + } + return messageResult; +} + +Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _isBusy(false) { + + _surfaceFlag = true; + setBackground(0x51409A16); + setPalette(0x51409A16); + _asWater = insertSprite(); + _ssButton = insertSprite(this); + _vm->_collisionMan->addSprite(_ssButton); + insertMouse435(0x09A1251C, 20, 620); + insertStaticSprite(0x02138002, 1200); + insertStaticSprite(0x825E2827, 1200); + SetMessageHandler(&Scene2609::handleMessage); + SetUpdateHandler(&Scene::update); +} + +uint32 Scene2609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isBusy) + leaveScene(0); + break; + case 0x2000: + _isBusy = true; + break; + case 0x2001: + _isBusy = false; + sendMessage(_asWater, 0x2001, 0); + break; + case 0x2002: + _isBusy = false; + sendMessage(_asWater, 0x2002, 0); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h index 66ee360733..d6580a6c7a 100644 --- a/engines/neverhood/module2600.h +++ b/engines/neverhood/module2600.h @@ -40,6 +40,37 @@ protected: void updateScene(); }; +class SsScene2609Button : public StaticSprite { +public: + SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2609Water : public AnimatedSprite { +public: + AsScene2609Water(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2609 : public Scene { +public: + Scene2609(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + bool _isBusy; + Sprite *_asWater; + Sprite *_ssButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2600_H */ -- cgit v1.2.3 From 770689b2f1c998d637f122c524412639debfed07 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 12 Oct 2011 13:13:24 +0000 Subject: NEVERHOOD: Start with Module2700 (doesn't do anything yet) --- engines/neverhood/module.mk | 1 + engines/neverhood/module2700.cpp | 333 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2700.h | 56 +++++++ 3 files changed, 390 insertions(+) create mode 100644 engines/neverhood/module2700.cpp create mode 100644 engines/neverhood/module2700.h diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 2eefff9458..adf58b1225 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -26,6 +26,7 @@ MODULE_OBJS = \ module2200.o \ module2300.o \ module2600.o \ + module2700.o \ module3000.o \ mouse.o \ navigationscene.o \ diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp new file mode 100644 index 0000000000..83b1d9003f --- /dev/null +++ b/engines/neverhood/module2700.cpp @@ -0,0 +1,333 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2700.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1000.h" + +namespace Neverhood { + +static const NRect kScene2710ClipRect = NRect(0, 0, 626, 480); + +static const uint32 kScene2710StaticSprites[] = { + 0x0D2016C0, + 0 +}; + +static const NRect kScene2711ClipRect = NRect(0, 0, 521, 480); + +static const uint32 kScene2711FileHashes1[] = { + 0, + 0x100801A1, + 0x201081A0, + 0x006800A4, + 0x40390120, + 0x000001B1, + 0x001000A1, + 0 +}; + +static const uint32 kScene2711FileHashes2[] = { + 0, + 0x40403308, + 0x71403168, + 0x80423928, + 0x224131A8, + 0x50401328, + 0x70423328, + 0 +}; + +static const uint32 kScene2711FileHashes3[] = { + 0, + 0x1088A021, + 0x108120E5, + 0x18A02321, + 0x148221A9, + 0x10082061, + 0x188820E1, + 0 +}; + +static const NRect kScene2724ClipRect = NRect(0, 141, 640, 480); + +static const uint32 kScene2724StaticSprites[] = { + 0xC20D00A5, + 0 +}; + +static const NRect kScene2725ClipRect = NRect(0, 0, 640, 413); + +static const uint32 kScene2725StaticSprites[] = { + 0xC20E00A5, + 0 +}; + +Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), + _soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) { + + // TODO Music18hList_add(0x42212411, 0x04020210); + // TODO Music18hList_play(0x04020210, 24, 2, 1); + SetMessageHandler(&Module2700::handleMessage); + + + if (which < 0) { + which = _vm->gameState().which; + if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31) + which = -1; + createScene(_vm->gameState().sceneNum, which); + } else { + createScene(0, 0); + } + + _soundResource1.load(0x00880CCC); + _soundResource2.load(0x00880CC0); + _soundResource3.load(0x00880CCC); + _soundResource4.load(0x00880CC0); + +} + +Module2700::~Module2700() { + // TODO Sound1ChList_sub_407A50(0x42212411); +} + +void Module2700::createScene(int sceneNum, int which) { + debug("Module2700::createScene(%d, %d)", sceneNum, which); + if (sceneNum != 30 && sceneNum != 31) + _vm->gameState().which = which; + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: +//TODO _childObject = new Scene2701(_vm, this, which); + break; + case 1: +//TODO _childObject = new Scene2702(_vm, this, which); + break; + case 2: + if (which == 6 || which == 7) + createScene2703(which, 0x004B1710); + else if (which == 4 || which == 5) + createScene2703(which, 0x004B1738); + else if (which == 2 || which == 3) + createScene2703(which, 0x004B1760); + else + createScene2703(which, 0x004B1788); + break; + case 3: + createScene2704(which, 0x004B17B0, 150); + break; + case 4: + createScene2704(which, 0x004B17D8, 150); + break; + case 5: + if (which >= 4) { +//TODO _childObject = new Scene2706(_vm, this, which); + } else if (which == 2 || which == 3) { + createScene2704(which, 0x004B1828, 150); + } else { + createScene2704(which, 0x004B1800, 150); + } + break; + case 6: + createScene2704(which, 0x004B1850, 150); + break; + case 7: + if (which == 2 || which == 3) { + createScene2704(which, 0x004B1878, 150); + } else { + createScene2704(which, 0x004B18A0, 150); + } + break; + case 8: + if (which == 2 || which == 3) { + createScene2704(which, 0x004B18C8, 150); + } else { + createScene2704(which, 0x004B18F0, 150); + } + break; + case 9: + createScene2704(which, 0x004B18F0, 150, kScene2710StaticSprites, &kScene2710ClipRect); + break; + case 10: + // TODO _vm->gameModule()->initScene2808Vars2(); + _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(0x40005834, 2)]; + _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(0x40005834, 1)]; + _scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(0x40005834, 0)]; + _scene2711StaticSprites[3] = 0x0261282E; + _scene2711StaticSprites[4] = 0x9608E5A0; + _scene2711StaticSprites[5] = 0; + createScene2704(which, 0x004B1950, 150, _scene2711StaticSprites, &kScene2711ClipRect); + break; + case 11: + createScene2704(which, 0x004B19E0, 150); + break; + case 12: + createScene2704(which, 0x004B1A08, 150); + break; + case 13: + createScene2704(which, 0x004B1A30, 150); + break; + case 14: + if (which == 4 || which == 5) { + createScene2704(which, 0x004B1A58, 150); + } else if (which == 2 || which == 3) { + createScene2704(which, 0x004B1A80, 150); + } else { + createScene2704(which, 0x004B1AA8, 150); + } + break; + case 15: + if (which == 4 || which == 5) { + createScene2704(which, 0x004B1AD0, 150); + } else if (which == 2 || which == 3) { + createScene2704(which, 0x004B1AF8, 150); + } else { + createScene2704(which, 0x004B1B20, 150); + } + break; + case 16: + if (which == 4 || which == 5) { + createScene2704(which, 0x004B1B48, 150); + } else if (which == 2 || which == 3) { + createScene2704(which, 0x004B1B70, 150); + } else { + createScene2704(which, 0x004B1B98, 150); + } + break; + case 17: + if (which == 4 || which == 5) { + createScene2704(which, 0x004B1BC0, 150); + } else if (which == 2 || which == 3) { + createScene2704(which, 0x004B1BE8, 150); + } else { + createScene2704(which, 0x004B1C10, 150); + } + break; + case 18: + if (which == 2 || which == 3) { + createScene2704(which, 0x004B1C38, 150); + } else { + createScene2704(which, 0x004B1C60, 150); + } + break; + case 19: + if (which == 2 || which == 3) { + createScene2704(which, 0x004B1CB0, 150); + } else { + createScene2704(which, 0x004B1C88, 150); + } + break; + case 20: + if (which == 2 || which == 3) { + createScene2704(which, 0x004B1CD8, 150); + } else { + createScene2704(which, 0x004B1D00, 150); + } + break; + case 21: + createScene2704(which, 0x004B1D28, 150); + break; + case 22: + createScene2704(which, 0x004B1D50, 150); + break; + case 23: + createScene2704(which, 0x004B1D78, 150, kScene2724StaticSprites, &kScene2724ClipRect); + break; + case 24: + createScene2704(which, 0x004B1DB0, 150, kScene2725StaticSprites, &kScene2725ClipRect); + break; + case 25: + createScene2704(which, 0x004B1DE8, 150); + break; + case 26: + createScene2704(which, 0x004B1E10, 150); + break; + case 27: + createScene2704(which, 0x004B1E38, 150); + break; + case 28: + createScene2704(which, 0x004B1E60, 150); + break; + case 30: + _childObject = new Class152(_vm, this, 0x09507248, 0x0724C09D); + break; + case 31: +//TODO _childObject = new Scene2732(_vm, this, which); + break; + } + SetUpdateHandler(&Module2700::updateScene); + _childObject->handleUpdate(); +} + +void Module2700::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) { + createScene(1, 3); + } else { + leaveModule(0); + } + break; + } + } +} + +void Module2700::update() { +} + +uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200D: + switch (_soundIndex) { + case 0: + _soundResource1.play(); + break; + case 1: + _soundResource2.play(); + break; + case 2: + _soundResource3.play(); + break; + case 3: + _soundResource4.play(); + break; + } + _soundIndex++; + if (_soundIndex >= 4) + _soundIndex = 0; + break; + } + return messageResult; +} + +void Module2700::createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites, const NRect *clipRect) { + // TODO +} + +void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { + // TODO +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h new file mode 100644 index 0000000000..a0f424eb6c --- /dev/null +++ b/engines/neverhood/module2700.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2700_H +#define NEVERHOOD_MODULE2700_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2700 + +class Module2700 : public Module { +public: + Module2700(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2700(); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + int _soundIndex; + bool _flag1; + uint32 _scene2711StaticSprites[6]; + void createScene(int sceneNum, int which); + void updateScene(); + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); + void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2700_H */ -- cgit v1.2.3 From ee1bf85456c380c4fd01fb749e6f009a5c0c2147 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 12 Oct 2011 13:14:05 +0000 Subject: NEVERHOOD: Add new SceneInfo2700 structure and some tables using it for Module2700 --- devtools/create_neverhood/create_neverhood.cpp | 51 +++++++++++++++++++++ devtools/create_neverhood/tables.h | 61 +++++++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 17046 -> 19438 bytes 3 files changed, 112 insertions(+) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 2d11931f5a..33b5a3e994 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -277,6 +277,54 @@ struct SceneInfo140Item { }; +struct SceneInfo2700Item { + uint32 id; + uint32 bgFilename; + uint32 class437Filename; + uint32 dataResourceFilename; + uint32 pointListName; + uint32 rectListName; + uint32 exPaletteFilename2; + uint32 exPaletteFilename1; + uint32 mouseCursorFilename; + int16 which1; + int16 which2; + uint32 field24; + + void load(uint32 offset) { + byte *item = getData(offset); + id = offset; + // Only save the hashes instead of the full names + bgFilename = calcHash(getStringP(READ_LE_UINT32(item + 0))); + class437Filename = calcHash(getStringP(READ_LE_UINT32(item + 4))); + dataResourceFilename = calcHash(getStringP(READ_LE_UINT32(item + 8))); + pointListName = calcHash(getStringP(READ_LE_UINT32(item + 12))); + rectListName = calcHash(getStringP(READ_LE_UINT32(item + 16))); + exPaletteFilename2 = calcHash(getStringP(READ_LE_UINT32(item + 20))); + exPaletteFilename1 = calcHash(getStringP(READ_LE_UINT32(item + 24))); + mouseCursorFilename = calcHash(getStringP(READ_LE_UINT32(item + 28))); + which1 = READ_LE_UINT16(item + 32); + which2 = READ_LE_UINT16(item + 34); + field24 = READ_LE_UINT16(item + 36); + } + + void save(FILE *fd) { + writeUint32LE(fd, id); + writeUint32LE(fd, bgFilename); + writeUint32LE(fd, class437Filename); + writeUint32LE(fd, dataResourceFilename); + writeUint32LE(fd, pointListName); + writeUint32LE(fd, rectListName); + writeUint32LE(fd, exPaletteFilename2); + writeUint32LE(fd, exPaletteFilename1); + writeUint32LE(fd, mouseCursorFilename); + writeUint16LE(fd, which1); + writeUint16LE(fd, which2); + writeUint32LE(fd, field24); + } + +}; + template class StaticDataList { public: @@ -456,6 +504,7 @@ StaticDataListVector rectLists; StaticDataListVector messageLists; StaticDataListVector navigationLists; StaticDataVector sceneInfo140Items; +StaticDataVector sceneInfo2700Items; void addMessageList(uint32 messageListCount, uint32 messageListOffset) { MessageList *messageList = new MessageList(); @@ -474,6 +523,7 @@ int main(int argc, char *argv[]) { messageLists.loadListVector(messageListOffsets); navigationLists.loadListVector(navigationListOffsets); sceneInfo140Items.loadVector(sceneInfo140Offsets); + sceneInfo2700Items.loadVector(sceneInfo2700Offsets); datFile = fopen("neverhood.dat", "wb"); @@ -485,6 +535,7 @@ int main(int argc, char *argv[]) { hitRectLists.saveListVector(datFile); navigationLists.saveListVector(datFile); sceneInfo140Items.saveVector(datFile); + sceneInfo2700Items.saveVector(datFile); fclose(datFile); diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index f0308bd709..51954f82ad 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -420,6 +420,14 @@ static const uint32 navigationListOffsets[] = { // Module2000 3, 0x004B7B48, 3, 0x004B7B00, + // Module2600 + 2, 0x004B8608, + 4, 0x004B8638, + 2, 0x004B8698, + 2, 0x004B86C8, + 4, 0x004B8758, + 4, 0x004B86F8, + 2, 0x004B87B8, // Module3000 2, 0x004B7C80, 2, 0x004B7CE0, @@ -478,3 +486,56 @@ static const uint32 sceneInfo140Offsets[] = { 0 }; +static const uint32 sceneInfo2700Offsets[] = { + // + 0x004B1710, + 0x004B1738, + 0x004B1760, + 0x004B1788, + 0x004B17B0, + 0x004B17D8, + 0x004B1800, + 0x004B1828, + 0x004B1850, + 0x004B1878, + 0x004B18A0, + 0x004B18C8, + 0x004B18F0, + 0x004B1918, + // + 0x004B19E0, + 0x004B1A08, + 0x004B1A30, + 0x004B1A58, + 0x004B1A80, + 0x004B1AA8, + 0x004B1AD0, + 0x004B1AF8, + 0x004B1B20, + 0x004B1B48, + 0x004B1B70, + 0x004B1B98, + 0x004B1BC0, + 0x004B1BE8, + 0x004B1C10, + 0x004B1C38, + 0x004B1C60, + 0x004B1C88, + 0x004B1CB0, + 0x004B1CD8, + 0x004B1D00, + 0x004B1D28, + 0x004B1D50, + 0x004B1D78, + // + 0x004B1DB0, + // + 0x004B1DE8, + 0x004B1E10, + 0x004B1E38, + 0x004B1E60, + // + 0x004B1950, + // + 0 +}; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 72e81330ba..70633118f0 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From e7673ffdc63f4d0a9b7b6f39161c3150537f3cd6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Oct 2011 10:42:51 +0000 Subject: NEVERHOOD: Updated dat --- dists/engine-data/neverhood.dat | Bin 19438 -> 19482 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 70633118f0..b97c5a4bea 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From aa789ee02bf55828fb8f0bfa9aa1efe0ecb44310 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Oct 2011 10:43:58 +0000 Subject: NEVERHOOD: More work in Module2700 --- engines/neverhood/gamemodule.cpp | 15 +- engines/neverhood/module2200.cpp | 2 + engines/neverhood/module2700.cpp | 301 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2700.h | 15 ++ engines/neverhood/resource.cpp | 7 + engines/neverhood/resource.h | 1 + engines/neverhood/staticdata.cpp | 26 ++++ engines/neverhood/staticdata.h | 17 +++ 8 files changed, 377 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index fa0af0753c..9bdaa865d4 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -38,6 +38,7 @@ #include "neverhood/module2200.h" #include "neverhood/module2300.h" #include "neverhood/module2600.h" +#include "neverhood/module2700.h" #include "neverhood/module3000.h" namespace Neverhood { @@ -291,10 +292,15 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(2100, 3); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 8; createModule(2600, -1); #endif +#if 1 + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 5; + createModule(2700, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -362,6 +368,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x40271018); _childObject = new Module2600(_vm, this, which); break; + case 2700: + setGlobalVar(0x91080831, 0x42212411); + _childObject = new Module2700(_vm, this, which); + break; case 3000: setGlobalVar(0x91080831, 0x81293110); _childObject = new Module3000(_vm, this, which); @@ -476,6 +486,9 @@ void GameModule::updateModule() { createModule(1200, 1); } break; + case 2700: + createModule(1800, 2); + break; case 3000: if (_moduleResult == 1) { createModule(1900, 0); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 97729cbb00..ff0afa6f58 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -396,6 +396,8 @@ void Module2200::updateScene() { } } } + +#undef HallOfRecordsSceneLink // Scene2201 diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 83b1d9003f..f5dc0785b5 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -166,7 +166,7 @@ void Module2700::createScene(int sceneNum, int which) { } break; case 9: - createScene2704(which, 0x004B18F0, 150, kScene2710StaticSprites, &kScene2710ClipRect); + createScene2704(which, 0x004B1918, 150, kScene2710StaticSprites, &kScene2710ClipRect); break; case 10: // TODO _vm->gameModule()->initScene2808Vars2(); @@ -279,14 +279,196 @@ void Module2700::createScene(int sceneNum, int which) { _childObject->handleUpdate(); } +#define SceneLinkIf(moduleResult, sceneNum, which) \ + if (_moduleResult == moduleResult) { createScene(sceneNum, which); break; } + void Module2700::updateScene() { if (!updateChild()) { + + debug("sceneNum = %d; _moduleResult = %d", _vm->gameState().sceneNum, _moduleResult); + switch (_vm->gameState().sceneNum) { case 0: - if (_moduleResult == 1) { - createScene(1, 3); - } else { - leaveModule(0); + SceneLinkIf(1, 1, 0); + leaveModule(0); + break; + case 1: + SceneLinkIf(1, 14, 1); + SceneLinkIf(2, 2, 2); + SceneLinkIf(3, 14, 3); + SceneLinkIf(4, 2, 6); + SceneLinkIf(5, 2, 4); + createScene(0, 1); + break; + case 2: + SceneLinkIf(1, 5, 0); + SceneLinkIf(2, 1, 2); + SceneLinkIf(3, 5, 2); + SceneLinkIf(4, 1, 5); + SceneLinkIf(5, 5, 4); + SceneLinkIf(6, 1, 4); + SceneLinkIf(7, 11, 0); + createScene(3, 0); + break; + case 3: + createScene(2, 0); + break; + case 4: + SceneLinkIf(1, 7, 2); + createScene(5, 5); + break; + case 5: + SceneLinkIf(1, 6, 0); + SceneLinkIf(2, 2, 3); + SceneLinkIf(3, 8, 2); + SceneLinkIf(4, 2, 5); + SceneLinkIf(5, 4, 0); + SceneLinkIf(6, 7, 0); + createScene(2, 1); + break; + case 6: + SceneLinkIf(1, 8, 0); + createScene(5, 1); + break; + case 7: + SceneLinkIf(1, 8, 3); + SceneLinkIf(2, 4, 1); + SceneLinkIf(3, 9, 0); + createScene(5, 6); + break; + case 8: + SceneLinkIf(1, 10, 0); + SceneLinkIf(2, 5, 3); + SceneLinkIf(3, 7, 1); + createScene(6, 1); + break; + case 9: + SceneLinkIf(1, 10, 1); + createScene(7, 3); + break; + case 10: + SceneLinkIf(1, 9, 1); + createScene(8, 1); + break; + case 11: + SceneLinkIf(1, 12, 0); + createScene(2, 7); + break; + case 12: + SceneLinkIf(1, 13, 0); + createScene(11, 1); + break; + case 13: + SceneLinkIf(1, 30, 0); + createScene(12, 1); + break; + case 14: + SceneLinkIf(1, 1, 1); + SceneLinkIf(2, 15, 3); + SceneLinkIf(3, 1, 3); + SceneLinkIf(4, 15, 5); + SceneLinkIf(5, 22, 0); + createScene(15, 1); + break; + case 15: + SceneLinkIf(1, 14, 0); + SceneLinkIf(2, 16, 3); + SceneLinkIf(3, 14, 2); + SceneLinkIf(4, 16, 5); + SceneLinkIf(5, 14, 4); + createScene(16, 1); + break; + case 16: + SceneLinkIf(1, 15, 0); + SceneLinkIf(2, 17, 3); + SceneLinkIf(3, 15, 2); + SceneLinkIf(4, 17, 5); + SceneLinkIf(5, 15, 4); + createScene(17, 1); + break; + case 17: + SceneLinkIf(1, 16, 0); + SceneLinkIf(2, 18, 3); + SceneLinkIf(3, 16, 2); + SceneLinkIf(4, 20, 1); + SceneLinkIf(5, 16, 4); + createScene(18, 1); + break; + case 18: + SceneLinkIf(1, 17, 0); + SceneLinkIf(2, 19, 2); + SceneLinkIf(3, 17, 2); + createScene(19, 0); + break; + case 19: + SceneLinkIf(1, 20, 2); + SceneLinkIf(2, 18, 2); + SceneLinkIf(3, 20, 0); + createScene(18, 0); + break; + case 20: + SceneLinkIf(1, 17, 4); + SceneLinkIf(2, 19, 1); + SceneLinkIf(3, 21, 0); + createScene(19, 3); + break; + case 21: + // TODO? GameState_sub_469C50(&field_52, 0); + // TODO MusicMan_stopAll (if field_52 above = 1) + // TODO Music18hList_delete(_musicFileHash); + // TODO Music18hList_play(0x04020210, 0, 2, 1); + // TODO Sound1ChList_sub_407AF0(0x42212411); + createScene(20, 3); + break; + case 22: + SceneLinkIf(1, 23, 0); + createScene(14, 5); + break; + case 23: + SceneLinkIf(1, 24, 0); + createScene(22, 1); + break; + case 24: + SceneLinkIf(1, 25, 0); + createScene(23, 1); + break; + case 25: + SceneLinkIf(1, 26, 0); + createScene(24, 1); + break; + case 26: + SceneLinkIf(1, 27, 0); + createScene(25, 1); + break; + case 27: + SceneLinkIf(1, 28, 0); + createScene(26, 1); + break; + case 28: + SceneLinkIf(1, 31, 0); + createScene(27, 1); + break; + case 29: + createScene(13, 1); + break; + case 30: + createScene(28, 1); + break; + } + } else { + switch (_vm->gameState().sceneNum) { + case 21: + if (!_flag1) { + // TODO Music18hList_stop(0x04020210, 0, 1); + // TODO _vm->gameModule()->initScene2801Vars(); + _musicFileHash = getGlobalVar(0x89A82A15); + // TODO? GameState_sub_469C50(&field_52, 0); + // TODO MusicMan_create(); + // TODO Music18hList_add2(0x42212411, _musicFileHash); + // TODO Music18hList_play2(_musicFileHash, 0, /*TODO */???, 1); + // TODO Sound1ChList_addSoundResource(0x42212411, 0x44014282, true); + // TODO Sound1ChList_setSoundValues(0x44014282, true, 120, 360, 72, 0); + _flag1 = true; } break; } @@ -294,6 +476,7 @@ void Module2700::updateScene() { } void Module2700::update() { + } uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -327,7 +510,113 @@ void Module2700::createScene2703(int which, uint32 sceneInfoId, const uint32 *st } void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { - // TODO + _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); +} + +Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, + const uint32 *staticSprites, const NRect *clipRect) + : Scene(vm, parentModule, true) { + + SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); + + _surfaceFlag = true; + SetMessageHandler(&Scene2704::handleMessage); + SetUpdateHandler(&Scene2704::update); + + setBackground(sceneInfo->bgFilename); + setPalette(sceneInfo->bgFilename); + + if (sceneInfo->exPaletteFilename1) + _palette->addPalette(sceneInfo->exPaletteFilename1, 0, 65, 0); + + if (sceneInfo->exPaletteFilename2) + _palette->addPalette(sceneInfo->exPaletteFilename2, 65, 31, 65); + + while (staticSprites && *staticSprites) + insertStaticSprite(*staticSprites++, 1100); + + insertMouse433(sceneInfo->mouseCursorFilename); + + if (sceneInfo->class437Filename) { +//TODO _class437 = insertSprite(sceneInfo->class437Filename); + _class521 = insertSprite(this, 320, 240); +//TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); +//TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); +//TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + } else { +//TODO _class437 = NULL; +//TODO _class517 = NULL; + _class521 = insertSprite(this, 320, 240); + } + +//TODO _class518 = insertSprite(_class521); + + _which1 = sceneInfo->which1; + _which2 = sceneInfo->which2; + + _dataResource.load(sceneInfo->dataResourceFilename); + _pointList = _dataResource.getPointArray(sceneInfo->pointListName); + _class521->setPathPoints(_pointList); + + if (sceneInfo->rectListName) { + _rectList = _dataResource.getRectArray(sceneInfo->rectListName); + // TODO _class521->setPathRects(_rectList); + } + + if (which == _which2) { + NPoint testPoint = (*_pointList)[_pointList->size() - 1]; + sendMessage(_class521, 0x2002, _pointList->size() - 1); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_class521, 0x2009, 0); + else + sendMessage(_class521, 0x2007, 0); + } else { + NPoint testPoint = (*_pointList)[0]; + sendMessage(_class521, 0x2002, 0); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_class521, 0x2009, 0); + else + sendMessage(_class521, 0x2008, 0); + } + + if (clipRect) { + _class521->getClipRect() = *clipRect; + if (_class517) + _class517->getClipRect() = *clipRect; + if (_class520) + _class520->getClipRect() = *clipRect; + if (_class519) + _class519->getClipRect() = *clipRect; + if (_class518) + _class518->getClipRect() = *clipRect; + } + +} + +void Scene2704::update() { + Scene::update(); + if (_mouseClicked) { + sendPointMessage(_class521, 0x2004, _mouseClickPos); + _mouseClicked = false; + } +} + +uint32 Scene2704::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (_which1 >= 0) + leaveScene(_which1); + break; + case 0x2006: + if (_which2 >= 0) + leaveScene(_which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; } } // End of namespace Neverhood diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index a0f424eb6c..4df284c0f3 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -26,6 +26,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/module1600.h" namespace Neverhood { @@ -43,6 +44,7 @@ protected: int _soundIndex; bool _flag1; uint32 _scene2711StaticSprites[6]; + uint32 _musicFileHash; void createScene(int sceneNum, int which); void updateScene(); void update(); @@ -51,6 +53,19 @@ protected: void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; +class Scene2704 : public Scene { +public: + Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, + const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); +protected: + Class521 *_class521; + int _which1, _which2; + NPointArray *_pointList; + NRectArray *_rectList; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2700_H */ diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index ef8e532ef1..9678031554 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -601,6 +601,13 @@ NPointArray *DataResource::getPointArray(uint32 nameHash) { return NULL; } +NRectArray *DataResource::getRectArray(uint32 nameHash) { + DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 3); + if (drDirectoryItem) + return _rectArrays[drDirectoryItem->offset]; + return NULL; +} + HitRectList *DataResource::getHitRectList() { DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(calcHash("HitArray"), 3); if (drDirectoryItem) diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index f8d282cd57..6436509228 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -154,6 +154,7 @@ public: void unload(); NPoint getPoint(uint32 nameHash); NPointArray *getPointArray(uint32 nameHash); + NRectArray *getRectArray(uint32 nameHash); HitRectList *getHitRectList(); MessageList *getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY); protected: diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index d897d7a342..4e7d24c6bb 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -140,6 +140,26 @@ void StaticData::load(const char *filename) { _sceneInfo140Items[id] = sceneInfo140; } + // Load SceneInfo2700 items + uint32 sceneInfo2700ItemsCount = fd.readUint32LE(); + debug("sceneInfo2700ItemsCount: %d", sceneInfo2700ItemsCount); + for (uint32 i = 0; i < sceneInfo2700ItemsCount; i++) { + SceneInfo2700 *sceneInfo2700 = new SceneInfo2700(); + uint32 id = fd.readUint32LE(); + sceneInfo2700->bgFilename = fd.readUint32LE(); + sceneInfo2700->class437Filename = fd.readUint32LE(); + sceneInfo2700->dataResourceFilename = fd.readUint32LE(); + sceneInfo2700->pointListName = fd.readUint32LE(); + sceneInfo2700->rectListName = fd.readUint32LE(); + sceneInfo2700->exPaletteFilename2 = fd.readUint32LE(); + sceneInfo2700->exPaletteFilename1 = fd.readUint32LE(); + sceneInfo2700->mouseCursorFilename = fd.readUint32LE(); + sceneInfo2700->which1 = fd.readUint16LE(); + sceneInfo2700->which2 = fd.readUint16LE(); + sceneInfo2700->field24 = fd.readUint32LE(); + _sceneInfo2700Items[id] = sceneInfo2700; + } + } HitRectList *StaticData::getHitRectList(uint32 id) { @@ -172,4 +192,10 @@ SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) { return _sceneInfo140Items[id]; } +SceneInfo2700 *StaticData::getSceneInfo2700(uint32 id) { + if (!_sceneInfo2700Items[id]) + error("StaticData::getSceneInfo2700() SceneInfo2700 with id %08X not found", id); + return _sceneInfo2700Items[id]; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index 2a0cc9072c..c223735ef4 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -77,6 +77,21 @@ struct SceneInfo140 { byte count; }; +struct SceneInfo2700 { + uint32 id; + uint32 bgFilename; + uint32 class437Filename; + uint32 dataResourceFilename; + uint32 pointListName; + uint32 rectListName; + uint32 exPaletteFilename2; + uint32 exPaletteFilename1; + uint32 mouseCursorFilename; + int16 which1; + int16 which2; + uint32 field24; +}; + class StaticData { public: StaticData(); @@ -87,12 +102,14 @@ public: MessageList *getMessageList(uint32 id); NavigationList *getNavigationList(uint32 id); SceneInfo140 *getSceneInfo140Item(uint32 id); + SceneInfo2700 *getSceneInfo2700(uint32 id); protected: Common::HashMap _hitRectLists; Common::HashMap _rectLists; Common::HashMap _messageLists; Common::HashMap _navigationLists; Common::HashMap _sceneInfo140Items; + Common::HashMap _sceneInfo2700Items; }; } // End of namespace Neverhood -- cgit v1.2.3 From 463039c40666c5417cf298365d31690299685e5f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Oct 2011 08:11:10 +0000 Subject: NEVERHOOD: Add Scene2706 - Move calcDistance from Class521 to graphics.cpp --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/graphics.cpp | 6 ++ engines/neverhood/graphics.h | 1 + engines/neverhood/module1600.cpp | 6 -- engines/neverhood/module1600.h | 1 - engines/neverhood/module2700.cpp | 138 +++++++++++++++++++++++++++++++++++++-- engines/neverhood/module2700.h | 21 +++++- 7 files changed, 159 insertions(+), 16 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 9bdaa865d4..9ed447a925 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -297,7 +297,7 @@ void GameModule::startup() { createModule(2600, -1); #endif #if 1 - _vm->gameState().which = 0; + _vm->gameState().which = 4; _vm->gameState().sceneNum = 5; createModule(2700, -1); #endif diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 900ad57d56..5bb9424f57 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -312,4 +312,10 @@ void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int des } +int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) { + int16 deltaX = ABS(x1 - x2); + int16 deltaY = ABS(y1 - y2); + return sqrt((double)(deltaX * deltaX + deltaY * deltaY)); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 08fa1f5df0..c2adb11913 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -127,6 +127,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY); void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); +int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2); } // End of namespace Neverhood diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 94b836a26f..15e24743a6 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -973,12 +973,6 @@ void Class521::sub45E0A0() { // TODO } -int Class521::calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) { - int16 deltaX = ABS(x1 - x2); - int16 deltaY = ABS(y1 - y2); - return sqrt(deltaX * deltaX + deltaY * deltaY); -} - Class546::Class546(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _soundResource(vm), _parentScene(parentScene) { diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 1096377938..efb2b943ab 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -103,7 +103,6 @@ protected: void suMoveToNextPoint(); void suMoveToPrevPoint(); void sub45E0A0(); - int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2); }; class Class546 : public AnimatedSprite { diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index f5dc0785b5..7d09b66e98 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -141,7 +141,7 @@ void Module2700::createScene(int sceneNum, int which) { break; case 5: if (which >= 4) { -//TODO _childObject = new Scene2706(_vm, this, which); + _childObject = new Scene2706(_vm, this, which); } else if (which == 2 || which == 3) { createScene2704(which, 0x004B1828, 150); } else { @@ -555,8 +555,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _which2 = sceneInfo->which2; _dataResource.load(sceneInfo->dataResourceFilename); - _pointList = _dataResource.getPointArray(sceneInfo->pointListName); - _class521->setPathPoints(_pointList); + _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); + _class521->setPathPoints(_trackPoints); if (sceneInfo->rectListName) { _rectList = _dataResource.getRectArray(sceneInfo->rectListName); @@ -564,14 +564,14 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 } if (which == _which2) { - NPoint testPoint = (*_pointList)[_pointList->size() - 1]; - sendMessage(_class521, 0x2002, _pointList->size() - 1); + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) sendMessage(_class521, 0x2009, 0); else sendMessage(_class521, 0x2007, 0); } else { - NPoint testPoint = (*_pointList)[0]; + NPoint testPoint = (*_trackPoints)[0]; sendMessage(_class521, 0x2002, 0); if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) sendMessage(_class521, 0x2009, 0); @@ -581,6 +581,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 if (clipRect) { _class521->getClipRect() = *clipRect; +#if 0 if (_class517) _class517->getClipRect() = *clipRect; if (_class520) @@ -588,7 +589,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 if (_class519) _class519->getClipRect() = *clipRect; if (_class518) - _class518->getClipRect() = *clipRect; + _class518->getClipRect() = *clipRect; +#endif } } @@ -619,4 +621,126 @@ uint32 Scene2704::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +static const struct { const char *pointListName; int which1, which2; } kSceneInfo2706[] = { + {"me06slotSlotPath2", 4, -1}, + {"me06slotSlotPath3", -1, 6}, + {"me06slotSlotPath4", -1, 5} +}; + +Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _newTrackIndex(-1), _count(3) { + + _surfaceFlag = true; + SetMessageHandler(&Scene2706::handleMessage); + + setBackground(0x18808B88); + setPalette(0x18808B88); + + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + + insertMouse433(0x08B8C180); + +//TODO _class437 = insertSprite(0x18808B88); + _class521 = insertSprite(this, 320, 240); +//TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); +//TODO _class518 = insertSprite(_class521); +//TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); +//TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + + _dataResource.load(0x06000162); + + if (which == 5) + _currTrackIndex = 2; + else if (which == 6) + _currTrackIndex = 1; + else + _currTrackIndex = 0; + + _trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName)); + _class521->setPathPoints(_trackPoints); + + if (which == kSceneInfo2706[_currTrackIndex].which2) { + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + if (which == 5) + sendMessage(_class521, 0x2007, 50); + else + sendMessage(_class521, 0x2007, 150); + } else { + sendMessage(_class521, 0x2002, 0); + if (which == 5) + sendMessage(_class521, 0x2008, 50); + else + sendMessage(_class521, 0x2008, 150); + } + +} + +uint32 Scene2706::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + findClosestTrack(param.asPoint()); + break; + case 0x2005: + if (_newTrackIndex >= 0) { + if (kSceneInfo2706[_currTrackIndex].which1 < 0) + changeTrack(); + } else if (kSceneInfo2706[_currTrackIndex].which1 >= 0) + leaveScene(kSceneInfo2706[_currTrackIndex].which1); + break; + case 0x2006: + if (_newTrackIndex >= 0) { + if (kSceneInfo2706[_currTrackIndex].which2 < 0) + changeTrack(); + } else if (kSceneInfo2706[_currTrackIndex].which2 >= 0) + leaveScene(kSceneInfo2706[_currTrackIndex].which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +void Scene2706::findClosestTrack(NPoint pt) { + int minMatchTrackIndex = -1; + int minMatchDistance = 640; + // Find the track which contains a point closest to pt + for (int infoIndex = 0; infoIndex < _count; infoIndex++) { + NPointArray *pointList = _dataResource.getPointArray(calcHash(kSceneInfo2706[infoIndex].pointListName)); + for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { + NPoint testPt = (*pointList)[pointIndex]; + int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); + if (distance < minMatchDistance) { + minMatchTrackIndex = infoIndex; + minMatchDistance = distance; + } + } + } + if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { + _newTrackIndex = minMatchTrackIndex; + _newTrackDestX = pt.x; + if (_currTrackIndex == 0) + sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + else + sendMessage(_class521, 0x2003, 0); + } else { + _newTrackIndex = -1; + sendMessage(_class521, 0x2004, pt.x); + } +} + +void Scene2706::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName)); + _class521->setPathPoints(_trackPoints); + if (_currTrackIndex == 0) + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + else + sendMessage(_class521, 0x2002, 0); + sendMessage(_class521, 0x2004, _newTrackDestX); + _newTrackIndex = -1; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index 4df284c0f3..b596ccd580 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -60,12 +60,31 @@ public: protected: Class521 *_class521; int _which1, _which2; - NPointArray *_pointList; + NPointArray *_trackPoints; NRectArray *_rectList; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2706 : public Scene { +public: + Scene2706(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Class521 *_class521; + Sprite *_class437; + Sprite *_class517; + Sprite *_class518; + Sprite *_class520; + Sprite *_class519; + int16 _newTrackDestX; + int _currTrackIndex, _newTrackIndex; + int _count; + NPointArray *_trackPoints; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void findClosestTrack(NPoint pt); + void changeTrack(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2700_H */ -- cgit v1.2.3 From 31b3dec8c94975333a868cc527107a32b091a5ae Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Oct 2011 12:25:18 +0000 Subject: NEVERHOOD: More tables for Module2700 --- devtools/create_neverhood/create_neverhood.cpp | 3 --- devtools/create_neverhood/tables.h | 2 ++ dists/engine-data/neverhood.dat | Bin 19482 -> 19346 bytes 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index 33b5a3e994..dc77d71a39 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -289,7 +289,6 @@ struct SceneInfo2700Item { uint32 mouseCursorFilename; int16 which1; int16 which2; - uint32 field24; void load(uint32 offset) { byte *item = getData(offset); @@ -305,7 +304,6 @@ struct SceneInfo2700Item { mouseCursorFilename = calcHash(getStringP(READ_LE_UINT32(item + 28))); which1 = READ_LE_UINT16(item + 32); which2 = READ_LE_UINT16(item + 34); - field24 = READ_LE_UINT16(item + 36); } void save(FILE *fd) { @@ -320,7 +318,6 @@ struct SceneInfo2700Item { writeUint32LE(fd, mouseCursorFilename); writeUint16LE(fd, which1); writeUint16LE(fd, which2); - writeUint32LE(fd, field24); } }; diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 51954f82ad..3a5d40522a 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -537,5 +537,7 @@ static const uint32 sceneInfo2700Offsets[] = { // 0x004B1950, // + 0x004B2240, + // 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index b97c5a4bea..f88d5166e8 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From d276e7ceaa307844a8db82f231bba86a6b88e121 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Oct 2011 12:25:31 +0000 Subject: NEVERHOOD: Add Scene2701 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2700.cpp | 111 +++++++++++++++++++++++++++++++++++++-- engines/neverhood/module2700.h | 19 ++++++- engines/neverhood/staticdata.cpp | 1 - engines/neverhood/staticdata.h | 1 - 5 files changed, 127 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 9ed447a925..64117ad39a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -298,7 +298,7 @@ void GameModule::startup() { #endif #if 1 _vm->gameState().which = 4; - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 0; createModule(2700, -1); #endif } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 7d09b66e98..e8d3105f6a 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -118,7 +118,7 @@ void Module2700::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: -//TODO _childObject = new Scene2701(_vm, this, which); + _childObject = new Scene2701(_vm, this, which); break; case 1: //TODO _childObject = new Scene2702(_vm, this, which); @@ -513,6 +513,110 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); } +Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + NRect clipRect; + SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240); + setGlobalVar(0x21E60190, 1); + + _surfaceFlag = true; + + setBackground(sceneInfo->bgFilename); + setPalette(sceneInfo->bgFilename); + + _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); + + insertMouse433(0x08B08180); + + _sprite1 = insertStaticSprite(0x1E086325, 1200); + + clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2()); + + if (sceneInfo->class437Filename) { +//TODO _class437 = insertSprite(sceneInfo->class437Filename); + _class521 = insertSprite(this, 320, 240); +//TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); +//TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); +//TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + } else { + _class437 = NULL; + _class521 = insertSprite(this, 320, 240); + } + +//TODO _class518 = insertSprite(_class521); + + _which1 = sceneInfo->which1; + _which2 = sceneInfo->which2; + + _dataResource.load(sceneInfo->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); + _class521->setPathPoints(_trackPoints); + + if (which == _which2) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_class521, 0x2007, 150); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_class521, 0x2002, 0); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_class521, 0x2008, 150); + } + + _class521->setClipRect(clipRect); + // TODO _class518->setClipRect(clipRect); + + if (which == 1) { + SetMessageHandler(&Scene2701::handleMessage42F500); + } else { + sendMessage(_class521, 0x2009, 0); + SetMessageHandler(&Scene2701::handleMessage42F600); + } + +} + +uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + sendPointMessage(_class521, 0x2004, param.asPoint()); + break; + case 0x2005: + if (_which1 >= 0) + SetMessageHandler(&Scene2701::handleMessage42F600); + break; + case 0x2006: + if (_which2 >= 0) + leaveScene(_which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x >= 385) { + leaveScene(0); + } else { + sendPointMessage(_class521, 0x2004, param.asPoint()); + SetMessageHandler(&Scene2701::handleMessage42F500); + } + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) : Scene(vm, parentModule, true) { @@ -621,6 +725,7 @@ uint32 Scene2704::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +static const int kSceneInfo2706Count = 3; static const struct { const char *pointListName; int which1, which2; } kSceneInfo2706[] = { {"me06slotSlotPath2", 4, -1}, {"me06slotSlotPath3", -1, 6}, @@ -628,7 +733,7 @@ static const struct { const char *pointListName; int which1, which2; } kSceneInf }; Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _newTrackIndex(-1), _count(3) { + : Scene(vm, parentModule, true), _newTrackIndex(-1) { _surfaceFlag = true; SetMessageHandler(&Scene2706::handleMessage); @@ -707,7 +812,7 @@ void Scene2706::findClosestTrack(NPoint pt) { int minMatchTrackIndex = -1; int minMatchDistance = 640; // Find the track which contains a point closest to pt - for (int infoIndex = 0; infoIndex < _count; infoIndex++) { + for (int infoIndex = 0; infoIndex < kSceneInfo2706Count; infoIndex++) { NPointArray *pointList = _dataResource.getPointArray(calcHash(kSceneInfo2706[infoIndex].pointListName)); for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { NPoint testPt = (*pointList)[pointIndex]; diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index b596ccd580..85c5b88f51 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -53,6 +53,24 @@ protected: void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; +class Scene2701 : public Scene { +public: + Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Class521 *_class521; + Sprite *_class437; + Sprite *_class517; + Sprite *_class520; + Sprite *_class519; + Sprite *_class518; + Sprite *_sprite1; + //NRect _rect; + int _which1, _which2; + NPointArray *_trackPoints; + uint32 handleMessage42F500(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage42F600(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene2704 : public Scene { public: Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, @@ -78,7 +96,6 @@ protected: Sprite *_class519; int16 _newTrackDestX; int _currTrackIndex, _newTrackIndex; - int _count; NPointArray *_trackPoints; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void findClosestTrack(NPoint pt); diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 4e7d24c6bb..147a319d2e 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -156,7 +156,6 @@ void StaticData::load(const char *filename) { sceneInfo2700->mouseCursorFilename = fd.readUint32LE(); sceneInfo2700->which1 = fd.readUint16LE(); sceneInfo2700->which2 = fd.readUint16LE(); - sceneInfo2700->field24 = fd.readUint32LE(); _sceneInfo2700Items[id] = sceneInfo2700; } diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index c223735ef4..2a2db556e0 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -89,7 +89,6 @@ struct SceneInfo2700 { uint32 mouseCursorFilename; int16 which1; int16 which2; - uint32 field24; }; class StaticData { -- cgit v1.2.3 From 6315ccb5528a9a4d810779055df9184f4b2960c1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 17 Oct 2011 15:32:36 +0000 Subject: NEVERHOOD: Add tables for Scene2702 --- devtools/create_neverhood/tables.h | 6 ++++++ dists/engine-data/neverhood.dat | Bin 19346 -> 19586 bytes 2 files changed, 6 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 3a5d40522a..2534bcecee 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -539,5 +539,11 @@ static const uint32 sceneInfo2700Offsets[] = { // 0x004B2240, // + 0x004B5F68, + 0x004B5F8C, + 0x004B5FB0, + 0x004B5FD8, + 0x004B5FFC, + 0x004B6020, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index f88d5166e8..946b19a36f 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From c56c93f085a7861e19a6a0befdbdd69b9837b41f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 17 Oct 2011 15:32:56 +0000 Subject: NEVERHOOD: Add Scene2702 (needs cleanup) --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/module2700.cpp | 177 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2700.h | 23 ++++- 3 files changed, 200 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 64117ad39a..95fe521e23 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -297,8 +297,8 @@ void GameModule::startup() { createModule(2600, -1); #endif #if 1 - _vm->gameState().which = 4; - _vm->gameState().sceneNum = 0; + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index e8d3105f6a..8c81ddf5e7 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -121,7 +121,7 @@ void Module2700::createScene(int sceneNum, int which) { _childObject = new Scene2701(_vm, this, which); break; case 1: -//TODO _childObject = new Scene2702(_vm, this, which); + _childObject = new Scene2702(_vm, this, which); break; case 2: if (which == 6 || which == 7) @@ -617,6 +617,181 @@ uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam ¶m, return 0; } +static const uint32 kScene2702Infos[2][3] = { + {0x004B5F68, 0x004B5F8C, 0x004B5FB0}, + {0x004B5FD8, 0x004B5FFC, 0x004B6020} +}; + + +Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _flag1(true), _newTrackIndex(-1), _count(3) { + + for (int i = 0; i < 2; i++) + for (int j = 0; j < 3; j++) + _sceneInfos[i][j] = _vm->_staticData->getSceneInfo2700(kScene2702Infos[i][j]); + + _surfaceFlag = true; + SetMessageHandler(&Scene2702::handleMessage); + SetUpdateHandler(&Scene2702::update); + + setBackground(0x18808B00); + setPalette(0x18808B00); + + _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); + addEntity(_palette); + + insertMouse433(0x08B04180); + + //TODO _class437 = insertSprite(0x12002035); + _class521 = insertSprite(this, 320, 240); + //TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); + //TODO insertSprite(_class521); + //TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); + //TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + + _dataResource.load(0x04310014); + + if (which == 1) { + _currSceneInfos = _sceneInfos[1]; + _currTrackIndex = 1; + } else if (which == 2) { + _currSceneInfos = _sceneInfos[1]; + _currTrackIndex = 2; + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _flag1 = false; + } else if (which == 3) { + _currSceneInfos = _sceneInfos[0]; + _currTrackIndex = 0; + } else if (which == 4) { + _currSceneInfos = _sceneInfos[0]; + _currTrackIndex = 2; + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _flag1 = false; + } else if (which == 5) { + _currSceneInfos = _sceneInfos[0]; + _currTrackIndex = 1; + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _flag1 = false; + } else { + _currSceneInfos = _sceneInfos[1]; + _currTrackIndex = 0; + } + + _trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName); + _class521->setPathPoints(_trackPoints); + + if (which == _currSceneInfos[_currTrackIndex]->which2) { + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_class521, 0x2007, 150); + } else { + sendMessage(_class521, 0x2002, 0); + sendMessage(_class521, 0x2008, 150); + } + + _palette->copyBasePalette(0, 256, 0); + +} + +void Scene2702::update() { + Scene::update(); + if (_flag1 && _class521->getX() > 422) { + debug("fade #1"); + _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); + _palette->startFadeToPalette(12); + _flag1 = false; + } else if (!_flag1 && _class521->getX() <= 422) { + debug("fade #2"); + _palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0); + _palette->startFadeToPalette(12); + _flag1 = true; + } +} + +uint32 Scene2702::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + findClosestTrack(param.asPoint()); + break; + case 0x2005: + if (_newTrackIndex >= 0) { + if (_currSceneInfos[_currTrackIndex]->which1 < 0) + changeTrack(); + } else if (_currSceneInfos[_currTrackIndex]->which1 >= 0) + leaveScene(_currSceneInfos[_currTrackIndex]->which1); + break; + case 0x2006: + if (_newTrackIndex >= 0) { + if (_currSceneInfos[_currTrackIndex]->which2 < 0) + changeTrack(); + } else if (_currSceneInfos[_currTrackIndex]->which2 >= 0) + leaveScene(_currSceneInfos[_currTrackIndex]->which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +void Scene2702::findClosestTrack(NPoint pt) { + int minMatchTrackIndex = -1; + int minMatchDistance = 640; + // Find the track which contains a point closest to pt + for (int infoIndex = 0; infoIndex < _count; infoIndex++) { + NPointArray *pointList = _dataResource.getPointArray(_currSceneInfos[infoIndex]->pointListName); + for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { + NPoint testPt = (*pointList)[pointIndex]; + int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); + if (distance < minMatchDistance) { + minMatchTrackIndex = infoIndex; + minMatchDistance = distance; + } + } + } + if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { + _newTrackIndex = minMatchTrackIndex; + _newTrackDestX = pt.x; + if (_currSceneInfos == _sceneInfos[0]) { + if (_currTrackIndex == 0) + sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + else + sendMessage(_class521, 0x2003, 0); + } else if (_currTrackIndex == 2) { + sendMessage(_class521, 0x2003, 0); + } else { + sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + } + } else { + _newTrackIndex = -1; + sendMessage(_class521, 0x2004, pt.x); + } +} + +void Scene2702::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName); + _class521->setPathPoints(_trackPoints); + if (_currSceneInfos == _sceneInfos[0]) { + if (_currTrackIndex == 0) + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + else + sendMessage(_class521, 0x2002, 0); + } else if (_currTrackIndex == 2) { + sendMessage(_class521, 0x2002, 0); + } else { + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + } + sendMessage(_class521, 0x2004, _newTrackDestX); + _newTrackIndex = -1; +} + Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) : Scene(vm, parentModule, true) { diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index 85c5b88f51..a39b52c296 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -64,13 +64,34 @@ protected: Sprite *_class519; Sprite *_class518; Sprite *_sprite1; - //NRect _rect; int _which1, _which2; NPointArray *_trackPoints; uint32 handleMessage42F500(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage42F600(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2702 : public Scene { +public: + Scene2702(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Class521 *_class521; + Sprite *_class437; + Sprite *_class517; + Sprite *_class520; + Sprite *_class519; + int16 _newTrackDestX; + int _currTrackIndex, _newTrackIndex; + int _count; + bool _flag1; + SceneInfo2700 *_sceneInfos[2][3]; + SceneInfo2700 **_currSceneInfos; + NPointArray *_trackPoints; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void findClosestTrack(NPoint pt); + void changeTrack(); +}; + class Scene2704 : public Scene { public: Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, -- cgit v1.2.3 From 023c36f2b6f1906c28d246a1b861e2287d85d851 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 17 Oct 2011 17:58:51 +0000 Subject: NEVERHOOD: Add Class437 (still needs renaming, of course :) --- engines/neverhood/module2700.cpp | 22 +++++++++++++++++----- engines/neverhood/module2700.h | 6 ++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 8c81ddf5e7..096e33546e 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -513,6 +513,18 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); } +Class437::Class437(NeverhoodEngine *vm, uint32 fileHash) + : StaticSprite(vm, 0) { + + _spriteResource.load2(fileHash); + createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _needRefresh = true; + StaticSprite::update(); +} + Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -535,7 +547,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2()); if (sceneInfo->class437Filename) { -//TODO _class437 = insertSprite(sceneInfo->class437Filename); + _class437 = insertSprite(sceneInfo->class437Filename); _class521 = insertSprite(this, 320, 240); //TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); //TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); @@ -643,7 +655,7 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B04180); - //TODO _class437 = insertSprite(0x12002035); + _class437 = insertSprite(0x12002035); _class521 = insertSprite(this, 320, 240); //TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); //TODO insertSprite(_class521); @@ -817,13 +829,13 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 insertMouse433(sceneInfo->mouseCursorFilename); if (sceneInfo->class437Filename) { -//TODO _class437 = insertSprite(sceneInfo->class437Filename); + _class437 = insertSprite(sceneInfo->class437Filename); _class521 = insertSprite(this, 320, 240); //TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); //TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); //TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); } else { -//TODO _class437 = NULL; + _class437 = NULL; //TODO _class517 = NULL; _class521 = insertSprite(this, 320, 240); } @@ -921,7 +933,7 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B8C180); -//TODO _class437 = insertSprite(0x18808B88); + _class437 = insertSprite(0x18808B88); _class521 = insertSprite(this, 320, 240); //TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); //TODO _class518 = insertSprite(_class521); diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index a39b52c296..f1ef3f5727 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -53,6 +53,11 @@ protected: void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; +class Class437 : public StaticSprite { +public: + Class437(NeverhoodEngine *vm, uint32 fileHash); +}; + class Scene2701 : public Scene { public: Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); @@ -98,6 +103,7 @@ public: const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); protected: Class521 *_class521; + Sprite *_class437; int _which1, _which2; NPointArray *_trackPoints; NRectArray *_rectList; -- cgit v1.2.3 From 9cf2c83e5e5a35816ab153bf8443dac691829ea8 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 21 Oct 2011 09:13:49 +0000 Subject: NEVERHOOD: Major renaming: - Give better names to animation callback functions/vars - Give better names to animation functions (previously known as subXXXX - not completed yet) - Add dumpAllResources (which is a lie, since it only dumps animations for now) - More renaming to come --- engines/neverhood/diskplayerscene.cpp | 4 +- engines/neverhood/klayman.cpp | 1138 ++++++++++++++++----------------- engines/neverhood/klayman.h | 163 +++-- engines/neverhood/module1000.cpp | 40 +- engines/neverhood/module1100.cpp | 2 +- engines/neverhood/module1200.cpp | 34 +- engines/neverhood/module1300.cpp | 34 +- engines/neverhood/module1400.cpp | 34 +- engines/neverhood/module1600.cpp | 46 +- engines/neverhood/module1900.cpp | 18 +- engines/neverhood/module2100.cpp | 6 +- engines/neverhood/module2200.cpp | 20 +- engines/neverhood/module2600.cpp | 2 +- engines/neverhood/module3000.cpp | 18 +- engines/neverhood/neverhood.cpp | 138 ++-- engines/neverhood/neverhood.h | 2 + engines/neverhood/resourceman.h | 2 + engines/neverhood/sprite.cpp | 59 +- engines/neverhood/sprite.h | 24 +- 19 files changed, 891 insertions(+), 893 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index ace2b5ba6d..4fdc736dc5 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -179,7 +179,7 @@ uint32 Class494::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Class494::sub43BE00() { - setFileHash1(); + stopAnimation(); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Sprite::handleMessage); _surface->setVisible(false); @@ -189,7 +189,7 @@ void Class494::sub43BE20() { setFileHash(0x100B90B4, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class494::handleMessage); - SetAnimationCallback3(&Class494::sub43BE00); + NextState(&Class494::sub43BE00); _surface->setVisible(true); } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 865c91a7a8..567788b729 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -28,17 +28,17 @@ namespace Neverhood { static const KlaymanTableItem klaymanTable1[] = { - {1, &Klayman::sub41FD30}, + {1, &Klayman::stDoIdlePickEar}, {1, &Klayman::sub41FDA0}, {1, &Klayman::sub41FDF0}, - {1, &Klayman::sub41FE60}, + {1, &Klayman::stDoIdleChest}, {1, &Klayman::sub41FEB0} }; static const KlaymanTableItem klaymanTable2[] = { - {1, &Klayman::sub41FD30}, + {1, &Klayman::stDoIdlePickEar}, {1, &Klayman::sub41FDA0}, - {1, &Klayman::sub41FE60}, + {1, &Klayman::stDoIdleChest}, {1, &Klayman::sub41FEB0} }; @@ -51,7 +51,7 @@ static const KlaymanTableItem klaymanTable3[] = { static const KlaymanTableItem klaymanTable4[] = { {1, &Klayman::sub41FDA0}, - {1, &Klayman::sub41FE60}, + {1, &Klayman::stDoIdleChest}, {1, &Klayman::sub41FEB0}, }; @@ -72,7 +72,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _y4 = y; _flags = 2; setKlaymanTable1(); - sub41FC80(); + stTryStandIdle(); SetUpdateHandler(&Klayman::update); } @@ -87,7 +87,7 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4818: sub41C930(_dataResource.getPoint(param.asInteger()).x, false); @@ -122,22 +122,22 @@ void Klayman::setKlaymanTable3() { // TODO setKlaymanTable(klaymanTable3, ARRAYSIZE(klaymanTable3)); } -void Klayman::sub41FD30() { - sub41D320(0x5B20C814, AnimationCallback(&Klayman::sub41FD40)); +void Klayman::stDoIdlePickEar() { + sub41D320(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar)); } -void Klayman::sub41FD40() { +void Klayman::stIdlePickEar() { _status2 = 1; _flagE5 = true; setFileHash(0x5B20C814, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB10); + SetMessageHandler(&Klayman::hmIdlePickEar); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub41FCF0); - setCallback1(AnimationCallback(&Klayman::sub41FD90)); + NextState(&Klayman::stStandAround); + FinalizeState(&Klayman::evIdlePickEarDone); } -uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -149,7 +149,7 @@ uint32 Klayman::handleMessage41EB10(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FD90() { +void Klayman::evIdlePickEarDone() { _soundResource1.stop(); } @@ -164,7 +164,7 @@ void Klayman::sub41FDB0() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E980); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub41FCF0); + NextState(&Klayman::stStandAround); } uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -190,8 +190,8 @@ void Klayman::sub41FE00() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E9E0); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub41FCF0); - setCallback1(AnimationCallback(&Klayman::sub41FE50)); + NextState(&Klayman::stStandAround); + FinalizeState(&Klayman::sub41FE50); } void Klayman::sub41FE50() { @@ -214,21 +214,21 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FE60() { - sub41D320(0x40A0C034, AnimationCallback(&Klayman::sub41FE70)); +void Klayman::stDoIdleChest() { + sub41D320(0x40A0C034, AnimationCallback(&Klayman::stIdleChest)); } -void Klayman::sub41FE70() { +void Klayman::stIdleChest() { _status2 = 1; _flagE5 = true; setFileHash(0x40A0C034, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EF80); + SetMessageHandler(&Klayman::hmIdleChest); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub41FCF0); + NextState(&Klayman::stStandAround); } -uint32 Klayman::handleMessage41EF80(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -251,7 +251,7 @@ void Klayman::sub41FEC0() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EFE0); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub41FCF0); + NextState(&Klayman::stStandAround); } uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -306,22 +306,22 @@ void Klayman::update41D1C0() { if (_counter3 >= _counter3Max) { _counter3 = 0; _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; - sub4213F0(); + stIdleSitBlink(); } } } -void Klayman::sub4213F0() { +void Klayman::stIdleSitBlink() { _status2 = 0; _flagE5 = true; setFileHash(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub4213B0); + NextState(&Klayman::stIdleSitBlinkSecond); } -void Klayman::sub4213B0() { +void Klayman::stIdleSitBlinkSecond() { _status2 = 0; _flagE5 = true; setFileHash(0x5C24C018, 0, -1); @@ -330,21 +330,21 @@ void Klayman::sub4213B0() { SetSpriteCallback(NULL); } -void Klayman::sub420060() { - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); - if (!sub41CEB0(AnimationCallback(&Klayman::sub420060))) { +void Klayman::stPickUpNeedle() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klayman::stPickUpNeedle))) { _status2 = 1; _flagE5 = false; setFileHash(0x1449C169, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D4C0); + SetMessageHandler(&Klayman::hmPickUpGeneric); SetSpriteCallback(NULL); } } void Klayman::sub41FFF0() { - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); - if (!sub41CEB0(AnimationCallback(&Klayman::sub41FFF0))) { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klayman::sub41FFF0))) { _status2 = 1; _flagE5 = false; setFileHash(0x0018C032, 0, -1); @@ -395,8 +395,8 @@ void Klayman::sub421510() { SetSpriteCallback(NULL); } -void Klayman::sub421160() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub421160))) { +void Klayman::stStepOver() { + if (!stStartAction(AnimationCallback(&Klayman::stStepOver))) { _status2 = 2; _flagE5 = false; setFileHash(0x004AA310, 0, -1); @@ -406,8 +406,8 @@ void Klayman::sub421160() { } } -void Klayman::sub4212C0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub4212C0))) { +void Klayman::stSitInTeleporter() { + if (!stStartAction(AnimationCallback(&Klayman::stSitInTeleporter))) { _status2 = 0; _flagE5 = false; setFileHash(0x392A0330, 0, -1); @@ -443,7 +443,7 @@ void Klayman::sub421310() { void Klayman::sub41CE70() { _x4 = _x; if (!_flagE1 && !_flagE2 && !_flagE3) { - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } } @@ -452,7 +452,7 @@ void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) { _resourceHandle = _vm->_res->useResource(fileHash); if (_resourceHandle != -1) { // TODO _vm->_res->moveToFront(_resourceHandle); - SetAnimationCallback3(callback); + NextState(callback); SetUpdateHandler(&Klayman::update41D2B0); } } @@ -470,7 +470,7 @@ void Klayman::update41D2B0() { update(); } -bool Klayman::sub41CF10(AnimationCb callback) { +bool Klayman::stStartActionFromIdle(AnimationCb callback) { if (_status2 == 2) { _status2 = 1; _flagE5 = false; @@ -478,21 +478,21 @@ bool Klayman::sub41CF10(AnimationCb callback) { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41F140); SetSpriteCallback(NULL); - SetAnimationCallback3(callback); + NextState(callback); return true; } return false; } void Klayman::sub41C7B0() { - if (_callback1Cb) { - AnimationCb cb = _callback1Cb; - _callback1Cb = NULL; + if (_finalizeStateCb) { + AnimationCb cb = _finalizeStateCb; + _finalizeStateCb = NULL; (this->*cb)(); } - if (_callback3Cb) { - AnimationCb cb = _callback3Cb; - _callback3Cb = NULL; + if (_nextStateCb) { + AnimationCb cb = _nextStateCb; + _nextStateCb = NULL; (this->*cb)(); #if 0 // TODO } else if (_callbackList) { @@ -513,8 +513,8 @@ void Klayman::sub41C790() { _status3 = 0; } -void Klayman::sub41FC80() { - if (!sub41CF10(AnimationCallback(&Klayman::sub41FC80))) { +void Klayman::stTryStandIdle() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTryStandIdle))) { _status2 = 1; _flagE5 = true; setFileHash(0x5420E254, 0, -1); @@ -547,7 +547,7 @@ void Klayman::update41D0F0() { if (_counter3 >= _counter3Max) { _counter3 = 0; _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; - sub41FF00(); + stStand(); } } } @@ -560,7 +560,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E messageResult = _flagE5; break; case 0x1014: - _attachedSprite = param.asEntity(); + _attachedSprite = (Sprite*)(param.asEntity()); break; case 0x1019: sub41C7B0(); @@ -589,14 +589,14 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FF00() { +void Klayman::stStand() { _status2 = 1; _flagE5 = true; setFileHash(0x5900C41E, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); - SetAnimationCallback3(&Klayman::sub41FCF0); + NextState(&Klayman::stStandAround); } uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -609,7 +609,7 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FCF0() { +void Klayman::stStandAround() { _status2 = 1; _flagE5 = true; setFileHash(0x5420E254, 0, -1); @@ -638,33 +638,33 @@ void Klayman::sub41C930(int16 x, bool flag) { if (x == _x) { _x4 = x; if (!_flagE1 && !_flagE2 && !_flagE3) { - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { _x4 = x; - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else if (xdiff <= 42 && _status3 != 3) { if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { _x4 = x; } else { _x4 = x; - setCallback2(AnimationCallback(&Klayman::sub41FB40)); + GotoState(&Klayman::stSneak); } } else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { _x4 = x; } else if (flag) { _x4 = x; - error("// TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550));"); - // TODO AnimatedSprite_setCallback2(AnimationCallback(&Klayman::sub421550)); + error("// TODO AnimatedSprite_GotoState(&Klayman::sub421550));"); + // TODO AnimatedSprite_GotoState(&Klayman::sub421550); } else { _x4 = x; - setCallback2(AnimationCallback(&Klayman::sub41F950)); + GotoState(&Klayman::stStartWalking); } } -void Klayman::sub4211F0() { +void Klayman::stWakeUp() { _status2 = 1; _flagE5 = false; setFileHash(0x527AC970, 0, -1); @@ -673,16 +673,16 @@ void Klayman::sub4211F0() { SetSpriteCallback(NULL); } -void Klayman::sub4211B0() { +void Klayman::stSleeping() { _status2 = 0; _flagE5 = true; setFileHash(0x5A38C110, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E920); + SetMessageHandler(&Klayman::hmSleeping); SetSpriteCallback(NULL); } -uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -694,7 +694,7 @@ uint32 Klayman::handleMessage41E920(int messageNum, const MessageParam ¶m, E return messageResult; } -bool Klayman::sub41CEB0(AnimationCb callback3) { +bool Klayman::stStartAction(AnimationCb callback3) { if (_status2 == 1) { _status2 = 2; _flagE5 = false; @@ -702,7 +702,7 @@ bool Klayman::sub41CEB0(AnimationCb callback3) { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41F140); SetSpriteCallback(&Klayman::spriteUpdate41F250); - SetAnimationCallback3(callback3); + NextState(callback3); return true; } else { _x = _x4; @@ -789,7 +789,7 @@ void Klayman::spriteUpdate41F5F0() { } -void Klayman::sub41FB40() { +void Klayman::stSneak() { _status2 = 1; _flagE2 = true; _flagE5 = true; @@ -798,10 +798,10 @@ void Klayman::sub41FB40() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DD80); SetSpriteCallback(&Klayman::spriteUpdate41F5F0); - setCallback1(AnimationCallback(&Klayman::sub41FBB0)); + FinalizeState(&Klayman::stSneakDone); } -void Klayman::sub41FBB0() { +void Klayman::stSneakDone() { _flagE2 = false; } @@ -844,15 +844,15 @@ void Klayman::sub41CD70(int16 x) { } } else if (x == _x) { _x4 = x; - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else { sub41C930(x, false); } } -void Klayman::sub41F950() { - if (!sub41CF10(AnimationCallback(&Klayman::sub41F950))) { +void Klayman::stStartWalking() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) { _status2 = 0; _flagE1 = true; _flagE5 = true; @@ -861,12 +861,12 @@ void Klayman::sub41F950() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EC70); SetSpriteCallback(&Klayman::spriteUpdate41F320); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); - SetAnimationCallback3(&Klayman::sub41F9E0); + FinalizeState(&Klayman::stStartWalkingDone); + NextState(&Klayman::stWalking); } } -void Klayman::sub41FB30() { +void Klayman::stStartWalkingDone() { _flagE1 = false; } @@ -892,7 +892,7 @@ uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41F9E0() { +void Klayman::stWalking() { _status2 = 0; _flagE1 = true; _flagE5 = true; @@ -900,8 +900,8 @@ void Klayman::sub41F9E0() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); - SetAnimationCallback3(&Klayman::sub41FA40); + FinalizeState(&Klayman::stStartWalkingDone); + NextState(&Klayman::sub41FA40); } void Klayman::spriteUpdate41F300() { @@ -959,7 +959,7 @@ void Klayman::sub41FA40() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DD80); SetSpriteCallback(&Klayman::spriteUpdate41F5F0); - setCallback1(AnimationCallback(&Klayman::sub41FBB0)); + FinalizeState(&Klayman::stSneakDone); } } @@ -1035,19 +1035,19 @@ uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FF80() { - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); - if (!sub41CEB0(AnimationCallback(&Klayman::sub41FF80))) { +void Klayman::stPickUpGeneric() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klayman::stPickUpGeneric))) { _status2 = 1; _flagE5 = false; setFileHash(0x1C28C178, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D4C0); + SetMessageHandler(&Klayman::hmPickUpGeneric); SetSpriteCallback(NULL); } } -uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1073,18 +1073,18 @@ uint32 Klayman::handleMessage41D4C0(int messageNum, const MessageParam ¶m, E } -void Klayman::sub420120() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420120))) { +void Klayman::stTurnPressButton() { + if (!stStartAction(AnimationCallback(&Klayman::stTurnPressButton))) { _status2 = 2; _flagE5 = true; setFileHash(0x1C02B03D, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DAD0); + SetMessageHandler(&Klayman::hmPressButton); SetSpriteCallback(NULL); } } -uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1102,24 +1102,24 @@ uint32 Klayman::handleMessage41DAD0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420170() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420170))) { +void Klayman::stStampFloorButton() { + if (!stStartAction(AnimationCallback(&Klayman::stStampFloorButton))) { _status2 = 2; _flagE5 = true; setFileHash(0x1C16B033, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DAD0); + SetMessageHandler(&Klayman::hmPressButton); SetSpriteCallback(NULL); } } -void Klayman::sub4200D0() { - if (!sub41CF10(AnimationCallback(&Klayman::sub4200D0))) { +void Klayman::stPressButtonSide() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stPressButtonSide))) { _status2 = 1; _flagE5 = true; setFileHash(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DAD0); + SetMessageHandler(&Klayman::hmPressButton); SetSpriteCallback(&Klayman::spriteUpdate41F250); } } @@ -1135,7 +1135,7 @@ void Klayman::sub41CD00(int16 x) { sub41C930(x, false); } else { _x4 = x; - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } } @@ -1144,7 +1144,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { if (_x > x1) { if (_x == x1 + x2) { _x4 = x1 + x2; - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else if (_x < x1 + x2) { sub41CAC0(x1 + x2); @@ -1154,7 +1154,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { } else { if (_x == x1 - x2) { _x4 = x1 - x2; - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else if (_x > x1 - x2) { sub41CAC0(x1 - x2); @@ -1169,45 +1169,45 @@ void Klayman::sub41CAC0(int16 x) { if (x == _x) { _x4 = x; if (!_flagE1 && !_flagE2 && !_flagE3) { - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { _x4 = x; - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else if (xdiff <= 42 && _status3 != 3) { if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { _x4 = x; } else { _x4 = x; - setCallback2(AnimationCallback(&Klayman::sub41FB40)); + GotoState(&Klayman::stSneak); } } else if (_flagE3 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { _x4 = x; } else { _x4 = x; - setCallback2(AnimationCallback(&Klayman::sub41FBC0)); + GotoState(&Klayman::stLargeStep); } } -void Klayman::sub41FBC0() { +void Klayman::stLargeStep() { _status2 = 2; _flagE3 = true; _flagE5 = true; setDoDeltaX(_x4 >= _x ? 1 : 0); setFileHash(0x08B28116, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DF10); - SetSpriteCallback(&Klayman::spriteUpdate41F780); - setCallback1(AnimationCallback(&Klayman::sub41FC30)); + SetMessageHandler(&Klayman::hmLargeStep); + SetSpriteCallback(&Klayman::suLargeStep); + FinalizeState(&Klayman::stLargeStepDone); } -void Klayman::sub41FC30() { +void Klayman::stLargeStepDone() { _flagE3 = false; } -void Klayman::spriteUpdate41F780() { +void Klayman::suLargeStep() { int16 xdiff = _x4 - _x; if (_doDeltaX) { @@ -1253,7 +1253,7 @@ void Klayman::spriteUpdate41F780() { } } -uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1271,7 +1271,7 @@ uint32 Klayman::handleMessage41DF10(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420870() { +void Klayman::stWonderAboutHalf() { _status2 = 0; _flagE5 = true; setFileHash(0xD820A114, 0, 10); @@ -1280,7 +1280,7 @@ void Klayman::sub420870() { SetSpriteCallback(NULL); } -void Klayman::sub4208B0() { +void Klayman::stWonderAboutAfter() { _status2 = 1; _flagE5 = true; setFileHash(0xD820A114, 30, -1); @@ -1289,7 +1289,7 @@ void Klayman::sub4208B0() { SetSpriteCallback(NULL); } -void Klayman::sub4208F0() { +void Klayman::stTurnToUseHalf() { _status2 = 0; _flagE5 = true; setFileHash(0x9B250AD2, 0, 7); @@ -1312,7 +1312,7 @@ uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420930() { +void Klayman::stTurnAwayFromUse() { _status2 = 1; _flagE5 = true; setFileHash(0x98F88391, 4, -1); @@ -1321,7 +1321,7 @@ void Klayman::sub420930() { SetSpriteCallback(NULL); } -void Klayman::sub420830() { +void Klayman::stWonderAbout() { _status2 = 1; _flagE5 = true; setFileHash(0xD820A114, 0, -1); @@ -1330,23 +1330,22 @@ void Klayman::sub420830() { SetSpriteCallback(NULL); } -void Klayman::sub41FC40() { +void Klayman::stPeekWall() { _status2 = 1; _flagE5 = true; setFileHash(0xAC20C012, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E3C0); + SetMessageHandler(&Klayman::hmPeekWall); SetSpriteCallback(NULL); } -uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender) { int16 speedUpFrameIndex; switch (messageNum) { case 0x1008: speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_frameIndex < speedUpFrameIndex) { + if (_frameIndex < speedUpFrameIndex) setFileHash(0xAC20C012, speedUpFrameIndex, -1); - } return 0; case 0x100D: if (param.asInteger() == 0x32180101) { @@ -1360,7 +1359,7 @@ uint32 Klayman::handleMessage41E3C0(int messageNum, const MessageParam ¶m, E } void Klayman::sub420210() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420210))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420210))) { _status2 = 0; setFileHash(0xD82890BA, 0, -1); sub4201C0(); @@ -1372,7 +1371,7 @@ void Klayman::sub4201C0() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D790); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetAnimationCallback3(&Klayman::sub420340); + NextState(&Klayman::sub420340); sendMessage(_attachedSprite, 0x482B, 0); } @@ -1412,7 +1411,7 @@ void Klayman::sub420340() { } void Klayman::sub420250() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420250))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420250))) { _status2 = 0; setFileHash(0x900980B2, 0, -1); sub4201C0(); @@ -1420,14 +1419,14 @@ void Klayman::sub420250() { } void Klayman::sub420290() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420290))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420290))) { _status2 = 0; _flagE5 = false; setFileHash(0xBA1910B2, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D880); - SetAnimationCallback3(&Klayman::sub420380); + NextState(&Klayman::sub420380); sendMessage(_attachedSprite, 0x482B, 0); } } @@ -1483,7 +1482,7 @@ void Klayman::sub4203C0() { } void Klayman::sub420300() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420300))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420300))) { _status2 = 0; setFileHash(0xB8699832, 0, -1); sub4201C0(); @@ -1491,7 +1490,7 @@ void Klayman::sub420300() { } void Klayman::sub41CCE0(int16 x) { - sub41CC40(((Sprite*)_attachedSprite)->getX(), x); + sub41CC40(_attachedSprite->getX(), x); } void Klayman::sub420970() { @@ -1507,7 +1506,7 @@ void Klayman::sub420970() { } void Klayman::sub4209D0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub4209D0))) { + if (!stStartAction(AnimationCallback(&Klayman::sub4209D0))) { _status2 = 0; if (_y4 < _y) { if (_statusE0 == 1) { @@ -1609,7 +1608,7 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, E } void Klayman::sub420AD0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420AD0))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420AD0))) { _status2 = 0; if (_y4 >= _y - 30) { sub41C7B0(); @@ -1671,7 +1670,7 @@ uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam ¶m, E } void Klayman::sub420FE0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420FE0))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420FE0))) { _status2 = 2; _flagE5 = false; setFileHash(0xF229C003, 0, -1); @@ -1682,7 +1681,7 @@ void Klayman::sub420FE0() { } void Klayman::sub4210C0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub4210C0))) { + if (!stStartAction(AnimationCallback(&Klayman::sub4210C0))) { _status2 = 0; _flagE5 = false; setFileHash2(0xCA221107, 0x8520108C, 0); @@ -1693,7 +1692,7 @@ void Klayman::sub4210C0() { } void Klayman::sub421070() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub421070))) { + if (!stStartAction(AnimationCallback(&Klayman::sub421070))) { _status2 = 2; _flagE5 = false; setFileHash(0xCA221107, 0, -1); @@ -1703,7 +1702,7 @@ void Klayman::sub421070() { } } -void Klayman::sub420420() { +void Klayman::stLandOnFeet() { _status2 = 1; _flagE5 = true; setFileHash(0x18118554, 0, -1); @@ -1725,7 +1724,7 @@ uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam ¶m, E } void Klayman::sub420ED0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420ED0))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420ED0))) { _status2 = 2; _flagE5 = false; setFileHash(0x91540140, 0, -1); @@ -1752,7 +1751,7 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam ¶m, E } void Klayman::sub420750() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420750))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420750))) { _status2 = 2; _flagE5 = false; setFileHash(0x5CCCB330, 0, -1); @@ -1762,8 +1761,8 @@ void Klayman::sub420750() { } } -void Klayman::sub4207A0() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub4207A0))) { +void Klayman::stTurnToUse() { + if (!stStartAction(AnimationCallback(&Klayman::stTurnToUse))) { _status2 = 2; _flagE5 = false; setFileHash(0x9B250AD2, 0, -1); @@ -1799,8 +1798,8 @@ void Klayman::spriteUpdate41F5A0() { AnimatedSprite::updateDeltaXY(); } -void Klayman::sub420600() { - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); +void Klayman::stMoveObjectSkipTurnFaceObject() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); _flagE4 = false; _flagE5 = true; setFileHash2(0x0C1CA072, 0x01084280, 0); @@ -1820,10 +1819,10 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, E if (_attachedSprite) sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); } else if (param.asInteger() == 0x02421405) { - if (_flagE4 && _attachedSprite->hasMessageHandler() && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { - sub4205C0(); + if (_flagE4 && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { + stMoveObjectSkipTurn(); } else { - setCallback1(AnimationCallback(&Klayman::sub420660)); + FinalizeState(&Klayman::sub420660); SetMessageHandler(&Klayman::handleMessage41D480); } } else if (param.asInteger() == 0x32180101) { @@ -1839,7 +1838,7 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, E return handleMessage41D480(messageNum, param, sender); } -void Klayman::sub4205C0() { +void Klayman::stMoveObjectSkipTurn() { _flagE4 = false; _flagE5 = true; setFileHash2(0x0C1CA072, 0x01084280, 0); @@ -1848,9 +1847,9 @@ void Klayman::sub4205C0() { SetMessageHandler(&Klayman::handleMessage41D970); } -void Klayman::sub420550() { - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); - if (!sub41CEB0(AnimationCallback(&Klayman::sub420550))) { +void Klayman::stMoveObjectFaceObject() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) { _status2 = 2; _flagE4 = false; _flagE5 = true; @@ -1862,29 +1861,30 @@ void Klayman::sub420550() { } void Klayman::sub420C50() { - if (!sub41CEB0(AnimationCallback(&Klayman::sub420C50))) { + if (!stStartAction(AnimationCallback(&Klayman::sub420C50))) { _status2 = 0; if (_flagF7) { - sub420D50(); + stReleaseLeverUp(); } else { sendMessage(_attachedSprite, 0x482B, 0); setFileHash(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); - SetAnimationCallback3(&Klayman::sub420CD0); + NextState(&Klayman::stPullLeverDown); _flagE5 = false; } } } -void Klayman::sub420CD0() { +// Exactly the same code as sub420DA0 which was removed +void Klayman::stPullLeverDown() { setFileHash(0x0D318140, 0, -1); sendMessage(_attachedSprite, 0x480F, 0); - SetAnimationCallback3(&Klayman::sub420D10); + NextState(&Klayman::stHoldLeverDown); } -void Klayman::sub420D10() { +void Klayman::stHoldLeverDown() { setFileHash(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); @@ -1893,31 +1893,16 @@ void Klayman::sub420D10() { _flagE5 = true; } -void Klayman::sub420D50() { +void Klayman::stReleaseLeverUp() { setFileHash(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); - SetAnimationCallback3(&Klayman::sub420DA0); + NextState(&Klayman::stPullLeverDown); _flagE5 = false; } -void Klayman::sub420DA0() { - setFileHash(0x0D318140, 0, -1); - sendMessage(_attachedSprite, 0x480F, 0); - SetAnimationCallback3(&Klayman::sub420DE0); -} - -void Klayman::sub420DE0() { - setFileHash(0x4464A440, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41D360); - _flagF7 = true; - _flagE5 = true; -} - void Klayman::sub420E20() { if (_flagF7) { _status2 = 2; @@ -1926,7 +1911,7 @@ void Klayman::sub420E20() { SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); - SetAnimationCallback3(&Klayman::sub420E90); + NextState(&Klayman::sub420E90); _flagE5 = false; _flagF7 = false; } else { @@ -1936,7 +1921,7 @@ void Klayman::sub420E20() { void Klayman::sub420E90() { setFileHash(0x0928C048, 0, -1); - setCallback1(AnimationCallback(&Klayman::sub420EB0)); + FinalizeState(&Klayman::sub420EB0); } void Klayman::sub420EB0() { @@ -1944,7 +1929,7 @@ void Klayman::sub420EB0() { } void Klayman::sub420680() { - if (!sub41CF10(AnimationCallback(&Klayman::sub420680))) { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub420680))) { _status2 = 2; _counter2 = 0; for (uint32 i = 0; i < 20; i++) { @@ -1955,7 +1940,7 @@ void Klayman::sub420680() { } } if (_counter2 == 0) { - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else { setFileHash(0xD8C8D100, 0, -1); @@ -2023,26 +2008,25 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: - if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub4211B0)); - } + if (param.asInteger() == 2) + GotoState(&Klayman::stSleeping); break; case 0x480D: - setCallback2(AnimationCallback(&KmScene1001::sub44FA50)); + GotoState(&KmScene1001::sub44FA50); break; case 0x4812: - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); - }else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -2059,15 +2043,15 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481F: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -2077,7 +2061,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4836: if (param.asInteger() == 1) { sendMessage(_parentScene, 0x2002, 0); - setCallback2(AnimationCallback(&Klayman::sub4211F0)); + GotoState(&Klayman::stWakeUp); } break; case 0x483F: @@ -2091,7 +2075,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene1001::sub44FA50() { - if (!sub41CEB0(AnimationCallback(&KmScene1001::sub44FA50))) { + if (!stStartAction(AnimationCallback(&KmScene1001::sub44FA50))) { _status2 = 2; _flagE5 = false; setFileHash(0x00648953, 0, -1); @@ -2138,7 +2122,7 @@ void KmScene1002::xUpdate() { uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2001: - setCallback2(AnimationCallback(&KmScene1002::sub449E90)); + GotoState(&KmScene1002::sub449E90); break; case 0x2007: _otherSprite = (Sprite*)param.asEntity(); @@ -2148,43 +2132,43 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4803: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&KmScene1002::sub44A250)); + GotoState(&KmScene1002::stJumpAndFall); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&KmScene1002::sub44A2C0)); + GotoState(&KmScene1002::stDropFromRing); } break; case 0x4804: - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); break; case 0x4805: switch (param.asInteger()) { case 1: - setCallback2(AnimationCallback(&Klayman::sub420210)); + GotoState(&Klayman::sub420210); break; case 2: - setCallback2(AnimationCallback(&Klayman::sub420250)); + GotoState(&Klayman::sub420250); break; case 3: - setCallback2(AnimationCallback(&Klayman::sub420290)); + GotoState(&Klayman::sub420290); break; case 4: - setCallback2(AnimationCallback(&Klayman::sub420300)); + GotoState(&Klayman::sub420300); break; } break; case 0x480A: - setCallback2(AnimationCallback(&KmScene1002::sub44A3E0)); + GotoState(&KmScene1002::stMoveVenusFlyTrap); break; case 0x480D: - setCallback2(AnimationCallback(&KmScene1002::sub449E20)); + GotoState(&KmScene1002::sub449E20); break; case 0x4816: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&KmScene1002::sub44A330)); + GotoState(&KmScene1002::stPressDoorButton); } break; case 0x4817: @@ -2196,34 +2180,34 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4820: sendMessage(_parentScene, 0x2005, 0); - setCallback2(AnimationCallback(&Klayman::sub420970)); + GotoState(&Klayman::sub420970); break; case 0x4821: sendMessage(_parentScene, 0x2005, 0); _y4 = param.asInteger(); - setCallback2(AnimationCallback(&Klayman::sub4209D0)); + GotoState(&Klayman::sub4209D0); break; case 0x4822: sendMessage(_parentScene, 0x2005, 0); _y4 = param.asInteger(); - setCallback2(AnimationCallback(&Klayman::sub420AD0)); + GotoState(&Klayman::sub420AD0); break; case 0x4823: sendMessage(_parentScene, 0x2006, 0); - setCallback2(AnimationCallback(&Klayman::sub420BC0)); + GotoState(&Klayman::sub420BC0); break; case 0x482E: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub421030)); + GotoState(&Klayman::sub421030); } else { - setCallback2(AnimationCallback(&Klayman::sub420FE0)); + GotoState(&Klayman::sub420FE0); } break; case 0x482F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4210C0)); + GotoState(&Klayman::sub4210C0); } else { - setCallback2(AnimationCallback(&Klayman::sub421070)); + GotoState(&Klayman::sub421070); } break; case 0x483F: @@ -2286,14 +2270,14 @@ uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶ } else if (param.asInteger() == 1) { sub44A0D0(); } else if (param.asInteger() == 2) { - sub44A050(); + stSpitOutFall(); } break; } return 0; } -uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2301,7 +2285,7 @@ uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶ _flagE5 = false; sendMessage(_attachedSprite, 0x2003, 0); } else if (param.asInteger() == 0xDA600012) { - sub44A370(); + stHitByBoxingGlove(); } else if (param.asInteger() == 0x0D01B294) { _flagE5 = false; sendMessage(_attachedSprite, 0x480B, 0); @@ -2311,7 +2295,7 @@ uint32 KmScene1002::handleMessage449990(int messageNum, const MessageParam ¶ return messageResult; } -uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { @@ -2322,7 +2306,7 @@ uint32 KmScene1002::handleMessage449A30(int messageNum, const MessageParam ¶ if (_flagE4) { if (_attachedSprite) { if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) { - sub44A460(); + stContinueMovingVenusFlyTrap(); } } } else { @@ -2398,7 +2382,7 @@ uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene1002::spriteUpdate449DC0() { +void KmScene1002::suFallDown() { AnimatedSprite::updateDeltaXY(); HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { @@ -2410,14 +2394,14 @@ void KmScene1002::spriteUpdate449DC0() { } void KmScene1002::sub449E20() { - if (!sub41CEB0(AnimationCallback(&KmScene1002::sub449E20))) { + if (!stStartAction(AnimationCallback(&KmScene1002::sub449E20))) { _status2 = 2; _flagE5 = false; setFileHash(0x584984B4, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1002::handleMessage449800); - SetAnimationCallback3(&Klayman::sub420420); + NextState(&Klayman::stLandOnFeet); sendMessage(_attachedSprite, 0x482B, 0); } } @@ -2439,13 +2423,11 @@ void KmScene1002::sub449EF0() { _flagE5 = false; setFileHash(0x000BAB02, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); - // Weird stuff happening SetMessageHandler(&Klayman::handleMessage41D360); //SetMessageHandler(&Klayman::handleMessage41D480); - - SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); - SetAnimationCallback3(&KmScene1002::sub449F70); + SetSpriteCallback(&KmScene1002::suFallDown); + NextState(&KmScene1002::sub449F70); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); } @@ -2460,7 +2442,7 @@ void KmScene1002::sub449F70() { SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1002::handleMessage41D480); - SetAnimationCallback3(&KmScene1002::sub44A230); + NextState(&KmScene1002::sub44A230); sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; @@ -2468,15 +2450,15 @@ void KmScene1002::sub449F70() { sendMessage(_ssLadderArch, 0x482B, 0); } -void KmScene1002::sub44A050() { +void KmScene1002::stSpitOutFall() { _counter1 = 1; _status2 = 0; _flagE5 = false; setFileHash(0x9308C132, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); - SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); + SetSpriteCallback(&KmScene1002::suFallDown); SetMessageHandler(&Klayman::handleMessage41D480); - SetAnimationCallback3(&KmScene1002::sub449F70); + NextState(&KmScene1002::sub449F70); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); } @@ -2488,8 +2470,8 @@ void KmScene1002::sub44A0D0() { setFileHash(0x0013A206, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); - SetAnimationCallback3(&KmScene1002::sub44A150); + SetSpriteCallback(&KmScene1002::suFallDown); + NextState(&KmScene1002::sub44A150); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); } @@ -2504,7 +2486,7 @@ void KmScene1002::sub44A150() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D480); SetSpriteCallback(NULL); - SetAnimationCallback3(&KmScene1002::sub44A230); + NextState(&KmScene1002::sub44A230); sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; @@ -2514,25 +2496,25 @@ void KmScene1002::sub44A150() { void KmScene1002::sub44A230() { setDoDeltaX(2); - sub41FC80(); + stTryStandIdle(); } -void KmScene1002::sub44A250() { - if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A250))) { +void KmScene1002::stJumpAndFall() { + if (!stStartAction(AnimationCallback(&KmScene1002::stJumpAndFall))) { sendMessage(_parentScene, 0x1024, 3); _status2 = 2; _flagE5 = false; setFileHash(0xB93AB151, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage449D60); - SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); - SetAnimationCallback3(&Klayman::sub420420); + SetSpriteCallback(&KmScene1002::suFallDown); + NextState(&Klayman::stLandOnFeet); } } -void KmScene1002::sub44A2C0() { +void KmScene1002::stDropFromRing() { if (_attachedSprite) { - _x = ((Sprite*)_attachedSprite)->getX(); + _x = _attachedSprite->getX(); sendMessage(_attachedSprite, 0x4807, 0); _attachedSprite = NULL; } @@ -2541,59 +2523,59 @@ void KmScene1002::sub44A2C0() { setFileHash(0x586984B1, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D360); - SetSpriteCallback(&KmScene1002::spriteUpdate449DC0); - SetAnimationCallback3(&Klayman::sub420420); + SetSpriteCallback(&KmScene1002::suFallDown); + NextState(&Klayman::stLandOnFeet); } -void KmScene1002::sub44A330() { +void KmScene1002::stPressDoorButton() { _status2 = 2; _flagE5 = true; setDoDeltaX(0); setFileHash(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage449990); + SetMessageHandler(&KmScene1002::hmPressDoorButton); SetSpriteCallback(&Klayman::spriteUpdate41F250); } -void KmScene1002::sub44A370() { +void KmScene1002::stHitByBoxingGlove() { _status2 = 1; _flagE5 = false; setFileHash(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage449C90); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - setCallback1(AnimationCallback(&KmScene1002::sub44A3C0)); + FinalizeState(&KmScene1002::stHitByBoxingGloveDone); } -void KmScene1002::sub44A3C0() { +void KmScene1002::stHitByBoxingGloveDone() { sendMessage(_parentScene, 0x1024, 1); } -void KmScene1002::sub44A3E0() { - if (!sub41CEB0(AnimationCallback(&KmScene1002::sub44A3E0))) { +void KmScene1002::stMoveVenusFlyTrap() { + if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) { _status2 = 2; _flagE4 = false; _flagE5 = true; - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); setFileHash(0x5C01A870, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage449A30); + SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - setCallback1(AnimationCallback(&KmScene1002::sub44A4B0)); + FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone); } } -void KmScene1002::sub44A460() { +void KmScene1002::stContinueMovingVenusFlyTrap() { _flagE4 = false; _flagE5 = true; setFileHash2(0x5C01A870, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage449A30); + SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - setCallback1(AnimationCallback(&KmScene1002::sub44A4B0)); + FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone); } -void KmScene1002::sub44A4B0() { +void KmScene1002::stMoveVenusFlyTrapDone() { sendMessage(_attachedSprite, 0x482A, 0); } @@ -2612,7 +2594,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -2622,38 +2604,38 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x481E: - setCallback2(AnimationCallback(&KmScene1004::sub478170)); + GotoState(&KmScene1004::stReadNote); break; case 0x4820: sendMessage(_parentScene, 0x2000, 0); - setCallback2(AnimationCallback(&Klayman::sub420970)); + GotoState(&Klayman::sub420970); break; case 0x4821: sendMessage(_parentScene, 0x2000, 0); _y4 = param.asInteger(); - setCallback2(AnimationCallback(&Klayman::sub4209D0)); + GotoState(&Klayman::sub4209D0); break; case 0x4822: sendMessage(_parentScene, 0x2000, 0); _y4 = param.asInteger(); - setCallback2(AnimationCallback(&Klayman::sub420AD0)); + GotoState(&Klayman::sub420AD0); break; case 0x4823: sendMessage(_parentScene, 0x2001, 0); - setCallback2(AnimationCallback(&Klayman::sub420BC0)); + GotoState(&Klayman::sub420BC0); break; case 0x4824: sendMessage(_parentScene, 0x2000, 0); _y4 = _dataResource.getPoint(param.asInteger()).y; - setCallback2(AnimationCallback(&Klayman::sub4209D0)); + GotoState(&Klayman::sub4209D0); break; case 0x4825: sendMessage(_parentScene, 0x2000, 0); _y4 = _dataResource.getPoint(param.asInteger()).y; - setCallback2(AnimationCallback(&Klayman::sub420AD0)); + GotoState(&Klayman::sub420AD0); break; case 0x4828: - setCallback2(AnimationCallback(&Klayman::sub420ED0)); + GotoState(&Klayman::sub420ED0); break; case 0x483F: sub41CD00(param.asInteger()); @@ -2665,7 +2647,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2678,12 +2660,12 @@ uint32 KmScene1004::handleMessage478110(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene1004::sub478170() { +void KmScene1004::stReadNote() { _status2 = 2; _flagE5 = false; setFileHash(0x123E9C9F, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1004::handleMessage478110); + SetMessageHandler(&KmScene1004::hmReadNote); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); } @@ -2704,16 +2686,16 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub421350)); + GotoState(&Klayman::sub421350); else - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&Klayman::sub41F9E0)); + GotoState(&Klayman::stWalking); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4817: @@ -2722,24 +2704,24 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481D: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub4214D0)); + GotoState(&Klayman::sub4214D0); break; case 0x481E: if (_flag) - setCallback2(AnimationCallback(&Klayman::sub421510)); + GotoState(&Klayman::sub421510); break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); _flag1 = true; - setCallback2(AnimationCallback(&Klayman::sub4212C0)); + GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); _flag1 = false; - setCallback2(AnimationCallback(&Klayman::sub421310)); + GotoState(&Klayman::sub421310); break; case 0x483D: sub461F30(); @@ -2800,26 +2782,26 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480A: - setCallback2(AnimationCallback(&KmScene1201::sub40DF00)); + GotoState(&KmScene1201::sub40DF00); break; case 0x4812: - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); break; case 0x4813: - setCallback2(AnimationCallback(&KmScene1201::sub40DD20)); + GotoState(&KmScene1201::stFetchMatch); break; case 0x4814: - setCallback2(AnimationCallback(&KmScene1201::sub40DFA0)); + GotoState(&KmScene1201::stTumbleHeadless); break; case 0x4815: - setCallback2(AnimationCallback(&KmScene1201::sub40E040)); + GotoState(&KmScene1201::sub40E040); break; case 0x4816: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -2834,13 +2816,13 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x481F: - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -2862,7 +2844,7 @@ void KmScene1201::update40DBE0() { Klayman::update(); } -uint32 KmScene1201::handleMessage40DC00(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1201::hmMatch(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2882,27 +2864,27 @@ uint32 KmScene1201::handleMessage40DC00(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene1201::sub40DD20() { - if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DD20))) { +void KmScene1201::stFetchMatch() { + if (!stStartAction(AnimationCallback(&KmScene1201::stFetchMatch))) { _status2 = 0; _flagE5 = false; - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); setFileHash(0x9CAA0218, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); - SetMessageHandler(&KmScene1201::handleMessage40DC00); - SetAnimationCallback3(&KmScene1201::sub40DD90); + SetMessageHandler(&KmScene1201::hmMatch); + NextState(&KmScene1201::stLightMatch); } } -void KmScene1201::sub40DD90() { +void KmScene1201::stLightMatch() { _status2 = 1; _flagE5 = false; - setDoDeltaX(((Sprite*)_attachedSprite)->getX() < _x ? 1 : 0); + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); setFileHash(0x1222A513, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); - SetMessageHandler(&KmScene1201::handleMessage40DC00); + SetMessageHandler(&KmScene1201::hmMatch); } uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2916,7 +2898,7 @@ uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam ¶ } else if (param.asInteger() == 0x02421405) { if (_countdown != 0) { _countdown--; - sub40DF60(); + stMoveObjectSkipTurn(); } else { SetMessageHandler(&Klayman::handleMessage41D480); } @@ -2926,7 +2908,7 @@ uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam ¶ return Klayman::handleMessage41D480(messageNum, param, sender); } -uint32 KmScene1201::handleMessage40DEA0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2939,7 +2921,7 @@ uint32 KmScene1201::handleMessage40DEA0(int messageNum, const MessageParam ¶ } void KmScene1201::sub40DF00() { - if (!sub41CEB0(AnimationCallback(&KmScene1201::sub40DF00))) { + if (!stStartAction(AnimationCallback(&KmScene1201::sub40DF00))) { _status2 = 2; _flagE5 = false; _countdown = 8; @@ -2951,31 +2933,31 @@ void KmScene1201::sub40DF00() { } } -void KmScene1201::sub40DF60() { - _flagE5 = false; - setFileHash2(0x0C1CA072, 0x01084280, 0); - SetUpdateHandler(&KmScene1201::update40DBE0); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::handleMessage40DDF0); +void KmScene1201::stMoveObjectSkipTurn() { + _flagE5 = false; + setFileHash2(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&KmScene1201::update40DBE0); + SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene1201::handleMessage40DDF0); } -void KmScene1201::sub40DFA0() { - if (!sub41CF10(AnimationCallback(&KmScene1201::sub40DFA0))) { +void KmScene1201::stTumbleHeadless() { + if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stTumbleHeadless))) { _status2 = 1; _flagE5 = false; setDoDeltaX(0); setFileHash(0x2821C590, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::handleMessage40DEA0); - SetAnimationCallback3(&Klayman::sub41FC80); + SetMessageHandler(&KmScene1201::hmTumbleHeadless); + NextState(&Klayman::stTryStandIdle); sendMessage(_class464, 0x2006, 0); _soundResource1.play(0x62E0A356); } } void KmScene1201::sub40E040() { - if (!sub41CF10(AnimationCallback(&KmScene1201::sub40E040))) { + if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::sub40E040))) { _status2 = 1; _flagE5 = false; setFileHash(0x5420E254, 0, -1); @@ -2994,19 +2976,19 @@ KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4804: - setCallback2(AnimationCallback(&KmScene1303::sub4161D0)); + GotoState(&KmScene1303::stPeekWall1); break; case 0x483B: - setCallback2(AnimationCallback(&KmScene1303::sub4162B0)); + GotoState(&KmScene1303::stPeekWallReturn); break; case 0x483C: - setCallback2(AnimationCallback(&KmScene1303::sub416210)); + GotoState(&KmScene1303::stPeekWall2); break; } return 0; } -uint32 KmScene1303::handleMessage4160A0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -3028,20 +3010,20 @@ void KmScene1303::update4161A0() { Klayman::update(); _counter3++; if (_counter3 >= _counter3Max) - sub416250(); + stPeekWall3(); } -void KmScene1303::sub4161D0() { +void KmScene1303::stPeekWall1() { _status2 = 0; _flagE5 = true; setFileHash(0xAC20C012, 8, 37); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D480); - SetAnimationCallback3(&KmScene1303::sub416250); + NextState(&KmScene1303::stPeekWall3); } -void KmScene1303::sub416210() { +void KmScene1303::stPeekWall2() { _status2 = 1; _flagE5 = false; setFileHash(0xAC20C012, 43, 49); @@ -3050,7 +3032,7 @@ void KmScene1303::sub416210() { SetMessageHandler(&Klayman::handleMessage41D480); } -void KmScene1303::sub416250() { +void KmScene1303::stPeekWall3() { _counter3 = 0; _status2 = 0; _flagE5 = true; @@ -3062,13 +3044,13 @@ void KmScene1303::sub416250() { _newHashListIndex = 42; } -void KmScene1303::sub4162B0() { +void KmScene1303::stPeekWallReturn() { _status2 = 0; _flagE5 = false; setFileHash(0x2426932E, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); - SetMessageHandler(&KmScene1303::handleMessage4160A0); + SetMessageHandler(&KmScene1303::hmPeekWallReturn); } KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -3084,15 +3066,15 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -3108,11 +3090,11 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x483F: @@ -3138,10 +3120,10 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: - setCallback2(AnimationCallback(&KmScene1305::sub46BEF0)); + GotoState(&KmScene1305::stCrashDown); break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3151,7 +3133,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1305::sub46BEF0() { +void KmScene1305::stCrashDown() { _soundResource1.play(0x41648271); _status2 = 1; _flagE5 = false; @@ -3159,12 +3141,12 @@ void KmScene1305::sub46BEF0() { SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D480); - SetAnimationCallback3(&KmScene1305::sub46BF60); + NextState(&KmScene1305::cbCrashDownEvent); } -void KmScene1305::sub46BF60() { +void KmScene1305::cbCrashDownEvent() { setDoDeltaX(2); - sub41FC80(); + stTryStandIdle(); } KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -3185,26 +3167,26 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub421350)); + GotoState(&Klayman::sub421350); else - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); + GotoState(&Klayman::stStampFloorButton); } else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -3212,7 +3194,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x481A: - setCallback2(AnimationCallback(&Klayman::sub420680)); + GotoState(&Klayman::sub420680); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3223,27 +3205,27 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481D: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub4214D0)); + GotoState(&Klayman::sub4214D0); else - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub421510)); + GotoState(&Klayman::sub421510); else - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x481F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -3252,30 +3234,30 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub421030)); + GotoState(&Klayman::sub421030); } else { - setCallback2(AnimationCallback(&Klayman::sub420FE0)); + GotoState(&Klayman::sub420FE0); } break; case 0x482F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4210C0)); + GotoState(&Klayman::sub4210C0); } else { - setCallback2(AnimationCallback(&Klayman::sub421070)); + GotoState(&Klayman::sub421070); } break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); _flag1 = true; - setCallback2(AnimationCallback(&Klayman::sub4212C0)); + GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); _flag1 = false; - setCallback2(AnimationCallback(&Klayman::sub421310)); + GotoState(&Klayman::sub421310); break; case 0x483D: sub417D40(); @@ -3337,25 +3319,25 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480A: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420600)); + GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); } else { - setCallback2(AnimationCallback(&Klayman::sub420550)); + GotoState(&Klayman::stMoveObjectFaceObject); } break; case 0x480D: - setCallback2(AnimationCallback(&KmScene1001::sub420C50)); + GotoState(&KmScene1001::sub420C50); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -3364,9 +3346,9 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481A: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&KmScene1308::sub456150)); + GotoState(&KmScene1308::sub456150); } else { - setCallback2(AnimationCallback(&Klayman::sub420680)); + GotoState(&Klayman::sub420680); } break; case 0x481B: @@ -3377,16 +3359,16 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x4827: - setCallback2(AnimationCallback(&Klayman::sub420E20)); + GotoState(&Klayman::sub420E20); break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x483F: sub41CD00(param.asInteger()); @@ -3424,7 +3406,7 @@ uint32 KmScene1308::handleMessage(int messageNum, const MessageParam ¶m, Ent } void KmScene1308::sub456150() { - if (!sub41CF10(AnimationCallback(&KmScene1308::sub456150))) { + if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::sub456150))) { _status2 = 2; _flag1 = false; for (uint i = 0; i < 3; i++) { @@ -3446,7 +3428,7 @@ void KmScene1308::sub456150() { } } if (!_flag1) { - setCallback2(NULL); + gotoState(NULL); sub41C7B0(); } else { _flagE5 = false; @@ -3474,22 +3456,22 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480A: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420600)); + GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); } else { - setCallback2(AnimationCallback(&Klayman::sub420550)); + GotoState(&Klayman::stMoveObjectFaceObject); } break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); + GotoState(&Klayman::stStampFloorButton); } else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -3505,11 +3487,11 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -3518,16 +3500,16 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub421030)); + GotoState(&Klayman::sub421030); } else { - setCallback2(AnimationCallback(&Klayman::sub420FE0)); + GotoState(&Klayman::sub420FE0); } break; case 0x482F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4210C0)); + GotoState(&Klayman::sub4210C0); } else { - setCallback2(AnimationCallback(&Klayman::sub421070)); + GotoState(&Klayman::sub421070); } break; } @@ -3549,13 +3531,13 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480A: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420600)); + GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); } else { - setCallback2(AnimationCallback(&Klayman::sub420550)); + GotoState(&Klayman::stMoveObjectFaceObject); } break; case 0x4817: @@ -3570,10 +3552,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; } return 0; @@ -3594,25 +3576,25 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480A: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420600)); + GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); } else { - setCallback2(AnimationCallback(&Klayman::sub420550)); + GotoState(&Klayman::stMoveObjectFaceObject); } break; case 0x480D: - setCallback2(AnimationCallback(&KmScene1001::sub420C50)); + GotoState(&KmScene1001::sub420C50); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -3627,7 +3609,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4827: - setCallback2(AnimationCallback(&Klayman::sub420E20)); + GotoState(&Klayman::sub420E20); break; case 0x483F: sub41CD00(param.asInteger()); @@ -3654,22 +3636,22 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480A: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420600)); + GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); } else { - setCallback2(AnimationCallback(&Klayman::sub420550)); + GotoState(&Klayman::stMoveObjectFaceObject); } break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -3677,7 +3659,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x481A: - setCallback2(AnimationCallback(&Klayman::sub420680)); + GotoState(&Klayman::sub420680); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3687,22 +3669,22 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x481F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -3734,17 +3716,17 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub421350)); + GotoState(&Klayman::sub421350); else - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -3760,23 +3742,23 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481D: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub4214D0)); + GotoState(&Klayman::sub4214D0); break; case 0x481E: if (_flag) - setCallback2(AnimationCallback(&Klayman::sub421510)); + GotoState(&Klayman::sub421510); break; case 0x481F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -3784,17 +3766,17 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2032, 1); _flag1 = true; - setCallback2(AnimationCallback(&Klayman::sub4212C0)); + GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2032, 0); _flag1 = false; - setCallback2(AnimationCallback(&Klayman::sub421310)); + GotoState(&Klayman::sub421310); break; case 0x483F: sub41CD00(param.asInteger()); @@ -3827,21 +3809,21 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_flag) { - setCallback2(AnimationCallback(&Klayman::sub421350)); + GotoState(&Klayman::sub421350); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); } break; case 0x4803: - setCallback2(AnimationCallback(&KmScene1705::sub468A80)); + GotoState(&KmScene1705::stFallSkipJump); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -3857,39 +3839,39 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481D: if (_flag) { - setCallback2(AnimationCallback(&Klayman::sub4214D0)); + GotoState(&Klayman::sub4214D0); } break; case 0x481E: if (_flag) { - setCallback2(AnimationCallback(&Klayman::sub421510)); + GotoState(&Klayman::sub421510); } break; case 0x481F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); _flag = true; - setCallback2(AnimationCallback(&Klayman::sub4212C0)); + GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); _flag = false; - setCallback2(AnimationCallback(&Klayman::sub421310)); + GotoState(&Klayman::sub421310); break; case 0x483D: sub468AD0(); @@ -3925,14 +3907,14 @@ void KmScene1705::spriteUpdate468A30() { } } -void KmScene1705::sub468A80() { +void KmScene1705::stFallSkipJump() { _status2 = 2; _flagE5 = false; setFileHash2(0xB93AB151, 0x40A100F8, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&KmScene1705::spriteUpdate468A30); SetMessageHandler(&Klayman::handleMessage41D360); - SetAnimationCallback3(&Klayman::sub420420); + NextState(&Klayman::stLandOnFeet); } void KmScene1705::sub468AD0() { @@ -3966,17 +3948,17 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4817: setDoDeltaX(param.asInteger()); sub41C7B0(); break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4009,17 +3991,17 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_flag) { - setCallback2(AnimationCallback(&Klayman::sub421350)); + GotoState(&Klayman::sub421350); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); } break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&Klayman::sub41F9E0)); + GotoState(&Klayman::stWalking); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4817: @@ -4028,32 +4010,32 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481D: if (_flag) { - setCallback2(AnimationCallback(&Klayman::sub4214D0)); + GotoState(&Klayman::sub4214D0); } break; case 0x481E: if (_flag) { - setCallback2(AnimationCallback(&Klayman::sub421510)); + GotoState(&Klayman::sub421510); } break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); _flag = true; - setCallback2(AnimationCallback(&Klayman::sub4212C0)); + GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); _flag = false; - setCallback2(AnimationCallback(&Klayman::sub421310)); + GotoState(&Klayman::sub421310); break; case 0x483D: sub440230(); break; case 0x483E: - sub440270(); + stDoTeleport(); break; } return 0; @@ -4082,7 +4064,7 @@ void KmScene2001::sub440230() { SetMessageHandler(&KmScene2001::handleMessage4401A0); } -void KmScene2001::sub440270() { +void KmScene2001::stDoTeleport() { _status2 = 0; _flagE5 = false; setFileHash(0x18AB4ED4, 0, -1); @@ -4110,29 +4092,29 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub421350)); + GotoState(&Klayman::sub421350); else - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4811: - setCallback2(AnimationCallback(&KmScene2101::sub4862C0)); + GotoState(&KmScene2101::sub4862C0); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); - }else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -4148,24 +4130,24 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481D: if (_flag1) - setCallback2(AnimationCallback(&Klayman::sub4214D0)); + GotoState(&Klayman::sub4214D0); break; case 0x481E: if (_flag) - setCallback2(AnimationCallback(&Klayman::sub421510)); + GotoState(&Klayman::sub421510); break; case 0x4834: - setCallback2(AnimationCallback(&Klayman::sub421160)); + GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); _flag1 = true; - setCallback2(AnimationCallback(&Klayman::sub4212C0)); + GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); _flag1 = false; - setCallback2(AnimationCallback(&Klayman::sub421310)); + GotoState(&Klayman::sub421310); break; case 0x483D: sub486320(); @@ -4257,14 +4239,14 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4812: - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); break; case 0x4816: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -4282,10 +4264,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4293,16 +4275,16 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub421030)); + GotoState(&Klayman::sub421030); } else { - setCallback2(AnimationCallback(&Klayman::sub420FE0)); + GotoState(&Klayman::sub420FE0); } break; case 0x482F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4210C0)); + GotoState(&Klayman::sub4210C0); } else { - setCallback2(AnimationCallback(&Klayman::sub421070)); + GotoState(&Klayman::sub421070); } break; case 0x483F: @@ -4327,24 +4309,24 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); - }else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -4355,10 +4337,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4819: - setCallback2(AnimationCallback(&Klayman::sub420750)); + GotoState(&Klayman::sub420750); break; case 0x481A: - setCallback2(AnimationCallback(&Klayman::sub420680)); + GotoState(&Klayman::sub420680); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4368,10 +4350,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - setCallback2(AnimationCallback(&Klayman::sub4207A0)); + GotoState(&Klayman::stTurnToUse); break; case 0x481E: - setCallback2(AnimationCallback(&Klayman::sub4207F0)); + GotoState(&Klayman::sub4207F0); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4403,19 +4385,19 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&KmScene2205::sub423980)); + GotoState(&KmScene2205::sub423980); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4816: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -4446,8 +4428,8 @@ void KmScene2205::sub423980() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - SetAnimationCallback3(&Klayman::sub41FA40); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); + NextState(&Klayman::sub41FA40); + FinalizeState(&Klayman::stStartWalkingDone); } KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4471,33 +4453,33 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4803: - setCallback2(AnimationCallback(&KmScene2206::sub482490)); + GotoState(&KmScene2206::sub482490); break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&KmScene2206::sub482530)); + GotoState(&KmScene2206::sub482530); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4812: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); - }else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -4513,15 +4495,15 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481F: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -4530,16 +4512,16 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub421030)); + GotoState(&Klayman::sub421030); } else { - setCallback2(AnimationCallback(&Klayman::sub420FE0)); + GotoState(&Klayman::sub420FE0); } break; case 0x482F: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4210C0)); + GotoState(&Klayman::sub4210C0); } else { - setCallback2(AnimationCallback(&Klayman::sub421070)); + GotoState(&Klayman::sub421070); } break; case 0x4837: @@ -4564,7 +4546,7 @@ void KmScene2206::spriteUpdate482450() { } void KmScene2206::sub482490() { - if (!sub41CF10(AnimationCallback(&KmScene2206::sub482490))) { + if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::sub482490))) { _status2 = 1; sendMessage(_parentScene, 0x4803, 0); _flagE5 = false; @@ -4588,8 +4570,8 @@ void KmScene2206::sub482530() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - SetAnimationCallback3(&Klayman::sub41FA40); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); + NextState(&Klayman::sub41FA40); + FinalizeState(&Klayman::stStartWalkingDone); } KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4600,32 +4582,32 @@ KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2001: - setCallback2(AnimationCallback(&KmScene2207::sub442460)); + GotoState(&KmScene2207::sub442460); break; case 0x2005: spriteUpdate442430(); - setCallback2(AnimationCallback(&KmScene2207::sub41FC80)); + GotoState(&KmScene2207::stTryStandIdle); break; case 0x4001: case 0x4800: sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x480D: - setCallback2(AnimationCallback(&KmScene2207::sub4424B0)); + GotoState(&KmScene2207::sub4424B0); break; case 0x4812: - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); break; case 0x4816: if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub420120)); + GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420170)); - }else { - setCallback2(AnimationCallback(&Klayman::sub4200D0)); + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); } break; case 0x4817: @@ -4640,7 +4622,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4827: - setCallback2(AnimationCallback(&Klayman::sub420E20)); + GotoState(&Klayman::sub420E20); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4657,13 +4639,13 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene2207::spriteUpdate442430() { - _x = ((Sprite*)_attachedSprite)->getX() - 20; - _y = ((Sprite*)_attachedSprite)->getY() + 46; + _x = _attachedSprite->getX() - 20; + _y = _attachedSprite->getY() + 46; processDelta(); } void KmScene2207::sub442460() { - if (!sub41CF10(AnimationCallback(&KmScene2207::sub442460))) { + if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::sub442460))) { _status2 = 1; _flagE5 = true; setFileHash(0x5420E254, 0, -1); @@ -4674,43 +4656,43 @@ void KmScene2207::sub442460() { } void KmScene2207::sub4424B0() { - if (!sub41CEB0(AnimationCallback(&KmScene2207::sub4424B0))) { + if (!stStartAction(AnimationCallback(&KmScene2207::sub4424B0))) { _status2 = 0; if (_flagF7) { - sub420D50(); + stReleaseLeverUp(); } else { _flagE5 = false; setFileHash(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&KmScene2207::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); - SetAnimationCallback3(&KmScene2207::sub442520); + NextState(&KmScene2207::sub442520); } } } void KmScene2207::sub442520() { setFileHash(0x0D318140, 0, -1); - SetAnimationCallback3(&KmScene2207::sub442560); sendMessage(_attachedSprite, 0x480F, 0); + NextState(&KmScene2207::sub442560); } void KmScene2207::sub442560() { - _flagE5 = true; - _flagF7 = true; setFileHash(0x1564A2C0, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&KmScene2207::spriteUpdate41F230); - SetAnimationCallback3(&KmScene2207::sub4425A0); + SetSpriteCallback(&Klayman::spriteUpdate41F230); + NextState(&KmScene2207::sub4425A0); + _flagE5 = true; + _flagF7 = true; } void KmScene2207::sub4425A0() { - _flagE5 = true; - _flagF7 = true; setFileHash(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&KmScene2207::spriteUpdate41F230); + SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D360); + _flagE5 = true; + _flagF7 = true; } KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4729,23 +4711,23 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&KmScene2242::sub444D20)); + GotoState(&KmScene2242::sub444D20); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4812: if (param.asInteger() == 2) { - setCallback2(AnimationCallback(&Klayman::sub420060)); + GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub41FFF0)); + GotoState(&Klayman::sub41FFF0); } else { - setCallback2(AnimationCallback(&Klayman::sub41FF80)); + GotoState(&Klayman::stPickUpGeneric); } break; case 0x4817: @@ -4761,15 +4743,15 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481F: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -4794,8 +4776,8 @@ void KmScene2242::sub444D20() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - SetAnimationCallback3(&Klayman::sub41FA40); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); + NextState(&Klayman::sub41FA40); + FinalizeState(&Klayman::stStartWalkingDone); } KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4814,14 +4796,14 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&KmHallOfRecords::sub43B130)); + GotoState(&KmHallOfRecords::sub43B130); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4817: @@ -4830,15 +4812,15 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m break; case 0x481F: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -4863,8 +4845,8 @@ void KmHallOfRecords::sub43B130() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - SetAnimationCallback3(&Klayman::sub41FA40); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); + NextState(&Klayman::sub41FA40); + FinalizeState(&Klayman::stStartWalkingDone); } KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4883,14 +4865,14 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - setCallback2(AnimationCallback(&Klayman::sub41FC80)); + GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { _x4 = param.asInteger(); - setCallback2(AnimationCallback(&KmScene2247::sub453520)); + GotoState(&KmScene2247::sub453520); } else { - setCallback2(AnimationCallback(&Klayman::sub41FC40)); + GotoState(&Klayman::stPeekWall); } break; case 0x4817: @@ -4899,15 +4881,15 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481F: if (param.asInteger() == 0) { - setCallback2(AnimationCallback(&Klayman::sub420870)); + GotoState(&Klayman::stWonderAboutHalf); } else if (param.asInteger() == 1) { - setCallback2(AnimationCallback(&Klayman::sub4208B0)); + GotoState(&Klayman::stWonderAboutAfter); } else if (param.asInteger() == 3) { - setCallback2(AnimationCallback(&Klayman::sub4208F0)); + GotoState(&Klayman::stTurnToUseHalf); } else if (param.asInteger() == 4) { - setCallback2(AnimationCallback(&Klayman::sub420930)); + GotoState(&Klayman::stTurnAwayFromUse); } else { - setCallback2(AnimationCallback(&Klayman::sub420830)); + GotoState(&Klayman::stWonderAbout); } break; case 0x482D: @@ -4932,8 +4914,8 @@ void KmScene2247::sub453520() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - SetAnimationCallback3(&Klayman::sub41FA40); - setCallback1(AnimationCallback(&Klayman::sub41FB30)); + NextState(&Klayman::sub41FA40); + FinalizeState(&Klayman::stStartWalkingDone); } } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index eb6ab40931..645ed74226 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -47,25 +47,25 @@ public: void update(); - void sub41FD30(); + void stDoIdlePickEar(); void sub41FDA0(); void sub41FDF0(); - void sub41FE60(); + void stDoIdleChest(); void sub41FEB0(); - void sub41FC80(); - void sub4211F0(); - void sub4211B0(); - void sub41FF80(); - void sub420120(); - void sub420170(); - void sub4200D0(); - void sub41FBC0(); - void sub420870(); - void sub4208B0(); - void sub4208F0(); - void sub420930(); - void sub420830(); - void sub41FC40(); + void stTryStandIdle(); + void stWakeUp(); + void stSleeping(); + void stPickUpGeneric(); + void stTurnPressButton(); + void stStampFloorButton(); + void stPressButtonSide(); + void stLargeStep(); + void stWonderAboutHalf(); + void stWonderAboutAfter(); + void stTurnToUseHalf(); + void stTurnAwayFromUse(); + void stWonderAbout(); + void stPeekWall(); void sub420210(); void sub4201C0(); void sub420340(); @@ -82,45 +82,43 @@ public: void sub420FE0(); void sub4210C0(); void sub421070(); - void sub420420(); + void stLandOnFeet(); void sub420ED0(); void sub420750(); - void sub4207A0(); + void stTurnToUse(); void sub4207F0(); void sub420F20(); void sub421350(); - void sub4213F0(); - void sub4213B0(); - void sub420060(); + void stIdleSitBlink(); + void stIdleSitBlinkSecond(); + void stPickUpNeedle(); void sub41FFF0(); void sub4214D0(); void sub421510(); - void sub421160(); - void sub4212C0(); + void stStepOver(); + void stSitInTeleporter(); void sub421310(); - void sub420600(); + void stMoveObjectSkipTurnFaceObject(); void sub420660(); - void sub4205C0(); - void sub420550(); + void stMoveObjectSkipTurn(); + void stMoveObjectFaceObject(); void sub420C50(); - void sub420CD0(); - void sub420D10(); - void sub420D50(); - void sub420DA0(); - void sub420DE0(); + void stPullLeverDown(); + void stHoldLeverDown(); + void stReleaseLeverUp(); void sub420E20(); void sub420E90(); void sub420EB0(); void sub420680(); - void sub41F9E0(); + void stWalking(); void sub41FA40(); - void sub41FB30(); + void stStartWalkingDone(); void sub41CE70(); void spriteUpdate41F250(); void spriteUpdate41F5F0(); - void spriteUpdate41F780(); + void suLargeStep(); void spriteUpdate41F230(); void spriteUpdate41F5A0(); void spriteUpdate41F300(); @@ -140,7 +138,7 @@ public: protected: Entity *_parentScene; - Entity *_attachedSprite; + Sprite *_attachedSprite; int _statusE0; bool _flagE1; bool _flagE2; @@ -172,9 +170,9 @@ protected: virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub41FD40(); - void sub41FD90(); - uint32 handleMessage41EB10(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdlePickEar(); + void evIdlePickEarDone(); + uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); void sub41FDB0(); uint32 handleMessage41E980(int messageNum, const MessageParam ¶m, Entity *sender); @@ -183,8 +181,8 @@ protected: void sub41FE50(); uint32 handleMessage41E9E0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41FE70(); - uint32 handleMessage41EF80(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdleChest(); + uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); void sub41FEC0(); uint32 handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender); @@ -192,45 +190,44 @@ protected: void sub41D320(uint32 fileHash, AnimationCb callback); void update41D2B0(); - bool sub41CF10(AnimationCb callback); + bool stStartActionFromIdle(AnimationCb callback); void sub41C7B0(); void sub41C770(); void sub41C790(); void update41D0F0(); - void sub41FF00(); - - void sub41FCF0(); + void stStand(); + void stStandAround(); uint32 handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender); void sub41C930(int16 x, bool flag); - uint32 handleMessage41E920(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); - bool sub41CEB0(AnimationCb callback3); + bool stStartAction(AnimationCb callback3); - void sub41FB40(); - void sub41FBB0(); + void stSneak(); + void stSneakDone(); uint32 handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender); void sub41CD70(int16 x); - void sub41F950(); + void stStartWalking(); uint32 handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D4C0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41DAD0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); void sub41CD00(int16 x); void sub41CC40(int16 x1, int16 x2); void sub41CAC0(int16 x); void sub41CCE0(int16 x); - void sub41FC30(); + void stLargeStepDone(); - uint32 handleMessage41DF10(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E3C0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D790(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D880(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41DAA0(int messageNum, const MessageParam ¶m, Entity *sender); @@ -272,28 +269,28 @@ protected: void update4497D0(); uint32 handleMessage449800(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage449990(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage449A30(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate449DC0(); + void suFallDown(); void sub449E20(); void sub449E90(); void sub449EF0(); void sub449F70(); - void sub44A050(); + void stSpitOutFall(); void sub44A0D0(); void sub44A150(); void sub44A230(); - void sub44A250(); - void sub44A2C0(); - void sub44A330(); - void sub44A370(); - void sub44A3C0(); - void sub44A3E0(); - void sub44A460(); - void sub44A4B0(); + void stJumpAndFall(); + void stDropFromRing(); + void stPressDoorButton(); + void stHitByBoxingGlove(); + void stHitByBoxingGloveDone(); + void stMoveVenusFlyTrap(); + void stContinueMovingVenusFlyTrap(); + void stMoveVenusFlyTrapDone(); }; class KmScene1004 : public Klayman { @@ -301,8 +298,8 @@ public: KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage478110(int messageNum, const MessageParam ¶m, Entity *sender); - void sub478170(); + uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); + void stReadNote(); }; class KmScene1109 : public Klayman { @@ -324,14 +321,14 @@ protected: int _countdown; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void update40DBE0(); - uint32 handleMessage40DC00(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40DD20(); - void sub40DD90(); + uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); + void stFetchMatch(); + void stLightMatch(); uint32 handleMessage40DDF0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40DEA0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); void sub40DF00(); - void sub40DF60(); - void sub40DFA0(); + void stMoveObjectSkipTurn(); + void stTumbleHeadless(); void sub40E040(); }; @@ -340,12 +337,12 @@ public: KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage4160A0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); void update4161A0(); - void sub4161D0(); - void sub416210(); - void sub416250(); - void sub4162B0(); + void stPeekWall1(); + void stPeekWall2(); + void stPeekWall3(); + void stPeekWallReturn(); }; class KmScene1304 : public Klayman { @@ -360,8 +357,8 @@ public: KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub46BEF0(); - void sub46BF60(); + void stCrashDown(); + void cbCrashDownEvent(); }; class KmScene1306 : public Klayman { @@ -429,7 +426,7 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage4689A0(int messageNum, const MessageParam ¶m, Entity *sender); void spriteUpdate468A30(); - void sub468A80(); + void stFallSkipJump(); void sub468AD0(); void sub468B10(); }; @@ -449,7 +446,7 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage4401A0(int messageNum, const MessageParam ¶m, Entity *sender); void sub440230(); - void sub440270(); + void stDoTeleport(); }; class KmScene2101 : public Klayman { diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 26b68e1c9a..b60c3182d0 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -145,12 +145,12 @@ void AsScene1001Door::handleMessage2000h() { case 1: _soundResource1.play(0x65482F03); setFileHash(0x624C0498, 1, 3); - SetAnimationCallback3(&AsScene1001Door::callback1); + NextState(&AsScene1001Door::callback1); break; case 2: _soundResource2.play(); setFileHash(0x624C0498, 6, 6); - SetAnimationCallback3(&AsScene1001Door::callback2); + NextState(&AsScene1001Door::callback2); break; default: // Nothing @@ -170,7 +170,7 @@ void AsScene1001Door::callback1() { _newHashListIndex = 1; break; case 3: - setFileHash1(); + stopAnimation(); setVisible(false); break; default: @@ -183,13 +183,13 @@ void AsScene1001Door::callback1() { void AsScene1001Door::callback2() { setGlobalVar(0xD217189D, 1); setFileHash(0x624C0498, 6, 6); - SetAnimationCallback3(&AsScene1001Door::callback3); + NextState(&AsScene1001Door::callback3); _x = 30; } void AsScene1001Door::callback3() { _soundResource1.play(); - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -734,7 +734,7 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam ¶m, Entity setVisible(true); break; case 0x3002: - setFileHash1(); + stopAnimation(); setVisible(false); break; } @@ -799,7 +799,7 @@ void AsScene1002DoorSpy::sub448B10() { _parentScene->setSurfacePriority(getSurface(), 1200); setFileHash(0x586C1D48, 1, -1); SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60); - SetAnimationCallback3(&AsScene1002DoorSpy::sub448AC0); + NextState(&AsScene1002DoorSpy::sub448AC0); } Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) @@ -1071,14 +1071,14 @@ void AsScene1002VenusFlyTrap::sub4484F0() { setFileHash(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); + NextState(&AsScene1002VenusFlyTrap::sub448660); } void AsScene1002VenusFlyTrap::sub448530() { setFileHash(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); + NextState(&AsScene1002VenusFlyTrap::sub448660); } void AsScene1002VenusFlyTrap::sub448560() { @@ -1086,7 +1086,7 @@ void AsScene1002VenusFlyTrap::sub448560() { setFileHash(0x82292851, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); + NextState(&AsScene1002VenusFlyTrap::sub448660); } void AsScene1002VenusFlyTrap::sub4485B0() { @@ -1094,7 +1094,7 @@ void AsScene1002VenusFlyTrap::sub4485B0() { setFileHash(0x86A82A11, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4485F0); + NextState(&AsScene1002VenusFlyTrap::sub4485F0); } void AsScene1002VenusFlyTrap::sub4485F0() { @@ -1107,7 +1107,7 @@ void AsScene1002VenusFlyTrap::sub448620() { setFileHash(0x31303094, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(NULL); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448720); + NextState(&AsScene1002VenusFlyTrap::sub448720); _countdown = 24; } @@ -1119,14 +1119,14 @@ void AsScene1002VenusFlyTrap::sub448660() { if (_x >= 154 && _x <= 346) { setGlobalVar(0x86341E88, (_x - 186) / 32); } else { - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0); + NextState(&AsScene1002VenusFlyTrap::sub4484F0); _countdown = 12; } } else { if (_x >= 174 && _x <= 430) { setGlobalVar(0x1B144052, (_x - 174) / 32); } else { - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub4484F0); + NextState(&AsScene1002VenusFlyTrap::sub4484F0); _countdown = 12; } } @@ -1136,14 +1136,14 @@ void AsScene1002VenusFlyTrap::sub448720() { setFileHash(0x152920C4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448750); + NextState(&AsScene1002VenusFlyTrap::sub448750); } void AsScene1002VenusFlyTrap::sub448750() { setFileHash(0x84001117, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448660); + NextState(&AsScene1002VenusFlyTrap::sub448660); } void AsScene1002VenusFlyTrap::sub448780() { @@ -1157,7 +1157,7 @@ void AsScene1002VenusFlyTrap::sub448780() { setFileHash(0x8C2C80D4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - SetAnimationCallback3(&AsScene1002VenusFlyTrap::sub448620); + NextState(&AsScene1002VenusFlyTrap::sub448620); } } @@ -1224,13 +1224,13 @@ void Class506::sub449280() { setFileHash(0x004A4495, -1, -1); _playBackwards = true; SetMessageHandler(&Class506::handleMessage449210); - SetAnimationCallback3(&Class506::sub4492C0); + NextState(&Class506::sub4492C0); setVisible(true); } void Class506::sub4492C0() { setVisible(false); - setFileHash1(); + stopAnimation(); } Class478::Class478(NeverhoodEngine *vm, Klayman *klayman) @@ -1610,7 +1610,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa setVisible(true); break; case 0x3002: - setFileHash1(); + stopAnimation(); setVisible(false); break; } diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 740e4875bd..52c9d92a33 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -371,7 +371,7 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p break; case 0x3002: sendMessage(_parentScene, 0x2003, 0); - setFileHash1(); + stopAnimation(); break; } return messageResult; diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index ffb4f206ca..25abf95643 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -278,7 +278,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, _newHashListIndex = -2; _countdown = 25; } else { - setFileHash1(); + stopAnimation(); setVisible(false); } } @@ -315,11 +315,11 @@ void AsScene1201RightDoor::sub40D830() { _playBackwards = true; setVisible(true); _soundResource.play(calcHash("fxDoorClose20")); - SetAnimationCallback3(&AsScene1201RightDoor::sub40D880); + NextState(&AsScene1201RightDoor::sub40D880); } void AsScene1201RightDoor::sub40D880() { - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -343,7 +343,7 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity setVisible(true); break; case 0x3002: - setFileHash1(); + stopAnimation(); setVisible(false); removeCallbacks(); break; @@ -422,7 +422,7 @@ void AsScene1201TntMan::sub40CD60() { setFileHash(0x356803D0, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - SetAnimationCallback3(&AsScene1201TntMan::sub40CD30); + NextState(&AsScene1201TntMan::sub40CD30); } void AsScene1201TntMan::sub40CD90() { @@ -547,9 +547,9 @@ void AsScene1201Match::sub40C3E0() { setFileHash(0x00842374, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C320); if (_status == 0) { - SetAnimationCallback3(&AsScene1201Match::sub40C420); + NextState(&AsScene1201Match::sub40C420); } else { - SetAnimationCallback3(&AsScene1201Match::sub40C470); + NextState(&AsScene1201Match::sub40C470); } } @@ -559,7 +559,7 @@ void AsScene1201Match::sub40C420() { _y += 119; setFileHash(0x018D0240, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C320); - SetAnimationCallback3(&AsScene1201Match::sub40C4F0); + NextState(&AsScene1201Match::sub40C4F0); } void AsScene1201Match::sub40C470() { @@ -569,7 +569,7 @@ void AsScene1201Match::sub40C470() { if (_status != 0) { _countdown = 36; _status--; - SetAnimationCallback3(&AsScene1201Match::sub40C3E0); + NextState(&AsScene1201Match::sub40C3E0); } } @@ -623,10 +623,10 @@ uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessagePar } break; case 0x2004: - setCallback2(AnimationCallback(&AsScene1201Creature::sub40C960)); + GotoState(&AsScene1201Creature::sub40C960); break; case 0x2006: - setCallback2(AnimationCallback(&AsScene1201Creature::sub40C9B0)); + GotoState(&AsScene1201Creature::sub40C9B0); break; } return messageResult; @@ -672,7 +672,7 @@ void AsScene1201Creature::sub40C8E0() { _countdown3 = 3; setFileHash(0x08081513, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C710); - SetAnimationCallback3(&AsScene1201Creature::sub40C930); + NextState(&AsScene1201Creature::sub40C930); _countdown1 = 36; } @@ -680,14 +680,14 @@ void AsScene1201Creature::sub40C930() { if (!_flag) { setFileHash(0xCA287133, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0); - SetAnimationCallback3(&AsScene1201Creature::sub40C8E0); + NextState(&AsScene1201Creature::sub40C8E0); } } void AsScene1201Creature::sub40C960() { setFileHash(0x08081513, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C710); - SetAnimationCallback3(&AsScene1201Creature::sub40C9E0); + NextState(&AsScene1201Creature::sub40C9E0); _countdown1 = 48; } @@ -698,7 +698,7 @@ void AsScene1201Creature::sub40C990() { void AsScene1201Creature::sub40C9B0() { setFileHash(0xCA287133, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C830); - SetAnimationCallback3(&AsScene1201Creature::sub40C8E0); + NextState(&AsScene1201Creature::sub40C8E0); _countdown1 = 0; } @@ -1091,7 +1091,7 @@ void AsScene1202TntItem::sub4540A0() { void AsScene1202TntItem::sub4540D0() { setFileHash(kScene1202FileHashes[_index], 0, -1); SetMessageHandler(&AsScene1202TntItem::handleMessage454060); - SetAnimationCallback3(&AsScene1202TntItem::sub454100); + NextState(&AsScene1202TntItem::sub454100); } void AsScene1202TntItem::sub454100() { @@ -1099,7 +1099,7 @@ void AsScene1202TntItem::sub454100() { _y = kScene1202Points[_index2].y; setFileHash(kScene1202FileHashes[_index], 6, -1); SetMessageHandler(&AsScene1202TntItem::handleMessage454060); - SetAnimationCallback3(&AsScene1202TntItem::sub454160); + NextState(&AsScene1202TntItem::sub454160); _playBackwards = true; } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 26b61f0e52..cb5ed15d99 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -324,7 +324,7 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶ void AsScene1302Bridge::stLowerBridge() { setFileHash(0x88148150, 0, -1); - SetAnimationCallback3(&AsScene1302Bridge::cbLowerBridgeEvent); + NextState(&AsScene1302Bridge::cbLowerBridgeEvent); _soundResource2.play(); } @@ -618,7 +618,7 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p break; case 0x3002: _soundResource.play(0x470007EE); - setFileHash1(); + stopAnimation(); SetMessageHandler(NULL); setVisible(false); break; @@ -849,7 +849,7 @@ void AsScene1306Elevator::stGoingUp() { _isDown = false; SetUpdateHandler(&AsScene1306Elevator::update); setFileHash(0x043B0270, 0, -1); - SetAnimationCallback3(&AsScene1306Elevator::cbGoingUpEvent); + NextState(&AsScene1306Elevator::cbGoingUpEvent); _soundResource1.play(); } @@ -858,7 +858,7 @@ void AsScene1306Elevator::cbGoingUpEvent() { sendMessage(_parentScene, 0x4808, 0); _isUp = true; _countdown = 144; - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -868,7 +868,7 @@ void AsScene1306Elevator::stGoingDown() { setVisible(true); setFileHash(0x043B0270, -1, -1); _playBackwards = true; - SetAnimationCallback3(&AsScene1306Elevator::cbGoingDownEvent); + NextState(&AsScene1306Elevator::cbGoingDownEvent); _soundResource2.play(); } @@ -876,7 +876,7 @@ void AsScene1306Elevator::cbGoingDownEvent() { _isDown = true; sendMessage(_parentScene, 0x4809, 0); SetUpdateHandler(&AsScene1306Elevator::update); - setFileHash1(); + stopAnimation(); } Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1433,7 +1433,7 @@ Class549::Class549(NeverhoodEngine *vm, Scene *parentScene) SetMessageHandler(&Class549::handleMessage); setVisible(false); - setFileHash1(); + stopAnimation(); } uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1455,13 +1455,13 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class549::sub455470() { setFileHash(0xBA0AE050, 0, -1); setVisible(true); - SetAnimationCallback3(&Class549::hide); + NextState(&Class549::hide); _soundResource.play(calcHash("fxDoorOpen38")); } void Class549::hide() { sendMessage(_parentScene, 0x2000, 0); - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -1469,13 +1469,13 @@ void Class549::sub4554F0() { setFileHash(0xBA0AE050, -1, -1); _playBackwards = true; setVisible(true); - SetAnimationCallback3(&Class549::sub455550); + NextState(&Class549::sub455550); _soundResource.play(calcHash("fxDoorClose38")); } void Class549::sub455550() { sendMessage(_parentScene, 0x2001, 0); - setFileHash1(); + stopAnimation(); } Class592::Class592(NeverhoodEngine *vm, Scene *parentScene) @@ -1483,7 +1483,7 @@ Class592::Class592(NeverhoodEngine *vm, Scene *parentScene) _parentScene(parentScene) { SetMessageHandler(&Class592::handleMessage); - SetAnimationCallback3(&Class592::sub455710); + NextState(&Class592::sub455710); _soundResource.play(0x51456049); } @@ -1499,14 +1499,14 @@ uint32 Class592::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class592::sub455710() { setFileHash(0x6238B191, 0, -1); - SetAnimationCallback3(&Class592::sub455740); + NextState(&Class592::sub455740); _x = 580; _y = 383; } void Class592::sub455740() { sendMessage(_parentScene, 0x2004, 0); - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -1515,7 +1515,7 @@ Class593::Class593(NeverhoodEngine *vm, Scene *parentScene) SetMessageHandler(&Class593::handleMessage); setVisible(false); - setFileHash1(); + stopAnimation(); Entity::_priority = 1200; } @@ -1543,12 +1543,12 @@ void Class593::sub4558F0() { void Class593::sub455920() { setFileHash(0x80180A10, -1, -1); _playBackwards = true; - SetAnimationCallback3(&Class593::sub455950); + NextState(&Class593::sub455950); } void Class593::sub455950() { sendMessage(_parentScene, 0x2003, 0); - setFileHash1(); + stopAnimation(); setVisible(false); } diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 8d42c7fa2c..42dfdb3d5b 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -257,7 +257,7 @@ void Class526::spriteUpdate466720() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { _soundResource.play(0x0E32247F); - setFileHash1(); + stopAnimation(); SetSpriteCallback(NULL); SetMessageHandler(NULL); setVisible(false); @@ -295,7 +295,7 @@ void Class527::spriteUpdate466920() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { _soundResource.play(0x18020439); - setFileHash1(); + stopAnimation(); SetSpriteCallback(NULL); SetMessageHandler(NULL); setVisible(false); @@ -322,7 +322,7 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) _countdown = 48; } else { _flag = false; - setFileHash1(); + stopAnimation(); setVisible(false); } } @@ -369,11 +369,11 @@ void Class528::sub466C50() { setFileHash(0x04551900, -1, -1); _soundResource.play(calcHash("fxDoorClose24")); _playBackwards = true; - SetAnimationCallback3(&Class528::sub466CB0); + NextState(&Class528::sub466CB0); } void Class528::sub466CB0() { - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -575,7 +575,7 @@ void Class489::sub434D80() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { sendMessage(_class525, 0x483A, 0); - setFileHash1(); + stopAnimation(); SetMessageHandler(&Sprite::handleMessage); SetSpriteCallback(NULL); setVisible(false); @@ -600,7 +600,7 @@ void Class489::sub434E60() { SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage434B20); setFileHash(0x80C32213, 0, -1); - SetAnimationCallback3(&Class489::sub434E90); + NextState(&Class489::sub434E90); } void Class489::sub434E90() { @@ -613,7 +613,7 @@ void Class489::sub434EC0() { setFileHash(0x50A80517, 0, -1); SetMessageHandler(&Class489::handleMessage434B20); SetSpriteCallback(NULL); - SetAnimationCallback3(&Class489::sub434F40); + NextState(&Class489::sub434F40); setGlobalVar(0x12A10DB3, 1); _soundResource1.play(0xCC4A8456); // TODO Sound1ChList_addSoundResource(0x05331081, 0xCE428854, true); @@ -631,7 +631,7 @@ void Class489::sub434F80() { setFileHash(0x50A94417, 0, -1); SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage434B20); - SetAnimationCallback3(&Class489::sub434E90); + NextState(&Class489::sub434E90); setGlobalVar(0x12A10DB3, 0); _soundResource1.play(0xCC4A8456); // TODO Sound1ChList_deleteSoundByHash(0xCE428854); @@ -642,7 +642,7 @@ void Class489::sub434FF0() { setFileHash(0x22CB4A33, 0, -1); SetSpriteCallback(&Class489::spriteUpdate434B60); SetMessageHandler(&Class489::handleMessage434B20); - SetAnimationCallback3(&Class489::sub434DF0); + NextState(&Class489::sub434DF0); } void Class489::sub435040() { @@ -845,7 +845,7 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity _soundResource2.play(); setFileHash(0x20060259, -1, -1); _playBackwards = true; - SetAnimationCallback3(&Class482::sub428530); + NextState(&Class482::sub428530); break; case 0x3002: removeCallbacks(); @@ -856,19 +856,19 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class482::sub428500() { sendMessage(_parentScene, 0x2000, 0); - setFileHash1(); + stopAnimation(); setVisible(false); } void Class482::sub428530() { sendMessage(_parentScene, 0x2001, 0); - setFileHash1(); + stopAnimation(); setVisible(false); } void Class482::sub428560() { sendMessage(_parentScene, 0x2003, 0); - setFileHash1(); + stopAnimation(); } Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1218,7 +1218,7 @@ void AsScene1407Mouse::stWalkToDest() { setFileHash(0x22291510, 0, -1); SetSpriteCallback(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); - SetAnimationCallback3(&AsScene1407Mouse::stIdleLookAtGoodHole); + NextState(&AsScene1407Mouse::stIdleLookAtGoodHole); } } @@ -1227,7 +1227,7 @@ void AsScene1407Mouse::stWalkToHole() { setFileHash(0x22291510, 0, -1); SetSpriteCallback(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); - SetAnimationCallback3(&AsScene1407Mouse::stGoThroughHole); + NextState(&AsScene1407Mouse::stGoThroughHole); } void AsScene1407Mouse::stGoThroughHole() { @@ -1235,7 +1235,7 @@ void AsScene1407Mouse::stGoThroughHole() { SetSpriteCallback(NULL); SetMessageHandler(NULL); SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); - SetAnimationCallback3(&AsScene1407Mouse::stArriveAtHole); + NextState(&AsScene1407Mouse::stArriveAtHole); setVisible(false); _countdown = 12; } diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 15e24743a6..c510601642 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -206,7 +206,7 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) } Class521::~Class521() { - if (_callback1Cb == AnimationCallback(&Class521::sub45D620)) { + if (_finalizeStateCb == AnimationCallback(&Class521::sub45D620)) { setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190)); } } @@ -407,11 +407,11 @@ void Class521::sub45CD00() { _flag11A = 0; _rectList = NULL; SetMessageHandler(&Class521::handleMessage45CC30); - SetAnimationCallback3(&Class521::sub45CFE0); + NextState(&Class521::sub45CFE0); setFileHash(0x35698F78, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update45C790); - setCallback1(AnimationCallback(&Class521::sub45D040)); + FinalizeState(&Class521::sub45D040); setDoDeltaX(doDeltaX ? 1 : 0); _currMoveDirection = 0; _newMoveDirection = 0; @@ -442,14 +442,14 @@ void Class521::sub45CE10() { setFileHash(0x192ADD30, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45CFE0); + NextState(&Class521::sub45CFE0); } else if (!_flag10E && _steps && _flag113) { removeCallbacks(); _flag113 = 0; setFileHash(0x9966B138, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45D100); + NextState(&Class521::sub45D100); } else { bool flag = false; uint index = 0; @@ -478,7 +478,7 @@ void Class521::sub45CF80() { setFileHash(0xA86A9538, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45CFE0); + NextState(&Class521::sub45CFE0); } void Class521::sub45CFB0() { @@ -492,7 +492,7 @@ void Class521::sub45CFE0() { setFileHash(0x35698F78, 0, -1); SetMessageHandler(&Class521::handleMessage); SetUpdateHandler(&Class521::update45C790); - setCallback1(AnimationCallback(&Class521::sub45D040)); + FinalizeState(&Class521::sub45D040); _idleCounter = 0; _currMoveDirection = 0; _newMoveDirection = 0; @@ -508,7 +508,7 @@ void Class521::sub45D050() { setFileHash(0xB579A77C, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45CFE0); + NextState(&Class521::sub45CFE0); _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } @@ -519,7 +519,7 @@ void Class521::sub45D0A0() { setFileHash(0x9C220DA4, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - setCallback1(AnimationCallback(&Class521::sub45D0E0)); + FinalizeState(&Class521::sub45D0E0); } void Class521::sub45D0E0() { @@ -549,7 +549,7 @@ void Class521::sub45D180() { _value112 = 0; SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - setCallback1(AnimationCallback(&Class521::sub45D620)); + FinalizeState(&Class521::sub45D620); sub45CDC0(); } @@ -578,7 +578,7 @@ void Class521::moveToNextPoint() { setFileHash(0x9966B138, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45D100); + NextState(&Class521::sub45D100); } _flag10E = 0; SetSpriteCallback(&Class521::suMoveToNextPoint); @@ -594,7 +594,7 @@ void Class521::sub45D350() { setFileHash(0x192ADD30, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45D390); + NextState(&Class521::sub45D390); } void Class521::sub45D390() { @@ -603,7 +603,7 @@ void Class521::sub45D390() { setFileHash(0xF46A0324, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - setCallback1(AnimationCallback(&Class521::sub45D620)); + FinalizeState(&Class521::sub45D620); _value112 = 1; sub45CDC0(); } @@ -640,7 +640,7 @@ void Class521::moveToPrevPoint() { setFileHash(0x9966B138, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45D100); + NextState(&Class521::sub45D100); } _flag10E = 0; SetSpriteCallback(&Class521::suMoveToPrevPoint); @@ -652,20 +652,20 @@ void Class521::moveToPrevPoint() { void Class521::sub45D580() { _flag10F = 1; _flag10E = 1; - setCallback1(NULL); + FinalizeState(NULL); setFileHash(0x192ADD30, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - SetAnimationCallback3(&Class521::sub45D5D0); + NextState(&Class521::sub45D5D0); } void Class521::sub45D5D0() { _flag10F = 1; - setCallback1(NULL); + FinalizeState(NULL); setFileHash(0xF46A0324, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); - setCallback1(AnimationCallback(&Class521::sub45D620)); + FinalizeState(&Class521::sub45D620); _value112 = 2; sub45CDC0(); } @@ -979,7 +979,7 @@ Class546::Class546(NeverhoodEngine *vm, Scene *parentScene) setVisible(false); SetMessageHandler(&Class546::handleMessage); - setFileHash1(); + stopAnimation(); } uint32 Class546::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1001,26 +1001,26 @@ uint32 Class546::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class546::sub44D710() { setFileHash(0x08C80144, 0, -1); setVisible(true); - SetAnimationCallback3(&Class546::sub44D760); + NextState(&Class546::sub44D760); _soundResource.play(calcHash("fxDoorOpen23")); } void Class546::sub44D760() { sendMessage(_parentScene, 0x2033, 0); - setFileHash1(); + stopAnimation(); setVisible(false); } void Class546::sub44D790() { setFileHash(0x08C80144, -1, -1); setVisible(true); - SetAnimationCallback3(&Class546::sub44D7F0); + NextState(&Class546::sub44D7F0); _soundResource.play(calcHash("fxDoorClose23")); } void Class546::sub44D7F0() { sendMessage(_parentScene, 0x2034, 0); - setFileHash1(); + stopAnimation(); } Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y) diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 7a34a2bd28..7bac3ffc96 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -355,10 +355,10 @@ void AsScene1907Symbol::tryToPlugIn() { _deltaY = (_y - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y) / 16; _smallDeltaY = _y - _deltaY * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y; if (_elementIndex == _newPositionIndex) { - SetAnimationCallback3(&AsScene1907Symbol::stPlugIn); + NextState(&AsScene1907Symbol::stPlugIn); } else { _symbolFlag1 = 1; - SetAnimationCallback3(&AsScene1907Symbol::stPlugInFail); + NextState(&AsScene1907Symbol::stPlugInFail); } } @@ -389,7 +389,7 @@ void AsScene1907Symbol::stFallOffHitGround() { _vm->_collisionMan->removeSprite(this); _vm->_collisionMan->addSprite(this); SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround); - SetAnimationCallback3(&AsScene1907Symbol::cbFallOffHitGroundEvent); + NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); _newHashListIndex = 0; _currStep = 0; _yAccel = 30; @@ -417,7 +417,7 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() { void AsScene1907Symbol::stPlugIn() { _soundResource1.play(); _currPositionIndex = _newPositionIndex; - setFileHash1(); + stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteCallback(NULL); if (_elementIndex == 8) @@ -426,13 +426,13 @@ void AsScene1907Symbol::stPlugIn() { void AsScene1907Symbol::stPlugInFail() { _currPositionIndex = _newPositionIndex; - setFileHash1(); + stopAnimation(); _parentScene->plugInFailed(); } void AsScene1907Symbol::moveUp() { setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? - setFileHash1(); + stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteCallback(&AsScene1907Symbol::suMoveUp); _yIncr = 1; @@ -441,7 +441,7 @@ void AsScene1907Symbol::moveUp() { void AsScene1907Symbol::moveDown() { setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? - setFileHash1(); + stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteCallback(&AsScene1907Symbol::suMoveDown); _yIncr = 4; @@ -541,11 +541,11 @@ void AsScene1907WaterHint::show() { setVisible(true); setFileHash(0x110A1061, 0, -1); SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20); - SetAnimationCallback3(&AsScene1907WaterHint::hide); + NextState(&AsScene1907WaterHint::hide); } void AsScene1907WaterHint::hide() { - setFileHash1(); + stopAnimation(); setVisible(false); SetMessageHandler(&Sprite::handleMessage); } diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index fa0d111f8b..66f8631b8a 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -121,12 +121,12 @@ void Class538::closeDoor() { setFileHash(0xC222A8D4, 0, -1); _newHashListIndex = -2; setVisible(true); - SetAnimationCallback3(&Class538::hide); + NextState(&Class538::hide); _soundResource.play(calcHash("fxDoorClose32")); } void Class538::hide() { - setFileHash1(); + stopAnimation(); setVisible(false); } @@ -149,7 +149,7 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity setVisible(true); break; case 0x3002: - setFileHash1(); + stopAnimation(); setVisible(false); break; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index ff0afa6f58..ab1fac8c5e 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -1088,7 +1088,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, case 0x3002: if (_index == getGlobalVar(0x9A500914)) sendMessage(_parentScene, 0x4808, 0); - setFileHash1(); + stopAnimation(); break; case 0x4808: setGlobalVar(0x9A500914, _index); @@ -1832,7 +1832,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m break; case 0x3002: removeCallbacks(); - setFileHash1(); + stopAnimation(); break; case 0x4807: stLeverUp(); @@ -1852,7 +1852,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m void AsScene2207Lever::stLeverDown() { setFileHash(0x80880090, 1, -1); - setCallback1(AnimationCallback(&AsScene2207Lever::stLeverDownEvent)); + FinalizeState(&AsScene2207Lever::stLeverDownEvent); _soundResource.play(0x40581882); } @@ -1862,7 +1862,7 @@ void AsScene2207Lever::stLeverDownEvent() { void AsScene2207Lever::stLeverUp() { setFileHash(0x80880090, 6, -1); - setCallback1(AnimationCallback(&AsScene2207Lever::stLeverUpEvent)); + FinalizeState(&AsScene2207Lever::stLeverUpEvent); _playBackwards = true; _soundResource.play(0x40581882); } @@ -1931,7 +1931,7 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag void AsScene2207WallRobotAnimation::stStartAnimation() { if (!_idle) { - SetAnimationCallback3(NULL); + NextState(NULL); } else { setFileHash(0xCCFD6090, 0, -1); _idle = false; @@ -1940,11 +1940,11 @@ void AsScene2207WallRobotAnimation::stStartAnimation() { } void AsScene2207WallRobotAnimation::stStopAnimation() { - SetAnimationCallback3(&AsScene2207WallRobotAnimation::cbStopAnimation); + NextState(&AsScene2207WallRobotAnimation::cbStopAnimation); } void AsScene2207WallRobotAnimation::cbStopAnimation() { - setFileHash1(); + stopAnimation(); _soundResource1.stop(); _soundResource2.stop(); _soundResource3.stop(); @@ -1984,7 +1984,7 @@ uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const Messa void AsScene2207WallCannonAnimation::stStartAnimation() { if (!_idle) { - SetAnimationCallback3(NULL); + NextState(NULL); } else { setVisible(true); setFileHash(0x8CAA0099, 0, -1); @@ -1993,11 +1993,11 @@ void AsScene2207WallCannonAnimation::stStartAnimation() { } void AsScene2207WallCannonAnimation::stStopAnimation() { - SetAnimationCallback3(&AsScene2207WallCannonAnimation::cbStopAnimation); + NextState(&AsScene2207WallCannonAnimation::cbStopAnimation); } void AsScene2207WallCannonAnimation::cbStopAnimation() { - setFileHash1(); + stopAnimation(); setVisible(false); _idle = true; } diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 0163e978ba..5823e4dcb2 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -279,7 +279,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2001: - setFileHash1(); + stopAnimation(); setVisible(false); // TODO Sound1ChList_stop(0xDC2769B0); break; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index d979bbb7a8..783e6166ea 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1200,7 +1200,7 @@ uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam ¶ } void AsScene3010DeadBolt::stIdle() { - setFileHash1(); + stopAnimation(); SetUpdateHandler(&AsScene3010DeadBolt::update); SetMessageHandler(&Sprite::handleMessage); _locked = false; @@ -1215,8 +1215,8 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) { } else { setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); - setCallback1(AnimationCallback(&AsScene3010DeadBolt::stIdleMessage)); - SetAnimationCallback3(&AsScene3010DeadBolt::stIdle); + FinalizeState(&AsScene3010DeadBolt::stIdleMessage); + NextState(&AsScene3010DeadBolt::stIdle); _soundResource1.play(); } _unlocked = true; @@ -1225,7 +1225,7 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) { } void AsScene3010DeadBolt::stIdleMessage() { - setFileHash1(); + stopAnimation(); SetMessageHandler(&Sprite::handleMessage); sendMessage(_parentScene, 0x2001, _boltIndex); } @@ -1236,8 +1236,8 @@ void AsScene3010DeadBolt::lock() { setVisible(true); setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); - setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage)); - SetAnimationCallback3(&AsScene3010DeadBolt::stIdle); + FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); + NextState(&AsScene3010DeadBolt::stIdle); if (_soundToggle) { _soundResource1.play(); } else { @@ -1255,8 +1255,8 @@ void AsScene3010DeadBolt::stDisabled() { setVisible(true); setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); - setCallback1(AnimationCallback(&AsScene3010DeadBolt::stDisabledMessage)); - SetAnimationCallback3(&AsScene3010DeadBolt::stIdle); + FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); + NextState(&AsScene3010DeadBolt::stIdle); _playBackwards = true; _soundResource3.play(); } @@ -1493,7 +1493,7 @@ void AsScene3011Symbol::show(bool flag) { } void AsScene3011Symbol::hide() { - setFileHash1(); + stopAnimation(); setVisible(false); } diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index d94d3db128..f1f4bab9cd 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -92,63 +92,8 @@ Common::Error NeverhoodEngine::run() { } #if 0 - BlbArchive *blb = new BlbArchive(); - blb->open("m.blb"); - delete blb; -#endif - -#if 0 - ResourceFileEntry *r = _res->findEntry(0x50A80517); -#endif - -#if 0 - int resourceHandle = _res->useResource(0x0CA04202); - debug("resourceHandle = %d", resourceHandle); - byte *data = _res->loadResource(resourceHandle); - bool rle; - NDimensions dimensions; - NUnknown unknown; - byte *palette, *pixels; - parseBitmapResource(data, &rle, &dimensions, &unknown, &palette, &pixels); - debug("%d, %d", dimensions.width, dimensions.height); - byte *rawpixels = new byte[dimensions.width * dimensions.height]; - memset(rawpixels, 0, dimensions.width * dimensions.height); - debug("rle = %d", rle); - unpackSpriteRle(pixels, dimensions.width, dimensions.height, rawpixels, dimensions.width, false, false); - Common::DumpFile d; - d.open("dump.0"); - d.write(rawpixels, dimensions.width * dimensions.height); - d.close(); - delete[] rawpixels; - _res->unloadResource(resourceHandle); - _res->unuseResource(resourceHandle); -#endif - -#if 0 - { // Create a new scope - SpriteResource r(this); - BaseSurface *surf = new BaseSurface(this, 0, 640, 480); - r.load(0x0CA04202); - debug("r: width = %d; height = %d", r.getDimensions().width, r.getDimensions().height); - surf->drawSpriteResource(r); - delete surf; - } -#endif - -#if 0 - { // Create a new scope - AnimResource r(this); - r.load(0x000540B0); - } -#endif - -#if 0 - { // Create a new scope - DataResource dataResource(this); - //dataResource.load(0x01801002); - //dataResource.load(0x84500132); - dataResource.load(0x81120132); - } + // TODO: This should probably be implemented as debug command later + dumpAllResources(); #endif #if 1 @@ -220,5 +165,84 @@ NPoint NeverhoodEngine::getMousePos() { pt.y = _mouseY; return pt; } + +void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, int16 height) { + byte identsize = 0; + byte colourmaptype = 1; + byte imagetype = 1; + uint16 colourmapstart = 0; + uint16 colourmaplength = 256; + byte colourmapbits = 24; + uint16 xstart = 0; + uint16 ystart = 0; + byte bits = 8; + byte descriptor = 0x20; + Common::DumpFile tga; + tga.open(filename); + tga.writeByte(identsize); + tga.writeByte(colourmaptype); + tga.writeByte(imagetype); + tga.writeUint16LE(colourmapstart); + tga.writeUint16LE(colourmaplength); + tga.writeByte(colourmapbits); + tga.writeUint16LE(xstart); + tga.writeUint16LE(ystart); + tga.writeUint16LE(width); + tga.writeUint16LE(height); + tga.writeByte(bits); + tga.writeByte(descriptor); + tga.write(palette, 768); + tga.write(pixels, width * height); + tga.close(); +} + +void NeverhoodEngine::dumpAllResources() { + + PaletteResource paletteResource(this); + byte *vgaPalette = new byte[768]; + paletteResource.load(0x4086520E); + byte *srcpalette = paletteResource.palette(); + for (int i = 0; i < 256; i++) { + vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0]; + vgaPalette[i * 3 + 1] = srcpalette[i * 4 + 1]; + vgaPalette[i * 3 + 0] = srcpalette[i * 4 + 2]; + } + +#if 0 + for (int i = 0; i < 768; i++) + vgaPalette[i] <<= 2; +#endif + + uint entriesCount = _res->getEntryCount(); + debug("%d entries", entriesCount); + + for (uint i = 0; i < entriesCount; i++) { + const ResourceFileEntry &entry = _res->getEntry(i); + int type = _res->getResourceTypeByHash(entry.fileHash); + debug("hash: %08X; type: %d", entry.fileHash, type); + if (type == 4) { + AnimResource anim(this); + anim.load(entry.fileHash); + for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) { + const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex); + int16 width = (frameInfo.rect.width + 3) & 0xFFFC; + byte *pixels = new byte[width * frameInfo.rect.height]; + memset(pixels, 0, width * frameInfo.rect.height); + anim.draw(frameIndex, pixels, width, false, false); + Common::String filename = + frameInfo.frameHash != 0 + ? Common::String::format("%08X_%03d_%08X.tga", entry.fileHash, frameIndex, frameInfo.frameHash) + : Common::String::format("%08X_%03d.tga", entry.fileHash, frameIndex); + writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height); + delete[] pixels; + } + static int n = 0; + //if (n++ == 25) break; + } + } + + delete[] vgaPalette; + +} } // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index b4bc333e98..adc46198d6 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -124,6 +124,8 @@ public: int16 getMouseY() const { return _mouseY; } NPoint getMousePos(); + void dumpAllResources(); + public: }; diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index 22614401f8..ed5bffaf9b 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -68,6 +68,8 @@ public: void unloadResource(int resourceHandle); void freeResource(Resource *resource); Common::SeekableReadStream *createStream(uint32 fileHash); + const ResourceFileEntry& getEntry(uint index) { return _entries[index]; } + uint getEntryCount() { return _entries.size(); } private: Common::Array _archives; Common::Array _entries; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 480e9e9299..697bd6e262 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -237,9 +237,9 @@ void AnimatedSprite::init() { _frameIndex3 = 0; _frameIndex = 0; _hashListIndex = -1; - _callback1Cb = NULL; - _callback2Cb = NULL; - _callback3Cb = NULL; + _finalizeStateCb = NULL; + _currStateCb = NULL; + _nextStateCb = NULL; _newHashListIndex = -1; _fileHash4 = 0; _flag = false; @@ -458,7 +458,7 @@ void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frame _hashListIndex = -1; } -void AnimatedSprite::setFileHash1() { +void AnimatedSprite::stopAnimation() { _fileHash1 = 1; _animStatus = 2; } @@ -486,52 +486,43 @@ void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fil _hashListIndex = -1; } -void AnimatedSprite::setCallback1(AnimationCb callback1) { - if (_callback1Cb) { - (this->*_callback1Cb)(); - } - _callback1Cb = callback1; +void AnimatedSprite::setFinalizeState(AnimationCb finalizeStateCb) { + if (_finalizeStateCb) + (this->*_finalizeStateCb)(); + _finalizeStateCb = finalizeStateCb; } -void AnimatedSprite::setCallback2(AnimationCb callback2) { - - if (_callback1Cb) { - AnimationCb cb = _callback1Cb; - _callback1Cb = NULL; +void AnimatedSprite::gotoState(AnimationCb currStateCb) { + if (_finalizeStateCb) { + AnimationCb cb = _finalizeStateCb; + _finalizeStateCb = NULL; (this->*cb)(); } - // TODO _callbackList = NULL; - _callback3Cb = NULL; - _callback2Cb = callback2; - - if (_callback2Cb) { - (this->*_callback2Cb)(); - } - + _nextStateCb = NULL; + _currStateCb = currStateCb; + if (_currStateCb) + (this->*_currStateCb)(); } void AnimatedSprite::removeCallbacks() { - - if (_callback1Cb) { - AnimationCb cb = _callback1Cb; - _callback1Cb = NULL; + if (_finalizeStateCb) { + AnimationCb cb = _finalizeStateCb; + _finalizeStateCb = NULL; (this->*cb)(); } - - if (_callback3Cb) { - _callback2Cb = _callback3Cb; - _callback3Cb = NULL; - debug("Fire _callback3Cb '%s'", _callback3CbName.c_str()); - (this->*_callback2Cb)(); + if (_nextStateCb) { + _currStateCb = _nextStateCb; + _nextStateCb = NULL; + debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str()); + (this->*_currStateCb)(); #if 0 // TODO } else if (_callbackList) { removeCallbackList(); #endif } else { - _callback2Cb = NULL; + _currStateCb = NULL; } - } } // End of namespace Neverhood diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 10ebc197b3..aa2272464e 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -107,10 +107,10 @@ protected: void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); }; -#define SetAnimationCallback1(callback) _callback1Cb = static_cast (callback); debug(2, "SetAnimationCallback1(" #callback ")"); _callback1CbName = #callback -#define SetAnimationCallback2(callback) _callback2Cb = static_cast (callback); debug(2, "SetAnimationCallback2(" #callback ")"); _callback2CbName = #callback -#define SetAnimationCallback3(callback) _callback3Cb = static_cast (callback); debug(2, "SetAnimationCallback3(" #callback ")"); _callback3CbName = #callback #define AnimationCallback(callback) static_cast (callback) +#define GotoState(callback) gotoState(static_cast (callback)) +#define NextState(callback) _nextStateCb = static_cast (callback); debug(2, "NextState(" #callback ")"); _nextStateCbName = #callback +#define FinalizeState(callback) setFinalizeState(static_cast (callback)); class AnimatedSprite : public Sprite { public: @@ -152,24 +152,24 @@ protected: callbackListCount dw ? callbackList dd ? */ - AnimationCb _callback1Cb; - AnimationCb _callback2Cb; - AnimationCb _callback3Cb; + AnimationCb _finalizeStateCb; + AnimationCb _currStateCb; + AnimationCb _nextStateCb; // For debugging purposes - Common::String _callback1CbName; - Common::String _callback2CbName; - Common::String _callback3CbName; + Common::String _finalizeStateCbName; + Common::String _currStateCbName; + Common::String _nextStateCbName; void init(); void updateAnim(); void updatePosition(); void updateFrameIndex(); void updateFrameInfo(); void createSurface1(uint32 fileHash, int surfacePriority); - void setFileHash1(); + void stopAnimation(); void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5); void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); - void setCallback1(AnimationCb callback1); - void setCallback2(AnimationCb callback2); + void setFinalizeState(AnimationCb finalizeStateCb); + void gotoState(AnimationCb currStateCb); void removeCallbacks(); }; -- cgit v1.2.3 From dac95f3f7361a69dbd5eacfd181f294f9def53d9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 27 Oct 2011 11:33:12 +0000 Subject: NEVERHOOD: More renaming (mostly in Klayman and AnimatedSprite) --- engines/neverhood/diskplayerscene.cpp | 8 +- engines/neverhood/klayman.cpp | 1108 ++++++++++++++++----------------- engines/neverhood/klayman.h | 122 ++-- engines/neverhood/module1000.cpp | 130 ++-- engines/neverhood/module1100.cpp | 12 +- engines/neverhood/module1200.cpp | 102 +-- engines/neverhood/module1300.cpp | 88 +-- engines/neverhood/module1400.cpp | 78 +-- engines/neverhood/module1600.cpp | 78 +-- engines/neverhood/module1700.cpp | 4 +- engines/neverhood/module1900.cpp | 34 +- engines/neverhood/module2000.cpp | 4 +- engines/neverhood/module2100.cpp | 20 +- engines/neverhood/module2200.cpp | 76 +-- engines/neverhood/module2600.cpp | 2 +- engines/neverhood/module3000.cpp | 32 +- engines/neverhood/sprite.cpp | 176 +++--- engines/neverhood/sprite.h | 38 +- 18 files changed, 1046 insertions(+), 1066 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 4fdc736dc5..94a53239b1 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -161,8 +161,8 @@ Class494::Class494(NeverhoodEngine *vm) createSurface1(0x100B90B4, 1200); _x = 211; _y = 195; - setFileHash(0x100B90B4, 0, -1); - _newHashListIndex = 0; + startAnimation(0x100B90B4, 0, -1); + _newStickFrameIndex = 0; _needRefresh = true; updatePosition(); _surface->setVisible(false); @@ -172,7 +172,7 @@ uint32 Class494::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -186,7 +186,7 @@ void Class494::sub43BE00() { } void Class494::sub43BE20() { - setFileHash(0x100B90B4, 0, -1); + startAnimation(0x100B90B4, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class494::handleMessage); NextState(&Class494::sub43BE00); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 567788b729..2358df4c8b 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -27,7 +27,7 @@ namespace Neverhood { -static const KlaymanTableItem klaymanTable1[] = { +static const KlaymanIdleTableItem klaymanTable1[] = { {1, &Klayman::stDoIdlePickEar}, {1, &Klayman::sub41FDA0}, {1, &Klayman::sub41FDF0}, @@ -35,7 +35,7 @@ static const KlaymanTableItem klaymanTable1[] = { {1, &Klayman::sub41FEB0} }; -static const KlaymanTableItem klaymanTable2[] = { +static const KlaymanIdleTableItem klaymanTable2[] = { {1, &Klayman::stDoIdlePickEar}, {1, &Klayman::sub41FDA0}, {1, &Klayman::stDoIdleChest}, @@ -43,13 +43,13 @@ static const KlaymanTableItem klaymanTable2[] = { }; #if 0 -static const KlaymanTableItem klaymanTable3[] = { +static const KlaymanIdleTableItem klaymanTable3[] = { {1, &Klayman::sub421430}, {1, &Klayman::sub421480} }; #endif -static const KlaymanTableItem klaymanTable4[] = { +static const KlaymanIdleTableItem klaymanTable4[] = { {1, &Klayman::sub41FDA0}, {1, &Klayman::stDoIdleChest}, {1, &Klayman::sub41FEB0}, @@ -60,8 +60,8 @@ static const KlaymanTableItem klaymanTable4[] = { Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), - _counter2(0), /*_field118(0), */_status2(0), _flagE5(true), _attachedSprite(NULL), _flagE1(false), - _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _flagF7(false), + _counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _flagE1(false), + _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _isLeverDown(false), _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { // TODO DirtySurface @@ -71,7 +71,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _x4 = x; _y4 = y; _flags = 2; - setKlaymanTable1(); + setKlaymanIdleTable1(); stTryStandIdle(); SetUpdateHandler(&Klayman::update); } @@ -101,25 +101,25 @@ void Klayman::update() { xUpdate(); } -void Klayman::setKlaymanTable(const KlaymanTableItem *table, int tableCount) { - _table = table; - _tableCount = tableCount; - _tableMaxValue = 0; +void Klayman::setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount) { + _idleTable = table; + _idleTableCount = tableCount; + _idleTableMaxValue = 0; for (int i = 0; i < tableCount; i++) { - _tableMaxValue += table[i].value; + _idleTableMaxValue += table[i].value; } } -void Klayman::setKlaymanTable1() { - setKlaymanTable(klaymanTable1, ARRAYSIZE(klaymanTable1)); +void Klayman::setKlaymanIdleTable1() { + setKlaymanIdleTable(klaymanTable1, ARRAYSIZE(klaymanTable1)); } -void Klayman::setKlaymanTable2() { - setKlaymanTable(klaymanTable2, ARRAYSIZE(klaymanTable2)); +void Klayman::setKlaymanIdleTable2() { + setKlaymanIdleTable(klaymanTable2, ARRAYSIZE(klaymanTable2)); } -void Klayman::setKlaymanTable3() { - // TODO setKlaymanTable(klaymanTable3, ARRAYSIZE(klaymanTable3)); +void Klayman::setKlaymanIdleTable3() { + // TODO setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3)); } void Klayman::stDoIdlePickEar() { @@ -128,8 +128,8 @@ void Klayman::stDoIdlePickEar() { void Klayman::stIdlePickEar() { _status2 = 1; - _flagE5 = true; - setFileHash(0x5B20C814, 0, -1); + _acceptInput = true; + startAnimation(0x5B20C814, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmIdlePickEar); SetSpriteCallback(NULL); @@ -159,8 +159,8 @@ void Klayman::sub41FDA0() { void Klayman::sub41FDB0() { _status2 = 1; - _flagE5 = true; - setFileHash(0xD122C137, 0, -1); + _acceptInput = true; + startAnimation(0xD122C137, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E980); SetSpriteCallback(NULL); @@ -185,8 +185,8 @@ void Klayman::sub41FDF0() { void Klayman::sub41FE00() { _status2 = 1; - _flagE5 = true; - setFileHash(0x543CD054, 0, -1); + _acceptInput = true; + startAnimation(0x543CD054, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E9E0); SetSpriteCallback(NULL); @@ -220,8 +220,8 @@ void Klayman::stDoIdleChest() { void Klayman::stIdleChest() { _status2 = 1; - _flagE5 = true; - setFileHash(0x40A0C034, 0, -1); + _acceptInput = true; + startAnimation(0x40A0C034, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmIdleChest); SetSpriteCallback(NULL); @@ -246,8 +246,8 @@ void Klayman::sub41FEB0() { void Klayman::sub41FEC0() { _status2 = 1; - _flagE5 = true; - setFileHash(0x5120E137, 0, -1); + _acceptInput = true; + startAnimation(0x5120E137, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EFE0); SetSpriteCallback(NULL); @@ -274,8 +274,8 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, E void Klayman::sub421350() { _status2 = 0; - _flagE5 = true; - setFileHash(0x582EC138, 0, -1); + _acceptInput = true; + startAnimation(0x582EC138, 0, -1); _counter = 0; SetSpriteCallback(NULL); SetUpdateHandler(&Klayman::update41D1C0); @@ -290,15 +290,15 @@ void Klayman::update41D1C0() { _counter++; if (_counter >= _counterMax) { _counter = 0; - if (_table) { - int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue); - for (int i = 0; i < _tableCount; i++) { - if (randomValue < _table[_tableCount].value) { - (this->*(_table[_tableCount].callback))(); + if (_idleTable) { + int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); + for (int i = 0; i < _idleTableCount; i++) { + if (randomValue < _idleTable[_idleTableCount].value) { + (this->*(_idleTable[_idleTableCount].callback))(); _counterMax = _vm->_rnd->getRandomNumber(128) + 24; break; } - randomValue -= _table[_tableCount].value; + randomValue -= _idleTable[_idleTableCount].value; } } } else { @@ -313,8 +313,8 @@ void Klayman::update41D1C0() { void Klayman::stIdleSitBlink() { _status2 = 0; - _flagE5 = true; - setFileHash(0x5C24C018, 0, -1); + _acceptInput = true; + startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -323,8 +323,8 @@ void Klayman::stIdleSitBlink() { void Klayman::stIdleSitBlinkSecond() { _status2 = 0; - _flagE5 = true; - setFileHash(0x5C24C018, 0, -1); + _acceptInput = true; + startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update41D1C0); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(NULL); @@ -334,8 +334,8 @@ void Klayman::stPickUpNeedle() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klayman::stPickUpNeedle))) { _status2 = 1; - _flagE5 = false; - setFileHash(0x1449C169, 0, -1); + _acceptInput = false; + startAnimation(0x1449C169, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPickUpGeneric); SetSpriteCallback(NULL); @@ -346,8 +346,8 @@ void Klayman::sub41FFF0() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klayman::sub41FFF0))) { _status2 = 1; - _flagE5 = false; - setFileHash(0x0018C032, 0, -1); + _acceptInput = false; + startAnimation(0x0018C032, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D640); SetSpriteCallback(NULL); @@ -377,19 +377,19 @@ uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub4214D0() { +void Klayman::stTurnToUseInTeleporter() { _status2 = 0; - _flagE5 = false; - setFileHash(0xD229823D, 0, -1); + _acceptInput = false; + startAnimation(0xD229823D, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); } -void Klayman::sub421510() { +void Klayman::stReturnFromUseInTeleporter() { _status2 = 0; - _flagE5 = false; - setFileHash(0x9A2801E0, 0, -1); + _acceptInput = false; + startAnimation(0x9A2801E0, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -398,10 +398,10 @@ void Klayman::sub421510() { void Klayman::stStepOver() { if (!stStartAction(AnimationCallback(&Klayman::stStepOver))) { _status2 = 2; - _flagE5 = false; - setFileHash(0x004AA310, 0, -1); + _acceptInput = false; + startAnimation(0x004AA310, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EC70); + SetMessageHandler(&Klayman::hmStartWalking); SetSpriteCallback(&Klayman::spriteUpdate41F230); } } @@ -409,15 +409,15 @@ void Klayman::stStepOver() { void Klayman::stSitInTeleporter() { if (!stStartAction(AnimationCallback(&Klayman::stSitInTeleporter))) { _status2 = 0; - _flagE5 = false; - setFileHash(0x392A0330, 0, -1); + _acceptInput = false; + startAnimation(0x392A0330, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EAB0); + SetMessageHandler(&Klayman::hmSitInTeleporter); SetSpriteCallback(&Klayman::spriteUpdate41F230); } } -uint32 Klayman::handleMessage41EAB0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -429,10 +429,10 @@ uint32 Klayman::handleMessage41EAB0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421310() { +void Klayman::stGetUpFromTeleporter() { _status2 = 0; - _flagE5 = false; - setFileHash(0x913AB120, 0, -1); + _acceptInput = false; + startAnimation(0x913AB120, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(&Klayman::spriteUpdate41F230); @@ -473,10 +473,10 @@ void Klayman::update41D2B0() { bool Klayman::stStartActionFromIdle(AnimationCb callback) { if (_status2 == 2) { _status2 = 1; - _flagE5 = false; - setFileHash(0x9A7020B8, 0, -1); + _acceptInput = false; + startAnimation(0x9A7020B8, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41F140); + SetMessageHandler(&Klayman::hmStartAction); SetSpriteCallback(NULL); NextState(callback); return true; @@ -516,8 +516,8 @@ void Klayman::sub41C790() { void Klayman::stTryStandIdle() { if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTryStandIdle))) { _status2 = 1; - _flagE5 = true; - setFileHash(0x5420E254, 0, -1); + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); _counter = 0; _counter3 = 0; _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; @@ -529,26 +529,22 @@ void Klayman::stTryStandIdle() { void Klayman::update41D0F0() { update(); - _counter++; - if (_counter >= 720) { + if (++_counter >= 720) { _counter = 0; - if (_table) { - int randomValue = _vm->_rnd->getRandomNumber(_tableMaxValue); - for (int i = 0; i < _tableCount; i++) { - if (randomValue < _table[_tableCount].value) { - (this->*(_table[_tableCount].callback))(); + if (_idleTable) { + int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); + for (int i = 0; i < _idleTableCount; i++) { + if (randomValue < _idleTable[_idleTableCount].value) { + (this->*(_idleTable[_idleTableCount].callback))(); break; } - randomValue -= _table[_tableCount].value; + randomValue -= _idleTable[_idleTableCount].value; } } - } else { - _counter3++; - if (_counter3 >= _counter3Max) { - _counter3 = 0; - _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; - stStand(); - } + } else if (++_counter3 >= _counter3Max) { + _counter3 = 0; + _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + stStand(); } } @@ -557,7 +553,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E uint32 messageResult = xHandleMessage(messageNum, param); switch (messageNum) { case 0x1008: - messageResult = _flagE5; + messageResult = _acceptInput; break; case 0x1014: _attachedSprite = (Sprite*)(param.asEntity()); @@ -591,8 +587,8 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E void Klayman::stStand() { _status2 = 1; - _flagE5 = true; - setFileHash(0x5900C41E, 0, -1); + _acceptInput = true; + startAnimation(0x5900C41E, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -611,14 +607,14 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, E void Klayman::stStandAround() { _status2 = 1; - _flagE5 = true; - setFileHash(0x5420E254, 0, -1); + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update41D0F0); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(NULL); } -uint32 Klayman::handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -666,8 +662,8 @@ void Klayman::sub41C930(int16 x, bool flag) { void Klayman::stWakeUp() { _status2 = 1; - _flagE5 = false; - setFileHash(0x527AC970, 0, -1); + _acceptInput = false; + startAnimation(0x527AC970, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -675,8 +671,8 @@ void Klayman::stWakeUp() { void Klayman::stSleeping() { _status2 = 0; - _flagE5 = true; - setFileHash(0x5A38C110, 0, -1); + _acceptInput = true; + startAnimation(0x5A38C110, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmSleeping); SetSpriteCallback(NULL); @@ -697,10 +693,10 @@ uint32 Klayman::hmSleeping(int messageNum, const MessageParam ¶m, Entity *se bool Klayman::stStartAction(AnimationCb callback3) { if (_status2 == 1) { _status2 = 2; - _flagE5 = false; - setFileHash(0x5C7080D4, 0, -1); + _acceptInput = false; + startAnimation(0x5C7080D4, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41F140); + SetMessageHandler(&Klayman::hmStartAction); SetSpriteCallback(&Klayman::spriteUpdate41F250); NextState(callback3); return true; @@ -728,7 +724,7 @@ void Klayman::spriteUpdate41F250() { } _deltaY = 0; - if (_flag) { + if (_frameChanged) { if (xdiff > 6) _x += 6; else if (xdiff < -6) @@ -741,11 +737,11 @@ void Klayman::spriteUpdate41F250() { } -void Klayman::spriteUpdate41F5F0() { +void Klayman::suWalking() { int16 xdiff = _x4 - _x; - if (_frameIndex == 9) { + if (_currFrameIndex == 9) { if (xdiff > 26) _deltaX += xdiff - 26; else if (xdiff < -26) @@ -792,20 +788,20 @@ void Klayman::spriteUpdate41F5F0() { void Klayman::stSneak() { _status2 = 1; _flagE2 = true; - _flagE5 = true; + _acceptInput = true; setDoDeltaX(_x4 < _x ? 1 : 0); - setFileHash(0x5C48C506, 0, -1); + startAnimation(0x5C48C506, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DD80); - SetSpriteCallback(&Klayman::spriteUpdate41F5F0); - FinalizeState(&Klayman::stSneakDone); + SetMessageHandler(&Klayman::hmWalking); + SetSpriteCallback(&Klayman::suWalking); + FinalizeState(&Klayman::stWalkingDone); } -void Klayman::stSneakDone() { +void Klayman::stWalkingDone() { _flagE2 = false; } -uint32 Klayman::handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -855,11 +851,11 @@ void Klayman::stStartWalking() { if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) { _status2 = 0; _flagE1 = true; - _flagE5 = true; + _acceptInput = true; setDoDeltaX(_x4 < _x ? 1 : 0); - setFileHash(0x242C0198, 0, -1); + startAnimation(0x242C0198, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EC70); + SetMessageHandler(&Klayman::hmStartWalking); SetSpriteCallback(&Klayman::spriteUpdate41F320); FinalizeState(&Klayman::stStartWalkingDone); NextState(&Klayman::stWalking); @@ -870,7 +866,7 @@ void Klayman::stStartWalkingDone() { _flagE1 = false; } -uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -895,13 +891,13 @@ uint32 Klayman::handleMessage41EC70(int messageNum, const MessageParam ¶m, E void Klayman::stWalking() { _status2 = 0; _flagE1 = true; - _flagE5 = true; - setFileHash(0x1A249001, 0, -1); + _acceptInput = true; + startAnimation(0x1A249001, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); FinalizeState(&Klayman::stStartWalkingDone); - NextState(&Klayman::sub41FA40); + NextState(&Klayman::stUpdateWalking); } void Klayman::spriteUpdate41F300() { @@ -931,35 +927,35 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FA40() { +void Klayman::stUpdateWalking() { if (_status3 == 2) { sub41C7B0(); } else if (_status3 == 3) { - sub420F20(); + stWalkingOpenDoor(); } else { _flagE2 = true; - _flagE5 = true; - if (ABS(_x4 - _x) <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + _acceptInput = true; + if (ABS(_x4 - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { if (_status3 == 0) { _status2 = 1; - setFileHash(0xF234EE31, 0, -1); + startAnimation(0xF234EE31, 0, -1); } else { _status2 = 2; - setFileHash(0xF135CC21, 0, -1); + startAnimation(0xF135CC21, 0, -1); } - } else if (ABS(_x4 - _x) <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + } else if (ABS(_x4 - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { if (_status3 == 0) { _status2 = 1; - setFileHash(0x8604A152, 0, -1); + startAnimation(0x8604A152, 0, -1); } else { _status2 = 2; - setFileHash(0xA246A132, 0, -1); + startAnimation(0xA246A132, 0, -1); } } SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DD80); - SetSpriteCallback(&Klayman::spriteUpdate41F5F0); - FinalizeState(&Klayman::stSneakDone); + SetMessageHandler(&Klayman::hmWalking); + SetSpriteCallback(&Klayman::suWalking); + FinalizeState(&Klayman::stWalkingDone); } } @@ -976,13 +972,13 @@ void Klayman::spriteUpdate41F320() { if (xdiff == 0) { sendMessage(this, 0x1019, 0); - } else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _frameIndex >= 5 && _frameIndex <= 11) { + } else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { sendMessage(this, 0x1019, 0); - } else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_frameIndex >= 12 || _frameIndex <= 4)) { + } else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { sendMessage(this, 0x1019, 0); } else if (_status3 == 3 && xdiff < 30) { sendMessage(this, 0x1019, 0); - } else if (_status3 == 3 && xdiff < 150 && _frameIndex >= 6) { + } else if (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6) { sendMessage(this, 0x1019, 0); } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); @@ -1039,8 +1035,8 @@ void Klayman::stPickUpGeneric() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klayman::stPickUpGeneric))) { _status2 = 1; - _flagE5 = false; - setFileHash(0x1C28C178, 0, -1); + _acceptInput = false; + startAnimation(0x1C28C178, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPickUpGeneric); SetSpriteCallback(NULL); @@ -1076,8 +1072,8 @@ uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entit void Klayman::stTurnPressButton() { if (!stStartAction(AnimationCallback(&Klayman::stTurnPressButton))) { _status2 = 2; - _flagE5 = true; - setFileHash(0x1C02B03D, 0, -1); + _acceptInput = true; + startAnimation(0x1C02B03D, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); SetSpriteCallback(NULL); @@ -1105,8 +1101,8 @@ uint32 Klayman::hmPressButton(int messageNum, const MessageParam ¶m, Entity void Klayman::stStampFloorButton() { if (!stStartAction(AnimationCallback(&Klayman::stStampFloorButton))) { _status2 = 2; - _flagE5 = true; - setFileHash(0x1C16B033, 0, -1); + _acceptInput = true; + startAnimation(0x1C16B033, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); SetSpriteCallback(NULL); @@ -1116,8 +1112,8 @@ void Klayman::stStampFloorButton() { void Klayman::stPressButtonSide() { if (!stStartActionFromIdle(AnimationCallback(&Klayman::stPressButtonSide))) { _status2 = 1; - _flagE5 = true; - setFileHash(0x1CD89029, 0, -1); + _acceptInput = true; + startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); SetSpriteCallback(&Klayman::spriteUpdate41F250); @@ -1194,9 +1190,9 @@ void Klayman::sub41CAC0(int16 x) { void Klayman::stLargeStep() { _status2 = 2; _flagE3 = true; - _flagE5 = true; + _acceptInput = true; setDoDeltaX(_x4 >= _x ? 1 : 0); - setFileHash(0x08B28116, 0, -1); + startAnimation(0x08B28116, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLargeStep); SetSpriteCallback(&Klayman::suLargeStep); @@ -1214,7 +1210,7 @@ void Klayman::suLargeStep() { _deltaX = -_deltaX; } - if (_frameIndex == 7) { + if (_currFrameIndex == 7) { _deltaX = xdiff; } @@ -1273,8 +1269,8 @@ uint32 Klayman::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *s void Klayman::stWonderAboutHalf() { _status2 = 0; - _flagE5 = true; - setFileHash(0xD820A114, 0, 10); + _acceptInput = true; + startAnimation(0xD820A114, 0, 10); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -1282,8 +1278,8 @@ void Klayman::stWonderAboutHalf() { void Klayman::stWonderAboutAfter() { _status2 = 1; - _flagE5 = true; - setFileHash(0xD820A114, 30, -1); + _acceptInput = true; + startAnimation(0xD820A114, 30, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -1291,14 +1287,14 @@ void Klayman::stWonderAboutAfter() { void Klayman::stTurnToUseHalf() { _status2 = 0; - _flagE5 = true; - setFileHash(0x9B250AD2, 0, 7); + _acceptInput = true; + startAnimation(0x9B250AD2, 0, 7); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EEF0); + SetMessageHandler(&Klayman::hmTurnToUse); SetSpriteCallback(NULL); } -uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1314,17 +1310,17 @@ uint32 Klayman::handleMessage41EEF0(int messageNum, const MessageParam ¶m, E void Klayman::stTurnAwayFromUse() { _status2 = 1; - _flagE5 = true; - setFileHash(0x98F88391, 4, -1); + _acceptInput = true; + startAnimation(0x98F88391, 4, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EEF0); + SetMessageHandler(&Klayman::hmTurnToUse); SetSpriteCallback(NULL); } void Klayman::stWonderAbout() { _status2 = 1; - _flagE5 = true; - setFileHash(0xD820A114, 0, -1); + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); @@ -1332,8 +1328,8 @@ void Klayman::stWonderAbout() { void Klayman::stPeekWall() { _status2 = 1; - _flagE5 = true; - setFileHash(0xAC20C012, 0, -1); + _acceptInput = true; + startAnimation(0xAC20C012, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPeekWall); SetSpriteCallback(NULL); @@ -1344,8 +1340,8 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *se switch (messageNum) { case 0x1008: speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_frameIndex < speedUpFrameIndex) - setFileHash(0xAC20C012, speedUpFrameIndex, -1); + if (_currFrameIndex < speedUpFrameIndex) + startAnimation(0xAC20C012, speedUpFrameIndex, -1); return 0; case 0x100D: if (param.asInteger() == 0x32180101) { @@ -1358,24 +1354,24 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *se return handleMessage41D480(messageNum, param, sender); } -void Klayman::sub420210() { - if (!stStartAction(AnimationCallback(&Klayman::sub420210))) { +void Klayman::stJumpToRing1() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing1))) { _status2 = 0; - setFileHash(0xD82890BA, 0, -1); - sub4201C0(); + startAnimation(0xD82890BA, 0, -1); + setupJumpToRing(); } } -void Klayman::sub4201C0() { - _flagE5 = false; +void Klayman::setupJumpToRing() { + _acceptInput = false; SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D790); + SetMessageHandler(&Klayman::hmJumpToRing); SetSpriteCallback(&Klayman::spriteUpdate41F230); NextState(&Klayman::sub420340); sendMessage(_attachedSprite, 0x482B, 0); } -uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1383,7 +1379,7 @@ uint32 Klayman::handleMessage41D790(int messageNum, const MessageParam ¶m, E if (_attachedSprite) { sendMessage(_attachedSprite, 0x4806, 0); } - _flagE5 = true; + _acceptInput = true; } else if (param.asInteger() == 0x320AC306) { _soundResource1.play(0x5860C640); } else if (param.asInteger() == 0x4AB28209) { @@ -1403,35 +1399,35 @@ void Klayman::spriteUpdate41F230() { void Klayman::sub420340() { _status2 = 0; - _flagE5 = true; - setFileHash(0x4829E0B8, 0, -1); + _acceptInput = true; + startAnimation(0x4829E0B8, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(NULL); } -void Klayman::sub420250() { - if (!stStartAction(AnimationCallback(&Klayman::sub420250))) { +void Klayman::stJumpToRing2() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing2))) { _status2 = 0; - setFileHash(0x900980B2, 0, -1); - sub4201C0(); + startAnimation(0x900980B2, 0, -1); + setupJumpToRing(); } } -void Klayman::sub420290() { - if (!stStartAction(AnimationCallback(&Klayman::sub420290))) { +void Klayman::stJumpToRing3() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing3))) { _status2 = 0; - _flagE5 = false; - setFileHash(0xBA1910B2, 0, -1); + _acceptInput = false; + startAnimation(0xBA1910B2, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41D880); - NextState(&Klayman::sub420380); + SetMessageHandler(&Klayman::hmJumpToRing3); + NextState(&Klayman::stHoldRing); sendMessage(_attachedSprite, 0x482B, 0); } } -uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1451,41 +1447,41 @@ uint32 Klayman::handleMessage41D880(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420380() { +void Klayman::stHoldRing() { _status2 = 0; - _flagE5 = true; - setFileHash(0x4A293FB0, 0, -1); + _acceptInput = true; + startAnimation(0x4A293FB0, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DAA0); + SetMessageHandler(&Klayman::hmHoldRing); SetSpriteCallback(NULL); } -uint32 Klayman::handleMessage41DAA0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmHoldRing(int messageNum, const MessageParam ¶m, Entity *sender) { if (messageNum == 0x1008) { - sub4203C0(); + stReleaseRing(); return 0; } return handleMessage41D360(messageNum, param, sender); } -void Klayman::sub4203C0() { +void Klayman::stReleaseRing() { _status2 = 1; - _flagE5 = false; + _acceptInput = false; if (_attachedSprite) { sendMessage(_attachedSprite, 0x4807, 0); _attachedSprite = NULL; } - setFileHash(0xB869A4B9, 0, -1); + startAnimation(0xB869A4B9, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteCallback(NULL); } -void Klayman::sub420300() { - if (!stStartAction(AnimationCallback(&Klayman::sub420300))) { +void Klayman::stJumpToRing4() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing4))) { _status2 = 0; - setFileHash(0xB8699832, 0, -1); - sub4201C0(); + startAnimation(0xB8699832, 0, -1); + setupJumpToRing(); } } @@ -1493,12 +1489,12 @@ void Klayman::sub41CCE0(int16 x) { sub41CC40(_attachedSprite->getX(), x); } -void Klayman::sub420970() { +void Klayman::stContinueClimbLadderUp() { _status2 = 0; - _flagE5 = true; + _acceptInput = true; _statusE0 = 3; - setFileHash2(0x3A292504, 0x01084280, 0); - _fileHash4 = 0x01084280; + startAnimationByHash(0x3A292504, 0x01084280, 0); + _newStickFrameHash = 0x01084280; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(NULL); @@ -1517,22 +1513,22 @@ void Klayman::sub4209D0() { } } else if (_statusE0 == 0) { _statusE0 = 2; - _flagE5 = false; - setFileHash(0x122D1505, 0, -1); + _acceptInput = false; + startAnimation(0x122D1505, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E0D0); SetSpriteCallback(&Klayman::spriteUpdate41F230); } else if (_statusE0 == 3) { _statusE0 = 2; - _flagE5 = false; - setFileHash2(0x122D1505, 0x01084280, 0); + _acceptInput = false; + startAnimationByHash(0x122D1505, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E0D0); SetSpriteCallback(&Klayman::spriteUpdate41F230); } else if (_statusE0 == 1) { _statusE0 = 2; - _flagE5 = true; - setFileHash(0x122D1505, 29 - _frameIndex, -1); + _acceptInput = true; + startAnimation(0x122D1505, 29 - _currFrameIndex, -1); } } } @@ -1541,15 +1537,15 @@ void Klayman::sub420BC0() { _status2 = 2; if (_statusE0 == 1) { _statusE0 = 0; - _flagE5 = false; - setFileHash2(0x3A292504, 0x02421405, 0); + _acceptInput = false; + startAnimationByHash(0x3A292504, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); SetSpriteCallback(&Klayman::spriteUpdate41F230); } else if (_statusE0 == 1) { _statusE0 = 0; - _flagE5 = false; - setFileHash2(0x122D1505, 0x02421405, 0); + _acceptInput = false; + startAnimationByHash(0x122D1505, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); SetSpriteCallback(&Klayman::spriteUpdate41F230); @@ -1581,16 +1577,16 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { - _flagE5 = true; + _acceptInput = true; } else if (param.asInteger() == 0x489B025C) { _soundResource1.play(0x52C4C2D7); } else if (param.asInteger() == 0x400A0E64) { _soundResource1.play(0x50E081D9); } else if (param.asInteger() == 0x02421405) { if (_statusE0 == 1) { - setFileHash2(0x3A292504, 0x01084280, 0); + startAnimationByHash(0x3A292504, 0x01084280, 0); } else { - setFileHash2(0x122D1505, 0x01084280, 0); + startAnimationByHash(0x122D1505, 0x01084280, 0); } if (_statusE0 == 1) { if (_y4 >= _y - 30) { @@ -1614,36 +1610,36 @@ void Klayman::sub420AD0() { sub41C7B0(); } else if (_statusE0 == 0) { _statusE0 = 1; - _flagE5 = false; - setFileHash(0x3A292504, 0, -1); + _acceptInput = false; + startAnimation(0x3A292504, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E0D0); SetSpriteCallback(&Klayman::spriteUpdate41F230); } else if (_statusE0 == 3) { _statusE0 = 1; - _flagE5 = true; - setFileHash2(0x3A292504, 0x01084280, 0); + _acceptInput = true; + startAnimationByHash(0x3A292504, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E0D0); SetSpriteCallback(&Klayman::spriteUpdate41F230); } else if (_statusE0 == 2) { _statusE0 = 1; - _flagE5 = true; - setFileHash(0x3A292504, 29 - _frameIndex, -1); + _acceptInput = true; + startAnimation(0x3A292504, 29 - _currFrameIndex, -1); } } } -void Klayman::sub421030() { +void Klayman::stWalkToFrontNoStep() { _status2 = 2; - _flagE5 = false; - setFileHash2(0xF229C003, 0x14884392, 0); + _acceptInput = false; + startAnimationByHash(0xF229C003, 0x14884392, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E490); + SetMessageHandler(&Klayman::hmWalkToFront); SetSpriteCallback(&Klayman::spriteUpdate41F230); } -uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1669,49 +1665,49 @@ uint32 Klayman::handleMessage41E490(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420FE0() { - if (!stStartAction(AnimationCallback(&Klayman::sub420FE0))) { +void Klayman::stWalkToFront() { + if (!stStartAction(AnimationCallback(&Klayman::stWalkToFront))) { _status2 = 2; - _flagE5 = false; - setFileHash(0xF229C003, 0, -1); + _acceptInput = false; + startAnimation(0xF229C003, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E490); + SetMessageHandler(&Klayman::hmWalkToFront); SetSpriteCallback(&Klayman::spriteUpdate41F230); } } -void Klayman::sub4210C0() { - if (!stStartAction(AnimationCallback(&Klayman::sub4210C0))) { +void Klayman::stTurnToFront() { + if (!stStartAction(AnimationCallback(&Klayman::stTurnToFront))) { _status2 = 0; - _flagE5 = false; - setFileHash2(0xCA221107, 0x8520108C, 0); + _acceptInput = false; + startAnimationByHash(0xCA221107, 0x8520108C, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E490); + SetMessageHandler(&Klayman::hmWalkToFront); SetSpriteCallback(&Klayman::spriteUpdate41F230); } } -void Klayman::sub421070() { - if (!stStartAction(AnimationCallback(&Klayman::sub421070))) { +void Klayman::stTurnToBack() { + if (!stStartAction(AnimationCallback(&Klayman::stTurnToBack))) { _status2 = 2; - _flagE5 = false; - setFileHash(0xCA221107, 0, -1); + _acceptInput = false; + startAnimation(0xCA221107, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E490); + SetMessageHandler(&Klayman::hmWalkToFront); SetSpriteCallback(&Klayman::spriteUpdate41F230); } } void Klayman::stLandOnFeet() { _status2 = 1; - _flagE5 = true; - setFileHash(0x18118554, 0, -1); + _acceptInput = true; + startAnimation(0x18118554, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E290); + SetMessageHandler(&Klayman::hmLandOnFeet); SetSpriteCallback(NULL); } -uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1723,18 +1719,18 @@ uint32 Klayman::handleMessage41E290(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420ED0() { - if (!stStartAction(AnimationCallback(&Klayman::sub420ED0))) { +void Klayman::stTurnToBackToUse() { + if (!stStartAction(AnimationCallback(&Klayman::stTurnToBackToUse))) { _status2 = 2; - _flagE5 = false; - setFileHash(0x91540140, 0, -1); + _acceptInput = false; + startAnimation(0x91540140, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E2F0); + SetMessageHandler(&Klayman::hmTurnToBackToUse); SetSpriteCallback(&Klayman::spriteUpdate41F230); } } -uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1750,47 +1746,61 @@ uint32 Klayman::handleMessage41E2F0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420750() { - if (!stStartAction(AnimationCallback(&Klayman::sub420750))) { +void Klayman::stClayDoorOpen() { + if (!stStartAction(AnimationCallback(&Klayman::stClayDoorOpen))) { _status2 = 2; - _flagE5 = false; - setFileHash(0x5CCCB330, 0, -1); + _acceptInput = false; + startAnimation(0x5CCCB330, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41DD20); + SetMessageHandler(&Klayman::hmClayDoorOpen); + } +} + +uint32 Klayman::hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040D4186) { + if (_attachedSprite) { + sendMessage(_attachedSprite, 0x4808, 0); + } + } + break; } + return messageResult; } void Klayman::stTurnToUse() { if (!stStartAction(AnimationCallback(&Klayman::stTurnToUse))) { _status2 = 2; - _flagE5 = false; - setFileHash(0x9B250AD2, 0, -1); + _acceptInput = false; + startAnimation(0x9B250AD2, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41EEF0); + SetMessageHandler(&Klayman::hmTurnToUse); } } -void Klayman::sub4207F0() { +void Klayman::stReturnFromUse() { _status2 = 2; - _flagE5 = false; - setFileHash(0x98F88391, 0, -1); + _acceptInput = false; + startAnimation(0x98F88391, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41EEF0); + SetMessageHandler(&Klayman::hmTurnToUse); } -void Klayman::sub420F20() { +void Klayman::stWalkingOpenDoor() { _flagF8 = false; - _flagE5 = false; - setFileHash(0x11A8E012, 0, -1); + _acceptInput = false; + startAnimation(0x11A8E012, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F5A0); - SetMessageHandler(&Klayman::handleMessage41EC70); + SetSpriteCallback(&Klayman::suWalkingOpenDoor); + SetMessageHandler(&Klayman::hmStartWalking); } -void Klayman::spriteUpdate41F5A0() { +void Klayman::suWalkingOpenDoor() { if (!_flagF8 && ABS(_x4 - _x) < 80) { sendMessage(_parentScene, 0x4829, 0); _flagF8 = true; @@ -1801,18 +1811,18 @@ void Klayman::spriteUpdate41F5A0() { void Klayman::stMoveObjectSkipTurnFaceObject() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); _flagE4 = false; - _flagE5 = true; - setFileHash2(0x0C1CA072, 0x01084280, 0); + _acceptInput = true; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41D970); + SetMessageHandler(&Klayman::hmMoveObjectTurn); } void Klayman::sub420660() { sendMessage(_attachedSprite, 0x4807, 0); } -uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { @@ -1840,11 +1850,11 @@ uint32 Klayman::handleMessage41D970(int messageNum, const MessageParam ¶m, E void Klayman::stMoveObjectSkipTurn() { _flagE4 = false; - _flagE5 = true; - setFileHash2(0x0C1CA072, 0x01084280, 0); + _acceptInput = true; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41D970); + SetMessageHandler(&Klayman::hmMoveObjectTurn); } void Klayman::stMoveObjectFaceObject() { @@ -1852,84 +1862,84 @@ void Klayman::stMoveObjectFaceObject() { if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) { _status2 = 2; _flagE4 = false; - _flagE5 = true; - setFileHash(0x0C1CA072, 0, -1); + _acceptInput = true; + startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); - SetMessageHandler(&Klayman::handleMessage41D970); + SetMessageHandler(&Klayman::hmMoveObjectTurn); } } -void Klayman::sub420C50() { - if (!stStartAction(AnimationCallback(&Klayman::sub420C50))) { +void Klayman::stUseLever() { + if (!stStartAction(AnimationCallback(&Klayman::stUseLever))) { _status2 = 0; - if (_flagF7) { - stReleaseLeverUp(); + if (_isLeverDown) { + stUseLeverRelease(); } else { sendMessage(_attachedSprite, 0x482B, 0); - setFileHash(0x0C303040, 0, -1); + startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); NextState(&Klayman::stPullLeverDown); - _flagE5 = false; + _acceptInput = false; } } } // Exactly the same code as sub420DA0 which was removed void Klayman::stPullLeverDown() { - setFileHash(0x0D318140, 0, -1); + startAnimation(0x0D318140, 0, -1); sendMessage(_attachedSprite, 0x480F, 0); NextState(&Klayman::stHoldLeverDown); } void Klayman::stHoldLeverDown() { - setFileHash(0x4464A440, 0, -1); + startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D360); - _flagF7 = true; - _flagE5 = true; + _isLeverDown = true; + _acceptInput = true; } -void Klayman::stReleaseLeverUp() { - setFileHash(0x09018068, 0, -1); +void Klayman::stUseLeverRelease() { + startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stPullLeverDown); - _flagE5 = false; + _acceptInput = false; } -void Klayman::sub420E20() { - if (_flagF7) { +void Klayman::stReleaseLever() { + if (_isLeverDown) { _status2 = 2; - setFileHash(0x09018068, 0, -1); + startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); - NextState(&Klayman::sub420E90); - _flagE5 = false; - _flagF7 = false; + NextState(&Klayman::stLetGoOfLever); + _acceptInput = false; + _isLeverDown = false; } else { sub41C7B0(); } } -void Klayman::sub420E90() { - setFileHash(0x0928C048, 0, -1); - FinalizeState(&Klayman::sub420EB0); +void Klayman::stLetGoOfLever() { + startAnimation(0x0928C048, 0, -1); + FinalizeState(&Klayman::cbLeverReleasedEvent); } -void Klayman::sub420EB0() { +void Klayman::cbLeverReleasedEvent() { sendMessage(_attachedSprite, 0x482A, 0); } -void Klayman::sub420680() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub420680))) { +void Klayman::stInsertDisk() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) { _status2 = 2; _counter2 = 0; for (uint32 i = 0; i < 20; i++) { @@ -1943,27 +1953,27 @@ void Klayman::sub420680() { gotoState(NULL); sub41C7B0(); } else { - setFileHash(0xD8C8D100, 0, -1); + startAnimation(0xD8C8D100, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F250); - SetMessageHandler(&Klayman::handleMessage41DB90); - _flagE5 = false; + SetMessageHandler(&Klayman::hmInsertDisk); + _acceptInput = false; _counter2--; } } } -uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x100D: if (param.asInteger() == 0x06040580) { if (_counter2 == 0) { // TODO: Calc calcHash value somewhere else - setFileHash3(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); + nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); } } else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { _counter2--; - setFileHash2(0xD8C8D100, 0x01084280, 0); + startAnimationByHash(0xD8C8D100, 0x01084280, 0); } else if (param.asInteger() == 0x062A1510) { _soundResource1.play(0x41688704); } else if (param.asInteger() == 0x02B20220) { @@ -1979,20 +1989,6 @@ uint32 Klayman::handleMessage41DB90(int messageNum, const MessageParam ¶m, E return handleMessage41D480(messageNum, param, sender); } -uint32 Klayman::handleMessage41DD20(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x040D4186) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4808, 0); - } - } - break; - } - return messageResult; -} - //############################################################################## // KmScene1001 @@ -2077,8 +2073,8 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { void KmScene1001::sub44FA50() { if (!stStartAction(AnimationCallback(&KmScene1001::sub44FA50))) { _status2 = 2; - _flagE5 = false; - setFileHash(0x00648953, 0, -1); + _acceptInput = false; + startAnimation(0x00648953, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1001::handleMessage44FA00); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); @@ -2103,18 +2099,18 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _class599(class599), _ssLadderArch(ssLadderArch), _status(0) { - setKlaymanTable1(); + setKlaymanIdleTable1(); } void KmScene1002::xUpdate() { if (_x >= 250 && _x <= 435 && _y >= 420) { if (_status == 0) { - // TODO setKlaymanTable(stru_4B44C8); + // TODO setKlaymanIdleTable(stru_4B44C8); _status = 1; } } else if (_status == 1) { - setKlaymanTable1(); + setKlaymanIdleTable1(); _status = 0; } } @@ -2147,16 +2143,16 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4805: switch (param.asInteger()) { case 1: - GotoState(&Klayman::sub420210); + GotoState(&Klayman::stJumpToRing1); break; case 2: - GotoState(&Klayman::sub420250); + GotoState(&Klayman::stJumpToRing2); break; case 3: - GotoState(&Klayman::sub420290); + GotoState(&Klayman::stJumpToRing3); break; case 4: - GotoState(&Klayman::sub420300); + GotoState(&Klayman::stJumpToRing4); break; } break; @@ -2180,7 +2176,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4820: sendMessage(_parentScene, 0x2005, 0); - GotoState(&Klayman::sub420970); + GotoState(&Klayman::stContinueClimbLadderUp); break; case 0x4821: sendMessage(_parentScene, 0x2005, 0); @@ -2198,16 +2194,16 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421030); + GotoState(&Klayman::stWalkToFrontNoStep); } else { - GotoState(&Klayman::sub420FE0); + GotoState(&Klayman::stWalkToFront); } break; case 0x482F: if (param.asInteger() == 1) { - GotoState(&Klayman::sub4210C0); + GotoState(&Klayman::stTurnToFront); } else { - GotoState(&Klayman::sub421070); + GotoState(&Klayman::stTurnToBack); } break; case 0x483F: @@ -2282,12 +2278,12 @@ uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x100D: if (param.asInteger() == 0x942D2081) { - _flagE5 = false; + _acceptInput = false; sendMessage(_attachedSprite, 0x2003, 0); } else if (param.asInteger() == 0xDA600012) { stHitByBoxingGlove(); } else if (param.asInteger() == 0x0D01B294) { - _flagE5 = false; + _acceptInput = false; sendMessage(_attachedSprite, 0x480B, 0); } break; @@ -2353,8 +2349,8 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x1008: speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_frameIndex < speedUpFrameIndex) { - setFileHash(0x35AA8059, speedUpFrameIndex, -1); + if (_currFrameIndex < speedUpFrameIndex) { + startAnimation(0x35AA8059, speedUpFrameIndex, -1); _y = 435; } messageResult = 0; @@ -2396,8 +2392,8 @@ void KmScene1002::suFallDown() { void KmScene1002::sub449E20() { if (!stStartAction(AnimationCallback(&KmScene1002::sub449E20))) { _status2 = 2; - _flagE5 = false; - setFileHash(0x584984B4, 0, -1); + _acceptInput = false; + startAnimation(0x584984B4, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1002::handleMessage449800); @@ -2409,9 +2405,9 @@ void KmScene1002::sub449E20() { void KmScene1002::sub449E90() { _soundResource1.play(0x56548280); _status2 = 0; - _flagE5 = false; + _acceptInput = false; _surface->setVisible(false); - setFileHash(0x5420E254, 0, -1); + startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1002::handleMessage4498E0); @@ -2420,8 +2416,8 @@ void KmScene1002::sub449E90() { void KmScene1002::sub449EF0() { _counter1 = 1; _status2 = 0; - _flagE5 = false; - setFileHash(0x000BAB02, 0, -1); + _acceptInput = false; + startAnimation(0x000BAB02, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); // Weird stuff happening SetMessageHandler(&Klayman::handleMessage41D360); @@ -2436,9 +2432,9 @@ void KmScene1002::sub449F70() { sendMessage(_parentScene, 0x1024, 1); _soundResource1.play(0x41648271); _status2 = 1; - _flagE5 = false; + _acceptInput = false; _flagE1 = false; - setFileHash2(0x000BAB02, 0x88003000, 0); + startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1002::handleMessage41D480); @@ -2453,8 +2449,8 @@ void KmScene1002::sub449F70() { void KmScene1002::stSpitOutFall() { _counter1 = 1; _status2 = 0; - _flagE5 = false; - setFileHash(0x9308C132, 0, -1); + _acceptInput = false; + startAnimation(0x9308C132, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); SetSpriteCallback(&KmScene1002::suFallDown); SetMessageHandler(&Klayman::handleMessage41D480); @@ -2466,8 +2462,8 @@ void KmScene1002::stSpitOutFall() { void KmScene1002::sub44A0D0() { _counter1 = 1; _status2 = 0; - _flagE5 = false; - setFileHash(0x0013A206, 0, -1); + _acceptInput = false; + startAnimation(0x0013A206, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(&KmScene1002::suFallDown); @@ -2480,9 +2476,9 @@ void KmScene1002::sub44A150() { sendMessage(_parentScene, 0x1024, 1); _soundResource1.play(0x41648271); _status2 = 1; - _flagE5 = false; + _acceptInput = false; _flagE1 = false; - setFileHash2(0x0013A206, 0x88003000, 0); + startAnimationByHash(0x0013A206, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D480); SetSpriteCallback(NULL); @@ -2503,8 +2499,8 @@ void KmScene1002::stJumpAndFall() { if (!stStartAction(AnimationCallback(&KmScene1002::stJumpAndFall))) { sendMessage(_parentScene, 0x1024, 3); _status2 = 2; - _flagE5 = false; - setFileHash(0xB93AB151, 0, -1); + _acceptInput = false; + startAnimation(0xB93AB151, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage449D60); SetSpriteCallback(&KmScene1002::suFallDown); @@ -2519,8 +2515,8 @@ void KmScene1002::stDropFromRing() { _attachedSprite = NULL; } _status2 = 2; - _flagE5 = false; - setFileHash(0x586984B1, 0, -1); + _acceptInput = false; + startAnimation(0x586984B1, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D360); SetSpriteCallback(&KmScene1002::suFallDown); @@ -2529,9 +2525,9 @@ void KmScene1002::stDropFromRing() { void KmScene1002::stPressDoorButton() { _status2 = 2; - _flagE5 = true; + _acceptInput = true; setDoDeltaX(0); - setFileHash(0x1CD89029, 0, -1); + startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::hmPressDoorButton); SetSpriteCallback(&Klayman::spriteUpdate41F250); @@ -2539,8 +2535,8 @@ void KmScene1002::stPressDoorButton() { void KmScene1002::stHitByBoxingGlove() { _status2 = 1; - _flagE5 = false; - setFileHash(0x35AA8059, 0, -1); + _acceptInput = false; + startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage449C90); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); @@ -2555,9 +2551,9 @@ void KmScene1002::stMoveVenusFlyTrap() { if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) { _status2 = 2; _flagE4 = false; - _flagE5 = true; + _acceptInput = true; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - setFileHash(0x5C01A870, 0, -1); + startAnimation(0x5C01A870, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); @@ -2567,8 +2563,8 @@ void KmScene1002::stMoveVenusFlyTrap() { void KmScene1002::stContinueMovingVenusFlyTrap() { _flagE4 = false; - _flagE5 = true; - setFileHash2(0x5C01A870, 0x01084280, 0); + _acceptInput = true; + startAnimationByHash(0x5C01A870, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); @@ -2608,7 +2604,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4820: sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klayman::sub420970); + GotoState(&Klayman::stContinueClimbLadderUp); break; case 0x4821: sendMessage(_parentScene, 0x2000, 0); @@ -2635,7 +2631,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::sub420AD0); break; case 0x4828: - GotoState(&Klayman::sub420ED0); + GotoState(&Klayman::stTurnToBackToUse); break; case 0x483F: sub41CD00(param.asInteger()); @@ -2652,7 +2648,7 @@ uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x04684052) { - _flagE5 = true; + _acceptInput = true; sendMessage(_parentScene, 0x2002, 0); } break; @@ -2662,15 +2658,15 @@ uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam ¶m, Entity void KmScene1004::stReadNote() { _status2 = 2; - _flagE5 = false; - setFileHash(0x123E9C9F, 0, -1); + _acceptInput = false; + startAnimation(0x123E9C9F, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1004::hmReadNote); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); } KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty } @@ -2678,14 +2674,14 @@ KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2000: - _flag1 = param.asInteger() != 0; + _isSittingInTeleporter = param.asInteger() != 0; break; case 0x4001: case 0x4800: sub41C930(param.asPoint().x, false); break; case 0x4004: - if (_flag1) + if (_isSittingInTeleporter) GotoState(&Klayman::sub421350); else GotoState(&Klayman::stTryStandIdle); @@ -2703,25 +2699,25 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x481D: - if (_flag1) - GotoState(&Klayman::sub4214D0); + if (_isSittingInTeleporter) + GotoState(&Klayman::stTurnToUseInTeleporter); break; case 0x481E: - if (_flag) - GotoState(&Klayman::sub421510); + if (_isSittingInTeleporter)//CHECKME + GotoState(&Klayman::stReturnFromUseInTeleporter); break; case 0x4834: GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); - _flag1 = true; + _isSittingInTeleporter = true; GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); - _flag1 = false; - GotoState(&Klayman::sub421310); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: sub461F30(); @@ -2749,20 +2745,20 @@ uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam ¶ void KmScene1109::sub461F30() { _status2 = 0; - _flagE5 = false; + _acceptInput = false; SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1109::handleMessage461EA0); - setFileHash(0x2C2A4A1C, 0, -1); + startAnimation(0x2C2A4A1C, 0, -1); } void KmScene1109::sub461F70() { _status2 = 0; - _flagE5 = false; + _acceptInput = false; SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1109::handleMessage461EA0); - setFileHash(0x3C2E4245, 0, -1); + startAnimation(0x3C2E4245, 0, -1); } // KmScene1201 @@ -2770,7 +2766,7 @@ void KmScene1109::sub461F70() { KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464) : Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) { - // TODO setKlaymanTable(dword_4AEF10, 3); + // TODO setKlaymanIdleTable(dword_4AEF10, 3); _flagF6 = true; } @@ -2785,7 +2781,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x480A: - GotoState(&KmScene1201::sub40DF00); + GotoState(&KmScene1201::stMoveObject); break; case 0x4812: GotoState(&Klayman::stPickUpGeneric); @@ -2819,7 +2815,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x481F: GotoState(&Klayman::stWonderAbout); @@ -2867,9 +2863,9 @@ uint32 KmScene1201::hmMatch(int messageNum, const MessageParam ¶m, Entity *s void KmScene1201::stFetchMatch() { if (!stStartAction(AnimationCallback(&KmScene1201::stFetchMatch))) { _status2 = 0; - _flagE5 = false; + _acceptInput = false; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - setFileHash(0x9CAA0218, 0, -1); + startAnimation(0x9CAA0218, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1201::hmMatch); @@ -2879,15 +2875,15 @@ void KmScene1201::stFetchMatch() { void KmScene1201::stLightMatch() { _status2 = 1; - _flagE5 = false; + _acceptInput = false; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - setFileHash(0x1222A513, 0, -1); + startAnimation(0x1222A513, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1201::hmMatch); } -uint32 KmScene1201::handleMessage40DDF0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1201::hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { @@ -2920,33 +2916,33 @@ uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam ¶m, return messageResult; } -void KmScene1201::sub40DF00() { - if (!stStartAction(AnimationCallback(&KmScene1201::sub40DF00))) { +void KmScene1201::stMoveObject() { + if (!stStartAction(AnimationCallback(&KmScene1201::stMoveObject))) { _status2 = 2; - _flagE5 = false; + _acceptInput = false; _countdown = 8; setDoDeltaX(0); - setFileHash(0x0C1CA072, 0, -1); + startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&KmScene1201::update40DBE0); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::handleMessage40DDF0); + SetMessageHandler(&KmScene1201::hmMoveObject); } } void KmScene1201::stMoveObjectSkipTurn() { - _flagE5 = false; - setFileHash2(0x0C1CA072, 0x01084280, 0); + _acceptInput = false; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&KmScene1201::update40DBE0); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::handleMessage40DDF0); + SetMessageHandler(&KmScene1201::hmMoveObject); } void KmScene1201::stTumbleHeadless() { if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stTumbleHeadless))) { _status2 = 1; - _flagE5 = false; + _acceptInput = false; setDoDeltaX(0); - setFileHash(0x2821C590, 0, -1); + startAnimation(0x2821C590, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmTumbleHeadless); @@ -2959,8 +2955,8 @@ void KmScene1201::stTumbleHeadless() { void KmScene1201::sub40E040() { if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::sub40E040))) { _status2 = 1; - _flagE5 = false; - setFileHash(0x5420E254, 0, -1); + _acceptInput = false; + startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D360); @@ -3015,8 +3011,8 @@ void KmScene1303::update4161A0() { void KmScene1303::stPeekWall1() { _status2 = 0; - _flagE5 = true; - setFileHash(0xAC20C012, 8, 37); + _acceptInput = true; + startAnimation(0xAC20C012, 8, 37); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D480); @@ -3025,8 +3021,8 @@ void KmScene1303::stPeekWall1() { void KmScene1303::stPeekWall2() { _status2 = 1; - _flagE5 = false; - setFileHash(0xAC20C012, 43, 49); + _acceptInput = false; + startAnimation(0xAC20C012, 43, 49); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D480); @@ -3035,19 +3031,19 @@ void KmScene1303::stPeekWall2() { void KmScene1303::stPeekWall3() { _counter3 = 0; _status2 = 0; - _flagE5 = true; + _acceptInput = true; _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; - setFileHash(0xAC20C012, 38, 42); + startAnimation(0xAC20C012, 38, 42); SetUpdateHandler(&KmScene1303::update4161A0); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D360); - _newHashListIndex = 42; + _newStickFrameIndex = 42; } void KmScene1303::stPeekWallReturn() { _status2 = 0; - _flagE5 = false; - setFileHash(0x2426932E, 0, -1); + _acceptInput = false; + startAnimation(0x2426932E, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1303::hmPeekWallReturn); @@ -3136,8 +3132,8 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { void KmScene1305::stCrashDown() { _soundResource1.play(0x41648271); _status2 = 1; - _flagE5 = false; - setFileHash2(0x000BAB02, 0x88003000, 0); + _acceptInput = false; + startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&Klayman::handleMessage41D480); @@ -3152,21 +3148,21 @@ void KmScene1305::cbCrashDownEvent() { KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - _flag1 = false; + _isSittingInTeleporter = false; } uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { uint32 messageResult = 0; switch (messageNum) { case 0x2000: - _flag1 = param.asInteger() != 0; + _isSittingInTeleporter = param.asInteger() != 0; break; case 0x4001: case 0x4800: sub41C930(param.asPoint().x, false); break; case 0x4004: - if (_flag1) + if (_isSittingInTeleporter) GotoState(&Klayman::sub421350); else GotoState(&Klayman::stTryStandIdle); @@ -3194,7 +3190,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x481A: - GotoState(&Klayman::sub420680); + GotoState(&Klayman::stInsertDisk); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3204,16 +3200,16 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - if (_flag1) - GotoState(&Klayman::sub4214D0); + if (_isSittingInTeleporter) + GotoState(&Klayman::stTurnToUseInTeleporter); else GotoState(&Klayman::stTurnToUse); break; case 0x481E: - if (_flag1) - GotoState(&Klayman::sub421510); + if (_isSittingInTeleporter) + GotoState(&Klayman::stReturnFromUseInTeleporter); else - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x481F: if (param.asInteger() == 1) { @@ -3234,16 +3230,16 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421030); + GotoState(&Klayman::stWalkToFrontNoStep); } else { - GotoState(&Klayman::sub420FE0); + GotoState(&Klayman::stWalkToFront); } break; case 0x482F: if (param.asInteger() == 1) { - GotoState(&Klayman::sub4210C0); + GotoState(&Klayman::stTurnToFront); } else { - GotoState(&Klayman::sub421070); + GotoState(&Klayman::stTurnToBack); } break; case 0x4834: @@ -3251,13 +3247,13 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); - _flag1 = true; + _isSittingInTeleporter = true; GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); - _flag1 = false; - GotoState(&Klayman::sub421310); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: sub417D40(); @@ -3277,8 +3273,8 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { void KmScene1306::sub417D40() { _status2 = 0; - _flagE5 = false; - setFileHash(0xEE084A04, 0, -1); + _acceptInput = false; + startAnimation(0xEE084A04, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1306::handleMessage417CB0); @@ -3286,8 +3282,8 @@ void KmScene1306::sub417D40() { void KmScene1306::sub417D80() { _status2 = 0; - _flagE5 = false; - setFileHash(0xB86A4274, 0, -1); + _acceptInput = false; + startAnimation(0xB86A4274, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1306::handleMessage417CB0); @@ -3307,9 +3303,9 @@ uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam ¶ } KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _flag1 = false; + : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + + // Empty } uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3329,7 +3325,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x480D: - GotoState(&KmScene1001::sub420C50); + GotoState(&KmScene1001::stUseLever); break; case 0x4812: if (param.asInteger() == 2) { @@ -3348,7 +3344,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 1) { GotoState(&KmScene1308::sub456150); } else { - GotoState(&Klayman::sub420680); + GotoState(&Klayman::stInsertDisk); } break; case 0x481B: @@ -3362,10 +3358,10 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x4827: - GotoState(&Klayman::sub420E20); + GotoState(&Klayman::stReleaseLever); break; case 0x4834: GotoState(&Klayman::stStepOver); @@ -3385,10 +3381,10 @@ uint32 KmScene1308::handleMessage(int messageNum, const MessageParam ¶m, Ent switch (messageNum) { case 0x100D: if (!_flag1 && param.asInteger() == 0x06040580) { - setFileHash3(0xDC409440, 0x46431401, 0); + nextAnimationByHash(0xDC409440, 0x46431401, 0); } else if (_flag1 && param.asInteger() == 0x46431401) { _flag1 = false; - setFileHash2(0xDC409440, 0x01084280, 0); + startAnimationByHash(0xDC409440, 0x01084280, 0); } else if (param.asInteger() == 0x062A1510) { _soundResource1.play(0x41688704); } else if (param.asInteger() == 0x02B20220) { @@ -3431,8 +3427,8 @@ void KmScene1308::sub456150() { gotoState(NULL); sub41C7B0(); } else { - _flagE5 = false; - setFileHash(0xDC409440, 0, -1); + _acceptInput = false; + startAnimation(0xDC409440, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F250); SetMessageHandler(&KmScene1308::handleMessage); @@ -3500,16 +3496,16 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421030); + GotoState(&Klayman::stWalkToFrontNoStep); } else { - GotoState(&Klayman::sub420FE0); + GotoState(&Klayman::stWalkToFront); } break; case 0x482F: if (param.asInteger() == 1) { - GotoState(&Klayman::sub4210C0); + GotoState(&Klayman::stTurnToFront); } else { - GotoState(&Klayman::sub421070); + GotoState(&Klayman::stTurnToBack); } break; } @@ -3555,7 +3551,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; } return 0; @@ -3566,7 +3562,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1403::KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - setKlaymanTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); + setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); } uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3586,7 +3582,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x480D: - GotoState(&KmScene1001::sub420C50); + GotoState(&KmScene1001::stUseLever); break; case 0x4812: if (param.asInteger() == 2) { @@ -3609,7 +3605,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4827: - GotoState(&Klayman::sub420E20); + GotoState(&Klayman::stReleaseLever); break; case 0x483F: sub41CD00(param.asInteger()); @@ -3659,7 +3655,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x481A: - GotoState(&Klayman::sub420680); + GotoState(&Klayman::stInsertDisk); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3672,7 +3668,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x481F: if (param.asInteger() == 1) { @@ -3702,20 +3698,20 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { } uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2032: - _flag1 = param.asInteger() != 0; + _isSittingInTeleporter = param.asInteger() != 0; break; case 0x4001: case 0x4800: sub41C930(param.asPoint().x, false); break; case 0x4004: - if (_flag1) + if (_isSittingInTeleporter) GotoState(&Klayman::sub421350); else GotoState(&Klayman::stTryStandIdle); @@ -3741,12 +3737,12 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - if (_flag1) - GotoState(&Klayman::sub4214D0); + if (_isSittingInTeleporter) + GotoState(&Klayman::stTurnToUseInTeleporter); break; case 0x481E: - if (_flag) - GotoState(&Klayman::sub421510); + if (_isSittingInTeleporter)//CHECKME + GotoState(&Klayman::stReturnFromUseInTeleporter); break; case 0x481F: if (param.asInteger() == 1) { @@ -3770,13 +3766,13 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4835: sendMessage(_parentScene, 0x2032, 1); - _flag1 = true; + _isSittingInTeleporter = true; GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2032, 0); - _flag1 = false; - GotoState(&Klayman::sub421310); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483F: sub41CD00(param.asInteger()); @@ -3791,7 +3787,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1705 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty } @@ -3800,7 +3796,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { uint32 messageResult = 0; switch (messageNum) { case 0x2000: - _flag = param.asInteger() != 0; + _isSittingInTeleporter = param.asInteger() != 0; messageResult = 1; break; case 0x4001: @@ -3808,7 +3804,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - if (_flag) { + if (_isSittingInTeleporter) { GotoState(&Klayman::sub421350); } else { GotoState(&Klayman::stTryStandIdle); @@ -3838,13 +3834,13 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - if (_flag) { - GotoState(&Klayman::sub4214D0); + if (_isSittingInTeleporter) { + GotoState(&Klayman::stTurnToUseInTeleporter); } break; case 0x481E: - if (_flag) { - GotoState(&Klayman::sub421510); + if (_isSittingInTeleporter) { + GotoState(&Klayman::stReturnFromUseInTeleporter); } break; case 0x481F: @@ -3865,13 +3861,13 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); - _flag = true; + _isSittingInTeleporter = true; GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); - _flag = false; - GotoState(&Klayman::sub421310); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: sub468AD0(); @@ -3909,8 +3905,8 @@ void KmScene1705::spriteUpdate468A30() { void KmScene1705::stFallSkipJump() { _status2 = 2; - _flagE5 = false; - setFileHash2(0xB93AB151, 0x40A100F8, 0); + _acceptInput = false; + startAnimationByHash(0xB93AB151, 0x40A100F8, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&KmScene1705::spriteUpdate468A30); SetMessageHandler(&Klayman::handleMessage41D360); @@ -3919,8 +3915,8 @@ void KmScene1705::stFallSkipJump() { void KmScene1705::sub468AD0() { _status2 = 0; - _flagE5 = false; - setFileHash(0x5E0A4905, 0, -1); + _acceptInput = false; + startAnimation(0x5E0A4905, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1705::handleMessage4689A0); @@ -3928,8 +3924,8 @@ void KmScene1705::sub468AD0() { void KmScene1705::sub468B10() { _status2 = 0; - _flagE5 = false; - setFileHash(0xD86E4477, 0, -1); + _acceptInput = false; + startAnimation(0xD86E4477, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene1705::handleMessage4689A0); @@ -3958,7 +3954,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -3975,7 +3971,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _flag(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty } @@ -3983,14 +3979,14 @@ KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2000: - _flag = param.asInteger() != 0; + _isSittingInTeleporter = param.asInteger() != 0; break; case 0x4001: case 0x4800: sub41C930(param.asPoint().x, false); break; case 0x4004: - if (_flag) { + if (_isSittingInTeleporter) { GotoState(&Klayman::sub421350); } else { GotoState(&Klayman::stTryStandIdle); @@ -4009,13 +4005,13 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C7B0(); break; case 0x481D: - if (_flag) { - GotoState(&Klayman::sub4214D0); + if (_isSittingInTeleporter) { + GotoState(&Klayman::stTurnToUseInTeleporter); } break; case 0x481E: - if (_flag) { - GotoState(&Klayman::sub421510); + if (_isSittingInTeleporter) { + GotoState(&Klayman::stReturnFromUseInTeleporter); } break; case 0x4834: @@ -4023,13 +4019,13 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); - _flag = true; + _isSittingInTeleporter = true; GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); - _flag = false; - GotoState(&Klayman::sub421310); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: sub440230(); @@ -4057,8 +4053,8 @@ uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam ¶ void KmScene2001::sub440230() { _status2 = 0; - _flagE5 = false; - setFileHash(0xBE68CC54, 0, -1); + _acceptInput = false; + startAnimation(0xBE68CC54, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene2001::handleMessage4401A0); @@ -4066,15 +4062,15 @@ void KmScene2001::sub440230() { void KmScene2001::stDoTeleport() { _status2 = 0; - _flagE5 = false; - setFileHash(0x18AB4ED4, 0, -1); + _acceptInput = false; + startAnimation(0x18AB4ED4, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene2001::handleMessage4401A0); } KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty } @@ -4083,7 +4079,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { uint32 messageResult = 0; switch (messageNum) { case 0x2000: - _flag1 = param.asInteger() != 0; + _isSittingInTeleporter = param.asInteger() != 0; messageResult = 1; break; case 0x4001: @@ -4091,7 +4087,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(param.asPoint().x, false); break; case 0x4004: - if (_flag1) + if (_isSittingInTeleporter) GotoState(&Klayman::sub421350); else GotoState(&Klayman::stTryStandIdle); @@ -4129,25 +4125,25 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481D: - if (_flag1) - GotoState(&Klayman::sub4214D0); + if (_isSittingInTeleporter) + GotoState(&Klayman::stTurnToUseInTeleporter); break; case 0x481E: - if (_flag) - GotoState(&Klayman::sub421510); + if (_isSittingInTeleporter)//CHECKME + GotoState(&Klayman::stReturnFromUseInTeleporter); break; case 0x4834: GotoState(&Klayman::stStepOver); break; case 0x4835: sendMessage(_parentScene, 0x2000, 1); - _flag1 = true; + _isSittingInTeleporter = true; GotoState(&Klayman::stSitInTeleporter); break; case 0x4836: sendMessage(_parentScene, 0x2000, 0); - _flag1 = false; - GotoState(&Klayman::sub421310); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: sub486320(); @@ -4165,8 +4161,8 @@ uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x1008: speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_frameIndex < speedUpFrameIndex) { - setFileHash(0x35AA8059, speedUpFrameIndex, -1); + if (_currFrameIndex < speedUpFrameIndex) { + startAnimation(0x35AA8059, speedUpFrameIndex, -1); _y = 438; } messageResult = 0; @@ -4198,8 +4194,8 @@ uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam ¶ void KmScene2101::sub4862C0() { _status2 = 1; - _flagE5 = false; - setFileHash(0x35AA8059, 0, -1); + _acceptInput = false; + startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene2101::handleMessage486160); @@ -4208,8 +4204,8 @@ void KmScene2101::sub4862C0() { void KmScene2101::sub486320() { _status2 = 0; - _flagE5 = false; - setFileHash(0xFF290E30, 0, -1); + _acceptInput = false; + startAnimation(0xFF290E30, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene2101::handleMessage486230); @@ -4217,8 +4213,8 @@ void KmScene2101::sub486320() { void KmScene2101::sub486360() { _status2 = 0; - _flagE5 = false; - setFileHash(0x9A28CA1C, 0, -1); + _acceptInput = false; + startAnimation(0x9A28CA1C, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); SetMessageHandler(&KmScene2101::handleMessage486230); @@ -4267,7 +4263,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4275,16 +4271,16 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421030); + GotoState(&Klayman::stWalkToFrontNoStep); } else { - GotoState(&Klayman::sub420FE0); + GotoState(&Klayman::stWalkToFront); } break; case 0x482F: if (param.asInteger() == 1) { - GotoState(&Klayman::sub4210C0); + GotoState(&Klayman::stTurnToFront); } else { - GotoState(&Klayman::sub421070); + GotoState(&Klayman::stTurnToBack); } break; case 0x483F: @@ -4337,10 +4333,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41C930(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4819: - GotoState(&Klayman::sub420750); + GotoState(&Klayman::stClayDoorOpen); break; case 0x481A: - GotoState(&Klayman::sub420680); + GotoState(&Klayman::stInsertDisk); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4353,7 +4349,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUse); break; case 0x481E: - GotoState(&Klayman::sub4207F0); + GotoState(&Klayman::stReturnFromUse); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4375,7 +4371,7 @@ KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } void KmScene2205::xUpdate() { - setGlobalVar(0x18288913, _frameIndex); + setGlobalVar(0x18288913, _currFrameIndex); } uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4423,12 +4419,12 @@ void KmScene2205::sub423980() { frameIndex = 0; _status2 = 0; _flagE1 = true; - _flagE5 = true; - setFileHash(0x1A249001, frameIndex, -1); + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - NextState(&Klayman::sub41FA40); + NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4443,7 +4439,7 @@ KmScene2206::~KmScene2206() { } void KmScene2206::xUpdate() { - setGlobalVar(0x18288913, _frameIndex); + setGlobalVar(0x18288913, _currFrameIndex); } uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4512,16 +4508,16 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482E: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421030); + GotoState(&Klayman::stWalkToFrontNoStep); } else { - GotoState(&Klayman::sub420FE0); + GotoState(&Klayman::stWalkToFront); } break; case 0x482F: if (param.asInteger() == 1) { - GotoState(&Klayman::sub4210C0); + GotoState(&Klayman::stTurnToFront); } else { - GotoState(&Klayman::sub421070); + GotoState(&Klayman::stTurnToBack); } break; case 0x4837: @@ -4549,9 +4545,9 @@ void KmScene2206::sub482490() { if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::sub482490))) { _status2 = 1; sendMessage(_parentScene, 0x4803, 0); - _flagE5 = false; + _acceptInput = false; _yDelta = 0; - setFileHash(0x5420E254, 0, -1); + startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(&KmScene2206::spriteUpdate482450); @@ -4565,12 +4561,12 @@ void KmScene2206::sub482530() { frameIndex = 0; _status2 = 0; _flagE1 = true; - _flagE5 = true; - setFileHash(0x1A249001, frameIndex, -1); + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - NextState(&Klayman::sub41FA40); + NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4622,7 +4618,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4827: - GotoState(&Klayman::sub420E20); + GotoState(&Klayman::stReleaseLever); break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4647,8 +4643,8 @@ void KmScene2207::spriteUpdate442430() { void KmScene2207::sub442460() { if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::sub442460))) { _status2 = 1; - _flagE5 = true; - setFileHash(0x5420E254, 0, -1); + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&KmScene2207::spriteUpdate442430); SetMessageHandler(&Klayman::handleMessage41D360); @@ -4658,11 +4654,11 @@ void KmScene2207::sub442460() { void KmScene2207::sub4424B0() { if (!stStartAction(AnimationCallback(&KmScene2207::sub4424B0))) { _status2 = 0; - if (_flagF7) { - stReleaseLeverUp(); + if (_isLeverDown) { + stUseLeverRelease(); } else { - _flagE5 = false; - setFileHash(0x0C303040, 0, -1); + _acceptInput = false; + startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&KmScene2207::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); @@ -4672,27 +4668,27 @@ void KmScene2207::sub4424B0() { } void KmScene2207::sub442520() { - setFileHash(0x0D318140, 0, -1); + startAnimation(0x0D318140, 0, -1); sendMessage(_attachedSprite, 0x480F, 0); NextState(&KmScene2207::sub442560); } void KmScene2207::sub442560() { - setFileHash(0x1564A2C0, 0, -1); + startAnimation(0x1564A2C0, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); NextState(&KmScene2207::sub4425A0); - _flagE5 = true; - _flagF7 = true; + _acceptInput = true; + _isLeverDown = true; } void KmScene2207::sub4425A0() { - setFileHash(0x4464A440, 0, -1); + startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteCallback(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D360); - _flagE5 = true; - _flagF7 = true; + _acceptInput = true; + _isLeverDown = true; } KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4701,7 +4697,7 @@ KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } void KmScene2242::xUpdate() { - setGlobalVar(0x18288913, _frameIndex); + setGlobalVar(0x18288913, _currFrameIndex); } uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4771,12 +4767,12 @@ void KmScene2242::sub444D20() { frameIndex = 0; _status2 = 0; _flagE1 = true; - _flagE5 = true; - setFileHash(0x1A249001, frameIndex, -1); + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - NextState(&Klayman::sub41FA40); + NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4786,7 +4782,7 @@ KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 } void KmHallOfRecords::xUpdate() { - setGlobalVar(0x18288913, _frameIndex); + setGlobalVar(0x18288913, _currFrameIndex); } uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4840,12 +4836,12 @@ void KmHallOfRecords::sub43B130() { frameIndex = 0; _status2 = 0; _flagE1 = true; - _flagE5 = true; - setFileHash(0x1A249001, frameIndex, -1); + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - NextState(&Klayman::sub41FA40); + NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4855,7 +4851,7 @@ KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } void KmScene2247::xUpdate() { - setGlobalVar(0x18288913, _frameIndex); + setGlobalVar(0x18288913, _currFrameIndex); } uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4909,12 +4905,12 @@ void KmScene2247::sub453520() { frameIndex = 0; _status2 = 0; _flagE1 = true; - _flagE5 = true; - setFileHash(0x1A249001, frameIndex, -1); + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); SetSpriteCallback(&Klayman::spriteUpdate41F300); - NextState(&Klayman::sub41FA40); + NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 645ed74226..3b8ee69262 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -36,7 +36,7 @@ class Klayman; const uint32 kKlaymanSpeedUpHash = 0x004A2148; -struct KlaymanTableItem { +struct KlaymanIdleTableItem { int value; void (Klayman::*callback)(); }; @@ -66,61 +66,61 @@ public: void stTurnAwayFromUse(); void stWonderAbout(); void stPeekWall(); - void sub420210(); - void sub4201C0(); + void stJumpToRing1(); + void setupJumpToRing(); void sub420340(); - void sub420250(); - void sub420290(); - void sub420380(); - void sub4203C0(); - void sub420300(); - void sub420970(); + void stJumpToRing2(); + void stJumpToRing3(); + void stHoldRing(); + void stReleaseRing(); + void stJumpToRing4(); + void stContinueClimbLadderUp(); void sub4209D0(); void sub420BC0(); void sub420AD0(); - void sub421030(); - void sub420FE0(); - void sub4210C0(); - void sub421070(); + void stWalkToFrontNoStep(); + void stWalkToFront(); + void stTurnToFront(); + void stTurnToBack(); void stLandOnFeet(); - void sub420ED0(); - void sub420750(); + void stTurnToBackToUse(); + void stClayDoorOpen(); void stTurnToUse(); - void sub4207F0(); - void sub420F20(); + void stReturnFromUse(); + void stWalkingOpenDoor(); void sub421350(); void stIdleSitBlink(); void stIdleSitBlinkSecond(); void stPickUpNeedle(); void sub41FFF0(); - void sub4214D0(); - void sub421510(); + void stTurnToUseInTeleporter(); + void stReturnFromUseInTeleporter(); void stStepOver(); void stSitInTeleporter(); - void sub421310(); + void stGetUpFromTeleporter(); void stMoveObjectSkipTurnFaceObject(); void sub420660(); void stMoveObjectSkipTurn(); void stMoveObjectFaceObject(); - void sub420C50(); + void stUseLever(); void stPullLeverDown(); void stHoldLeverDown(); - void stReleaseLeverUp(); - void sub420E20(); - void sub420E90(); - void sub420EB0(); - void sub420680(); + void stUseLeverRelease(); + void stReleaseLever(); + void stLetGoOfLever(); + void cbLeverReleasedEvent(); + void stInsertDisk(); void stWalking(); - void sub41FA40(); + void stUpdateWalking(); void stStartWalkingDone(); void sub41CE70(); void spriteUpdate41F250(); - void spriteUpdate41F5F0(); + void suWalking(); void suLargeStep(); void spriteUpdate41F230(); - void spriteUpdate41F5A0(); + void suWalkingOpenDoor(); void spriteUpdate41F300(); void spriteUpdate41F320(); @@ -129,10 +129,10 @@ public: uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); - void setKlaymanTable(const KlaymanTableItem *table, int tableCount); - void setKlaymanTable1(); - void setKlaymanTable2(); - void setKlaymanTable3(); + void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount); + void setKlaymanIdleTable1(); + void setKlaymanIdleTable2(); + void setKlaymanIdleTable3(); void setSoundFlag(bool value) { _soundFlag = value; } @@ -144,23 +144,23 @@ protected: bool _flagE2; bool _flagE3; bool _flagE4; - bool _flagE5; + bool _acceptInput; int16 _x4, _y4; int16 _counter, _counterMax; int16 _counter3, _counter3Max; int16 _counter1; int16 _counter2; bool _flagF6; - bool _flagF7; + bool _isLeverDown; bool _flagF8; int _status2; bool _flagFA; SoundResource _soundResource1; SoundResource _soundResource2; int _status3; - const KlaymanTableItem *_table; - int _tableCount; - int _tableMaxValue; + const KlaymanIdleTableItem *_idleTable; + int _idleTableCount; + int _idleTableMaxValue; uint32 _field114; /* 00000118 field118 dw ? @@ -200,7 +200,7 @@ protected: void stStand(); void stStandAround(); - uint32 handleMessage41F140(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); void sub41C930(int16 x, bool flag); @@ -209,11 +209,11 @@ protected: bool stStartAction(AnimationCb callback3); void stSneak(); - void stSneakDone(); - uint32 handleMessage41DD80(int messageNum, const MessageParam ¶m, Entity *sender); + void stWalkingDone(); + uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); void sub41CD70(int16 x); void stStartWalking(); - uint32 handleMessage41EC70(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entity *sender); @@ -226,24 +226,24 @@ protected: void stLargeStepDone(); uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41EEF0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D790(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D880(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41DAA0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmHoldRing(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E0D0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E490(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E290(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E2F0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D640(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41EAB0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D970(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41DD20(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); void update41D1C0(); - uint32 handleMessage41DB90(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -306,7 +306,7 @@ class KmScene1109 : public Klayman { public: KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag1; + bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage461EA0(int messageNum, const MessageParam ¶m, Entity *sender); void sub461F30(); @@ -324,9 +324,9 @@ protected: uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); void stFetchMatch(); void stLightMatch(); - uint32 handleMessage40DDF0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40DF00(); + void stMoveObject(); void stMoveObjectSkipTurn(); void stTumbleHeadless(); void sub40E040(); @@ -365,7 +365,7 @@ class KmScene1306 : public Klayman { public: KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag1; + bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage417CB0(int messageNum, const MessageParam ¶m, Entity *sender); void sub417D40(); @@ -414,7 +414,7 @@ class KmScene1608 : public Klayman { public: KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag1; + bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; @@ -422,7 +422,7 @@ class KmScene1705 : public Klayman { public: KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag; + bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage4689A0(int messageNum, const MessageParam ¶m, Entity *sender); void spriteUpdate468A30(); @@ -442,7 +442,7 @@ class KmScene2001 : public Klayman { public: KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag; + bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage4401A0(int messageNum, const MessageParam ¶m, Entity *sender); void sub440230(); @@ -453,7 +453,7 @@ class KmScene2101 : public Klayman { public: KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag1; + bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 handleMessage486160(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage486230(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index b60c3182d0..ea1400e965 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -133,7 +133,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, handleMessage2000h(); break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return 0; @@ -144,12 +144,12 @@ void AsScene1001Door::handleMessage2000h() { case 0: case 1: _soundResource1.play(0x65482F03); - setFileHash(0x624C0498, 1, 3); + startAnimation(0x624C0498, 1, 3); NextState(&AsScene1001Door::callback1); break; case 2: _soundResource2.play(); - setFileHash(0x624C0498, 6, 6); + startAnimation(0x624C0498, 6, 6); NextState(&AsScene1001Door::callback2); break; default: @@ -162,27 +162,27 @@ void AsScene1001Door::handleMessage2000h() { void AsScene1001Door::callback1() { switch (getGlobalVar(0x52371C95)) { case 1: - setFileHash(0x624C0498, 4, -1); - _newHashListIndex = 4; + startAnimation(0x624C0498, 4, -1); + _newStickFrameIndex = 4; break; case 2: - setFileHash(0x624C0498, 1, -1); - _newHashListIndex = 1; + startAnimation(0x624C0498, 1, -1); + _newStickFrameIndex = 1; break; case 3: stopAnimation(); setVisible(false); break; default: - setFileHash(0x624C0498, 0, -1); - _newHashListIndex = 0; + startAnimation(0x624C0498, 0, -1); + _newStickFrameIndex = 0; break; } } void AsScene1001Door::callback2() { setGlobalVar(0xD217189D, 1); - setFileHash(0x624C0498, 6, 6); + startAnimation(0x624C0498, 6, 6); NextState(&AsScene1001Door::callback3); _x = 30; } @@ -199,8 +199,8 @@ AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) _x = 547; _y = 206; createSurface(900, 177, 192); - setFileHash(0x022C90D4, -1, -1); - _newHashListIndex = -2; + startAnimation(0x022C90D4, -1, -1); + _newStickFrameIndex = -2; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1001Hammer::handleMessage); } @@ -216,9 +216,9 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ } break; case 0x2000: - setFileHash(0x022C90D4, 1, -1); + startAnimation(0x022C90D4, 1, -1); _soundResource.play(0xE741020A); - _newHashListIndex = -2; + _newStickFrameIndex = -2; break; } return 0; @@ -230,8 +230,8 @@ AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm) _x = 320; _y = 240; createSurface(100, 66, 129); - setFileHash(0xC68C2299, 0, -1); - _newHashListIndex = 0; + startAnimation(0xC68C2299, 0, -1); + _newStickFrameIndex = 0; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1001Window::handleMessage); } @@ -245,7 +245,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ } break; case 0x2001: - setFileHash(0xC68C2299, 0, -1); + startAnimation(0xC68C2299, 0, -1); break; case 0x3002: SetMessageHandler(NULL); @@ -261,8 +261,8 @@ AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int1 createSurface(1010, 71, 73); setDoDeltaX(deltaXType); - setFileHash(0x04A98C36, 0, -1); - _newHashListIndex = 0; + startAnimation(0x04A98C36, 0, -1); + _newStickFrameIndex = 0; _x = x; _y = y; SetUpdateHandler(&AnimatedSprite::update); @@ -284,11 +284,11 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m messageResult = 1; break; case 0x3002: - setFileHash(0x04A98C36, 0, -1); - _newHashListIndex = 0; + startAnimation(0x04A98C36, 0, -1); + _newStickFrameIndex = 0; break; case 0x480F: - setFileHash(0x04A98C36, 0, -1); + startAnimation(0x04A98C36, 0, -1); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -504,15 +504,15 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f if (flag1) { createSurface(990, 68, 314); if (flag2) { - setFileHash(0x04103090, 0, -1); + startAnimation(0x04103090, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447930); } else { - setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); + startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); } } else { createSurface(990, 68, 138); - setFileHash(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); + startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); } @@ -538,16 +538,16 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam & sendMessage(_parentScene, 0x4806, 0); SetMessageHandler(&AsScene1002Ring::handleMessage447760); if (_flag1) { - setFileHash(0x87502558, 0, -1); + startAnimation(0x87502558, 0, -1); } else { - setFileHash(0x80DD4010, 0, -1); + startAnimation(0x80DD4010, 0, -1); } break; case 0x480F: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); sendMessage(_parentScene, 0x480F, 0); SetMessageHandler(&AsScene1002Ring::handleMessage447890); - setFileHash(0x861A2020, 0, -1); + startAnimation(0x861A2020, 0, -1); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -564,17 +564,17 @@ uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam & switch (messageNum) { case 0x3002: if (_flag1) { - setFileHash(0x78D0A812, 0, -1); + startAnimation(0x78D0A812, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447930); } else { - setFileHash(0xB85D2A10, 0, -1); + startAnimation(0xB85D2A10, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447930); } break; case 0x4807: sendMessage(_parentScene, 0x4807, 0); setDoDeltaX(_vm->_rnd->getRandomNumber(1)); - setFileHash(0x8258A030, 0, -1); + startAnimation(0x8258A030, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447A00); break; case 0x482A: @@ -591,7 +591,7 @@ uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam & uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - setFileHash(0x04103090, 0, -1); + startAnimation(0x04103090, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447930); break; case 0x482A: @@ -610,7 +610,7 @@ uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam & case 0x4807: sendMessage(_parentScene, 0x4807, 0); setDoDeltaX(_vm->_rnd->getRandomNumber(1)); - setFileHash(0x8258A030, 0, -1); + startAnimation(0x8258A030, 0, -1); SetMessageHandler(&AsScene1002Ring::handleMessage447A00); break; case 0x482A: @@ -632,7 +632,7 @@ uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam & } break; case 0x3002: - setFileHash(0xA85C4011, 0, -1); + startAnimation(0xA85C4011, 0, -1); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -730,7 +730,7 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam ¶m, Entity case 0x2004: _x = ((Sprite*)sender)->getX() - 98; _y = ((Sprite*)sender)->getY() - 111; - setFileHash(0x0422255A, 0, -1); + startAnimation(0x0422255A, 0, -1); setVisible(true); break; case 0x3002: @@ -752,7 +752,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce setClipRect(clipRect); spriteUpdate448AA0(); _soundResource.load(0xC0C40298); - setFileHash(0x586C1D48, 0, 0); + startAnimation(0x586C1D48, 0, 0); } uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -776,7 +776,7 @@ uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessagePara uint32 messageResult = handleMessage4489D0(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -790,14 +790,14 @@ void AsScene1002DoorSpy::spriteUpdate448AA0() { void AsScene1002DoorSpy::sub448AC0() { setClipRect(_rect); _parentScene->setSurfacePriority(getSurface(), 800); - setFileHash(0x586C1D48, 0, 0); + startAnimation(0x586C1D48, 0, 0); SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); } void AsScene1002DoorSpy::sub448B10() { setClipRect(0, 0, 640, 480); _parentScene->setSurfacePriority(getSurface(), 1200); - setFileHash(0x586C1D48, 1, -1); + startAnimation(0x586C1D48, 1, -1); SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60); NextState(&AsScene1002DoorSpy::sub448AC0); } @@ -937,7 +937,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par void AsScene1002VenusFlyTrap::update() { if (_countdown != 0 && (--_countdown == 0)) { - removeCallbacks(); + gotoNextState(); } AnimatedSprite::update(); } @@ -1025,7 +1025,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const Messag uint32 messageResult = handleMessage448000(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -1054,7 +1054,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag } break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x482A: sendMessage(_parentScene, 0x1022, 995); @@ -1068,14 +1068,14 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag void AsScene1002VenusFlyTrap::sub4484F0() { setDoDeltaX(2); - setFileHash(0xC4080034, 0, -1); + startAnimation(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); NextState(&AsScene1002VenusFlyTrap::sub448660); } void AsScene1002VenusFlyTrap::sub448530() { - setFileHash(0xC4080034, 0, -1); + startAnimation(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); NextState(&AsScene1002VenusFlyTrap::sub448660); @@ -1083,7 +1083,7 @@ void AsScene1002VenusFlyTrap::sub448530() { void AsScene1002VenusFlyTrap::sub448560() { sendMessage(_parentScene, 0x4807, 0); - setFileHash(0x82292851, 0, -1); + startAnimation(0x82292851, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); NextState(&AsScene1002VenusFlyTrap::sub448660); @@ -1091,20 +1091,20 @@ void AsScene1002VenusFlyTrap::sub448560() { void AsScene1002VenusFlyTrap::sub4485B0() { setDoDeltaX(1); - setFileHash(0x86A82A11, 0, -1); + startAnimation(0x86A82A11, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); NextState(&AsScene1002VenusFlyTrap::sub4485F0); } void AsScene1002VenusFlyTrap::sub4485F0() { - setFileHash(0xB5A86034, 0, -1); + startAnimation(0xB5A86034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); } void AsScene1002VenusFlyTrap::sub448620() { - setFileHash(0x31303094, 0, -1); + startAnimation(0x31303094, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(NULL); NextState(&AsScene1002VenusFlyTrap::sub448720); @@ -1112,7 +1112,7 @@ void AsScene1002VenusFlyTrap::sub448620() { } void AsScene1002VenusFlyTrap::sub448660() { - setFileHash(0xC8204250, 0, -1); + startAnimation(0xC8204250, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update447FB0); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); if (_flag) { @@ -1133,14 +1133,14 @@ void AsScene1002VenusFlyTrap::sub448660() { } void AsScene1002VenusFlyTrap::sub448720() { - setFileHash(0x152920C4, 0, -1); + startAnimation(0x152920C4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); NextState(&AsScene1002VenusFlyTrap::sub448750); } void AsScene1002VenusFlyTrap::sub448750() { - setFileHash(0x84001117, 0, -1); + startAnimation(0x84001117, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); NextState(&AsScene1002VenusFlyTrap::sub448660); @@ -1154,7 +1154,7 @@ void AsScene1002VenusFlyTrap::sub448780() { setDoDeltaX(_x > 320 ? 1 : 0); } sendMessage(_klayman, 0x2001, 0); - setFileHash(0x8C2C80D4, 0, -1); + startAnimation(0x8C2C80D4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); NextState(&AsScene1002VenusFlyTrap::sub448620); @@ -1168,8 +1168,8 @@ Class506::Class506(NeverhoodEngine *vm) _x = 320; _y = 240; if (getGlobalVar(0x8306F218)) { - setFileHash(0x004A4495, -1, -1); - _newHashListIndex = -2; + startAnimation(0x004A4495, -1, -1); + _newStickFrameIndex = -2; } else { setVisible(false); } @@ -1207,21 +1207,21 @@ uint32 Class506::handleMessage449210(int messageNum, const MessageParam ¶m, uint32 messageResult = handleMessage4491B0(messageNum, param, sender); switch (messageResult) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; } void Class506::sub449250() { - setFileHash(0x004A4495, 0, -1); + startAnimation(0x004A4495, 0, -1); SetMessageHandler(&Class506::handleMessage4491B0); - _newHashListIndex = -2; + _newStickFrameIndex = -2; setVisible(true); } void Class506::sub449280() { - setFileHash(0x004A4495, -1, -1); + startAnimation(0x004A4495, -1, -1); _playBackwards = true; SetMessageHandler(&Class506::handleMessage449210); NextState(&Class506::sub4492C0); @@ -1244,15 +1244,15 @@ Class478::Class478(NeverhoodEngine *vm, Klayman *klayman) void Class478::update() { if (_klayman->getCurrAnimFileHash() == 0x3A292504) { - setFileHash(0xBA280522, _frameIndex, -1); - _newHashListIndex = _klayman->getFrameIndex(); + startAnimation(0xBA280522, _currFrameIndex, -1); + _newStickFrameIndex = _klayman->getFrameIndex(); setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); } else if (_klayman->getCurrAnimFileHash() == 0x122D1505) { - setFileHash(0x1319150C, _frameIndex, -1); - _newHashListIndex = _klayman->getFrameIndex(); + startAnimation(0x1319150C, _currFrameIndex, -1); + _newStickFrameIndex = _klayman->getFrameIndex(); setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); @@ -1275,8 +1275,8 @@ Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman) void Class479::update() { if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) { - setFileHash(0x9820C913, _klayman->getFrameIndex(), -1); - _newHashListIndex = _klayman->getFrameIndex(); + startAnimation(0x9820C913, _klayman->getFrameIndex(), -1); + _newStickFrameIndex = _klayman->getFrameIndex(); setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); @@ -1606,7 +1606,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa } break; case 0x2002: - setFileHash(0xEB312C11, 0, -1); + startAnimation(0xEB312C11, 0, -1); setVisible(true); break; case 0x3002: diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 52c9d92a33..1efd7e3ea7 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -348,8 +348,8 @@ AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentSce _y = 240; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1105TeddyBear::handleMessage); - setFileHash(0x65084002, 0, -1); - _newHashListIndex = 0; + startAnimation(0x65084002, 0, -1); + _newStickFrameIndex = 0; setVisible(false); _needRefresh = true; updatePosition(); @@ -362,10 +362,10 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x2002: if (getGlobalVar(0x610210B7)) { - setFileHash(0x6B0C0432, 0, -1); + startAnimation(0x6B0C0432, 0, -1); _soundResource1.play(); } else { - setFileHash(0x65084002, 0, -1); + startAnimation(0x65084002, 0, -1); _soundResource2.play(); } break; @@ -706,10 +706,10 @@ uint32 Scene1109::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004B63A8); - _klayman->setKlaymanTable3(); + _klayman->setKlaymanIdleTable3(); } else { setRectList(0x004B6398); - _klayman->setKlaymanTable1(); + _klayman->setKlaymanIdleTable1(); } break; } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 25abf95643..fc28917734 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -250,18 +250,18 @@ uint32 Class466::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Class466::sub40D340() { - setFileHash(0x928F0C10, 0, -1); - _newHashListIndex = 0; + startAnimation(0x928F0C10, 0, -1); + _newStickFrameIndex = 0; } void Class466::sub40D360() { - setFileHash(0x928F0C10, 1, -1); - _newHashListIndex = -2; + startAnimation(0x928F0C10, 1, -1); + _newStickFrameIndex = -2; } void Class466::sub40D380() { - setFileHash(0x928F0C10, 15, -1); - _newHashListIndex = -2; + startAnimation(0x928F0C10, 15, -1); + _newStickFrameIndex = -2; } AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag) @@ -272,10 +272,10 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, _y = 240; SetUpdateHandler(&AsScene1201RightDoor::update); SetMessageHandler(&AsScene1201RightDoor::handleMessage); - _newHashListIndex = -2; + _newStickFrameIndex = -2; if (flag) { - setFileHash(0xD088AC30, -1, -1); - _newHashListIndex = -2; + startAnimation(0xD088AC30, -1, -1); + _newStickFrameIndex = -2; _countdown = 25; } else { stopAnimation(); @@ -294,7 +294,7 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4829: sub40D7E0(); @@ -304,14 +304,14 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p } void AsScene1201RightDoor::sub40D7E0() { - setFileHash(0xD088AC30, 0, -1); - _newHashListIndex = -2; + startAnimation(0xD088AC30, 0, -1); + _newStickFrameIndex = -2; setVisible(true); _soundResource.play(calcHash("fxDoorOpen20")); } void AsScene1201RightDoor::sub40D830() { - setFileHash(0xD088AC30, -1, -1); + startAnimation(0xD088AC30, -1, -1); _playBackwards = true; setVisible(true); _soundResource.play(calcHash("fxDoorClose20")); @@ -339,13 +339,13 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity case 0x2006: _x = 436; _y = 339; - setFileHash(0xA060C599, 0, -1); + startAnimation(0xA060C599, 0, -1); setVisible(true); break; case 0x3002: stopAnimation(); setVisible(false); - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -402,7 +402,7 @@ uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -413,13 +413,13 @@ void AsScene1201TntMan::spriteUpdate40CD10() { } void AsScene1201TntMan::sub40CD30() { - setFileHash(0x654913D0, 0, -1); + startAnimation(0x654913D0, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); SetSpriteCallback(NULL); } void AsScene1201TntMan::sub40CD60() { - setFileHash(0x356803D0, 0, -1); + startAnimation(0x356803D0, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); NextState(&AsScene1201TntMan::sub40CD30); @@ -429,10 +429,10 @@ void AsScene1201TntMan::sub40CD90() { // TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true); // TODO Sound1ChList_playLooping(0x4B044624); _flag = true; - setFileHash(0x85084190, 0, -1); + startAnimation(0x85084190, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); SetSpriteCallback(&AsScene1201TntMan::spriteUpdate40CD10); - _newHashListIndex = -2; + _newStickFrameIndex = -2; } Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) @@ -442,7 +442,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) SetUpdateHandler(&Class465::update); SetMessageHandler(&Sprite::handleMessage); SetSpriteCallback(&Class465::spriteUpdate40D150); - setFileHash(0x828C0411, 0, -1); + startAnimation(0x828C0411, 0, -1); setVisible(false); } @@ -499,7 +499,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) void AsScene1201Match::update() { if (_countdown != 0 && (--_countdown == 0)) { - removeCallbacks(); + gotoNextState(); } updateAnim(); handleSpriteUpdate(); @@ -522,7 +522,7 @@ uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam uint32 messageResult = handleMessage40C2D0(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -544,7 +544,7 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam } void AsScene1201Match::sub40C3E0() { - setFileHash(0x00842374, 0, -1); + startAnimation(0x00842374, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C320); if (_status == 0) { NextState(&AsScene1201Match::sub40C420); @@ -557,15 +557,15 @@ void AsScene1201Match::sub40C420() { setGlobalVar(0x0112090A, 2); _x -= 199; _y += 119; - setFileHash(0x018D0240, 0, -1); + startAnimation(0x018D0240, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C320); NextState(&AsScene1201Match::sub40C4F0); } void AsScene1201Match::sub40C470() { - setFileHash(0x00842374, 0, -1); + startAnimation(0x00842374, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C2D0); - _newHashListIndex = 0; + _newStickFrameIndex = 0; if (_status != 0) { _countdown = 36; _status--; @@ -574,18 +574,18 @@ void AsScene1201Match::sub40C470() { } void AsScene1201Match::sub40C4C0() { - setFileHash(0x00842374, 0, -1); + startAnimation(0x00842374, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C360); - _newHashListIndex = 0; + _newStickFrameIndex = 0; } void AsScene1201Match::sub40C4F0() { setDoDeltaX(1); _x = 403; _y = 337; - setFileHash(0x00842374, 0, -1); + startAnimation(0x00842374, 0, -1); SetMessageHandler(&AsScene1201Match::handleMessage40C360); - _newHashListIndex = 0; + _newStickFrameIndex = 0; } AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman) @@ -607,7 +607,7 @@ void AsScene1201Creature::update() { if (_flag != oldFlag) sub40C8E0(); if (_countdown1 != 0 && (--_countdown1 == 0)) { - removeCallbacks(); + gotoNextState(); } updateAnim(); handleSpriteUpdate(); @@ -643,7 +643,7 @@ uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessagePar } break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -660,7 +660,7 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar } break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -670,7 +670,7 @@ void AsScene1201Creature::sub40C8E0() { _countdown3--; if (_countdown3 == 0) _countdown3 = 3; - setFileHash(0x08081513, 0, -1); + startAnimation(0x08081513, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C710); NextState(&AsScene1201Creature::sub40C930); _countdown1 = 36; @@ -678,32 +678,32 @@ void AsScene1201Creature::sub40C8E0() { void AsScene1201Creature::sub40C930() { if (!_flag) { - setFileHash(0xCA287133, 0, -1); + startAnimation(0xCA287133, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0); NextState(&AsScene1201Creature::sub40C8E0); } } void AsScene1201Creature::sub40C960() { - setFileHash(0x08081513, 0, -1); + startAnimation(0x08081513, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C710); NextState(&AsScene1201Creature::sub40C9E0); _countdown1 = 48; } void AsScene1201Creature::sub40C990() { - setFileHash2(0x0B6E13FB, 0x01084280, 0); + startAnimationByHash(0x0B6E13FB, 0x01084280, 0); } void AsScene1201Creature::sub40C9B0() { - setFileHash(0xCA287133, 0, -1); + startAnimation(0xCA287133, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C830); NextState(&AsScene1201Creature::sub40C8E0); _countdown1 = 0; } void AsScene1201Creature::sub40C9E0() { - setFileHash(0x5A201453, 0, -1); + startAnimation(0x5A201453, 0, -1); SetMessageHandler(&AsScene1201Creature::handleMessage40C710); _countdown1 = 0; } @@ -715,12 +715,12 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) _y = 240; createSurface(800, 55, 199); if (_klayman->getX() < 100) { - setFileHash(0x508A111B, 0, -1); - _newHashListIndex = -2; + startAnimation(0x508A111B, 0, -1); + _newStickFrameIndex = -2; _soundResource.play(calcHash("fxDoorOpen03")); } else { - setFileHash(0x508A111B, -1, -1); - _newHashListIndex = -2; + startAnimation(0x508A111B, -1, -1); + _newStickFrameIndex = -2; } SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1201LeftDoor::handleMessage); @@ -737,9 +737,9 @@ uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &pa } void AsScene1201LeftDoor::sub40D590() { - setFileHash(0x508A111B, -1, -1); + startAnimation(0x508A111B, -1, -1); _playBackwards = true; - _newHashListIndex = 0; + _newStickFrameIndex = 0; } Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1076,20 +1076,20 @@ uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessagePara uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; } void AsScene1202TntItem::sub4540A0() { - setFileHash(kScene1202FileHashes[_index], 0, -1); + startAnimation(kScene1202FileHashes[_index], 0, -1); SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0); - _newHashListIndex = 0; + _newStickFrameIndex = 0; } void AsScene1202TntItem::sub4540D0() { - setFileHash(kScene1202FileHashes[_index], 0, -1); + startAnimation(kScene1202FileHashes[_index], 0, -1); SetMessageHandler(&AsScene1202TntItem::handleMessage454060); NextState(&AsScene1202TntItem::sub454100); } @@ -1097,7 +1097,7 @@ void AsScene1202TntItem::sub4540D0() { void AsScene1202TntItem::sub454100() { _x = kScene1202Points[_index2].x; _y = kScene1202Points[_index2].y; - setFileHash(kScene1202FileHashes[_index], 6, -1); + startAnimation(kScene1202FileHashes[_index], 6, -1); SetMessageHandler(&AsScene1202TntItem::handleMessage454060); NextState(&AsScene1202TntItem::sub454160); _playBackwards = true; diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index cb5ed15d99..38dd356946 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -296,11 +296,11 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1302Bridge::handleMessage); if (!getGlobalVar(0x13206309)) { - setFileHash(0x88148150, 0, -1); - _newHashListIndex = 0; + startAnimation(0x88148150, 0, -1); + _newStickFrameIndex = 0; } else { - setFileHash(0x88148150, -1, -1); - _newHashListIndex = -2; + startAnimation(0x88148150, -1, -1); + _newStickFrameIndex = -2; } _soundResource1.load(0x68895082); _soundResource2.load(0x689BD0C1); @@ -310,7 +310,7 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: stLowerBridge(); @@ -323,22 +323,22 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶ } void AsScene1302Bridge::stLowerBridge() { - setFileHash(0x88148150, 0, -1); + startAnimation(0x88148150, 0, -1); NextState(&AsScene1302Bridge::cbLowerBridgeEvent); _soundResource2.play(); } void AsScene1302Bridge::stRaiseBridge() { - setFileHash(0x88148150, 7, -1); + startAnimation(0x88148150, 7, -1); _playBackwards = true; - _newHashListIndex = 0; + _newStickFrameIndex = 0; _soundResource1.play(); } void AsScene1302Bridge::cbLowerBridgeEvent() { sendMessage(_parentScene, 0x2032, 0); - setFileHash(0x88148150, -1, -1); - _newHashListIndex = -2; + startAnimation(0x88148150, -1, -1); + _newStickFrameIndex = -2; } SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) @@ -591,7 +591,7 @@ AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1303Balloon::handleMessage); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); - setFileHash(0x800278D2, 0, -1); + startAnimation(0x800278D2, 0, -1); } uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -627,7 +627,7 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p } void AsScene1303Balloon::stPopBalloon() { - setFileHash(0xAC004CD0, 0, -1); + startAnimation(0xAC004CD0, 0, -1); SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped); } @@ -799,8 +799,8 @@ AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene _x = 320; _y = 240; createSurface1(0x043B0270, 100); - setFileHash(0x043B0270, 0, -1); - _newHashListIndex = 0; + startAnimation(0x043B0270, 0, -1); + _newStickFrameIndex = 0; SetMessageHandler(&AsScene1306Elevator::handleMessage); _soundResource1.load(0x1C100E83); _soundResource2.load(0x1C08CEC5); @@ -812,7 +812,7 @@ void AsScene1306Elevator::update() { stGoingDown(); } AnimatedSprite::update(); - if (_frameIndex == 7) { + if (_currFrameIndex == 7) { _soundResource3.play(); _asElevatorDoor->setVisible(false); } @@ -820,7 +820,7 @@ void AsScene1306Elevator::update() { void AsScene1306Elevator::upGoingDown() { AnimatedSprite::update(); - if (_frameIndex == 5) { + if (_currFrameIndex == 5) { _asElevatorDoor->setVisible(true); } } @@ -834,7 +834,7 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa messageResult = _isUp ? 1 : 0; break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: if (_isDown) @@ -848,7 +848,7 @@ void AsScene1306Elevator::stGoingUp() { setVisible(true); _isDown = false; SetUpdateHandler(&AsScene1306Elevator::update); - setFileHash(0x043B0270, 0, -1); + startAnimation(0x043B0270, 0, -1); NextState(&AsScene1306Elevator::cbGoingUpEvent); _soundResource1.play(); } @@ -866,7 +866,7 @@ void AsScene1306Elevator::stGoingDown() { SetUpdateHandler(&AsScene1306Elevator::upGoingDown); _isUp = false; setVisible(true); - setFileHash(0x043B0270, -1, -1); + startAnimation(0x043B0270, -1, -1); _playBackwards = true; NextState(&AsScene1306Elevator::cbGoingDownEvent); _soundResource2.play(); @@ -902,7 +902,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 19, 1100, 359, 445, 0x9148A011); _asElevatorDoor = insertSprite(0x043B0270, 90, 320, 240); - _asElevatorDoor->setFileHash(0x043B0270, 6, -1); + _asElevatorDoor->startAnimation(0x043B0270, 6, -1); _asElevatorDoor->setNewHashListIndex(6); _asElevator = insertSprite(this, _asElevatorDoor); @@ -987,10 +987,10 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger() != 0) { setRectList(0x004AFD28); - _klayman->setKlaymanTable3(); + _klayman->setKlaymanIdleTable3(); } else { setRectList(0x004AFD18); - _klayman->setKlaymanTable1(); + _klayman->setKlaymanIdleTable1(); } break; case 0x480B: @@ -1134,7 +1134,7 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1307Key::handleMessage); - setFileHash(fileHashes[0], 0, -1); + startAnimation(fileHashes[0], 0, -1); _soundResource1.load(0xDC4A1280); _soundResource2.load(0xCC021233); @@ -1199,9 +1199,9 @@ void AsScene1307Key::suInsertKey() { void AsScene1307Key::suMoveKey() { if (_pointIndex < kAsScene1307KeyFrameIndicesCount) { - _frameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; - _x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue; - _y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue; + _currFrameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; + _x = _prevX + (_deltaX * _currFrameIndex) / kAsScene1307KeyDivValue; + _y = _prevY + (_deltaY * _currFrameIndex) / kAsScene1307KeyDivValue; processDelta(); _pointIndex++; } else { @@ -1216,7 +1216,7 @@ void AsScene1307Key::stRemoveKey() { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; _pointIndex = 0; SetSpriteCallback(&AsScene1307Key::suRemoveKey); - setFileHash(fileHashes[0], 0, -1); + startAnimation(fileHashes[0], 0, -1); _soundResource2.play(); } @@ -1225,7 +1225,7 @@ void AsScene1307Key::stInsertKey() { sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]); setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]); SetSpriteCallback(&AsScene1307Key::suInsertKey); - _newHashListIndex = -2; + _newStickFrameIndex = -2; } void AsScene1307Key::stMoveKey() { @@ -1241,24 +1241,24 @@ void AsScene1307Key::stMoveKey() { } else { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; _pointIndex = 0; - _frameIndex = 0; + _currFrameIndex = 0; _deltaX = newX - _x; _deltaY = newY - _y; SetSpriteCallback(&AsScene1307Key::suMoveKey); - setFileHash(fileHashes[0], 0, -1); + startAnimation(fileHashes[0], 0, -1); } } void AsScene1307Key::stUnlock() { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; - setFileHash(fileHashes[1], 0, -1); - _newHashListIndex = -2; + startAnimation(fileHashes[1], 0, -1); + _newStickFrameIndex = -2; } void AsScene1307Key::stInsert() { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; - setFileHash(fileHashes[2], 0, -1); - _newHashListIndex = -2; + startAnimation(fileHashes[2], 0, -1); + _newStickFrameIndex = -2; } Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1440,7 +1440,7 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: sub455470(); @@ -1453,7 +1453,7 @@ uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Class549::sub455470() { - setFileHash(0xBA0AE050, 0, -1); + startAnimation(0xBA0AE050, 0, -1); setVisible(true); NextState(&Class549::hide); _soundResource.play(calcHash("fxDoorOpen38")); @@ -1466,7 +1466,7 @@ void Class549::hide() { } void Class549::sub4554F0() { - setFileHash(0xBA0AE050, -1, -1); + startAnimation(0xBA0AE050, -1, -1); _playBackwards = true; setVisible(true); NextState(&Class549::sub455550); @@ -1491,14 +1491,14 @@ uint32 Class592::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; } void Class592::sub455710() { - setFileHash(0x6238B191, 0, -1); + startAnimation(0x6238B191, 0, -1); NextState(&Class592::sub455740); _x = 580; _y = 383; @@ -1528,20 +1528,20 @@ uint32 Class593::handleMessage(int messageNum, const MessageParam ¶m, Entity case 0x2003: sub455920(); case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; } void Class593::sub4558F0() { - setFileHash(0x80180A10, 0, -1); + startAnimation(0x80180A10, 0, -1); setVisible(false); - _newHashListIndex = -2; + _newStickFrameIndex = -2; } void Class593::sub455920() { - setFileHash(0x80180A10, -1, -1); + startAnimation(0x80180A10, -1, -1); _playBackwards = true; NextState(&Class593::sub455950); } @@ -1568,7 +1568,7 @@ Class513::Class513(NeverhoodEngine *vm) _x = 286; _y = 429; createSurface1(0xA282C472, 100); - setFileHash(0xA282C472, 0, -1); + startAnimation(0xA282C472, 0, -1); } uint32 Class513::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 42dfdb3d5b..ecf6326f9b 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -144,7 +144,7 @@ Class525::Class525(NeverhoodEngine *vm) _y = 217; SetUpdateHandler(&Class525::update4662A0); SetMessageHandler(&Class525::handleMessage466320); - setFileHash(0x4C210500, 0, -1); + startAnimation(0x4C210500, 0, -1); } Class525::~Class525() { @@ -206,18 +206,18 @@ uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam ¶m, } void Class525::sub466420() { - setFileHash(0x4C240100, 0, -1); + startAnimation(0x4C240100, 0, -1); _soundResource1.play(0x4A30063F); } void Class525::sub466460() { // TODO Sound1ChList_deleteSoundByHash(0x4A116437); _soundResource1.play(0x4A120435); - setFileHash(0x4C210500, 0, -1); + startAnimation(0x4C210500, 0, -1); } void Class525::sub4664B0() { - setFileHash(0x6C210810, 0, -1); + startAnimation(0x6C210810, 0, -1); SetMessageHandler(&Class525::handleMessage4663C0); SetUpdateHandler(&Class525::update466300); } @@ -231,7 +231,7 @@ Class526::Class526(NeverhoodEngine *vm, Sprite *class525) _y = 433; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class526::handleMessage); - setFileHash(0xA282C472, 0, -1); + startAnimation(0xA282C472, 0, -1); } uint32 Class526::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -265,7 +265,7 @@ void Class526::spriteUpdate466720() { } void Class526::sub466770() { - setFileHash(0x34880040, 0, -1); + startAnimation(0x34880040, 0, -1); SetSpriteCallback(&Class526::spriteUpdate466720); } @@ -278,7 +278,7 @@ Class527::Class527(NeverhoodEngine *vm, Sprite *class526) _y = 433; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class527::handleMessage); - setFileHash(0x461A1490, 0, -1); + startAnimation(0x461A1490, 0, -1); } uint32 Class527::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -303,7 +303,7 @@ void Class527::spriteUpdate466920() { } void Class527::sub466970() { - setFileHash(0x103B8020, 0, -1); + startAnimation(0x103B8020, 0, -1); SetSpriteCallback(&Class527::spriteUpdate466920); } @@ -315,10 +315,10 @@ Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) createSurface1(0x04551900, 100); SetUpdateHandler(&Class528::update); SetMessageHandler(&Class528::handleMessage); - _newHashListIndex = -2; + _newStickFrameIndex = -2; if (flag) { _flag = true; - setFileHash(0x04551900, -1,- 1); + startAnimation(0x04551900, -1,- 1); _countdown = 48; } else { _flag = false; @@ -344,7 +344,7 @@ uint32 Class528::handleMessage(int messageNum, const MessageParam ¶m, Entity messageResult = _flag ? 1 : 0; break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: _countdown = 168; @@ -358,15 +358,15 @@ uint32 Class528::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class528::sub466BF0() { _flag = true; setVisible(true); - setFileHash(0x04551900, 0, -1); - _newHashListIndex = -2; + startAnimation(0x04551900, 0, -1); + _newStickFrameIndex = -2; _soundResource.play(calcHash("fxDoorOpen24")); } void Class528::sub466C50() { _flag = false; setVisible(true); - setFileHash(0x04551900, -1, -1); + startAnimation(0x04551900, -1, -1); _soundResource.play(calcHash("fxDoorClose24")); _playBackwards = true; NextState(&Class528::sub466CB0); @@ -392,7 +392,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr _class489Item = &kClass489Items[getGlobalVar(0x04A105B3)]; // TODO createSurface3(990, dword_4B26D8); createSurface(990, 640, 480); //TODO: Remeove once the line above is done - setFileHash(0x10E3042B, 0, -1); + startAnimation(0x10E3042B, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class489::handleMessage); _x = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; @@ -504,7 +504,7 @@ uint32 Class489::handleMessage434B20(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -585,12 +585,12 @@ void Class489::sub434D80() { void Class489::sub434DD0() { SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage); - setFileHash(0x10E3042B, 0, -1); + startAnimation(0x10E3042B, 0, -1); } void Class489::sub434DF0() { _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; - setFileHash(0x14A10137, 0, -1); + startAnimation(0x14A10137, 0, -1); SetSpriteCallback(&Class489::spriteUpdate434B60); SetMessageHandler(&Class489::handleMessage); _soundResource2.play(0xEC008474); @@ -599,18 +599,18 @@ void Class489::sub434DF0() { void Class489::sub434E60() { SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage434B20); - setFileHash(0x80C32213, 0, -1); + startAnimation(0x80C32213, 0, -1); NextState(&Class489::sub434E90); } void Class489::sub434E90() { SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage4348E0); - setFileHash(0xD23B207F, 0, -1); + startAnimation(0xD23B207F, 0, -1); } void Class489::sub434EC0() { - setFileHash(0x50A80517, 0, -1); + startAnimation(0x50A80517, 0, -1); SetMessageHandler(&Class489::handleMessage434B20); SetSpriteCallback(NULL); NextState(&Class489::sub434F40); @@ -622,13 +622,13 @@ void Class489::sub434EC0() { void Class489::sub434F40() { sendMessage(_parentScene, 0x480F, 0); - setFileHash(0xD833207F, 0, -1); + startAnimation(0xD833207F, 0, -1); SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage4348E0); } void Class489::sub434F80() { - setFileHash(0x50A94417, 0, -1); + startAnimation(0x50A94417, 0, -1); SetSpriteCallback(NULL); SetMessageHandler(&Class489::handleMessage434B20); NextState(&Class489::sub434E90); @@ -639,7 +639,7 @@ void Class489::sub434F80() { void Class489::sub434FF0() { _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; - setFileHash(0x22CB4A33, 0, -1); + startAnimation(0x22CB4A33, 0, -1); SetSpriteCallback(&Class489::spriteUpdate434B60); SetMessageHandler(&Class489::handleMessage434B20); NextState(&Class489::sub434DF0); @@ -650,7 +650,7 @@ void Class489::sub435040() { setGlobalVar(0x04A10F33, 0); SetSpriteCallback(&Class489::sub434D80); SetMessageHandler(&Sprite::handleMessage); - setFileHash(0x708D4712, 0, -1); + startAnimation(0x708D4712, 0, -1); _soundResource3.play(); } @@ -825,16 +825,16 @@ Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which) _x = 279; _y = 270; if (which == 2) { - setFileHash(0x20060259, 0, -1); + startAnimation(0x20060259, 0, -1); _soundResource1.play(0x419014AC); _soundResource2.load(0x61901C29); } else if (which == 1) { - setFileHash(0x210A0213, 0, -1); + startAnimation(0x210A0213, 0, -1); _soundResource1.play(0x41809C6C); } else { - setFileHash(0x20060259, 0, -1); + startAnimation(0x20060259, 0, -1); _soundResource2.load(0x61901C29); - _newHashListIndex = -2; + _newStickFrameIndex = -2; } } @@ -843,12 +843,12 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x2002: _soundResource2.play(); - setFileHash(0x20060259, -1, -1); + startAnimation(0x20060259, -1, -1); _playBackwards = true; NextState(&Class482::sub428530); break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -1142,7 +1142,7 @@ void AsScene1407Mouse::suWalkTo() { void AsScene1407Mouse::upGoThroughHole() { if (_countdown != 0 && (--_countdown == 0)) { SetUpdateHandler(&AnimatedSprite::update); - removeCallbacks(); + gotoNextState(); } AnimatedSprite::update(); } @@ -1178,7 +1178,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m } break; case 0x1019: - removeCallbacks(); + gotoNextState(); break; case 0x2001: { @@ -1207,7 +1207,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m void AsScene1407Mouse::stIdleLookAtGoodHole() { setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0); - setFileHash(0x72215194, 0, -1); + startAnimation(0x72215194, 0, -1); SetSpriteCallback(NULL); SetMessageHandler(&AsScene1407Mouse::handleMessage); } @@ -1215,7 +1215,7 @@ void AsScene1407Mouse::stIdleLookAtGoodHole() { void AsScene1407Mouse::stWalkToDest() { if (_walkDestX != _x) { setDoDeltaX(_walkDestX < _x ? 1 : 0); - setFileHash(0x22291510, 0, -1); + startAnimation(0x22291510, 0, -1); SetSpriteCallback(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); NextState(&AsScene1407Mouse::stIdleLookAtGoodHole); @@ -1224,14 +1224,14 @@ void AsScene1407Mouse::stWalkToDest() { void AsScene1407Mouse::stWalkToHole() { setDoDeltaX(_walkDestX < _x ? 1 : 0); - setFileHash(0x22291510, 0, -1); + startAnimation(0x22291510, 0, -1); SetSpriteCallback(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); NextState(&AsScene1407Mouse::stGoThroughHole); } void AsScene1407Mouse::stGoThroughHole() { - setFileHash(0x72215194, 0, -1); + startAnimation(0x72215194, 0, -1); SetSpriteCallback(NULL); SetMessageHandler(NULL); SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); @@ -1603,8 +1603,8 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui debug("getSubVar(0x0C65F80B, _index) = %d", getSubVar(0x0C65F80B, _index)); - setFileHash(0x844B805C, getSubVar(0x0C65F80B, _index), -1); - _newHashListIndex = (int16)getSubVar(0x0C65F80B, _index); + startAnimation(0x844B805C, getSubVar(0x0C65F80B, _index), -1); + _newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _index); } void AsScene1405Tile::update() { diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index c510601642..44c8721d6d 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -200,7 +200,7 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) _pathPoints = NULL; _rectList = NULL; - setFileHash(0xD4220027, 0, -1); + startAnimation(0xD4220027, 0, -1); setDoDeltaX(getGlobalVar(0x21E60190)); } @@ -372,11 +372,11 @@ uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x100D: if (_flag10F && param.asInteger() == 0x025424A2) { - removeCallbacks(); + gotoNextState(); } break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -408,7 +408,7 @@ void Class521::sub45CD00() { _rectList = NULL; SetMessageHandler(&Class521::handleMessage45CC30); NextState(&Class521::sub45CFE0); - setFileHash(0x35698F78, 0, -1); + startAnimation(0x35698F78, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update45C790); FinalizeState(&Class521::sub45D040); @@ -436,17 +436,17 @@ void Class521::sub45CDC0() { void Class521::sub45CE10() { if (_flag10E && !_flag113 && !_flag10F) { - removeCallbacks(); + gotoNextState(); _flag114 = 0; _flag113 = 1; - setFileHash(0x192ADD30, 0, -1); + startAnimation(0x192ADD30, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45CFE0); } else if (!_flag10E && _steps && _flag113) { - removeCallbacks(); + gotoNextState(); _flag113 = 0; - setFileHash(0x9966B138, 0, -1); + startAnimation(0x9966B138, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45D100); @@ -464,10 +464,10 @@ void Class521::sub45CE10() { _flag11A = index < _rectList->size(); } if (flag) { - removeCallbacks(); + gotoNextState(); sub45D0A0(); } else if (_newMoveDirection != _currMoveDirection && _flag114 && !_flag10F) { - removeCallbacks(); + gotoNextState(); _currMoveDirection = _newMoveDirection; sub45D100(); } @@ -475,21 +475,21 @@ void Class521::sub45CE10() { } void Class521::sub45CF80() { - setFileHash(0xA86A9538, 0, -1); + startAnimation(0xA86A9538, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45CFE0); } void Class521::sub45CFB0() { - setFileHash(0xA86A9538, -1, -1); + startAnimation(0xA86A9538, -1, -1); _playBackwards = true; SetMessageHandler(&Class521::handleMessage45CCA0); SetUpdateHandler(&Class521::update); } void Class521::sub45CFE0() { - setFileHash(0x35698F78, 0, -1); + startAnimation(0x35698F78, 0, -1); SetMessageHandler(&Class521::handleMessage); SetUpdateHandler(&Class521::update45C790); FinalizeState(&Class521::sub45D040); @@ -505,7 +505,7 @@ void Class521::sub45D040() { } void Class521::sub45D050() { - setFileHash(0xB579A77C, 0, -1); + startAnimation(0xB579A77C, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45CFE0); @@ -515,8 +515,8 @@ void Class521::sub45D050() { void Class521::sub45D0A0() { _flag10F = 1; - removeCallbacks(); - setFileHash(0x9C220DA4, 0, -1); + gotoNextState(); + startAnimation(0x9C220DA4, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); FinalizeState(&Class521::sub45D0E0); @@ -531,21 +531,21 @@ void Class521::sub45D0E0() { void Class521::sub45D100() { _flag114 = 1; if (_currMoveDirection == 1) { - setFileHash(0xD4AA03A4, 0, -1); + startAnimation(0xD4AA03A4, 0, -1); } else if (_currMoveDirection == 3) { - setFileHash(0xD00A1364, 0, -1); + startAnimation(0xD00A1364, 0, -1); } else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) { sub45D180(); } else { - setFileHash(0xD4220027, 0, -1); + startAnimation(0xD4220027, 0, -1); } setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0); } void Class521::sub45D180() { _flag10F = 1; - removeCallbacks(); - setFileHash(0xF46A0324, 0, -1); + gotoNextState(); + startAnimation(0xF46A0324, 0, -1); _value112 = 0; SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); @@ -573,9 +573,9 @@ void Class521::moveToNextPoint() { sub45D350(); } else { if (_steps == 0) { - removeCallbacks(); + gotoNextState(); _flag113 = 0; - setFileHash(0x9966B138, 0, -1); + startAnimation(0x9966B138, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45D100); @@ -588,19 +588,19 @@ void Class521::moveToNextPoint() { } void Class521::sub45D350() { - removeCallbacks(); + gotoNextState(); _flag10F = 1; _flag10E = 1; - setFileHash(0x192ADD30, 0, -1); + startAnimation(0x192ADD30, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45D390); } void Class521::sub45D390() { - removeCallbacks(); + gotoNextState(); _flag10F = 1; - setFileHash(0xF46A0324, 0, -1); + startAnimation(0xF46A0324, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); FinalizeState(&Class521::sub45D620); @@ -635,9 +635,9 @@ void Class521::moveToPrevPoint() { sub45D580(); } else { if (_steps == 0) { - removeCallbacks(); + gotoNextState(); _flag113 = 0; - setFileHash(0x9966B138, 0, -1); + startAnimation(0x9966B138, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45D100); @@ -653,7 +653,7 @@ void Class521::sub45D580() { _flag10F = 1; _flag10E = 1; FinalizeState(NULL); - setFileHash(0x192ADD30, 0, -1); + startAnimation(0x192ADD30, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); NextState(&Class521::sub45D5D0); @@ -662,7 +662,7 @@ void Class521::sub45D580() { void Class521::sub45D5D0() { _flag10F = 1; FinalizeState(NULL); - setFileHash(0xF46A0324, 0, -1); + startAnimation(0xF46A0324, 0, -1); SetMessageHandler(&Class521::handleMessage45CC30); SetUpdateHandler(&Class521::update); FinalizeState(&Class521::sub45D620); @@ -986,7 +986,7 @@ uint32 Class546::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: sub44D710(); @@ -999,7 +999,7 @@ uint32 Class546::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Class546::sub44D710() { - setFileHash(0x08C80144, 0, -1); + startAnimation(0x08C80144, 0, -1); setVisible(true); NextState(&Class546::sub44D760); _soundResource.play(calcHash("fxDoorOpen23")); @@ -1012,7 +1012,7 @@ void Class546::sub44D760() { } void Class546::sub44D790() { - setFileHash(0x08C80144, -1, -1); + startAnimation(0x08C80144, -1, -1); setVisible(true); NextState(&Class546::sub44D7F0); _soundResource.play(calcHash("fxDoorClose23")); @@ -1027,15 +1027,15 @@ Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { setDoDeltaX(1); - setFileHash(0x1209E09F, 1, -1); - _newHashListIndex = 1; + startAnimation(0x1209E09F, 1, -1); + _newStickFrameIndex = 1; } Class548::Class548(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { setDoDeltaX(1); - _newHashListIndex = 0; + _newStickFrameIndex = 0; } Class518::Class518(NeverhoodEngine *vm, Class521 *class521) @@ -1043,8 +1043,8 @@ Class518::Class518(NeverhoodEngine *vm, Class521 *class521) SetUpdateHandler(&Class518::update); createSurface1(0x60281C10, 150); - setFileHash(0x60281C10, -1, -1); - _newHashListIndex = -2; + startAnimation(0x60281C10, -1, -1); + _newStickFrameIndex = -2; } void Class518::update() { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index ae7a7fdc7a..f9dc6b7fa8 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -259,10 +259,10 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004B6B40); - _klayman->setKlaymanTable3(); + _klayman->setKlaymanIdleTable3(); } else { setRectList(0x004B6B30); - _klayman->setKlaymanTable1(); + _klayman->setKlaymanIdleTable1(); } break; case 0x4826: diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 7bac3ffc96..e9be86a926 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -200,8 +200,8 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene _y = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].y; } createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); - _newHashListIndex = -2; + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); + _newStickFrameIndex = -2; } else { _isPluggedIn = false; _currPositionIndex = positionIndex; @@ -212,8 +212,8 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene _x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x; _y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y; createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); - _newHashListIndex = 0; + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + _newStickFrameIndex = 0; } _deltaRect.set(0, 0, 80, 80); Sprite::processDelta(); @@ -249,7 +249,7 @@ uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam ¶ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -345,7 +345,7 @@ void AsScene1907Symbol::tryToPlugIn() { _newPositionIndex = _parentScene->getNextPosition(); _parentScene->setPositionFree(_currPositionIndex, true); sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex); - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); SetUpdateHandler(&AsScene1907Symbol::update); SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn); SetSpriteCallback(&AsScene1907Symbol::suTryToPlugIn); @@ -371,9 +371,9 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; _someX = _x; _someY = _y; - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0); + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0); _playBackwards = true; - _newHashListIndex = -2; + _newStickFrameIndex = -2; _currStep = 0; _yAccel = 1; SetUpdateHandler(&AsScene1907Symbol::update); @@ -390,7 +390,7 @@ void AsScene1907Symbol::stFallOffHitGround() { _vm->_collisionMan->addSprite(this); SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround); NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); - _newHashListIndex = 0; + _newStickFrameIndex = 0; _currStep = 0; _yAccel = 30; _deltaX = (_x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x) / 15; @@ -405,8 +405,8 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() { _currPositionIndex = _newPositionIndex; if (_symbolFlag2) _symbolFlag2--; - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); - _newHashListIndex = 0; + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + _newStickFrameIndex = 0; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteCallback(NULL); @@ -431,7 +431,7 @@ void AsScene1907Symbol::stPlugInFail() { } void AsScene1907Symbol::moveUp() { - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteCallback(&AsScene1907Symbol::suMoveUp); @@ -440,7 +440,7 @@ void AsScene1907Symbol::moveUp() { } void AsScene1907Symbol::moveDown() { - setFileHash(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteCallback(&AsScene1907Symbol::suMoveDown); @@ -513,8 +513,8 @@ AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) createSurface1(0x110A1061, 1500); _x = 320; _y = 240; - setFileHash(0x110A1061, 0, -1); - _newHashListIndex = 0; + startAnimation(0x110A1061, 0, -1); + _newStickFrameIndex = 0; setVisible(false); _needRefresh = true; AnimatedSprite::updatePosition(); @@ -531,7 +531,7 @@ uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessagePa uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -539,7 +539,7 @@ uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessagePa void AsScene1907WaterHint::show() { setVisible(true); - setFileHash(0x110A1061, 0, -1); + startAnimation(0x110A1061, 0, -1); SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20); NextState(&AsScene1907WaterHint::hide); } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 9c0843c3e1..bd22c7b154 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -143,10 +143,10 @@ uint32 Scene2001::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004B3680); - _klayman->setKlaymanTable3(); + _klayman->setKlaymanIdleTable3(); } else { setRectList(0x004B3670); - _klayman->setKlaymanTable1(); + _klayman->setKlaymanIdleTable1(); } } return 0; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 66f8631b8a..c6de482cf8 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -87,8 +87,8 @@ Class538::Class538(NeverhoodEngine *vm, bool flag) SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class538::handleMessage); if (flag) { - setFileHash(0x0C202B9C, -1, -1); - _newHashListIndex = -2; + startAnimation(0x0C202B9C, -1, -1); + _newStickFrameIndex = -2; } else { setVisible(false); } @@ -98,7 +98,7 @@ uint32 Class538::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: openDoor(); @@ -111,15 +111,15 @@ uint32 Class538::handleMessage(int messageNum, const MessageParam ¶m, Entity } void Class538::openDoor() { - setFileHash(0x0C202B9C, 0, -1); - _newHashListIndex = -2; + startAnimation(0x0C202B9C, 0, -1); + _newStickFrameIndex = -2; setVisible(true); _soundResource.play(calcHash("fxDoorOpen32")); } void Class538::closeDoor() { - setFileHash(0xC222A8D4, 0, -1); - _newHashListIndex = -2; + startAnimation(0xC222A8D4, 0, -1); + _newStickFrameIndex = -2; setVisible(true); NextState(&Class538::hide); _soundResource.play(calcHash("fxDoorClose32")); @@ -145,7 +145,7 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity case 0x2001: _x = _klayman->getX(); _y = _klayman->getY() - 132; - setFileHash(0x0422255A, 0, -1); + startAnimation(0x0422255A, 0, -1); setVisible(true); break; case 0x3002: @@ -311,10 +311,10 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger() != 0) { setRectList(0x004B9008); - _klayman->setKlaymanTable3(); + _klayman->setKlaymanIdleTable3(); } else { setRectList(0x004B8FF8); - _klayman->setKlaymanTable1(); + _klayman->setKlaymanIdleTable1(); } break; case 0x480B: diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index ab1fac8c5e..e886accfef 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -407,7 +407,7 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) _x = 403; _y = 259; createSurface(100, 233, 96); - setFileHash(0x8600866, 0, -1); + startAnimation(0x8600866, 0, -1); SetUpdateHandler(&AnimatedSprite::update); } @@ -421,12 +421,12 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite * SetUpdateHandler(&AsScene2201Door::update); SetMessageHandler(&AsScene2201Door::handleMessage); if (_doorOpen) { - setFileHash(0xE2CB0412, -1, -1); + startAnimation(0xE2CB0412, -1, -1); _countdown = 48; - _newHashListIndex = -2; + _newStickFrameIndex = -2; } else { - setFileHash(0xE2CB0412, 0, -1); - _newHashListIndex = 0; + startAnimation(0xE2CB0412, 0, -1); + _newStickFrameIndex = 0; _doorLightSprite->setVisible(false); } } @@ -456,7 +456,7 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, messageResult = _doorOpen ? 1 : 0; break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; case 0x4808: _countdown = 144; @@ -469,16 +469,16 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, void AsScene2201Door::stOpenDoor() { _doorOpen = true; - setFileHash(0xE2CB0412, 0, -1); - _newHashListIndex = -2; + startAnimation(0xE2CB0412, 0, -1); + _newStickFrameIndex = -2; _soundResource.play(calcHash("fxDoorOpen33")); } void AsScene2201Door::stCloseDoor() { _doorOpen = false; - setFileHash(0xE2CB0412, -1, -1); + startAnimation(0xE2CB0412, -1, -1); _playBackwards = true; - _newHashListIndex = 0; + _newStickFrameIndex = 0; _soundResource.play(calcHash("fxDoorClose33")); } @@ -1064,11 +1064,11 @@ AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint i _y = 240; createSurface1(kAsScene2203DoorFileHashes[_index], 900); if (getGlobalVar(0x9A500914) == _index) { - setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1); - _newHashListIndex = -2; + startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1); + _newStickFrameIndex = -2; } else { - setFileHash(kAsScene2203DoorFileHashes[_index], 0, -1); - _newHashListIndex = 0; + startAnimation(kAsScene2203DoorFileHashes[_index], 0, -1); + _newStickFrameIndex = 0; } } @@ -1105,13 +1105,13 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, void AsScene2203Door::openDoor() { _soundResource.play(0x341014C4); - setFileHash(kAsScene2203DoorFileHashes[_index], 1, -1); + startAnimation(kAsScene2203DoorFileHashes[_index], 1, -1); } void AsScene2203Door::closeDoor() { - setFileHash(kAsScene2203DoorFileHashes[_index], -1, -1); + startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1); _playBackwards = true; - _newHashListIndex = 0; + _newStickFrameIndex = 0; } Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1592,7 +1592,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) } _klayman->setSoundFlag(true); - _klayman->setKlaymanTable2(); + _klayman->setKlaymanIdleTable2(); } @@ -1706,11 +1706,11 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene _x = pt.x; _y = pt.y; createSurface(1100, 129, 103); - setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0); + startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0); SetUpdateHandler(&AsScene2207Elevator::update); SetSpriteCallback(&AsScene2207Elevator::suSetPosition); SetMessageHandler(&AsScene2207Elevator::handleMessage); - _newHashListIndex = 0; + _newStickFrameIndex = 0; } AsScene2207Elevator::~AsScene2207Elevator() { @@ -1721,8 +1721,8 @@ void AsScene2207Elevator::update() { if (_destPointIndex + _destPointIndexDelta > _pointIndex) { _pointIndex++; - setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); - _newHashListIndex = _pointIndex; + startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + _newStickFrameIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { if (_destPointIndexDelta != 0) { _destPointIndexDelta = 0; @@ -1737,8 +1737,8 @@ void AsScene2207Elevator::update() { _pointIndex--; if (_pointIndex == 0) sendMessage(_parentScene, 0x2003, 0); - setFileHash(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); - _newHashListIndex = _pointIndex; + startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + _newStickFrameIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { if (_destPointIndexDelta != 0) { _destPointIndexDelta = 0; @@ -1817,8 +1817,8 @@ AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int1 SetMessageHandler(&AsScene2207Lever::handleMessage); createSurface(1010, 71, 73); setDoDeltaX(doDeltaX); - setFileHash(0x80880090, 0, -1); - _newHashListIndex = 0; + startAnimation(0x80880090, 0, -1); + _newStickFrameIndex = 0; _x = x; _y = y; } @@ -1831,7 +1831,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m messageResult = 1; break; case 0x3002: - removeCallbacks(); + gotoNextState(); stopAnimation(); break; case 0x4807: @@ -1851,7 +1851,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m } void AsScene2207Lever::stLeverDown() { - setFileHash(0x80880090, 1, -1); + startAnimation(0x80880090, 1, -1); FinalizeState(&AsScene2207Lever::stLeverDownEvent); _soundResource.play(0x40581882); } @@ -1861,7 +1861,7 @@ void AsScene2207Lever::stLeverDownEvent() { } void AsScene2207Lever::stLeverUp() { - setFileHash(0x80880090, 6, -1); + startAnimation(0x80880090, 6, -1); FinalizeState(&AsScene2207Lever::stLeverUpEvent); _playBackwards = true; _soundResource.play(0x40581882); @@ -1880,8 +1880,8 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm createSurface1(0xCCFD6090, 100); _x = 309; _y = 320; - setFileHash(0xCCFD6090, 0, -1); - _newHashListIndex = 0; + startAnimation(0xCCFD6090, 0, -1); + _newStickFrameIndex = 0; _soundResource2.load(0x40330872); _soundResource3.load(0x72A2914A); _soundResource4.load(0xD4226080); @@ -1923,7 +1923,7 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag stStopAnimation(); break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -1933,7 +1933,7 @@ void AsScene2207WallRobotAnimation::stStartAnimation() { if (!_idle) { NextState(NULL); } else { - setFileHash(0xCCFD6090, 0, -1); + startAnimation(0xCCFD6090, 0, -1); _idle = false; setVisible(true); } @@ -1962,8 +1962,8 @@ AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine * createSurface1(0x8CAA0099, 100); _x = 309; _y = 320; - setFileHash(0x8CAA0099, 0, -1); - _newHashListIndex = 0; + startAnimation(0x8CAA0099, 0, -1); + _newStickFrameIndex = 0; } uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1976,7 +1976,7 @@ uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const Messa stStopAnimation(); break; case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -1987,7 +1987,7 @@ void AsScene2207WallCannonAnimation::stStartAnimation() { NextState(NULL); } else { setVisible(true); - setFileHash(0x8CAA0099, 0, -1); + startAnimation(0x8CAA0099, 0, -1); _idle = false; } } @@ -2593,7 +2593,7 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule } _klayman->setSoundFlag(true); - _klayman->setKlaymanTable2(); + _klayman->setKlaymanIdleTable2(); } diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 5823e4dcb2..7975fcbb5d 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -284,7 +284,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m // TODO Sound1ChList_stop(0xDC2769B0); break; case 0x2002: - setFileHash(0x9C210C90, 0, -1); + startAnimation(0x9C210C90, 0, -1); setVisible(true); // TODO Sound1ChList_playLooping(0xDC2769B0); break; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 783e6166ea..8c5fd6c59d 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -639,7 +639,7 @@ AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, } void AsScene3009VerticalIndicator::show() { - setFileHash(0xC2463913, 0, -1); + startAnimation(0xC2463913, 0, -1); setVisible(true); updatePosition(); _enabled = true; @@ -705,7 +705,7 @@ void AsScene3009HorizontalIndicator::suMoveRight() { } void AsScene3009HorizontalIndicator::show() { - setFileHash(0xC0C12954, 0, -1); + startAnimation(0xC0C12954, 0, -1); setVisible(true); updatePosition(); _enabled = true; @@ -729,8 +729,8 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene _x = kAsScene3009SymbolPoints[_index].x; _y = kAsScene3009SymbolPoints[_index].y; createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200); - setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); - _newHashListIndex = _symbolIndex; + startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); + _newStickFrameIndex = _symbolIndex; _needRefresh = true; updatePosition(); SetUpdateHandler(&AnimatedSprite::update); @@ -756,8 +756,8 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶ else _symbolIndex--; } - setFileHash(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); - _newHashListIndex = _symbolIndex; + startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); + _newStickFrameIndex = _symbolIndex; setSubVar(0x00000914, _index, _symbolIndex); if (_index / 3 == 0) { sendMessage(_parentScene, 0x2001, 0); @@ -1162,11 +1162,11 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) { createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); - setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); _soundResource1.load(0x46005BC4); } else { createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200); - setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); + startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); _soundResource1.load(0x420073DC); _soundResource2.load(0x420073DC); } @@ -1193,7 +1193,7 @@ uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam ¶ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - removeCallbacks(); + gotoNextState(); break; } return messageResult; @@ -1210,10 +1210,10 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) { if (!_unlocked) { setVisible(true); if (skipAnim) { - setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); - _newHashListIndex = -2; + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); + _newStickFrameIndex = -2; } else { - setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); FinalizeState(&AsScene3010DeadBolt::stIdleMessage); NextState(&AsScene3010DeadBolt::stIdle); @@ -1234,7 +1234,7 @@ void AsScene3010DeadBolt::lock() { if (!_locked) { _locked = true; setVisible(true); - setFileHash(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); + startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); NextState(&AsScene3010DeadBolt::stIdle); @@ -1253,7 +1253,7 @@ void AsScene3010DeadBolt::setCountdown(int count) { void AsScene3010DeadBolt::stDisabled() { setVisible(true); - setFileHash(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); NextState(&AsScene3010DeadBolt::stIdle); @@ -1483,7 +1483,7 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) void AsScene3011Symbol::show(bool flag) { _flag2 = flag; - setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1); + startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1); setVisible(true); if (flag) { _soundResource2.play(); @@ -1508,7 +1508,7 @@ void AsScene3011Symbol::stopSound() { void AsScene3011Symbol::change(int index, bool flag) { _index = index; _flag2 = flag; - setFileHash(kAsScene3011SymbolFileHashes[_index], 0, -1); + startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1); setVisible(true); if (flag) { _soundResource2.play(); diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 697bd6e262..b68434b493 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -223,26 +223,26 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface createSurface1(fileHash, surfacePriority); _x = x; _y = y; - setFileHash(fileHash, 0, -1); + startAnimation(fileHash, 0, -1); } void AnimatedSprite::init() { _name = "AnimatedSprite"; - _counter = 0; - _fileHash1 = 0; + _currFrameTicks = 0; + _newAnimFileHash = 0; _deltaX = 0; _deltaY = 0; - _fileHash2 = 0; + _nextAnimFileHash = 0; // TODO _callbackList = 0; - _frameIndex3 = 0; - _frameIndex = 0; - _hashListIndex = -1; + _plFirstFrameIndex = 0; + _currFrameIndex = 0; + _currStickFrameIndex = -1; _finalizeStateCb = NULL; _currStateCb = NULL; _nextStateCb = NULL; - _newHashListIndex = -1; - _fileHash4 = 0; - _flag = false; + _newStickFrameIndex = -1; + _newStickFrameHash = 0; + _frameChanged = false; _replOldColor = 0; _replNewColor = 0; _animResource.setReplEnabled(false); @@ -285,24 +285,22 @@ void AnimatedSprite::clearRepl() { void AnimatedSprite::updateAnim() { - _flag = false; + _frameChanged = false; - if (_fileHash1 == 0) { - if (_newHashListIndex != -1) { - _hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex; - _newHashListIndex = -1; - } else if (_fileHash4 != 0) { - _hashListIndex = MAX(0, _animResource.getFrameIndex(_fileHash4)); - _fileHash4 = 0; + if (_newAnimFileHash == 0) { + if (_newStickFrameIndex != -1) { + _currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex; + _newStickFrameIndex = -1; + } else if (_newStickFrameHash != 0) { + _currStickFrameIndex = MAX(0, _animResource.getFrameIndex(_newStickFrameHash)); + _newStickFrameHash = 0; } - if (_fileHash1 == 0 && _frameIndex != _hashListIndex) { - if (_counter != 0) - _counter--; - if (_counter == 0 && _animResource.getFrameCount() != 0) { + if (_newAnimFileHash == 0 && _currFrameIndex != _currStickFrameIndex) { + if (_currFrameTicks != 0 && (--_currFrameTicks == 0) && _animResource.getFrameCount() != 0) { - if (_fileHash2 != 0) { - if (_animResource.loadInternal(_fileHash2)) { - _currAnimFileHash = _fileHash2; + if (_nextAnimFileHash != 0) { + if (_animResource.loadInternal(_nextAnimFileHash)) { + _currAnimFileHash = _nextAnimFileHash; } else { _animResource.loadInternal(calcHash("sqDefault")); _currAnimFileHash = 0; @@ -310,30 +308,30 @@ void AnimatedSprite::updateAnim() { if (_replOldColor != _replNewColor) { _animResource.setRepl(_replOldColor, _replNewColor); } - _fileHash2 = 0; + _nextAnimFileHash = 0; if (_animStatus != 0) { - _frameIndex = _fileHash6 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash6)) : 0; - _frameIndex2 = _fileHash5 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1; + _currFrameIndex = _plFirstFrameHash != 0 ? MAX(0, _animResource.getFrameIndex(_plFirstFrameHash)) : 0; + _lastFrameIndex = _plLastFrameHash != 0 ? MAX(0, _animResource.getFrameIndex(_plLastFrameHash)) : _animResource.getFrameCount() - 1; } else { - _frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1; - _frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; + _currFrameIndex = _plFirstFrameIndex != -1 ? _plFirstFrameIndex : _animResource.getFrameCount() - 1; + _lastFrameIndex = _plLastFrameIndex != -1 ? _plLastFrameIndex : _animResource.getFrameCount() - 1; } } else { updateFrameIndex(); } - if (_fileHash1 == 0) + if (_newAnimFileHash == 0) updateFrameInfo(); } } } - if (_fileHash1 != 0) { + if (_newAnimFileHash != 0) { if (_animStatus == 2) { - _hashListIndex = _frameIndex; + _currStickFrameIndex = _currFrameIndex; } else { if (_animStatus == 1) { - if (_animResource.loadInternal(_fileHash1)) { - _currAnimFileHash = _fileHash1; + if (_animResource.loadInternal(_newAnimFileHash)) { + _currAnimFileHash = _newAnimFileHash; } else { _animResource.loadInternal(calcHash("sqDefault")); _currAnimFileHash = 0; @@ -341,12 +339,12 @@ void AnimatedSprite::updateAnim() { if (_replOldColor != _replNewColor) { _animResource.setRepl(_replOldColor, _replNewColor); } - _fileHash1 = 0; - _frameIndex = _fileHash6 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash6)) : 0; - _frameIndex2 = _fileHash5 != 0 ? MAX(0, _animResource.getFrameIndex(_fileHash5)) : _animResource.getFrameCount() - 1; + _newAnimFileHash = 0; + _currFrameIndex = _plFirstFrameHash != 0 ? MAX(0, _animResource.getFrameIndex(_plFirstFrameHash)) : 0; + _lastFrameIndex = _plLastFrameHash != 0 ? MAX(0, _animResource.getFrameIndex(_plLastFrameHash)) : _animResource.getFrameCount() - 1; } else { - if (_animResource.loadInternal(_fileHash1)) { - _currAnimFileHash = _fileHash1; + if (_animResource.loadInternal(_newAnimFileHash)) { + _currAnimFileHash = _newAnimFileHash; } else { _animResource.loadInternal(calcHash("sqDefault")); _currAnimFileHash = 0; @@ -354,19 +352,19 @@ void AnimatedSprite::updateAnim() { if (_replOldColor != _replNewColor) { _animResource.setRepl(_replOldColor, _replNewColor); } - _fileHash1 = 0; - _frameIndex = _frameIndex3 != -1 ? _frameIndex3 : _animResource.getFrameCount() - 1; - _frameIndex2 = _frameIndex4 != -1 ? _frameIndex4 : _animResource.getFrameCount() - 1; + _newAnimFileHash = 0; + _currFrameIndex = _plFirstFrameIndex != -1 ? _plFirstFrameIndex : _animResource.getFrameCount() - 1; + _lastFrameIndex = _plLastFrameIndex != -1 ? _plLastFrameIndex : _animResource.getFrameCount() - 1; } updateFrameInfo(); } - if (_newHashListIndex != -1) { - _hashListIndex = _newHashListIndex == -2 ? _animResource.getFrameCount() - 1 : _newHashListIndex; - _newHashListIndex = -1; - } else if (_fileHash4 != 0) { - _hashListIndex = MAX(0, _animResource.getFrameIndex(_fileHash4)); - _fileHash4 = 0; + if (_newStickFrameIndex != -1) { + _currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex; + _newStickFrameIndex = -1; + } else if (_newStickFrameHash != 0) { + _currStickFrameIndex = MAX(0, _animResource.getFrameIndex(_newStickFrameHash)); + _newStickFrameHash = 0; } } @@ -391,7 +389,7 @@ void AnimatedSprite::updatePosition() { } if (_needRefresh) { - _surface->drawAnimResource(_animResource, _frameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); + _surface->drawAnimResource(_animResource, _currFrameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); _needRefresh = false; } @@ -399,46 +397,40 @@ void AnimatedSprite::updatePosition() { void AnimatedSprite::updateFrameIndex() { if (!_playBackwards) { - if (_frameIndex < _frameIndex2) { - _frameIndex++; + if (_currFrameIndex < _lastFrameIndex) { + _currFrameIndex++; } else { // Inform self about end of current animation // The caller can then e.g. set a new animation fileHash sendMessage(this, 0x3002, 0); - if (_fileHash1 == 0) - _frameIndex = 0; + if (_newAnimFileHash == 0) + _currFrameIndex = 0; } } else { - if (_frameIndex > 0) { - _frameIndex--; + if (_currFrameIndex > 0) { + _currFrameIndex--; } else { sendMessage(this, 0x3002, 0); - if (_fileHash1 == 0) - _frameIndex = _frameIndex2; + if (_newAnimFileHash == 0) + _currFrameIndex = _lastFrameIndex; } } } void AnimatedSprite::updateFrameInfo() { debug(8, "AnimatedSprite::updateFrameInfo()"); - - const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_frameIndex); - - _flag = true; + const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_currFrameIndex); + _frameChanged = true; _drawRect = frameInfo.rect; _deltaX = frameInfo.deltaX; _deltaY = frameInfo.deltaY; _deltaRect = frameInfo.deltaRect; - _counter = frameInfo.counter; - + _currFrameTicks = frameInfo.counter; processDelta(); - _needRefresh = true; - if (frameInfo.frameHash != 0) { sendMessage(this, 0x100D, frameInfo.frameHash); } - } void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { @@ -446,44 +438,44 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { _surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height); } -void AnimatedSprite::setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4) { - debug(2, "AnimatedSprite::setFileHash(%08X, %d, %d)", fileHash, frameIndex3, frameIndex4); - _fileHash1 = fileHash; - _frameIndex3 = frameIndex3; - _frameIndex4 = frameIndex4; - _fileHash4 = 0; +void AnimatedSprite::startAnimation(uint32 fileHash, int16 plFirstFrameIndex, int16 plLastFrameIndex) { + debug(2, "AnimatedSprite::startAnimation(%08X, %d, %d)", fileHash, plFirstFrameIndex, plLastFrameIndex); + _newAnimFileHash = fileHash; + _plFirstFrameIndex = plFirstFrameIndex; + _plLastFrameIndex = plLastFrameIndex; + _newStickFrameHash = 0; _animStatus = 0; _playBackwards = false; - _newHashListIndex = -1; - _hashListIndex = -1; + _newStickFrameIndex = -1; + _currStickFrameIndex = -1; } void AnimatedSprite::stopAnimation() { - _fileHash1 = 1; + _newAnimFileHash = 1; _animStatus = 2; } -void AnimatedSprite::setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5) { - debug(2, "AnimatedSprite::setFileHash2(%08X, %08X, %08X)", fileHash, fileHash6, fileHash5); - _fileHash1 = fileHash; - _fileHash6 = fileHash6; - _fileHash5 = fileHash5; - _fileHash4 = 0; +void AnimatedSprite::startAnimationByHash(uint32 fileHash, uint32 plFirstFrameHash, uint32 plLastFrameHash) { + debug(2, "AnimatedSprite::startAnimationByHash(%08X, %08X, %08X)", fileHash, plFirstFrameHash, plLastFrameHash); + _newAnimFileHash = fileHash; + _plFirstFrameHash = plFirstFrameHash; + _plLastFrameHash = plLastFrameHash; + _newStickFrameHash = 0; _animStatus = 1; _playBackwards = false; - _newHashListIndex = -1; - _hashListIndex = -1; + _newStickFrameIndex = -1; + _currStickFrameIndex = -1; } -void AnimatedSprite::setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5) { - _fileHash2 = fileHash2; - _fileHash6 = fileHash6; - _fileHash5 = fileHash5; - _fileHash4 = 0; +void AnimatedSprite::nextAnimationByHash(uint32 fileHash2, uint32 plFirstFrameHash, uint32 plLastFrameHash) { + _nextAnimFileHash = fileHash2; + _plFirstFrameHash = plFirstFrameHash; + _plLastFrameHash = plLastFrameHash; + _newStickFrameHash = 0; _animStatus = 1; _playBackwards = false; - _newHashListIndex = -1; - _hashListIndex = -1; + _newStickFrameIndex = -1; + _currStickFrameIndex = -1; } void AnimatedSprite::setFinalizeState(AnimationCb finalizeStateCb) { @@ -505,7 +497,7 @@ void AnimatedSprite::gotoState(AnimationCb currStateCb) { (this->*_currStateCb)(); } -void AnimatedSprite::removeCallbacks() { +void AnimatedSprite::gotoNextState() { if (_finalizeStateCb) { AnimationCb cb = _finalizeStateCb; _finalizeStateCb = NULL; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index aa2272464e..b9decefd0a 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -121,32 +121,24 @@ public: void setRepl(byte oldColor, byte newColor); void clearRepl(); uint32 getCurrAnimFileHash() const { return _currAnimFileHash; } - int16 getFrameIndex() const { return _frameIndex; } + int16 getFrameIndex() const { return _currFrameIndex; } int16 getFrameIndex(uint32 frameHash) { return _animResource.getFrameIndex(frameHash); } - void setNewHashListIndex(int value) { _newHashListIndex = value; } - void setFileHash(uint32 fileHash, int16 frameIndex3, int16 frameIndex4); + void setNewHashListIndex(int value) { _newStickFrameIndex = value; } + void startAnimation(uint32 fileHash, int16 plFirstFrameIndex, int16 plLastFrameIndex); protected: typedef void (AnimatedSprite::*AnimationCb)(); AnimResource _animResource; - uint32 _currAnimFileHash; - uint32 _fileHash1; - uint32 _fileHash2; - int16 _frameIndex; - int16 _frameIndex3; - int16 _frameIndex2; - int16 _frameIndex4; - uint32 _fileHash6; - uint32 _fileHash5; + uint32 _currAnimFileHash, _newAnimFileHash, _nextAnimFileHash; + int16 _currFrameIndex, _lastFrameIndex; + int16 _plFirstFrameIndex, _plLastFrameIndex; + uint32 _plFirstFrameHash, _plLastFrameHash; int16 _animStatus; - int16 _counter; - int _hashListIndex; - int _newHashListIndex; - uint32 _fileHash4; + int16 _currFrameTicks; + int _currStickFrameIndex, _newStickFrameIndex; + uint32 _newStickFrameHash; int16 _deltaX, _deltaY; - byte _replOldColor; - byte _replNewColor; - bool _playBackwards; - bool _flag; + byte _replOldColor, _replNewColor; + bool _playBackwards, _frameChanged; /* TODO callbackListIndex dw ? callbackListCount dw ? @@ -166,11 +158,11 @@ protected: void updateFrameInfo(); void createSurface1(uint32 fileHash, int surfacePriority); void stopAnimation(); - void setFileHash2(uint32 fileHash, uint32 fileHash6, uint32 fileHash5); - void setFileHash3(uint32 fileHash2, uint32 fileHash6, uint32 fileHash5); + void startAnimationByHash(uint32 fileHash, uint32 plFirstFrameHash, uint32 plLastFrameHash); + void nextAnimationByHash(uint32 fileHash2, uint32 plFirstFrameHash, uint32 plLastFrameHash); void setFinalizeState(AnimationCb finalizeStateCb); void gotoState(AnimationCb currStateCb); - void removeCallbacks(); + void gotoNextState(); }; } // End of namespace Neverhood -- cgit v1.2.3 From adb02a9f3800d7ef91d743ef38787f5fcd5ca332 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Oct 2011 10:37:07 +0000 Subject: NEVERHOOD: More renaming --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/klayman.cpp | 703 ++++++++++++++++++--------------------- engines/neverhood/klayman.h | 38 +-- 3 files changed, 339 insertions(+), 406 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 95fe521e23..72f15a6bed 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -275,7 +275,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(1000, -1); #endif -#if 0 +#if 1 _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif @@ -296,7 +296,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 8; createModule(2600, -1); #endif -#if 1 +#if 0 _vm->gameState().which = 0; _vm->gameState().sceneNum = 1; createModule(2700, -1); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 2358df4c8b..bdc53d65f6 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -59,17 +59,17 @@ static const KlaymanIdleTableItem klaymanTable4[] = { Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), - _counterMax(0), _counter(0), _flagE4(false), _counter3Max(0), _flagF8(false), _counter1(0), - _counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _flagE1(false), - _status3(1), _parentScene(parentScene), _flagE2(false), _flagE3(false), _flagF6(false), _isLeverDown(false), - _flagFA(false), _statusE0(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { + _counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0), + _counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), + _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), + _flagFA(false), _ladderStatus(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); _x = x; _y = y; - _x4 = x; - _y4 = y; + _destX = x; + _destY = y; _flags = 2; setKlaymanIdleTable1(); stTryStandIdle(); @@ -84,13 +84,13 @@ uint32 Klayman::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4818: - sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; } return 0; @@ -123,7 +123,7 @@ void Klayman::setKlaymanIdleTable3() { } void Klayman::stDoIdlePickEar() { - sub41D320(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar)); + startIdleAnimation(0x5B20C814, AnimationCallback(&Klayman::stIdlePickEar)); } void Klayman::stIdlePickEar() { @@ -154,7 +154,7 @@ void Klayman::evIdlePickEarDone() { } void Klayman::sub41FDA0() { - sub41D320(0xD122C137, AnimationCallback(&Klayman::sub41FDB0)); + startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::sub41FDB0)); } void Klayman::sub41FDB0() { @@ -180,7 +180,7 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, E } void Klayman::sub41FDF0() { - sub41D320(0x543CD054, AnimationCallback(&Klayman::sub41FE00)); + startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::sub41FE00)); } void Klayman::sub41FE00() { @@ -215,7 +215,7 @@ uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, E } void Klayman::stDoIdleChest() { - sub41D320(0x40A0C034, AnimationCallback(&Klayman::stIdleChest)); + startIdleAnimation(0x40A0C034, AnimationCallback(&Klayman::stIdleChest)); } void Klayman::stIdleChest() { @@ -241,7 +241,7 @@ uint32 Klayman::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *s } void Klayman::sub41FEB0() { - sub41D320(0x5120E137, AnimationCallback(&Klayman::sub41FEC0)); + startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::sub41FEC0)); } void Klayman::sub41FEC0() { @@ -441,26 +441,26 @@ void Klayman::stGetUpFromTeleporter() { ///////////////////////////////////////////////////////////////// void Klayman::sub41CE70() { - _x4 = _x; - if (!_flagE1 && !_flagE2 && !_flagE3) { + _destX = _x; + if (!_isWalking && !_isSneaking && !_isLargeStep) { gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } } -void Klayman::sub41D320(uint32 fileHash, AnimationCb callback) { +void Klayman::startIdleAnimation(uint32 fileHash, AnimationCb callback) { _resourceHandle = _vm->_res->useResource(fileHash); if (_resourceHandle != -1) { // TODO _vm->_res->moveToFront(_resourceHandle); NextState(callback); - SetUpdateHandler(&Klayman::update41D2B0); + SetUpdateHandler(&Klayman::upIdleAnimation); } } -void Klayman::update41D2B0() { +void Klayman::upIdleAnimation() { // TODO Check if this odd stuff is needed or just some cache optimization if (_vm->_res->isResourceDataValid(_resourceHandle)) { - sub41C7B0(); + gotoNextStateExt(); // TODO _vm->_res->moveToBack(_resourceHandle); _vm->_res->unuseResource(_resourceHandle); _resourceHandle = -1; @@ -484,7 +484,7 @@ bool Klayman::stStartActionFromIdle(AnimationCb callback) { return false; } -void Klayman::sub41C7B0() { +void Klayman::gotoNextStateExt() { if (_finalizeStateCb) { AnimationCb cb = _finalizeStateCb; _finalizeStateCb = NULL; @@ -559,7 +559,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E _attachedSprite = (Sprite*)(param.asEntity()); break; case 0x1019: - sub41C7B0(); + gotoNextStateExt(); break; case 0x101C: sub41C770(); @@ -599,7 +599,7 @@ uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, E uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x3002: - sub41C7B0(); + gotoNextStateExt(); break; } return messageResult; @@ -629,33 +629,33 @@ uint32 Klayman::hmStartAction(int messageNum, const MessageParam ¶m, Entity } -void Klayman::sub41C930(int16 x, bool flag) { +void Klayman::startWalkToX(int16 x, bool flag) { int16 xdiff = ABS(x - _x); if (x == _x) { - _x4 = x; - if (!_flagE1 && !_flagE2 && !_flagE3) { + _destX = x; + if (!_isWalking && !_isSneaking && !_isLargeStep) { gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } - } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { - _x4 = x; + } else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) { + _destX = x; gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } else if (xdiff <= 42 && _status3 != 3) { - if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { - _x4 = x; + if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { + _destX = x; } else { - _x4 = x; + _destX = x; GotoState(&Klayman::stSneak); } - } else if (_flagE1 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { - _x4 = x; + } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _destX = x; } else if (flag) { - _x4 = x; + _destX = x; error("// TODO AnimatedSprite_GotoState(&Klayman::sub421550));"); // TODO AnimatedSprite_GotoState(&Klayman::sub421550); } else { - _x4 = x; + _destX = x; GotoState(&Klayman::stStartWalking); } } @@ -701,14 +701,14 @@ bool Klayman::stStartAction(AnimationCb callback3) { NextState(callback3); return true; } else { - _x = _x4; + _x = _destX; return false; } } void Klayman::spriteUpdate41F250() { - int16 xdiff = _x4 - _x; + int16 xdiff = _destX - _x; if (_doDeltaX) { _x -= _deltaX; @@ -730,7 +730,7 @@ void Klayman::spriteUpdate41F250() { else if (xdiff < -6) _x -= 6; else - _x = _x4; + _x = _destX; } processDelta(); @@ -739,7 +739,7 @@ void Klayman::spriteUpdate41F250() { void Klayman::suWalking() { - int16 xdiff = _x4 - _x; + int16 xdiff = _destX - _x; if (_currFrameIndex == 9) { if (xdiff > 26) @@ -754,7 +754,7 @@ void Klayman::suWalking() { xdiff = -_deltaX; _deltaX = 0; - if (_x4 != _x) { + if (_destX != _x) { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdiff; if (_field114) { @@ -787,9 +787,9 @@ void Klayman::suWalking() { void Klayman::stSneak() { _status2 = 1; - _flagE2 = true; + _isSneaking = true; _acceptInput = true; - setDoDeltaX(_x4 < _x ? 1 : 0); + setDoDeltaX(_destX < _x ? 1 : 0); startAnimation(0x5C48C506, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); @@ -798,7 +798,7 @@ void Klayman::stSneak() { } void Klayman::stWalkingDone() { - _flagE2 = false; + _isSneaking = false; } uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -810,60 +810,36 @@ uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sen } else if (param.asInteger() == 0x0A2A9098) { _soundResource1.play(0x0A2AA8E0); } else if (param.asInteger() == 0x32188010) { - if (_soundFlag) { - _soundResource1.play(0x48498E46); - } else { - _soundResource1.play(0x405002D8); - } + _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x02A2909C) { - if (_soundFlag) { - _soundResource1.play(0x50399F64); - } else { - _soundResource1.play(0x0460E2FA); - } + _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); } break; case 0x3002: - _x = _x4; - sub41C7B0(); + _x = _destX; + gotoNextStateExt(); break; } return messageResult; } -void Klayman::sub41CD70(int16 x) { - if (x > _x) { - if (ABS(x - _x) <= 105) { - sub41CAC0(x); - } else { - sub41C930(x, false); - } - } else if (x == _x) { - _x4 = x; - gotoState(NULL); - sub41C7B0(); - } else { - sub41C930(x, false); - } -} - void Klayman::stStartWalking() { if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) { _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; - setDoDeltaX(_x4 < _x ? 1 : 0); + setDoDeltaX(_destX < _x ? 1 : 0); startAnimation(0x242C0198, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteCallback(&Klayman::spriteUpdate41F320); + SetSpriteCallback(&Klayman::suWalkingTestExit); FinalizeState(&Klayman::stStartWalkingDone); NextState(&Klayman::stWalking); } } void Klayman::stStartWalkingDone() { - _flagE1 = false; + _isWalking = false; } uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -871,17 +847,9 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - if (_soundFlag) { - _soundResource1.play(0x48498E46); - } else { - _soundResource1.play(0x405002D8); - } + _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - if (_soundFlag) { - _soundResource1.play(0x50399F64); - } else { - _soundResource1.play(0x0460E2FA); - } + _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); } break; } @@ -890,7 +858,7 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity void Klayman::stWalking() { _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, 0, -1); SetUpdateHandler(&Klayman::update); @@ -901,7 +869,7 @@ void Klayman::stWalking() { } void Klayman::spriteUpdate41F300() { - SetSpriteCallback(&Klayman::spriteUpdate41F320); + SetSpriteCallback(&Klayman::suWalkingTestExit); _deltaX = 0; } @@ -910,17 +878,9 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - if (_soundFlag) { - _soundResource1.play(0x48498E46); - } else { - _soundResource1.play(0x405002D8); - } + _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - if (_soundFlag) { - _soundResource1.play(0x50399F64); - } else { - _soundResource1.play(0x0460E2FA); - } + _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); } break; } @@ -929,13 +889,13 @@ uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, E void Klayman::stUpdateWalking() { if (_status3 == 2) { - sub41C7B0(); + gotoNextStateExt(); } else if (_status3 == 3) { stWalkingOpenDoor(); } else { - _flagE2 = true; + _isSneaking = true; _acceptInput = true; - if (ABS(_x4 - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { + if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { if (_status3 == 0) { _status2 = 1; startAnimation(0xF234EE31, 0, -1); @@ -943,7 +903,7 @@ void Klayman::stUpdateWalking() { _status2 = 2; startAnimation(0xF135CC21, 0, -1); } - } else if (ABS(_x4 - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { + } else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { if (_status3 == 0) { _status2 = 1; startAnimation(0x8604A152, 0, -1); @@ -959,9 +919,9 @@ void Klayman::stUpdateWalking() { } } -void Klayman::spriteUpdate41F320() { - int16 xdiff = ABS(_x4 - _x); - int16 xdelta = _x4 - _x; +void Klayman::suWalkingTestExit() { + int16 xdiff = ABS(_destX - _x); + int16 xdelta = _destX - _x; if (xdelta > _deltaX) xdelta = _deltaX; @@ -970,15 +930,11 @@ void Klayman::spriteUpdate41F320() { _deltaX = 0; - if (xdiff == 0) { - sendMessage(this, 0x1019, 0); - } else if (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { - sendMessage(this, 0x1019, 0); - } else if (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { - sendMessage(this, 0x1019, 0); - } else if (_status3 == 3 && xdiff < 30) { - sendMessage(this, 0x1019, 0); - } else if (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6) { + if (xdiff == 0 || + (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) || + (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) || + (_status3 == 3 && xdiff < 30) || + (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) { sendMessage(this, 0x1019, 0); } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); @@ -993,17 +949,9 @@ void Klayman::spriteUpdate41F320() { } else if (hitRectNext->type == 0x5003) { _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); } else if (hitRectPrev->type == 0x5002) { - if (xdelta > 0) { - _y = hitRectPrev->rect.y2; - } else { - _y = hitRectPrev->rect.y1; - } + _y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; } else if (hitRectPrev->type == 0x5003) { - if (xdelta < 0) { - _y = hitRectPrev->rect.y2; - } else { - _y = hitRectPrev->rect.y1; - } + _y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; } else if (_flagF6 && xdelta != 0) { if (hitRectNext->type == 0x5000) { _y++; @@ -1120,42 +1068,54 @@ void Klayman::stPressButtonSide() { } } -void Klayman::sub41CD00(int16 x) { - if (_x > x) { - if (_x - x <= 105) { - sub41CAC0(x); - } else { - sub41C930(x, false); - } +void Klayman::startSpecialWalkRight(int16 x) { + if (_x == x) { + _destX = x; + gotoState(NULL); + gotoNextStateExt(); } else if (_x < x) { - sub41C930(x, false); + startWalkToX(x, false); + } else if (_x - x <= 105) { + sub41CAC0(x); } else { - _x4 = x; + startWalkToX(x, false); + } +} + +void Klayman::startSpecialWalkLeft(int16 x) { + if (x == _x) { + _destX = x; gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); + } else if (x < _x) { + startWalkToX(x, false); + } else if (x - _x <= 105) { + sub41CAC0(x); + } else { + startWalkToX(x, false); } } void Klayman::sub41CC40(int16 x1, int16 x2) { if (_x > x1) { if (_x == x1 + x2) { - _x4 = x1 + x2; + _destX = x1 + x2; gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } else if (_x < x1 + x2) { sub41CAC0(x1 + x2); } else { - sub41C930(x1 + x2, false); + startWalkToX(x1 + x2, false); } } else { if (_x == x1 - x2) { - _x4 = x1 - x2; + _destX = x1 - x2; gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } else if (_x > x1 - x2) { sub41CAC0(x1 - x2); } else { - sub41C930(x1 - x2, false); + startWalkToX(x1 - x2, false); } } } @@ -1163,35 +1123,35 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { void Klayman::sub41CAC0(int16 x) { int16 xdiff = ABS(x - _x); if (x == _x) { - _x4 = x; - if (!_flagE1 && !_flagE2 && !_flagE3) { + _destX = x; + if (!_isWalking && !_isSneaking && !_isLargeStep) { gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } - } else if (xdiff <= 36 && !_flagE1 && !_flagE2 && !_flagE3) { - _x4 = x; + } else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) { + _destX = x; gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } else if (xdiff <= 42 && _status3 != 3) { - if (_flagE2 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_x4 - _x) > xdiff) { - _x4 = x; + if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { + _destX = x; } else { - _x4 = x; + _destX = x; GotoState(&Klayman::stSneak); } - } else if (_flagE3 && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { - _x4 = x; + } else if (_isLargeStep && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _destX = x; } else { - _x4 = x; + _destX = x; GotoState(&Klayman::stLargeStep); } } void Klayman::stLargeStep() { _status2 = 2; - _flagE3 = true; + _isLargeStep = true; _acceptInput = true; - setDoDeltaX(_x4 >= _x ? 1 : 0); + setDoDeltaX(_destX >= _x ? 1 : 0); startAnimation(0x08B28116, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLargeStep); @@ -1200,11 +1160,11 @@ void Klayman::stLargeStep() { } void Klayman::stLargeStepDone() { - _flagE3 = false; + _isLargeStep = false; } void Klayman::suLargeStep() { - int16 xdiff = _x4 - _x; + int16 xdiff = _destX - _x; if (_doDeltaX) { _deltaX = -_deltaX; @@ -1219,7 +1179,7 @@ void Klayman::suLargeStep() { _deltaX = 0; - if (_x != _x4) { + if (_x != _destX) { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdiff; if (_field114) { @@ -1232,17 +1192,9 @@ void Klayman::suLargeStep() { } else if (hitRectNext->type == 0x5003) { _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); } else if (hitRectPrev->type == 0x5002) { - if (xdiff > 0) { - _y = hitRectPrev->rect.y2; - } else { - _y = hitRectPrev->rect.y1; - } + _y = xdiff > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; } else if (hitRectPrev->type == 0x5003) { - if (xdiff < 0) { - _y = hitRectPrev->rect.y2; - } else { - _y = hitRectPrev->rect.y1; - } + _y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; } } processDelta(); @@ -1260,8 +1212,8 @@ uint32 Klayman::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *s } break; case 0x3002: - _x = _x4; - sub41C7B0(); + _x = _destX; + gotoNextStateExt(); break; } return messageResult; @@ -1394,7 +1346,7 @@ uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity * void Klayman::spriteUpdate41F230() { AnimatedSprite::updateDeltaXY(); - _x4 = _x; + _destX = _x; } void Klayman::sub420340() { @@ -1492,65 +1444,65 @@ void Klayman::sub41CCE0(int16 x) { void Klayman::stContinueClimbLadderUp() { _status2 = 0; _acceptInput = true; - _statusE0 = 3; + _ladderStatus = 3; startAnimationByHash(0x3A292504, 0x01084280, 0); _newStickFrameHash = 0x01084280; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteCallback(NULL); - sub41C7B0(); + gotoNextStateExt(); } -void Klayman::sub4209D0() { - if (!stStartAction(AnimationCallback(&Klayman::sub4209D0))) { +void Klayman::stStartClimbLadderDown() { + if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderDown))) { _status2 = 0; - if (_y4 < _y) { - if (_statusE0 == 1) { - _statusE0 = 2; - sub420BC0(); + if (_destY < _y) { + if (_ladderStatus == 1) { + _ladderStatus = 2; + stClimbLadderHalf(); } else { - sub41C7B0(); + gotoNextStateExt(); } - } else if (_statusE0 == 0) { - _statusE0 = 2; + } else if (_ladderStatus == 0) { + _ladderStatus = 2; _acceptInput = false; startAnimation(0x122D1505, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E0D0); + SetMessageHandler(&Klayman::hmClimbLadderUpDown); SetSpriteCallback(&Klayman::spriteUpdate41F230); - } else if (_statusE0 == 3) { - _statusE0 = 2; - _acceptInput = false; + } else if (_ladderStatus == 3) { + _ladderStatus = 2; + _acceptInput = true; startAnimationByHash(0x122D1505, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E0D0); + SetMessageHandler(&Klayman::hmClimbLadderUpDown); SetSpriteCallback(&Klayman::spriteUpdate41F230); - } else if (_statusE0 == 1) { - _statusE0 = 2; + } else if (_ladderStatus == 1) { + _ladderStatus = 2; _acceptInput = true; startAnimation(0x122D1505, 29 - _currFrameIndex, -1); } } } -void Klayman::sub420BC0() { +void Klayman::stClimbLadderHalf() { _status2 = 2; - if (_statusE0 == 1) { - _statusE0 = 0; + if (_ladderStatus == 1) { + _ladderStatus = 0; _acceptInput = false; startAnimationByHash(0x3A292504, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); SetSpriteCallback(&Klayman::spriteUpdate41F230); - } else if (_statusE0 == 1) { - _statusE0 = 0; + } else if (_ladderStatus == 2) { + _ladderStatus = 0; _acceptInput = false; startAnimationByHash(0x122D1505, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); SetSpriteCallback(&Klayman::spriteUpdate41F230); } else { - sub41C7B0(); + gotoNextStateExt(); } } @@ -1572,7 +1524,7 @@ uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam ¶m, E return messageResult; } -uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1583,19 +1535,14 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, E } else if (param.asInteger() == 0x400A0E64) { _soundResource1.play(0x50E081D9); } else if (param.asInteger() == 0x02421405) { - if (_statusE0 == 1) { + if (_ladderStatus == 1) { startAnimationByHash(0x3A292504, 0x01084280, 0); - } else { - startAnimationByHash(0x122D1505, 0x01084280, 0); - } - if (_statusE0 == 1) { - if (_y4 >= _y - 30) { + if (_destY >= _y - 30) sendMessage(this, 0x1019, 0); - } } else { - if (_y4 <= _y) { + startAnimationByHash(0x122D1505, 0x01084280, 0); + if (_destY <= _y) sendMessage(this, 0x1019, 0); - } } } break; @@ -1603,27 +1550,27 @@ uint32 Klayman::handleMessage41E0D0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub420AD0() { - if (!stStartAction(AnimationCallback(&Klayman::sub420AD0))) { +void Klayman::stStartClimbLadderUp() { + if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderUp))) { _status2 = 0; - if (_y4 >= _y - 30) { - sub41C7B0(); - } else if (_statusE0 == 0) { - _statusE0 = 1; + if (_destY >= _y - 30) { + gotoNextStateExt(); + } else if (_ladderStatus == 0) { + _ladderStatus = 1; _acceptInput = false; startAnimation(0x3A292504, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E0D0); + SetMessageHandler(&Klayman::hmClimbLadderUpDown); SetSpriteCallback(&Klayman::spriteUpdate41F230); - } else if (_statusE0 == 3) { - _statusE0 = 1; + } else if (_ladderStatus == 3) { + _ladderStatus = 1; _acceptInput = true; startAnimationByHash(0x3A292504, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E0D0); + SetMessageHandler(&Klayman::hmClimbLadderUpDown); SetSpriteCallback(&Klayman::spriteUpdate41F230); - } else if (_statusE0 == 2) { - _statusE0 = 1; + } else if (_ladderStatus == 2) { + _ladderStatus = 1; _acceptInput = true; startAnimation(0x3A292504, 29 - _currFrameIndex, -1); } @@ -1648,17 +1595,9 @@ uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity } else if (param.asInteger() == 0x110010D1) { sendMessage(_parentScene, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { - if (_soundFlag) { - _soundResource1.play(0x48498E46); - } else { - _soundResource1.play(0x405002D8); - } + _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - if (_soundFlag) { - _soundResource1.play(0x50399F64); - } else { - _soundResource1.play(0x0460E2FA); - } + _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); } break; } @@ -1792,7 +1731,7 @@ void Klayman::stReturnFromUse() { } void Klayman::stWalkingOpenDoor() { - _flagF8 = false; + _isWalkingOpenDoorNotified = false; _acceptInput = false; startAnimation(0x11A8E012, 0, -1); SetUpdateHandler(&Klayman::update); @@ -1801,16 +1740,16 @@ void Klayman::stWalkingOpenDoor() { } void Klayman::suWalkingOpenDoor() { - if (!_flagF8 && ABS(_x4 - _x) < 80) { + if (!_isWalkingOpenDoorNotified && ABS(_destX - _x) < 80) { sendMessage(_parentScene, 0x4829, 0); - _flagF8 = true; + _isWalkingOpenDoorNotified = true; } AnimatedSprite::updateDeltaXY(); } void Klayman::stMoveObjectSkipTurnFaceObject() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - _flagE4 = false; + _isMoveObjectRequested = false; _acceptInput = true; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); @@ -1829,7 +1768,7 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Enti if (_attachedSprite) sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); } else if (param.asInteger() == 0x02421405) { - if (_flagE4 && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { + if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { stMoveObjectSkipTurn(); } else { FinalizeState(&Klayman::sub420660); @@ -1842,14 +1781,14 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Enti } break; case 0x480A: - _flagE4 = true; + _isMoveObjectRequested = true; return 0; } return handleMessage41D480(messageNum, param, sender); } void Klayman::stMoveObjectSkipTurn() { - _flagE4 = false; + _isMoveObjectRequested = false; _acceptInput = true; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); @@ -1861,7 +1800,7 @@ void Klayman::stMoveObjectFaceObject() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) { _status2 = 2; - _flagE4 = false; + _isMoveObjectRequested = false; _acceptInput = true; startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&Klayman::update); @@ -1925,7 +1864,7 @@ void Klayman::stReleaseLever() { _acceptInput = false; _isLeverDown = false; } else { - sub41C7B0(); + gotoNextStateExt(); } } @@ -1951,7 +1890,7 @@ void Klayman::stInsertDisk() { } if (_counter2 == 0) { gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } else { startAnimation(0xD8C8D100, 0, -1); SetUpdateHandler(&Klayman::update); @@ -2001,7 +1940,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -2027,7 +1966,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: // TODO: It's not really a point but an x1/x2 pair @@ -2052,7 +1991,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4836: if (param.asInteger() == 1) { @@ -2061,10 +2000,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -2125,7 +2064,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -2169,7 +2108,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: sub41CCE0(param.asInteger()); @@ -2180,17 +2119,17 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4821: sendMessage(_parentScene, 0x2005, 0); - _y4 = param.asInteger(); - GotoState(&Klayman::sub4209D0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); break; case 0x4822: sendMessage(_parentScene, 0x2005, 0); - _y4 = param.asInteger(); - GotoState(&Klayman::sub420AD0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); break; case 0x4823: sendMessage(_parentScene, 0x2006, 0); - GotoState(&Klayman::sub420BC0); + GotoState(&Klayman::stClimbLadderHalf); break; case 0x482E: if (param.asInteger() == 1) { @@ -2207,10 +2146,10 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -2295,18 +2234,13 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX); - } + sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX); } else if (param.asInteger() == 0x02421405) { - if (_flagE4) { - if (_attachedSprite) { - if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) { - stContinueMovingVenusFlyTrap(); - } - } + if (_isMoveObjectRequested) { + if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) + stContinueMovingVenusFlyTrap(); } else { - SetMessageHandler(&KmScene1002::handleMessage449BA0); + SetMessageHandler(&KmScene1002::hmFirstMoveVenusFlyTrap); } } else if (param.asInteger() == 0x4AB28209) { sendMessage(_attachedSprite, 0x482A, 0); @@ -2319,13 +2253,13 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m } break; case 0x480A: - _flagE4 = true; + _isMoveObjectRequested = true; return 0; } return handleMessage41D480(messageNum, param, sender); } -uint32 KmScene1002::handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2433,7 +2367,7 @@ void KmScene1002::sub449F70() { _soundResource1.play(0x41648271); _status2 = 1; _acceptInput = false; - _flagE1 = false; + _isWalking = false; startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetSpriteCallback(NULL); @@ -2477,7 +2411,7 @@ void KmScene1002::sub44A150() { _soundResource1.play(0x41648271); _status2 = 1; _acceptInput = false; - _flagE1 = false; + _isWalking = false; startAnimationByHash(0x0013A206, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D480); @@ -2550,7 +2484,7 @@ void KmScene1002::stHitByBoxingGloveDone() { void KmScene1002::stMoveVenusFlyTrap() { if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) { _status2 = 2; - _flagE4 = false; + _isMoveObjectRequested = false; _acceptInput = true; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x5C01A870, 0, -1); @@ -2562,7 +2496,7 @@ void KmScene1002::stMoveVenusFlyTrap() { } void KmScene1002::stContinueMovingVenusFlyTrap() { - _flagE4 = false; + _isMoveObjectRequested = false; _acceptInput = true; startAnimationByHash(0x5C01A870, 0x01084280, 0); SetUpdateHandler(&Klayman::update); @@ -2587,17 +2521,17 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4818: - sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x481E: GotoState(&KmScene1004::stReadNote); @@ -2608,36 +2542,36 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4821: sendMessage(_parentScene, 0x2000, 0); - _y4 = param.asInteger(); - GotoState(&Klayman::sub4209D0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); break; case 0x4822: sendMessage(_parentScene, 0x2000, 0); - _y4 = param.asInteger(); - GotoState(&Klayman::sub420AD0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); break; case 0x4823: sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klayman::sub420BC0); + GotoState(&Klayman::stClimbLadderHalf); break; case 0x4824: sendMessage(_parentScene, 0x2000, 0); - _y4 = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klayman::sub4209D0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klayman::stStartClimbLadderDown); break; case 0x4825: sendMessage(_parentScene, 0x2000, 0); - _y4 = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klayman::sub420AD0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klayman::stStartClimbLadderUp); break; case 0x4828: GotoState(&Klayman::stTurnToBackToUse); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -2678,7 +2612,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: if (_isSittingInTeleporter) @@ -2688,7 +2622,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&Klayman::stWalking); } else { GotoState(&Klayman::stPeekWall); @@ -2696,7 +2630,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481D: if (_isSittingInTeleporter) @@ -2775,7 +2709,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -2802,7 +2736,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -2822,13 +2756,13 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -2836,7 +2770,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { void KmScene1201::update40DBE0() { if (_x >= 380) - sub41C7B0(); + gotoNextStateExt(); Klayman::update(); } @@ -3059,7 +2993,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3075,7 +3009,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3094,10 +3028,10 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -3113,7 +3047,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3123,7 +3057,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; } return 0; @@ -3159,7 +3093,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: if (_isSittingInTeleporter) @@ -3187,7 +3121,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481A: GotoState(&Klayman::stInsertDisk); @@ -3226,7 +3160,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x482E: if (param.asInteger() == 1) { @@ -3262,10 +3196,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { sub417D80(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return messageResult; @@ -3312,7 +3246,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3338,7 +3272,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481A: if (param.asInteger() == 1) { @@ -3367,10 +3301,10 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stStepOver); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -3425,7 +3359,7 @@ void KmScene1308::sub456150() { } if (!_flag1) { gotoState(NULL); - sub41C7B0(); + gotoNextStateExt(); } else { _acceptInput = false; startAnimation(0xDC409440, 0, -1); @@ -3449,7 +3383,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3472,7 +3406,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3492,7 +3426,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x482E: if (param.asInteger() == 1) { @@ -3524,7 +3458,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3538,7 +3472,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3569,7 +3503,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3595,7 +3529,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3608,10 +3542,10 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stReleaseLever); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -3629,7 +3563,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -3652,7 +3586,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481A: GotoState(&Klayman::stInsertDisk); @@ -3685,13 +3619,13 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -3708,7 +3642,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: if (_isSittingInTeleporter) @@ -3727,7 +3661,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3759,7 +3693,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4834: GotoState(&Klayman::stStepOver); @@ -3775,10 +3709,10 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -3801,7 +3735,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: if (_isSittingInTeleporter) { @@ -3824,7 +3758,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -3941,14 +3875,14 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481D: GotoState(&Klayman::stTurnToUse); @@ -3958,13 +3892,13 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -3983,7 +3917,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: if (_isSittingInTeleporter) { @@ -3994,7 +3928,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&Klayman::stWalking); } else { GotoState(&Klayman::stPeekWall); @@ -4002,7 +3936,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481D: if (_isSittingInTeleporter) { @@ -4084,7 +4018,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: if (_isSittingInTeleporter) @@ -4115,7 +4049,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4232,7 +4166,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -4247,10 +4181,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4818: - sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4267,7 +4201,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x482E: if (param.asInteger() == 1) { @@ -4284,10 +4218,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -4302,7 +4236,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -4327,10 +4261,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4818: - sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4819: GotoState(&Klayman::stClayDoorOpen); @@ -4353,13 +4287,13 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -4378,14 +4312,14 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&KmScene2205::sub423980); } else { GotoState(&Klayman::stPeekWall); @@ -4398,16 +4332,16 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4818: - sub41C930(_dataResource.getPoint(param.asInteger()).x, false); + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -4418,7 +4352,7 @@ void KmScene2205::sub423980() { if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); @@ -4446,7 +4380,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -4456,7 +4390,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&KmScene2206::sub482530); } else { GotoState(&Klayman::stPeekWall); @@ -4480,7 +4414,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4504,7 +4438,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x482E: if (param.asInteger() == 1) { @@ -4524,10 +4458,10 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41CE70(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -4536,9 +4470,8 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { void KmScene2206::spriteUpdate482450() { _yDelta++; _y += _yDelta; - if (_y > 600) { + if (_y > 600) sendMessage(this, 0x1019, 0); - } } void KmScene2206::sub482490() { @@ -4560,7 +4493,7 @@ void KmScene2206::sub482530() { if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); @@ -4586,7 +4519,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); @@ -4608,7 +4541,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4622,13 +4555,13 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x483F: - sub41CD00(param.asInteger()); + startSpecialWalkRight(param.asInteger()); break; case 0x4840: - sub41CD70(param.asInteger()); + startSpecialWalkLeft(param.asInteger()); break; } return 0; @@ -4704,14 +4637,14 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&KmScene2242::sub444D20); } else { GotoState(&Klayman::stPeekWall); @@ -4728,7 +4661,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481B: if (param.asPoint().y != 0) { @@ -4752,7 +4685,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4837: sub41CE70(); @@ -4766,7 +4699,7 @@ void KmScene2242::sub444D20() { if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); @@ -4789,14 +4722,14 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&KmHallOfRecords::sub43B130); } else { GotoState(&Klayman::stPeekWall); @@ -4804,7 +4737,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481F: if (param.asInteger() == 0) { @@ -4821,7 +4754,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4837: sub41CE70(); @@ -4835,7 +4768,7 @@ void KmHallOfRecords::sub43B130() { if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); @@ -4858,14 +4791,14 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41C930(param.asPoint().x, false); + startWalkToX(param.asPoint().x, false); break; case 0x4004: GotoState(&Klayman::stTryStandIdle); break; case 0x4804: if (param.asInteger() != 0) { - _x4 = param.asInteger(); + _destX = param.asInteger(); GotoState(&KmScene2247::sub453520); } else { GotoState(&Klayman::stPeekWall); @@ -4873,7 +4806,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4817: setDoDeltaX(param.asInteger()); - sub41C7B0(); + gotoNextStateExt(); break; case 0x481F: if (param.asInteger() == 0) { @@ -4890,7 +4823,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - sub41C7B0(); + gotoNextStateExt(); break; case 0x4837: sub41CE70(); @@ -4904,7 +4837,7 @@ void KmScene2247::sub453520() { if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; - _flagE1 = true; + _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3b8ee69262..c19e884000 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -75,9 +75,9 @@ public: void stReleaseRing(); void stJumpToRing4(); void stContinueClimbLadderUp(); - void sub4209D0(); - void sub420BC0(); - void sub420AD0(); + void stStartClimbLadderDown(); + void stClimbLadderHalf(); + void stStartClimbLadderUp(); void stWalkToFrontNoStep(); void stWalkToFront(); void stTurnToFront(); @@ -122,7 +122,7 @@ public: void spriteUpdate41F230(); void suWalkingOpenDoor(); void spriteUpdate41F300(); - void spriteUpdate41F320(); + void suWalkingTestExit(); uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); @@ -139,20 +139,20 @@ public: protected: Entity *_parentScene; Sprite *_attachedSprite; - int _statusE0; - bool _flagE1; - bool _flagE2; - bool _flagE3; - bool _flagE4; + int _ladderStatus; + bool _isWalking; + bool _isSneaking; + bool _isLargeStep; + bool _isMoveObjectRequested; bool _acceptInput; - int16 _x4, _y4; + int16 _destX, _destY; int16 _counter, _counterMax; int16 _counter3, _counter3Max; int16 _counter1; int16 _counter2; bool _flagF6; bool _isLeverDown; - bool _flagF8; + bool _isWalkingOpenDoorNotified; int _status2; bool _flagFA; SoundResource _soundResource1; @@ -187,11 +187,11 @@ protected: void sub41FEC0(); uint32 handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41D320(uint32 fileHash, AnimationCb callback); - void update41D2B0(); + void startIdleAnimation(uint32 fileHash, AnimationCb callback); + void upIdleAnimation(); bool stStartActionFromIdle(AnimationCb callback); - void sub41C7B0(); + void gotoNextStateExt(); void sub41C770(); void sub41C790(); @@ -202,7 +202,7 @@ protected: uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41C930(int16 x, bool flag); + void startWalkToX(int16 x, bool flag); uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); @@ -211,7 +211,7 @@ protected: void stSneak(); void stWalkingDone(); uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41CD70(int16 x); + void startSpecialWalkLeft(int16 x); void stStartWalking(); uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); @@ -219,7 +219,7 @@ protected: uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41CD00(int16 x); + void startSpecialWalkRight(int16 x); void sub41CC40(int16 x1, int16 x2); void sub41CAC0(int16 x); void sub41CCE0(int16 x); @@ -232,7 +232,7 @@ protected: uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmHoldRing(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E0D0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); @@ -271,7 +271,7 @@ protected: uint32 handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage449BA0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender); void suFallDown(); -- cgit v1.2.3 From f43b54827e543aa28701cbb1b2d46643802cbb16 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Oct 2011 12:04:59 +0000 Subject: NEVERHOOD: Some renaming in Module1000 --- engines/neverhood/module1000.cpp | 293 +++++++++++++++++++-------------------- engines/neverhood/module1000.h | 105 +++++++------- engines/neverhood/neverhood.cpp | 5 +- 3 files changed, 197 insertions(+), 206 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index ea1400e965..2ee98acbd2 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -120,7 +120,7 @@ AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) createSurface(800, 137, 242); _x = 726; _y = 440; - callback1(); + stShowIdleDoor(); _soundResource2.load(0xED403E03); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1001Door::handleMessage); @@ -130,7 +130,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: - handleMessage2000h(); + hammerHitsDoor(); break; case 0x3002: gotoNextState(); @@ -139,18 +139,18 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, return 0; } -void AsScene1001Door::handleMessage2000h() { +void AsScene1001Door::hammerHitsDoor() { switch (getGlobalVar(0x52371C95)) { case 0: case 1: _soundResource1.play(0x65482F03); startAnimation(0x624C0498, 1, 3); - NextState(&AsScene1001Door::callback1); + NextState(&AsScene1001Door::stShowIdleDoor); break; case 2: _soundResource2.play(); startAnimation(0x624C0498, 6, 6); - NextState(&AsScene1001Door::callback2); + NextState(&AsScene1001Door::stBustedDoorMove); break; default: // Nothing @@ -159,7 +159,7 @@ void AsScene1001Door::handleMessage2000h() { incGlobalVar(0x52371C95, 1); } -void AsScene1001Door::callback1() { +void AsScene1001Door::stShowIdleDoor() { switch (getGlobalVar(0x52371C95)) { case 1: startAnimation(0x624C0498, 4, -1); @@ -180,14 +180,14 @@ void AsScene1001Door::callback1() { } } -void AsScene1001Door::callback2() { +void AsScene1001Door::stBustedDoorMove() { setGlobalVar(0xD217189D, 1); startAnimation(0x624C0498, 6, 6); - NextState(&AsScene1001Door::callback3); + NextState(&AsScene1001Door::stBustedDoorGone); _x = 30; } -void AsScene1001Door::callback3() { +void AsScene1001Door::stBustedDoorGone() { _soundResource1.play(); stopAnimation(); setVisible(false); @@ -330,7 +330,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p } Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _fieldE4(-1), _fieldE6(-1) { + : Scene(vm, parentModule, true) { _name = "Scene1001"; @@ -505,15 +505,15 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f createSurface(990, 68, 314); if (flag2) { startAnimation(0x04103090, 0, -1); - SetMessageHandler(&AsScene1002Ring::handleMessage447930); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); } else { startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); - SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); + SetMessageHandler(&AsScene1002Ring::hmRingIdle); } } else { createSurface(990, 68, 138); startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); - SetMessageHandler(&AsScene1002Ring::handleMessage4475E0); + SetMessageHandler(&AsScene1002Ring::hmRingIdle); } setClipRect(0, clipY1, 640, 480); @@ -530,13 +530,13 @@ void AsScene1002Ring::update() { AnimatedSprite::updatePosition(); } -uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4806: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); sendMessage(_parentScene, 0x4806, 0); - SetMessageHandler(&AsScene1002Ring::handleMessage447760); + SetMessageHandler(&AsScene1002Ring::hmRingPulled1); if (_flag1) { startAnimation(0x87502558, 0, -1); } else { @@ -546,7 +546,7 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam & case 0x480F: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); sendMessage(_parentScene, 0x480F, 0); - SetMessageHandler(&AsScene1002Ring::handleMessage447890); + SetMessageHandler(&AsScene1002Ring::hmRingPulled2); startAnimation(0x861A2020, 0, -1); break; case 0x482A: @@ -559,23 +559,23 @@ uint32 AsScene1002Ring::handleMessage4475E0(int messageNum, const MessageParam & return messageResult; } -uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: if (_flag1) { startAnimation(0x78D0A812, 0, -1); - SetMessageHandler(&AsScene1002Ring::handleMessage447930); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); } else { startAnimation(0xB85D2A10, 0, -1); - SetMessageHandler(&AsScene1002Ring::handleMessage447930); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); } break; case 0x4807: sendMessage(_parentScene, 0x4807, 0); setDoDeltaX(_vm->_rnd->getRandomNumber(1)); startAnimation(0x8258A030, 0, -1); - SetMessageHandler(&AsScene1002Ring::handleMessage447A00); + SetMessageHandler(&AsScene1002Ring::hmRingReleased); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -587,12 +587,12 @@ uint32 AsScene1002Ring::handleMessage447760(int messageNum, const MessageParam & return messageResult; } -uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: startAnimation(0x04103090, 0, -1); - SetMessageHandler(&AsScene1002Ring::handleMessage447930); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -604,14 +604,14 @@ uint32 AsScene1002Ring::handleMessage447890(int messageNum, const MessageParam & return messageResult; } -uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4807: sendMessage(_parentScene, 0x4807, 0); setDoDeltaX(_vm->_rnd->getRandomNumber(1)); startAnimation(0x8258A030, 0, -1); - SetMessageHandler(&AsScene1002Ring::handleMessage447A00); + SetMessageHandler(&AsScene1002Ring::hmRingReleased); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -623,8 +623,8 @@ uint32 AsScene1002Ring::handleMessage447930(int messageNum, const MessageParam & return messageResult; } -uint32 AsScene1002Ring::handleMessage447A00(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage4475E0(messageNum, param, sender); +uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmRingIdle(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x05410F72) { @@ -715,16 +715,16 @@ void AsScene1002Door::suCloseDoor() { } } -Class505::Class505(NeverhoodEngine *vm) +AsScene1002BoxingGloveHitEffect::AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm) : AnimatedSprite(vm, 1400) { createSurface(1025, 88, 165); setVisible(false); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class505::handleMessage); + SetMessageHandler(&AsScene1002BoxingGloveHitEffect::handleMessage); } -uint32 Class505::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2004: @@ -741,39 +741,39 @@ uint32 Class505::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505) - : AnimatedSprite(vm, 1300), _rect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _class505(class505), +AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect) + : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(AsScene1002BoxingGloveHitEffect), _soundResource(vm) { SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); - SetSpriteCallback(&AsScene1002DoorSpy::spriteUpdate448AA0); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage); + SetSpriteCallback(&AsScene1002DoorSpy::suDoorSpy); createSurface(800, 136, 147); setClipRect(clipRect); - spriteUpdate448AA0(); + suDoorSpy(); _soundResource.load(0xC0C40298); startAnimation(0x586C1D48, 0, 0); } -uint32 AsScene1002DoorSpy::handleMessage4489D0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0xA61CA1C2) { - sendMessage(_class505, 0x2004, 0); + sendMessage(_asBoxingGloveHitEffect, 0x2004, 0); } else if (param.asInteger() == 0x14CE0620) { _soundResource.play(); } break; case 0x2003: - sub448B10(); + stDoorSpyBoxingGlove(); break; } return messageResult; } -uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage4489D0(messageNum, param, sender); +uint32 AsScene1002DoorSpy::hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextState(); @@ -782,24 +782,24 @@ uint32 AsScene1002DoorSpy::handleMessage448A60(int messageNum, const MessagePara return messageResult; } -void AsScene1002DoorSpy::spriteUpdate448AA0() { +void AsScene1002DoorSpy::suDoorSpy() { _x = _asDoor->getX() + 34; _y = _asDoor->getY() + 175; } -void AsScene1002DoorSpy::sub448AC0() { - setClipRect(_rect); +void AsScene1002DoorSpy::stDoorSpyIdle() { + setClipRect(_clipRect); _parentScene->setSurfacePriority(getSurface(), 800); startAnimation(0x586C1D48, 0, 0); - SetMessageHandler(&AsScene1002DoorSpy::handleMessage4489D0); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage); } -void AsScene1002DoorSpy::sub448B10() { +void AsScene1002DoorSpy::stDoorSpyBoxingGlove() { setClipRect(0, 0, 640, 480); _parentScene->setSurfacePriority(getSurface(), 1200); startAnimation(0x586C1D48, 1, -1); - SetMessageHandler(&AsScene1002DoorSpy::handleMessage448A60); - NextState(&AsScene1002DoorSpy::sub448AC0); + SetMessageHandler(&AsScene1002DoorSpy::hmDoorSpyAnimation); + NextState(&AsScene1002DoorSpy::stDoorSpyIdle); } Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) @@ -908,7 +908,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par createSurface(995, 175, 195); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); SetSpriteCallback(&AnimatedSprite::updateDeltaXY); if (!_flag) { @@ -916,19 +916,19 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par setDoDeltaX(1); _x = 366; _y = 435; - sub4485F0(); + stRingGrabbed(); } else { _x = 174 + getGlobalVar(0x1B144052) * 32; _y = 435; - sub448660(); + stIdle(); } } else { _x = 186 + getGlobalVar(0x86341E88) * 32; _y = 364; if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) { - sub4485F0(); + stRingGrabbed(); } else { - sub448660(); + stIdle(); } } @@ -942,7 +942,7 @@ void AsScene1002VenusFlyTrap::update() { AnimatedSprite::update(); } -void AsScene1002VenusFlyTrap::update447FB0() { +void AsScene1002VenusFlyTrap::upIdle() { if (_countdown == 0 && _klayman->getX() - 20 > _x) { setDoDeltaX(1); } else if (_klayman->getX() + 20 < _x) { @@ -951,7 +951,7 @@ void AsScene1002VenusFlyTrap::update447FB0() { update(); } -uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -978,15 +978,15 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag setDoDeltaX(param.asInteger() != 0 ? 1 : 0); if (!_flag) { if (getGlobalVar(0x8306F218)) { - sub448560(); + stRelease(); } else { - sub448530(); + stWalk(); } } else { if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) { - sub448560(); + stRelease(); } else { - sub448530(); + stWalk(); } } break; @@ -1005,11 +1005,11 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag break; case 0x480E: if (param.asInteger() == 1) { - sub4485B0(); + stGrabRing(); } break; case 0x4810: - sub448780(); + swallowKlayman(); break; case 0x482A: sendMessage(_parentScene, 0x1022, 995); @@ -1021,8 +1021,8 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448000(int messageNum, const Messag return messageResult; } -uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage448000(messageNum, param, sender); +uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextState(); @@ -1031,7 +1031,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage4482E0(int messageNum, const Messag return messageResult; } -uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1066,87 +1066,87 @@ uint32 AsScene1002VenusFlyTrap::handleMessage448320(int messageNum, const Messag return messageResult; } -void AsScene1002VenusFlyTrap::sub4484F0() { +void AsScene1002VenusFlyTrap::stWalkBack() { setDoDeltaX(2); startAnimation(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - NextState(&AsScene1002VenusFlyTrap::sub448660); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stIdle); } -void AsScene1002VenusFlyTrap::sub448530() { +void AsScene1002VenusFlyTrap::stWalk() { startAnimation(0xC4080034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); - NextState(&AsScene1002VenusFlyTrap::sub448660); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); + NextState(&AsScene1002VenusFlyTrap::stIdle); } -void AsScene1002VenusFlyTrap::sub448560() { +void AsScene1002VenusFlyTrap::stRelease() { sendMessage(_parentScene, 0x4807, 0); startAnimation(0x82292851, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); - NextState(&AsScene1002VenusFlyTrap::sub448660); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); + NextState(&AsScene1002VenusFlyTrap::stIdle); } -void AsScene1002VenusFlyTrap::sub4485B0() { +void AsScene1002VenusFlyTrap::stGrabRing() { setDoDeltaX(1); startAnimation(0x86A82A11, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage4482E0); - NextState(&AsScene1002VenusFlyTrap::sub4485F0); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); + NextState(&AsScene1002VenusFlyTrap::stRingGrabbed); } -void AsScene1002VenusFlyTrap::sub4485F0() { +void AsScene1002VenusFlyTrap::stRingGrabbed() { startAnimation(0xB5A86034, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); } -void AsScene1002VenusFlyTrap::sub448620() { +void AsScene1002VenusFlyTrap::stKlaymanInside() { startAnimation(0x31303094, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(NULL); - NextState(&AsScene1002VenusFlyTrap::sub448720); + NextState(&AsScene1002VenusFlyTrap::stKlaymanInsideMoving); _countdown = 24; } -void AsScene1002VenusFlyTrap::sub448660() { +void AsScene1002VenusFlyTrap::stIdle() { startAnimation(0xC8204250, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update447FB0); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448000); + SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); if (_flag) { if (_x >= 154 && _x <= 346) { setGlobalVar(0x86341E88, (_x - 186) / 32); } else { - NextState(&AsScene1002VenusFlyTrap::sub4484F0); + NextState(&AsScene1002VenusFlyTrap::stWalkBack); _countdown = 12; } } else { if (_x >= 174 && _x <= 430) { setGlobalVar(0x1B144052, (_x - 174) / 32); } else { - NextState(&AsScene1002VenusFlyTrap::sub4484F0); + NextState(&AsScene1002VenusFlyTrap::stWalkBack); _countdown = 12; } } } -void AsScene1002VenusFlyTrap::sub448720() { +void AsScene1002VenusFlyTrap::stKlaymanInsideMoving() { startAnimation(0x152920C4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - NextState(&AsScene1002VenusFlyTrap::sub448750); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stSpitOutKlayman); } -void AsScene1002VenusFlyTrap::sub448750() { +void AsScene1002VenusFlyTrap::stSpitOutKlayman() { startAnimation(0x84001117, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - NextState(&AsScene1002VenusFlyTrap::sub448660); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stIdle); } -void AsScene1002VenusFlyTrap::sub448780() { +void AsScene1002VenusFlyTrap::swallowKlayman() { if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) { if (_flag) { setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); @@ -1156,12 +1156,12 @@ void AsScene1002VenusFlyTrap::sub448780() { sendMessage(_klayman, 0x2001, 0); startAnimation(0x8C2C80D4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage448320); - NextState(&AsScene1002VenusFlyTrap::sub448620); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stKlaymanInside); } } -Class506::Class506(NeverhoodEngine *vm) +AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200), _countdown(0) { createSurface(850, 186, 212); @@ -1173,38 +1173,38 @@ Class506::Class506(NeverhoodEngine *vm) } else { setVisible(false); } - SetUpdateHandler(&Class506::update); - SetMessageHandler(&Class506::handleMessage4491B0); + SetUpdateHandler(&AsScene1002OutsideDoorBackground::update); + SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); } -void Class506::update() { +void AsScene1002OutsideDoorBackground::update() { if (_countdown != 0 && (--_countdown == 0)) { - if (_flag) { - sub449280(); + if (_isDoorClosed) { + stCloseDoor(); } else { - sub449250(); + stOpenDoor(); } } AnimatedSprite::update(); } -uint32 Class506::handleMessage4491B0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageResult) { case 0x4808: - _flag = false; + _isDoorClosed = false; _countdown = 2; break; case 0x4809: - _flag = true; + _isDoorClosed = true; _countdown = 2; break; } return messageResult; } -uint32 Class506::handleMessage449210(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage4491B0(messageNum, param, sender); +uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); switch (messageResult) { case 0x3002: gotoNextState(); @@ -1213,45 +1213,45 @@ uint32 Class506::handleMessage449210(int messageNum, const MessageParam ¶m, return messageResult; } -void Class506::sub449250() { +void AsScene1002OutsideDoorBackground::stOpenDoor() { startAnimation(0x004A4495, 0, -1); - SetMessageHandler(&Class506::handleMessage4491B0); + SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); _newStickFrameIndex = -2; setVisible(true); } -void Class506::sub449280() { +void AsScene1002OutsideDoorBackground::stCloseDoor() { startAnimation(0x004A4495, -1, -1); _playBackwards = true; - SetMessageHandler(&Class506::handleMessage449210); - NextState(&Class506::sub4492C0); + SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation); + NextState(&AsScene1002OutsideDoorBackground::stDoorClosed); setVisible(true); } -void Class506::sub4492C0() { +void AsScene1002OutsideDoorBackground::stDoorClosed() { setVisible(false); stopAnimation(); } -Class478::Class478(NeverhoodEngine *vm, Klayman *klayman) +AsScene1002KlaymanLadderHands::AsScene1002KlaymanLadderHands(NeverhoodEngine *vm, Klayman *klayman) : AnimatedSprite(vm, 1200), _klayman(klayman) { createSurface(1200, 40, 163); - SetUpdateHandler(&Class478::update); + SetUpdateHandler(&AsScene1002KlaymanLadderHands::update); SetMessageHandler(&Sprite::handleMessage); setVisible(false); } -void Class478::update() { +void AsScene1002KlaymanLadderHands::update() { if (_klayman->getCurrAnimFileHash() == 0x3A292504) { - startAnimation(0xBA280522, _currFrameIndex, -1); + startAnimation(0xBA280522, _klayman->getFrameIndex(), -1); _newStickFrameIndex = _klayman->getFrameIndex(); setVisible(true); _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); } else if (_klayman->getCurrAnimFileHash() == 0x122D1505) { - startAnimation(0x1319150C, _currFrameIndex, -1); + startAnimation(0x1319150C, _klayman->getFrameIndex(), -1); _newStickFrameIndex = _klayman->getFrameIndex(); setVisible(true); _x = _klayman->getX(); @@ -1263,17 +1263,17 @@ void Class478::update() { AnimatedSprite::update(); } -Class479::Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman) +AsScene1002KlaymanPeekHand::AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman) : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman), - _flag1(false) { + _isClipRectSaved(false) { - SetUpdateHandler(&Class479::update); - SetMessageHandler(&Class479::handleMessage); + SetUpdateHandler(&AsScene1002KlaymanPeekHand::update); + SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage); createSurface(1000, 33, 41); setVisible(false); } -void Class479::update() { +void AsScene1002KlaymanPeekHand::update() { if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) { startAnimation(0x9820C913, _klayman->getFrameIndex(), -1); _newStickFrameIndex = _klayman->getFrameIndex(); @@ -1287,20 +1287,19 @@ void Class479::update() { AnimatedSprite::update(); } -uint32 Class479::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { sendMessage(_parentScene, 0x1022, 1200); - _flag1 = true; + _isClipRectSaved = true; _savedClipRect = _surface->getClipRect(); setClipRect(0, 0, 640, 480); } else if (param.asInteger() == 0x88001184) { sendMessage(_parentScene, 0x1022, 1000); - if (_flag1) { + if (_isClipRectSaved) setClipRect(_savedClipRect); - } } break; } @@ -1339,41 +1338,41 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { if (_vm->_gameState.field2 == 0) { insertKlayman(90, 226, _class599, _ssLadderArch); - _class478 = insertSprite(_klayman); + _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); - _class478->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); + _asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { insertKlayman(379, 435, _class599, _ssLadderArch); - _class478 = insertSprite(_klayman); + _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _class478->setClipRect(_klayman->getClipRect()); + _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { insertKlayman(650, 435, _class599, _ssLadderArch); - _class478 = insertSprite(_klayman); + _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4478); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _class478->setClipRect(_klayman->getClipRect()); + _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; } else if (which == 2) { insertKlayman(68, 645, _class599, _ssLadderArch); - _class478 = insertSprite(_klayman); + _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4298); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _class478->setClipRect(_klayman->getClipRect()); + _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; sendMessage(_klayman, 0x4820, 0); } else { insertKlayman(90, 226, _class599, _ssLadderArch); - _class478 = insertSprite(_klayman); + _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4470); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); - _class478->setClipRect(_klayman->getClipRect()); - _class479 = insertSprite(this, _klayman); - _class479->setClipRect(_klayman->getClipRect()); + _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); + _asKlaymanPeekHand = insertSprite(this, _klayman); + _asKlaymanPeekHand->setClipRect(_klayman->getClipRect()); _klayman->setRepl(64, 0); _vm->_gameState.field2 = 0; } @@ -1391,7 +1390,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asRing5 = insertSprite(this, false, 425, 184, _class599->getDrawRect().y, false); _asDoor = insertSprite(tempClipRect); - tempSprite = insertSprite(); + tempSprite = insertSprite(); _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); _class426 = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); _asVenusFlyTrap = insertSprite(this, _klayman, false); @@ -1399,7 +1398,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); - _class506 = insertSprite(); + _asOutsideDoorBackground = insertSprite(); setRectList(0x004B43A0); @@ -1415,7 +1414,7 @@ void Scene1002::update() { Scene::update(); if (!_flag1B4 && _klayman->getY() > 230) { _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _class478->setClipRect(_klayman->getClipRect()); + _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); deleteSprite(&_ssLadderArchPart3); _klayman->clearRepl(); _flag1B4 = true; @@ -1430,7 +1429,6 @@ void Scene1002::update() { } uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Scene1002::handleMessage(%04X)", messageNum); uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -1525,7 +1523,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setGlobalVar(0x4DE80AC0, 0); _soundResource2.play(); sendMessage(_asDoor, 0x4808, 0); - sendMessage(_class506, 0x4808, 0); + sendMessage(_asOutsideDoorBackground, 0x4808, 0); } else if (sender == _asRing4) { setGlobalVar(0x4DE80AC0, 0); _soundResource1.play(0xE0558848); @@ -1538,7 +1536,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _asRing3) { _soundResource3.play(); sendMessage(_asDoor, 0x4809, 0); - sendMessage(_class506, 0x4809, 0); + sendMessage(_asOutsideDoorBackground, 0x4809, 0); } else if (sender == _asVenusFlyTrap) { if (getGlobalVar(0x8306F218)) { sendMessage(_asRing3, 0x4807, 0); @@ -1552,7 +1550,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setGlobalVar(0x4DE80AC0, 0); _soundResource2.play(); sendMessage(_asDoor, 0x4808, 0); - sendMessage(_class506, 0x4808, 0); + sendMessage(_asOutsideDoorBackground, 0x4808, 0); break; } return messageResult; @@ -1561,7 +1559,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit // Class152 Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) - : Scene(vm, parentModule, true), _fieldD0(-1), _fieldD2(-1) { + : Scene(vm, parentModule, true) { _surfaceFlag = false; @@ -1576,9 +1574,8 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); - } break; } return 0; @@ -1656,7 +1653,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) updatePaletteArea(); - _class478 = insertSprite(_klayman); + _asKlaymanLadderHands = insertSprite(_klayman); insertStaticSprite(0x800034A0, 1100); insertStaticSprite(0x64402020, 1100); @@ -1664,7 +1661,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x0E002004, 1300); _klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); - _class478->setClipRect(_klayman->getClipRect()); + _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); _asTrashCan = insertSprite(); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 47b1a91229..702f538dfd 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -50,10 +50,10 @@ protected: SoundResource _soundResource1; SoundResource _soundResource2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void handleMessage2000h(); - void callback1(); - void callback2(); - void callback3(); + void hammerHitsDoor(); + void stShowIdleDoor(); + void stBustedDoorMove(); + void stBustedDoorGone(); }; class AsScene1001Hammer : public AnimatedSprite { @@ -104,8 +104,6 @@ protected: Sprite *_asWindow; Sprite *_asLever; Sprite *_ssButton; - int16 _fieldE4; - int16 _fieldE6; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -115,9 +113,6 @@ class Class152 : public Scene { public: Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash); protected: - // TODO: Are these used? - int16 _fieldD0; - int16 _fieldD2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -147,11 +142,11 @@ protected: bool _flag1; SoundResource _soundResource; void update(); - uint32 handleMessage4475E0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage447760(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage447890(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage447930(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage447A00(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingPulled2(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingHangingLow(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingReleased(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene1002Door : public StaticSprite { @@ -164,27 +159,27 @@ protected: void suCloseDoor(); }; -class Class505 : public AnimatedSprite { +class AsScene1002BoxingGloveHitEffect : public AnimatedSprite { public: - Class505(NeverhoodEngine *vm); + AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene1002DoorSpy : public AnimatedSprite { public: - AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *class505); + AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect); protected: Scene *_parentScene; Sprite *_asDoor; - Sprite *_class505; + Sprite *_asBoxingGloveHitEffect; SoundResource _soundResource; - NRect _rect; - uint32 handleMessage4489D0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage448A60(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate448AA0(); - void sub448AC0(); - void sub448B10(); + NRect _clipRect; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void suDoorSpy(); + void stDoorSpyIdle(); + void stDoorSpyBoxingGlove(); }; class Class426 : public StaticSprite { @@ -212,51 +207,51 @@ protected: SoundResource _soundResource; bool _flag; void update(); - void update447FB0(); - uint32 handleMessage448000(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage4482E0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage448320(int messageNum, const MessageParam ¶m, Entity *sender); - void sub4484F0(); - void sub448530(); - void sub448560(); - void sub4485B0(); - void sub4485F0(); - void sub448620(); - void sub448660(); - void sub448720(); - void sub448750(); - void sub448780(); + void upIdle(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimationSimple(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimationExt(int messageNum, const MessageParam ¶m, Entity *sender); + void stWalkBack(); + void stWalk(); + void stRelease(); + void stGrabRing(); + void stRingGrabbed(); + void stKlaymanInside(); + void stIdle(); + void stKlaymanInsideMoving(); + void stSpitOutKlayman(); + void swallowKlayman(); }; -class Class506 : public AnimatedSprite { +class AsScene1002OutsideDoorBackground : public AnimatedSprite { public: - Class506(NeverhoodEngine *vm); + AsScene1002OutsideDoorBackground(NeverhoodEngine *vm); protected: int _countdown; - bool _flag; + bool _isDoorClosed; void update(); - uint32 handleMessage4491B0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage449210(int messageNum, const MessageParam ¶m, Entity *sender); - void sub449250(); - void sub449280(); - void sub4492C0(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); + void stDoorClosed(); }; -class Class478 : public AnimatedSprite { +class AsScene1002KlaymanLadderHands : public AnimatedSprite { public: - Class478(NeverhoodEngine *vm, Klayman *klayman); + AsScene1002KlaymanLadderHands(NeverhoodEngine *vm, Klayman *klayman); protected: Klayman *_klayman; void update(); }; -class Class479 : public AnimatedSprite { +class AsScene1002KlaymanPeekHand : public AnimatedSprite { public: - Class479(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman); + AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman); protected: Scene *_parentScene; Klayman *_klayman; - bool _flag1; + bool _isClipRectSaved; NRect _savedClipRect; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -280,9 +275,9 @@ protected: Sprite *_ssLadderArchPart2; Sprite *_ssLadderArchPart3; Sprite *_class599; - Sprite *_class478; - Sprite *_class479; - Sprite *_class506; + Sprite *_asKlaymanLadderHands; + Sprite *_asKlaymanPeekHand; + Sprite *_asOutsideDoorBackground; Sprite *_class426; SoundResource _soundResource1; SoundResource _soundResource2; @@ -308,7 +303,7 @@ class Scene1004 : public Scene { public: Scene1004(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_class478; + Sprite *_asKlaymanLadderHands; Sprite *_asTrashCan; int _paletteAreaStatus; void update(); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index f1f4bab9cd..7fa6fb0def 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -200,7 +200,8 @@ void NeverhoodEngine::dumpAllResources() { PaletteResource paletteResource(this); byte *vgaPalette = new byte[768]; - paletteResource.load(0x4086520E); + //paletteResource.load(0x4086520E); + paletteResource.load(0x12C23307); byte *srcpalette = paletteResource.palette(); for (int i = 0; i < 256; i++) { vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0]; @@ -236,8 +237,6 @@ void NeverhoodEngine::dumpAllResources() { writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height); delete[] pixels; } - static int n = 0; - //if (n++ == 25) break; } } -- cgit v1.2.3 From 5465e6fe6429e10e0f6848f6edb48f07a233a22d Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 28 Oct 2011 16:58:39 +0000 Subject: NEVERHOOD: Pack the KlaymanIdleTableItem struct --- engines/neverhood/klayman.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index c19e884000..7b8b42ebae 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -36,11 +36,15 @@ class Klayman; const uint32 kKlaymanSpeedUpHash = 0x004A2148; +#include "common/pack-start.h" // START STRUCT PACKING + struct KlaymanIdleTableItem { int value; void (Klayman::*callback)(); }; +#include "common/pack-end.h" // END STRUCT PACKING + class Klayman : public AnimatedSprite { public: Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); -- cgit v1.2.3 From 4f35989ac452f0b742e86357fb13f33668df1358 Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Fri, 28 Oct 2011 16:59:17 +0000 Subject: NEVERHOOD: Minor renaming, avoid mixing variables with their types --- engines/neverhood/module1000.cpp | 4 ++-- engines/neverhood/module1000.h | 2 +- engines/neverhood/module1900.cpp | 6 +++--- engines/neverhood/module1900.h | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 2ee98acbd2..2eb8a67176 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -741,8 +741,8 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess return messageResult; } -AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect) - : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(AsScene1002BoxingGloveHitEffect), +AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect) + : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect), _soundResource(vm) { SetUpdateHandler(&AnimatedSprite::update); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 702f538dfd..b8fa6365a6 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -168,7 +168,7 @@ protected: class AsScene1002DoorSpy : public AnimatedSprite { public: - AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *AsScene1002BoxingGloveHitEffect); + AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect); protected: Scene *_parentScene; Sprite *_asDoor; diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index e9be86a926..f91513fe57 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -448,8 +448,8 @@ void AsScene1907Symbol::moveDown() { _isMoving = true; } -SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol) - : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _AsScene1907Symbol(AsScene1907Symbol), +SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol) + : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol), _countdown1(0) { _spriteResource.load2(0x64516424); @@ -484,7 +484,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (_countdown1 == 0 && !_AsScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) { + if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) { setVisible(true); _countdown1 = 4; StaticSprite::update(); diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h index 7b41c5780b..2eadd06a95 100644 --- a/engines/neverhood/module1900.h +++ b/engines/neverhood/module1900.h @@ -107,13 +107,13 @@ protected: class SsScene1907UpDownButton : public StaticSprite { public: - SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *AsScene1907Symbol); + SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol); void setToUpPosition(); void setToDownPosition(); protected: SoundResource _soundResource; Scene1907 *_parentScene; - AsScene1907Symbol *_AsScene1907Symbol; + AsScene1907Symbol *_asScene1907Symbol; int _countdown1; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 13efdceb9eb96c98ce279e78d92ca43772219479 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 30 Oct 2011 20:56:28 +0000 Subject: NEVERHOOD: Add TODO --- engines/neverhood/todo.txt | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 engines/neverhood/todo.txt diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt new file mode 100644 index 0000000000..abf8f27f84 --- /dev/null +++ b/engines/neverhood/todo.txt @@ -0,0 +1,42 @@ +NOTE: +------- +Some of the TODOs should be done AFTER the whole game logic is implemented +else the game disasm and reimplemtation code become even more different +(unless I decide it's ok to do it :) + +TODOs which can be done any time: +----------------------------------- +- Give placeholder stuff (e.g. sub?????, _flag??? etc.) better fitting names +- Use CursorMan for the mouse cursor (instead of using it like a normal sprite) + - This whould make it neccessary to call _system->updateScreen more often else + the mouse movement would be choppy +- Cleanup +- Clean up staticdata structs to look more like the ones in create_neverhood + (e.g. by using template classes etc.) + - Or use a common base class and manage all stuff in one single table and cast stuff accordingly + +TODOs which should be done only after the game logic is finished: +------------------------------------------------------------------- +- Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary +- Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors) + - Should be just a handle object which initializes itself + - Play routine should fill the handle so it can be stopped/queried later + - Basically like ScummVM own sound handles +- Rework the resource system + - The current system can be simplified a lot + - Also resource purging needs to be implemented +- RE and implement yet unknown music/sound stuff +- Implement game menus +- Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes) + - This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included + - The move special scenes (SmackerScene) into the scenes file +- Maybe merge CollisionMan with Scene (since it's so far never used independently) + +TODOs which are experimental: +------------------------------- +NOTE: Since they affect the whole game, they really should be only implemented once the full game logic is implemented. +These are nothing more than wild ideas for now, any might never be implemented. +- Use states instead of separate callback methods +- Try to move more stuff to neverhood.dat +- Try to use more template functions instead of manually creating functions + (Can be coupled with the above to move parameters to the dat and only use IDs) -- cgit v1.2.3 From 2e94464a8a1e76507c72903dfafb970a244b6326 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 31 Oct 2011 13:56:03 +0000 Subject: NEVERHOOD: Start with Module2800 and add Scene2801 --- engines/neverhood/gamemodule.cpp | 18 +++- engines/neverhood/klayman.cpp | 72 ++++++++++++++ engines/neverhood/klayman.h | 7 ++ engines/neverhood/module.mk | 1 + engines/neverhood/module2800.cpp | 201 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2800.h | 59 ++++++++++++ 6 files changed, 357 insertions(+), 1 deletion(-) create mode 100644 engines/neverhood/module2800.cpp create mode 100644 engines/neverhood/module2800.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 72f15a6bed..781a9c305a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -39,6 +39,7 @@ #include "neverhood/module2300.h" #include "neverhood/module2600.h" #include "neverhood/module2700.h" +#include "neverhood/module2800.h" #include "neverhood/module3000.h" namespace Neverhood { @@ -275,7 +276,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(1000, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif @@ -301,6 +302,10 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule(2800, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -372,6 +377,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x42212411); _childObject = new Module2700(_vm, this, which); break; + case 2800: + setGlobalVar(0x91080831, 0x64210814); + _childObject = new Module2800(_vm, this, which); + break; case 3000: setGlobalVar(0x91080831, 0x81293110); _childObject = new Module3000(_vm, this, which); @@ -489,6 +498,13 @@ void GameModule::updateModule() { case 2700: createModule(1800, 2); break; + case 2800: + if (_moduleResult == 1) { + createModule(2900, 5); + } else { + createModule(1800, 0); + } + break; case 3000: if (_moduleResult == 1) { createModule(1900, 0); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index bdc53d65f6..6873e505fa 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4847,4 +4847,76 @@ void KmScene2247::sub453520() { FinalizeState(&Klayman::stStartWalkingDone); } +KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4812: + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klayman::stTurnToUse); + break; + case 0x481E: + GotoState(&Klayman::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWalkToFrontNoStep); + } else { + GotoState(&Klayman::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnToFront); + } else { + GotoState(&Klayman::stTurnToBack); + } + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7b8b42ebae..355c6d6f15 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -542,6 +542,13 @@ protected: void sub453520(); }; +class KmScene2801 : public Klayman { +public: + KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index adf58b1225..780ee76ae1 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -27,6 +27,7 @@ MODULE_OBJS = \ module2300.o \ module2600.o \ module2700.o \ + module2800.o \ module3000.o \ mouse.o \ navigationscene.o \ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp new file mode 100644 index 0000000000..3a86e29f36 --- /dev/null +++ b/engines/neverhood/module2800.cpp @@ -0,0 +1,201 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2800.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1000.h" +#include "neverhood/module1200.h" +#include "neverhood/module1700.h" + +namespace Neverhood { + +Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _fileHash = 0; + // TODO music stuff + // TODO Music18hList_add(0x64210814, 0xD2FA4D14); + setGlobalVar(0x28D8C940, 1); + + if (which < 0) { + createScene(_vm->gameState().sceneNum, which); + } else if (which == 2) { + createScene(4, 3); + } else if (which == 1) { + createScene(4, 1); + } else { + createScene(0, 0); + } + +} + +Module2800::~Module2800() { + // TODO music stuff + // TODO Sound1ChList_sub_407A50(0x64210814); + // TODO Module2800_sub471DF0(); +} + +void Module2800::createScene(int sceneNum, int which) { + debug("Module2800::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Music18hList_stop(0xD2FA4D14, 0, 0); + _childObject = new Scene2801(_vm, this, which); + break; + // TODO ... + } + SetUpdateHandler(&Module2800::updateScene); + _childObject->handleUpdate(); +} + +void Module2800::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult != 2) { + // TODO music stuff + } + if (_moduleResult == 1) { + createScene(2, 0); + } else if (_moduleResult == 2) { + createScene(1, 0); + } else { + leaveModule(0); + } + break; + } + } else { + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Module2800_sub4731E0(true); + break; + } + } +} + +Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + // TODO _vm->gameModule()->initScene2801Vars(); + + _surfaceFlag = true; + SetMessageHandler(&Scene2801::handleMessage); + SetUpdateHandler(&Scene::update); + + if (getGlobalVar(0x4DE80AC0) == 0) { + insertStaticSprite(0x0001264C, 100); + } + + if (which < 0) { + insertKlayman(194, 430); + setMessageList(0x004B6BB8); + } else if (which == 1) { + insertKlayman(443, 398); + setMessageList(0x004B6BC0); + } else if (which == 2) { + if (getGlobalVar(0xC0418A02)) { + insertKlayman(312, 432); + _klayman->setDoDeltaX(1); + setMessageList(0x004B6C10); + } else { + insertKlayman(194, 432); + setMessageList(0x004B6C10); + } + } else { + insertKlayman(0, 432); + setMessageList(0x004B6BB0); + } + + if (getGlobalVar(0x09880D40)) { + setRectList(0x004B6CE0); + setBackground(0x01400666); + setPalette(0x01400666); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x01400666, 0, 256, 0); + _sprite1 = insertStaticSprite(0x100CA0A8, 1100); + _sprite2 = insertStaticSprite(0x287C21A4, 1100); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + insertMouse433(0x0066201C); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + } else if (getGlobalVar(0x08180ABC)) { + setRectList(0x004B6CD0); + setBackground(0x11E00684); + setPalette(0x11E00684); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x11E00684, 0, 256, 0); + _sprite2 = insertStaticSprite(0x061601C8, 1100); + _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + insertMouse433(0x00680116); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); + _vm->_collisionMan->addSprite(_asTape); + } else { + setRectList(0x004B6CF0); + setBackground(0x030006E6); + setPalette(0x030006E6); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x030006E6, 0, 256, 0); + _sprite2 = insertStaticSprite(0x273801CE, 1100); + _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + insertMouse433(0x006E2038); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + } + + if (which == 1) { + _palette->addPalette(0xB103B604, 0, 65, 0); + _palette->addBasePalette(0xB103B604, 0, 65, 0); + } else { + _palette->addPalette(_paletteHash, 0, 65, 0); + _palette->addBasePalette(_paletteHash, 0, 65, 0); + } + +} + +Scene2801::~Scene2801() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + // TODO: case 0x000D: + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004B6C40); + } + break; + case 0x482A: + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + case 0x482B: + _palette->addBasePalette(_paletteHash, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h new file mode 100644 index 0000000000..cdfcdbe802 --- /dev/null +++ b/engines/neverhood/module2800.h @@ -0,0 +1,59 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2800_H +#define NEVERHOOD_MODULE2800_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2800 + +class Module2800 : public Module { +public: + Module2800(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2800(); +protected: + bool _flag; + uint32 _fileHash; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class Scene2801 : public Scene { +public: + Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2801(); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_asTape; + uint32 _paletteHash; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From 88bfe5d0766e4592cd414c1980eda9287c51035e Mon Sep 17 00:00:00 2001 From: Filippos Karapetis Date: Thu, 3 Nov 2011 20:50:30 +0000 Subject: NEVERHOOD: Added a FIXME --- engines/neverhood/module1000.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 2eb8a67176..176708be3d 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1042,6 +1042,8 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara if (_x > 330) { sendMessage(_klayman, 0x4811, 2); } else if (_x > 265) { + // FIXME: This check is the same as the one below. + // Perhaps the third parameter should be 1 here? sendMessage(_klayman, 0x4811, 0); } else { sendMessage(_klayman, 0x4811, 0); -- cgit v1.2.3 From 8613ff3a9dd0ad36c9d695c48ceb16a23e92e346 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 11 Jan 2012 17:44:32 +0000 Subject: NEVERHOOD: Add tables for Scene2801 --- devtools/create_neverhood/tables.h | 10 ++++++++++ dists/engine-data/neverhood.dat | Bin 19586 -> 20050 bytes 2 files changed, 10 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 2534bcecee..514912c41a 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -112,6 +112,10 @@ static const uint32 rectListOffsets[] = { // Scene2247 1, 0x004B5588, 1, 0x004B55C8, + // Scene2801 + 1, 0x004B6CE0, + 1, 0x004B6CD0, + 1, 0x004B6CF0, 0, 0 }; @@ -377,6 +381,12 @@ static const uint32 messageListOffsets[] = { 4, 0x004B54C0, 5, 0x004B54E0, 5, 0x004B5508, + // Scene2801 + 1, 0x004B6BB8, + 1, 0x004B6BC0, + 1, 0x004B6C10, + 1, 0x004B6BB0, + 2, 0x004B6C40, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 946b19a36f..72f35a6554 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 8172d679df5148a4a32f46074b20cb6caf91844f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 21 Jan 2012 00:12:16 +0000 Subject: NEVERHOOD: Add scene create/update handling in Module2800 --- engines/neverhood/module2800.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 3a86e29f36..eded442676 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -62,6 +62,20 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_stop(0xD2FA4D14, 0, 0); _childObject = new Scene2801(_vm, this, which); break; + case 1: + // TODO Music18hList_stop(0xD2FA4D14, 0, 0); +#if 0 + _flag = true; // DEBUG! + if (_flag) { + _childObject = new Scene2802(_vm, this, which); + } else { + _childObject = new Class152(_vm, this, 0x000C6444, 0xC6440008); + } +#endif + break; + // + case 1001: + break; // TODO ... } SetUpdateHandler(&Module2800::updateScene); @@ -83,12 +97,25 @@ void Module2800::updateScene() { leaveModule(0); } break; + case 1: + if (_moduleResult == 0) { + createScene(0, 2); + } else { + createScene(1001, -1); + } + break; + // + case 1001: + break; } } else { switch (_vm->gameState().sceneNum) { case 0: // TODO Module2800_sub4731E0(true); break; + case 1: + // TODO Module2800_sub4731E0(false); + break; } } } -- cgit v1.2.3 From 0683ed9eee35a465b7b3fd5b36f55011123aee65 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 11 May 2012 11:03:40 +0000 Subject: NEVERHOOD: Rename SetSpriteCallback to SetSpriteUpdate - Started replace message numbers with constants - Add NRect::contains - Some cleanup --- engines/neverhood/blbarchive.cpp | 2 +- engines/neverhood/collisionman.cpp | 11 +- engines/neverhood/graphics.h | 8 + engines/neverhood/klayman.cpp | 311 ++++++++++++++++++------------------ engines/neverhood/messages.h | 37 +++++ engines/neverhood/module1000.cpp | 14 +- engines/neverhood/module1200.cpp | 12 +- engines/neverhood/module1300.cpp | 38 ++--- engines/neverhood/module1300.h | 2 +- engines/neverhood/module1400.cpp | 36 ++--- engines/neverhood/module1600.cpp | 20 +-- engines/neverhood/module1900.cpp | 20 +-- engines/neverhood/module2200.cpp | 22 +-- engines/neverhood/module3000.cpp | 10 +- engines/neverhood/neverhood.h | 1 + engines/neverhood/scene.cpp | 10 +- engines/neverhood/smackerplayer.cpp | 40 ++--- engines/neverhood/smackerplayer.h | 2 +- engines/neverhood/smackerscene.cpp | 4 +- engines/neverhood/sprite.h | 2 +- 20 files changed, 309 insertions(+), 293 deletions(-) create mode 100644 engines/neverhood/messages.h diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 4e138b01a2..f003728e4f 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -98,7 +98,7 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) { Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size); break; default: - ; + error("BlbArchive::load() Unknown compression type %d", entry.comprType); } } diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index a1314bfe0f..bacf18bd30 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -56,13 +56,10 @@ void CollisionMan::clearHitRects() { } HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) { - if (_hitRects) { - for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) { - HitRect *hitRect = &(*it); - if (x >= hitRect->rect.x1 && x <= hitRect->rect.x2 && y >= hitRect->rect.y1 && y <= hitRect->rect.y2) - return hitRect; - } - } + if (_hitRects) + for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) + if ((*it).rect.contains(x, y)) + return &(*it); return &defaultHitRect; } diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index c2adb11913..7725e73289 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -42,14 +42,22 @@ struct NDimensions { struct NRect { int16 x1, y1, x2, y2; + NRect() : x1(0), y1(0), x2(0), y2(0) {} + NRect(int16 x01, int16 y01, int16 x02, int16 y02) : x1(x01), y1(y01), x2(x02), y2(y02) {} + void set(int16 x01, int16 y01, int16 x02, int16 y02) { x1 = x01; y1 = y01; x2 = x02; y2 = y02; } + + bool contains(int16 x, int16 y) const { + return x >= x1 && x <= x2 && y >= y1 && y <= y2; + } + }; typedef Common::Array NRectArray; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 6873e505fa..303e3fe364 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -132,7 +132,7 @@ void Klayman::stIdlePickEar() { startAnimation(0x5B20C814, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmIdlePickEar); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); FinalizeState(&Klayman::evIdlePickEarDone); } @@ -163,7 +163,7 @@ void Klayman::sub41FDB0() { startAnimation(0xD122C137, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E980); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } @@ -189,7 +189,7 @@ void Klayman::sub41FE00() { startAnimation(0x543CD054, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41E9E0); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); FinalizeState(&Klayman::sub41FE50); } @@ -224,7 +224,7 @@ void Klayman::stIdleChest() { startAnimation(0x40A0C034, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmIdleChest); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } @@ -250,7 +250,7 @@ void Klayman::sub41FEC0() { startAnimation(0x5120E137, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EFE0); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } @@ -277,7 +277,7 @@ void Klayman::sub421350() { _acceptInput = true; startAnimation(0x582EC138, 0, -1); _counter = 0; - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetUpdateHandler(&Klayman::update41D1C0); SetMessageHandler(&Klayman::handleMessage41D360); _counter3 = 0; @@ -317,7 +317,7 @@ void Klayman::stIdleSitBlink() { startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stIdleSitBlinkSecond); } @@ -327,7 +327,7 @@ void Klayman::stIdleSitBlinkSecond() { startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update41D1C0); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stPickUpNeedle() { @@ -338,7 +338,7 @@ void Klayman::stPickUpNeedle() { startAnimation(0x1449C169, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPickUpGeneric); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -350,7 +350,7 @@ void Klayman::sub41FFF0() { startAnimation(0x0018C032, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D640); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -383,7 +383,7 @@ void Klayman::stTurnToUseInTeleporter() { startAnimation(0xD229823D, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stReturnFromUseInTeleporter() { @@ -392,7 +392,7 @@ void Klayman::stReturnFromUseInTeleporter() { startAnimation(0x9A2801E0, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stStepOver() { @@ -402,7 +402,7 @@ void Klayman::stStepOver() { startAnimation(0x004AA310, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } } @@ -413,7 +413,7 @@ void Klayman::stSitInTeleporter() { startAnimation(0x392A0330, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmSitInTeleporter); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } } @@ -435,7 +435,7 @@ void Klayman::stGetUpFromTeleporter() { startAnimation(0x913AB120, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } ///////////////////////////////////////////////////////////////// @@ -477,7 +477,7 @@ bool Klayman::stStartActionFromIdle(AnimationCb callback) { startAnimation(0x9A7020B8, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartAction); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(callback); return true; } @@ -523,7 +523,7 @@ void Klayman::stTryStandIdle() { _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; SetUpdateHandler(&Klayman::update41D0F0); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -591,7 +591,7 @@ void Klayman::stStand() { startAnimation(0x5900C41E, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } @@ -611,7 +611,7 @@ void Klayman::stStandAround() { startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update41D0F0); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } uint32 Klayman::hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -666,7 +666,7 @@ void Klayman::stWakeUp() { startAnimation(0x527AC970, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stSleeping() { @@ -675,7 +675,7 @@ void Klayman::stSleeping() { startAnimation(0x5A38C110, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmSleeping); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } uint32 Klayman::hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -697,7 +697,7 @@ bool Klayman::stStartAction(AnimationCb callback3) { startAnimation(0x5C7080D4, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartAction); - SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::spriteUpdate41F250); NextState(callback3); return true; } else { @@ -793,7 +793,7 @@ void Klayman::stSneak() { startAnimation(0x5C48C506, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); - SetSpriteCallback(&Klayman::suWalking); + SetSpriteUpdate(&Klayman::suWalking); FinalizeState(&Klayman::stWalkingDone); } @@ -832,7 +832,7 @@ void Klayman::stStartWalking() { startAnimation(0x242C0198, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteCallback(&Klayman::suWalkingTestExit); + SetSpriteUpdate(&Klayman::suWalkingTestExit); FinalizeState(&Klayman::stStartWalkingDone); NextState(&Klayman::stWalking); } @@ -863,13 +863,13 @@ void Klayman::stWalking() { startAnimation(0x1A249001, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); - SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); FinalizeState(&Klayman::stStartWalkingDone); NextState(&Klayman::stUpdateWalking); } void Klayman::spriteUpdate41F300() { - SetSpriteCallback(&Klayman::suWalkingTestExit); + SetSpriteUpdate(&Klayman::suWalkingTestExit); _deltaX = 0; } @@ -914,7 +914,7 @@ void Klayman::stUpdateWalking() { } SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); - SetSpriteCallback(&Klayman::suWalking); + SetSpriteUpdate(&Klayman::suWalking); FinalizeState(&Klayman::stWalkingDone); } } @@ -987,7 +987,7 @@ void Klayman::stPickUpGeneric() { startAnimation(0x1C28C178, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPickUpGeneric); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -1024,7 +1024,7 @@ void Klayman::stTurnPressButton() { startAnimation(0x1C02B03D, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -1053,7 +1053,7 @@ void Klayman::stStampFloorButton() { startAnimation(0x1C16B033, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -1064,7 +1064,7 @@ void Klayman::stPressButtonSide() { startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); - SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::spriteUpdate41F250); } } @@ -1155,7 +1155,7 @@ void Klayman::stLargeStep() { startAnimation(0x08B28116, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLargeStep); - SetSpriteCallback(&Klayman::suLargeStep); + SetSpriteUpdate(&Klayman::suLargeStep); FinalizeState(&Klayman::stLargeStepDone); } @@ -1225,7 +1225,7 @@ void Klayman::stWonderAboutHalf() { startAnimation(0xD820A114, 0, 10); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stWonderAboutAfter() { @@ -1234,7 +1234,7 @@ void Klayman::stWonderAboutAfter() { startAnimation(0xD820A114, 30, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stTurnToUseHalf() { @@ -1243,7 +1243,7 @@ void Klayman::stTurnToUseHalf() { startAnimation(0x9B250AD2, 0, 7); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1266,7 +1266,7 @@ void Klayman::stTurnAwayFromUse() { startAnimation(0x98F88391, 4, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stWonderAbout() { @@ -1275,7 +1275,7 @@ void Klayman::stWonderAbout() { startAnimation(0xD820A114, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stPeekWall() { @@ -1284,7 +1284,7 @@ void Klayman::stPeekWall() { startAnimation(0xAC20C012, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPeekWall); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1318,7 +1318,7 @@ void Klayman::setupJumpToRing() { _acceptInput = false; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmJumpToRing); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); NextState(&Klayman::sub420340); sendMessage(_attachedSprite, 0x482B, 0); } @@ -1355,7 +1355,7 @@ void Klayman::sub420340() { startAnimation(0x4829E0B8, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stJumpToRing2() { @@ -1372,7 +1372,7 @@ void Klayman::stJumpToRing3() { _acceptInput = false; startAnimation(0xBA1910B2, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmJumpToRing3); NextState(&Klayman::stHoldRing); sendMessage(_attachedSprite, 0x482B, 0); @@ -1405,7 +1405,7 @@ void Klayman::stHoldRing() { startAnimation(0x4A293FB0, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmHoldRing); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } uint32 Klayman::hmHoldRing(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1426,7 +1426,7 @@ void Klayman::stReleaseRing() { startAnimation(0xB869A4B9, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Klayman::stJumpToRing4() { @@ -1449,7 +1449,7 @@ void Klayman::stContinueClimbLadderUp() { _newStickFrameHash = 0x01084280; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); gotoNextStateExt(); } @@ -1469,14 +1469,14 @@ void Klayman::stStartClimbLadderDown() { startAnimation(0x122D1505, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } else if (_ladderStatus == 3) { _ladderStatus = 2; _acceptInput = true; startAnimationByHash(0x122D1505, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } else if (_ladderStatus == 1) { _ladderStatus = 2; _acceptInput = true; @@ -1493,14 +1493,14 @@ void Klayman::stClimbLadderHalf() { startAnimationByHash(0x3A292504, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } else if (_ladderStatus == 2) { _ladderStatus = 0; _acceptInput = false; startAnimationByHash(0x122D1505, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } else { gotoNextStateExt(); } @@ -1561,14 +1561,14 @@ void Klayman::stStartClimbLadderUp() { startAnimation(0x3A292504, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } else if (_ladderStatus == 3) { _ladderStatus = 1; _acceptInput = true; startAnimationByHash(0x3A292504, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } else if (_ladderStatus == 2) { _ladderStatus = 1; _acceptInput = true; @@ -1583,7 +1583,7 @@ void Klayman::stWalkToFrontNoStep() { startAnimationByHash(0xF229C003, 0x14884392, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1611,7 +1611,7 @@ void Klayman::stWalkToFront() { startAnimation(0xF229C003, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } } @@ -1622,7 +1622,7 @@ void Klayman::stTurnToFront() { startAnimationByHash(0xCA221107, 0x8520108C, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } } @@ -1633,7 +1633,7 @@ void Klayman::stTurnToBack() { startAnimation(0xCA221107, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } } @@ -1643,7 +1643,7 @@ void Klayman::stLandOnFeet() { startAnimation(0x18118554, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLandOnFeet); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1665,7 +1665,7 @@ void Klayman::stTurnToBackToUse() { startAnimation(0x91540140, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmTurnToBackToUse); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); } } @@ -1691,7 +1691,7 @@ void Klayman::stClayDoorOpen() { _acceptInput = false; startAnimation(0x5CCCB330, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmClayDoorOpen); } } @@ -1716,7 +1716,7 @@ void Klayman::stTurnToUse() { _acceptInput = false; startAnimation(0x9B250AD2, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmTurnToUse); } } @@ -1726,7 +1726,7 @@ void Klayman::stReturnFromUse() { _acceptInput = false; startAnimation(0x98F88391, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmTurnToUse); } @@ -1735,7 +1735,7 @@ void Klayman::stWalkingOpenDoor() { _acceptInput = false; startAnimation(0x11A8E012, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::suWalkingOpenDoor); + SetSpriteUpdate(&Klayman::suWalkingOpenDoor); SetMessageHandler(&Klayman::hmStartWalking); } @@ -1753,7 +1753,7 @@ void Klayman::stMoveObjectSkipTurnFaceObject() { _acceptInput = true; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmMoveObjectTurn); } @@ -1792,7 +1792,7 @@ void Klayman::stMoveObjectSkipTurn() { _acceptInput = true; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmMoveObjectTurn); } @@ -1804,7 +1804,7 @@ void Klayman::stMoveObjectFaceObject() { _acceptInput = true; startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmMoveObjectTurn); } } @@ -1818,7 +1818,7 @@ void Klayman::stUseLever() { sendMessage(_attachedSprite, 0x482B, 0); startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); NextState(&Klayman::stPullLeverDown); _acceptInput = false; @@ -1836,7 +1836,7 @@ void Klayman::stPullLeverDown() { void Klayman::stHoldLeverDown() { startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D360); _isLeverDown = true; _acceptInput = true; @@ -1845,7 +1845,7 @@ void Klayman::stHoldLeverDown() { void Klayman::stUseLeverRelease() { startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stPullLeverDown); @@ -1857,7 +1857,7 @@ void Klayman::stReleaseLever() { _status2 = 2; startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stLetGoOfLever); @@ -1894,7 +1894,7 @@ void Klayman::stInsertDisk() { } else { startAnimation(0xD8C8D100, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::spriteUpdate41F250); SetMessageHandler(&Klayman::hmInsertDisk); _acceptInput = false; _counter2--; @@ -1952,10 +1952,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&KmScene1001::sub44FA50); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -2016,7 +2016,7 @@ void KmScene1001::sub44FA50() { startAnimation(0x00648953, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1001::handleMessage44FA00); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } } @@ -2101,7 +2101,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&KmScene1002::sub449E20); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { GotoState(&KmScene1002::stPressDoorButton); } @@ -2329,7 +2329,7 @@ void KmScene1002::sub449E20() { _acceptInput = false; startAnimation(0x584984B4, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1002::handleMessage449800); NextState(&Klayman::stLandOnFeet); sendMessage(_attachedSprite, 0x482B, 0); @@ -2343,7 +2343,7 @@ void KmScene1002::sub449E90() { _surface->setVisible(false); startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1002::handleMessage4498E0); } @@ -2356,7 +2356,7 @@ void KmScene1002::sub449EF0() { // Weird stuff happening SetMessageHandler(&Klayman::handleMessage41D360); //SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteCallback(&KmScene1002::suFallDown); + SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&KmScene1002::sub449F70); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); @@ -2370,7 +2370,7 @@ void KmScene1002::sub449F70() { _isWalking = false; startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1002::handleMessage41D480); NextState(&KmScene1002::sub44A230); sendMessage(_parentScene, 0x2002, 0); @@ -2386,7 +2386,7 @@ void KmScene1002::stSpitOutFall() { _acceptInput = false; startAnimation(0x9308C132, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); - SetSpriteCallback(&KmScene1002::suFallDown); + SetSpriteUpdate(&KmScene1002::suFallDown); SetMessageHandler(&Klayman::handleMessage41D480); NextState(&KmScene1002::sub449F70); sendMessage(_class599, 0x482A, 0); @@ -2400,7 +2400,7 @@ void KmScene1002::sub44A0D0() { startAnimation(0x0013A206, 0, -1); SetUpdateHandler(&KmScene1002::update4497D0); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(&KmScene1002::suFallDown); + SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&KmScene1002::sub44A150); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); @@ -2415,7 +2415,7 @@ void KmScene1002::sub44A150() { startAnimationByHash(0x0013A206, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D480); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&KmScene1002::sub44A230); sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; @@ -2437,7 +2437,7 @@ void KmScene1002::stJumpAndFall() { startAnimation(0xB93AB151, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage449D60); - SetSpriteCallback(&KmScene1002::suFallDown); + SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&Klayman::stLandOnFeet); } } @@ -2453,7 +2453,7 @@ void KmScene1002::stDropFromRing() { startAnimation(0x586984B1, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage41D360); - SetSpriteCallback(&KmScene1002::suFallDown); + SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&Klayman::stLandOnFeet); } @@ -2464,7 +2464,7 @@ void KmScene1002::stPressDoorButton() { startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::hmPressDoorButton); - SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::spriteUpdate41F250); } void KmScene1002::stHitByBoxingGlove() { @@ -2473,7 +2473,7 @@ void KmScene1002::stHitByBoxingGlove() { startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::handleMessage449C90); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); FinalizeState(&KmScene1002::stHitByBoxingGloveDone); } @@ -2490,7 +2490,7 @@ void KmScene1002::stMoveVenusFlyTrap() { startAnimation(0x5C01A870, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone); } } @@ -2501,7 +2501,7 @@ void KmScene1002::stContinueMovingVenusFlyTrap() { startAnimationByHash(0x5C01A870, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone); } @@ -2596,7 +2596,7 @@ void KmScene1004::stReadNote() { startAnimation(0x123E9C9F, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene1004::hmReadNote); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -2681,7 +2681,7 @@ void KmScene1109::sub461F30() { _status2 = 0; _acceptInput = false; SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1109::handleMessage461EA0); startAnimation(0x2C2A4A1C, 0, -1); } @@ -2690,7 +2690,7 @@ void KmScene1109::sub461F70() { _status2 = 0; _acceptInput = false; SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1109::handleMessage461EA0); startAnimation(0x3C2E4245, 0, -1); } @@ -2717,7 +2717,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480A: GotoState(&KmScene1201::stMoveObject); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; case 0x4813: @@ -2729,7 +2729,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4815: GotoState(&KmScene1201::sub40E040); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { GotoState(&Klayman::stPressButtonSide); } @@ -2801,7 +2801,7 @@ void KmScene1201::stFetchMatch() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x9CAA0218, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1201::hmMatch); NextState(&KmScene1201::stLightMatch); } @@ -2813,7 +2813,7 @@ void KmScene1201::stLightMatch() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x1222A513, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1201::hmMatch); } @@ -2858,7 +2858,7 @@ void KmScene1201::stMoveObject() { setDoDeltaX(0); startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&KmScene1201::update40DBE0); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmMoveObject); } } @@ -2867,7 +2867,7 @@ void KmScene1201::stMoveObjectSkipTurn() { _acceptInput = false; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&KmScene1201::update40DBE0); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmMoveObject); } @@ -2878,7 +2878,7 @@ void KmScene1201::stTumbleHeadless() { setDoDeltaX(0); startAnimation(0x2821C590, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmTumbleHeadless); NextState(&Klayman::stTryStandIdle); sendMessage(_class464, 0x2006, 0); @@ -2892,7 +2892,7 @@ void KmScene1201::sub40E040() { _acceptInput = false; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D360); } } @@ -2948,7 +2948,7 @@ void KmScene1303::stPeekWall1() { _acceptInput = true; startAnimation(0xAC20C012, 8, 37); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D480); NextState(&KmScene1303::stPeekWall3); } @@ -2958,7 +2958,7 @@ void KmScene1303::stPeekWall2() { _acceptInput = false; startAnimation(0xAC20C012, 43, 49); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D480); } @@ -2969,7 +2969,7 @@ void KmScene1303::stPeekWall3() { _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; startAnimation(0xAC20C012, 38, 42); SetUpdateHandler(&KmScene1303::update4161A0); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D360); _newStickFrameIndex = 42; } @@ -2979,7 +2979,7 @@ void KmScene1303::stPeekWallReturn() { _acceptInput = false; startAnimation(0x2426932E, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1303::hmPeekWallReturn); } @@ -2998,7 +2998,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klayman::stTryStandIdle); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3069,7 +3069,7 @@ void KmScene1305::stCrashDown() { _acceptInput = false; startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D480); NextState(&KmScene1305::cbCrashDownEvent); } @@ -3101,7 +3101,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { else GotoState(&Klayman::stTryStandIdle); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3110,7 +3110,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPickUpGeneric); } break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -3123,7 +3123,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; - case 0x481A: + case NM_KLAYMAN_INSERT_DISK: GotoState(&Klayman::stInsertDisk); break; case 0x481B: @@ -3210,7 +3210,7 @@ void KmScene1306::sub417D40() { _acceptInput = false; startAnimation(0xEE084A04, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1306::handleMessage417CB0); } @@ -3219,7 +3219,7 @@ void KmScene1306::sub417D80() { _acceptInput = false; startAnimation(0xB86A4274, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1306::handleMessage417CB0); } @@ -3261,7 +3261,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&KmScene1001::stUseLever); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3274,7 +3274,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; - case 0x481A: + case NM_KLAYMAN_INSERT_DISK: if (param.asInteger() == 1) { GotoState(&KmScene1308::sub456150); } else { @@ -3294,7 +3294,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x481E: GotoState(&Klayman::stReturnFromUse); break; - case 0x4827: + case NM_KLAYMAN_RELEASE_LEVER: GotoState(&Klayman::stReleaseLever); break; case 0x4834: @@ -3364,7 +3364,7 @@ void KmScene1308::sub456150() { _acceptInput = false; startAnimation(0xDC409440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::spriteUpdate41F250); SetMessageHandler(&KmScene1308::handleMessage); _flag1 = false; } @@ -3395,7 +3395,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stMoveObjectFaceObject); } break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -3518,7 +3518,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&KmScene1001::stUseLever); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3538,7 +3538,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41CCE0(param.asPoint().x); } break; - case 0x4827: + case NM_KLAYMAN_RELEASE_LEVER: GotoState(&Klayman::stReleaseLever); break; case 0x483F: @@ -3575,7 +3575,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stMoveObjectFaceObject); } break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3588,7 +3588,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; - case 0x481A: + case NM_KLAYMAN_INSERT_DISK: GotoState(&Klayman::stInsertDisk); break; case 0x481B: @@ -3650,7 +3650,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { else GotoState(&Klayman::stTryStandIdle); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3747,7 +3747,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4803: GotoState(&KmScene1705::stFallSkipJump); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3842,7 +3842,7 @@ void KmScene1705::stFallSkipJump() { _acceptInput = false; startAnimationByHash(0xB93AB151, 0x40A100F8, 0); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&KmScene1705::spriteUpdate468A30); + SetSpriteUpdate(&KmScene1705::spriteUpdate468A30); SetMessageHandler(&Klayman::handleMessage41D360); NextState(&Klayman::stLandOnFeet); } @@ -3852,7 +3852,7 @@ void KmScene1705::sub468AD0() { _acceptInput = false; startAnimation(0x5E0A4905, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1705::handleMessage4689A0); } @@ -3861,7 +3861,7 @@ void KmScene1705::sub468B10() { _acceptInput = false; startAnimation(0xD86E4477, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1705::handleMessage4689A0); } @@ -3922,26 +3922,23 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: if (_isSittingInTeleporter) { GotoState(&Klayman::sub421350); - } else { + } else GotoState(&Klayman::stTryStandIdle); - } break; case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klayman::stWalking); - } else { + } else GotoState(&Klayman::stPeekWall); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481D: - if (_isSittingInTeleporter) { + if (_isSittingInTeleporter) GotoState(&Klayman::stTurnToUseInTeleporter); - } break; case 0x481E: if (_isSittingInTeleporter) { @@ -3990,7 +3987,7 @@ void KmScene2001::sub440230() { _acceptInput = false; startAnimation(0xBE68CC54, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene2001::handleMessage4401A0); } @@ -3999,7 +3996,7 @@ void KmScene2001::stDoTeleport() { _acceptInput = false; startAnimation(0x18AB4ED4, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene2001::handleMessage4401A0); } @@ -4029,7 +4026,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4811: GotoState(&KmScene2101::sub4862C0); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4038,7 +4035,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPickUpGeneric); } break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -4131,7 +4128,7 @@ void KmScene2101::sub4862C0() { _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene2101::handleMessage486160); _soundResource1.play(0x402E82D4); } @@ -4141,7 +4138,7 @@ void KmScene2101::sub486320() { _acceptInput = false; startAnimation(0xFF290E30, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene2101::handleMessage486230); } @@ -4150,7 +4147,7 @@ void KmScene2101::sub486360() { _acceptInput = false; startAnimation(0x9A28CA1C, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&KmScene2101::handleMessage486230); } @@ -4171,10 +4168,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klayman::stTryStandIdle); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { GotoState(&Klayman::stPressButtonSide); } @@ -4241,7 +4238,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klayman::stTryStandIdle); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4250,7 +4247,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPickUpGeneric); } break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -4269,7 +4266,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4819: GotoState(&Klayman::stClayDoorOpen); break; - case 0x481A: + case NM_KLAYMAN_INSERT_DISK: GotoState(&Klayman::stInsertDisk); break; case 0x481B: @@ -4325,7 +4322,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPeekWall); } break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { GotoState(&Klayman::stPressButtonSide); } @@ -4357,7 +4354,7 @@ void KmScene2205::sub423980() { startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); - SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4396,14 +4393,14 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPeekWall); } break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 1) { GotoState(&Klayman::sub41FFF0); } else { GotoState(&Klayman::stPickUpGeneric); } break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -4483,7 +4480,7 @@ void KmScene2206::sub482490() { startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteCallback(&KmScene2206::spriteUpdate482450); + SetSpriteUpdate(&KmScene2206::spriteUpdate482450); // TODO Sound1ChList_playLooping(0xD3B02847); } } @@ -4498,7 +4495,7 @@ void KmScene2206::sub482530() { startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); - SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4527,10 +4524,10 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&KmScene2207::sub4424B0); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -4550,7 +4547,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41CCE0(param.asPoint().x); } break; - case 0x4827: + case NM_KLAYMAN_RELEASE_LEVER: GotoState(&Klayman::stReleaseLever); break; case 0x482D: @@ -4579,7 +4576,7 @@ void KmScene2207::sub442460() { _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&KmScene2207::spriteUpdate442430); + SetSpriteUpdate(&KmScene2207::spriteUpdate442430); SetMessageHandler(&Klayman::handleMessage41D360); } } @@ -4593,7 +4590,7 @@ void KmScene2207::sub4424B0() { _acceptInput = false; startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&KmScene2207::spriteUpdate41F230); + SetSpriteUpdate(&KmScene2207::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41E210); NextState(&KmScene2207::sub442520); } @@ -4609,7 +4606,7 @@ void KmScene2207::sub442520() { void KmScene2207::sub442560() { startAnimation(0x1564A2C0, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); NextState(&KmScene2207::sub4425A0); _acceptInput = true; _isLeverDown = true; @@ -4618,7 +4615,7 @@ void KmScene2207::sub442560() { void KmScene2207::sub4425A0() { startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteCallback(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::handleMessage41D360); _acceptInput = true; _isLeverDown = true; @@ -4650,7 +4647,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPeekWall); } break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4704,7 +4701,7 @@ void KmScene2242::sub444D20() { startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); - SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4773,7 +4770,7 @@ void KmHallOfRecords::sub43B130() { startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); - SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4842,7 +4839,7 @@ void KmScene2247::sub453520() { startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41EB70); - SetSpriteCallback(&Klayman::spriteUpdate41F300); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); } @@ -4861,7 +4858,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klayman::stTryStandIdle); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; case 0x4817: diff --git a/engines/neverhood/messages.h b/engines/neverhood/messages.h new file mode 100644 index 0000000000..5a2139db2c --- /dev/null +++ b/engines/neverhood/messages.h @@ -0,0 +1,37 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MESSAGES_H +#define NEVERHOOD_MESSAGES_H + +namespace Neverhood { + +enum NeverhoodMessage { + NM_KLAYMAN_PICKUP = 0x4812, + NM_KLAYMAN_PRESS_BUTTON = 0x4816, + NM_KLAYMAN_INSERT_DISK = 0x481A, + NM_KLAYMAN_RELEASE_LEVER = 0x4827 +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MESSAGES_H */ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 176708be3d..edd9860c11 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -668,7 +668,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) SetUpdateHandler(&AsScene1002Door::update); SetMessageHandler(&AsScene1002Door::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); StaticSprite::update(); } @@ -683,11 +683,11 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x4808: setGlobalVar(0x8306F218, 1); - SetSpriteCallback(&AsScene1002Door::suOpenDoor); + SetSpriteUpdate(&AsScene1002Door::suOpenDoor); break; case 0x4809: setGlobalVar(0x8306F218, 0); - SetSpriteCallback(&AsScene1002Door::suCloseDoor); + SetSpriteUpdate(&AsScene1002Door::suCloseDoor); break; } return messageResult; @@ -697,7 +697,7 @@ void AsScene1002Door::suOpenDoor() { if (_y > 49) { _y -= 8; if (_y < 49) { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _y = 49; } _needRefresh = true; @@ -708,7 +708,7 @@ void AsScene1002Door::suCloseDoor() { if (_y < 239) { _y += 8; if (_y > 239) { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _y = 239; } _needRefresh = true; @@ -747,7 +747,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1002DoorSpy::handleMessage); - SetSpriteCallback(&AsScene1002DoorSpy::suDoorSpy); + SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy); createSurface(800, 136, 147); setClipRect(clipRect); suDoorSpy(); @@ -909,7 +909,7 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); if (!_flag) { if (getGlobalVar(0x8306F218)) { diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index fc28917734..96ed46f4d6 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -329,7 +329,7 @@ Class464::Class464(NeverhoodEngine *vm) createSurface(1200, 69, 98); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class464::handleMessage); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); setVisible(false); } @@ -415,13 +415,13 @@ void AsScene1201TntMan::spriteUpdate40CD10() { void AsScene1201TntMan::sub40CD30() { startAnimation(0x654913D0, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void AsScene1201TntMan::sub40CD60() { startAnimation(0x356803D0, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); NextState(&AsScene1201TntMan::sub40CD30); } @@ -431,7 +431,7 @@ void AsScene1201TntMan::sub40CD90() { _flag = true; startAnimation(0x85084190, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); - SetSpriteCallback(&AsScene1201TntMan::spriteUpdate40CD10); + SetSpriteUpdate(&AsScene1201TntMan::spriteUpdate40CD10); _newStickFrameIndex = -2; } @@ -441,7 +441,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) createSurface1(0x828C0411, 995); SetUpdateHandler(&Class465::update); SetMessageHandler(&Sprite::handleMessage); - SetSpriteCallback(&Class465::spriteUpdate40D150); + SetSpriteUpdate(&Class465::spriteUpdate40D150); startAnimation(0x828C0411, 0, -1); setVisible(false); } @@ -471,7 +471,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) createSurface(1100, 57, 60); SetUpdateHandler(&AsScene1201Match::update); SetMessageHandler(&AsScene1201Match::handleMessage40C2D0); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); switch (getGlobalVar(0x0112090A)) { case 0: diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 38dd356946..2c7a5c8443 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -346,7 +346,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) SetUpdateHandler(&SsScene1302Fence::update); SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _firstY = _y; if (getGlobalVar(0x80101B1E)) _y += 152; @@ -364,12 +364,12 @@ uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m switch (messageNum) { case 0x4808: _soundResource1.play(); - SetSpriteCallback(&SsScene1302Fence::suMoveDown); + SetSpriteUpdate(&SsScene1302Fence::suMoveDown); SetMessageHandler(NULL); break; case 0x4809: _soundResource2.play(); - SetSpriteCallback(&SsScene1302Fence::suMoveUp); + SetSpriteUpdate(&SsScene1302Fence::suMoveUp); SetMessageHandler(NULL); break; } @@ -381,7 +381,7 @@ void SsScene1302Fence::suMoveDown() { _y += 8; else { SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -390,7 +390,7 @@ void SsScene1302Fence::suMoveUp() { _y -= 8; else { SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -590,7 +590,7 @@ AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) _y = 390; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1303Balloon::handleMessage); - SetSpriteCallback(&AnimatedSprite::updateDeltaXY); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); startAnimation(0x800278D2, 0, -1); } @@ -1179,7 +1179,7 @@ void AsScene1307Key::suRemoveKey() { processDelta(); _pointIndex++; } else { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -1192,7 +1192,7 @@ void AsScene1307Key::suInsertKey() { if (_pointIndex == 7) _soundResource1.play(); } else { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); sendMessage(_parentScene, 0x2002, 0); } } @@ -1215,7 +1215,7 @@ void AsScene1307Key::suMoveKey() { void AsScene1307Key::stRemoveKey() { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; _pointIndex = 0; - SetSpriteCallback(&AsScene1307Key::suRemoveKey); + SetSpriteUpdate(&AsScene1307Key::suRemoveKey); startAnimation(fileHashes[0], 0, -1); _soundResource2.play(); } @@ -1224,7 +1224,7 @@ void AsScene1307Key::stInsertKey() { _pointIndex = 0; sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]); setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]); - SetSpriteCallback(&AsScene1307Key::suInsertKey); + SetSpriteUpdate(&AsScene1307Key::suInsertKey); _newStickFrameIndex = -2; } @@ -1244,7 +1244,7 @@ void AsScene1307Key::stMoveKey() { _currFrameIndex = 0; _deltaX = newX - _x; _deltaY = newY - _y; - SetSpriteCallback(&AsScene1307Key::suMoveKey); + SetSpriteUpdate(&AsScene1307Key::suMoveKey); startAnimation(fileHashes[0], 0, -1); } } @@ -1778,12 +1778,12 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08284011); showMouse(false); _smackerFileHash = 0; - _smackerFlag1 = false; + _keepLastSmackerFrame = false; } void Scene1317::update() { if (_smackerFileHash) { - _smackerPlayer->open(_smackerFileHash, _smackerFlag1); + _smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame); _smackerFileHash = 0; } Scene::update(); @@ -1805,7 +1805,7 @@ void Scene1317::upChooseKing() { stNoDecisionYet(); if (_smackerFileHash) { - _smackerPlayer->open(_smackerFileHash, _smackerFlag1); + _smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame); _smackerFileHash = 0; } @@ -1887,7 +1887,7 @@ void Scene1317::stChooseKing() { SetMessageHandler(&Scene1317::hmChooseKing); SetUpdateHandler(&Scene1317::upChooseKing); _smackerFileHash = 0x10982841; - _smackerFlag1 = true; + _keepLastSmackerFrame = true; _decisionCountdown = 450; _klaymanBlinks = false; _klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; @@ -1898,7 +1898,7 @@ void Scene1317::stNoDecisionYet() { SetMessageHandler(&Scene1317::hmNoDecisionYet); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x20982841; - _smackerFlag1 = false; + _keepLastSmackerFrame = false; } void Scene1317::stHoborgAsKing() { @@ -1906,7 +1906,7 @@ void Scene1317::stHoborgAsKing() { SetMessageHandler(&Scene1317::hmHoborgAsKing); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x40982841; - _smackerFlag1 = false; + _keepLastSmackerFrame = false; } void Scene1317::stKlaymanAsKing() { @@ -1914,7 +1914,7 @@ void Scene1317::stKlaymanAsKing() { SetMessageHandler(&Scene1317::hmKlaymanAsKing); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x80982841; - _smackerFlag1 = false; + _keepLastSmackerFrame = false; } void Scene1317::stEndMovie() { @@ -1922,7 +1922,7 @@ void Scene1317::stEndMovie() { SetMessageHandler(&Scene1317::hmEndMovie); SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x40800711; - _smackerFlag1 = false; + _keepLastSmackerFrame = false; } } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 27e2540407..e404127655 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -300,7 +300,7 @@ protected: int _klaymanBlinkCountdown; int _decisionCountdown; uint32 _smackerFileHash; - bool _smackerFlag1; + bool _keepLastSmackerFrame; void update(); void upChooseKing(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index ecf6326f9b..76bf41bca9 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -258,7 +258,7 @@ void Class526::spriteUpdate466720() { if (_rect.y1 <= 150) { _soundResource.play(0x0E32247F); stopAnimation(); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(NULL); setVisible(false); } @@ -266,7 +266,7 @@ void Class526::spriteUpdate466720() { void Class526::sub466770() { startAnimation(0x34880040, 0, -1); - SetSpriteCallback(&Class526::spriteUpdate466720); + SetSpriteUpdate(&Class526::spriteUpdate466720); } Class527::Class527(NeverhoodEngine *vm, Sprite *class526) @@ -296,7 +296,7 @@ void Class527::spriteUpdate466920() { if (_rect.y1 <= 150) { _soundResource.play(0x18020439); stopAnimation(); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(NULL); setVisible(false); } @@ -304,7 +304,7 @@ void Class527::spriteUpdate466920() { void Class527::sub466970() { startAnimation(0x103B8020, 0, -1); - SetSpriteCallback(&Class527::spriteUpdate466920); + SetSpriteUpdate(&Class527::spriteUpdate466920); } Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) @@ -577,13 +577,13 @@ void Class489::sub434D80() { sendMessage(_class525, 0x483A, 0); stopAnimation(); SetMessageHandler(&Sprite::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); setVisible(false); } } void Class489::sub434DD0() { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Class489::handleMessage); startAnimation(0x10E3042B, 0, -1); } @@ -591,20 +591,20 @@ void Class489::sub434DD0() { void Class489::sub434DF0() { _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; startAnimation(0x14A10137, 0, -1); - SetSpriteCallback(&Class489::spriteUpdate434B60); + SetSpriteUpdate(&Class489::spriteUpdate434B60); SetMessageHandler(&Class489::handleMessage); _soundResource2.play(0xEC008474); } void Class489::sub434E60() { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Class489::handleMessage434B20); startAnimation(0x80C32213, 0, -1); NextState(&Class489::sub434E90); } void Class489::sub434E90() { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Class489::handleMessage4348E0); startAnimation(0xD23B207F, 0, -1); } @@ -612,7 +612,7 @@ void Class489::sub434E90() { void Class489::sub434EC0() { startAnimation(0x50A80517, 0, -1); SetMessageHandler(&Class489::handleMessage434B20); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); NextState(&Class489::sub434F40); setGlobalVar(0x12A10DB3, 1); _soundResource1.play(0xCC4A8456); @@ -623,13 +623,13 @@ void Class489::sub434EC0() { void Class489::sub434F40() { sendMessage(_parentScene, 0x480F, 0); startAnimation(0xD833207F, 0, -1); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Class489::handleMessage4348E0); } void Class489::sub434F80() { startAnimation(0x50A94417, 0, -1); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&Class489::handleMessage434B20); NextState(&Class489::sub434E90); setGlobalVar(0x12A10DB3, 0); @@ -640,7 +640,7 @@ void Class489::sub434F80() { void Class489::sub434FF0() { _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; startAnimation(0x22CB4A33, 0, -1); - SetSpriteCallback(&Class489::spriteUpdate434B60); + SetSpriteUpdate(&Class489::spriteUpdate434B60); SetMessageHandler(&Class489::handleMessage434B20); NextState(&Class489::sub434DF0); } @@ -648,7 +648,7 @@ void Class489::sub434FF0() { void Class489::sub435040() { setGlobalVar(0x04A105B3, 4); setGlobalVar(0x04A10F33, 0); - SetSpriteCallback(&Class489::sub434D80); + SetSpriteUpdate(&Class489::sub434D80); SetMessageHandler(&Sprite::handleMessage); startAnimation(0x708D4712, 0, -1); _soundResource3.play(); @@ -1208,7 +1208,7 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m void AsScene1407Mouse::stIdleLookAtGoodHole() { setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0); startAnimation(0x72215194, 0, -1); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(&AsScene1407Mouse::handleMessage); } @@ -1216,7 +1216,7 @@ void AsScene1407Mouse::stWalkToDest() { if (_walkDestX != _x) { setDoDeltaX(_walkDestX < _x ? 1 : 0); startAnimation(0x22291510, 0, -1); - SetSpriteCallback(&AsScene1407Mouse::suWalkTo); + SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); NextState(&AsScene1407Mouse::stIdleLookAtGoodHole); } @@ -1225,14 +1225,14 @@ void AsScene1407Mouse::stWalkToDest() { void AsScene1407Mouse::stWalkToHole() { setDoDeltaX(_walkDestX < _x ? 1 : 0); startAnimation(0x22291510, 0, -1); - SetSpriteCallback(&AsScene1407Mouse::suWalkTo); + SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); NextState(&AsScene1407Mouse::stGoThroughHole); } void AsScene1407Mouse::stGoThroughHole() { startAnimation(0x72215194, 0, -1); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); SetMessageHandler(NULL); SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); NextState(&AsScene1407Mouse::stArriveAtHole); diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 44c8721d6d..6519efaf38 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -175,7 +175,7 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) SetUpdateHandler(&Class521::update); SetMessageHandler(&Class521::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); // TODO createSurface2(200, dword_4AF4C0); createSurface(200, 640, 480); //TODO: Remove once the line above is done @@ -244,7 +244,7 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1019: - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); break; /* NOTE: Implemented in setPathPoints case 0x2000: @@ -317,7 +317,7 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity if (_currPointIndex == 0) { moveToPrevPoint(); } else { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } else { if (minMatchIndex > _currPointIndex) { @@ -336,14 +336,14 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity _moreY = param.asInteger(); _steps = 0; _flag10E = 0; - SetSpriteCallback(&Class521::suMoveToPrevPoint); + SetSpriteUpdate(&Class521::suMoveToPrevPoint); _lastDistance = 640; break; case 0x2008: _moreY = param.asInteger(); _steps = 0; _flag10E = 0; - SetSpriteCallback(&Class521::suMoveToNextPoint); + SetSpriteUpdate(&Class521::suMoveToNextPoint); _lastDistance = 640; break; case 0x2009: @@ -397,7 +397,7 @@ uint32 Class521::handleMessage45CCA0(int messageNum, const MessageParam ¶m, void Class521::sub45CD00() { bool doDeltaX = _doDeltaX; - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _againDestPtFlag = 0; _againDestPointFlag = 0; _flag10E = 0; @@ -425,12 +425,12 @@ void Class521::sub45CDC0() { _lastDistance = 640; _flag113 = 0; _flag10E = 0; - SetSpriteCallback(&Class521::suMoveToNextPoint); + SetSpriteUpdate(&Class521::suMoveToNextPoint); } else if (_value112 == 2) { _lastDistance = 640; _flag113 = 0; _flag10E = 0; - SetSpriteCallback(&Class521::suMoveToPrevPoint); + SetSpriteUpdate(&Class521::suMoveToPrevPoint); } } @@ -581,7 +581,7 @@ void Class521::moveToNextPoint() { NextState(&Class521::sub45D100); } _flag10E = 0; - SetSpriteCallback(&Class521::suMoveToNextPoint); + SetSpriteUpdate(&Class521::suMoveToNextPoint); _lastDistance = 640; } } @@ -643,7 +643,7 @@ void Class521::moveToPrevPoint() { NextState(&Class521::sub45D100); } _flag10E = 0; - SetSpriteCallback(&Class521::suMoveToPrevPoint); + SetSpriteUpdate(&Class521::suMoveToPrevPoint); _lastDistance = 640; } } diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index f91513fe57..45d3b834a5 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -262,7 +262,7 @@ void AsScene1907Symbol::suTryToPlugIn() { if (_currStep == 16) { _x -= _smallDeltaX; _y -= _smallDeltaY; - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -313,7 +313,7 @@ void AsScene1907Symbol::suMoveDown() { if (_y >= kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y) { _y = kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y; _isMoving = false; - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -335,7 +335,7 @@ void AsScene1907Symbol::suMoveUp() { if (_y < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { _y = kAsScene1907SymbolPluggedInPositions[_elementIndex].y; _isMoving = false; - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -348,7 +348,7 @@ void AsScene1907Symbol::tryToPlugIn() { startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); SetUpdateHandler(&AsScene1907Symbol::update); SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn); - SetSpriteCallback(&AsScene1907Symbol::suTryToPlugIn); + SetSpriteUpdate(&AsScene1907Symbol::suTryToPlugIn); _currStep = 0; _deltaX = (_x - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x) / 16; _smallDeltaX = _x - _deltaX * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x; @@ -378,7 +378,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { _yAccel = 1; SetUpdateHandler(&AsScene1907Symbol::update); SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteCallback(&AsScene1907Symbol::suFallOff); + SetSpriteUpdate(&AsScene1907Symbol::suFallOff); } void AsScene1907Symbol::stFallOffHitGround() { @@ -388,7 +388,7 @@ void AsScene1907Symbol::stFallOffHitGround() { Entity::_priority = 1000 - _newPositionIndex; _vm->_collisionMan->removeSprite(this); _vm->_collisionMan->addSprite(this); - SetSpriteCallback(&AsScene1907Symbol::suFallOffHitGround); + SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround); NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); _newStickFrameIndex = 0; _currStep = 0; @@ -409,7 +409,7 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() { _newStickFrameIndex = 0; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); processDelta(); _soundResource3.play(); } @@ -419,7 +419,7 @@ void AsScene1907Symbol::stPlugIn() { _currPositionIndex = _newPositionIndex; stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); if (_elementIndex == 8) sendMessage(_parentScene, 0x2001, 0); } @@ -434,7 +434,7 @@ void AsScene1907Symbol::moveUp() { startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteCallback(&AsScene1907Symbol::suMoveUp); + SetSpriteUpdate(&AsScene1907Symbol::suMoveUp); _yIncr = 1; _isMoving = true; } @@ -443,7 +443,7 @@ void AsScene1907Symbol::moveDown() { startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteCallback(&AsScene1907Symbol::suMoveDown); + SetSpriteUpdate(&AsScene1907Symbol::suMoveDown); _yIncr = 4; _isMoving = true; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index e886accfef..9846bc5cd4 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -841,7 +841,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { } if (_xDelta > _yDelta) { - SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileX); + SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileX); if (_xIncr > 0) { if (_newX - _x >= 180) _xFlagPos = _newX - 90; @@ -855,7 +855,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { } _soundResource1.play(); } else { - SetSpriteCallback(&SsScene2202PuzzleTile::suMoveTileY); + SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileY); if (_yIncr > 0) { if (_newY - _y >= 180) _xFlagPos = _newY - 90; @@ -879,7 +879,7 @@ void SsScene2202PuzzleTile::stopMoving() { _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; _needRefresh = true; - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _isMoving = false; sendMessage(_parentScene, 0x2002, _tileIndex); } @@ -1413,7 +1413,7 @@ Class603::Class603(NeverhoodEngine *vm, uint32 fileHash) _x -= 63; SetUpdateHandler(&Class603::update); SetMessageHandler(&Class603::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Class603::update() { @@ -1427,13 +1427,13 @@ uint32 Class603::handleMessage(int messageNum, const MessageParam ¶m, Entity case 0x4808: _index = 0; SetMessageHandler(NULL); - SetSpriteCallback(&Class603::spriteUpdate481E60); + SetSpriteUpdate(&Class603::spriteUpdate481E60); _soundResource.play(0x032746E0); break; case 0x4809: _index = 0; SetMessageHandler(NULL); - SetSpriteCallback(&Class603::spriteUpdate481E90); + SetSpriteUpdate(&Class603::spriteUpdate481E90); _soundResource.play(0x002642C0); break; } @@ -1446,7 +1446,7 @@ void Class603::spriteUpdate481E60() { _index++; } else { SetMessageHandler(&Class603::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -1456,7 +1456,7 @@ void Class603::spriteUpdate481E90() { _index++; } else { SetMessageHandler(&Class603::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } } @@ -1465,7 +1465,7 @@ Class604::Class604(NeverhoodEngine *vm, uint32 fileHash) SetUpdateHandler(&Class604::update); SetMessageHandler(&Class604::handleMessage); - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); } void Class604::update() { @@ -1478,7 +1478,7 @@ uint32 Class604::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x4803: SetMessageHandler(NULL); - SetSpriteCallback(&Class604::spriteUpdate482020); + SetSpriteUpdate(&Class604::spriteUpdate482020); _yDelta = 0; break; } @@ -1708,7 +1708,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene createSurface(1100, 129, 103); startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0); SetUpdateHandler(&AsScene2207Elevator::update); - SetSpriteCallback(&AsScene2207Elevator::suSetPosition); + SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); SetMessageHandler(&AsScene2207Elevator::handleMessage); _newStickFrameIndex = 0; } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 8c5fd6c59d..8c797f3e61 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -670,7 +670,7 @@ AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine * SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage); if (varValue == 8 || varValue == 9 || varValue == 10) { - SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight); + SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); _x = 280; } } @@ -691,7 +691,7 @@ uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const Messa void AsScene3009HorizontalIndicator::suMoveLeft() { _x -= 6; if (_x < 92) { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _x = 92; } } @@ -699,7 +699,7 @@ void AsScene3009HorizontalIndicator::suMoveLeft() { void AsScene3009HorizontalIndicator::suMoveRight() { _x += 6; if (_x > 533) { - SetSpriteCallback(NULL); + SetSpriteUpdate(NULL); _x = 533; } } @@ -713,12 +713,12 @@ void AsScene3009HorizontalIndicator::show() { void AsScene3009HorizontalIndicator::stMoveLeft() { _x = 533; - SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveLeft); + SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveLeft); } void AsScene3009HorizontalIndicator::stMoveRight() { _x = 330; - SetSpriteCallback(&AsScene3009HorizontalIndicator::suMoveRight); + SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); } AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index) diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index adc46198d6..b7c276efd7 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -31,6 +31,7 @@ #include "common/system.h" #include "audio/mixer.h" #include "engines/engine.h" +#include "neverhood/messages.h" namespace Neverhood { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 9a588f283f..457d5866d0 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -387,13 +387,11 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { if (_rectType == 1) { RectList &rectList = *_rectList; for (uint i = 0; i < rectList.size(); i++) { - debug("(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2); - if (klaymanX >= rectList[i].rect.x1 && klaymanX <= rectList[i].rect.x2 && - klaymanY >= rectList[i].rect.y1 && klaymanY <= rectList[i].rect.y2) { + debug(2, "(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2); + if (rectList[i].rect.contains(klaymanX, klaymanY)) { for (uint j = 0; j < rectList[i].subRects.size(); j++) { - debug(" (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2); - if (mouseX >= rectList[i].subRects[j].rect.x1 && mouseX <= rectList[i].subRects[j].rect.x2 && - mouseY >= rectList[i].subRects[j].rect.y1 && mouseY <= rectList[i].subRects[j].rect.y2) { + debug(2, " (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2); + if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) { debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId); return setMessageList2(rectList[i].subRects[j].messageListId); } diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 9ae7e14eed..1b40c8f1f6 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -35,9 +35,8 @@ SmackerSurface::SmackerSurface(NeverhoodEngine *vm) } void SmackerSurface::draw() { - if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) { + if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) _vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false); - } } void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) { @@ -60,15 +59,14 @@ SmackerDoubleSurface::SmackerDoubleSurface(NeverhoodEngine *vm) } void SmackerDoubleSurface::draw() { - if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) { + if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) _vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect); - } } // SmackerPlayer SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag) - : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _flag2(false), + : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false), _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true), _drawX(-1), _drawY(-1) { @@ -146,6 +144,8 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) { void SmackerPlayer::rewind() { + // TODO Quite dirty, try to implement this in the decoder + delete _smackerDecoder; _smackerDecoder = NULL; _stream = NULL; @@ -170,37 +170,17 @@ void SmackerPlayer::update() { _dirtyFlag = false; } -#if 0 - if (!_smackerDecoder->endOfVideo()) { - updateFrame(); - if (_smackerDecoder->endOfVideo() && !_keepLastFrame) { - // Inform the scene about the end of the video playback - if (_scene) { - sendMessage(_scene, 0x3002, 0); - } - _flag2 = true; - } else { - if (_smackerDecoder->endOfVideo()) { - rewind(); - updateFrame(); - } - _flag2 = false; - } - } -#endif - if (!_smackerDecoder->endOfVideo()) { updateFrame(); } else if (!_keepLastFrame) { // Inform the scene about the end of the video playback - if (_scene) { + if (_scene) sendMessage(_scene, 0x3002, 0); - } - _flag2 = true; + _videoDone = true; } else { rewind(); updateFrame(); - _flag2 = false; + _videoDone = false; } } @@ -231,9 +211,9 @@ void SmackerPlayer::updateFrame() { // TODO _vm->_screen->_skipUpdate = true; _dirtyFlag = true; - if (_smackerDecoder->hasDirtyPalette()) { + if (_smackerDecoder->hasDirtyPalette()) updatePalette(); - } + } void SmackerPlayer::updatePalette() { diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index 883cb52245..65c0c84e11 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -70,7 +70,7 @@ protected: bool _doubleSurface; Common::SeekableReadStream *_stream; bool _keepLastFrame; - bool _flag2; + bool _videoDone; bool _dirtyFlag; int _drawX, _drawY; void update(); diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index fe78e5021e..9982043dea 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -82,7 +82,6 @@ void SmackerScene::nextVideo() { } if (_fileHashListIndex == 0) { _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false)); - // TODO? Screen.hSmack = _smackerPlayer; } else { _smackerPlayer->open(smackerFileHash, false); } @@ -108,9 +107,8 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam ¶m, En _playNextVideoFlag = true; break; case 0x000C: - if (_canAbort) { + if (_canAbort) sendMessage(_parentModule, 0x1009, 0); - } break; case 0x3002: _playNextVideoFlag = true; diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index b9decefd0a..bc7c0a5247 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -30,7 +30,7 @@ namespace Neverhood { -#define SetSpriteCallback(callback) _spriteUpdateCb = static_cast (callback); debug(2, "SetSpriteCallback(" #callback ")"); _spriteUpdateCbName = #callback +#define SetSpriteUpdate(callback) _spriteUpdateCb = static_cast (callback); debug(2, "SetSpriteUpdate(" #callback ")"); _spriteUpdateCbName = #callback #define SetFilterX(callback) _filterXCb = static_cast (callback); debug(2, "SetFilterX(" #callback ")") #define SetFilterY(callback) _filterYCb = static_cast (callback); debug(2, "SetFilterY(" #callback ")") -- cgit v1.2.3 From 9de3cf56756579e63aa6381cb2a9b30495d7d046 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 16 Aug 2012 13:19:11 +0000 Subject: NEVERHOOD: Some minor cleanup, add a TODO about some palette issues (I couldn't find any apparent causes yet) --- engines/neverhood/module2800.cpp | 9 ++++++--- engines/neverhood/palette.cpp | 6 ++---- engines/neverhood/resource.cpp | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index eded442676..6643d5a50e 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -123,6 +123,8 @@ void Module2800::updateScene() { Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { + // TODO Weird palette glitches in the mouse cursor and sprite, check this later + // TODO _vm->gameModule()->initScene2801Vars(); _surfaceFlag = true; @@ -143,11 +145,10 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0xC0418A02)) { insertKlayman(312, 432); _klayman->setDoDeltaX(1); - setMessageList(0x004B6C10); } else { insertKlayman(194, 432); - setMessageList(0x004B6C10); } + setMessageList(0x004B6C10); } else { insertKlayman(0, 432); setMessageList(0x004B6BB0); @@ -188,6 +189,8 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); } + + addEntity(_palette); if (which == 1) { _palette->addPalette(0xB103B604, 0, 65, 0); @@ -196,7 +199,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(_paletteHash, 0, 65, 0); _palette->addBasePalette(_paletteHash, 0, 65, 0); } - + } Scene2801::~Scene2801() { diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index 481e0e5058..936ca39ac6 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -143,9 +143,8 @@ void Palette::update() { debug(2, "Palette::update() _status = %d", _status); if (_status == 1) { if (_palCounter > 1) { - for (int i = 0; i < 256; i++) { + for (int i = 0; i < 256; i++) fadeColor(_palette + i * 4, _fadeToR, _fadeToG, _fadeToB); - } _vm->_screen->testPalette(_palette); _palCounter--; } else { @@ -154,9 +153,8 @@ void Palette::update() { } } else if (_status == 2) { if (_palCounter > 1) { - for (int i = 0; i < 256; i++) { + for (int i = 0; i < 256; i++) fadeColor(_palette + i * 4, _basePalette[i * 4 + 0], _basePalette[i * 4 + 1], _basePalette[i * 4 + 2]); - } _vm->_screen->testPalette(_palette); _palCounter--; } else { diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 9678031554..65f98a8599 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -119,7 +119,7 @@ bool PaletteResource::load(uint32 fileHash) { case 3: // _palette already points to the correct data break; - default: + default: _vm->_res->unuseResource(_resourceHandle); _resourceHandle = -1; break; -- cgit v1.2.3 From 0abba004fe4a6b172269f09cfe55d7d683736867 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 16 Aug 2012 17:39:45 +0000 Subject: NEVERHOOD: Add tables for Scene2805 --- devtools/create_neverhood/tables.h | 9 +++++++++ dists/engine-data/neverhood.dat | Bin 20050 -> 20424 bytes 2 files changed, 9 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 514912c41a..70402d48d2 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -116,6 +116,9 @@ static const uint32 rectListOffsets[] = { 1, 0x004B6CE0, 1, 0x004B6CD0, 1, 0x004B6CF0, + // Scene2805 + 1, 0x004AE318, + 1, 0x004AE308, 0, 0 }; @@ -387,6 +390,12 @@ static const uint32 messageListOffsets[] = { 1, 0x004B6C10, 1, 0x004B6BB0, 2, 0x004B6C40, + // Scene2805 + 1, 0x004AE1C8, + 2, 0x004AE1D0, + 4, 0x004AE288, + 2, 0x004AE1E0, + 1, 0x004AE1C0, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 72f35a6554..14f72dd674 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 646790489886aa8adb9a5bfc6e6ec6c57e5aa62b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 16 Aug 2012 17:40:22 +0000 Subject: NEVERHOOD: Implement Scene2805 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 86 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 11 +++++ engines/neverhood/module2800.cpp | 70 ++++++++++++++++++++++++++++++++ engines/neverhood/module2800.h | 9 +++++ 5 files changed, 177 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 781a9c305a..37e87431bf 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -303,7 +303,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 0; + _vm->gameState().sceneNum = 4; createModule(2800, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 303e3fe364..247c946bc3 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4916,4 +4916,90 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + // Empty +} + +uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klayman::sub421350); + else + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klayman::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klayman::stReturnFromUseInTeleporter); + break; + case 0x4834: + GotoState(&Klayman::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klayman::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); + break; + case 0x483D: + sub404890(); + break; + case 0x483E: + sub4048D0(); + break; + } + return 0; +} + +uint32 KmScene2805::handleMessage404800(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) + _soundResource1.play(0x85B10BB8); + else if (param.asInteger() == 0x4E6A0CA0) + _soundResource1.play(0xC5B709B0); + break; + } + return messageResult; +} + +void KmScene2805::sub404890() { + _status2 = 0; + _acceptInput = false; + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&KmScene2805::handleMessage404800); + startAnimation(0xDE284B74, 0, -1); +} + +void KmScene2805::sub4048D0() { + _status2 = 0; + _acceptInput = false; + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&KmScene2805::handleMessage404800); + startAnimation(0xD82A4094, 0, -1); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 355c6d6f15..5f4076e303 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -549,6 +549,17 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2805 : public Klayman { +public: + KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _isSittingInTeleporter; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage404800(int messageNum, const MessageParam ¶m, Entity *sender); + void sub404890(); + void sub4048D0(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 6643d5a50e..c1e70483a6 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -73,6 +73,10 @@ void Module2800::createScene(int sceneNum, int which) { } #endif break; + case 4: + // TODO Music18hList_stop(0xD2FA4D14, 0, 2); + _childObject = new Scene2805(_vm, this, which); + break; // case 1001: break; @@ -104,6 +108,13 @@ void Module2800::updateScene() { createScene(1001, -1); } break; + case 4: + if (_moduleResult == 1) { + leaveModule(1); + } else { + createScene(11, 1); + } + break; // case 1001: break; @@ -228,4 +239,63 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene2805::handleMessage); + + setBackground(0x08021E04); + setPalette(0x08021E04); + _palette->addPalette(0x8A6B1F91, 0, 65, 0); + insertMouse433(0x21E00088); + + _sprite1 = insertStaticSprite(0x008261E7, 1100); + _sprite2 = insertStaticSprite(0x020CE421, 1100); + + if (which < 0) { + insertKlayman(380, 338); + setMessageList(0x004AE1C8); + sendMessage(this, 0x2000, 0); + } else if (which == 1) { + insertKlayman(493, 338); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004AE1D0); + sendMessage(this, 0x2000, 1); + } else if (which == 2) { + insertKlayman(493, 338); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004AE288); + sendMessage(this, 0x2000, 1); + } else if (which == 3) { + insertKlayman(493, 338); + sendMessage(_klayman, 0x2000, 1); + setMessageList(0x004AE1E0); + sendMessage(this, 0x2000, 1); + } else { + insertKlayman(340, 338); + setMessageList(0x004AE1C0); + sendMessage(this, 0x2000, 0); + } + + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + +} + +uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004AE318); + _klayman->setKlaymanIdleTable3(); + } else { + setRectList(0x004AE308); + _klayman->setKlaymanIdleTable1(); + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index cdfcdbe802..06d818cc74 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -54,6 +54,15 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2805 : public Scene { +public: + Scene2805(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From ee7bd2fc6c228d3088cb236c54614b656af17636 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 17 Aug 2012 15:03:38 +0000 Subject: NEVERHOOD: Implement Scene2803b - Also some more Klayman stuff used by that scene --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 280 ++++++++++++++++++++++++++++++++++++-- engines/neverhood/klayman.h | 33 ++++- engines/neverhood/module2800.cpp | 287 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2800.h | 24 ++++ 5 files changed, 607 insertions(+), 19 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 37e87431bf..a424d53556 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -303,7 +303,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 4; + _vm->gameState().sceneNum = 2; createModule(2800, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 247c946bc3..010c2e4ef0 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -62,7 +62,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0), _counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), - _flagFA(false), _ladderStatus(0), _field114(0), _resourceHandle(-1), _soundFlag(false) { + _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); @@ -574,11 +574,9 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E break; case 0x482C: if (param.asInteger() != 0) { - debug("#################################################"); - // TODO _rectResource.getRectangle2(param.asInteger(), &_field118, &_field114,); + _pathPoints = _dataResource.getPointArray(param.asInteger()); } else { - debug("#################################################"); - // TODO _field114 = 0; + _pathPoints = NULL; } break; } @@ -757,9 +755,8 @@ void Klayman::suWalking() { if (_destX != _x) { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdiff; - if (_field114) { - error("// TODO Klayman_sub_41CF70"); - // TODO Klayman_sub_41CF70 + if (_pathPoints) { + walkAlongPathPoints(); } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { @@ -939,9 +936,8 @@ void Klayman::suWalkingTestExit() { } else { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdelta; - if (_field114) { - error("_field114"); - // TODO Klayman_sub_41CF70 + if (_pathPoints) { + walkAlongPathPoints(); } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { @@ -1096,6 +1092,153 @@ void Klayman::startSpecialWalkLeft(int16 x) { } } +void Klayman::sub41CDE0(int16 x) { + _status3 = 2; + if (_x == x) { + _destX = x; + if (_isWalking) { + GotoState(NULL); + gotoNextStateExt(); + } + } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _destX = x; + } else { + _destX = x; + GotoState(&Klayman::sub421680); + } +} + +void Klayman::sub421680() { + _isWalking = true; + _acceptInput = true; + _status3 = 2; + setDoDeltaX(_destX < _x ? 1 : 0); + startAnimation(0x3A4CD934, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41ED70); + SetSpriteUpdate(&Klayman::suWalkingTestExit); + FinalizeState(&Klayman::stStartWalkingDone); +} + +uint32 Klayman::handleMessage41ED70(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) + _soundResource1.play(0x4924AAC4); + else if (param.asInteger() == 0x0A2A9098) + _soundResource1.play(0x0A2AA8E0); + } + return messageResult; +} + +void Klayman::sub421640() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x90D0D1D0, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteUpdate(NULL); +} + +void Klayman::sub421740() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x11C8D156, 30, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteUpdate(NULL); +} + +void Klayman::sub421780() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x11C8D156, 0, 10); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteUpdate(NULL); +} + +void Klayman::sub421700() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x11C8D156, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteUpdate(NULL); +} + +void Klayman::sub421840() { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0x3F9CC394, 0x14884392, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EE00); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); +} + +uint32 Klayman::handleMessage41EE00(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) + sendMessage(_parentScene, 0x482A, 0); + else if (param.asInteger() == 0x110010D1) + sendMessage(_parentScene, 0x482B, 0); + else if (param.asInteger() == 0x32180101) + _soundResource1.play(0x4924AAC4); + else if (param.asInteger() == 0x0A2A9098) + _soundResource1.play(0x0A2AA8E0); + break; + } + return messageResult; +} + +void Klayman::sub421800() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2F1C4694, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EE00); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); +} + +void Klayman::sub4217C0() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x3F9CC394, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EE00); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); +} + +void Klayman::sub421900() { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0x37ECD436, 0, 0x8520108C); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EE00); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); +} + +void Klayman::sub4218C0() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x16EDDE36, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EE00); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); +} + +void Klayman::sub421880() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x37ECD436, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EE00); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); +} + void Klayman::sub41CC40(int16 x1, int16 x2) { if (_x > x1) { if (_x == x1 + x2) { @@ -1182,9 +1325,8 @@ void Klayman::suLargeStep() { if (_x != _destX) { HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); _x += xdiff; - if (_field114) { - error("// TODO Klayman_sub_41CF70();"); - // TODO Klayman_sub_41CF70(); + if (_pathPoints) { + walkAlongPathPoints(); } else { HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { @@ -1928,6 +2070,39 @@ uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity * return handleMessage41D480(messageNum, param, sender); } +void Klayman::walkAlongPathPoints() { + if (_x <= (*_pathPoints)[0].x) + _y = (*_pathPoints)[0].y; + else if (_x >= (*_pathPoints)[_pathPoints->size() - 1].x) + _y = (*_pathPoints)[_pathPoints->size() - 1].y; + else { + int16 deltaX = _x - (*_pathPoints)[0].x, deltaXIncr = 0; + uint index = 0; + while (deltaX > 0) { + NPoint pt2 = (*_pathPoints)[index]; + NPoint pt1 = index + 1 >= _pathPoints->size() ? (*_pathPoints)[0] : (*_pathPoints)[index + 1]; + int16 xd = ABS(pt1.x - pt2.x); + int16 yd = ABS(pt1.y - pt2.y); + if (deltaX + deltaXIncr >= xd) { + deltaX -= xd; + deltaX += deltaXIncr; + ++index; + if (index >= _pathPoints->size()) + index = 0; + _y = (*_pathPoints)[index].y; + } else { + deltaXIncr += deltaX; + if (pt1.y >= pt2.y) { + _y = pt2.y + (yd * deltaXIncr) / xd; + } else { + _y = pt2.y - (yd * deltaXIncr) / xd; + } + deltaX = 0; + } + } + } +} + //############################################################################## // KmScene1001 @@ -4916,6 +5091,83 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _soundResource(vm) { + + _dataResource.load(0x81120132); + _soundResource.load(0x10688664); +} + +uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41CDE0(param.asPoint().x); + break; + case 0x4004: + GotoState(&Klayman::sub421640); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + sub41CDE0(_dataResource.getPoint(param.asInteger()).x); + break; + case 0x481F: + if (param.asInteger() == 1) + GotoState(&Klayman::sub421740); + else if (param.asInteger() == 0) + GotoState(&Klayman::sub421780); + else + GotoState(&Klayman::sub421700); + break; + case 0x482E: + if (param.asInteger() == 1) + GotoState(&Klayman::sub421840); + else if (param.asInteger() == 2) + GotoState(&Klayman::sub421800); + else + GotoState(&Klayman::sub4217C0); + break; + case 0x482F: + if (param.asInteger() == 1) + GotoState(&Klayman::sub421900); + else if (param.asInteger() == 2) + GotoState(&Klayman::sub4218C0); + else + GotoState(&Klayman::sub421880); + break; + case 0x4830: + GotoState(&KmScene2803b::sub460670); + break; + } + return 0; +} + +uint32 KmScene2803b::handleMessage460600(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) + sendMessage(_parentScene, 0x482A, 0); + else if (param.asInteger() == 0x33288344) + _soundResource.play(); + break; + } + return messageResult; +} + +void KmScene2803b::sub460670() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x1AE88904, 0, -1); + _soundResource1.play(0x4C69EA53); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene2803b::handleMessage460600); +} + KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 5f4076e303..ab7ccb6050 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -140,6 +140,17 @@ public: void setSoundFlag(bool value) { _soundFlag = value; } + void sub421640(); + void sub421740(); + void sub421780(); + void sub421700(); + void sub421840(); + void sub421800(); + void sub4217C0(); + void sub421900(); + void sub4218C0(); + void sub421880(); + protected: Entity *_parentScene; Sprite *_attachedSprite; @@ -165,10 +176,7 @@ protected: const KlaymanIdleTableItem *_idleTable; int _idleTableCount; int _idleTableMaxValue; - uint32 _field114; - /* - 00000118 field118 dw ? - */ + NPointArray *_pathPoints; bool _soundFlag; int _resourceHandle; virtual void xUpdate(); @@ -249,6 +257,13 @@ protected: uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); + void sub41CDE0(int16 x); + void sub421680(); + uint32 handleMessage41ED70(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage41EE00(int messageNum, const MessageParam ¶m, Entity *sender); + + void walkAlongPathPoints(); + }; class KmScene1001 : public Klayman { @@ -549,6 +564,16 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2803b : public Klayman { +public: + KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + SoundResource _soundResource; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage460600(int messageNum, const MessageParam ¶m, Entity *sender); + void sub460670(); +}; + class KmScene2805 : public Klayman { public: KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index c1e70483a6..c6ce1791f7 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -73,6 +73,15 @@ void Module2800::createScene(int sceneNum, int which) { } #endif break; + case 2: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + setGlobalVar(0x1860C990,1);//DEBUG + if (getGlobalVar(0x1860C990)) + _childObject = new Scene2803b(_vm, this, which); + else { + // TODO _childObject = new Scene2803(_vm, this, which); + } + break; case 4: // TODO Music18hList_stop(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); @@ -108,6 +117,20 @@ void Module2800::updateScene() { createScene(1001, -1); } break; + case 2: + if (_moduleResult == 1) + createScene(3, 0); + else if (_moduleResult == 2) + createScene(5, 0); + else if (_moduleResult == 3) + createScene(6, 0); + else if (_moduleResult == 4) + createScene(9, 0); + else if (_moduleResult == 5) + createScene(25, 0); + else + createScene(0, 1); + break; case 4: if (_moduleResult == 1) { leaveModule(1); @@ -239,6 +262,270 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _palStatus(0) { + + static const uint32 kScene2803bFileHashes1[] = { + 0, 0x081000F1, 0x08100171, 0x08100271 + }; + + static const uint32 kScene2803bFileHashes2[] = { + 0, 0x286800D4, 0x286806D4, 0x28680AD4 + }; + + _surfaceFlag = true; + SetMessageHandler(&Scene2803b::handleMessage); + + loadDataResource(0x81120132); + insertMouse433(0x00A05290); + + // TODO insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); + + if (getGlobalVar(0x190A1D18)) { + setBackground(0x412A423E); + setPalette(0x412A423E); + _palette->addBasePalette(0x412A423E, 0, 256, 0); + addEntity(_palette); + _sprite1 = insertStaticSprite(0x0C03AA23, 1100); + _sprite2 = insertStaticSprite(0x24320220, 1100); + _sprite3 = insertStaticSprite(0x1A032204, 1100); + _sprite4 = insertStaticSprite(0x18032204, 1100); + _sprite5 = insertStaticSprite(0x34422912, 1100); + _sprite6 = insertStaticSprite(0x3C42022F, 1100); + _sprite7 = insertStaticSprite(0x341A0237, 1100); + + if (getSubVar(0x0C601058, 0) == 0) + insertStaticSprite(0x66121222, 100); + else + insertSprite(kScene2803bFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326); + + if (getSubVar(0x0C601058, 1) == 3) + insertStaticSprite(0x64330236, 100); + + if (getSubVar(0x0C601058, 2) == 3) + insertStaticSprite(0x2E4A22A2, 100); + + } else { + setBackground(0x29800A01); + setPalette(0x29800A01); + _palette->addBasePalette(0x29800A01, 0, 256, 0); + addEntity(_palette); + _sprite1 = insertStaticSprite(0x16202200, 1100); + _sprite2 = insertStaticSprite(0xD0802EA0, 1100); + _sprite3 = insertStaticSprite(0x780C2E30, 1100); + _sprite4 = insertStaticSprite(0x700C2E30, 1100); + _sprite5 = insertStaticSprite(0x102CE6E1, 900); + _sprite6 = insertStaticSprite(0x108012C1, 1100); + _sprite7 = insertStaticSprite(0x708072E0, 1100); + insertStaticSprite(0x90582EA4, 100); + + setSubVar(0x0C601058, 0, 1);//DEBUG, FIXME crashes when not done?! + if (getSubVar(0x0C601058, 0) == 0) + insertStaticSprite(0x50C027A8, 100); + else + insertSprite(kScene2803bFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326); + + if (getSubVar(0x0C601058, 1) == 3) + insertStaticSprite(0xD48077A0, 100); + + if (getSubVar(0x0C601058, 2) == 3) + insertStaticSprite(0x30022689, 100); + + } + + _sprite6->setVisible(false); + _sprite7->setVisible(false); + + if (which < 0) { + insertKlayman(479, 435); + sub460110(); + setMessageList(0x004B60D8); + } else if (which == 3) { + NPoint pt = _dataResource.getPoint(0x096520ED); + insertKlayman(pt.x, pt.y); + sub460090(); + setMessageList(0x004B6100); + _klayman->setRepl(64, 0); + } else if (which == 4) { + NPoint pt = _dataResource.getPoint(0x20C6238D); + insertKlayman(pt.x, pt.y); + sub460090(); + setMessageList(0x004B60F8); + _klayman->setRepl(64, 0); + } else if (which == 5) { + NPoint pt = _dataResource.getPoint(0x2146690D); + insertKlayman(pt.x, pt.y); + sub460090(); + setMessageList(0x004B6100); + _klayman->setRepl(64, 0); + } else if (which == 2) { + NPoint pt = _dataResource.getPoint(0x104C03ED); + insertKlayman(pt.x, pt.y); + sub460110(); + setMessageList(0x004B6138); + } else { + insertKlayman(135, 444); + sub460110(); + setMessageList(0x004B60E0); + _sprite6->setVisible(true); + _sprite7->setVisible(true); + } + +} + +uint32 Scene2803b::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xB4E4884C) { + setMessageList(0x004B6180); + } else if (param.asInteger() == 0xB1FDAB2E) { + NPoint pt = _dataResource.getPoint(0x0D84A1AD); + _klayman->setX(pt.x); + _klayman->setY(pt.y); + _klayman->processDelta(); + sub460110(); + _klayman->setClipRect(517, 401, 536, 480); + setMessageList(0x004B6198); + } else if (param.asInteger() == 0xB00C7C48) { + setMessageList(0x004B6108); + } else if (param.asInteger() == 0x61F64346) { + setMessageList(0x004B6150); + } else if (param.asInteger() == 0xAC69A28D) { + setMessageList(0x004B6168); + } else if (param.asInteger() == 0x00086212) { + _klayman->setClipRect(0, 0, 560, 315); + _klayman->setX(560); + _klayman->setY(315); + _klayman->processDelta(); + sub460090(); + setMessageList(0x004B61A0); + } else if (param.asInteger() == 0x002CAA68) { + setMessageList(0x004B61A8); + } + break; + case 0x482A: + if (_klayman->getX() < 200) { + sub4601D0(); + } else if (_klayman->getX() < 500) { + setSurfacePriority(_sprite5->getSurface(), 1100); + sendMessage(_klayman, 0x482C, 0); + sub4601B0(); + } else { + _klayman->setClipRect(517, 401, 536, 480); + sub4601B0(); + } + break; + case 0x482B: + _sprite6->setVisible(false); + _sprite7->setVisible(false); + _klayman->setClipRect(0, 0, 640, 480); + setSurfacePriority(_sprite5->getSurface(), 900); + sendMessage(_klayman, 0x482C, 0x2086222D); + break; + } + return 0; +} + +void Scene2803b::update45FCB0() { + if (_klayman->getX() < 388) { + _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + sub460170(); + } else if (_klayman->getX() < 500) { + _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + sub460190(); + } + Scene::update(); +} + +void Scene2803b::update45FD50() { + if (_klayman->getX() > 194 && _klayman->getX() < 273) + sub4601B0(); + else if (_klayman->getX() > 155 && _klayman->getX() < 300) + sub460170(); + Scene::update(); +} + +void Scene2803b::sub460090() { + SetUpdateHandler(&Scene2803b::update45FCB0); + sendMessage(_klayman, 0x482C, 0x23C630D9); + _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + _klayman->setRepl(64, 0); + _sprite1->setVisible(true); +} + +void Scene2803b::sub460110() { + SetUpdateHandler(&Scene2803b::update45FD50); + sendMessage(_klayman, 0x482C, 0x2086222D); + _klayman->setClipRect(0, 0, 640, 480); + _klayman->clearRepl(); + _sprite1->setVisible(false); +} + +void Scene2803b::sub460170() { + if (_palStatus != 0) { + _palStatus = 0; + sub4601F0(false); + } +} + +void Scene2803b::sub460190() { + if (_palStatus != 1) { + _palStatus = 1; + sub4601F0(false); + } +} + +void Scene2803b::sub4601B0() { + if (_palStatus != 2) { + _palStatus = 2; + sub4601F0(false); + } +} + +void Scene2803b::sub4601D0() { + if (_palStatus != 3) { + _palStatus = 3; + sub4601F0(true); + } +} + +void Scene2803b::sub4601F0(bool flag) { + if (getGlobalVar(0x190A1D18)) { + switch (_palStatus) { + case 1: + _palette->addBasePalette(0x0A938204, 0, 64, 0); + break; + case 2: + _palette->addBasePalette(0xB103B604, 0, 64, 0); + break; + case 3: + // TODO _palette->sub_47BFB0(0, 64); + break; + default: + _palette->addBasePalette(0x412A423E, 0, 64, 0); + break; + } + } else { + switch (_palStatus) { + case 2: + _palette->addBasePalette(0x0263D144, 0, 64, 0); + break; + case 3: + // TODO _palette->sub_47BFB0(0, 64); + break; + default: + _palette->addBasePalette(0x29800A01, 0, 64, 0); + break; + } + } + if (flag) { + _palette->startFadeToPalette(0); + } else { + _palette->startFadeToPalette(12); + } +} + Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 06d818cc74..54b893bb5d 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -54,6 +54,30 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2803b : public Scene { +public: + Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _palStatus; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_sprite5; + Sprite *_sprite6; + Sprite *_sprite7; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void update45FCB0(); + void update45FD50(); + void sub460090(); + void sub460110(); + void sub460170(); + void sub460190(); + void sub4601B0(); + void sub4601D0(); + void sub4601F0(bool flag); +}; + class Scene2805 : public Scene { public: Scene2805(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From f3d98e62757fb7b3de2c2ebae87ef6f885967556 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 28 Aug 2012 21:52:09 +0000 Subject: NEVERHOOD: Add scene 28/05 --- engines/neverhood/module2800.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index c6ce1791f7..417e3f5dc8 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -86,6 +86,13 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_stop(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); break; + case 25: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + if (getGlobalVar(0x190A1D18)) + _childObject = new Class152(_vm, this, 0x01600204, 0x0020001E); + else + _childObject = new Class152(_vm, this, 0x08611204, 0x1120008E); + break; // case 1001: break; @@ -138,6 +145,9 @@ void Module2800::updateScene() { createScene(11, 1); } break; + case 25: + createScene(2, 5); + break; // case 1001: break; -- cgit v1.2.3 From 3cee21ac9391f98f1ed372ad0a99f9e81974ef2b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 29 Aug 2012 17:53:58 +0000 Subject: NEVERHOOD: Add tables for Scene2803b (forgot them before) and Scene2806 --- devtools/create_neverhood/tables.h | 21 +++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 20424 -> 20818 bytes 2 files changed, 21 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 70402d48d2..fe6644ef07 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -390,12 +390,33 @@ static const uint32 messageListOffsets[] = { 1, 0x004B6C10, 1, 0x004B6BB0, 2, 0x004B6C40, + // Scene2803b + 1, 0x004B60D8, + 1, 0x004B6100, + 1, 0x004B60F8, + 1, 0x004B6100, + 3, 0x004B6138, + 3, 0x004B60E0, + 3, 0x004B6180, + 1, 0x004B6198, + 6, 0x004B6108, + 3, 0x004B6150, + 3, 0x004B6168, + 1, 0x004B61A0, + 5, 0x004B61A8, // Scene2805 1, 0x004AE1C8, 2, 0x004AE1D0, 4, 0x004AE288, 2, 0x004AE1E0, 1, 0x004AE1C0, + // Scene2806 + 1, 0x004AF098, + 1, 0x004AF098, + 3, 0x004AF0C8, + 5, 0x004AF0A0, + 1, 0x004AF090, + 2, 0x004AF0E0, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 14f72dd674..58190d088c 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From c2f91e39ba8e7654d5f0da3f789a9eaf9136afe5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 29 Aug 2012 17:54:46 +0000 Subject: NEVERHOOD: Implement Scene2806 (Class469 TODO) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 264 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/klayman.h | 29 ++++- engines/neverhood/module2800.cpp | 133 ++++++++++++++++++++ engines/neverhood/module2800.h | 18 +++ 5 files changed, 442 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index a424d53556..62fe2ada2a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -303,7 +303,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 2; + _vm->gameState().sceneNum = 5; createModule(2800, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 010c2e4ef0..4178bec3a7 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -650,8 +650,7 @@ void Klayman::startWalkToX(int16 x, bool flag) { _destX = x; } else if (flag) { _destX = x; - error("// TODO AnimatedSprite_GotoState(&Klayman::sub421550));"); - // TODO AnimatedSprite_GotoState(&Klayman::sub421550); + GotoState(&Klayman::sub421550); } else { _destX = x; GotoState(&Klayman::stStartWalking); @@ -1239,6 +1238,104 @@ void Klayman::sub421880() { SetSpriteUpdate(&Klayman::spriteUpdate41F230); } +void Klayman::sub420F60() { + if (!stStartAction(AnimationCallback(&Klayman::sub420F60))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x3F28E094, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E6C0); + SetSpriteUpdate(NULL); + NextState(&Klayman::sub420FB0); + } +} + +void Klayman::sub420FB0() { + _acceptInput = false; + startAnimation(0x3A28C094, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E6C0); + SetSpriteUpdate(NULL); +} + +uint32 Klayman::handleMessage41E6C0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + sendMessage(_attachedSprite, 0x480F, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } + break; + } + return messageResult; +} + +void Klayman::sub421110() { + if (!stStartAction(AnimationCallback(&Klayman::sub421110))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x1A38A814, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E750); + SetSpriteUpdate(NULL); + } +} + +uint32 Klayman::handleMessage41E750(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02B20220) + _soundResource1.play(0xC5408620); + else if (param.asInteger() == 0x0A720138) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0x03020231) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0xB613A180) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x67221A03) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x038A010B) + _soundResource1.play(0x00018040); + else if (param.asInteger() == 0x422B0280) + _soundResource1.play(0x166FC6E0); + else if (param.asInteger() == 0x925A0C1E) + _soundResource1.play(0x40E5884D); + break; + } + return messageResult; +} + +void Klayman::sub4215E0() { + _status2 = 0; + _isWalking = true; + _acceptInput = true; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41EB70); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); + NextState(&Klayman::stUpdateWalking); + FinalizeState(&Klayman::stStartWalkingDone); + startAnimation(0x5A2CBC00, 0, -1); +} + +void Klayman::sub421550() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub421550))) { + _status2 = 0; + _isWalking = true; + _acceptInput = true; + setDoDeltaX(_destX < _x ? 1 : 0); + startAnimation(0x272C1199, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmStartWalking); + SetSpriteUpdate(&Klayman::suWalkingTestExit); + FinalizeState(&Klayman::stStartWalkingDone); + NextState(&Klayman::sub4215E0); + } +} + void Klayman::sub41CC40(int16 x1, int16 x2) { if (_x > x1) { if (_x == x1 + x2) { @@ -5254,4 +5351,167 @@ void KmScene2805::sub4048D0() { startAnimation(0xD82A4094, 0, -1); } +KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount) + : Klayman(vm, parentScene, x, y, 1000, 1000), + _soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) { + // Empty + + if (flag) { + // TODO Maybe? Don't know. Set Klayman clip rects + _soundRes1.load(0x58E0C341); + _soundRes2.load(0x40A00342); + _soundRes3.load(0xD0A1C348); + _soundRes4.load(0x166FC6E0); + _soundRes5.load(0x00018040); + } + + _dataResource.load(0x98182003); + +} + +uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4804: + startWalkToX(440, true); + break; + case 0x480D: + GotoState(&Klayman::sub420F60); + break; + case 0x4816: + if (param.asInteger() == 0) { + GotoState(&Klayman::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x4831: + GotoState(&KmScene2806::sub40F780); + break; + case 0x4832: + if (param.asInteger() == 1) { + GotoState(&KmScene2806::sub40F7C0); + } else { + GotoState(&Klayman::sub421110); + } + break; + } + return 0; +} + +uint32 KmScene2806::handleMessage40F1F0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + if (_flag1) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } else + _flag2 = true; + break; + case 0x100D: + if (param.asInteger() == 0x0002418E) + sendMessage(_parentScene, 0x2000, 0); + else if (param.asInteger() == 0x924090C2) { + _flag1 = true; + if (_flag2) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } + } else if (param.asInteger() == 0x004A2148) + _flag1 = false; + else if (param.asInteger() == 0x02B20220) + _soundResource1.play(0xC5408620); + else if (param.asInteger() == 0x0A720138) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0x03020231) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0xB613A180) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x67221A03) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x038A010B) + _soundResource1.play(0x00018040); + else if (param.asInteger() == 0x422B0280) + _soundResource1.play(0x166FC6E0); + else if (param.asInteger() == 0x925A0C1E) + _soundResource1.play(0x40E5884D); + else if (param.asInteger() == 0x00020814) + _soundResource1.play(0x786CC6D0); + else if (param.asInteger() == 0x06020500) + _soundResource1.play(0x1069C0E1); + else if (param.asInteger() == 0x02128C00) + _soundResource1.play(0x5068C4C3); + else if (param.asInteger() == 0x82022030) + _soundResource1.play(0x5C48C0E8); + break; + } + return messageResult; +} + +uint32 KmScene2806::handleMessage40F570(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) + _soundResource1.play(0x405002D8); + else if (param.asInteger() == 0x0A2A9098) + _soundResource1.play(0x0460E2FA); + else if (param.asInteger() == 0xD00A0C0C) + _soundRes1.play(); + else if (param.asInteger() == 0x04121920) + _soundRes2.play(); + else if (param.asInteger() == 0x030B4480) + _soundRes3.play(); + else if (param.asInteger() == 0x422B0280) + _soundRes4.play(); + else if (param.asInteger() == 0x038A010B) + _soundRes5.play(); + else if (param.asInteger() == 0x67221A03) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x02B20220) + _soundResource1.play(0xC5408620); + else if (param.asInteger() == 0x925A0C1E) + _soundResource1.play(0x40E5884D); + else if (param.asInteger() == 0x03020231) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0x08040840) + setDoDeltaX(2); + break; + } + return messageResult; +} + +void KmScene2806::sub40F780() { + _status2 = 0; + _acceptInput = false; + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene2806::handleMessage40F570); + startAnimation(0x2838C010, 0, -1); +} + +void KmScene2806::sub40F7C0() { + _status2 = 1; + _acceptInput = false; + _flag1 = false; + _flag2 = false; + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&KmScene2806::handleMessage40F1F0); + startAnimation(0x1C388C04, 0, -1); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index ab7ccb6050..27d92984a2 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -30,7 +30,8 @@ namespace Neverhood { -// TODO: This code is horrible and weird and a lot of stuff needs renaming once a better name is found +// TODO This code is horrible and weird and a lot of stuff needs renaming once a better name is found +// TODO Also the methods should probably rearranged and be grouped together more consistently class Klayman; @@ -150,6 +151,13 @@ public: void sub421900(); void sub4218C0(); void sub421880(); + void sub420F60(); + void sub420FB0(); + uint32 handleMessage41E6C0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub421110(); + uint32 handleMessage41E750(int messageNum, const MessageParam ¶m, Entity *sender); + void sub4215E0(); + void sub421550(); protected: Entity *_parentScene; @@ -585,6 +593,25 @@ protected: void sub4048D0(); }; +class KmScene2806 : public Klayman { +public: + KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount); +protected: + SoundResource _soundRes1; + SoundResource _soundRes2; + SoundResource _soundRes3; + SoundResource _soundRes4; + SoundResource _soundRes5; + bool _flag1; + bool _flag2; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage40F1F0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage40F570(int messageNum, const MessageParam ¶m, Entity *sender); + void sub40F780(); + void sub40F7C0(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 417e3f5dc8..793fc748be 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -86,6 +86,10 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_stop(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); break; + case 5: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2806(_vm, this, which); + break; case 25: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); if (getGlobalVar(0x190A1D18)) @@ -145,6 +149,13 @@ void Module2800::updateScene() { createScene(11, 1); } break; + case 5: + if (_moduleResult == 1) { + createScene(27, 0); + } else { + createScene(2, 2); + } + break; case 25: createScene(2, 5); break; @@ -595,4 +606,126 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + _surfaceFlag = true; + SetMessageHandler(&Scene2806::handleMessage); + SetUpdateHandler(&Scene2806::update); + + loadDataResource(0x98182003); + loadHitRectList(); + + _pointList = _dataResource.getPointArray(0x3606A422); + + insertMouse433(0x22114C13); + setBackground(0xC1B22110); + setPalette(0xC1B22110); + + _sprite1 = insertStaticSprite(0xA21F82CB, 1100); + _clipRects[0].x1 = _sprite1->getDrawRect().x; + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _clipRects[0].x2 = _sprite1->getDrawRect().x2(); + _clipRects[0].y2 = _sprite1->getDrawRect().y2(); + + _sprite2 = insertStaticSprite(0x92035301, 1100); + _clipRects[1].y2 = _sprite2->getDrawRect().y2(); + + _sprite3 = insertStaticSprite(0x3182220E, 1100); + + _sprite4 = insertStaticSprite(0x72090342, 1100); + _clipRects[1].x1 = _sprite4->getDrawRect().x; + _clipRects[1].y1 = _sprite4->getDrawRect().y; + + _fieldEC = true; + + tempSprite = insertStaticSprite(0xD2012C02, 1100); + _clipRects[2].x1 = tempSprite->getDrawRect().x; + _clipRects[2].y2 = tempSprite->getDrawRect().y2(); + _clipRects[3].y1 = tempSprite->getDrawRect().y2(); + _clipRects[1].x2 = tempSprite->getDrawRect().x2(); + + tempSprite = insertStaticSprite(0x72875F42, 1100); + _clipRects[3].x1 = tempSprite->getDrawRect().x; + + insertStaticSprite(0x0201410A, 1100); + insertStaticSprite(0x72875F42, 1100); + + // TODO _class469 = insertSprite(); + + _clipRects[2].y1 = 0; + _clipRects[3].y2 = 480; + _clipRects[2].x2 = 640; + _clipRects[3].x2 = 640; + + if (which < 0) { + insertKlayman(441, 423, false, _clipRects, 4); + setMessageList(0x004AF098); + } else if (which == 1) { + insertKlayman(378, 423, false, _clipRects, 4); + setMessageList(0x004AF098); + } else if (which == 2) { + insertKlayman(378, 423, false, _clipRects, 4); + setMessageList(0x004AF0C8); + } else if (which == 3) { + insertKlayman(378, 423, true, _clipRects, 4); + setMessageList(0x004AF0A0); + setGlobalVar(0x1860C990, 0); + } else { + insertKlayman(670, 423, false, _clipRects, 4); + setMessageList(0x004AF090); + } + + _pointIndex = -1; + findClosestPoint(); + +} + +uint32 Scene2806::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x44262B12) { + setMessageList(0x004AF0E0); + } + break; + case 0x2000: + // TODO sendMessage(_class469, 0x2000, 0); + break; + } + return 0; +} + +void Scene2806::update() { + Scene::update(); + findClosestPoint(); +} + +void Scene2806::findClosestPoint() { + + static const uint32 kScene2806PaletteFileHashes[] = { + 0x48052508, + 0x01139404, + 0x01138C04, + 0x01138004, + 0x01138604, + 0x086B8890 + }; + + int16 x = MIN(_klayman->getX(), 639); + int index = 1; + + while (index < (int)_pointList->size() && (*_pointList)[index].x < x) + ++index; + --index; + + if (_pointIndex != index) { + _pointIndex = index; + _palette->addPalette(kScene2806PaletteFileHashes[index], 0, 64, 0); + } + +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 54b893bb5d..b672866543 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -87,6 +87,24 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2806 : public Scene { +public: + Scene2806(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + NPointArray *_pointList; + int _pointIndex; + NRect _clipRects[4]; + bool _fieldEC; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + // TODO class469 + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void update(); + void findClosestPoint(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From 404aaaad941efe6496223e4c0263b181be406a71 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 29 Aug 2012 19:39:27 +0000 Subject: NEVERHOOD: Implement Class469 --- engines/neverhood/module2800.cpp | 34 +++++++++++++++++++++++++++++++--- engines/neverhood/module2800.h | 10 +++++++++- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 793fc748be..27234eba17 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -151,7 +151,7 @@ void Module2800::updateScene() { break; case 5: if (_moduleResult == 1) { - createScene(27, 0); + createScene(7, 0); } else { createScene(2, 2); } @@ -606,6 +606,34 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } +Class469::Class469(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _soundResource(vm) { + + createSurface1(0x04211490, 1200); + _x = 378; + _y = 423; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Class469::handleMessage); + setDoDeltaX(1); + setVisible(false); +} + +uint32 Class469::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + _soundResource.play(0x48640244); + startAnimation(0x04211490, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -653,7 +681,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x0201410A, 1100); insertStaticSprite(0x72875F42, 1100); - // TODO _class469 = insertSprite(); + _class469 = insertSprite(); _clipRects[2].y1 = 0; _clipRects[3].y2 = 480; @@ -692,7 +720,7 @@ uint32 Scene2806::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - // TODO sendMessage(_class469, 0x2000, 0); + sendMessage(_class469, 0x2000, 0); break; } return 0; diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index b672866543..765873d3c6 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -87,6 +87,14 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class469 : public AnimatedSprite { +public: + Class469(NeverhoodEngine *vm); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene2806 : public Scene { public: Scene2806(NeverhoodEngine *vm, Module *parentModule, int which); @@ -99,7 +107,7 @@ protected: Sprite *_sprite2; Sprite *_sprite3; Sprite *_sprite4; - // TODO class469 + Sprite *_class469; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void update(); void findClosestPoint(); -- cgit v1.2.3 From 12bb3f23f35491cdef20cb11cb013426618cf97f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 4 Sep 2012 10:57:35 +0000 Subject: NEVERHOOD: Implement Scene2808 --- engines/neverhood/gamemodule.cpp | 27 ++- engines/neverhood/gamemodule.h | 2 + engines/neverhood/module2800.cpp | 452 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2800.h | 85 ++++++++ 4 files changed, 565 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 62fe2ada2a..248c873359 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -220,6 +220,31 @@ void GameModule::initScene1405Vars() { } +void GameModule::initScene2808Vars1() { + + // Exit if it's already initialized + if (getSubVar(0x40050052, 0x20479010)) + return; + + for (uint i = 0; i < 3; i++) + setSubVar(0x0C601058, i, _vm->_rnd->getRandomNumber(3 - 1) + 1); + + setSubVar(0x40050052, 0x20479010, 1); + +} + +void GameModule::initScene2808Vars2() { + + // Exit if it's already initialized + if (getSubVar(0x40050052, 0x66059818)) + return; + + for (uint i = 0; i < 3; i++) + setSubVar(0x40005834, i, _vm->_rnd->getRandomNumber(6 - 1) + 1); + + setSubVar(0x40050052, 0x66059818, 1); +} + void GameModule::initScene3009Vars() { if (!getSubVar(0x40050052, 0x8C9819C2)) { for (int i = 0; i < 3; i++) { @@ -303,7 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 7; createModule(2800, -1); #endif } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 6da7123125..f453feb580 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -39,6 +39,8 @@ public: void handleMouseDown(int16 x, int16 y); void initScene1307Vars(); void initScene1405Vars(); + void initScene2808Vars1(); + void initScene2808Vars2(); void initScene3009Vars(); protected: Entity *_prevChildObject; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 27234eba17..353bb76d73 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -90,6 +90,10 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2806(_vm, this, which); break; + case 7: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2808(_vm, this, 0); + break; case 25: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); if (getGlobalVar(0x190A1D18)) @@ -156,6 +160,9 @@ void Module2800::updateScene() { createScene(2, 2); } break; + case 7: + createScene(5, _moduleResult); + break; case 25: createScene(2, 5); break; @@ -756,4 +763,449 @@ void Scene2806::findClosestPoint() { } +static const uint32 kScene2808FileHashes1[] = { + 0x90B0392, + 0x90B0192 +}; + +static const uint32 kScene2808FileHashes2[] = { + 0xB0396098, + 0xB0196098 +}; + +static const uint32 kClass428FileHashes[] = { + 0x140022CA, + 0x4C30A602, + 0xB1633402, + 0x12982135, + 0x0540B728, + 0x002A81E3, + 0x08982841, + 0x10982841, + 0x20982841, + 0x40982841, + 0x80982841, + 0x40800711 +}; + +static const int kClass428Countdowns1[] = { + 18, 16, 10, 0 +}; + +static const int kClass428Countdowns2[] = { + 9, 9, 8, 8, 5, 5, 0, 0 +}; + +static const uint32 kClass490FileHashes[] = { + 0x08100071, + 0x24084215, + 0x18980A10 +}; + +static const int16 kClass490FrameIndices1[] = { + 0, 8, 15, 19 +}; + +static const int16 kClass490FrameIndices2[] = { + 0, 4, 8, 11, 15, 17, 19, 0 +}; + +AsScene2808Dispenser::AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex) + : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum), + _testTubeIndex(testTubeIndex) { + + _spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]); + createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + + _surface->getDrawRect().x = 0; + _surface->getDrawRect().y = 0; + _surface->getDrawRect().width = _spriteResource.getDimensions().width; + _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _deltaRect = _drawRect; + processDelta(); + + SetUpdateHandler(&AsScene2808Dispenser::update); + SetMessageHandler(&AsScene2808Dispenser::handleMessage); + + setVisible(false); + _needRefresh = true; + StaticSprite::update(); + +} + +void AsScene2808Dispenser::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + } +} + +uint32 AsScene2808Dispenser::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x2000, _testTubeIndex); + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene2808Dispenser::startCountdown(int index) { + setVisible(true); + StaticSprite::update(); + if (_testTubeSetNum == 0) { + _countdown = kClass428Countdowns1[index]; + } else { + _countdown = kClass428Countdowns2[index]; + } +} + +AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser) + : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _dispenser(dispenser), + _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), + _soundResource4(vm), _soundResource5(vm), _soundResource6(vm), + _soundResource7(vm), _soundResource8(vm), _soundResource9(vm), _fillLevel(0) { + + if (testTubeSetNum == 0) { + _x = 504; + _y = 278; + } else { + setDoDeltaX(1); + _x = 136; + _y = 278; + } + + createSurface1(kClass490FileHashes[testTubeIndex], 1100); + + if (testTubeSetNum == 0) { + _soundResource1.load(0x30809E2D); + _soundResource2.load(0x72811E2D); + _soundResource3.load(0x78B01625); + } else { + _soundResource4.load(0x70A41E0C); + _soundResource5.load(0x50205E2D); + _soundResource6.load(0xF8621E2D); + _soundResource7.load(0xF1A03C2D); + _soundResource8.load(0x70A43D2D); + _soundResource9.load(0xF0601E2D); + } + + startAnimation(kClass490FileHashes[testTubeIndex], 0, -1); + _newStickFrameIndex = 0; + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2808TestTube::handleMessage); + + if (_fillLevel == 0) + setVisible(false); + +} + +uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + fill(); + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene2808TestTube::fill() { + + + if ((int)_fillLevel >= _testTubeSetNum * 3 + 3) + return; + + if (_testTubeSetNum == 0) { + switch (_fillLevel) { + case 0: + _soundResource1.play(); + break; + case 1: + _soundResource2.play(); + break; + case 2: + _soundResource3.play(); + break; + } + setVisible(true); + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]); + _newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1]; + } else { + switch (_fillLevel) { + case 0: + _soundResource4.play(); + break; + case 1: + _soundResource5.play(); + break; + case 2: + _soundResource6.play(); + break; + case 3: + _soundResource7.play(); + break; + case 4: + _soundResource8.play(); + break; + case 5: + _soundResource9.play(); + break; + } + setVisible(true); + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); + _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; + } + _dispenser->startCountdown(_fillLevel); + _fillLevel++; +} + +void AsScene2808TestTube::flush() { + if (_fillLevel != 0) { + if (_testTubeSetNum == 0) { + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], -1); + } else { + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], -1); + } + _newStickFrameIndex = 0; + _playBackwards = true; + setVisible(true); + } +} + +AsScene2808Handle::AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) + : AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false), + _soundResource(vm) { + + _soundResource.load(0xE18D1F30); + _x = 320; + _y = 240; + if (_testTubeSetNum == 1) + setDoDeltaX(1); + createSurface1(0x040900D0, 1300); + startAnimation(0x040900D0, 0, -1); + _needRefresh = true; + _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2808Handle::handleMessage); + AnimatedSprite::updatePosition(); +} + +uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isActivated) { + sendMessage(_parentScene, 0x2001, 0); + _soundResource.play(); + activate(); + } + messageResult = 1; + break; + } + return messageResult; +} + +uint32 AsScene2808Handle::hmActivating(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2808Handle::activate() { + startAnimation(0x040900D0, 0, -1); + SetMessageHandler(&AsScene2808Handle::hmActivating); + NextState(&AsScene2808Handle::stActivated); + _isActivated = true; + _newStickFrameIndex = -1; +} + +void AsScene2808Handle::stActivated() { + stopAnimation(); + sendMessage(_parentScene, 0x2002, 0); +} + +AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), + _soundResource(vm) { + + if (testTubeSetNum == 0) { + _x = 312; + _y = 444; + } else { + _x = 328; + _y = 444; + } + createSurface1(0xB8414818, 1200); + startAnimation(0xB8414818, 0, -1); + setVisible(false); + _newStickFrameIndex = 0; + _needRefresh = true; + _soundResource.load(0x6389B652); + SetUpdateHandler(&AnimatedSprite::update); + AnimatedSprite::updatePosition(); +} + +uint32 AsScene2808Flow::hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2808Flow::start() { + startAnimation(0xB8414818, 0, -1); + setVisible(true); + SetMessageHandler(&AsScene2808Flow::hmFlowing); + NextState(&AsScene2808Flow::stKeepFlowing); + _soundResource.play(); +} + +void AsScene2808Flow::stKeepFlowing() { + startAnimation(0xB8414818, 1, -1); + NextState(&AsScene2808Flow::stKeepFlowing); +} + +AsScene2808LightEffect::AsScene2808LightEffect(NeverhoodEngine *vm, int testTubeSetNum) + : AnimatedSprite(vm, 800), _countdown(1) { + + _x = 320; + _y = 240; + if (testTubeSetNum == 1) + setDoDeltaX(1); + createSurface1(0x804C2404, 800); + SetUpdateHandler(&AsScene2808LightEffect::update); + _needRefresh = true; + AnimatedSprite::updatePosition(); +} + +void AsScene2808LightEffect::update() { + if (_countdown != 0 && (--_countdown) == 0) { + int16 frameIndex = _vm->_rnd->getRandomNumber(3 - 1); + startAnimation(0x804C2404, frameIndex, frameIndex); + updateAnim(); + updatePosition(); + _countdown = _vm->_rnd->getRandomNumber(3 - 1) + 1; + } +} + +Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) { + + Sprite *tempSprite; + + if (which == 0) { + _vm->gameModule()->initScene2808Vars1(); + } else { + _vm->gameModule()->initScene2808Vars2(); + } + + _surfaceFlag = true; + SetMessageHandler(&Scene2808::handleMessage); + SetUpdateHandler(&Scene2808::update); + + setBackground(kScene2808FileHashes1[which]); + setPalette(kScene2808FileHashes1[which]); + + tempSprite = insertSprite(this, which); + _vm->_collisionMan->addSprite(tempSprite); + + _asFlow = insertSprite(this, which); + insertSprite(which); + + for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) { + AsScene2808Dispenser *dispenser = insertSprite(this, which, testTubeIndex); + _vm->_collisionMan->addSprite(dispenser); + _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, dispenser); + _vm->_collisionMan->addSprite(_asTestTubes[testTubeIndex]); + } + + insertMouse433(kScene2808FileHashes2[which]); + +} + +uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO DEBUG Stuff + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) { + leaveScene(1); + } + break; + case 0x000D: + // TODO DEBUG Stuff + break; + case 0x2000: + if (!_isFlowing) + _asTestTubes[param.asInteger()]->fill(); + break; + case 0x2001: + _isFlowing = true; + break; + case 0x2002: + if (isAnyTestTubeFilled()) { + _leaveResult = 3; + if (!isMixtureGood()) + _leaveResult = 2; + _asFlow->start(); + for (int i = 0; i < 3; i++) + _asTestTubes[i]->flush(); + _mouseCursor->setVisible(false); + _countdown = 16; + } else { + leaveScene(1); + } + break; + } + return 0; +} + +void Scene2808::update() { + + // DEBUG: Show correct values + debug("---------------"); + debug("%03d %03d %03d", getSubVar(0x0C601058, 0), getSubVar(0x0C601058, 1), getSubVar(0x0C601058, 2)); + debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); + + Scene::update(); + if (_countdown != 0 && (--_countdown) == 0) { + leaveScene(_leaveResult); + } +} + +bool Scene2808::isMixtureGood() { + if (_testTubeSetNum == 0) { + return + _asTestTubes[0]->getFillLevel() == getSubVar(0x0C601058, 0) && + _asTestTubes[1]->getFillLevel() == getSubVar(0x0C601058, 1) && + _asTestTubes[2]->getFillLevel() == getSubVar(0x0C601058, 2); + } else { + return + _asTestTubes[0]->getFillLevel() == getSubVar(0x40005834, 0) && + _asTestTubes[1]->getFillLevel() == getSubVar(0x40005834, 1) && + _asTestTubes[2]->getFillLevel() == getSubVar(0x40005834, 2); + } +} + +bool Scene2808::isAnyTestTubeFilled() { + return + _asTestTubes[0]->getFillLevel() > 0 || + _asTestTubes[1]->getFillLevel() > 0 || + _asTestTubes[2]->getFillLevel() > 0; +} + + } // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 765873d3c6..ed93c9fe32 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -113,6 +113,91 @@ protected: void findClosestPoint(); }; +class AsScene2808Dispenser : public StaticSprite { +public: + AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex); + void startCountdown(int index); +protected: + Scene *_parentScene; + int _countdown; + int _testTubeSetNum, _testTubeIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808TestTube : public AnimatedSprite { +public: + AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser); + void fill(); + void flush(); + uint32 getFillLevel() const { return _fillLevel; } +protected: + AsScene2808Dispenser *_dispenser; + int _testTubeSetNum; + uint32 _fillLevel; + int _testTubeIndex; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + SoundResource _soundResource5; + SoundResource _soundResource6; + SoundResource _soundResource7; + SoundResource _soundResource8; + SoundResource _soundResource9; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808Handle : public AnimatedSprite { +public: + AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum); + void activate(); + void stActivated(); +protected: + Scene *_parentScene; + int _testTubeSetNum; + bool _isActivated; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmActivating(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808Flow : public AnimatedSprite { +public: + AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum); + void start(); + void stKeepFlowing(); +protected: + Scene *_parentScene; + int _testTubeSetNum; + SoundResource _soundResource; + uint32 hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808LightEffect : public AnimatedSprite { +public: + AsScene2808LightEffect(NeverhoodEngine *vm, int which); +protected: + int _countdown; + void update(); +}; + +class Scene2808 : public Scene { +public: + Scene2808(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _countdown; + int _testTubeSetNum; + AsScene2808Flow *_asFlow; + int _leaveResult; + bool _isFlowing; + AsScene2808TestTube *_asTestTubes[3]; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void update(); + bool isMixtureGood(); + bool isAnyTestTubeFilled(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From 1cb1e66c101612d9400cca090c3fdc2d18dcaf96 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 4 Sep 2012 11:20:06 +0000 Subject: NEVERHOOD: Implement Class488 (renaming TODO) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2800.cpp | 71 +++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2800.h | 15 +++++++++ 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 248c873359..7ea115cfb9 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,7 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 7; + _vm->gameState().sceneNum = 2; createModule(2800, -1); #endif } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 353bb76d73..3a787ee013 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -290,6 +290,75 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +Class488::Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), + _flag1(false), _flag2(false), _soundResource(vm) { + + createSurface(1010, 640, 480); // TODO Use correct size from the two hashes + SetUpdateHandler(&AnimatedSprite::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + _x = x; + _y = y; + sub4343C0(); +} + +uint32 Class488::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (!_flag2 && param.asInteger() == calcHash("ClickSwitch")) { + sendMessage(_parentScene, 0x480F, 0); + _soundResource.play(0x4E1CA4A0); + } + break; + case 0x480F: + sub434380(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 Class488::handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void Class488::sub434380() { + _flag2 = false; + _flag1 = true; + startAnimation(_fileHash2, 0, -1); + SetMessageHandler(&Class488::handleMessage434340); + NextState(&Class488::sub4343C0); +} + +void Class488::sub4343C0() { + _flag1 = false; + startAnimation(_fileHash1, 0, -1); + SetMessageHandler(&Class488::handleMessage); +} + +void Class488::setFileHashes(uint32 fileHash1, uint32 fileHash2) { + _fileHash1 = fileHash1; + _fileHash2 = fileHash2; + if (_flag1) { + startAnimation(_fileHash2, _currFrameIndex, -1); + _flag2 = true; + } else { + startAnimation(_fileHash1, 0, -1); + } +} + Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _palStatus(0) { @@ -307,7 +376,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x81120132); insertMouse433(0x00A05290); - // TODO insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); + insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); if (getGlobalVar(0x190A1D18)) { setBackground(0x412A423E); diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index ed93c9fe32..4026093b1d 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -54,6 +54,21 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Class488 : public AnimatedSprite { +public: + Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); + void sub434380(); + void sub4343C0(); + void setFileHashes(uint32 fileHash1, uint32 fileHash2); +protected: + Scene *_parentScene; + SoundResource _soundResource; + uint32 _fileHash1, _fileHash2; + bool _flag1, _flag2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene2803b : public Scene { public: Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From 5688047fe353276806bc491e324dbb3a9c9df22f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 4 Sep 2012 16:24:20 +0000 Subject: NEVERHOOD: Add tables for Scene2809 --- devtools/create_neverhood/tables.h | 6 ++++++ dists/engine-data/neverhood.dat | Bin 20818 -> 20930 bytes 2 files changed, 6 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index fe6644ef07..1c9c76a68d 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -417,6 +417,12 @@ static const uint32 messageListOffsets[] = { 5, 0x004AF0A0, 1, 0x004AF090, 2, 0x004AF0E0, + // Scene2809 + 1, 0x004B5B90, + 3, 0x004B5BD0, + 5, 0x004B5BA8, + 1, 0x004B5B88, + 2, 0x004B5B98, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 58190d088c..7bc4609aab 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 2aa6e6b89cc968854e84b1e752e36287251b898e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 4 Sep 2012 16:25:47 +0000 Subject: NEVERHOOD: Implement Scene2809 - Fix some setMessageList parameters - Add scene 10 in Module2800 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 164 ++++++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 19 ++++ engines/neverhood/module2800.cpp | 187 ++++++++++++++++++++++++++++++++++++--- engines/neverhood/module2800.h | 31 ++++++- 5 files changed, 388 insertions(+), 15 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7ea115cfb9..384f419243 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,7 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 2; + _vm->gameState().sceneNum = 5; createModule(2800, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 4178bec3a7..de3844e64f 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5514,4 +5514,168 @@ void KmScene2806::sub40F7C0() { startAnimation(0x1C388C04, 0, -1); } +KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount) + : Klayman(vm, parentScene, x, y, 1000, 1000), + _soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) { + + if (flag) { + // TODO Maybe? Don't know. Set Klayman clip rects + _soundRes1.load(0x58E0C341); + _soundRes2.load(0x40A00342); + _soundRes3.load(0xD0A1C348); + _soundRes4.load(0x166FC6E0); + _soundRes5.load(0x00018040); + } + + _dataResource.load(0x1830009A); + +} + +uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4804: + startWalkToX(226, true); + break; + case 0x480D: + GotoState(&Klayman::sub420F60); + break; + case 0x4816: + if (param.asInteger() == 0) { + GotoState(&Klayman::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x4831: + GotoState(&KmScene2809::sub458550); + break; + case 0x4832: + if (param.asInteger() == 1) { + GotoState(&KmScene2809::sub458590); + } else { + GotoState(&Klayman::sub421110); + } + break; + } + return 0; +} + +uint32 KmScene2809::handleMessage457FC0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + if (_flag1) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } else + _flag2 = true; + break; + case 0x100D: + if (param.asInteger() == 0x0002418E) + sendMessage(_parentScene, 0x2000, 0); + else if (param.asInteger() == 0x924090C2) { + _flag1 = true; + if (_flag2) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } + } else if (param.asInteger() == 0x004A2148) + _flag1 = false; + else if (param.asInteger() == 0x02B20220) + _soundResource1.play(0xC5408620); + else if (param.asInteger() == 0x0A720138) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0x03020231) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0xB613A180) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x67221A03) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x038A010B) + _soundResource1.play(0x00018040); + else if (param.asInteger() == 0x422B0280) + _soundResource1.play(0x166FC6E0); + else if (param.asInteger() == 0x925A0C1E) + _soundResource1.play(0x40E5884D); + else if (param.asInteger() == 0x000F0082) + _soundResource1.play(0x546CDCC1); + else if (param.asInteger() == 0x00020814) + _soundResource1.play(0x786CC6D0); + else if (param.asInteger() == 0x06020500) + _soundResource1.play(0x1069C0E1); + else if (param.asInteger() == 0x02128C00) + _soundResource1.play(0x5068C4C3); + else if (param.asInteger() == 0x82022030) + _soundResource1.play(0x5C48C0E8); + break; + } + return messageResult; +} + +uint32 KmScene2809::handleMessage458340(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) + _soundResource1.play(0x405002D8); + else if (param.asInteger() == 0x0A2A9098) + _soundResource1.play(0x0460E2FA); + else if (param.asInteger() == 0xD00A0C0C) + _soundRes1.play(); + else if (param.asInteger() == 0x04121920) + _soundRes2.play(); + else if (param.asInteger() == 0x030B4480) + _soundRes3.play(); + else if (param.asInteger() == 0x422B0280) + _soundRes4.play(); + else if (param.asInteger() == 0x038A010B) + _soundRes5.play(); + else if (param.asInteger() == 0x67221A03) + _soundResource1.play(0x44051000); + else if (param.asInteger() == 0x02B20220) + _soundResource1.play(0xC5408620); + else if (param.asInteger() == 0x925A0C1E) + _soundResource1.play(0x40E5884D); + else if (param.asInteger() == 0x03020231) + _soundResource1.play(0xD4C08010); + else if (param.asInteger() == 0x08040840) + setDoDeltaX(2); + break; + } + return messageResult; +} + +void KmScene2809::sub458550() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2838C010, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene2809::handleMessage458340); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +void KmScene2809::sub458590() { + _status2 = 1; + _acceptInput = false; + _flag1 = false; + _flag2 = false; + startAnimation(0x1C388C04, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene2809::handleMessage457FC0); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 27d92984a2..d508f6cd27 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -612,6 +612,25 @@ protected: void sub40F7C0(); }; +class KmScene2809 : public Klayman { +public: + KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount); +protected: + SoundResource _soundRes1; + SoundResource _soundRes2; + SoundResource _soundRes3; + SoundResource _soundRes4; + SoundResource _soundRes5; + bool _flag1; + bool _flag2; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage457FC0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage458340(int messageNum, const MessageParam ¶m, Entity *sender); + void sub458550(); + void sub458590(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 3a787ee013..0862205437 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -94,6 +94,14 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 0); break; + case 8: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2809(_vm, this, which); + break; + case 10: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2808(_vm, this, 1); + break; case 25: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); if (getGlobalVar(0x190A1D18)) @@ -163,6 +171,16 @@ void Module2800::updateScene() { case 7: createScene(5, _moduleResult); break; + case 8: + if (_moduleResult == 1) { + createScene(10, 0); + } else { + createScene(9, 4); + } + break; + case 10: + createScene(8, _moduleResult); + break; case 25: createScene(2, 5); break; @@ -463,7 +481,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) } else { insertKlayman(135, 444); sub460110(); - setMessageList(0x004B60E0); + setMessageList(0x004B60E0, false); _sprite6->setVisible(true); _sprite7->setVisible(true); } @@ -644,17 +662,17 @@ Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 1) { insertKlayman(493, 338); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004AE1D0); + setMessageList(0x004AE1D0, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { insertKlayman(493, 338); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004AE288); + setMessageList(0x004AE288, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { insertKlayman(493, 338); sendMessage(_klayman, 0x2000, 1); - setMessageList(0x004AE1E0); + setMessageList(0x004AE1E0, false); sendMessage(this, 0x2000, 1); } else { insertKlayman(340, 338); @@ -682,19 +700,19 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -Class469::Class469(NeverhoodEngine *vm) +AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200), _soundResource(vm) { createSurface1(0x04211490, 1200); _x = 378; _y = 423; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class469::handleMessage); + SetMessageHandler(&AsScene2806Spew::handleMessage); setDoDeltaX(1); setVisible(false); } -uint32 Class469::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: @@ -757,7 +775,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x0201410A, 1100); insertStaticSprite(0x72875F42, 1100); - _class469 = insertSprite(); + _asSpew = insertSprite(); _clipRects[2].y1 = 0; _clipRects[3].y2 = 480; @@ -772,10 +790,10 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AF098); } else if (which == 2) { insertKlayman(378, 423, false, _clipRects, 4); - setMessageList(0x004AF0C8); + setMessageList(0x004AF0C8, false); } else if (which == 3) { insertKlayman(378, 423, true, _clipRects, 4); - setMessageList(0x004AF0A0); + setMessageList(0x004AF0A0, false); setGlobalVar(0x1860C990, 0); } else { insertKlayman(670, 423, false, _clipRects, 4); @@ -796,7 +814,7 @@ uint32 Scene2806::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - sendMessage(_class469, 0x2000, 0); + sendMessage(_asSpew, 0x2000, 0); break; } return 0; @@ -1276,5 +1294,152 @@ bool Scene2808::isAnyTestTubeFilled() { _asTestTubes[2]->getFillLevel() > 0; } +AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _soundResource(vm) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2809Spew::handleMessage); + createSurface1(0x04211490, 1200); + _x = 262; + _y = 423; + setDoDeltaX(0); + setVisible(false); +} + +uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + _soundResource.play(0x48640244); + startAnimation(0x04211490, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + _surfaceFlag = true; + SetMessageHandler(&Scene2809::handleMessage); + SetUpdateHandler(&Scene2809::update); + + loadDataResource(0x1830009A); + loadHitRectList(); + + _pointList = _dataResource.getPointArray(0x064A310E); + + setBackground(0xB22116C5); + setPalette(0xB22116C5); + insertMouse433(0x116C1B2A); + + _sprite1 = insertStaticSprite(0x1FA2EB82, 1100); + + _clipRects[0].x1 = _sprite1->getDrawRect().x; + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _clipRects[0].x2 = _sprite1->getDrawRect().x2(); + _clipRects[0].y2 = _sprite1->getDrawRect().y2(); + + _sprite2 = insertStaticSprite(0x037321B2, 1100); + _clipRects[1].y2 = _sprite2->getDrawRect().y2(); + + _sprite3 = insertStaticSprite(0x82022E11, 1100); + + _sprite4 = insertStaticSprite(0x09236252, 1100); + _clipRects[1].x2 = _sprite4->getDrawRect().x2(); + _clipRects[1].y1 = _sprite4->getDrawRect().y; + + tempSprite = insertStaticSprite(0x010C22F2, 1100); + _clipRects[2].x2 = tempSprite->getDrawRect().x2(); + _clipRects[2].y2 = tempSprite->getDrawRect().y2(); + _clipRects[3].y1 = tempSprite->getDrawRect().y2(); + _clipRects[1].x1 = tempSprite->getDrawRect().x2(); + + tempSprite = insertStaticSprite(0x877F6252, 1100); + _clipRects[3].x2 = tempSprite->getDrawRect().x2(); + + insertStaticSprite(0x01612A22, 1100); + insertStaticSprite(0x877F6252, 1100); + + _asSpew = insertSprite(); + _clipRects[2].y1 = 0; + _clipRects[3].y2 = 480; + _clipRects[2].x1 = 0; + _clipRects[3].x1 = 0; + + if (which < 0) { + insertKlayman(226, 423, false, _clipRects, 4); + setMessageList(0x004B5B90); + } else if (which == 1) { + insertKlayman(262, 423, false, _clipRects, 4); + setMessageList(0x004B5B90); + } else if (which == 2) { + insertKlayman(262, 423, false, _clipRects, 4); + setMessageList(0x004B5BD0); + } else if (which == 3) { + insertKlayman(262, 423, true, _clipRects, 4); + setMessageList(0x004B5BA8, false); + setGlobalVar(0x1860C990, 0); + } else { + insertKlayman(-30, 423, false, _clipRects, 4); + setMessageList(0x004B5B88); + } + + _pointIndex = -1; + findClosestPoint(); + +} + +void Scene2809::update() { + Scene::update(); + findClosestPoint(); +} + +uint32 Scene2809::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x160DA937) { + setMessageList(0x004B5B98); + } + break; + case 0x2000: + sendMessage(_asSpew, 0x2000, 0); + break; + } + return 0; +} + +void Scene2809::findClosestPoint() { + + static const uint32 kScene2809PaletteFileHashes[] = { + 0x04260848, + 0x12970401, + 0x128F0401, + 0x12830401, + 0x12850401, + 0x6A8B9008 + }; + + int16 x = MAX(_klayman->getX(), 2); + int index = 1; + + while (index < (int)_pointList->size() && (*_pointList)[index].x >= x) + ++index; + --index; + + if (_pointIndex != index) { + _pointIndex = index; + _palette->addPalette(kScene2809PaletteFileHashes[index], 0, 64, 0); + } + +} } // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 4026093b1d..404f9ace1a 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -102,9 +102,9 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class469 : public AnimatedSprite { +class AsScene2806Spew : public AnimatedSprite { public: - Class469(NeverhoodEngine *vm); + AsScene2806Spew(NeverhoodEngine *vm); protected: SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -122,7 +122,7 @@ protected: Sprite *_sprite2; Sprite *_sprite3; Sprite *_sprite4; - Sprite *_class469; + Sprite *_asSpew; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void update(); void findClosestPoint(); @@ -213,6 +213,31 @@ protected: bool isAnyTestTubeFilled(); }; +class AsScene2809Spew : public AnimatedSprite { +public: + AsScene2809Spew(NeverhoodEngine *vm); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2809 : public Scene { +public: + Scene2809(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + NPointArray *_pointList; + int _pointIndex; + NRect _clipRects[4]; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_asSpew; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void findClosestPoint(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From 4f1e8b2070a64ff1f03b01fcdfea2229244f1bb1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 5 Sep 2012 17:19:11 +0000 Subject: NEVERHOOD: Implement Scene2804 - Fix dispenser in Scene2808 (wasn't clickable) - Add Palette::fillBaseWhite - Minor renaming in Module2800 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2800.cpp | 637 +++++++++++++++++++++++++++++++++++++-- engines/neverhood/module2800.h | 131 +++++++- engines/neverhood/palette.cpp | 11 + engines/neverhood/palette.h | 1 + 5 files changed, 757 insertions(+), 25 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 384f419243..813222ccf1 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,7 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 3; createModule(2800, -1); #endif } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 0862205437..4757b4fcc5 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -82,6 +82,9 @@ void Module2800::createScene(int sceneNum, int which) { // TODO _childObject = new Scene2803(_vm, this, which); } break; + case 3: + _childObject = new Scene2804(_vm, this, which); + break; case 4: // TODO Music18hList_stop(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); @@ -154,6 +157,9 @@ void Module2800::updateScene() { else createScene(0, 1); break; + case 3: + createScene(2, 1); + break; case 4: if (_moduleResult == 1) { leaveModule(1); @@ -641,6 +647,601 @@ void Scene2803b::sub4601F0(bool flag) { } } +SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) + : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), + _soundResource(vm) { + + if (getGlobalVar(0x190A1D18)) + _spriteResource.load2(0x51A10202); + else + _spriteResource.load2(0x11814A21); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _deltaRect = _drawRect; + processDelta(); + setVisible(false); + _needRefresh = true; + SetUpdateHandler(&SsScene2804RedButton::update); + SetMessageHandler(&SsScene2804RedButton::handleMessage); + _soundResource.load(0x44241240); +} + +void SsScene2804RedButton::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + } +} + +uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_parentScene->isWorking()) { + _soundResource.play(); + setVisible(true); + _countdown = 4; + sendMessage(_parentScene, 0x2000, 0); + } + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2808LightCoil::SsScene2808LightCoil(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + _spriteResource.load2(0x8889B008); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + setVisible(false); + _needRefresh = true; + StaticSprite::update(); + SetMessageHandler(&SsScene2808LightCoil::handleMessage); +} + +uint32 SsScene2808LightCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + setVisible(true); + StaticSprite::update(); + messageResult = 1; + break; + case 0x2003: + setVisible(false); + StaticSprite::update(); + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2808LightTarget::SsScene2808LightTarget(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + _spriteResource.load2(0x06092132); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + setVisible(false); + _needRefresh = true; + StaticSprite::update(); + SetMessageHandler(&SsScene2808LightTarget::handleMessage); +} + +uint32 SsScene2808LightTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + setVisible(true); + StaticSprite::update(); + messageResult = 1; + break; + case 0x2005: + setVisible(false); + StaticSprite::update(); + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2808Flash::SsScene2808Flash(NeverhoodEngine *vm) + : StaticSprite(vm, 900), _soundResource(vm) { + + _spriteResource.load2(0x211003A0); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + setVisible(false); + _needRefresh = true; + StaticSprite::update(); + _soundResource.load(0xCB36BA54); +} + +void SsScene2808Flash::show() { + setVisible(true); + StaticSprite::update(); + _soundResource.play(); +} + +SsScene2808BeamCoilBody::SsScene2808BeamCoilBody(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + _spriteResource.load2(0x9A816000); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + setVisible(false); + _needRefresh = true; + StaticSprite::update(); +} + +AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex) + : AnimatedSprite(vm, 1100), _crystalIndex(crystalIndex) { + + static const NPoint kAsScene2804CrystalWavesPoints[] = { + {323, 245}, + {387, 76}, + {454, 260}, + {527, 70} + }; + + _x = kAsScene2804CrystalWavesPoints[crystalIndex].x; + _y = kAsScene2804CrystalWavesPoints[crystalIndex].y; + createSurface1(0x840C41F0, 1200); + if (crystalIndex & 1) + setDoDeltaX(1); + setVisible(false); + _needRefresh = true; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Sprite::handleMessage); +} + +void AsScene2804CrystalWaves::show() { + setVisible(true); + startAnimation(0x840C41F0, 0, -1); +} + +void AsScene2804CrystalWaves::hide() { + setVisible(false); + stopAnimation(); +} + +static const int16 kAsScene2804CrystalFrameNums[] = { + 0, 6, 2, 8, 1, 10, 0, 0 +}; + +static const uint32 kAsScene2804CrystalFileHashes[] = { + 0x000540B0, + 0x001280D0, + 0x003D0010, + 0x00620190, + 0x00DC0290 +}; + +AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex) + : AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex), + _isShowing(false), _soundResource(vm) { + + static const NPoint kAsScene2804CrystalPoints[] = { + {204, 196}, + {272, 316}, + {334, 206}, + {410, 334}, + {470, 180} + }; + + _colorNum = (int16)getSubVar(0xE11A1929, crystalIndex); + _isLightOn = getGlobalVar(0x190A1D18) != 0; + if (_isLightOn) { + _x = kAsScene2804CrystalPoints[crystalIndex].x; + _y = kAsScene2804CrystalPoints[crystalIndex].y; + createSurface1(0x108DFB12, 1200); + startAnimation(0x108DFB12, kAsScene2804CrystalFrameNums[_colorNum], -1); + _needRefresh = true; + _newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum]; + } else { + _x = 320; + _y = 240; + createSurface1(kAsScene2804CrystalFileHashes[crystalIndex], 1200); + startAnimation(kAsScene2804CrystalFileHashes[crystalIndex], _colorNum, -1); + setVisible(false); + _needRefresh = true; + _newStickFrameIndex = _colorNum; + } + _soundResource.load(0x725294D4); + SetUpdateHandler(&AnimatedSprite::update); +} + +void AsScene2804Crystal::show() { + if (!_isLightOn) { + setVisible(true); + _isShowing = true; + if (_asCrystalWaves) + _asCrystalWaves->show(); + _soundResource.play(); + } +} + +void AsScene2804Crystal::hide() { + if (!_isLightOn) { + setVisible(false); + _isShowing = false; + if (_asCrystalWaves) + _asCrystalWaves->hide(); + } +} + +void AsScene2804Crystal::activate() { + if (!_isShowing) { + int16 frameNum = kAsScene2804CrystalFrameNums[_colorNum]; + _colorNum++; + if (_colorNum >= 6) + _colorNum = 0; + if (_isLightOn) { + startAnimation(0x108DFB12, frameNum, kAsScene2804CrystalFrameNums[_colorNum]); + _playBackwards = kAsScene2804CrystalFrameNums[_colorNum] < _colorNum; + _newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum]; + } else { + startAnimation(kAsScene2804CrystalFileHashes[_crystalIndex], _colorNum, -1); + _newStickFrameIndex = _colorNum; + } + setSubVar(0xE11A1929, _crystalIndex, _colorNum); + } +} + +SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex) + : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal), + _crystalIndex(crystalIndex), _soundResource(vm) { + + static const uint32 kSsScene2804CrystalButtonFileHashes1[] = { + 0x911101B0, + 0x22226001, + 0x4444A362, + 0x888925A4, + 0x11122829 + }; + + static const uint32 kSsScene2804CrystalButtonFileHashes2[] = { + 0xB500A1A0, + 0x6A012021, + 0xD4022322, + 0xA8042525, + 0x5008292B + }; + + if (getGlobalVar(0x190A1D18)) + _spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]); + else + _spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]); + + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _deltaRect = _drawRect; + processDelta(); + setVisible(false); + _soundResource.load(0x44045140); + _needRefresh = true; + SetUpdateHandler(&SsScene2804CrystalButton::update); + SetMessageHandler(&SsScene2804CrystalButton::handleMessage); +} + +void SsScene2804CrystalButton::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + } +} + +uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_parentScene->isWorking()) { + _soundResource.play(); + setVisible(true); + _countdown = 4; + _asCrystal->activate(); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody) + : AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), + _countdown(0), _soundResource(vm) { + + createSurface1(0x00494891, 1000); + _x = 125; + _y = 184; + setVisible(false); + _needRefresh = true; + AnimatedSprite::updatePosition(); + _soundResource.load(0x6352F051); + // TODO Sound1ChList_addSoundResource(0xC5EA0B28, 0xEF56B094, true); + SetUpdateHandler(&AsScene2804BeamCoil::update); + SetMessageHandler(&AsScene2804BeamCoil::handleMessage); +} + +void AsScene2804BeamCoil::update() { + updateAnim(); + updatePosition(); + if (_countdown != 0 && (--_countdown) == 0) { + sendMessage(_parentScene, 0x2001, 0); + } +} + +uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + show(); + _countdown = 92; + messageResult = 1; + break; + case 0x2003: + hide(); + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene2804BeamCoil::show() { + _ssBeamCoilBody->setVisible(true); + // TODO _ssBeamCoilBody->update(); -> show() + setVisible(true); + startAnimation(0x00494891, 0, -1); + _soundResource.play(); + SetMessageHandler(&AsScene2804BeamCoil::hmBeaming); + NextState(&AsScene2804BeamCoil::stBeaming); +} + +void AsScene2804BeamCoil::hide() { + stopAnimation(); + SetMessageHandler(&AsScene2804BeamCoil::handleMessage); + setVisible(false); + _ssBeamCoilBody->setVisible(false); + // TODO _ssBeamCoilBody->update(); -> hide() + // TODO Sound1ChList_stop(0xEF56B094); +} + +void AsScene2804BeamCoil::stBeaming() { + startAnimation(0x00494891, 93, -1); + NextState(&AsScene2804BeamCoil::stBeaming); + // TODO Sound1ChList_playLooping(0xEF56B094); +} + +uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +AsScene2804BeamTarget::AsScene2804BeamTarget(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1400) { + + createSurface1(0x03842000, 1000); + _x = 475; + _y = 278; + setVisible(false); + _needRefresh = true; + updatePosition(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2804BeamTarget::handleMessage); +} + +uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + setVisible(true); + startAnimation(0x03842000, 0, -1); + messageResult = 1; + break; + case 0x2005: + setVisible(false); + stopAnimation(); + messageResult = 1; + break; + } + return messageResult; +} + +Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _countdown3(0), + _beamStatus(0), _isSolved(false), _isWorking(false) { + + initCrystalColors(); + + _surfaceFlag = true; + SetMessageHandler(&Scene2804::handleMessage); + SetUpdateHandler(&Scene2804::update); + + //setGlobalVar(0x190A1D18, 1); // DEBUG Set lights on + + if (getGlobalVar(0x190A1D18)) { + setBackground(0xA1D03005); + setPalette(0xA1D03005); + addEntity(_palette); + insertMouse435(0x03001A15, 20, 620); + _asCoil = insertSprite(); + _asTarget = insertSprite(); + } else { + SsScene2808BeamCoilBody *ssBeamCoilBody; + setBackground(0x01C01414); + setPalette(0x01C01414); + addEntity(_palette); + insertMouse435(0x01410014, 20, 620); + ssBeamCoilBody = insertSprite(); + _asCoil = insertSprite(this, ssBeamCoilBody); + _asTarget = insertSprite(); + _ssFlash = insertSprite(); + } + + _ssRedButton = insertSprite(this); + _vm->_collisionMan->addSprite(_ssRedButton); + + for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) { + AsScene2804CrystalWaves *asCrystalWaves = NULL; + if (crystalIndex < 4 && getGlobalVar(0x190A1D18) == 0) + asCrystalWaves = insertSprite(crystalIndex); + _asCrystals[crystalIndex] = insertSprite(asCrystalWaves, crystalIndex); + _ssCrystalButtons[crystalIndex] = insertSprite(this, _asCrystals[crystalIndex], crystalIndex); + _vm->_collisionMan->addSprite(_ssCrystalButtons[crystalIndex]); + } + +} + +uint32 Scene2804::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + // TODO DEBUG + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } + break; + case 0x000D: + // TODO DEBUG + break; + case 0x2000: + _isWorking = true; + sendMessage(_asCoil, 0x2002, 0); + if (getGlobalVar(0x190A1D18)) { + sendMessage(_asTarget, 0x2004, 0); + _countdown2 = 48; + } + break; + case 0x2001: + _countdown3 = 2; + _isSolved = true; + _beamStatus = 0; + for (uint index = 0; index < 5; index++) + if (_asCrystals[index]->getColorNum() != (int16)getSubVar(0xD4B2089C, index)) + _isSolved = false; + _countdown2 = 48; + break; + } + return 0; +} + +void Scene2804::update() { + + Scene::update(); + + if (_countdown1 != 0 && (--_countdown1) == 0) { + leaveScene(0); + } + + if (_countdown2 != 0 && (--_countdown2) == 0) { + _isWorking = false; + sendMessage(_asCoil, 0x2003, 0); + sendMessage(_asTarget, 0x2005, 0); + for (uint index = 0; index < 5; index++) + _asCrystals[index]->hide(); + } + + if (_countdown3 != 0 && (--_countdown3) == 0) { + if (_beamStatus == 5) { + sendMessage(_asTarget, 0x2004, 0); + if (_isSolved) { + _palette->fillBaseWhite(0, 256); + _palette->startFadeToPalette(18); + setGlobalVar(0x1860C990, 1); + _countdown1 = 48; + } + } else if (_beamStatus == 6) { + if (_isSolved) + _ssFlash->show(); + } else { + _asCrystals[_beamStatus]->show(); + } + _beamStatus++; + if (_beamStatus < 6) + _countdown3 = 2; + else if (_beamStatus < 7) + _countdown3 = 4; + } + +} + +void Scene2804::initCrystalColors() { + // TODO Maybe move this into the GameModule so all puzzle init code is together + if (getGlobalVar(0xDE2EC914) == 0) { + TextResource textResource(_vm); + const char *textStart, *textEnd; + textResource.load(0x46691611); + textStart = textResource.getString(0, textEnd); + for (uint index = 0; index < 5; index++) { + char colorLetter = (byte)textStart[index]; + byte correctColorNum = 0, misalignedColorNum; + switch (colorLetter) { + case 'B': + correctColorNum = 4; + break; + case 'G': + correctColorNum = 3; + break; + case 'O': + correctColorNum = 1; + break; + case 'R': + correctColorNum = 0; + break; + case 'V': + correctColorNum = 5; + break; + case 'Y': + correctColorNum = 2; + break; + } + do { + misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1); + } while (misalignedColorNum == correctColorNum); + setSubVar(0xD4B2089C, index, correctColorNum); + setSubVar(0xE11A1929, index, misalignedColorNum); + } + setGlobalVar(0xDE2EC914, 1); + } +} + Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -897,39 +1498,35 @@ static const int16 kClass490FrameIndices2[] = { 0, 4, 8, 11, 15, 17, 19, 0 }; -AsScene2808Dispenser::AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex) +SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex) : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex) { _spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]); createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _deltaRect = _drawRect; processDelta(); - - SetUpdateHandler(&AsScene2808Dispenser::update); - SetMessageHandler(&AsScene2808Dispenser::handleMessage); - + SetUpdateHandler(&SsScene2808Dispenser::update); + SetMessageHandler(&SsScene2808Dispenser::handleMessage); setVisible(false); _needRefresh = true; StaticSprite::update(); - } -void AsScene2808Dispenser::update() { +void SsScene2808Dispenser::update() { StaticSprite::update(); if (_countdown != 0 && (--_countdown) == 0) { setVisible(false); } } -uint32 AsScene2808Dispenser::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -940,7 +1537,7 @@ uint32 AsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &p return messageResult; } -void AsScene2808Dispenser::startCountdown(int index) { +void SsScene2808Dispenser::startCountdown(int index) { setVisible(true); StaticSprite::update(); if (_testTubeSetNum == 0) { @@ -950,8 +1547,8 @@ void AsScene2808Dispenser::startCountdown(int index) { } } -AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser) - : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _dispenser(dispenser), +AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser) + : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _soundResource5(vm), _soundResource6(vm), _soundResource7(vm), _soundResource8(vm), _soundResource9(vm), _fillLevel(0) { @@ -1048,7 +1645,7 @@ void AsScene2808TestTube::fill() { startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; } - _dispenser->startCountdown(_fillLevel); + _ssDispenser->startCountdown(_fillLevel); _fillLevel++; } @@ -1213,9 +1810,9 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) insertSprite(which); for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) { - AsScene2808Dispenser *dispenser = insertSprite(this, which, testTubeIndex); - _vm->_collisionMan->addSprite(dispenser); - _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, dispenser); + SsScene2808Dispenser *ssDispenser = insertSprite(this, which, testTubeIndex); + _vm->_collisionMan->addSprite(ssDispenser); + _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, ssDispenser); _vm->_collisionMan->addSprite(_asTestTubes[testTubeIndex]); } diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 404f9ace1a..03e272fa98 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -93,6 +93,129 @@ protected: void sub4601F0(bool flag); }; +class Scene2804; + +class SsScene2804RedButton : public StaticSprite { +public: + SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene); +protected: + SoundResource _soundResource; + Scene2804 *_parentScene; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2808LightCoil : public StaticSprite { +public: + SsScene2808LightCoil(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2808BeamCoilBody : public StaticSprite { +public: + SsScene2808BeamCoilBody(NeverhoodEngine *vm); +}; + +class SsScene2808LightTarget : public StaticSprite { +public: + SsScene2808LightTarget(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2808Flash : public StaticSprite { +public: + SsScene2808Flash(NeverhoodEngine *vm); + void show(); +protected: + SoundResource _soundResource; +}; + +class AsScene2804CrystalWaves : public AnimatedSprite { +public: + AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex); + void show(); + void hide(); +protected: + uint _crystalIndex; +}; + +class AsScene2804Crystal : public AnimatedSprite { +public: + AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex); + void show(); + void hide(); + void activate(); + int16 getColorNum() const { return _colorNum; } +protected: + AsScene2804CrystalWaves *_asCrystalWaves; + uint _crystalIndex; + int16 _colorNum; + bool _isLightOn; + bool _isShowing; + SoundResource _soundResource; +}; + +class SsScene2804CrystalButton : public StaticSprite { +public: + SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex); +protected: + SoundResource _soundResource; + Scene2804 *_parentScene; + AsScene2804Crystal *_asCrystal; + uint _crystalIndex; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2804BeamCoil : public AnimatedSprite { +public: + AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody); +protected: + SoundResource _soundResource; + Scene *_parentScene; + SsScene2808BeamCoilBody *_ssBeamCoilBody; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void show(); + void hide(); + void stBeaming(); + uint32 hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2804BeamTarget : public AnimatedSprite { +public: + AsScene2804BeamTarget(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2804 : public Scene { +public: + Scene2804(NeverhoodEngine *vm, Module *parentModule, int which); + bool isWorking() const { return _isWorking; } +protected: + int _countdown1; + int _countdown2; + int _countdown3; + int _beamStatus; + bool _isSolved; + bool _isWorking; + Sprite *_ssRedButton; + Sprite *_asCoil; + Sprite *_asTarget; + SsScene2808Flash *_ssFlash; + AsScene2804Crystal *_asCrystals[5]; + Sprite *_ssCrystalButtons[5]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void initCrystalColors(); +}; + class Scene2805 : public Scene { public: Scene2805(NeverhoodEngine *vm, Module *parentModule, int which); @@ -128,9 +251,9 @@ protected: void findClosestPoint(); }; -class AsScene2808Dispenser : public StaticSprite { +class SsScene2808Dispenser : public StaticSprite { public: - AsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex); + SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex); void startCountdown(int index); protected: Scene *_parentScene; @@ -142,12 +265,12 @@ protected: class AsScene2808TestTube : public AnimatedSprite { public: - AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, AsScene2808Dispenser *dispenser); + AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser); void fill(); void flush(); uint32 getFillLevel() const { return _fillLevel; } protected: - AsScene2808Dispenser *_dispenser; + SsScene2808Dispenser *_ssDispenser; int _testTubeSetNum; uint32 _fillLevel; int _testTubeIndex; diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index 936ca39ac6..c27bd867bc 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -139,6 +139,17 @@ void Palette::startFadeToPalette(int counter) { _status = 2; } +void Palette::fillBaseWhite(int index, int count) { + if (index + count > 256) + count = 256 - index; + for (int i = 0; i < count; i++) { + _basePalette[(i + index) * 4 + 0] = 0xFF; + _basePalette[(i + index) * 4 + 1] = 0xFF; + _basePalette[(i + index) * 4 + 2] = 0xFF; + _basePalette[(i + index) * 4 + 3] = 0; + } +} + void Palette::update() { debug(2, "Palette::update() _status = %d", _status); if (_status == 1) { diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 79660130e1..27f4816bb0 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -49,6 +49,7 @@ public: void startFadeToBlack(int counter); void startFadeToWhite(int counter); void startFadeToPalette(int counter); + void fillBaseWhite(int index, int count); protected: int _status; byte *_palette; -- cgit v1.2.3 From 0962c594bd7edb2d232cdd9ff1f10c23f5c6944a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 5 Sep 2012 17:25:36 +0000 Subject: NEVERHOOD: Rename wrongly named stuff --- engines/neverhood/module2800.cpp | 30 +++++++++++++++--------------- engines/neverhood/module2800.h | 22 +++++++++++----------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 4757b4fcc5..9cdc94283d 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -694,7 +694,7 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p return messageResult; } -SsScene2808LightCoil::SsScene2808LightCoil(NeverhoodEngine *vm) +SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm) : StaticSprite(vm, 900) { _spriteResource.load2(0x8889B008); @@ -708,10 +708,10 @@ SsScene2808LightCoil::SsScene2808LightCoil(NeverhoodEngine *vm) setVisible(false); _needRefresh = true; StaticSprite::update(); - SetMessageHandler(&SsScene2808LightCoil::handleMessage); + SetMessageHandler(&SsScene2804LightCoil::handleMessage); } -uint32 SsScene2808LightCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2002: @@ -728,7 +728,7 @@ uint32 SsScene2808LightCoil::handleMessage(int messageNum, const MessageParam &p return messageResult; } -SsScene2808LightTarget::SsScene2808LightTarget(NeverhoodEngine *vm) +SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm) : StaticSprite(vm, 900) { _spriteResource.load2(0x06092132); @@ -742,10 +742,10 @@ SsScene2808LightTarget::SsScene2808LightTarget(NeverhoodEngine *vm) setVisible(false); _needRefresh = true; StaticSprite::update(); - SetMessageHandler(&SsScene2808LightTarget::handleMessage); + SetMessageHandler(&SsScene2804LightTarget::handleMessage); } -uint32 SsScene2808LightTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2004: @@ -762,7 +762,7 @@ uint32 SsScene2808LightTarget::handleMessage(int messageNum, const MessageParam return messageResult; } -SsScene2808Flash::SsScene2808Flash(NeverhoodEngine *vm) +SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) : StaticSprite(vm, 900), _soundResource(vm) { _spriteResource.load2(0x211003A0); @@ -779,13 +779,13 @@ SsScene2808Flash::SsScene2808Flash(NeverhoodEngine *vm) _soundResource.load(0xCB36BA54); } -void SsScene2808Flash::show() { +void SsScene2804Flash::show() { setVisible(true); StaticSprite::update(); _soundResource.play(); } -SsScene2808BeamCoilBody::SsScene2808BeamCoilBody(NeverhoodEngine *vm) +SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) : StaticSprite(vm, 900) { _spriteResource.load2(0x9A816000); @@ -979,7 +979,7 @@ uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessagePara return messageResult; } -AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody) +AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody) : AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), _countdown(0), _soundResource(vm) { @@ -1101,18 +1101,18 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0xA1D03005); addEntity(_palette); insertMouse435(0x03001A15, 20, 620); - _asCoil = insertSprite(); - _asTarget = insertSprite(); + _asCoil = insertSprite(); + _asTarget = insertSprite(); } else { - SsScene2808BeamCoilBody *ssBeamCoilBody; + SsScene2804BeamCoilBody *ssBeamCoilBody; setBackground(0x01C01414); setPalette(0x01C01414); addEntity(_palette); insertMouse435(0x01410014, 20, 620); - ssBeamCoilBody = insertSprite(); + ssBeamCoilBody = insertSprite(); _asCoil = insertSprite(this, ssBeamCoilBody); _asTarget = insertSprite(); - _ssFlash = insertSprite(); + _ssFlash = insertSprite(); } _ssRedButton = insertSprite(this); diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 03e272fa98..20bc4b4f74 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -106,28 +106,28 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class SsScene2808LightCoil : public StaticSprite { +class SsScene2804LightCoil : public StaticSprite { public: - SsScene2808LightCoil(NeverhoodEngine *vm); + SsScene2804LightCoil(NeverhoodEngine *vm); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class SsScene2808BeamCoilBody : public StaticSprite { +class SsScene2804BeamCoilBody : public StaticSprite { public: - SsScene2808BeamCoilBody(NeverhoodEngine *vm); + SsScene2804BeamCoilBody(NeverhoodEngine *vm); }; -class SsScene2808LightTarget : public StaticSprite { +class SsScene2804LightTarget : public StaticSprite { public: - SsScene2808LightTarget(NeverhoodEngine *vm); + SsScene2804LightTarget(NeverhoodEngine *vm); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class SsScene2808Flash : public StaticSprite { +class SsScene2804Flash : public StaticSprite { public: - SsScene2808Flash(NeverhoodEngine *vm); + SsScene2804Flash(NeverhoodEngine *vm); void show(); protected: SoundResource _soundResource; @@ -173,11 +173,11 @@ protected: class AsScene2804BeamCoil : public AnimatedSprite { public: - AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2808BeamCoilBody *ssBeamCoilBody); + AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody); protected: SoundResource _soundResource; Scene *_parentScene; - SsScene2808BeamCoilBody *_ssBeamCoilBody; + SsScene2804BeamCoilBody *_ssBeamCoilBody; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -208,7 +208,7 @@ protected: Sprite *_ssRedButton; Sprite *_asCoil; Sprite *_asTarget; - SsScene2808Flash *_ssFlash; + SsScene2804Flash *_ssFlash; AsScene2804Crystal *_asCrystals[5]; Sprite *_ssCrystalButtons[5]; void update(); -- cgit v1.2.3 From 6f003399c85a38245b1e9f376f94625fad1ca581 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 5 Sep 2012 17:46:09 +0000 Subject: NEVERHOOD: Implement Scene2807 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2800.cpp | 56 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2800.h | 7 +++++ 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 813222ccf1..18d7881199 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,7 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 3; + _vm->gameState().sceneNum = 6; createModule(2800, -1); #endif } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 9cdc94283d..73675303c8 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -93,6 +93,10 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2806(_vm, this, which); break; + case 6: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2807(_vm, this, which); + break; case 7: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 0); @@ -174,6 +178,9 @@ void Module2800::updateScene() { createScene(2, 2); } break; + case 6: + createScene(2, 3); + break; case 7: createScene(5, _moduleResult); break; @@ -1451,6 +1458,55 @@ void Scene2806::findClosestPoint() { } +Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _surfaceFlag = true; + SetMessageHandler(&Scene2807::handleMessage); + + if (getSubVar(0x0C601058, 0) == 1) { + insertStaticSprite(0x103021E2, 300); + } else if (getSubVar(0x0C601058, 0) == 2) { + insertStaticSprite(0x103022E2, 300); + } else if (getSubVar(0x0C601058, 0) == 3) { + insertStaticSprite(0x103024E2, 300); + } + + if (getSubVar(0x0C601058, 1) == 1) { + insertStaticSprite(0x4800A52A, 200); + } else if (getSubVar(0x0C601058, 1) == 2) { + insertStaticSprite(0x4800A62A, 200); + } else if (getSubVar(0x0C601058, 1) == 3) { + insertStaticSprite(0x4800A02A, 200); + } + + if (getSubVar(0x0C601058, 2) == 1) { + insertStaticSprite(0x31203430, 100); + } else if (getSubVar(0x0C601058, 2) == 2) { + insertStaticSprite(0x31203400, 100); + } else if (getSubVar(0x0C601058, 2) == 3) { + insertStaticSprite(0x31203460, 100); + } + + _surfaceFlag = true; + setBackground(0x3E049A95); + setPalette(0x3E049A95); + insertMouse435(0x49A913E8, 20, 620); + +} + +uint32 Scene2807::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } + break; + } + return 0; +} + static const uint32 kScene2808FileHashes1[] = { 0x90B0392, 0x90B0192 diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 20bc4b4f74..720f01112e 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -251,6 +251,13 @@ protected: void findClosestPoint(); }; +class Scene2807 : public Scene { +public: + Scene2807(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class SsScene2808Dispenser : public StaticSprite { public: SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex); -- cgit v1.2.3 From 745e46279ec4b3ccacd996d73a9df9dc19271e75 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 6 Sep 2012 12:08:57 +0000 Subject: NEVERHOOD: Add tables for Scene2810 --- devtools/create_neverhood/tables.h | 27 +++++++++++++++++++++++++++ dists/engine-data/neverhood.dat | Bin 20930 -> 21950 bytes 2 files changed, 27 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 1c9c76a68d..a458dedb00 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -119,6 +119,9 @@ static const uint32 rectListOffsets[] = { // Scene2805 1, 0x004AE318, 1, 0x004AE308, + // Scene2810 + 1, 0x004AE810, + 1, 0x004AE800, 0, 0 }; @@ -423,6 +426,30 @@ static const uint32 messageListOffsets[] = { 5, 0x004B5BA8, 1, 0x004B5B88, 2, 0x004B5B98, + 1, 0x004AE438, + 3, 0x004AE440, + 3, 0x004AE738, + 1, 0x004AE6D8, + 2, 0x004AE6E8, + 1, 0x004AE6E0, + 2, 0x004AE428, + 2, 0x004AE418, + 1, 0x004AE410, + 4, 0x004AE458, + 5, 0x004AE4A8, + 5, 0x004AE4D0, + 5, 0x004AE4F8, + 5, 0x004AE520, + 5, 0x004AE548, + 5, 0x004AE570, + 5, 0x004AE598, + 5, 0x004AE5C0, + 5, 0x004AE5E8, + 5, 0x004AE610, + 5, 0x004AE638, + 5, 0x004AE660, + 5, 0x004AE688, + 2, 0x004AE750, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 7bc4609aab..f47b01d5df 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 99ebd0eca3b7b5ac808a43c356a47f37ebe0cadc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 6 Sep 2012 12:25:04 +0000 Subject: NEVERHOOD: Implement Scene2810 - Also add globalvars.txt, a (currently almost empty) list of global game variables with descriptions --- engines/neverhood/gamemodule.cpp | 3 +- engines/neverhood/klayman.cpp | 213 ++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 24 ++++ engines/neverhood/module2800.cpp | 295 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2800.h | 26 ++++ 5 files changed, 557 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 18d7881199..294442804d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,7 +328,8 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 6; + _vm->gameState().which = 11; + _vm->gameState().sceneNum = 9; createModule(2800, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index de3844e64f..5ca535460d 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2200,6 +2200,72 @@ void Klayman::walkAlongPathPoints() { } } +void Klayman::sub4204C0() { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0x00AB8C10, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::spriteUpdate41F920); + SetMessageHandler(&Klayman::handleMessage41E5F0); +} + +void Klayman::spriteUpdate41F920() { + updateDeltaXY(); + if (_y >= _destY) { + _y = _destY; + processDelta(); + gotoNextStateExt(); + } +} + +uint32 Klayman::handleMessage41E5F0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D360(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) + sendMessage(_attachedSprite, 0x4806, 0); + else if (param.asInteger() == 0x320AC306) + startAnimationByHash(0x00AB8C10, 0x01084280, 0); + else if (param.asInteger() == 0x4AB28209) + sendMessage(_attachedSprite, 0x482A, 0); + else if (param.asInteger() == 0x88001184) + sendMessage(_attachedSprite, 0x482B, 0); + break; + } + return messageResult; +} + +void Klayman::sub421230() { + _status2 = 2; + _acceptInput = false; + startAnimationByHash(0x38445000, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::handleMessage41F1D0); +} + +uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040C4C01) + _soundResource1.play(0x01E11140); + break; + } + return messageResult; +} + +void Klayman::sub421270() { + if (!stStartAction(AnimationCallback(&Klayman::sub421270))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x1B3D8216, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmTurnToUse); + SetSpriteUpdate(&Klayman::spriteUpdate41F230); + } +} + //############################################################################## // KmScene1001 @@ -5678,4 +5744,151 @@ void KmScene2809::sub458590() { SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } + +KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + sub41CDE0(param.asPoint().x); + break; + case 0x4004: + GotoState(&Klayman::sub421640); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + sub41CDE0(_dataResource.getPoint(param.asInteger()).x); + break; + case 0x481F: + if (param.asInteger() == 1) + GotoState(&Klayman::sub421740); + else if (param.asInteger() == 0) + GotoState(&Klayman::sub421780); + else + GotoState(&Klayman::sub421700); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klayman::sub421840); + } else { + GotoState(&Klayman::sub4217C0); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klayman::sub421900); + } else { + GotoState(&Klayman::sub421880); + } + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + +KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + NRect *clipRects, uint clipRectsCount) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // TODO ClipRects stuff + +} + +uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4803: + _destY = param.asInteger(); + GotoState(&Klayman::sub4204C0); + break; + case 0x4804: + if (param.asInteger() == 3) + GotoState(&Klayman::sub421230); + break; + case 0x4812: + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else if (param.asInteger() == 5) { + GotoState(&Klayman::sub421270); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klayman::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klayman::stClimbLadderHalf); + break; + case 0x4824: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4825: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4837: + sub41CE70(); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index d508f6cd27..f36e27abd4 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -158,6 +158,15 @@ public: uint32 handleMessage41E750(int messageNum, const MessageParam ¶m, Entity *sender); void sub4215E0(); void sub421550(); + + void sub4204C0(); + void spriteUpdate41F920(); + uint32 handleMessage41E5F0(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub421230(); + uint32 handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub421270(); protected: Entity *_parentScene; @@ -631,6 +640,21 @@ protected: void sub458590(); }; +class KmScene2810Small : public Klayman { +public: + KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2810 : public Klayman { +public: + KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + NRect *clipRects, uint clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 73675303c8..9b514e798f 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -36,6 +36,9 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Music18hList_add(0x64210814, 0xD2FA4D14); setGlobalVar(0x28D8C940, 1); + createScene(9, 5); + return; + if (which < 0) { createScene(_vm->gameState().sceneNum, which); } else if (which == 2) { @@ -105,6 +108,10 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2809(_vm, this, which); break; + case 9: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2810(_vm, this, which); + break; case 10: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 1); @@ -185,11 +192,49 @@ void Module2800::updateScene() { createScene(5, _moduleResult); break; case 8: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(10, 0); - } else { + else createScene(9, 4); - } + break; + case 9: + debug("scene 9 _moduleResult = %d", _moduleResult); + if (_moduleResult == 1) + createScene(11, 0); + else if (_moduleResult == 2) + createScene(2, 0); + else if (_moduleResult == 3) + createScene(24, 0); + else if (_moduleResult == 4) + createScene(8, 0); + else if (_moduleResult == 6) + createScene(2, 6); + else if (_moduleResult == 11) + createScene(12, 0); + else if (_moduleResult == 12) + createScene(13, 0); + else if (_moduleResult == 13) + createScene(14, 0); + else if (_moduleResult == 14) + createScene(15, 0); + else if (_moduleResult == 15) + createScene(16, 0); + else if (_moduleResult == 16) + createScene(17, 0); + else if (_moduleResult == 17) + createScene(18, 0); + else if (_moduleResult == 18) + createScene(19, 0); + else if (_moduleResult == 19) + createScene(20, 0); + else if (_moduleResult == 20) + createScene(21, 0); + else if (_moduleResult == 21) + createScene(22, 0); + else if (_moduleResult == 22) + createScene(23, 0); + else + createScene(2, 4); break; case 10: createScene(8, _moduleResult); @@ -2095,4 +2140,248 @@ void Scene2809::findClosestPoint() { } +AsScene2810Rope::AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x) + : AnimatedSprite(vm, 1100) { + + createSurface(990, 68, 476); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2810Rope::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + _x = x; + _y = -276; + startAnimation(0x9D098C23, 35, 53); +} + +uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + startAnimation(0x9D098C23, 35, 53); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + _surfaceFlag = true; + SetMessageHandler(&Scene2810::handleMessage); + + setBackground(0x26508804); + setPalette(0x26508804); + insertMouse433(0x0880026D); + + _sprite6 = insertStaticSprite(0x03615227, 1100); + _sprite5 = insertStaticSprite(0xE059A224, 1100); + + _clipRects[0].x1 = 0; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = 640; + _clipRects[0].y2 = 400; + _clipRects[1].x1 = _sprite5->getDrawRect().x; + _clipRects[1].y1 = 400; + _clipRects[1].x2 = _sprite6->getDrawRect().x2(); + _clipRects[1].y2 = 480; + + if (getGlobalVar(0x1860C990)) { + _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + } else { + _asTape = insertSprite(this, 0, 1100, 245, 429, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + } + + _sprite1 = insertStaticSprite(0x430001C4, 1200); + + if (getGlobalVar(0x0018CA22)) { + setGlobalVar(0xCB45DE03, 1); + if (getGlobalVar(0x1860C990)) { + _sprite4 = insertStaticSprite(0x82653808, 100); + } else { + _sprite4 = insertStaticSprite(0x82653808, 1100); + } + _sprite4->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + } + + if (which < 0) { + if (getGlobalVar(0x1860C990)) { + insertKlayman(240, 448); + _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE438); + setRectList(0x004AE810); + _flag1 = false; + _vm->_collisionMan->removeSprite(_asTape); + } else { + insertKlayman(300, 424, _clipRects, 2); + setMessageList(0x004AE438); + if (getGlobalVar(0x0018CA22)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + tempSprite = insertSprite(_klayman); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _flag1 = false; + } + } else if (which == 1) { + insertKlayman(186, 64, _clipRects, 2); + setMessageList(0x004AE440); + loadDataResource(0x84130112); + tempSprite = insertSprite(_klayman); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _flag1 = true; + _clipRects[0].y1 = _sprite1->getDrawRect().y; + } else if (which == 5) { + insertStaticSprite(0xC3007EA0, 100); + _sprite2 = insertStaticSprite(0x02780936, 1100); + _sprite3 = insertStaticSprite(0x1CA02160, 1100); + _asRope = insertSprite(this, 384); + insertKlayman(384, 0, _clipRects, 0); + sendEntityMessage(_klayman, 0x1014, _asRope); + setMessageList(0x004AE738); + _klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + // TODO Sound1ChList_addSoundResource(0x84400112, 0xC874EE6C, true); + // TODO Sound1ChList_playLooping(0xC874EE6C); + // TODO Sound1ChList_setVolume(0xC874EE6C, 50); + _flag1 = false; + } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { + if (getGlobalVar(0x1860C990)) { + insertKlayman((int16)getGlobalVar(0x00D30138), 448); + if (getGlobalVar(0xC0418A02)) + _klayman->setDoDeltaX(1); + _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE6D8); + setRectList(0x004AE810); + _flag1 = false; + _vm->_collisionMan->removeSprite(_asTape); + } else { + sub406650(); + if (getGlobalVar(0x00188211)) { + setMessageList(0x004AE6E8); + setGlobalVar(0x00188211, 0); + _flag1 = false; + } else { + setMessageList(0x004AE6D8); + _flag1 = false; + } + } + } else if (which >= 15 && which <= 18) { + sub406650(); + setMessageList(0x004AE6E0); + _flag1 = false; + } else if (which == 4) { + if (getGlobalVar(0x1860C990)) { + insertKlayman(473, 448); + _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE428); + setRectList(0x004AE810); + _flag1 = false; + _vm->_collisionMan->removeSprite(_asTape); + } else { + insertKlayman(450, 424, _clipRects, 2); + setMessageList(0x004AE418); + if (getGlobalVar(0x0018CA22)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + tempSprite = insertSprite(_klayman); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _flag1 = false; + } + } else { + insertKlayman(120, 448); + _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE410); + setRectList(0x004AE810); + _flag1 = false; + _vm->_collisionMan->removeSprite(_asTape); + } + +} + +void Scene2810::sub406650() { + Sprite *tempSprite; + + if (getGlobalVar(0x00188211)) { + insertKlayman(430, 424, _clipRects, 2); + _klayman->setDoDeltaX(1); + } else { + insertKlayman((int16)getGlobalVar(0x00D30138), 424, _clipRects, 2); + if (getGlobalVar(0xC0418A02)) + _klayman->setDoDeltaX(1); + } + if (getGlobalVar(0x0018CA22)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + tempSprite = insertSprite(_klayman); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _clipRects[0].y1 = _sprite1->getDrawRect().y; +} + +uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xE574F14C) + setMessageList(0x004AE458); + else if (param.asInteger() == 0x7214A05C || param.asInteger() == 0x2905E574) + setMessageList(0x004AE4A8); + else if (param.asInteger() == 0x7274E24C || param.asInteger() == 0x2D24E572) + setMessageList(0x004AE4D0); + else if (param.asInteger() == 0x4A07A040 || param.asInteger() == 0x190426F5) + setMessageList(0x004AE4F8); + else if (param.asInteger() == 0x6604200C || param.asInteger() == 0x2100E435) + setMessageList(0x004AE520); + else if (param.asInteger() == 0xE216A05C || param.asInteger() == 0x0905EC74) + setMessageList(0x004AE548); + else if (param.asInteger() == 0x721DA05C || param.asInteger() == 0xB905E574) + setMessageList(0x004AE570); + else if (param.asInteger() == 0x6214E09C || param.asInteger() == 0x2D09E474) + setMessageList(0x004AE598); + else if (param.asInteger() == 0x6276A04C || param.asInteger() == 0x0904E472) + setMessageList(0x004AE5C0); + else if (param.asInteger() == 0x6E14A00C || param.asInteger() == 0x2900E4B4) + setMessageList(0x004AE5E8); + else if (param.asInteger() == 0x6014A04D || param.asInteger() == 0x2904F454) + setMessageList(0x004AE610); + else if (param.asInteger() == 0x6215A3C4 || param.asInteger() == 0x393C6474) + setMessageList(0x004AE638); + else if (param.asInteger() == 0x6A54E24D || param.asInteger() == 0x2D24F4F0) + setMessageList(0x004AE660); + else if (param.asInteger() == 0x2064294C || param.asInteger() == 0x2194E053) + setMessageList(0x004AE688); + break; + case 0x2000: + setRectList(0x004AE800); + _flag1 = true; + break; + case 0x2001: + if (getGlobalVar(0x0018CA22)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + _flag1 = false; + break; + case 0x4826: + if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004AE750); + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 720f01112e..f4acda34b7 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -368,6 +368,32 @@ protected: void findClosestPoint(); }; +class AsScene2810Rope : public AnimatedSprite { +public: + AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2810 : public Scene { +public: + Scene2810(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_asRope; + Sprite *_sprite4; + Sprite *_asTape; + Sprite *_sprite5; + Sprite *_sprite6; + bool _flag1; + NRect _clipRects[2]; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void sub406650(); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From 0388fb496d507afc2262c32c9e6f9be1f384443b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 6 Sep 2012 14:42:17 +0000 Subject: NEVERHOOD: Implement Scene2822 --- engines/neverhood/gamemodule.cpp | 3 +- engines/neverhood/module2800.cpp | 182 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/module2800.h | 16 ++++ 3 files changed, 196 insertions(+), 5 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 294442804d..e9a58385e4 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,8 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().which = 11; - _vm->gameState().sceneNum = 9; + _vm->gameState().sceneNum = 21; createModule(2800, -1); #endif } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 9b514e798f..b28babeb37 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -25,6 +25,7 @@ #include "neverhood/module1000.h" #include "neverhood/module1200.h" #include "neverhood/module1700.h" +#include "neverhood/diskplayerscene.h" namespace Neverhood { @@ -36,9 +37,6 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Music18hList_add(0x64210814, 0xD2FA4D14); setGlobalVar(0x28D8C940, 1); - createScene(9, 5); - return; - if (which < 0) { createScene(_vm->gameState().sceneNum, which); } else if (which == 2) { @@ -116,6 +114,58 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 1); break; + case 12: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008); + break; + case 13: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x81C60635, 0x60631814); + break; + case 14: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0); + break; + case 15: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC); + break; + case 16: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0); + break; + case 17: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018); + break; + case 18: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018); + break; + case 19: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x10866205, 0x66201100); + break; + case 20: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x01C58000, 0x58004014); + break; + case 21: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2822(_vm, this, which); + break; + case 22: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948); + break; + case 23: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040); + break; + case 24: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A); + break; case 25: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); if (getGlobalVar(0x190A1D18)) @@ -123,6 +173,10 @@ void Module2800::createScene(int sceneNum, int which) { else _childObject = new Class152(_vm, this, 0x08611204, 0x1120008E); break; + case 26: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new DiskplayerScene(_vm, this, 4); + break; // case 1001: break; @@ -239,9 +293,51 @@ void Module2800::updateScene() { case 10: createScene(8, _moduleResult); break; + case 12: + createScene(9, 11); + break; + case 13: + createScene(9, 12); + break; + case 14: + createScene(9, 13); + break; + case 15: + createScene(9, 14); + break; + case 16: + createScene(9, 15); + break; + case 17: + createScene(9, 16); + break; + case 18: + createScene(9, 17); + break; + case 19: + createScene(9, 18); + break; + case 20: + createScene(9, 19); + break; + case 21: + createScene(9, 20); + break; + case 22: + createScene(9, 21); + break; + case 23: + createScene(9, 22); + break; + case 24: + createScene(9, 3); + break; case 25: createScene(2, 5); break; + case 26: + createScene(11, 2); + break; // case 1001: break; @@ -2310,6 +2406,12 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } +Scene2810::~Scene2810() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(0x00D30138, _klayman->getX()); + // TODO Sound1ChList_sub_407AF0(0x84400112); +} + void Scene2810::sub406650() { Sprite *tempSprite; @@ -2384,4 +2486,78 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0), + _soundResource1(vm), _soundResource2(vm), _soundResource3(vm) { + + SetMessageHandler(&Scene2822::handleMessage); + SetUpdateHandler(&Scene2822::update); + _background = new Background(_vm, 0xD542022E, 0, 0); + addBackground(_background); + _background->getSurface()->getDrawRect().y = -10; + setPalette(0xD542022E); + insertMouse435(0x0028D089, 20, 620); + _ssButton = insertStaticSprite(0x1A4D4120, 1100); + _ssButton->setVisible(false); + _soundResource3.load(0x19044E72); +} + +void Scene2822::update() { + + static const int16 kScene2822BackgroundYPositions[] = { + 0, -20, -5, -15, -8, -12, -9, -11, -10, 0 + }; + + Scene::update(); + + if (_countdown != 0) { + if ((--_countdown) == 0) { + if (_countdownStatus == 0) { + _ssButton->setVisible(false); + _countdownStatus = 1; + _countdown = 48; + } else if (_countdownStatus == 1) { + _soundResource1.play(0x1384CB60); + _countdownStatus = 2; + _countdown = 12; + } else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) { + leaveScene(0); + } + } else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) { + if (_scrollIndex < 9) { + _background->getSurface()->getDrawRect().y = kScene2822BackgroundYPositions[_scrollIndex]; + _scrollIndex++; + } else { + _background->getSurface()->getDrawRect().y = -10; + } + } + } + +} + +uint32 Scene2822::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } else if (param.asPoint().x >= 257 && param.asPoint().y >= 235 && + param.asPoint().x <= 293 && param.asPoint().y <= 273) { + _ssButton->setVisible(true); + _countdownStatus = 0; + _countdown = 12; + _soundResource2.play(0x44061000); + if (getGlobalVar(0x0018CA22) == 0) { + setGlobalVar(0x0018CA22, 1); + setGlobalVar(0x00188211, 1); + SetMessageHandler(NULL); + _soundResource3.play(); + _mouseCursor->setVisible(false); + } + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index f4acda34b7..4a7224da1a 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -379,6 +379,7 @@ protected: class Scene2810 : public Scene { public: Scene2810(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2810(); protected: Sprite *_sprite1; Sprite *_sprite2; @@ -394,6 +395,21 @@ protected: void sub406650(); }; +class Scene2822 : public Scene { +public: + Scene2822(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssButton; + int _scrollIndex; + int _countdown; + int _countdownStatus; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2800_H */ -- cgit v1.2.3 From 93a074e9ad4da61265ce7692d2785958fceaae68 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 7 Sep 2012 17:33:55 +0000 Subject: NEVERHOOD: Implement Scene2812 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 104 +++++++++++++++ engines/neverhood/klayman.h | 8 ++ engines/neverhood/module2800.cpp | 269 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2800.h | 49 +++++++ 5 files changed, 431 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e9a58385e4..32082835e9 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -328,7 +328,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 21; + _vm->gameState().sceneNum = 11; createModule(2800, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 5ca535460d..3e8c007339 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2266,6 +2266,18 @@ void Klayman::sub421270() { } } +void Klayman::sub420460() { + if (!stStartAction(AnimationCallback(&Klayman::sub420460))) { + _status2 = 0; + _acceptInput = false; + startAnimation(0x00AB8C10, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41E5F0); + SetSpriteUpdate(&Klayman::spriteUpdate41F920); + sendMessage(_attachedSprite, 0x482B, 0); + } +} + //############################################################################## // KmScene1001 @@ -5891,4 +5903,96 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene2812::KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4805: + _destY = param.asInteger(); + debug("_destY = %d", _destY); + GotoState(&Klayman::sub420460); + break; + case 0x4812: + if (param.asInteger() == 2) + GotoState(&Klayman::stPickUpNeedle); + else if (param.asInteger() == 1) + GotoState(&Klayman::sub41FFF0); + else + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481A: + GotoState(&Klayman::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) + sub41CC40(param.asPoint().y, param.asPoint().x); + else + sub41CCE0(param.asPoint().x); + break; + case 0x481D: + GotoState(&Klayman::stTurnToUse); + break; + case 0x481E: + GotoState(&Klayman::stReturnFromUse); + break; + case 0x4820: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klayman::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2001, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2001, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2002, 0); + GotoState(&Klayman::stClimbLadderHalf); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWalkToFrontNoStep); + } else { + GotoState(&Klayman::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnToFront); + } else { + GotoState(&Klayman::stTurnToBack); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index f36e27abd4..18791ff623 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -167,6 +167,7 @@ public: uint32 handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender); void sub421270(); + void sub420460(); protected: Entity *_parentScene; @@ -655,6 +656,13 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2812 : public Klayman { +public: + KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index b28babeb37..2bf023cdd7 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -25,6 +25,7 @@ #include "neverhood/module1000.h" #include "neverhood/module1200.h" #include "neverhood/module1700.h" +#include "neverhood/module2200.h" #include "neverhood/diskplayerscene.h" namespace Neverhood { @@ -114,6 +115,10 @@ void Module2800::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 1); break; + case 11: + // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + _childObject = new Scene2812(_vm, this, which); + break; case 12: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008); @@ -293,6 +298,16 @@ void Module2800::updateScene() { case 10: createScene(8, _moduleResult); break; + case 11: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 2) + createScene(26, 0); + else if (_moduleResult == 3) + createScene(9, 5); + else + createScene(9, 1); + break; case 12: createScene(9, 11); break; @@ -2486,6 +2501,260 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + createSurface1(0x20DA08A0, 1200); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2812Winch::handleMessage); + setVisible(false); + _x = 280; + _y = 184; +} + +AsScene2812Winch::~AsScene2812Winch() { + // TODO Sound1ChList_sub_407AF0(0x00B000E2); +} + +uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + startAnimation(0x20DA08A0, 0, -1); + setVisible(true); + // TODO Sound1ChList_addSoundResource(0x00B000E2, 0xC874EE6C, true); + // TODO Sound1ChList_playLooping(0xC874EE6C); + break; + case 0x3002: + startAnimation(0x20DA08A0, 7, -1); + break; + } + return messageResult; +} + +AsScene2812Rope::AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(990, 68, 476); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2812Rope::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + startAnimation(0xAE080551, 0, -1); + _x = 334; + _y = 201; +} + +uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4806: + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + sub413E00(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene2812Rope::handleMessage413DC0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2812Rope::sub413E00() { + sendMessage(_parentScene, 0x4806, 0); + startAnimation(0x9D098C23, 0, -1); + SetMessageHandler(&AsScene2812Rope::handleMessage413DC0); +} + +AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm) + : AnimatedSprite(vm, 0x805D0029, 100, 320, 240), _soundResource(vm) { + + SetMessageHandler(&AsScene2812TrapDoor::handleMessage); + _newStickFrameIndex = 0; +} + +uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + startAnimation(0x805D0029, 0, -1); + _soundResource.play(0xEA005F40); + _newStickFrameIndex = -2; + break; + } + return messageResult; +} + +Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _palStatus(0) { + + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) + setGlobalVar(0x13382860, 3); + + _surfaceFlag = true; + SetMessageHandler(&Scene2812::handleMessage); + SetUpdateHandler(&Scene2812::update); + + setRectList(0x004AF700); + + setBackground(0x03600606); + setPalette(0x03600606); + addEntity(_palette); + _palette->addBasePalette(0x03600606, 0, 256, 0); + + _sprite1 = insertStaticSprite(0x0C06C860, 1100); + insertMouse433(0x0060203E); + + if (getGlobalVar(0x13382860) == 3) { + _class545 = insertSprite(this, 2, 1100, 474, 437); + _vm->_collisionMan->addSprite(_class545); + } + + _class606 = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); + _vm->_collisionMan->addSprite(_class606); + + _asWinch = insertSprite(); + _asTrapDoor = insertSprite(); + _asRope = insertSprite(this); + + _sprite2 = insertStaticSprite(0x08478078, 1100); + _sprite3 = insertStaticSprite(0x2203B821, 1100); + _sprite4 = insertStaticSprite(0x08592134, 1100); + + if (which < 0) { + _flag1 = false; + insertKlayman(272, 432); + setMessageList(0x004AF560); + _sprite1->setVisible(false); + _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + } else if (which == 1) { + _flag1 = false; + insertKlayman(338, 398); + setMessageList(0x004AF588); + setPalStatus1(1); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); + } else if (which == 2) { + _flag1 = false; + if (getGlobalVar(0xC0418A02)) { + insertKlayman(554, 432); + _klayman->setDoDeltaX(1); + } else { + insertKlayman(394, 432); + } + setMessageList(0x004AF5F0); + _sprite1->setVisible(false); + _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + } else { + _flag1 = true; + insertKlayman(150, 582); + setMessageList(0x004AF568); + setPalStatus2(1); + _sprite1->setVisible(false); + _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + } + + _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + +} + +void Scene2812::update() { + if (_klayman->getX() < 220) + setPalStatus2(0); + else if (_klayman->getX() < 240) + setPalStatus0(0); + Scene::update(); +} + +uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0004269B) + sendEntityMessage(_klayman, 0x1014, _asRope); + break; + case 0x2001: + _flag1 = true; + setRectList(0x004AF710); + _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2()); + break; + case 0x2002: + _flag1 = false; + setRectList(0x004AF700); + _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + break; + case 0x4806: + sendMessage(_asWinch, 0x2000, 0); + sendMessage(_asTrapDoor, 0x2000, 0); + break; + case 0x4826: + if (sender == _class606 && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _class606); + setMessageList(0x004AF658); + } else if (sender == _class545 && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _class545); + setMessageList(0x004AF668); + } + break; + case 0x482A: + setPalStatus1(0); + _sprite1->setVisible(true); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); + break; + case 0x482B: + setPalStatus0(false); + _sprite1->setVisible(false); + _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + break; + } + return messageResult; +} + +void Scene2812::setPalStatus0(int fadeTime) { + if (_palStatus != 0) { + _palStatus = 0; + setPalStatus(fadeTime); + } +} + +void Scene2812::setPalStatus1(int fadeTime) { + if (_palStatus != 1) { + _palStatus = 1; + setPalStatus(fadeTime); + } +} + +void Scene2812::setPalStatus2(int fadeTime) { + if (_palStatus != 2) { + _palStatus = 2; + setPalStatus(fadeTime); + } +} + +void Scene2812::setPalStatus(int fadeTime) { + if (_palStatus == 0) + _palette->addBasePalette(0x05D30F11, 0, 64, 0); + else if (_palStatus == 1) + _palette->addBasePalette(0x92CA2C9B, 0, 64, 0); + else if (_palStatus == 2) + _palette->addBasePalette(0x381F92C5, 0, 64, 0); + if (fadeTime > 0) { + _palette->startFadeToPalette(0); + } else { + _palette->startFadeToPalette(12); + } +} + Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm) { diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 4a7224da1a..9daf820e21 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -395,6 +395,55 @@ protected: void sub406650(); }; +class AsScene2812Winch : public AnimatedSprite { +public: + AsScene2812Winch(NeverhoodEngine *vm); + virtual ~AsScene2812Winch(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2812Rope : public AnimatedSprite { +public: + AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage413DC0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub413E00(); +}; + +class AsScene2812TrapDoor : public AnimatedSprite { +public: + AsScene2812TrapDoor(NeverhoodEngine *vm); +protected: + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2812 : public Scene { +public: + Scene2812(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asWinch; + Sprite *_asTrapDoor; + Sprite *_asRope; + Sprite *_sprite3; + Sprite *_sprite2; + Sprite *_sprite4; + Sprite *_class606; + Sprite *_class545; + Sprite *_sprite1; + bool _flag1; + int _palStatus; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void setPalStatus0(int fadeTime); + void setPalStatus1(int fadeTime); + void setPalStatus2(int fadeTime); + void setPalStatus(int fadeTime); +}; + class Scene2822 : public Scene { public: Scene2822(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From c27e930861cea513f3d966e610c336dbdb34ea6d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 7 Sep 2012 17:34:15 +0000 Subject: NEVERHOOD: Add tables for Scene2812 --- devtools/create_neverhood/tables.h | 10 ++++++++++ dists/engine-data/neverhood.dat | Bin 21950 -> 22406 bytes 2 files changed, 10 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index a458dedb00..f8a4497e73 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -122,6 +122,9 @@ static const uint32 rectListOffsets[] = { // Scene2810 1, 0x004AE810, 1, 0x004AE800, + // Scene2812 + 1, 0x004AF700, + 1, 0x004AF710, 0, 0 }; @@ -450,6 +453,13 @@ static const uint32 messageListOffsets[] = { 5, 0x004AE660, 5, 0x004AE688, 2, 0x004AE750, + // Scene2812 + 1, 0x004AF560, + 1, 0x004AF588, + 1, 0x004AF5F0, + 4, 0x004AF568, + 2, 0x004AF658, + 2, 0x004AF668, 0, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index f47b01d5df..9fbfcfa771 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 43362dfbd1354220ffdf1fba8a04286a7037c45f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 10 Sep 2012 18:15:30 +0000 Subject: NEVERHOOD: Implement Scene2803 - Also add "empty" constructor to DirtyBackground (used by that scene) --- engines/neverhood/background.cpp | 5 + engines/neverhood/background.h | 1 + engines/neverhood/klayman.cpp | 87 ++++++++- engines/neverhood/klayman.h | 10 + engines/neverhood/module2800.cpp | 402 +++++++++++++++++++++++++++++++++++++-- engines/neverhood/module2800.h | 54 +++++- 6 files changed, 541 insertions(+), 18 deletions(-) diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp index e235eaa1b3..03c531f40a 100644 --- a/engines/neverhood/background.cpp +++ b/engines/neverhood/background.cpp @@ -59,6 +59,11 @@ void Background::load(uint32 fileHash) { // DirtyBackground +DirtyBackground::DirtyBackground(NeverhoodEngine *vm, int objectPriority) + : Background(vm, objectPriority) { + // Empty +} + DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority) : Background(vm, objectPriority) { diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h index 8ac3581a51..d8f624b73d 100644 --- a/engines/neverhood/background.h +++ b/engines/neverhood/background.h @@ -46,6 +46,7 @@ protected: class DirtyBackground : public Background { public: + DirtyBackground(NeverhoodEngine *vm, int objectPriority); DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority); DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority); void createSurface(int surfacePriority, int16 width, int16 height); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 3e8c007339..f69686aa66 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2278,6 +2278,27 @@ void Klayman::sub420460() { } } +void Klayman::sub420500() { + _status2 = 1; + _acceptInput = false; + startAnimationByHash(0x00AB8C10, 0x320AC306, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::handleMessage41F0E0); + NextState(&Klayman::stReleaseRing); +} + +uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x320AC306) + _soundResource1.play(0x5860C640); + break; + } + return messageResult; +} + //############################################################################## // KmScene1001 @@ -5266,6 +5287,69 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } +KmScene2803::KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + // TODO ClipRects stuff + _dataResource.load(0x00900849); +} + +uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4803: + _destY = param.asInteger(); + GotoState(&Klayman::sub4204C0); + break; + case 0x4804: + if (param.asInteger() == 3) + GotoState(&Klayman::sub421230); + break; + case 0x480D: + GotoState(&Klayman::sub420F60); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481D: + GotoState(&Klayman::stTurnToUse); + break; + case 0x481E: + GotoState(&Klayman::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else { + GotoState(&Klayman::stWonderAboutHalf); + } + break; + case 0x482E: + GotoState(&Klayman::stWalkToFront); + break; + case 0x482F: + GotoState(&Klayman::stTurnToBack); + break; + case 0x4834: + GotoState(&Klayman::stStepOver); + break; + case 0x4838: + GotoState(&Klayman::sub420500); + break; + } + return 0; +} + KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _soundResource(vm) { @@ -5807,8 +5891,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶ return 0; } -KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, - NRect *clipRects, uint clipRectsCount) +KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { // TODO ClipRects stuff diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 18791ff623..6cfb0fc733 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -168,6 +168,9 @@ public: void sub421270(); void sub420460(); + + void sub420500(); + uint32 handleMessage41F0E0(int messageNum, const MessageParam ¶m, Entity *sender); protected: Entity *_parentScene; @@ -582,6 +585,13 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2803 : public Klayman { +public: + KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2803b : public Klayman { public: KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 2bf023cdd7..97fb18f9f2 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -77,12 +77,11 @@ void Module2800::createScene(int sceneNum, int which) { break; case 2: // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); - setGlobalVar(0x1860C990,1);//DEBUG + //setGlobalVar(0x1860C990,1);//DEBUG if (getGlobalVar(0x1860C990)) _childObject = new Scene2803b(_vm, this, which); - else { - // TODO _childObject = new Scene2803(_vm, this, which); - } + else + _childObject = new Scene2803(_vm, this, which); break; case 3: _childObject = new Scene2804(_vm, this, which); @@ -477,7 +476,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -Class488::Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) +AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), _flag1(false), _flag2(false), _soundResource(vm) { @@ -489,7 +488,7 @@ Class488::Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui sub4343C0(); } -uint32 Class488::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -511,7 +510,7 @@ uint32 Class488::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -uint32 Class488::handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2803LightCord::handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -521,21 +520,21 @@ uint32 Class488::handleMessage434340(int messageNum, const MessageParam ¶m, return messageResult; } -void Class488::sub434380() { +void AsScene2803LightCord::sub434380() { _flag2 = false; _flag1 = true; startAnimation(_fileHash2, 0, -1); - SetMessageHandler(&Class488::handleMessage434340); - NextState(&Class488::sub4343C0); + SetMessageHandler(&AsScene2803LightCord::handleMessage434340); + NextState(&AsScene2803LightCord::sub4343C0); } -void Class488::sub4343C0() { +void AsScene2803LightCord::sub4343C0() { _flag1 = false; startAnimation(_fileHash1, 0, -1); - SetMessageHandler(&Class488::handleMessage); + SetMessageHandler(&AsScene2803LightCord::handleMessage); } -void Class488::setFileHashes(uint32 fileHash1, uint32 fileHash2) { +void AsScene2803LightCord::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHash1 = fileHash1; _fileHash2 = fileHash2; if (_flag1) { @@ -546,6 +545,381 @@ void Class488::setFileHashes(uint32 fileHash1, uint32 fileHash2) { } } +AsScene2803TestTubeOne::AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2) + : AnimatedSprite(vm, 1200), _fileHash1(fileHash1), _fileHash2(fileHash2) { + + createSurface1(fileHash1, 100); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2803TestTubeOne::handleMessage); + _x = 529; + _y = 326; +} + +uint32 AsScene2803TestTubeOne::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) + startAnimation(_fileHash2, 0, -1); + else + startAnimation(_fileHash1, 0, -1); + break; + } + return messageResult; +} + +AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(990, 68, 476); + SetUpdateHandler(&AnimatedSprite::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&AsScene2803Rope::handleMessage); + startAnimation(0x9D098C23, 35, 53); + NextState(&AsScene2803Rope::sub476A70); + _x = x; + _y = -276; +} + +uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + startAnimation(0x9D098C23, 50, -1); + SetMessageHandler(&AsScene2803Rope::handleMessage4769E0); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene2803Rope::handleMessage4769E0(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +void AsScene2803Rope::sub476A70() { + startAnimation(0x8258A030, 0, 1); + NextState(&AsScene2803Rope::stHide); +} + +void AsScene2803Rope::stHide() { + stopAnimation(); + setVisible(false); +} + +Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _field134(0) { + + static const uint32 kScene2803FileHashes1[] = { + 0, + 0x081000F1, + 0x08100171, + 0x08100271 + }; + + static const uint32 kScene2803FileHashes2[] = { + 0, + 0x286800D4, + 0x286806D4, + 0x28680AD4 + }; + + setGlobalVar(0x1C1B8A9A, 1); + _vm->gameModule()->initScene2808Vars1(); + + SetMessageHandler(&Scene2803::handleMessage); + + loadDataResource(0x00900849); + + _surfaceFlag = true; + + _background = new DirtyBackground(_vm, 0); + _background->createSurface(0, 640, 480); + addBackground(_background); + + setPalette(0x412A423E); + addEntity(_palette); + + insertMouse433(0xA423A41A); + + if (getSubVar(0x0C601058, 0) == 0) { + _asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100); + } else { + _asTestTubeOne = (StaticSprite*)insertSprite( + kScene2803FileHashes1[getSubVar(0x0C601058, 0)], + kScene2803FileHashes2[getSubVar(0x0C601058, 0)]); + } + + if (getSubVar(0x0C601058, 1) == 3) + _asTestTubeTwo = (StaticSprite*)insertStaticSprite(0x64330236, 100); + + if (getSubVar(0x0C601058, 2) == 3) + _asTestTubeThree = (StaticSprite*)insertStaticSprite(0x2E4A22A2, 100); + + _asLightCord = insertSprite(this, 0x8FAD5932, 0x276E1A3D, 578, 200); + _sprite3 = (StaticSprite*)insertStaticSprite(0xA40EF2FB, 1100); + _sprite4 = (StaticSprite*)insertStaticSprite(0x0C03AA23, 1100); + _sprite5 = (StaticSprite*)insertStaticSprite(0x2A822E2E, 1100); + _sprite6 = (StaticSprite*)insertStaticSprite(0x2603A202, 1100); + _sprite7 = (StaticSprite*)insertStaticSprite(0x24320220, 1100); + _sprite8 = (StaticSprite*)insertStaticSprite(0x3C42022F, 1100); + _sprite9 = (StaticSprite*)insertStaticSprite(0x341A0237, 1100); + _sprite10 = insertStaticSprite(0x855820A3, 1200); + + _clipRects1[0].x1 = 0; + _clipRects1[0].y1 = 0; + _clipRects1[0].x2 = 640; + _clipRects1[0].y2 = _sprite8->getDrawRect().y2(); + + _clipRects1[1].x1 = _sprite8->getDrawRect().x2(); + _clipRects1[1].y1 = _sprite8->getDrawRect().y2(); + _clipRects1[1].x2 = 640; + _clipRects1[1].y2 = 480; + + _clipRects2[0].x1 = _sprite5->getDrawRect().x; + _clipRects2[0].y1 = 0; + _clipRects2[0].x2 = _sprite5->getDrawRect().x2(); + _clipRects2[0].y2 = _sprite5->getDrawRect().y2(); + + _clipRects2[1].x1 = _sprite6->getDrawRect().x; + _clipRects2[1].y1 = 0; + _clipRects2[1].x2 = _sprite3->getDrawRect().x; + _clipRects2[1].y2 = _sprite6->getDrawRect().y2(); + + _clipRects2[2].x1 = _sprite3->getDrawRect().x; + _clipRects2[2].y1 = 0; + _clipRects2[2].x2 = _sprite4->getDrawRect().x2(); + _clipRects2[2].y2 = 480; + + if (which < 0) { + insertKlayman(302, 445, _clipRects1, 2); + setMessageList(0x004B79F0); + sub476090(); + } else if (which == 1) { + insertKlayman(200, 445, _clipRects1, 2); + setMessageList(0x004B79C8); + sub476090(); + } else if (which == 3) { + NPoint pt = _dataResource.getPoint(0xC2A08694); + insertKlayman(pt.x, pt.y, _clipRects2, 3); + setMessageList(0x004B7A00); + sub475FF0(); + } else if (which == 5) { + insertKlayman(253, 298, _clipRects2, 3); + setMessageList(0x004B7A00); + sub475FF0(); + } else if (which == 6) { + _asRope = insertSprite(this, 384); + _asRope->setClipRect(0, 25, 640, 480); + insertKlayman(384, 0, _clipRects1, 2); + sendEntityMessage(_klayman, 0x1014, _asRope); + _klayman->setClipRect(0, 25, 640, 480); + setMessageList(0x004B7A78); + sub476090(); + } else if (which == 2) { + insertKlayman(400, 445, _clipRects1, 2); + setMessageList(0x004B79F8); + sub476090(); + } else { + insertKlayman(50, 231, _clipRects2, 3); + setMessageList(0x004B79C0); + sub475FF0(); + } + + sub476180(); + +} + +void Scene2803::update475E40() { + if (_klayman->getX() < 350) { + sub4765D0(); + } else { + sub4765F0(); + } + Scene::update(); +} + +uint32 Scene2803::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480F: + sub476130(); + // NOTE Intentional fall-through + case 0x100D: + if (param.asInteger() == 0x84251F82) + setMessageList(0x004B7A50); + else if (param.asInteger() == 0x4254A2D2) + setMessageList(0x004B7A58); + else if (param.asInteger() == 0xE90A40A0) + setMessageList(0x004B7A08); + else if (param.asInteger() == 0x482D1210) + setMessageList(0x004B7A30); + else if (param.asInteger() == 0x802402B2) { + sendEntityMessage(_klayman, 0x1014, _asLightCord); + setMessageList(0x004B7A68); + } else if (param.asInteger() == 0x9626F390) + setMessageList(0x004B7A88); + break; + case 0x482A: + sub475FF0(); + sub4765F0(); + break; + case 0x482B: + sub476090(); + sub4765D0(); + break; + } + return messageResult; +} + +void Scene2803::sub475FF0() { + SetUpdateHandler(&Scene2803::update475E40); + // TODO _klayman->setClipRects(_clipRects2, 3); + sendMessage(_klayman, 0x482C, 0xE5A48297); + _sprite3->setVisible(true); + _sprite4->setVisible(true); + _sprite5->setVisible(true); + _sprite6->setVisible(true); + _sprite7->setVisible(true); + _sprite8->setVisible(false); + _sprite9->setVisible(false); +} + +void Scene2803::sub476090() { + SetUpdateHandler(&Scene::update); + // TODO _klayman->setClipRects(_clipRects1, 2); + sendMessage(_klayman, 0x482C, 0); + _sprite3->setVisible(false); + _sprite4->setVisible(false); + _sprite5->setVisible(false); + _sprite6->setVisible(false); + _sprite7->setVisible(false); + _sprite8->setVisible(true); + _sprite9->setVisible(true); +} + +void Scene2803::sub476130() { + setGlobalVar(0x190A1D18, getGlobalVar(0x190A1D18) ? 0 : 1); + sub476180(); +} + +void Scene2803::sub476180() { + // TODO? g_screen->resetDirtyRects(); + if (getGlobalVar(0x190A1D18)) { + _asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D); + _background->load(0x412A423E); + _palette->addPalette(0x412A423E, 0, 256, 0); + _palette->addBasePalette(0x412A423E, 0, 256, 0); + _sprite3->load(0xA40EF2FB, false, false); + _sprite3->update(); + _sprite4->load(0x0C03AA23, false, false); + _sprite4->update(); + _sprite5->load(0x2A822E2E, false, false); + _sprite5->update(); + _sprite6->load(0x2603A202, false, false); + _sprite6->update(); + _sprite7->load(0x24320220, false, false); + _sprite7->update(); + _mouseCursor->load(0xA423A41A); + _mouseCursor->updateCursor(); + _sprite8->load(0x3C42022F, false, false); + _sprite8->update(); + _sprite9->load(0x341A0237, false, false); + _sprite9->update(); + if (getSubVar(0x0C601058, 0) == 0) { + _asTestTubeOne->load(0x66121222, false, false); + _asTestTubeOne->update(); + } else + sendMessage(_asTestTubeOne, 0x2000, 0); + if (getSubVar(0x0C601058, 1) == 3) { + _asTestTubeTwo->load(0x64330236, false, false); + _asTestTubeTwo->update(); + } + if (getSubVar(0x0C601058, 2) == 3) { + _asTestTubeThree->load(0x2E4A22A2, false, false); + _asTestTubeThree->update(); + } + _sprite10->setVisible(true); + } else { + _asLightCord->setFileHashes(0xAFAD591A, 0x276E321D); + _background->load(0x29800A01); + _palette->addPalette(0x29800A01, 0, 256, 0); + _palette->addBasePalette(0x29800A01, 0, 256, 0); + _sprite3->load(0x234340A0, false, false); + _sprite3->update(); + _sprite4->load(0x16202200, false, false); + _sprite4->update(); + _sprite5->load(0x1030169A, false, false); + _sprite5->update(); + _sprite6->load(0x1600A6A8, false, false); + _sprite6->update(); + _sprite7->load(0xD0802EA0, false, false); + _sprite7->update(); + _mouseCursor->load(0x00A05290); + _mouseCursor->updateCursor(); + _sprite8->load(0x108012C1, false, false); + _sprite8->update(); + _sprite9->load(0x708072E0, false, false); + _sprite9->update(); + if (getSubVar(0x0C601058, 0) == 0) { + _asTestTubeOne->load(0x50C027A8, false, false); + _asTestTubeOne->update(); + } else + sendMessage(_asTestTubeOne, 0x2000, 1); + if (getSubVar(0x0C601058, 1) == 3) { + _asTestTubeTwo->load(0xD48077A0, false, false); + _asTestTubeTwo->update(); + } + if (getSubVar(0x0C601058, 2) == 3) { + _asTestTubeThree->load(0x30022689, false, false); + _asTestTubeThree->update(); + } + _sprite10->setVisible(false); + } + sub476610(); +} + +void Scene2803::sub4765D0() { + if (_field134) { + _field134 = 0; + sub476610(); + } +} + +void Scene2803::sub4765F0() { + if (!_field134) { + _field134 = 1; + sub476610(); + } +} + +void Scene2803::sub476610() { + uint32 fadePaletteHash; + if (getGlobalVar(0x190A1D18)) + fadePaletteHash = _field134 ? 0xB103B604 : 0x412A423E; + else + fadePaletteHash = _field134 ? 0x0263D144 : 0x29800A01; + _palette->addBasePalette(fadePaletteHash, 0, 64, 0); + _palette->startFadeToPalette(12); +} + Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _palStatus(0) { @@ -563,7 +937,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x81120132); insertMouse433(0x00A05290); - insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); + insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); if (getGlobalVar(0x190A1D18)) { setBackground(0x412A423E); diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 9daf820e21..50db1615c8 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -54,9 +54,9 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class488 : public AnimatedSprite { +class AsScene2803LightCord : public AnimatedSprite { public: - Class488(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); + AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); void sub434380(); void sub4343C0(); void setFileHashes(uint32 fileHash1, uint32 fileHash2); @@ -69,6 +69,56 @@ protected: uint32 handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender); }; +class AsScene2803TestTubeOne : public AnimatedSprite { +public: + AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2); +protected: + uint32 _fileHash1, _fileHash2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2803Rope : public AnimatedSprite { +public: + AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage4769E0(int messageNum, const MessageParam ¶m, Entity *sender); + void sub476A70(); + void stHide(); +}; + +class Scene2803 : public Scene { +public: + Scene2803(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + StaticSprite *_asTestTubeOne; + StaticSprite *_asTestTubeTwo; + StaticSprite *_asTestTubeThree; + Sprite *_asRope; + AsScene2803LightCord *_asLightCord; + StaticSprite *_sprite3; + StaticSprite *_sprite4; + StaticSprite *_sprite5; + StaticSprite *_sprite6; + StaticSprite *_sprite7; + StaticSprite *_sprite8; + StaticSprite *_sprite9; + Sprite *_sprite10; + NRect _clipRects1[2]; + NRect _clipRects2[3]; + bool _field134; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void update475E40(); + void sub475FF0(); + void sub476090(); + void sub476130(); + void sub476180(); + void sub4765D0(); + void sub4765F0(); + void sub476610(); +}; + class Scene2803b : public Scene { public: Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From de622586f6926eb2376b59494fdbf504b5858b95 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 10 Sep 2012 18:15:49 +0000 Subject: NEVERHOOD: Add tables for Scene2803 --- devtools/create_neverhood/tables.h | 13 +++++++++++++ dists/engine-data/neverhood.dat | Bin 22406 -> 22694 bytes 2 files changed, 13 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index f8a4497e73..663845f987 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -410,6 +410,19 @@ static const uint32 messageListOffsets[] = { 3, 0x004B6168, 1, 0x004B61A0, 5, 0x004B61A8, + // Scene2803 + 1, 0x004B79F0, + 5, 0x004B79C8, + 1, 0x004B7A00, + 2, 0x004B7A78, + 1, 0x004B79F8, + 1, 0x004B79C0, + 1, 0x004B7A50, + 2, 0x004B7A58, + 5, 0x004B7A08, + 4, 0x004B7A30, + 2, 0x004B7A68, + 7, 0x004B7A88, // Scene2805 1, 0x004AE1C8, 2, 0x004AE1D0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 9fbfcfa771..fd8e9c4d61 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From b2175adf61a2524338ad8c78a747a326d1519266 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 11 Sep 2012 12:52:29 +0000 Subject: NEVERHOOD: Add tables for Scene2501 --- devtools/create_neverhood/tables.h | 9 +++++++++ dists/engine-data/neverhood.dat | Bin 22694 -> 23016 bytes 2 files changed, 9 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 663845f987..044880b9bc 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -112,6 +112,8 @@ static const uint32 rectListOffsets[] = { // Scene2247 1, 0x004B5588, 1, 0x004B55C8, + // Scene2501 + 1, 0x004B2608, // Scene2801 1, 0x004B6CE0, 1, 0x004B6CD0, @@ -390,6 +392,9 @@ static const uint32 messageListOffsets[] = { 4, 0x004B54C0, 5, 0x004B54E0, 5, 0x004B5508, + // Scene 2501 + 7, 0x004B2538, + 6, 0x004B2570, // Scene2801 1, 0x004B6BB8, 1, 0x004B6BC0, @@ -641,5 +646,9 @@ static const uint32 sceneInfo2700Offsets[] = { 0x004B5FD8, 0x004B5FFC, 0x004B6020, + // Scene2501 + 0x004B2628, + 0x004B264C, + 0x004B2670, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index fd8e9c4d61..9d0e214bc6 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From bbb23cdf275d686f23f0553154d36a5c1fb74c88 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 11 Sep 2012 13:56:48 +0000 Subject: NEVERHOOD: Start with Module2500 - Implement Scene2501 - Add Scene::removeSprite --- engines/neverhood/gamemodule.cpp | 15 +- engines/neverhood/klayman.cpp | 51 ++++++ engines/neverhood/klayman.h | 8 + engines/neverhood/module.mk | 1 + engines/neverhood/module2500.cpp | 387 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2500.h | 96 ++++++++++ engines/neverhood/module2700.cpp | 1 - engines/neverhood/scene.cpp | 5 + engines/neverhood/scene.h | 1 + 9 files changed, 563 insertions(+), 2 deletions(-) create mode 100644 engines/neverhood/module2500.cpp create mode 100644 engines/neverhood/module2500.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 32082835e9..9953492362 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -37,6 +37,7 @@ #include "neverhood/module2100.h" #include "neverhood/module2200.h" #include "neverhood/module2300.h" +#include "neverhood/module2500.h" #include "neverhood/module2600.h" #include "neverhood/module2700.h" #include "neverhood/module2800.h" @@ -327,10 +328,15 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 11; createModule(2800, -1); #endif +#if 1 + _vm->gameState().which = 2; + _vm->gameState().sceneNum = 0; + createModule(2500, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -394,6 +400,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x1A214010); _childObject = new Module2300(_vm, this, which); break; + case 2500: + setGlobalVar(0x91080831, 0x29220120); + _childObject = new Module2500(_vm, this, which); + break; case 2600: setGlobalVar(0x91080831, 0x40271018); _childObject = new Module2600(_vm, this, which); @@ -513,6 +523,9 @@ void GameModule::updateModule() { createModule(1000, 1); } break; + case 2500: + createModule(2600, 1); + break; case 2600: if (_moduleResult == 1) { createModule(2500, 0); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index f69686aa66..9d28b5f046 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5215,6 +5215,57 @@ void KmScene2247::sub453520() { FinalizeState(&Klayman::stStartWalkingDone); } +KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + // Empty +} + +uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klayman::sub421350); + else + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klayman::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klayman::stReturnFromUseInTeleporter); + break; + case 0x4834: + GotoState(&Klayman::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klayman::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klayman::stGetUpFromTeleporter); + break; + } + return messageResult; +} + KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 6cfb0fc733..fea543cdc9 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -578,6 +578,14 @@ protected: void sub453520(); }; +class KmScene2501 : public Klayman { +public: + KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _isSittingInTeleporter; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2801 : public Klayman { public: KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 780ee76ae1..ac4064bf81 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -25,6 +25,7 @@ MODULE_OBJS = \ module2100.o \ module2200.o \ module2300.o \ + module2500.o \ module2600.o \ module2700.o \ module2800.o \ diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp new file mode 100644 index 0000000000..0f746d1488 --- /dev/null +++ b/engines/neverhood/module2500.cpp @@ -0,0 +1,387 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2500.h" + +namespace Neverhood { + +Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), + _soundResource3(vm), _soundResource4(vm), _soundIndex(0) { + + // TODO Music18hList_add(0x29220120, 0x05343184); + // TODO Music18hList_play(0x05343184, 0, 0, 1); + SetMessageHandler(&Module2500::handleMessage); + + if (which < 0) { + createScene(_vm->gameState().sceneNum, _vm->gameState().which); + } else { + createScene(0, 0); + } + + _soundResource1.load(0x00880CCC); + _soundResource2.load(0x00880CC0); + _soundResource3.load(0x00880CCC); + _soundResource4.load(0x00880CC0); + +} + +Module2500::~Module2500() { +} + +void Module2500::createScene(int sceneNum, int which) { + debug("Module2500::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + _childObject = new Scene2501(_vm, this, which); + break; + } + SetUpdateHandler(&Module2500::updateScene); + _childObject->handleUpdate(); +} + +void Module2500::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(1, 0); + else + leaveModule(0); + break; + } + } +} + +uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200D: + switch (_soundIndex) { + case 0: + _soundResource1.play(); + break; + case 1: + _soundResource2.play(); + break; + case 2: + _soundResource3.play(); + break; + case 3: + _soundResource4.play(); + break; + } + _soundIndex++; + if (_soundIndex >= 4) + _soundIndex = 0; + break; + } + return messageResult; +} + +Class541::Class541(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { + + startAnimation(0x1209E09F, 1, -1); + _newStickFrameIndex = 1; + setDoDeltaX(1); +} + +Class542::Class542(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { + + _newStickFrameIndex = 0; + setDoDeltaX(1); +} + +Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + _sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628); + _sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C); + _sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670); + + setGlobalVar(0x21E60190, 1); + SetUpdateHandler(&Scene2501::update); + _surfaceFlag = true; + setBackground(0x1B8E8115); + setPalette(0x1B8E8115); + _palette->addPalette(0x00128842, 65, 31, 65); + _palette->addPalette("paKlayRed", 0, 64, 0); + insertMouse433(0xE81111B0); + + _class437 = createSprite(0x99BE9015); // Don't add this to the sprite list + addEntity(_class437); + + _class521 = createSprite(this, 211, 400); // Create but don't add to the sprite list yet + _class541 = insertSprite(211, 400); + _class542 = insertSprite(211, 400); + insertStaticSprite(0xC42AC521, 1500); + + if (which < 0) { + insertKlayman(162, 393); + _kmScene2501 = _klayman; + _klaymanInCar = false; + setMessageList(0x004B2538); + setRectList(0x004B2608); + SetMessageHandler(&Scene2501::handleMessage); + SetUpdateHandler(&Scene2501::update); + sendMessage(_class521, 0x2009, 0); + _class521->setVisible(false); + _currTrackIndex = 0; + } else if (which == 1 || which == 2) { + addSprite(_class521); + _kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393); + _klaymanInCar = true; + sendMessage(_kmScene2501, 0x2000, 1); + _kmScene2501->setDoDeltaX(1); + SetMessageHandler(&Scene2501::hmRidingCar); + SetUpdateHandler(&Scene2501::upRidingCar); + _class541->setVisible(false); + _class542->setVisible(false); + _currTrackIndex = which; + } else { + insertKlayman(162, 393); + _kmScene2501 = _klayman; + _klaymanInCar = false; + setMessageList(0x004B2538); + setRectList(0x004B2608); + SetMessageHandler(&Scene2501::handleMessage); + SetUpdateHandler(&Scene2501::update); + sendMessage(_class521, 0x2009, 0); + _class521->setVisible(false); + _currTrackIndex = 0; + } + + // TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); + // TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); + // TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + insertSprite(_class521); + + _pointListsCount = 3; + _newTrackIndex = -1; + _dataResource.load(calcHash("Ashooded")); + + _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); + _class521->setPathPoints(_trackPoints); + + if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_class521, 0x2007, 150); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_class521, 0x2002, 0); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_class521, 0x2008, 150); + } + + _carStatus = 0; + +} + +Scene2501::~Scene2501() { + // Free sprites not currently in the sprite list + if (_klaymanInCar) + delete _kmScene2501; + else + delete _class521; +} + +void Scene2501::update() { + Scene::update(); + if (_carStatus == 1) { + removeSprite(_klayman); + addSprite(_class521); + clearRectList(); + _klaymanInCar = true; + SetMessageHandler(&Scene2501::hmCarAtHome); + SetUpdateHandler(&Scene2501::upCarAtHome); + _class541->setVisible(false); + _class542->setVisible(false); + _class521->setVisible(true); + sendMessage(_class521, 0x2009, 0); + _class521->handleUpdate(); + _klayman = NULL; + _carStatus = 0; + } + updateKlaymanCliprect(); +} + +void Scene2501::upCarAtHome() { + Scene::update(); + if (_mouseClicked) { + if (_mouseClickPos.x <= 210 && _class521->getX() == 211 && _class521->getY() == 400) { + sendMessage(_class521, 0x200A, 0); + SetUpdateHandler(&Scene2501::upGettingOutOfCar); + } else { + findClosestTrack(_mouseClickPos); + SetMessageHandler(&Scene2501::hmRidingCar); + SetUpdateHandler(&Scene2501::upRidingCar); + } + _mouseClicked = false; + } + updateKlaymanCliprect(); +} + +void Scene2501::upGettingOutOfCar() { + Scene::update(); + if (_carStatus == 2) { + _klayman = _kmScene2501; + removeSprite(_class521); + addSprite(_klayman); + _klaymanInCar = false; + SetMessageHandler(&Scene2501::handleMessage); + SetUpdateHandler(&Scene2501::update); + setRectList(0x004B2608); + _class541->setVisible(true); + _class542->setVisible(true); + _class521->setVisible(false); + setMessageList(0x004B2570); + runMessageList(); + _klayman->handleUpdate(); + _carStatus = 0; + } + updateKlaymanCliprect(); +} + +void Scene2501::upRidingCar() { + Scene::update(); + if (_mouseClicked) { + findClosestTrack(_mouseClickPos); + _mouseClicked = false; + } +} + +uint32 Scene2501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x60842040) + _carStatus = 1; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return messageResult; +} + +uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) { + changeTrack(); + } else if (_sceneInfos[_currTrackIndex]->which1 == 0) { + SetMessageHandler(&Scene2501::hmCarAtHome); + SetUpdateHandler(&Scene2501::upCarAtHome); + sendMessage(_class521, 0x200F, 1); + } else if (_sceneInfos[_currTrackIndex]->which1 > 0) { + leaveScene(_sceneInfos[_currTrackIndex]->which1); + } + break; + case 0x2006: + if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) { + changeTrack(); + } else if (_sceneInfos[_currTrackIndex]->which2 == 0) { + SetMessageHandler(&Scene2501::hmCarAtHome); + SetUpdateHandler(&Scene2501::upCarAtHome); + sendMessage(_class521, 0x200F, 1); + } else if (_sceneInfos[_currTrackIndex]->which2 > 0) { + leaveScene(_sceneInfos[_currTrackIndex]->which2); + } + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return messageResult; +} + +uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200A: + _carStatus = 2; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return messageResult; +} + +void Scene2501::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); + _class521->setPathPoints(_trackPoints); + if (_currTrackIndex == 0) { + sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + } else { + sendMessage(_class521, 0x2002, 0); + } + sendPointMessage(_class521, 0x2004, _clickPoint); + _newTrackIndex = -1; +} + +void Scene2501::findClosestTrack(NPoint &pt) { + // TODO NOTE This is uses with minor variations in other scenes, maybe merge them? + int minMatchDistance = 640; + int minMatchTrackIndex = -1; + // Find the track which contains a point closest to pt + for (int infoIndex = 0; infoIndex < _pointListsCount; infoIndex++) { + NPointArray *pointList = _dataResource.getPointArray(_sceneInfos[infoIndex]->pointListName); + for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { + NPoint testPt = (*pointList)[pointIndex]; + int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); + if (distance < minMatchDistance) { + minMatchTrackIndex = infoIndex; + minMatchDistance = distance; + } + } + } + if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { + _newTrackIndex = minMatchTrackIndex; + _clickPoint = pt; + if (_currTrackIndex == 0) + sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + else + sendMessage(_class521, 0x2003, 0); + } else { + _newTrackIndex = -1; + sendMessage(_class521, 0x2004, pt); + } +} + +void Scene2501::updateKlaymanCliprect() { + if (_kmScene2501->getX() <= 211) + _kmScene2501->setClipRect(0, 0, 640, 480); + else + _kmScene2501->setClipRect(0, 0, 640, 388); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h new file mode 100644 index 0000000000..d907d5fbda --- /dev/null +++ b/engines/neverhood/module2500.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2500_H +#define NEVERHOOD_MODULE2500_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/module1600.h" +#include "neverhood/module2700.h" + +namespace Neverhood { + +// Module2500 + +class Module2500 : public Module { +public: + Module2500(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2500(); +protected: + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + int _soundIndex; + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Class541 : public AnimatedSprite { +public: + Class541(NeverhoodEngine *vm, int16 x, int16 y); +}; + +class Class542 : public AnimatedSprite { +public: + Class542(NeverhoodEngine *vm, int16 x, int16 y); +}; + +class Scene2501 : public Scene { +public: + Scene2501(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2501(); +protected: + Class521 *_class521; + Sprite *_class437; + // TODO Sprite *_class517; + // TODO Sprite *_class519; + // TODO Sprite *_class520; + Sprite *_class541; + Sprite *_class542; + Klayman *_kmScene2501; + NPointArray *_trackPoints; + SceneInfo2700 *_sceneInfos[3]; + int _currTrackIndex; + NPoint _clickPoint; + int _pointListsCount; + int _newTrackIndex; + int _carStatus; + bool _klaymanInCar; + void update(); + void upCarAtHome(); + void upGettingOutOfCar(); + void upRidingCar(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); + void findClosestTrack(NPoint &pt); + void changeTrack(); + void updateKlaymanCliprect(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2500_H */ diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 096e33546e..862b832654 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -90,7 +90,6 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) // TODO Music18hList_play(0x04020210, 24, 2, 1); SetMessageHandler(&Module2700::handleMessage); - if (which < 0) { which = _vm->gameState().which; if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31) diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 457d5866d0..d189fad240 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -158,6 +158,11 @@ Sprite *Scene::addSprite(Sprite *sprite) { return sprite; } +void Scene::removeSprite(Sprite *sprite) { + removeSurface(sprite->getSurface()); + removeEntity(sprite); +} + void Scene::setSurfacePriority(BaseSurface *surface, int priority) { surface->setPriority(priority); if (removeSurface(surface)) diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index e962266168..f9e221a6da 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -47,6 +47,7 @@ public: void addSurface(BaseSurface *surface); bool removeSurface(BaseSurface *surface); Sprite *addSprite(Sprite *sprite); + void removeSprite(Sprite *sprite); void setSurfacePriority(BaseSurface *surface, int priority); void deleteSprite(Sprite **sprite); Background *addBackground(Background *background); -- cgit v1.2.3 From 31270bc5e66de42312813e58f4641c0958f1f455 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Sep 2012 07:25:14 +0000 Subject: NEVERHOOD: Add car track tables for Module2500 --- devtools/create_neverhood/tables.h | 13 +++++++++++++ dists/engine-data/neverhood.dat | Bin 23016 -> 23296 bytes 2 files changed, 13 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 044880b9bc..b4f84c2830 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -650,5 +650,18 @@ static const uint32 sceneInfo2700Offsets[] = { 0x004B2628, 0x004B264C, 0x004B2670, + // Scene2502 + 0x004B01B8, + // Scene2503 + 0x004B01E0, + 0x004B0208, + // Scene2505 + 0x004B0230, + // Scene2506 + 0x004B0268, + // Scene2507 + 0x004B02A0, + // Scene2508 + 0x004B02C8, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 9d0e214bc6..1ff9e73a24 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 86c75922fe5c7ee86ce31e39440fe2aca9a09474 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Sep 2012 07:45:05 +0000 Subject: NEVERHOOD: Implement Scene2504 and add all car track scenes --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2500.cpp | 214 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2500.h | 23 +++++ 3 files changed, 238 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 9953492362..844ca58203 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -333,7 +333,7 @@ void GameModule::startup() { createModule(2800, -1); #endif #if 1 - _vm->gameState().which = 2; + _vm->gameState().which = 0; _vm->gameState().sceneNum = 0; createModule(2500, -1); #endif diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 0f746d1488..79a4011b1a 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -24,6 +24,37 @@ namespace Neverhood { +// TODO Maybe move these to the DAT + +static const uint32 kScene2505StaticSprites[] = { + 0x4000A226, + 0 +}; + +static const NRect kScene2505ClipRect = NRect(0, 0, 564, 480); + +static const uint32 kScene2506StaticSprites[] = { + 0x4027AF02, + 0 +}; + +static const NRect kScene2506ClipRect = NRect(0, 0, 640, 441); + +static const uint32 kScene2508StaticSprites1[] = { + 0x2F08E610, + 0xD844E6A0, + 0 +}; + +static const NRect kScene2508ClipRect1 = NRect(0, 0, 594, 448); + +static const uint32 kScene2508StaticSprites2[] = { + 0x2F08E610, + 0 +}; + +static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448); + Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _soundIndex(0) { @@ -55,6 +86,50 @@ void Module2500::createScene(int sceneNum, int which) { case 0: _childObject = new Scene2501(_vm, this, which); break; + case 1: + _vm->gameState().which = which; + createScene2704(which, 0x004B01B8, 220); + break; + case 2: + setGlobalVar(0x98109F12, 1);// TODO DEBUG! Join the tracks. + _vm->gameState().which = which; + if (getGlobalVar(0x98109F12)) + createScene2704(which, 0x004B01E0, 150); + else + createScene2704(which, 0x004B0208, 150); + break; + case 3: + _childObject = new Scene2504(_vm, this, which); + break; + case 4: + _vm->gameState().which = which; + createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect); + break; + case 5: + setGlobalVar(0x21E60190, 1); + _vm->gameState().which = which; + createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect); + break; + case 6: + _vm->gameState().which = which; + createScene2704(which, 0x004B02A0, 150); + break; + case 7: + _vm->gameState().which = which; + if (getGlobalVar(0xD0A14D10)) + createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1); + else + createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2); + break; + case 8: + _childObject = new Scene1608(_vm, this, which); + break; + case 9: + if (getGlobalVar(0xD0A14D10)) + _childObject = new Class152(_vm, this, 0xC62A0645, 0xA0641C6A); + else + _childObject = new Class152(_vm, this, 0x7A343546, 0x435427AB); + break; } SetUpdateHandler(&Module2500::updateScene); _childObject->handleUpdate(); @@ -71,6 +146,54 @@ void Module2500::updateScene() { else leaveModule(0); break; + case 1: + if (_moduleResult == 1) + createScene(3, -1); + else + createScene(0, 2); + break; + case 2: + if (_moduleResult == 1) + createScene(4, 0); + else + createScene(0, 1); + break; + case 3: + createScene(1, 1); + break; + case 4: + if (_moduleResult == 1) + createScene(5, 0); + else + createScene(2, 1); + break; + case 5: + if (_moduleResult == 1) + createScene(6, 0); + else + createScene(4, 1); + break; + case 6: + if (_moduleResult == 1) + createScene(7, 0); + else + createScene(5, 1); + break; + case 7: + if (_moduleResult == 1) + createScene(8, 1); + else + createScene(6, 1); + break; + case 8: + if (_moduleResult == 2) + createScene(9, -1); + else + createScene(7, 1); + break; + case 9: + createScene(8, 2); + break; } } } @@ -101,6 +224,10 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Enti return messageResult; } +void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { + _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); +} + Class541::Class541(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { @@ -384,4 +511,91 @@ void Scene2501::updateKlaymanCliprect() { _kmScene2501->setClipRect(0, 0, 640, 388); } +Class450::Class450(NeverhoodEngine *vm) + : StaticSprite(vm, 1400), _countdown(0), _flag1(false), _soundResource1(vm), + _soundResource2(vm), _soundResource3(vm), _soundResource4(vm) { + + _spriteResource.load2(0x070220D9); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _deltaRect = _drawRect; + processDelta(); + _needRefresh = true; + setVisible(false); + _soundResource3.load(0x44043000); + _soundResource4.load(0x44045000); + _soundResource1.load(0x4600204C); + _soundResource2.load(0x408C0034); + SetMessageHandler(&Class450::handleMessage); + SetUpdateHandler(&Class450::update); +} + +void Class450::update() { + StaticSprite::update(); + if (_flag1 && !_soundResource1.isPlaying() && !_soundResource2.isPlaying()) { + _soundResource4.play(); + setVisible(false); + _flag1 = false; + } + if (_countdown != 0 && (--_countdown) == 0) { + if (getSubVar(0x14800353, 0x01180951)) { + _soundResource1.play(); + } else { + _soundResource2.play(); + } + _flag1 = true; + } +} + +uint32 Class450::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_flag1) { + setVisible(true); + _countdown = 2; + if (getSubVar(0x14800353, 0x01180951)) { + setSubVar(0x14800353, 0x01180951, 0); + } else { + setSubVar(0x14800353, 0x01180951, 1); + } + _soundResource3.play(); + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *class450; + + _surfaceFlag = true; + setBackground(0x90791B80); + setPalette(0x90791B80); + class450 = insertSprite(); + _vm->_collisionMan->addSprite(class450); + insertMouse435(0x91B8490F, 20, 620); + SetMessageHandler(&Scene2504::handleMessage); + SetUpdateHandler(&Scene::update); +} + +uint32 Scene2504::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index d907d5fbda..c3c046e960 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -26,6 +26,7 @@ #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" +#include "neverhood/module1000.h" #include "neverhood/module1600.h" #include "neverhood/module2700.h" @@ -46,6 +47,7 @@ protected: void createScene(int sceneNum, int which); void updateScene(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; class Class541 : public AnimatedSprite { @@ -91,6 +93,27 @@ protected: void updateKlaymanCliprect(); }; +class Class450 : public StaticSprite { +public: + Class450(NeverhoodEngine *vm); +protected: + int _countdown; + bool _flag1; + SoundResource _soundResource1; + SoundResource _soundResource2; + SoundResource _soundResource3; + SoundResource _soundResource4; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2504 : public Scene { +public: + Scene2504(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2500_H */ -- cgit v1.2.3 From bd3dac97819bd92ea7b34bc53248d5168569f15b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Sep 2012 07:47:24 +0000 Subject: NEVERHOOD: Add commented out code (which is TODO) to Module2500 so I don't forget it later --- engines/neverhood/module2500.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 79a4011b1a..3cb2379489 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -77,6 +77,7 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) } Module2500::~Module2500() { + // TODO Music18hList_deleteGroup(0x29220120); } void Module2500::createScene(int sceneNum, int which) { -- cgit v1.2.3 From d4e322bc78d30941f5f3ab31c2460412fe0d7fb5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Sep 2012 17:51:16 +0000 Subject: NEVERHOOD: Add tables for Scene2401 --- devtools/create_neverhood/tables.h | 14 +++++++++++++- dists/engine-data/neverhood.dat | Bin 23296 -> 23810 bytes 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index b4f84c2830..c2f0d6a3fc 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -112,6 +112,8 @@ static const uint32 rectListOffsets[] = { // Scene2247 1, 0x004B5588, 1, 0x004B55C8, + // Scene2401 + 1, 0x004B3140, // Scene2501 1, 0x004B2608, // Scene2801 @@ -392,7 +394,17 @@ static const uint32 messageListOffsets[] = { 4, 0x004B54C0, 5, 0x004B54E0, 5, 0x004B5508, - // Scene 2501 + // Scene2401 + 1, 0x004B2F70, + 1, 0x004B2F80, + 1, 0x004B2F78, + 4, 0x004B3090, + 2, 0x004B30B0, + 6, 0x004B3020, + 2, 0x004B3050, + 4, 0x004B2FA8, + 4, 0x004B2FC8, + // Scene2501 7, 0x004B2538, 6, 0x004B2570, // Scene2801 diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 1ff9e73a24..6f7f62988b 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 402f4bd275f064f0ad7752be7aebfa1634b81fa1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 13 Sep 2012 17:51:44 +0000 Subject: NEVERHOOD: Start with Module2400 - Implement Scene2401 --- engines/neverhood/gamemodule.cpp | 29 ++- engines/neverhood/gamemodule.h | 1 + engines/neverhood/klayman.cpp | 144 +++++++++++ engines/neverhood/klayman.h | 17 ++ engines/neverhood/module.mk | 1 + engines/neverhood/module2400.cpp | 501 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2400.h | 115 +++++++++ 7 files changed, 807 insertions(+), 1 deletion(-) create mode 100644 engines/neverhood/module2400.cpp create mode 100644 engines/neverhood/module2400.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 844ca58203..d657307256 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -37,6 +37,7 @@ #include "neverhood/module2100.h" #include "neverhood/module2200.h" #include "neverhood/module2300.h" +#include "neverhood/module2400.h" #include "neverhood/module2500.h" #include "neverhood/module2600.h" #include "neverhood/module2700.h" @@ -221,6 +222,21 @@ void GameModule::initScene1405Vars() { } +void GameModule::initScene2401Vars() { + + if (getSubVar(0x40050052, 0x40520234)) + return; + + setSubVar(0x90405038, 0, 3); + setSubVar(0x90405038, 1, 1); + setSubVar(0x90405038, 2, 2); + setSubVar(0x90405038, 3, 0); + setSubVar(0x90405038, 4, 4); + + setSubVar(0x40050052, 0x40520234, 1); + +} + void GameModule::initScene2808Vars1() { // Exit if it's already initialized @@ -332,11 +348,15 @@ void GameModule::startup() { _vm->gameState().sceneNum = 11; createModule(2800, -1); #endif -#if 1 +#if 0 _vm->gameState().which = 0; _vm->gameState().sceneNum = 0; createModule(2500, -1); #endif +#if 1 + _vm->gameState().sceneNum = 0; + createModule(2400, -1); +#endif } void GameModule::createModule(int moduleNum, int which) { @@ -400,6 +420,10 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(0x91080831, 0x1A214010); _childObject = new Module2300(_vm, this, which); break; + case 2400: + setGlobalVar(0x91080831, 0x202D1010); + _childObject = new Module2400(_vm, this, which); + break; case 2500: setGlobalVar(0x91080831, 0x29220120); _childObject = new Module2500(_vm, this, which); @@ -523,6 +547,9 @@ void GameModule::updateModule() { createModule(1000, 1); } break; + case 2400: + createModule(2300, 3); + break; case 2500: createModule(2600, 1); break; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index f453feb580..af72d53fc9 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -39,6 +39,7 @@ public: void handleMouseDown(int16 x, int16 y); void initScene1307Vars(); void initScene1405Vars(); + void initScene2401Vars(); void initScene2808Vars1(); void initScene2808Vars2(); void initScene3009Vars(); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 9d28b5f046..9a6e4fe1a1 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5215,6 +5215,150 @@ void KmScene2247::sub453520() { FinalizeState(&Klayman::stStartWalkingDone); } +KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _readyToSpit(false) { + // Empty +} + +uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4816: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnAwayFromUse); + } else if (param.asInteger() == 0) { + GotoState(&Klayman::stTurnToUseHalf); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWalkToFrontNoStep); + } else { + GotoState(&Klayman::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnToFront); + } else { + GotoState(&Klayman::stTurnToBack); + } + break; + case 0x4832: + GotoState(&Klayman::sub421110); + break; + case 0x4833: + if (param.asInteger() == 1) + GotoState(&Klayman::stWonderAboutHalf); + else { + _spitPipeIndex = sendMessage(_parentScene, 0x2000, 0); + GotoState(&KmScene2401::stTrySpitIntoPipe); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +uint32 KmScene2401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x16401CA6) { + _canSpit = true; + if (_contSpit) + spitIntoPipe(); + } else if (param.asInteger() == 0xC11C0008) { + _canSpit = false; + _acceptInput = false; + _readyToSpit = false; + } else if (param.asInteger() == 0x018A0001) { + sendMessage(_parentScene, 0x2001, _spitDestPipeIndex); + } + break; + } + return messageResult; +} + +void KmScene2401::stTrySpitIntoPipe() { + if (_readyToSpit) { + _contSpit = true; + _spitContDestPipeIndex = _spitPipeIndex; + if (_canSpit) + spitIntoPipe(); + } else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) { + _status2 = 2; + _acceptInput = true; + _spitDestPipeIndex = _spitPipeIndex; + _readyToSpit = true; + _canSpit = false; + _contSpit = false; + startAnimation(0x1808B150, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene2401::handleMessage); + SetSpriteUpdate(NULL); + } +} + +void KmScene2401::spitIntoPipe() { + _contSpit = false; + _spitDestPipeIndex = _spitContDestPipeIndex; + _canSpit = false; + _acceptInput = false; + startAnimation(0x1B08B553, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene2401::handleMessage); + SetSpriteUpdate(NULL); + NextState(&KmScene2401::stContSpitIntoPipe); +} + +void KmScene2401::stContSpitIntoPipe() { + _canSpit = true; + _acceptInput = true; + startAnimationByHash(0x1808B150, 0x16401CA6, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&KmScene2401::handleMessage); + SetSpriteUpdate(NULL); +} + KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index fea543cdc9..fdf9b6e9b4 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -578,6 +578,23 @@ protected: void sub453520(); }; +class KmScene2401 : public Klayman { +public: + KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + bool _canSpit; + bool _contSpit; + bool _readyToSpit; + uint32 _spitPipeIndex; + uint32 _spitDestPipeIndex; + uint32 _spitContDestPipeIndex; + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stTrySpitIntoPipe(); + void spitIntoPipe(); + void stContSpitIntoPipe(); +}; + class KmScene2501 : public Klayman { public: KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index ac4064bf81..694d92dbd9 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -25,6 +25,7 @@ MODULE_OBJS = \ module2100.o \ module2200.o \ module2300.o \ + module2400.o \ module2500.o \ module2600.o \ module2700.o \ diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp new file mode 100644 index 0000000000..4febe7429f --- /dev/null +++ b/engines/neverhood/module2400.cpp @@ -0,0 +1,501 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2400.h" + +namespace Neverhood { + +Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + // TODO Music18hList_add(0x202D1010, 0xB110382D); + + if (which < 0) { + createScene(_vm->gameState().sceneNum, _vm->gameState().which); + } else { + createScene(0, 0); + } + +} + +Module2400::~Module2400() { + // TODO Music18hList_deleteGroup(0x202D1010); +} + +void Module2400::createScene(int sceneNum, int which) { + debug("Module2400::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 0: + // TODO Music18hList_stop(0xB110382D, 0, 0); + _childObject = new Scene2401(_vm, this, which); + break; + } + SetUpdateHandler(&Module2400::updateScene); + _childObject->handleUpdate(); +} + +void Module2400::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(1, 0); + else + leaveModule(0); + break; + } + } +} + +static const NPoint kScene2401Points[] = { + {384, 389}, + {406, 389}, + {429, 389}, + {453, 389}, + {477, 389} +}; + +static const uint32 kScene2401FileHashes1[] = { + 0x02842920, + 0x02882920, + 0x02902920, + 0x02A02920, + 0x02C02920, + 0x02002920, + 0x03802920, + 0x00802920, + 0x06802920, + 0x03842920 +}; + +static const uint32 kScene2401FileHashes2[] = { + 0xD0910020, + 0xD0910038, + 0xD0910008, + 0xD0910068, + 0xD09100A8, + 0 +}; + +static const uint32 kScene2401FileHashes3[] = { + 0xD0910020, + 0xD0910038, + 0xD0910008, + 0xD0910068, + 0xD09100A8, + 0 +}; + +static const NRect kScene2401Rects[] = { + NRect(369, 331, 394, 389), + NRect(395, 331, 419, 389), + NRect(420, 331, 441, 389), + NRect(442, 331, 464, 389), + NRect(465, 331, 491, 389) +}; + +static const uint32 kAsScene2401WaterSpitFileHashes2[] = { + 0x5C044690, + 0x5C644690, + 0x5CA44690, + 0x5D244690, + 0x5E244690 +}; + +static const uint32 kAsScene2401WaterSpitFileHashes1[] = { + 0xF4418408, + 0xF4418808, + 0xF4419008, + 0xF441A008, + 0xCD4F8411 +}; + +AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _soundResource(vm) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2401WaterSpit::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + createSurface(100, 146, 74); + _x = 240; + _y = 447; + setVisible(false); +} + +uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x120A0013) + _soundResource.play(kAsScene2401WaterSpitFileHashes1[_soundIndex]); + break; + case 0x2000: + _x = 240; + _y = 447; + _soundIndex = getSubVar(0x0800547C, param.asInteger()); + _soundResource.play(0x48640244); + startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _isWaterFlowing(false) { + + createSurface1(0x10203116, 100); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2401FlowingWater::handleMessage); + _x = 88; + _y = 421; + setVisible(false); +} + +AsScene2401FlowingWater::~AsScene2401FlowingWater() { + // TODO Sound1ChList_sub_407AF0(0x40F11C09); +} + +uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_isWaterFlowing && param.asInteger() == 0x02421405) { + startAnimationByHash(0x10203116, 0x01084280, 0); + } + break; + case 0x2002: + if (!_isWaterFlowing) { + // TODO Sound1ChList_addSoundResource(0x40F11C09, 0x980C1420, true); + // TODO Sound1ChList_playLooping(0x980C1420); + startAnimation(0x10203116, 0, -1); + setVisible(true); + _isWaterFlowing = true; + } + break; + case 0x2003: + // TODO Sound1ChList_deleteSoundByHash(0x980C1420); + _isWaterFlowing = false; + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) { + + createSurface1(0xB8596884, 100); + SetUpdateHandler(&AsScene2401WaterFlushing::update); + SetMessageHandler(&AsScene2401WaterFlushing::handleMessage); + _x = x; + _y = y; + setVisible(false); +} + +void AsScene2401WaterFlushing::update() { + if (_countdown != 0 && (--_countdown) == 0) { + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + startAnimation(0xB8596884, 0, -1); + setVisible(true); + } + AnimatedSprite::update(); +} + +uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) { + startAnimationByHash(0xB8596884, 0x01084280, 0); + _flushLoopCount--; + } + break; + case 0x2002: + if (param.asInteger() > 0) { + _flushLoopCount = param.asInteger() - 1; + _countdown = _vm->_rnd->getRandomNumber(3) + 1; + } + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) + : AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen), _soundResource(vm) { + + createSurface1(0x44687810, 100); + _x = 320; + _y = 240; + _newStickFrameIndex = -2; + SetUpdateHandler(&AsScene2401Door::update); + SetMessageHandler(&AsScene2401Door::handleMessage); + if (_isOpen) { + stopAnimation(); + setVisible(false); + _countdown = 48; + } else { + startAnimation(0x44687810, 0, -1); + _newStickFrameIndex = 0; + } +} + +void AsScene2401Door::update() { + if (_isOpen && _countdown != 0 && (--_countdown) == 0) { + _isOpen = false; + setVisible(true); + startAnimation(0x44687810, -1, -1); + _newStickFrameIndex = 0; + _playBackwards = true; + _soundResource.play(calcHash("fxDoorClose38")); + } + AnimatedSprite::update(); +} + +uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + if (_isOpen) + _countdown = 168; + messageResult = _isOpen ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + if (!_isOpen) { + _countdown = 168; + _isOpen = true; + setVisible(true); + startAnimation(0x44687810, 0, -1); + _soundResource.play(calcHash("fxDoorOpen38")); + NextState(&AsScene2401Door::stDoorOpenFinished); + } + break; + } + return messageResult; +} + +void AsScene2401Door::stDoorOpenFinished() { + stopAnimation(); + setVisible(false); +} + +Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false), + _soundToggle(false), _asWaterSpitIndex(0), _soundResource1(vm), _soundResource2(vm) { + + _vm->gameModule()->initScene2401Vars(); + + setGlobalVar(0x4E0BE910, 1); //DEBUG! Enables water + setGlobalVar(0x45080C38, 1); //DEBUG! Gives the test tube + + _surfaceFlag = true; + SetMessageHandler(&Scene2401::handleMessage); + SetUpdateHandler(&Scene2401::update); + + setRectList(0x004B3140); + setBackground(0x8C030206); + setPalette(0x8C030206); + addEntity(_palette); + _palette->addBasePalette(0x8C030206, 0, 256, 0); + _palette->addPalette(0x91D3A391, 0, 65, 0); + insertMouse433(0x302028C8); + + _sprite1 = insertStaticSprite(0x2E068A23, 200); + insertStaticSprite(0x401410A6, 200); + _asFlowingWater = insertSprite(); + insertStaticSprite(0x90C0A4B4, 200); + _ssButton = insertSprite(this, 0x0092916A, 100, 0); + _ssFloorButton = insertSprite(this, 0x28001120, 0x00911068, 100, 0); + + for (uint i = 0; i < 5; i++) + _asWaterFlushing[i] = insertSprite(kScene2401Points[i].x, kScene2401Points[i].y); + + for (uint i = 0; i < 10; i++) { + _ssWaterPipes[i] = insertStaticSprite(kScene2401FileHashes1[i], 300); + _ssWaterPipes[i]->setVisible(false); + } + + _asWaterSpit[0] = insertSprite(); + _asWaterSpit[1] = insertSprite(); + + if (which < 0) { + insertKlayman(200, 447); + setMessageList(0x004B2F70); + _asDoor = insertSprite(false); + } else if (which == 1) { + insertKlayman(280, 413); + setMessageList(0x004B2F80); + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->addPalette(0xB103B604, 0, 65, 0); + _asDoor = insertSprite(true); + } else { + insertKlayman(-20, 447); + setMessageList(0x004B2F78); + _asDoor = insertSprite(false); + } + +} + +void Scene2401::update() { + + if (_countdown1 != 0 && (--_countdown1) == 0) { + if (_pipeStatus > 0 && _pipeStatus <= 10) + _ssWaterPipes[_pipeStatus - 1]->setVisible(false); + if (_pipeStatus >= 10) { + bool puzzleSolved = true, waterInside = false; + for (uint i = 0; i < 5; i++) { + if (getSubVar(0x0800547C, i) != getSubVar(0x90405038, i)) + puzzleSolved = false; + if (getSubVar(0x0800547C, i) != 0) + waterInside = true; + } + if (puzzleSolved) { + setGlobalVar(0x0045D021, 1); + setGlobalVar(0x86615030, 1); + sendMessage(_asDoor, 0x4808, 0); + } else if (waterInside) { + playPipeSound(0xD0431020); + for (uint i = 0; i < 5; i++) { + sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(0x0800547C, i)); + setSubVar(0x0800547C, i, 0); + } + } + } else if (_pipeStatus >= 5) { + _ssWaterPipes[_pipeStatus]->setVisible(true); + _countdown1 = 8; + playPipeSound(kScene2401FileHashes3[getSubVar(0x0800547C, _pipeStatus - 5)]); + } else { + _ssWaterPipes[_pipeStatus]->setVisible(true); + _countdown1 = _pipeStatus == 4 ? 16 : 8; + playPipeSound(kScene2401FileHashes3[getSubVar(0x90405038, _pipeStatus)]); + } + _pipeStatus++; + } + + if (_countdown2 != 0 && (--_countdown2) == 0) { + sendMessage(_asFlowingWater, 0x2003, 0); + } + + Scene::update(); + +} + +uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + // case 0x0001: TODO DEBUG + // case 0x000D: TODO DEBUG + case 0x100D: + if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klayman, 0x1014, _ssButton); + else if (param.asInteger() == 0x02144CB1) + sendEntityMessage(_klayman, 0x1014, _ssFloorButton); + else if (param.asInteger() == 0x11C40840) { + if (getGlobalVar(0x0045D021) && sendMessage(_asDoor, 0x2004, 0)) { + setMessageList(0x004B3090); + } else { + setMessageList(0x004B30B0); + } + } else if (param.asInteger() == 0x412722C0) { + if (_countdown2 > 0 && getGlobalVar(0x45080C38)) { + _countdown2 = 144; + setMessageList(0x004B3020); + } else { + setMessageList(0x004B3050); + } + } else if (param.asInteger() == 0x21142050) { + if (_flag && _countdown1 == 0 && getGlobalVar(0x86615030) == 0) { + setMessageList(0x004B2FA8); + } else { + setMessageList(0x004B2FC8); + } + } else if (param.asInteger() == 0x87441031) { + setSurfacePriority(_sprite1->getSurface(), 1100); + } else if (param.asInteger() == 0x80C40322) { + setSurfacePriority(_sprite1->getSurface(), 200); + messageList402220(); + _flag = true; + } else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) { + _countdown2 = 12; + } + break; + case 0x2000: + messageResult = 0; + for (uint32 i = 0; i < 5; i++) + if (kScene2401Rects[i].contains(_mouseClickPos.x, _mouseClickPos.y)) { + messageResult = i; + break; + } + break; + case 0x2001: + sendMessage(_asWaterSpit[_asWaterSpitIndex], 0x2000, param.asInteger()); + _asWaterSpitIndex = (_asWaterSpitIndex + 1) & 1; + incSubVar(0x0800547C, param.asInteger(), 1); + if (getSubVar(0x0800547C, param.asInteger()) >= 5) + setSubVar(0x0800547C, param.asInteger(), 4); + break; + case 0x480B: + if (sender == _ssButton) { + _pipeStatus = 0; + _countdown1 = 8; + } else if (sender == _ssFloorButton && getGlobalVar(0x4E0BE910)) { + _countdown2 = 144; + sendMessage(_asFlowingWater, 0x2002, 0); + _soundResource1.play(0xE1130324); + } + break; + case 0x482A: + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + case 0x482B: + _palette->addBasePalette(0x91D3A391, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + } + return messageResult; +} + +void Scene2401::playPipeSound(uint32 fileHash) { + if (_soundToggle) + _soundResource1.play(fileHash); + else + _soundResource2.play(fileHash); + _soundToggle = !_soundToggle; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h new file mode 100644 index 0000000000..c8cdb664c8 --- /dev/null +++ b/engines/neverhood/module2400.h @@ -0,0 +1,115 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2400_H +#define NEVERHOOD_MODULE2400_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1000.h" +#include "neverhood/module1100.h" +#include "neverhood/module2100.h" + +namespace Neverhood { + +// Module2400 + +class Module2400 : public Module { +public: + Module2400(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2400(); +protected: + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401WaterSpit : public AnimatedSprite { +public: + AsScene2401WaterSpit(NeverhoodEngine *vm); +protected: + int _soundIndex; + SoundResource _soundResource; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401FlowingWater : public AnimatedSprite { +public: + AsScene2401FlowingWater(NeverhoodEngine *vm); + virtual ~AsScene2401FlowingWater(); +protected: + bool _isWaterFlowing; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401WaterFlushing : public AnimatedSprite { +public: + AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y); +protected: + int _countdown; + int _flushLoopCount; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401Door : public AnimatedSprite { +public: + AsScene2401Door(NeverhoodEngine *vm, bool isOpen); +protected: + int _countdown; + bool _isOpen; + SoundResource _soundResource; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoorOpenFinished(); +}; + +class Scene2401 : public Scene { +public: + Scene2401(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_asFlowingWater; + Sprite *_ssButton; + Sprite *_ssFloorButton; + Sprite *_asWaterSpit[2]; + Sprite *_ssWaterPipes[10]; + Sprite *_asWaterFlushing[5]; + Sprite *_asDoor; + bool _soundToggle; + bool _flag; + int _countdown1; + int _countdown2; + int _pipeStatus; + int _asWaterSpitIndex; + SoundResource _soundResource1; + SoundResource _soundResource2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void playPipeSound(uint32 fileHash); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2400_H */ -- cgit v1.2.3 From 49f39b0da2bee93e8425c0686f7cc26df443a35f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 10:34:00 +0000 Subject: NEVERHOOD: Add tables for Scene2402 --- devtools/create_neverhood/tables.h | 10 ++++++++++ dists/engine-data/neverhood.dat | Bin 23810 -> 24168 bytes 2 files changed, 10 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index c2f0d6a3fc..5be95ee600 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -114,6 +114,8 @@ static const uint32 rectListOffsets[] = { 1, 0x004B55C8, // Scene2401 1, 0x004B3140, + // Scene2402 + 1, 0x004AF900, // Scene2501 1, 0x004B2608, // Scene2801 @@ -404,6 +406,14 @@ static const uint32 messageListOffsets[] = { 2, 0x004B3050, 4, 0x004B2FA8, 4, 0x004B2FC8, + // Scene2402 + 1, 0x004AF7C8, + 2, 0x004AF7D8, + 1, 0x004AF888, + 1, 0x004AF7D0, + 3, 0x004AF800, + 1, 0x004AF818, + 2, 0x004AF890, // Scene2501 7, 0x004B2538, 6, 0x004B2570, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 6f7f62988b..13bf0bd53f 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 7c2aa2a22556c84fa8ec1d5f6993dfc8c47fb0c3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 10:51:36 +0000 Subject: NEVERHOOD: Implement Scene2402 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 86 ++++++++++++- engines/neverhood/klayman.h | 8 ++ engines/neverhood/module2400.cpp | 266 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2400.h | 49 ++++++++ 5 files changed, 409 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d657307256..dcc0995440 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -354,7 +354,7 @@ void GameModule::startup() { createModule(2500, -1); #endif #if 1 - _vm->gameState().sceneNum = 0; + _vm->gameState().sceneNum = 1; createModule(2400, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 9a6e4fe1a1..17124e58ad 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5282,7 +5282,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4833: if (param.asInteger() == 1) - GotoState(&Klayman::stWonderAboutHalf); + GotoState(&Klayman::stWonderAbout); else { _spitPipeIndex = sendMessage(_parentScene, 0x2000, 0); GotoState(&KmScene2401::stTrySpitIntoPipe); @@ -5359,6 +5359,90 @@ void KmScene2401::stContSpitIntoPipe() { SetSpriteUpdate(NULL); } +KmScene2402::KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (!getGlobalVar(0x92603A79)) + GotoState(&KmScene2402::sub415840); + else + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klayman::stWalking); + } else { + GotoState(&Klayman::stPeekWall); + } + break; + case 0x4812: + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4816: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +void KmScene2402::sub415840() { + if (_x > 260) + setDoDeltaX(1); + _status2 = 0; + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); + _newStickFrameIndex = 10; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteUpdate(NULL); +} + KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index fdf9b6e9b4..7593bf1e3b 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -595,6 +595,14 @@ protected: void stContSpitIntoPipe(); }; +class KmScene2402 : public Klayman { +public: + KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void sub415840(); +}; + class KmScene2501 : public Klayman { public: KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 4febe7429f..1c52d68db8 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -49,6 +49,10 @@ void Module2400::createScene(int sceneNum, int which) { // TODO Music18hList_stop(0xB110382D, 0, 0); _childObject = new Scene2401(_vm, this, which); break; + case 1: + // TODO Music18hList_play(0xB110382D, 0, 2, 1); + _childObject = new Scene2402(_vm, this, which); + break; } SetUpdateHandler(&Module2400::updateScene); _childObject->handleUpdate(); @@ -63,6 +67,14 @@ void Module2400::updateScene() { else leaveModule(0); break; + case 1: + if (_moduleResult == 1) + createScene(5, 0); + else if (_moduleResult == 2) + createScene(7, -1); + else + createScene(0, 1); + break; } } } @@ -497,5 +509,259 @@ void Scene2401::playPipeSound(uint32 fileHash) { _soundResource2.play(fileHash); _soundToggle = !_soundToggle; } + +static const uint32 kScene2402FileHashes[] = { + 0xD0910020, + 0xD0910038, + 0xD0910008, + 0xD0910068, + 0xD09100A8 +}; + +AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _soundResource(vm) { + + SetUpdateHandler(&AsScene2402Door::update); + SetMessageHandler(&AsScene2402Door::handleMessage); + createSurface1(0x80495831, 100); + _x = 320; + _y = 240; + _newStickFrameIndex = -2; + if (_isOpen) { + startAnimation(0x80495831, -1, -1); + _countdown = 48; + } else { + stopAnimation(); + setVisible(false); + } +} + +void AsScene2402Door::update() { + if (_isOpen && _countdown != 0 && (--_countdown) == 0) { + _isOpen = false; + setVisible(true); + startAnimation(0x80495831, -1, -1); + _playBackwards = true; + _soundResource.play(calcHash("fxDoorClose38")); + NextState(&AsScene2402Door::stDoorClosingFinished); + } + AnimatedSprite::update(); +} + +uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (_isOpen) + _countdown = 144; + messageResult = _isOpen ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + _countdown = 144; + _isOpen = true; + setVisible(true); + startAnimation(0x80495831, 0, -1); + _newStickFrameIndex = -2; + _soundResource.play(calcHash("fxDoorOpen38")); + break; + } + return messageResult; +} + +void AsScene2402Door::stDoorClosingFinished() { + sendMessage(_parentScene, 0x2001, 0); + setVisible(false); +} + +AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) + : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0), + _soundResource(vm) { + + createSurface(100, 640, 480); // TODO Use correct size from the two hashes + SetMessageHandler(&Sprite::handleMessage); + _x = 260; + _y = 210; + setDoDeltaX(1); + + if (!getGlobalVar(0x92603A79)) { + _soundResource.load(0x58208810); + _countdown1 = 48; + startAnimation(0x4919397A, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AsScene2402TV::upWait); + } else { + int16 frameIndex; + if (_klayman->getX() > 320) + _currFrameIndex = 29; + frameIndex = CLIP((_klayman->getX() - _x + 150) / 10, 0, 29); + startAnimation(0x050A0103, frameIndex, -1); + _newStickFrameIndex = frameIndex; + _countdown1 = 0; + SetUpdateHandler(&AsScene2402TV::upFocusKlayman); + } + +} + +AsScene2402TV::~AsScene2402TV() { + // TODO Sound1ChList_sub_407AF0(0x01520123); +} + +void AsScene2402TV::upWait() { + if (_countdown1 != 0 && (--_countdown1) == 0) { + startAnimation(0x4919397A, 0, -1); + SetMessageHandler(&AsScene2402TV::hmJoke); + NextState(&AsScene2402TV::stJokeFinished); + } + AnimatedSprite::update(); +} + +void AsScene2402TV::upFocusKlayman() { + int16 frameIndex = CLIP((_klayman->getX() - _x + 150) / 10, 0, 29); + if (frameIndex != _currFrameIndex) { + if (frameIndex > _currFrameIndex) { + _currFrameIndex++; + } else if (frameIndex < _currFrameIndex) { + _currFrameIndex--; + } + startAnimation(0x050A0103, _currFrameIndex, -1); + _newStickFrameIndex = _currFrameIndex; + if (_countdown2 == 0) { + // TODO Sound1ChList_addSoundResource(0x01520123, 0xC42D4528, true); + // TODO Sound1ChList_playLooping(0xC42D4528); + } + _countdown2 = 5; + } else if (_countdown2 != 0 && (--_countdown2 == 0)) { + // TODO Sound1ChList_deleteSoundByHash(0xC42D4528); + } + AnimatedSprite::update(); +} + +void AsScene2402TV::stJokeFinished() { + setGlobalVar(0x92603A79, 1); + startAnimation(0x050A0103, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AsScene2402TV::upFocusKlayman); +} + +uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x431EA0B0) { + _soundResource.play(); + } + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _countdown(0), _soundToggle(false), + _soundResource1(vm), _soundResource2(vm) { + + _surfaceFlag = true; + SetMessageHandler(&Scene2402::handleMessage); + SetUpdateHandler(&Scene2402::update); + + setRectList(0x004AF900); + setBackground(0x81660220); + setPalette(0x81660220); + insertMouse433(0x6022481E); + _asTape = insertSprite(this, 9, 1100, 286, 409, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + _ssButton = insertSprite(this, 0x15288120, 100, 0); + + if (which < 0) { + insertKlayman(198, 404); + setMessageList(0x004AF7C8); + } else if (which == 1) { + insertKlayman(660, 404); + setMessageList(0x004AF7D8); + } else if (which == 2) { + insertKlayman(409, 404); + _klayman->setDoDeltaX(getGlobalVar(0xC0418A02) ? 1 : 0); + setMessageList(0x004AF888); + } else { + insertKlayman(0, 404); + setMessageList(0x004AF7D0); + } + + _sprite1 = insertStaticSprite(0x081A60A8, 1100); + _ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100); + _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, _sprite1->getDrawRect().y2()); + _asDoor = insertSprite(this, which == 1/*CHECKME or != ?*/); + insertSprite(_klayman); + insertStaticSprite(0x3A01A020, 200); + +} + +Scene2402::~Scene2402() { + setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); +} + +void Scene2402::update() { + if (_countdown != 0 && (--_countdown) == 0) { + if (_pipeStatus >= 10) { + sendMessage(_asDoor, 0x4808, 0); + _ssDoorFrame->load(0x00B415E0, true, true); + _ssDoorFrame->update(); + } else if (_pipeStatus >= 5) { + _countdown = 8; + playPipeSound(kScene2402FileHashes[getSubVar(0x0800547C, _pipeStatus - 5)]); + } else { + _countdown = _pipeStatus == 4 ? 16 : 8; + playPipeSound(kScene2402FileHashes[getSubVar(0x90405038, _pipeStatus)]); + } + _pipeStatus++; + } + Scene::update(); +} + +uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) { + sendEntityMessage(_klayman, 0x1014, _ssButton); + } else if (param.asInteger() == 0x01C66840) { + if (sendMessage(_asDoor, 0x2000, 0)) + setMessageList(0x004AF800); + else + setMessageList(0x004AF818); + } + break; + case 0x2001: + _ssDoorFrame->load(0x406C0AE0, true, true); + _ssDoorFrame->update(); + break; + case 0x480B: + if (sender == _ssButton) { + _pipeStatus = 0; + _countdown = 8; + } + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004AF890); + } + break; + } + return messageResult; +} +void Scene2402::playPipeSound(uint32 fileHash) { + if (_soundToggle) + _soundResource1.play(fileHash); + else + _soundResource2.play(fileHash); + _soundToggle = !_soundToggle; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index c8cdb664c8..4367901672 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -29,6 +29,7 @@ #include "neverhood/gamemodule.h" #include "neverhood/module1000.h" #include "neverhood/module1100.h" +#include "neverhood/module1200.h" #include "neverhood/module2100.h" namespace Neverhood { @@ -110,6 +111,54 @@ protected: void playPipeSound(uint32 fileHash); }; +class AsScene2402Door : public AnimatedSprite { +public: + AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen); +protected: + Scene *_parentScene; + int _countdown; + bool _isOpen; + SoundResource _soundResource; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoorClosingFinished(); +}; + +class AsScene2402TV : public AnimatedSprite { +public: + AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman); + virtual ~AsScene2402TV(); +protected: + Klayman *_klayman; + int _countdown1; + int _countdown2; + SoundResource _soundResource; + void upWait(); + void upFocusKlayman(); + void stJokeFinished(); + uint32 hmJoke(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2402 : public Scene { +public: + Scene2402(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2402(); +protected: + Sprite *_sprite1; + Sprite *_asDoor; + Sprite *_ssButton; + Sprite *_asTape; + StaticSprite *_ssDoorFrame; + int _pipeStatus; + int _countdown; + bool _soundToggle; + SoundResource _soundResource1; + SoundResource _soundResource2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void playPipeSound(uint32 fileHash); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2400_H */ -- cgit v1.2.3 From 93614a17a8377a0cf4216c0fe9fbbf83fc82791f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 11:46:28 +0000 Subject: NEVERHOOD: Implement Scene2406 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 91 ++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 7 +++ engines/neverhood/module2400.cpp | 125 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2400.h | 13 ++++ 5 files changed, 237 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index dcc0995440..23f6dbc0bd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -354,7 +354,7 @@ void GameModule::startup() { createModule(2500, -1); #endif #if 1 - _vm->gameState().sceneNum = 1; + _vm->gameState().sceneNum = 5; createModule(2400, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 17124e58ad..cebf71529c 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5443,6 +5443,97 @@ void KmScene2402::sub415840() { SetSpriteUpdate(NULL); } +KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // TODO Cliprects +} + +uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klayman::stWalking); + } else { + GotoState(&Klayman::stPeekWall); + } + break; + case 0x4812: + if (param.asInteger() == 2) + GotoState(&Klayman::stPickUpNeedle); + else if (param.asInteger() == 1) + GotoState(&Klayman::sub41FFF0); + else + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481A: + GotoState(&Klayman::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) + sub41CC40(param.asPoint().y, param.asPoint().x); + else + sub41CCE0(param.asPoint().x); + break; + case 0x481D: + GotoState(&Klayman::stTurnToUse); + break; + case 0x481E: + GotoState(&Klayman::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klayman::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klayman::stClimbLadderHalf); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 7593bf1e3b..0f2077e2a6 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -603,6 +603,13 @@ protected: void sub415840(); }; +class KmScene2406 : public Klayman { +public: + KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2501 : public Klayman { public: KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 1c52d68db8..d161389fc2 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -53,6 +53,10 @@ void Module2400::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xB110382D, 0, 2, 1); _childObject = new Scene2402(_vm, this, which); break; + case 5: + // TODO Music18hList_play(0xB110382D, 0, 2, 1); + _childObject = new Scene2406(_vm, this, which); + break; } SetUpdateHandler(&Module2400::updateScene); _childObject->handleUpdate(); @@ -75,6 +79,16 @@ void Module2400::updateScene() { else createScene(0, 1); break; + case 5: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(4, 0); + else if (_moduleResult == 3) + createScene(8, -1); + else + createScene(1, 1); + break; } } } @@ -764,4 +778,115 @@ void Scene2402::playPipeSound(uint32 fileHash) { _soundToggle = !_soundToggle; } +Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) { + setGlobalVar(0x13382860, 2); + } + + _surfaceFlag = true; + SetMessageHandler(&Scene2406::handleMessage); + + setRectList(0x004B78C8); + insertMouse433(0xB03001A8); + + if (getGlobalVar(0x13382860) == 2) { + _class545 = insertSprite(this, 2, 1100, 560, 409); + _vm->_collisionMan->addSprite(_class545); + } + + _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + + tempSprite = insertStaticSprite(0x19625293, 1100); + _clipRects[0].x1 = 0; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = tempSprite->getDrawRect().x2(); + _clipRects[0].y2 = 480; + + if (getGlobalVar(0x18890C91)) { + setBackground(0x1A0B0304); + setPalette(0x1A0B0304); + _sprite1 = insertStaticSprite(0x32923922, 1100); + } else { + setBackground(0x0A038595); + setPalette(0x0A038595); + _sprite1 = insertStaticSprite(0x1712112A, 1100); + } + + tempSprite = insertStaticSprite(0x22300924, 1300); + + _clipRects[1].x1 = _sprite1->getDrawRect().x; + _clipRects[1].y1 = tempSprite->getDrawRect().y; + _clipRects[1].x2 = 640; + _clipRects[1].y2 = 480; + + if (which < 0) { + _flag1 = false; + insertKlayman(307, 404, _clipRects, 2); + setMessageList(0x004B76C8); + setRectList(0x004B78C8); + } else if (which == 1) { + _flag1 = true; + insertKlayman(253, -16, _clipRects, 2); + setMessageList(0x004B76D8); + setRectList(0x004B78D8); + } else if (which == 2) { + _flag1 = false; + insertKlayman(480, 404, _clipRects, 2); + setMessageList(0x004B77C0); + setRectList(0x004B78C8); + } else if (which == 3) { + _flag1 = false; + insertKlayman(387, 404, _clipRects, 2); + setMessageList(0x004B7810); + setRectList(0x004B78C8); + } else { + _flag1 = false; + insertKlayman(0, 404, _clipRects, 2); + setMessageList(0x004B76D0); + setRectList(0x004B78C8); + } + + tempSprite = insertSprite(_klayman); + tempSprite->setClipRect(_clipRects[1]); + +} + +uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x41062804) { + if (getGlobalVar(0x18890C91)) { + setMessageList(0x004B7758); + } else { + setMessageList(0x004B7738); + } + } + break; + case 0x2000: + _flag1 = true; + setRectList(0x004B78D8); + break; + case 0x2001: + _flag1 = false; + setRectList(0x004B78C8); + break; + case 0x4826: + if (sender == _asTape && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004B77C8); + } else if (sender == _class545 && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _class545); + setMessageList(0x004B77D8); + } + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 4367901672..9a593d8dc9 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -31,6 +31,7 @@ #include "neverhood/module1100.h" #include "neverhood/module1200.h" #include "neverhood/module2100.h" +#include "neverhood/module2200.h" namespace Neverhood { @@ -159,6 +160,18 @@ protected: void playPipeSound(uint32 fileHash); }; +class Scene2406 : public Scene { +public: + Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_asTape; + Sprite *_class545; + NRect _clipRects[2]; + bool _flag1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2400_H */ -- cgit v1.2.3 From 23864562238cacfc4bdd4d6ddc151e900c89c51d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 11:46:43 +0000 Subject: NEVERHOOD: Add tables for Scene2406 --- devtools/create_neverhood/tables.h | 15 ++++++++++++++- dists/engine-data/neverhood.dat | Bin 24168 -> 24794 bytes 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 5be95ee600..2b51b6ecdc 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -116,7 +116,10 @@ static const uint32 rectListOffsets[] = { 1, 0x004B3140, // Scene2402 1, 0x004AF900, - // Scene2501 + // Scene2406 + 1, 0x004B78C8, + 1, 0x004B78D8, + // Scene2501 1, 0x004B2608, // Scene2801 1, 0x004B6CE0, @@ -414,6 +417,16 @@ static const uint32 messageListOffsets[] = { 3, 0x004AF800, 1, 0x004AF818, 2, 0x004AF890, + // Scene2406 + 1, 0x004B76C8, + 3, 0x004B76D8, + 1, 0x004B77C0, + 1, 0x004B7810, + 1, 0x004B76D0, + 2, 0x004B77C8, + 2, 0x004B77D8, + 2, 0x004B7758, + 4, 0x004B7738, // Scene2501 7, 0x004B2538, 6, 0x004B2570, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 13bf0bd53f..a341ae8ebf 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From a94c1fcb8f8b1aac20a20c17a6b4a3bfff931ae6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 14:17:24 +0000 Subject: NEVERHOOD: Add tables for Scene2403 --- devtools/create_neverhood/tables.h | 8 ++++++++ dists/engine-data/neverhood.dat | Bin 24794 -> 25210 bytes 2 files changed, 8 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 2b51b6ecdc..eb210f8daf 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -116,6 +116,9 @@ static const uint32 rectListOffsets[] = { 1, 0x004B3140, // Scene2402 1, 0x004AF900, + // Scene2403 + 1, 0x004B5E18, + 1, 0x004B5E28, // Scene2406 1, 0x004B78C8, 1, 0x004B78D8, @@ -417,6 +420,11 @@ static const uint32 messageListOffsets[] = { 3, 0x004AF800, 1, 0x004AF818, 2, 0x004AF890, + // Scene2403 + 1, 0x004B5C98, + 1, 0x004B5D70, + 4, 0x004B5CA0, + 2, 0x004B5D98, // Scene2406 1, 0x004B76C8, 3, 0x004B76D8, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index a341ae8ebf..26a705e80d 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 1a581543a79ed90547e9db2d741cab66424d5225 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 14:17:39 +0000 Subject: NEVERHOOD: Implement Scene2403 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/klayman.cpp | 86 +++++++++++++++++++++++++++++++ engines/neverhood/klayman.h | 7 +++ engines/neverhood/module2400.cpp | 106 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2400.h | 17 +++++++ 5 files changed, 217 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 23f6dbc0bd..19bdc65fa1 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -354,7 +354,7 @@ void GameModule::startup() { createModule(2500, -1); #endif #if 1 - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 2; createModule(2400, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index cebf71529c..957b9ef6ca 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5443,6 +5443,92 @@ void KmScene2402::sub415840() { SetSpriteUpdate(NULL); } +KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x480D: + GotoState(&Klayman::sub420F60); + break; + case 0x4812: + GotoState(&Klayman::stPickUpGeneric); + break; + case 0x4816: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klayman::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klayman::stClimbLadderHalf); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { // TODO Cliprects diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 0f2077e2a6..b752b1ecdb 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -603,6 +603,13 @@ protected: void sub415840(); }; +class KmScene2403 : public Klayman { +public: + KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2406 : public Klayman { public: KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index d161389fc2..22ea30bb45 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -53,6 +53,10 @@ void Module2400::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xB110382D, 0, 2, 1); _childObject = new Scene2402(_vm, this, which); break; + case 2: + // TODO Music18hList_play(0xB110382D, 0, 0, 1); + _childObject = new Scene2403(_vm, this, which); + break; case 5: // TODO Music18hList_play(0xB110382D, 0, 2, 1); _childObject = new Scene2406(_vm, this, which); @@ -79,6 +83,14 @@ void Module2400::updateScene() { else createScene(0, 1); break; + case 2: + if (_moduleResult == 1) + createScene(9, -1); + else if (_moduleResult == 2) + createScene(6, -1); + else + createScene(5, 1); + break; case 5: if (_moduleResult == 1) createScene(2, 0); @@ -778,6 +790,100 @@ void Scene2402::playPipeSound(uint32 fileHash) { _soundToggle = !_soundToggle; } +Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm) { + + Sprite *tempSprite; + + _surfaceFlag = true; + SetMessageHandler(&Scene2403::handleMessage); + setBackground(0x0C05060C); + setPalette(0x0C05060C); + _palette->addPalette(0x414364B0, 0, 65, 0); + insertMouse433(0x506080C8); + _asTape = insertSprite(this, 2, 1100, 480, 454, 0x9148A011); + _vm->_collisionMan->addSprite(_asTape); + _asLightCord = insertSprite(this, 0xA1095A10, 0x836D3813, 368, 200); + _asLightCord->setClipRect(0, 25, 640, 480); + + if (which < 0) { + _flag1 = false; + insertKlayman(220, 449); + setMessageList(0x004B5C98); + setRectList(0x004B5E18); + } else if (which == 1) { + _flag1 = false; + insertKlayman(433, 449); + setMessageList(0x004B5D70); + setRectList(0x004B5E18); + } else if (which == 2) { + _flag1 = false; + insertKlayman(440, 449); + _klayman->setDoDeltaX(1); + setMessageList(0x004B5C98); + setRectList(0x004B5E18); + } else { + _flag1 = true; + insertKlayman(122, 599); + setMessageList(0x004B5CA0); + setRectList(0x004B5E28); + } + + _ssButton = insertSprite(this, 0x3130B0EB, 100, 0); + _sprite1 = insertStaticSprite(0x20C24220, 1100); + _sprite2 = insertStaticSprite(0x03080900, 1300); + tempSprite = insertSprite(_klayman); + tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); + _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); + + _soundResource2.load(calcHash("fxFogHornSoft")); + +} + +uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040424D0) { + sendEntityMessage(_klayman, 0x1014, _ssButton); + } else if (param.asInteger() == 0x180CE614) { + sendEntityMessage(_klayman, 0x1014, _asLightCord); + } + break; + case 0x2000: + _flag1 = true; + setRectList(0x004B5E28); + break; + case 0x2001: + _flag1 = false; + setRectList(0x004B5E18); + break; + case 0x480B: + if (sender == _ssButton) { + if (getSubVar(0x14800353, 0x304008D2)) { + setSubVar(0x14800353, 0x304008D2, 0); + _soundResource1.play(calcHash("fx3LocksDisable")); + } else { + setSubVar(0x14800353, 0x304008D2, 1); + _soundResource2.play(); + } + } + break; + case 0x480F: + if (sender == _asLightCord) { + leaveScene(2); + } + break; + case 0x4826: + if (sender == _asTape && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asTape); + setMessageList(0x004B5D98); + } + break; + } + return messageResult; +} + Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 9a593d8dc9..16c1d64625 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -32,6 +32,7 @@ #include "neverhood/module1200.h" #include "neverhood/module2100.h" #include "neverhood/module2200.h" +#include "neverhood/module2800.h" namespace Neverhood { @@ -160,6 +161,22 @@ protected: void playPipeSound(uint32 fileHash); }; +class Scene2403 : public Scene { +public: + Scene2403(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_ssButton; + Sprite *_asTape; + Sprite *_class545; + Sprite *_asLightCord; + bool _flag1; + SoundResource _soundResource1; + SoundResource _soundResource2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene2406 : public Scene { public: Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); -- cgit v1.2.3 From ee36d5d5e3ae6f5cb357f3d68c711e2fbfbdef8b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 14:29:54 +0000 Subject: NEVERHOOD: Add remaining scenes in Module2400 --- engines/neverhood/module2400.cpp | 32 ++++++++++++++++++++++++++++++++ engines/neverhood/module2400.h | 1 + 2 files changed, 33 insertions(+) diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 22ea30bb45..02e6225b8a 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -57,10 +57,27 @@ void Module2400::createScene(int sceneNum, int which) { // TODO Music18hList_play(0xB110382D, 0, 0, 1); _childObject = new Scene2403(_vm, this, which); break; + case 4: + // TODO Music18hList_stop(0xB110382D, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 0); + break; case 5: // TODO Music18hList_play(0xB110382D, 0, 2, 1); _childObject = new Scene2406(_vm, this, which); break; + case 6: + // TODO Music18hList_stop(0xB110382D, 0, 2); + createSmackerScene(0x20D80001, true, true, false); + break; + case 7: + _childObject = new Class152(_vm, this, 0x81523218, 0x2321C81D); + break; + case 8: + _childObject = new Class152(_vm, this, 0x08100210, 0x00214089); + break; + case 9: + _childObject = new Class152(_vm, this, 0x8C020505, 0x205018C8); + break; } SetUpdateHandler(&Module2400::updateScene); _childObject->handleUpdate(); @@ -91,6 +108,9 @@ void Module2400::updateScene() { else createScene(5, 1); break; + case 4: + createScene(5, 2); + break; case 5: if (_moduleResult == 1) createScene(2, 0); @@ -101,6 +121,18 @@ void Module2400::updateScene() { else createScene(1, 1); break; + case 6: + createScene(2, 2); + break; + case 7: + createScene(1, 2); + break; + case 8: + createScene(5, 3); + break; + case 9: + createScene(2, 1); + break; } } } diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 16c1d64625..e29f03da9a 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -33,6 +33,7 @@ #include "neverhood/module2100.h" #include "neverhood/module2200.h" #include "neverhood/module2800.h" +#include "neverhood/diskplayerscene.h" namespace Neverhood { -- cgit v1.2.3 From d1d1596fd136783a7bc4db9264ba1627b8511355 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 14 Sep 2012 22:38:31 +0000 Subject: NEVERHOOD: Add support for shadow sprites, used only for the shadow of the car/vehicle thing --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/graphics.cpp | 13 ++++ engines/neverhood/graphics.h | 8 +++ engines/neverhood/module2500.cpp | 6 +- engines/neverhood/module2500.h | 6 +- engines/neverhood/module2700.cpp | 133 ++++++++++++++++++++++++++++++++------- engines/neverhood/module2700.h | 32 ++++++++++ engines/neverhood/screen.cpp | 25 ++++++-- engines/neverhood/screen.h | 7 ++- engines/neverhood/sprite.cpp | 13 +++- engines/neverhood/sprite.h | 3 + 11 files changed, 208 insertions(+), 42 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 19bdc65fa1..6245cc807e 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -339,7 +339,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 8; createModule(2600, -1); #endif -#if 0 +#if 1 _vm->gameState().which = 0; _vm->gameState().sceneNum = 1; createModule(2700, -1); @@ -353,7 +353,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(2500, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 2; createModule(2400, -1); #endif diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 5bb9424f57..a58cdcb4b9 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -131,6 +131,19 @@ void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, N } } +// ShadowSurface + +ShadowSurface::ShadowSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height, BaseSurface *shadowSurface) + : BaseSurface(vm, priority, width, height), _shadowSurface(shadowSurface) { + // Empty +} + +void ShadowSurface::draw() { + if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { + _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _shadowSurface->getSurface()); + } +} + // FontSurface FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 7725e73289..5e91bdb8c6 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -116,6 +116,14 @@ protected: bool _transparent; }; +class ShadowSurface : public BaseSurface { +public: + ShadowSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height, BaseSurface *shadowSurface); + virtual void draw(); +protected: + BaseSurface *_shadowSurface; +}; + class FontSurface : public BaseSurface { public: FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 3cb2379489..84b98af08a 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -303,9 +303,9 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _currTrackIndex = 0; } - // TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); - // TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); - // TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _class517 = insertSprite(_class521, _class437->getSurface(), 4); + _class520 = insertSprite(_class521, _class437->getSurface(), 4); + _class519 = insertSprite(_class521, _class437->getSurface(), 4); insertSprite(_class521); _pointListsCount = 3; diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index c3c046e960..756c75efde 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -67,9 +67,9 @@ public: protected: Class521 *_class521; Sprite *_class437; - // TODO Sprite *_class517; - // TODO Sprite *_class519; - // TODO Sprite *_class520; + Sprite *_class517; + Sprite *_class519; + Sprite *_class520; Sprite *_class541; Sprite *_class542; Klayman *_kmScene2501; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 862b832654..71ce229956 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -512,6 +512,19 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); } +static const NPoint kClass517Points[] = { + {-63, 3}, + {-48, 40}, + {-33, 58}, + { 0, 65}, + { 40, 53}, + { 56, 27}, + { 63, 0}, + {-30, 26}, + { 0, 30}, + { 26, 25} +}; + Class437::Class437(NeverhoodEngine *vm, uint32 fileHash) : StaticSprite(vm, 0) { @@ -524,6 +537,70 @@ Class437::Class437(NeverhoodEngine *vm, uint32 fileHash) StaticSprite::update(); } +Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index) + : AnimatedSprite(vm, 1100), _class521(class521), _index(index), _animFileHash(0) { + + SetUpdateHandler(&Class517::update); + createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource + updateShadow(); +} + +void Class517::update() { + updateShadow(); + AnimatedSprite::update(); +} + +void Class517::updateShadow() { + if (_class521->getFrameIndex() != _currFrameIndex || _class521->getCurrAnimFileHash() != _animFileHash) { + uint32 fileHash = _class521->getCurrAnimFileHash(); + if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 || + fileHash == 0x9966B138 || fileHash == 0xB579A77C || fileHash == 0xA86A9538 || + fileHash == 0xD4220027 || fileHash == 0xD00A1364 || fileHash == 0xD4AA03A4 || + fileHash == 0xF46A0324) { + startAnimation(fileHash, _class521->getFrameIndex(), -1); + _newStickFrameIndex = _class521->getFrameIndex(); + } + _animFileHash = fileHash; + } + _x = _class521->getX() + kClass517Points[_index].x; + _y = _class521->getY() + kClass517Points[_index].y; + if (!_class521->getVisible()) { + startAnimation(0x1209E09F, 0, -1); + _newStickFrameIndex = 0; + } + setDoDeltaX(_class521->isDoDeltaX() ? 1 : 0); +} + +Class519::Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index) + : AnimatedSprite(vm, 1100), _class521(class521), _index(index) { + + SetUpdateHandler(&Class519::update); + createShadowSurface1(shadowSurface, 0x60281C10, 150); + startAnimation(0x60281C10, -1, -1); + _newStickFrameIndex = -2; +} + +void Class519::update() { + _x = _class521->getX() + kClass517Points[_index].x; + _y = _class521->getY() + kClass517Points[_index].y; + AnimatedSprite::update(); +} + +Class520::Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex) + : AnimatedSprite(vm, 1100), _class521(class521) { + + SetUpdateHandler(&Class520::update); + createShadowSurface1(shadowSurface, 0x0759129C, 100); + startAnimation(0x0759129C, frameIndex, -1); + _newStickFrameIndex = frameIndex; +} + +void Class520::update() { + _x = _class521->getX(); + _y = _class521->getY(); + AnimatedSprite::update(); +} + Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -546,17 +623,20 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2()); if (sceneInfo->class437Filename) { - _class437 = insertSprite(sceneInfo->class437Filename); + + _class437 = createSprite(sceneInfo->class437Filename); + addEntity(_class437); + _class521 = insertSprite(this, 320, 240); -//TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); -//TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); -//TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _class517 = insertSprite(_class521, _class437->getSurface(), 4); + _class520 = insertSprite(_class521, _class437->getSurface(), 4); + _class519 = insertSprite(_class521, _class437->getSurface(), 4); } else { _class437 = NULL; _class521 = insertSprite(this, 320, 240); } -//TODO _class518 = insertSprite(_class521); + _class518 = insertSprite(_class521); _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; @@ -578,7 +658,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) } _class521->setClipRect(clipRect); - // TODO _class518->setClipRect(clipRect); + _class518->setClipRect(clipRect); if (which == 1) { SetMessageHandler(&Scene2701::handleMessage42F500); @@ -654,12 +734,14 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B04180); - _class437 = insertSprite(0x12002035); + _class437 = createSprite(0x12002035); + addEntity(_class437); + _class521 = insertSprite(this, 320, 240); - //TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); - //TODO insertSprite(_class521); - //TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); - //TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _class517 = insertSprite(_class521, _class437->getSurface(), 4); + insertSprite(_class521); + _class520 = insertSprite(_class521, _class437->getSurface(), 4); + _class519 = insertSprite(_class521, _class437->getSurface(), 4); _dataResource.load(0x04310014); @@ -828,18 +910,21 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 insertMouse433(sceneInfo->mouseCursorFilename); if (sceneInfo->class437Filename) { - _class437 = insertSprite(sceneInfo->class437Filename); + + _class437 = createSprite(sceneInfo->class437Filename); + addEntity(_class437); + _class521 = insertSprite(this, 320, 240); -//TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); -//TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); -//TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _class517 = insertSprite(_class521, _class437->getSurface(), 4); + _class520 = insertSprite(_class521, _class437->getSurface(), 4); + _class519 = insertSprite(_class521, _class437->getSurface(), 4); } else { _class437 = NULL; -//TODO _class517 = NULL; + _class517 = NULL; _class521 = insertSprite(this, 320, 240); } -//TODO _class518 = insertSprite(_class521); + _class518 = insertSprite(_class521); _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; @@ -871,7 +956,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 if (clipRect) { _class521->getClipRect() = *clipRect; -#if 0 if (_class517) _class517->getClipRect() = *clipRect; if (_class520) @@ -880,7 +964,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _class519->getClipRect() = *clipRect; if (_class518) _class518->getClipRect() = *clipRect; -#endif } } @@ -932,12 +1015,14 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B8C180); - _class437 = insertSprite(0x18808B88); + _class437 = createSprite(0x18808B88); + addEntity(_class437); + _class521 = insertSprite(this, 320, 240); -//TODO _class517 = insertSprite(_class521, _class437->getSurface(), 4); -//TODO _class518 = insertSprite(_class521); -//TODO _class520 = insertSprite(_class521, _class437->getSurface(), 4); -//TODO _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _class517 = insertSprite(_class521, _class437->getSurface(), 4); + _class518 = insertSprite(_class521); + _class520 = insertSprite(_class521, _class437->getSurface(), 4); + _class519 = insertSprite(_class521, _class437->getSurface(), 4); _dataResource.load(0x06000162); diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index f1ef3f5727..bed9a7d829 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -58,6 +58,34 @@ public: Class437(NeverhoodEngine *vm, uint32 fileHash); }; +class Class517 : public AnimatedSprite { +public: + Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index); +protected: + uint _index; + AnimatedSprite *_class521; + uint32 _animFileHash; + void update(); + void updateShadow(); +}; + +class Class519 : public AnimatedSprite { +public: + Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index); +protected: + uint _index; + Sprite *_class521; + void update(); +}; + +class Class520 : public AnimatedSprite { +public: + Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex); +protected: + Sprite *_class521; + void update(); +}; + class Scene2701 : public Scene { public: Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); @@ -104,6 +132,10 @@ public: protected: Class521 *_class521; Sprite *_class437; + Sprite *_class517; + Sprite *_class518; + Sprite *_class520; + Sprite *_class519; int _which1, _which2; NPointArray *_trackPoints; NRectArray *_rectList; diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 351e51a3e9..dfc5358c5b 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -36,6 +36,7 @@ Screen::Screen(NeverhoodEngine *vm) } Screen::~Screen() { + _backScreen->free(); delete _backScreen; } @@ -94,16 +95,17 @@ void Screen::clear() { memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); } -void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent) { +void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, + const Graphics::Surface *shadowSurface) { int16 destX, destY; NRect ddRect; - + if (drawRect.x + drawRect.width >= clipRect.x2) ddRect.x2 = clipRect.x2 - drawRect.x; else ddRect.x2 = drawRect.width; - + if (drawRect.x < clipRect.x1) { destX = clipRect.x1; ddRect.x1 = clipRect.x1 - drawRect.x; @@ -127,7 +129,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, //debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); - blit(surface, destX, destY, ddRect, transparent); + blit(surface, destX, destY, ddRect, transparent, shadowSurface); // Useful for debugging //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); @@ -171,7 +173,8 @@ void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, ND } -void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent) { +void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, + const Graphics::Surface *shadowSurface) { const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); @@ -181,7 +184,17 @@ void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NR if (width <= 0 || height <= 0) return; - if (!transparent) { + if (shadowSurface) { + const byte *shadowSource = (const byte*)shadowSurface->getBasePtr(destX, destY); + while (height--) { + for (int xc = 0; xc < width; xc++) + if (source[xc] != 0) + dest[xc] = shadowSource[xc]; + source += surface->pitch; + shadowSource += shadowSurface->pitch; + dest += _backScreen->pitch; + } + } else if (!transparent) { while (height--) { memcpy(dest, source, width); source += surface->pitch; diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index e813e63f20..07be04cf32 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -42,9 +42,12 @@ public: void testPalette(byte *paletteData); void updatePalette(); void clear(); - void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent); + void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, + const Graphics::Surface *shadowSurface = NULL); void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent); - void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent); + void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect); + void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, + const Graphics::Surface *shadowSurface = NULL); void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent); protected: diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index b68434b493..66f1178a52 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -28,7 +28,7 @@ namespace Neverhood { Sprite::Sprite(NeverhoodEngine *vm, int objectPriority) : Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), - _dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0) { + _dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0), _surface(NULL) { _name = "Sprite"; SetMessageHandler(&Sprite::handleMessage); @@ -438,6 +438,15 @@ void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { _surface = new BaseSurface(_vm, surfacePriority, dimensions.width, dimensions.height); } +void AnimatedSprite::createShadowSurface1(BaseSurface *shadowSurface, uint32 fileHash, int surfacePriority) { + NDimensions dimensions = _animResource.loadSpriteDimensions(fileHash); + _surface = new ShadowSurface(_vm, surfacePriority, dimensions.width, dimensions.height, shadowSurface); +} + +void AnimatedSprite::createShadowSurface(BaseSurface *shadowSurface, int16 width, int16 height, int surfacePriority) { + _surface = new ShadowSurface(_vm, surfacePriority, width, height, shadowSurface); +} + void AnimatedSprite::startAnimation(uint32 fileHash, int16 plFirstFrameIndex, int16 plLastFrameIndex) { debug(2, "AnimatedSprite::startAnimation(%08X, %d, %d)", fileHash, plFirstFrameIndex, plLastFrameIndex); _newAnimFileHash = fileHash; @@ -506,7 +515,7 @@ void AnimatedSprite::gotoNextState() { if (_nextStateCb) { _currStateCb = _nextStateCb; _nextStateCb = NULL; - debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str()); + //debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str()); (this->*_currStateCb)(); #if 0 // TODO } else if (_callbackList) { diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index bc7c0a5247..d34704d7bf 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -58,6 +58,7 @@ public: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void loadDataResource(uint32 fileHash); int16 defFilterY(int16 y); + bool getVisible() const { return _surface->getVisible(); } void setVisible(bool value) { _surface->setVisible(value); } NDrawRect& getDrawRect() { return _surface->getDrawRect(); } // Some shortcuts to set the clipRect @@ -157,6 +158,8 @@ protected: void updateFrameIndex(); void updateFrameInfo(); void createSurface1(uint32 fileHash, int surfacePriority); + void createShadowSurface1(BaseSurface *shadowSurface, uint32 fileHash, int surfacePriority); + void createShadowSurface(BaseSurface *shadowSurface, int16 width, int16 height, int surfacePriority); void stopAnimation(); void startAnimationByHash(uint32 fileHash, uint32 plFirstFrameHash, uint32 plLastFrameHash); void nextAnimationByHash(uint32 fileHash2, uint32 plFirstFrameHash, uint32 plLastFrameHash); -- cgit v1.2.3 From 96153bfe04fff5edc8253226125b225cee6681a0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 19 Sep 2012 11:03:28 +0000 Subject: NEVERHOOD: Implement TextSurface, used in the save/load menus --- engines/neverhood/graphics.cpp | 34 ++++++++++++++++++++++++++++++++++ engines/neverhood/graphics.h | 16 ++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index a58cdcb4b9..b1597f2d5e 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -168,6 +168,40 @@ void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const b } } +// TextSurface + +TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount, + byte firstChar, uint16 charWidth, uint16 charHeight) + : BaseSurface(vm, 0, charWidth * charCount, charHeight * numRows), + _numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), + _fileHash(fileHash), _charCount(charCount) { + + SpriteResource spriteResource(_vm); + spriteResource.load2(_fileHash); + drawSpriteResourceEx(spriteResource, false, false, 0, 0); +} + +void TextSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) { + NDrawRect sourceRect; + chr -= _firstChar; + sourceRect.x = (chr % 16) * _charWidth; + sourceRect.y = (chr / 16) * _charHeight; + sourceRect.width = _charWidth; + sourceRect.height = _charHeight; + destSurface->copyFrom(_surface, x, y, sourceRect, true); +} + +void TextSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) { + for (; stringLen > 0; stringLen--, string++) { + drawChar(destSurface, x, y, *string); + x += _charWidth; + } +} + +int16 TextSurface::getStringWidth(const byte *string, int stringLen) { + return string ? stringLen * _charWidth : 0; +} + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 5e91bdb8c6..3b30b25338 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -137,6 +137,22 @@ protected: uint16 _charHeight; }; +class TextSurface : public BaseSurface { +public: + TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount, + byte firstChar, uint16 charWidth, uint16 charHeight); + void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); + void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen); + int16 getStringWidth(const byte *string, int stringLen); +protected: + uint16 _numRows; + byte _firstChar; + uint16 _charWidth; + uint16 _charHeight; + uint32 _fileHash; + uint _charCount; +}; + // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels); -- cgit v1.2.3 From 65afa25c9f2862fffba5e8a0588547ef52854b35 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 20 Sep 2012 13:28:20 +0000 Subject: NEVERHOOD: Implement the SoundMan; no sound is played yet since the important code doesn't exist yet --- engines/neverhood/module.mk | 1 + engines/neverhood/neverhood.cpp | 4 + engines/neverhood/neverhood.h | 3 + engines/neverhood/resource.cpp | 6 + engines/neverhood/resource.h | 2 + engines/neverhood/sound.cpp | 413 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/sound.h | 122 ++++++++++++ 7 files changed, 551 insertions(+) create mode 100644 engines/neverhood/sound.cpp create mode 100644 engines/neverhood/sound.h diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 694d92dbd9..f9f349b04b 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -41,6 +41,7 @@ MODULE_OBJS = \ screen.o \ smackerscene.o \ smackerplayer.o \ + sound.o \ sprite.o \ staticdata.o diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 7fa6fb0def..abd937497e 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -35,6 +35,7 @@ #include "neverhood/resourceman.h" #include "neverhood/resource.h" #include "neverhood/screen.h" +#include "neverhood/sound.h" #include "neverhood/staticdata.h" namespace Neverhood { @@ -98,6 +99,8 @@ Common::Error NeverhoodEngine::run() { #if 1 + _soundMan = new SoundMan(this); + _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); @@ -145,6 +148,7 @@ Common::Error NeverhoodEngine::run() { delete _gameModule; delete _collisionMan; + delete _soundMan; #endif diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index b7c276efd7..13ea39986a 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -45,6 +45,7 @@ class GameModule; class GameVars; class ResourceMan; class Screen; +class SoundMan; class StaticData; struct NPoint; @@ -84,6 +85,8 @@ public: GameModule *_gameModule; StaticData *_staticData; CollisionMan *_collisionMan; + + SoundMan *_soundMan; public: diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 65f98a8599..7b0aa94b13 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -654,12 +654,18 @@ bool SoundResource::isPlaying() { void SoundResource::load(uint32 fileHash) { } +void SoundResource::unload() { +} + void SoundResource::play(uint32 fileHash, bool looping) { } void SoundResource::play() { } +void SoundResource::setVolume(int volume) { +} + uint32 calcHash(const char *value) { uint32 hash = 0, shiftValue = 0; while (*value != 0) { diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 6436509228..b0cd464e06 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -198,9 +198,11 @@ public: SoundResource(NeverhoodEngine *vm); bool isPlaying(); void load(uint32 fileHash); + void unload(); void play(uint32 fileHash, bool looping = false); void play(); void stop() { /*DUMMY*/ } + void setVolume(int volume); protected: NeverhoodEngine *_vm; }; diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp new file mode 100644 index 0000000000..38ccce9650 --- /dev/null +++ b/engines/neverhood/sound.cpp @@ -0,0 +1,413 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "graphics/palette.h" +#include "neverhood/sound.h" + +namespace Neverhood { + +// TODO Put more stuff into the constructors/destructors of the item structs +// TODO Some parts are quite bad here, but my priority is to get sound working at all + +MusicResource::MusicResource(NeverhoodEngine *vm) + : _vm(vm) { +} + +bool MusicResource::isPlaying() { + return false; +} + +void MusicResource::load(uint32 fileHash) { + // TODO +} + +void MusicResource::unload() { + // TODO +} + +void MusicResource::play(int16 fadeVolumeStep) { + // TODO +} + +void MusicResource::stop(int16 fadeVolumeStep) { + // TODO +} + +SoundMan::SoundMan(NeverhoodEngine *vm) + : _vm(vm), + _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) { +} + +SoundMan::~SoundMan() { + // TODO Clean up +} + +void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) { + MusicItem *musicItem = new MusicItem(); + musicItem->_nameHash = nameHash; + musicItem->_musicFileHash = musicFileHash; + musicItem->_play = false; + musicItem->_stop = false; + musicItem->_fadeVolumeStep = 0; + musicItem->_countdown = 24; + musicItem->_musicResource = new MusicResource(_vm); + musicItem->_musicResource->load(musicFileHash); + // TODO Is this needed? musicItem->_musicResource->init(); + _musicItems.push_back(musicItem); +} + +void SoundMan::deleteMusic(uint32 musicFileHash) { + for (uint i = 0; i < _musicItems.size(); ++i) { + MusicItem *musicItem = _musicItems[i]; + if (musicItem->_musicFileHash == musicFileHash) { + musicItem->_musicResource->unload(); + delete musicItem->_musicResource; + delete musicItem; + _musicItems.remove_at(i); + break; + } + } +} + +void SoundMan::startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) { + for (uint i = 0; i < _musicItems.size(); ++i) { + MusicItem *musicItem = _musicItems[i]; + if (musicItem->_musicFileHash == musicFileHash) { + musicItem->_play = true; + musicItem->_stop = false; + musicItem->_countdown = countdown; + musicItem->_fadeVolumeStep = fadeVolumeStep; + break; + } + } +} + +void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) { + for (uint i = 0; i < _musicItems.size(); ++i) { + MusicItem *musicItem = _musicItems[i]; + if (musicItem->_musicFileHash == musicFileHash) { + musicItem->_play = false; + musicItem->_stop = true; + musicItem->_countdown = countdown; + musicItem->_fadeVolumeStep = fadeVolumeStep; + break; + } + } +} + +void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) { + SoundItem *soundItem = new SoundItem(); + soundItem->_nameHash = nameHash; + soundItem->_soundFileHash = soundFileHash; + soundItem->_playOnceAfterRandomCountdown = false; + soundItem->_minCountdown = 50; + soundItem->_maxCountdown = 600; + soundItem->_playOnceAfterCountdown = false; + soundItem->_initialCountdown = 0; + soundItem->_playLooping = false; + soundItem->_currCountdown = 0; + soundItem->_soundResource = new SoundResource(_vm); + soundItem->_soundResource->load(soundFileHash); + _soundItems.push_back(soundItem); +} + +void SoundMan::addSoundList(uint32 nameHash, uint32 *soundFileHashList) { + while (*soundFileHashList) + addSound(nameHash, *soundFileHashList++); +} + +void SoundMan::deleteSound(uint32 soundFileHash) { + for (uint i = 0; i < _soundItems.size(); ++i) { + SoundItem *soundItem = _soundItems[i]; + if (soundItem->_soundFileHash == soundFileHash) { + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(i); + break; + } + } +} + +void SoundMan::setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown, + int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) { + + SoundItem *soundItem = getSoundItemByHash(soundFileHash); + if (soundItem) { + soundItem->_playOnceAfterCountdown = false; + soundItem->_playLooping = false; + soundItem->_playOnceAfterRandomCountdown = playOnceAfterRandomCountdown; + if (minCountdown > 0) + soundItem->_minCountdown = minCountdown; + if (maxCountdown > 0) + soundItem->_maxCountdown = maxCountdown; + if (firstMinCountdown >= firstMaxCountdown) + soundItem->_currCountdown = firstMinCountdown; + else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown) + soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown); + } +} + +void SoundMan::setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, + int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) { + + while (*soundFileHashList) + setSoundParams(*soundFileHashList++, playOnceAfterRandomCountdown, + minCountdown, maxCountdown, firstMinCountdown, firstMaxCountdown); +} + +void SoundMan::playSoundLooping(uint32 soundFileHash) { + SoundItem *soundItem = getSoundItemByHash(soundFileHash); + if (soundItem) { + soundItem->_playOnceAfterRandomCountdown = false; + soundItem->_playOnceAfterCountdown = false; + soundItem->_playLooping = true; + } +} + +void SoundMan::stopSound(uint32 soundFileHash) { + SoundItem *soundItem = getSoundItemByHash(soundFileHash); + if (soundItem) { + soundItem->_playOnceAfterRandomCountdown = false; + soundItem->_playOnceAfterCountdown = false; + soundItem->_playLooping = false; + soundItem->_soundResource->stop(); + } +} + +void SoundMan::setSoundVolume(uint32 soundFileHash, int volume) { + SoundItem *soundItem = getSoundItemByHash(soundFileHash); + if (soundItem) + soundItem->_soundResource->setVolume(volume); +} + +void SoundMan::update() { + // TODO Check if active + + for (uint i = 0; i < _soundItems.size(); ++i) { + SoundItem *soundItem = _soundItems[i]; + if (soundItem->_playOnceAfterCountdown) { + if (soundItem->_currCountdown == 0) { + soundItem->_currCountdown = soundItem->_initialCountdown; + } else if (--soundItem->_currCountdown == 0) { + soundItem->_soundResource->play(); + } + } else if (soundItem->_playOnceAfterRandomCountdown) { + if (soundItem->_currCountdown == 0) { + if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown) + soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown); + } else if (--soundItem->_currCountdown == 0) { + soundItem->_soundResource->play(); + } + } else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) { + soundItem->_soundResource->play(); // TODO Looping parameter? + } + } + + for (uint i = 0; i < _musicItems.size(); ++i) { + MusicItem *musicItem = _musicItems[i]; + if (musicItem->_countdown) { + --musicItem->_countdown; + } else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) { + musicItem->_musicResource->play(musicItem->_fadeVolumeStep); + musicItem->_fadeVolumeStep = 0; + } else if (musicItem->_stop) { + musicItem->_musicResource->stop(musicItem->_fadeVolumeStep); + musicItem->_fadeVolumeStep = 0; + musicItem->_stop = false; + } + } + +} + +void SoundMan::deleteGroup(uint32 nameHash) { + deleteMusicGroup(nameHash); + deleteSoundGroup(nameHash); +} + +void SoundMan::deleteMusicGroup(uint32 nameHash) { + for (int index = _musicItems.size() - 1; index >= 0; --index) { + MusicItem *musicItem = _musicItems[index]; + if (musicItem->_nameHash == nameHash) { + musicItem->_musicResource->unload(); + delete musicItem->_musicResource; + delete musicItem; + _musicItems.remove_at(index); + } + } +} + +void SoundMan::deleteSoundGroup(uint32 nameHash) { + + SoundItem *soundItem; + + if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) { + soundItem = _soundItems[_soundIndex1]; + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(_soundIndex1); + _soundIndex1 = -1; + } + + if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->_nameHash == nameHash) { + soundItem = _soundItems[_soundIndex2]; + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(_soundIndex2); + _soundIndex2 = -1; + } + + for (int index = _soundItems.size() - 1; index >= 0; --index) { + soundItem = _soundItems[index]; + if (soundItem->_nameHash == nameHash) { + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(index); + } + } + +} + +void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown) { + + SoundItem *soundItem; + int16 currCountdown1 = _initialCountdown; + int16 currCountdown2 = _initialCountdown / 2; + + if (_soundIndex1 != -1) { + soundItem = _soundItems[_soundIndex1]; + currCountdown1 = soundItem->_currCountdown; + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(_soundIndex1); + _soundIndex1 = -1; + } + + if (_soundIndex2 != -1) { + soundItem = _soundItems[_soundIndex2]; + currCountdown2 = soundItem->_currCountdown; + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(_soundIndex2); + _soundIndex2 = -1; + } + + if (initialCountdown > 0) + _initialCountdown = initialCountdown; + + if (soundFileHash1 != 0) { + soundItem = new SoundItem(); + soundItem->_nameHash = nameHash; + soundItem->_soundFileHash = soundFileHash1; + soundItem->_playOnceAfterRandomCountdown = false; + soundItem->_minCountdown = 0; + soundItem->_maxCountdown = 0; + soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown; + soundItem->_initialCountdown = _initialCountdown; + soundItem->_playLooping = false; + soundItem->_currCountdown = currCountdown1; + soundItem->_soundResource = new SoundResource(_vm); + soundItem->_soundResource->load(soundFileHash1); + soundItem->_soundResource->setVolume(80); + _soundIndex1 = _soundItems.size(); + _soundItems.push_back(soundItem); + } + + if (soundFileHash2 != 0) { + soundItem = new SoundItem(); + soundItem->_nameHash = nameHash; + soundItem->_soundFileHash = soundFileHash2; + soundItem->_playOnceAfterRandomCountdown = false; + soundItem->_minCountdown = 0; + soundItem->_maxCountdown = 0; + soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown; + soundItem->_initialCountdown = _initialCountdown; + soundItem->_playLooping = false; + soundItem->_currCountdown = currCountdown2; + soundItem->_soundResource = new SoundResource(_vm); + soundItem->_soundResource->load(soundFileHash2); + soundItem->_soundResource->setVolume(80); + _soundIndex2 = _soundItems.size(); + _soundItems.push_back(soundItem); + } + +} + +void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) { + + SoundItem *soundItem; + + if (_soundIndex3 != -1) { + soundItem = _soundItems[_soundIndex3]; + soundItem->_soundResource->unload(); + delete soundItem->_soundResource; + delete soundItem; + _soundItems.remove_at(_soundIndex3); + _soundIndex3 = -1; + } + + if (soundFileHash != 0) { + soundItem = new SoundItem(); + soundItem->_nameHash = nameHash; + soundItem->_soundFileHash = soundFileHash; + soundItem->_playOnceAfterRandomCountdown = false; + soundItem->_minCountdown = 0; + soundItem->_maxCountdown = 0; + soundItem->_playOnceAfterCountdown = false; + soundItem->_initialCountdown = _initialCountdown3; + soundItem->_playLooping = false; + soundItem->_currCountdown = 0; + soundItem->_soundResource = new SoundResource(_vm); + soundItem->_soundResource->load(soundFileHash); + _soundIndex2 = _soundItems.size(); + _soundItems.push_back(soundItem); + } + +} + +void SoundMan::setTwoSoundsPlayFlag(bool playOnceAfterCountdown) { + if (_soundIndex1 != -1) + _soundItems[_soundIndex1]->_playOnceAfterCountdown = playOnceAfterCountdown; + if (_soundIndex2 != -1) + _soundItems[_soundIndex2]->_playOnceAfterCountdown = playOnceAfterCountdown; + _playOnceAfterCountdown = playOnceAfterCountdown; +} + +void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) { + if (_soundIndex3 != -1) + _soundItems[_soundIndex3]->_playOnceAfterCountdown = playOnceAfterCountdown; + _playOnceAfterCountdown3 = playOnceAfterCountdown; +} + +SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { + for (uint i = 0; i < _soundItems.size(); ++i) + if (_soundItems[i]->_soundFileHash == soundFileHash) + return _soundItems[i]; + return NULL; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h new file mode 100644 index 0000000000..66ed700e1a --- /dev/null +++ b/engines/neverhood/sound.h @@ -0,0 +1,122 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_SOUND_H +#define NEVERHOOD_SOUND_H + +#include "common/array.h" +#include "graphics/surface.h" +#include "neverhood/neverhood.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +class MusicResource { +public: + MusicResource(NeverhoodEngine *vm); + bool isPlaying(); + void load(uint32 fileHash); + void unload(); + void play(int16 fadeVolumeStep); + void stop(int16 fadeVolumeStep); +protected: + NeverhoodEngine *_vm; +}; + +struct MusicItem { + uint32 _nameHash; + uint32 _musicFileHash; + bool _play; + bool _stop; + int16 _fadeVolumeStep; + int16 _countdown; + MusicResource *_musicResource; +}; + +struct SoundItem { + uint32 _nameHash; + uint32 _soundFileHash; + bool _playOnceAfterRandomCountdown; + int16 _minCountdown; + int16 _maxCountdown; + bool _playOnceAfterCountdown; + int16 _initialCountdown; + bool _playLooping; + int16 _currCountdown; + SoundResource *_soundResource; +}; + +class SoundMan { +public: + SoundMan(NeverhoodEngine *vm); + ~SoundMan(); + + // Music + void addMusic(uint32 nameHash, uint32 musicFileHash); + void deleteMusic(uint32 musicFileHash); + void startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep); + void stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep); + + // Sound + void addSound(uint32 nameHash, uint32 soundFileHash); + void addSoundList(uint32 nameHash, uint32 *soundFileHashList); + void deleteSound(uint32 soundFileHash); + void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown, + int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown); + void setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, + int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown); + void playSoundLooping(uint32 soundFileHash); + void stopSound(uint32 soundFileHash); + void setSoundVolume(uint32 soundFileHash, int volume); + + // Misc + void update(); + void deleteGroup(uint32 nameHash); + void deleteMusicGroup(uint32 nameHash); + void deleteSoundGroup(uint32 nameHash); + void playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown); + void playSoundThree(uint32 nameHash, uint32 soundFileHash); + void setTwoSoundsPlayFlag(bool playOnceAfterCountdown); + void setSoundThreePlayFlag(bool playOnceAfterCountdown); + +protected: + NeverhoodEngine *_vm; + + // TODO Find out what these special sounds are used for (door sounds?) + int _soundIndex1, _soundIndex2; + int16 _initialCountdown; + bool _playOnceAfterCountdown; + + int _soundIndex3; + int16 _initialCountdown3; + bool _playOnceAfterCountdown3; + + Common::Array _musicItems; + Common::Array _soundItems; + + SoundItem *getSoundItemByHash(uint32 soundFileHash); + +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_SOUND_H */ -- cgit v1.2.3 From 0bb70c39f084dc122d213b07b1ef2d946608fe88 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 20 Sep 2012 17:55:59 +0000 Subject: NEVERHOOD: More work on the SoundMan - Also changed all sound related function calls which are still TODO to the new names --- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/klayman.cpp | 6 +- engines/neverhood/module1000.cpp | 20 ++-- engines/neverhood/module1100.cpp | 46 ++++---- engines/neverhood/module1200.cpp | 22 ++-- engines/neverhood/module1300.cpp | 78 ++++++------- engines/neverhood/module1400.cpp | 40 +++---- engines/neverhood/module1600.cpp | 8 +- engines/neverhood/module1700.cpp | 20 ++-- engines/neverhood/module1800.cpp | 14 +-- engines/neverhood/module1900.cpp | 6 +- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2100.cpp | 6 +- engines/neverhood/module2200.cpp | 46 ++++---- engines/neverhood/module2300.cpp | 36 +++--- engines/neverhood/module2400.cpp | 32 +++--- engines/neverhood/module2500.cpp | 6 +- engines/neverhood/module2600.cpp | 16 +-- engines/neverhood/module2700.cpp | 24 ++-- engines/neverhood/module2800.cpp | 76 ++++++------- engines/neverhood/module3000.cpp | 68 ++++++------ engines/neverhood/navigationscene.cpp | 12 +- engines/neverhood/sound.cpp | 200 ++++++++++++++-------------------- engines/neverhood/sound.h | 9 ++ 24 files changed, 387 insertions(+), 412 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 6245cc807e..e2494af453 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -51,17 +51,17 @@ GameModule::GameModule(NeverhoodEngine *vm) // Other initializations moved to actual engine class // TODO - // TODO Sound1ChList_sub_407F70(0x2D0031, 0x8861079); + // TODO SoundMan_playSoundThree(0x2D0031, 0x8861079); SetMessageHandler(&GameModule::handleMessage); } GameModule::~GameModule() { - // TODO Sound1ChList_sub_407AF0(0x2D0031); + // TODO SoundMan_deleteSoundGroup(0x2D0031); delete _childObject; _childObject = NULL; // TODO: Set palette to black but probably not neccessary - // TODO Sound1ChList_sub_408480(); + // TODO SoundMan_deinit(); // TODO Set debug vars (maybe) } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 957b9ef6ca..ca30e3bccb 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4733,11 +4733,11 @@ void KmScene2205::sub423980() { KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // TODO Sound1ChList_addSoundResource(0x80101800, 0xD3B02847); + // TODO SoundMan_addSound(0x80101800, 0xD3B02847); } KmScene2206::~KmScene2206() { - // TODO Sound1ChList_sub_407AF0(0x80101800); + // TODO SoundMan_deleteSoundGroup(0x80101800); } void KmScene2206::xUpdate() { @@ -4852,7 +4852,7 @@ void KmScene2206::sub482490() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(&KmScene2206::spriteUpdate482450); - // TODO Sound1ChList_playLooping(0xD3B02847); + // TODO SoundMan_playSoundLooping(0xD3B02847); } } diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index edd9860c11..1c30681401 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -31,8 +31,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) _musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144; - // TODO Music18hList_add(0x03294419, 0x061880C6); - // TODO Music18hList_add(0x03294419, _musicFileHash); + // TODO SoundMan_addMusic(0x03294419, 0x061880C6); + // TODO SoundMan_addMusic(0x03294419, _musicFileHash); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -45,7 +45,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) } Module1000::~Module1000() { - // TODO Music18hList_deleteGroup(0x03294419); + // TODO SoundMan_deleteMusicGroup(0x03294419); } void Module1000::createScene(int sceneNum, int which) { @@ -53,24 +53,24 @@ void Module1000::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO Music18hList_play(0x061880C6, 0, 0, 1); + // TODO SoundMan_startMusic(0x061880C6, 0, 0, 1); _childObject = new Scene1001(_vm, this, which); break; case 1: - // TODO Music18hList_play(0x061880C6, 0, 0, 1); + // TODO SoundMan_startMusic(0x061880C6, 0, 0, 1); _childObject = new Scene1002(_vm, this, which); break; case 2: - // TODO Music18hList_play(0x061880C6, 0, 0); + // TODO SoundMan_startMusic(0x061880C6, 0, 0); _childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00); break; case 3: - // TODO Music18hList_stop(0x061880C6, 0, 2); + // TODO SoundMan_stopMusic(0x061880C6, 0, 2); _childObject = new Scene1004(_vm, this, which); break; case 4: - // TODO Music18hList_stop(0x061880C6, 0, 0); - // TODO Music18hList_play(_musicFileHash, 0, 0, 1); + // TODO SoundMan_stopMusic(0x061880C6, 0, 0); + // TODO SoundMan_startMusic(_musicFileHash, 0, 0, 1); _childObject = new Scene1005(_vm, this, which); break; } @@ -105,7 +105,7 @@ void Module1000::updateScene() { createScene(1, 2); break; case 4: - // TODO Music18hList_stop(_musicFileHash, 0, 1); + // TODO SoundMan_stopMusic(_musicFileHash, 0, 1); createScene(3, 1); break; } diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 1efd7e3ea7..8b73598e03 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -36,16 +36,16 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) createScene(9, 3); } - // TODO Sound1ChList_addSoundResources(0x2C818, dword_4B85B0, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B85B0, true, 50, 600, 20, 250); - // TODO Sound1ChList_setSoundValues(0x74E01054, false, 100, 200, 10, 20); - // TODO Sound1ChList_setVolume(0x74E01054, 60); - // TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F); + // TODO SoundMan_addSoundList(0x2C818, dword_4B85B0, true); + // TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250); + // TODO SoundMan_setSoundParams(0x74E01054, false, 100, 200, 10, 20); + // TODO SoundMan_setSoundVolume(0x74E01054, 60); + // TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F); } Module1100::~Module1100() { - // TODO Sound1ChList_sub_407A50(0x2C818); + // TODO SoundMan_deleteGroup(0x2C818); } void Module1100::createScene(int sceneNum, int which) { @@ -86,11 +86,11 @@ void Module1100::createScene(int sceneNum, int which) { createSmackerScene(0x04180007, true, false, false); break; case 6: - // TODO Sound1ChList_sub_407AF0(0x2C818); + // TODO SoundMan_deleteSoundGroup(0x2C818); createSmackerScene(kSmackerFileHashList06, true, true, false); break; case 7: - // TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0); + // TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0); createSmackerScene(kSmackerFileHashList07, true, true, false); break; case 8: @@ -98,7 +98,7 @@ void Module1100::createScene(int sceneNum, int which) { break; case 1002: _countdown = 40; - // TODO Sound1ChList_sub_4080B0(true); + // TODO SoundMan_setTwoSoundsPlayFlag(true); createSmackerScene(0x00012211, true, true, false); break; } @@ -111,9 +111,9 @@ void Module1100::updateScene() { switch (_vm->gameState().sceneNum) { case 0: _countdown = 0; - // TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64); - // TODO Sound1ChList_setVolume(0x48498E46, 65); - // TODO Sound1ChList_setVolume(0x50399F64, 65); + // TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64); + // TODO SoundMan_setSoundVolume(0x48498E46, 65); + // TODO SoundMan_setSoundVolume(0x50399F64, 65); if (_moduleResult == 0) { createScene(1, 0); } else if (_moduleResult == 1) { @@ -121,7 +121,7 @@ void Module1100::updateScene() { } break; case 1: - // TODO Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F); + // TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F); if (getGlobalVar(0x0C0288F4)) { if (_moduleResult == 0) { createScene(6, -1); @@ -137,7 +137,7 @@ void Module1100::updateScene() { } break; case 2: - // TODO Sound1ChList_setSoundValues(0x74E01054, false, 0, 0, 0, 0); + // TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0); if (_navigationAreaType == 3) { createScene(7, -1); } else if (_moduleResult == 1) { @@ -182,7 +182,7 @@ void Module1100::updateScene() { break; case 1002: _countdown = 0; - // TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64, 0); createScene(1, 1); break; } @@ -191,30 +191,30 @@ void Module1100::updateScene() { case 0: #if 0 // TODO if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { - Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64); - Sound1ChList_setVolume(0x48498E46, 65); - Sound1ChList_setVolume(0x50399F64, 65); + SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64); + SoundMan_setSoundVolume(0x48498E46, 65); + SoundMan_setSoundVolume(0x50399F64, 65); } #endif break; case 1: #if 0 // TODO if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { - Sound1ChList_sub_407C70(0x2C818, 0x41861371, 0x43A2507F); + SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F); } #endif break; case 2: - // TODO Sound1ChList_setSoundValues(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0); + // TODO SoundMan_setSoundParams(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0); break; case 5: case 6: case 7: case 1002: if (_countdown != 0 && (--_countdown == 0)) { - // TODO Sound1ChList_sub_407C70(0x2C818, 0x48498E46, 0x50399F64); - // TODO Sound1ChList_setVolume(0x48498E46, 65); - // TODO Sound1ChList_setVolume(0x50399F64, 65); + // TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64); + // TODO SoundMan_setSoundVolume(0x48498E46, 65); + // TODO SoundMan_setSoundVolume(0x50399F64, 65); } break; } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 96ed46f4d6..7599d7655d 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -39,12 +39,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - // TODO Music18hList_add(0x00478311, 0x62222CAE); - // TODO Music18hList_play(0x62222CAE, 0, 0, 1); + // TODO SoundMan_addMusic(0x00478311, 0x62222CAE); + // TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1); } Module1200::~Module1200() { - // TODO Music18hList_deleteGroup(0x00478311); + // TODO SoundMan_deleteMusicGroup(0x00478311); } void Module1200::createScene(int sceneNum, int which) { @@ -58,7 +58,7 @@ void Module1200::createScene(int sceneNum, int which) { _childObject = new Scene1202(_vm, this, which); break; case 2: - // TODO Music18hList_stop(0x62222CAE, 0, 0); + // TODO SoundMan_stopMusic(0x62222CAE, 0, 0); createSmackerScene(0x31890001, true, true, false); setGlobalVar(0x2A02C07B, 1); break; @@ -87,7 +87,7 @@ void Module1200::updateScene() { createScene(0, 1); break; case 2: - // TODO Music18hList_play(0x62222CAE, 0, 0, 1); + // TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1); createScene(0, 3); break; } @@ -371,7 +371,7 @@ AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sp } AsScene1201TntMan::~AsScene1201TntMan() { - // TODO Sound1ChList_sub_407AF0(0x01D00560); + // TODO SoundMan_deleteSoundGroup(0x01D00560); } uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -426,8 +426,8 @@ void AsScene1201TntMan::sub40CD60() { } void AsScene1201TntMan::sub40CD90() { - // TODO Sound1ChList_addSoundResource(0x01D00560, 0x4B044624, true); - // TODO Sound1ChList_playLooping(0x4B044624); + // TODO SoundMan_addSound(0x01D00560, 0x4B044624, true); + // TODO SoundMan_playSoundLooping(0x4B044624); _flag = true; startAnimation(0x85084190, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); @@ -447,7 +447,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) } Class465::~Class465() { - // TODO Sound1ChList_sub_407AF0(0x041080A4); + // TODO SoundMan_deleteSoundGroup(0x041080A4); } void Class465::update() { @@ -455,8 +455,8 @@ void Class465::update() { if (getGlobalVar(0x20A0C516)) { setVisible(true); SetUpdateHandler(&AnimatedSprite::update); - // TODO Sound1ChList_addSoundResource(0x041080A4, 0x460A1050, true); - // TODO Sound1ChList_playLooping(0x460A1050); + // TODO SoundMan_addSound(0x041080A4, 0x460A1050, true); + // TODO SoundMan_playSoundLooping(0x460A1050); } } diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 2c7a5c8443..b7c588f114 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -35,12 +35,12 @@ namespace Neverhood { Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO Music18hList_add(0x61C090, 0x203197); - // TODO Sound1ChList_addSoundResources(0x61C090, dword_4B2868, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, 0, 50, 600, 20, 150); - // TODO Sound1ChList_sub_407C70(0x61C090, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); + // TODO SoundMan_addMusic(0x61C090, 0x203197); + // TODO SoundMan_addSoundList(0x61C090, dword_4B2868, true); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 50, 600, 20, 150); + // TODO SoundMan_playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_setSoundVolume(0x48498E46, 70); + // TODO SoundMan_setSoundVolume(0x50399F64, 70); if (which < 0) { if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17) @@ -94,7 +94,7 @@ Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) } Module1300::~Module1300() { - // TODO Sound1ChList_sub_407A50(0x61C090); + // TODO SoundMan_deleteGroup(0x61C090); } void Module1300::createScene(int sceneNum, int which) { @@ -102,83 +102,83 @@ void Module1300::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 1: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_startMusic(0x203197, 0, 2, 1); _childObject = new Scene1302(_vm, this, which); break; case 2: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); _childObject = new Scene1303(_vm, this, which); break; case 3: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); _childObject = new Scene1304(_vm, this, which); break; case 4: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_startMusic(0x203197, 0, 2, 1); _childObject = new Scene1305(_vm, this, which); break; case 5: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_startMusic(0x203197, 0, 2, 1); _childObject = new Scene1306(_vm, this, which); break; case 6: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_startMusic(0x203197, 0, 2, 1); _childObject = new Scene1307(_vm, this, which); break; case 7: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_play(0x203197, 0, 2, 1); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_startMusic(0x203197, 0, 2, 1); _childObject = new Scene1308(_vm, this, which); break; case 8: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); _childObject = new DiskplayerScene(_vm, this, 1); break; case 9: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createSmackerScene(0x20082818, true, true, false); break; case 10: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createSmackerScene(0x20082828, true, true, false); break; case 11: - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createNavigationScene(0x004B27A8, which); break; case 12: - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2718, which); break; case 13: - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createNavigationScene(0x004B27D8, which); break; case 14: - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2808, which); break; case 15: - // TODO Sound1ChList_setSoundValuesMulti(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2838, which); break; case 16: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B2868, false, 0, 0, 0, 0); - // TODO Music18hList_stop(0x203197, 0, 2); + // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + // TODO SoundMan_stopMusic(0x203197, 0, 2); _childObject = new Scene1317(_vm, this, which); break; case 17: diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 76bf41bca9..370735695d 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -32,8 +32,8 @@ namespace Neverhood { Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO Music18hList_add(0x00AD0012, 0x06333232); - // TODO Music18hList_add(0x00AD0012, 0x624A220E); + // TODO SoundMan_addMusic(0x00AD0012, 0x06333232); + // TODO SoundMan_addMusic(0x00AD0012, 0x624A220E); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -44,7 +44,7 @@ Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) } Module1400::~Module1400() { - // TODO Music18hList_deleteGroup(0x00AD0012); + // TODO SoundMan_deleteMusicGroup(0x00AD0012); } void Module1400::createScene(int sceneNum, int which) { @@ -52,33 +52,33 @@ void Module1400::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO Music18hList_play(0x06333232, 0, 2, 1); + // TODO SoundMan_startMusic(0x06333232, 0, 2, 1); _childObject = new Scene1401(_vm, this, which); break; case 1: - // TODO Music18hList_stop(0x06333232, 0, 2); - // TODO Music18hList_stop(0x624A220E, 0, 2); + // TODO SoundMan_stopMusic(0x06333232, 0, 2); + // TODO SoundMan_stopMusic(0x624A220E, 0, 2); _childObject = new Scene1402(_vm, this, which); break; case 2: - // TODO Music18hList_stop(0x06333232, 0, 2); - // TODO Music18hList_play(0x624A220E, 0, 2, 1); + // TODO SoundMan_stopMusic(0x06333232, 0, 2); + // TODO SoundMan_startMusic(0x624A220E, 0, 2, 1); _childObject = new Scene1403(_vm, this, which); break; case 3: - // TODO Music18hList_play(0x06333232, 0, 2, 1); + // TODO SoundMan_startMusic(0x06333232, 0, 2, 1); _childObject = new Scene1404(_vm, this, which); break; case 4: - // TODO Music18hList_play(0x06333232, 0, 2, 1); + // TODO SoundMan_startMusic(0x06333232, 0, 2, 1); _childObject = new Scene1405(_vm, this, which); break; case 5: - // TODO Music18hList_stop(0x06333232, 0, 2); + // TODO SoundMan_stopMusic(0x06333232, 0, 2); _childObject = new DiskplayerScene(_vm, this, 2); break; case 6: - // TODO Music18hList_stop(0x06333232, 0, 2); + // TODO SoundMan_stopMusic(0x06333232, 0, 2); _childObject = new Scene1407(_vm, this, which); break; } @@ -148,7 +148,7 @@ Class525::Class525(NeverhoodEngine *vm) } Class525::~Class525() { - // TODO Sound1ChList_sub_407AF0(0x01104C08); + // TODO SoundMan_deleteSoundGroup(0x01104C08); } void Class525::update4662A0() { @@ -157,8 +157,8 @@ void Class525::update4662A0() { sub466460(); } if (_countdown2 != 0 && (--_countdown2 == 0)) { - // TODO Sound1ChList_addSoundResource(0x01104C08, 0x4A116437, true); - // TODO Sound1ChList_playLooping(0x4A116437); + // TODO SoundMan_addSound(0x01104C08, 0x4A116437, true); + // TODO SoundMan_playSoundLooping(0x4A116437); } } @@ -211,7 +211,7 @@ void Class525::sub466420() { } void Class525::sub466460() { - // TODO Sound1ChList_deleteSoundByHash(0x4A116437); + // TODO SoundMan_deleteSound(0x4A116437); _soundResource1.play(0x4A120435); startAnimation(0x4C210500, 0, -1); } @@ -406,7 +406,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr } Class489::~Class489() { - // TODO Sound1ChList_sub_407AF0(0x05331081); + // TODO SoundMan_deleteSoundGroup(0x05331081); } uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -616,8 +616,8 @@ void Class489::sub434EC0() { NextState(&Class489::sub434F40); setGlobalVar(0x12A10DB3, 1); _soundResource1.play(0xCC4A8456); - // TODO Sound1ChList_addSoundResource(0x05331081, 0xCE428854, true); - // TODO Sound1ChList_playLooping(0xCE428854); + // TODO SoundMan_addSound(0x05331081, 0xCE428854, true); + // TODO SoundMan_playSoundLooping(0xCE428854); } void Class489::sub434F40() { @@ -634,7 +634,7 @@ void Class489::sub434F80() { NextState(&Class489::sub434E90); setGlobalVar(0x12A10DB3, 0); _soundResource1.play(0xCC4A8456); - // TODO Sound1ChList_deleteSoundByHash(0xCE428854); + // TODO SoundMan_deleteSound(0xCE428854); } void Class489::sub434FF0() { diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 6519efaf38..77d135d4a6 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -44,14 +44,14 @@ Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - // TODO Sound1ChList_addSoundResources(0x1A008D8, dword_4B3BB0, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B3BB0, true, 50, 600, 5, 150); - // TODO Sound1ChList_sub_407C70(0x1A008D8, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_addSoundList(0x1A008D8, dword_4B3BB0, true); + // TODO SoundMan_setSoundListParams(dword_4B3BB0, true, 50, 600, 5, 150); + // TODO SoundMan_playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0); } Module1600::~Module1600() { - // TODO Sound1ChList_sub_407A50(0x1A008D8); + // TODO SoundMan_deleteGroup(0x1A008D8); } void Module1600::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index f9dc6b7fa8..696f646af1 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -27,10 +27,10 @@ namespace Neverhood { Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource(vm) { - // TODO Music18hList_add(0x04212331); - // TODO Sound1ChList_addSoundResources(0x04212331, dword_4AE930, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 50, 600, 5, 150); - // TODO Sound1ChList_sub_407C70(0x04212331, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_addMusic(0x04212331); + // TODO SoundMan_addSoundList(0x04212331, dword_4AE930, true); + // TODO SoundMan_setSoundListParams(dword_4AE930, true, 50, 600, 5, 150); + // TODO SoundMan_playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -45,7 +45,7 @@ Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) } Module1700::~Module1700() { - // TODO Sound1ChList_sub_407A50(0x04212331); + // TODO SoundMan_deleteGroup(0x04212331); } void Module1700::createScene(int sceneNum, int which) { @@ -53,7 +53,7 @@ void Module1700::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); createSmackerScene(0x3028A005, true, true, false); break; case 1: @@ -63,12 +63,12 @@ void Module1700::createScene(int sceneNum, int which) { createNavigationScene(0x004AE8E8, which); break; case 3: - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); + // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); createSmackerScene(0x01190041, true, true, false); break; case 4: - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 0, 0, 0, 0, 0); - // TODO Music18hList_play(0x31114225, 0, 2, 1); + // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); + // TODO SoundMan_startMusic(0x31114225, 0, 2, 1); _childObject = new Scene1705(_vm, this, which); break; } @@ -80,7 +80,7 @@ void Module1700::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 0: - // TODO Sound1ChList_setSoundValuesMulti(dword_4AE930, 1, 0, 0, 0); + // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0); createScene(1, 0); break; case 1: diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index cce72b0a11..7526a3aa76 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -28,9 +28,9 @@ namespace Neverhood { Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO Sound1ChList_addSoundResources(0x04A14718, dword_4AFE70); - // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 1, 50, 600, 10, 150); - // TODO Sound1ChList_sub_407C70(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); + // TODO SoundMan_addSoundList(0x04A14718, dword_4AFE70); + // TODO SoundMan_setSoundListParams(dword_4AFE70, true, 50, 600, 10, 150); + // TODO SoundMan_playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -45,7 +45,7 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) } Module1800::~Module1800() { - // TODO Sound1ChList_sub_407A50(0x04A14718); + // TODO SoundMan_deleteGroup(0x04A14718); } void Module1800::createScene(int sceneNum, int which) { @@ -73,11 +73,11 @@ void Module1800::createScene(int sceneNum, int which) { createNavigationScene(0x004AFE40, which); break; case 6: - // TODO Sound1ChList_sub_407A50(0x04A14718); + // TODO SoundMan_deleteGroup(0x04A14718); createSmackerScene(0x08D84010, true, true, false); break; case 7: - // TODO Sound1ChList_setSoundValuesMulti(dword_4AFE70, 0, 0, 0, 0, 0); + // TODO SoundMan_setSoundListParams(dword_4AFE70, false, 0, 0, 0, 0); createSmackerScene(0x0168B121, true, true, false); break; case 8: @@ -159,7 +159,7 @@ void Module1800::updateScene() { #if 0 // TODO NavigationScene *navigationScene = (NavigationScene*)_childObject; if (navigationScene->soundFlag1 && navigationScene->index == 2) { - // TODO Sound1ChList_sub_4080B0(false); + // TODO SoundMan_setTwoSoundsPlayFlag(false); } #endif break; diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 45d3b834a5..bf1aad6a49 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -36,13 +36,13 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - // TODO Sound1ChList_addSoundResources(0x04E1C09C, dword_4B8800, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B8800, true, 50, 600, 5, 150); + // TODO SoundMan_addSoundList(0x04E1C09C, dword_4B8800, true); + // TODO SoundMan_setSoundListParams(dword_4B8800, true, 50, 600, 5, 150); } Module1900::~Module1900() { - // TODO Sound1ChList_sub_407A50(0x04E1C09C); + // TODO SoundMan_deleteGroup(0x04E1C09C); } void Module1900::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index bd22c7b154..e07129134c 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -40,7 +40,7 @@ Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) } Module2000::~Module2000() { - // TODO Sound1ChList_sub_407A50(0x81293110); + // TODO SoundMan_deleteGroup(0x81293110); } void Module2000::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index c6de482cf8..33c9d23cbf 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -29,7 +29,7 @@ namespace Neverhood { Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO Music18hList_add(0x10A10C14, 0x11482B95); + // TODO SoundMan_addMusic(0x10A10C14, 0x11482B95); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -44,7 +44,7 @@ Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) } Module2100::~Module2100() { - // TODO Music18hList_deleteGroup(0x10A10C14); + // TODO SoundMan_deleteMusicGroup(0x10A10C14); } void Module2100::createScene(int sceneNum, int which) { @@ -52,7 +52,7 @@ void Module2100::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO Music18hList_play(0x11482B95, 0, 1, 1); + // TODO SoundMan_startMusic(0x11482B95, 0, 1, 1); _childObject = new Scene2101(_vm, this, which); break; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 9846bc5cd4..cbd232e834 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -33,7 +33,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) debug("Create Module2200(%d)", which); - // TODO: Music18hList_add(0x11391412, 0x601C908C); + // TODO: SoundMan_addMusic(0x11391412, 0x601C908C); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -44,7 +44,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) } Module2200::~Module2200() { - // TODO Sound1ChList_sub_407A50(0x11391412); + // TODO SoundMan_deleteGroup(0x11391412); } void Module2200::createScene(int sceneNum, int which) { @@ -57,23 +57,23 @@ void Module2200::createScene(int sceneNum, int which) { _childObject = new Scene2201(_vm, this, which); break; case 1: - // TODO Music18hList_play(0x601C908C, 0, 2, 1); + // TODO SoundMan_startMusic(0x601C908C, 0, 2, 1); _childObject = new Scene2202(_vm, this, which); break; case 2: - // TODO Music18hList_play(0x601C908C, 0, 2, 1); + // TODO SoundMan_startMusic(0x601C908C, 0, 2, 1); _childObject = new Scene2203(_vm, this, which); break; case 3: - // TODO Music18hList_stop(0x601C908C, 0, 2); + // TODO SoundMan_stopMusic(0x601C908C, 0, 2); _childObject = new DiskplayerScene(_vm, this, 3); break; case 4: - // TODO Music18hList_stop(0x601C908C, 0, 2); + // TODO SoundMan_stopMusic(0x601C908C, 0, 2); _childObject = new Scene2205(_vm, this, which); break; case 5: - // TODO Music18hList_stop(0x601C908C, 0, 2); + // TODO SoundMan_stopMusic(0x601C908C, 0, 2); _childObject = new Scene2206(_vm, this, which); break; case 6: @@ -576,19 +576,19 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) insertSprite(); - // TODO Sound1ChList_addSoundResource(0x04106220, 0x81212040, true); + // TODO SoundMan_addSound(0x04106220, 0x81212040, true); } Scene2201::~Scene2201() { setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); - // TODO Sound1ChList_sub_407AF0(0x04106220); + // TODO SoundMan_deleteSoundGroup(0x04106220); } void Scene2201::update() { Scene::update(); if (!_soundFlag) { - // TODO Sound1ChList_playLooping(0x81212040); + // TODO SoundMan_playSoundLooping(0x81212040); _soundFlag = true; } } @@ -918,13 +918,13 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) _soundResource1.load(0x68E25540); _soundResource2.load(0x40400457); - // TODO Sound1ChList_addSoundResource(0x60400854, 0x8101A241, true); - // TODO Sound1ChList_playLooping(0x8101A241); + // TODO SoundMan_addSound(0x60400854, 0x8101A241, true); + // TODO SoundMan_playSoundLooping(0x8101A241); } Scene2202::~Scene2202() { - // TODO Sound1ChList_sub_407AF0(0x60400854); + // TODO SoundMan_deleteSoundGroup(0x60400854); } void Scene2202::update() { @@ -1714,7 +1714,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene } AsScene2207Elevator::~AsScene2207Elevator() { - // TODO Sound1ChList_sub_407AF0(0x02700413); + // TODO SoundMan_deleteSoundGroup(0x02700413); } void AsScene2207Elevator::update() { @@ -1727,7 +1727,7 @@ void AsScene2207Elevator::update() { if (_destPointIndexDelta != 0) { _destPointIndexDelta = 0; } else { - // TODO Sound1ChList_deleteSoundByHash(0xD3B02847); + // TODO SoundMan_deleteSound(0xD3B02847); _soundResource.play(0x53B8284A); } } @@ -1743,7 +1743,7 @@ void AsScene2207Elevator::update() { if (_destPointIndexDelta != 0) { _destPointIndexDelta = 0; } else { - // TODO Sound1ChList_deleteSoundByHash(0xD3B02847); + // TODO SoundMan_deleteSound(0xD3B02847); _soundResource.play(0x53B8284A); } } @@ -1802,8 +1802,8 @@ void AsScene2207Elevator::moveToY(int16 y) { } else { _destPointIndexDelta = 2; } - // TODO Sound1ChList_addSoundResource(0x02700413, 0xD3B02847, true); - // TODO Sound1ChList_playLooping(0xD3B02847); + // TODO SoundMan_addSound(0x02700413, 0xD3B02847, true); + // TODO SoundMan_playSoundLooping(0xD3B02847); } _isMoving = true; @@ -1888,7 +1888,7 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm } AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { - // TODO Sound1ChList_sub_407AF0(0x80D00820); + // TODO SoundMan_deleteSoundGroup(0x80D00820); } uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1897,14 +1897,14 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag case 0x100D: if (!_idle) { if (param.asInteger() == 0x3423093) { - // TODO Sound1ChList_addSoundResource(0x80D00820, 0x12121943, true); - // TODO Sound1ChList_playLooping(0x12121943); + // TODO SoundMan_addSound(0x80D00820, 0x12121943, true); + // TODO SoundMan_playSoundLooping(0x12121943); } else if (param.asInteger() == 0x834AB011) { _soundResource1.stop(); _soundResource2.stop(); _soundResource3.stop(); _soundResource4.stop(); - // TODO Sound1ChList_deleteSoundByHash(0x12121943); + // TODO SoundMan_deleteSound(0x12121943); } else if (param.asInteger() == 0x3A980501) { _soundResource2.play(); } else if (param.asInteger() == 0x2A2AD498) { @@ -1949,7 +1949,7 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() { _soundResource2.stop(); _soundResource3.stop(); _soundResource4.stop(); - // TODO Sound1ChList_deleteSoundByHash(0x12121943); + // TODO SoundMan_deleteSound(0x12121943); _idle = true; setVisible(false); } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 1513f7ba40..d3346eb31f 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -27,20 +27,20 @@ namespace Neverhood { Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _volume(0) { - // TODO Sound1ChList_addSoundResources(0x1A214010, dword_4B6938, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B6938, true, 50, 600, 10, 10, 150); + // TODO SoundMan_addSoundList(0x1A214010, dword_4B6938, true); + // TODO SoundMan_setSoundListParams(dword_4B6938, true, 50, 600, 10, 10, 150); _flag = getGlobalVar(0x10938830) == 0; if (_flag) { - // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); - // TODO Sound1ChList_playLooping(0x90F0D1C3); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, 0); + // TODO SoundMan_playSoundLooping(0x90F0D1C3); } else { - // TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 0, 0, 0, 0); + // TODO SoundMan_setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0); } - // TODO Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_sub_407C70(0x1A214010, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -59,7 +59,7 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) } Module2300::~Module2300() { - // TODO Sound1ChList_sub_407A50(0x1A214010); + // TODO SoundMan_deleteGroup(0x1A214010); } void Module2300::createScene(int sceneNum, int which) { @@ -73,7 +73,7 @@ void Module2300::createScene(int sceneNum, int which) { createNavigationScene(0x004B67E8, which); if (_flag) { _volume = 15; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 15); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, 15); } break; case 2: @@ -83,16 +83,16 @@ void Module2300::createScene(int sceneNum, int which) { if (getGlobalVar(0x10938830)) { createNavigationScene(0x004B68F0, which); } else { - // TODO Sound1ChList_setVolume(0x90F0D1C3, _volume); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, _volume); createNavigationScene(0x004B68A8, which); if (_flag) { _volume = 87; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 87); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, 87); } } break; case 4: - // TODO Sound1ChList_sub_4080B0(true); + // TODO SoundMan_setTwoSoundsPlayFlag(true); createSmackerScene(0x20080A0B, true, true, false); break; } @@ -140,7 +140,7 @@ void Module2300::updateScene() { } break; case 4: - // TODO Sound1ChList_sub_4080B0(false); + // TODO SoundMan_setTwoSoundsPlayFlag(false); createScene(1, 2); break; } @@ -152,15 +152,15 @@ void Module2300::updateScene() { if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { _volume++; - Sound1ChList_setVolume(0x90F0D1C3, _volume); + SoundMan_setSoundVolume(0x90F0D1C3, _volume); } #endif #if 0 // TODO if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { - Sound1ChList_sub_407C70(0x1A214010, 0x48498E46, 0x50399F64); - Sound1ChList_setVolume(0x48498E46, 70); - Sound1ChList_setVolume(0x50399F64, 70); + SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64); + SoundMan_setSoundVolume(0x48498E46, 70); + SoundMan_setSoundVolume(0x50399F64, 70); } #endif break; @@ -170,7 +170,7 @@ void Module2300::updateScene() { if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { _volume--; - Sound1ChList_setVolume(0x90F0D1C3, _volume); + SoundMan_setSoundVolume(0x90F0D1C3, _volume); } #endif break; diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 02e6225b8a..f2f2da97d0 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -27,7 +27,7 @@ namespace Neverhood { Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO Music18hList_add(0x202D1010, 0xB110382D); + // TODO SoundMan_addMusic(0x202D1010, 0xB110382D); if (which < 0) { createScene(_vm->gameState().sceneNum, _vm->gameState().which); @@ -38,7 +38,7 @@ Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) } Module2400::~Module2400() { - // TODO Music18hList_deleteGroup(0x202D1010); + // TODO SoundMan_deleteMusicGroup(0x202D1010); } void Module2400::createScene(int sceneNum, int which) { @@ -46,27 +46,27 @@ void Module2400::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO Music18hList_stop(0xB110382D, 0, 0); + // TODO SoundMan_stopMusic(0xB110382D, 0, 0); _childObject = new Scene2401(_vm, this, which); break; case 1: - // TODO Music18hList_play(0xB110382D, 0, 2, 1); + // TODO SoundMan_startMusic(0xB110382D, 0, 2, 1); _childObject = new Scene2402(_vm, this, which); break; case 2: - // TODO Music18hList_play(0xB110382D, 0, 0, 1); + // TODO SoundMan_startMusic(0xB110382D, 0, 0, 1); _childObject = new Scene2403(_vm, this, which); break; case 4: - // TODO Music18hList_stop(0xB110382D, 0, 2); + // TODO SoundMan_stopMusic(0xB110382D, 0, 2); _childObject = new DiskplayerScene(_vm, this, 0); break; case 5: - // TODO Music18hList_play(0xB110382D, 0, 2, 1); + // TODO SoundMan_startMusic(0xB110382D, 0, 2, 1); _childObject = new Scene2406(_vm, this, which); break; case 6: - // TODO Music18hList_stop(0xB110382D, 0, 2); + // TODO SoundMan_stopMusic(0xB110382D, 0, 2); createSmackerScene(0x20D80001, true, true, false); break; case 7: @@ -247,7 +247,7 @@ AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm) } AsScene2401FlowingWater::~AsScene2401FlowingWater() { - // TODO Sound1ChList_sub_407AF0(0x40F11C09); + // TODO SoundMan_deleteSoundGroup(0x40F11C09); } uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -260,15 +260,15 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam break; case 0x2002: if (!_isWaterFlowing) { - // TODO Sound1ChList_addSoundResource(0x40F11C09, 0x980C1420, true); - // TODO Sound1ChList_playLooping(0x980C1420); + // TODO SoundMan_addSound(0x40F11C09, 0x980C1420, true); + // TODO SoundMan_playSoundLooping(0x980C1420); startAnimation(0x10203116, 0, -1); setVisible(true); _isWaterFlowing = true; } break; case 0x2003: - // TODO Sound1ChList_deleteSoundByHash(0x980C1420); + // TODO SoundMan_deleteSound(0x980C1420); _isWaterFlowing = false; break; case 0x3002: @@ -664,7 +664,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) } AsScene2402TV::~AsScene2402TV() { - // TODO Sound1ChList_sub_407AF0(0x01520123); + // TODO SoundMan_deleteSoundGroup(0x01520123); } void AsScene2402TV::upWait() { @@ -687,12 +687,12 @@ void AsScene2402TV::upFocusKlayman() { startAnimation(0x050A0103, _currFrameIndex, -1); _newStickFrameIndex = _currFrameIndex; if (_countdown2 == 0) { - // TODO Sound1ChList_addSoundResource(0x01520123, 0xC42D4528, true); - // TODO Sound1ChList_playLooping(0xC42D4528); + // TODO SoundMan_addSound(0x01520123, 0xC42D4528, true); + // TODO SoundMan_playSoundLooping(0xC42D4528); } _countdown2 = 5; } else if (_countdown2 != 0 && (--_countdown2 == 0)) { - // TODO Sound1ChList_deleteSoundByHash(0xC42D4528); + // TODO SoundMan_deleteSound(0xC42D4528); } AnimatedSprite::update(); } diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 84b98af08a..822204f36d 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -59,8 +59,8 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _soundIndex(0) { - // TODO Music18hList_add(0x29220120, 0x05343184); - // TODO Music18hList_play(0x05343184, 0, 0, 1); + // TODO SoundMan_addMusic(0x29220120, 0x05343184); + // TODO SoundMan_startMusic(0x05343184, 0, 0, 1); SetMessageHandler(&Module2500::handleMessage); if (which < 0) { @@ -77,7 +77,7 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) } Module2500::~Module2500() { - // TODO Music18hList_deleteGroup(0x29220120); + // TODO SoundMan_deleteMusicGroup(0x29220120); } void Module2500::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 7975fcbb5d..be0503774e 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -35,14 +35,14 @@ Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 1); } - // TODO Sound1ChList_addSoundResources(0x40271018, dword_4B87E8, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B87E8, true, 50, 600, 5, 150); - // TODO Sound1ChList_sub_407C70(0x40271018, 0x41861371, 0x43A2507F); + // TODO SoundMan_addSoundList(0x40271018, dword_4B87E8, true); + // TODO SoundMan_setSoundListParams(dword_4B87E8, true, 50, 600, 5, 150); + // TODO SoundMan_playTwoSounds(0x40271018, 0x41861371, 0x43A2507F); } Module2600::~Module2600() { - // TODO Sound1ChList_sub_407A50(0x40271018); + // TODO SoundMan_deleteGroup(0x40271018); } void Module2600::createScene(int sceneNum, int which) { @@ -72,7 +72,7 @@ void Module2600::createScene(int sceneNum, int which) { createNavigationScene(0x004B8698, which); break; case 7: - // TODO Sound1ChList_sub_407A50(0x40271018); + // TODO SoundMan_deleteGroup(0x40271018); createSmackerScene(0x30090001, true, true, false); break; case 8: @@ -268,7 +268,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) setDoDeltaX(1); createSurface1(0x9C210C90, 1200); setClipRect(260, 260, 400, 368); - // TODO Sound1ChList_addSoundResource(0xDC2769B0, true); + // TODO SoundMan_addSound(0xDC2769B0, true); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2609Water::handleMessage); if (getGlobalVar(0x4E0BE910)) @@ -281,12 +281,12 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m case 0x2001: stopAnimation(); setVisible(false); - // TODO Sound1ChList_stop(0xDC2769B0); + // TODO SoundMan_stopSound(0xDC2769B0); break; case 0x2002: startAnimation(0x9C210C90, 0, -1); setVisible(true); - // TODO Sound1ChList_playLooping(0xDC2769B0); + // TODO SoundMan_playSoundLooping(0xDC2769B0); break; } return messageResult; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 71ce229956..a91eea294b 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -86,8 +86,8 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) { - // TODO Music18hList_add(0x42212411, 0x04020210); - // TODO Music18hList_play(0x04020210, 24, 2, 1); + // TODO SoundMan_addMusic(0x42212411, 0x04020210); + // TODO SoundMan_startMusic(0x04020210, 24, 2, 1); SetMessageHandler(&Module2700::handleMessage); if (which < 0) { @@ -107,7 +107,7 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) } Module2700::~Module2700() { - // TODO Sound1ChList_sub_407A50(0x42212411); + // TODO SoundMan_deleteGroup(0x42212411); } void Module2700::createScene(int sceneNum, int which) { @@ -414,9 +414,9 @@ void Module2700::updateScene() { case 21: // TODO? GameState_sub_469C50(&field_52, 0); // TODO MusicMan_stopAll (if field_52 above = 1) - // TODO Music18hList_delete(_musicFileHash); - // TODO Music18hList_play(0x04020210, 0, 2, 1); - // TODO Sound1ChList_sub_407AF0(0x42212411); + // TODO SoundMan_deleteMusic(_musicFileHash); + // TODO SoundMan_startMusic(0x04020210, 0, 2, 1); + // TODO SoundMan_deleteSoundGroup(0x42212411); createScene(20, 3); break; case 22: @@ -458,15 +458,15 @@ void Module2700::updateScene() { switch (_vm->gameState().sceneNum) { case 21: if (!_flag1) { - // TODO Music18hList_stop(0x04020210, 0, 1); + // TODO SoundMan_stopMusic(0x04020210, 0, 1); // TODO _vm->gameModule()->initScene2801Vars(); _musicFileHash = getGlobalVar(0x89A82A15); // TODO? GameState_sub_469C50(&field_52, 0); - // TODO MusicMan_create(); - // TODO Music18hList_add2(0x42212411, _musicFileHash); - // TODO Music18hList_play2(_musicFileHash, 0, /*TODO */???, 1); - // TODO Sound1ChList_addSoundResource(0x42212411, 0x44014282, true); - // TODO Sound1ChList_setSoundValues(0x44014282, true, 120, 360, 72, 0); + // TODO MusicMan_create(); // Why? + // TODO SoundMan_addMusic(0x42212411, _musicFileHash); + // TODO SoundMan_startMusic(_musicFileHash, 0, /*TODO */???, 1); + // TODO SoundMan_addSound(0x42212411, 0x44014282, true); + // TODO SoundMan_setSoundParams(0x44014282, true, 120, 360, 72, 0); _flag1 = true; } break; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 97fb18f9f2..558819c73c 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -35,7 +35,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) _fileHash = 0; // TODO music stuff - // TODO Music18hList_add(0x64210814, 0xD2FA4D14); + // TODO SoundMan_addMusic(0x64210814, 0xD2FA4D14); setGlobalVar(0x28D8C940, 1); if (which < 0) { @@ -52,7 +52,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) Module2800::~Module2800() { // TODO music stuff - // TODO Sound1ChList_sub_407A50(0x64210814); + // TODO SoundMan_deleteGroup(0x64210814); // TODO Module2800_sub471DF0(); } @@ -61,11 +61,11 @@ void Module2800::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO Music18hList_stop(0xD2FA4D14, 0, 0); + // TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0); _childObject = new Scene2801(_vm, this, which); break; case 1: - // TODO Music18hList_stop(0xD2FA4D14, 0, 0); + // TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0); #if 0 _flag = true; // DEBUG! if (_flag) { @@ -76,7 +76,7 @@ void Module2800::createScene(int sceneNum, int which) { #endif break; case 2: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); //setGlobalVar(0x1860C990,1);//DEBUG if (getGlobalVar(0x1860C990)) _childObject = new Scene2803b(_vm, this, which); @@ -87,98 +87,98 @@ void Module2800::createScene(int sceneNum, int which) { _childObject = new Scene2804(_vm, this, which); break; case 4: - // TODO Music18hList_stop(0xD2FA4D14, 0, 2); + // TODO SoundMan_stopMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); break; case 5: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2806(_vm, this, which); break; case 6: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2807(_vm, this, which); break; case 7: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 0); break; case 8: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2809(_vm, this, which); break; case 9: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2810(_vm, this, which); break; case 10: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2808(_vm, this, 1); break; case 11: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2812(_vm, this, which); break; case 12: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008); break; case 13: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x81C60635, 0x60631814); break; case 14: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0); break; case 15: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC); break; case 16: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0); break; case 17: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018); break; case 18: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018); break; case 19: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x10866205, 0x66201100); break; case 20: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x01C58000, 0x58004014); break; case 21: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Scene2822(_vm, this, which); break; case 22: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948); break; case 23: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040); break; case 24: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A); break; case 25: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); if (getGlobalVar(0x190A1D18)) _childObject = new Class152(_vm, this, 0x01600204, 0x0020001E); else _childObject = new Class152(_vm, this, 0x08611204, 0x1120008E); break; case 26: - // TODO Music18hList_play(0xD2FA4D14, 0, 2, 1); + // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); _childObject = new DiskplayerScene(_vm, this, 4); break; // @@ -1527,7 +1527,7 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene _needRefresh = true; AnimatedSprite::updatePosition(); _soundResource.load(0x6352F051); - // TODO Sound1ChList_addSoundResource(0xC5EA0B28, 0xEF56B094, true); + // TODO SoundMan_addSound(0xC5EA0B28, 0xEF56B094, true); SetUpdateHandler(&AsScene2804BeamCoil::update); SetMessageHandler(&AsScene2804BeamCoil::handleMessage); } @@ -1572,13 +1572,13 @@ void AsScene2804BeamCoil::hide() { setVisible(false); _ssBeamCoilBody->setVisible(false); // TODO _ssBeamCoilBody->update(); -> hide() - // TODO Sound1ChList_stop(0xEF56B094); + // TODO SoundMan_stopSound(0xEF56B094); } void AsScene2804BeamCoil::stBeaming() { startAnimation(0x00494891, 93, -1); NextState(&AsScene2804BeamCoil::stBeaming); - // TODO Sound1ChList_playLooping(0xEF56B094); + // TODO SoundMan_playSoundLooping(0xEF56B094); } uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2735,9 +2735,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE738); _klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); - // TODO Sound1ChList_addSoundResource(0x84400112, 0xC874EE6C, true); - // TODO Sound1ChList_playLooping(0xC874EE6C); - // TODO Sound1ChList_setVolume(0xC874EE6C, 50); + // TODO SoundMan_addSound(0x84400112, 0xC874EE6C, true); + // TODO SoundMan_playSoundLooping(0xC874EE6C); + // TODO SoundMan_setSoundVolume(0xC874EE6C, 50); _flag1 = false; } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { if (getGlobalVar(0x1860C990)) { @@ -2798,7 +2798,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) Scene2810::~Scene2810() { setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); setGlobalVar(0x00D30138, _klayman->getX()); - // TODO Sound1ChList_sub_407AF0(0x84400112); + // TODO SoundMan_deleteSoundGroup(0x84400112); } void Scene2810::sub406650() { @@ -2887,7 +2887,7 @@ AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm) } AsScene2812Winch::~AsScene2812Winch() { - // TODO Sound1ChList_sub_407AF0(0x00B000E2); + // TODO SoundMan_deleteSoundGroup(0x00B000E2); } uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2896,8 +2896,8 @@ uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m case 0x2000: startAnimation(0x20DA08A0, 0, -1); setVisible(true); - // TODO Sound1ChList_addSoundResource(0x00B000E2, 0xC874EE6C, true); - // TODO Sound1ChList_playLooping(0xC874EE6C); + // TODO SoundMan_addSound(0x00B000E2, 0xC874EE6C, true); + // TODO SoundMan_playSoundLooping(0xC874EE6C); break; case 0x3002: startAnimation(0x20DA08A0, 7, -1); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 8c797f3e61..ab86c48fc8 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -29,18 +29,18 @@ namespace Neverhood { Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundVolume(0) { - // TODO Sound1ChList_addSoundResources(0x81293110, dword_4B7FC8, true); - // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 1, 50, 600, 5, 150); - // TODO Sound1ChList_setSoundValues(0x90F0D1C3, false, 20000, 30000, 20000, 30000); - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_addSoundList(0x81293110, dword_4B7FC8, true); + // TODO SoundMan_setSoundListParams(dword_4B7FC8, true, 50, 600, 5, 150); + // TODO SoundMan_setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000); + // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); _flag = getGlobalVar(0x10938830) != 0; if (_flag) { - // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); - // TODO Sound1ChList_playLooping(0x90F0D1C3); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, 0); + // TODO SoundMan_playSoundLooping(0x90F0D1C3); } if (which < 0) { @@ -58,7 +58,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) } Module3000::~Module3000() { - // TODO Sound1ChList_sub_407A50(0x81293110); + // TODO SoundMan_deleteGroup(0x81293110); } void Module3000::createScene(int sceneNum, int which) { @@ -77,10 +77,10 @@ void Module3000::createScene(int sceneNum, int which) { } break; case 2: - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); if (_flag) { _soundVolume = 90; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 90); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, 90); } if (getGlobalVar(0x10938830)) { createNavigationScene(0x004B7D58, which); @@ -109,7 +109,7 @@ void Module3000::createScene(int sceneNum, int which) { createNavigationScene(0x004B7FB0, which, kNavigationTypes06); break; case 7: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); + // TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0); if (!getSubVar(0x40050052, 0x089809C2)) { setSubVar(0x40050052, 0x089809C2, 1); createSmackerScene(0x90022001, true, true, false); @@ -126,7 +126,7 @@ void Module3000::createScene(int sceneNum, int which) { _childObject = new Scene3011(_vm, this, 0); break; case 11: - // TODO Sound1ChList_setSoundValuesMulti(dword_4B7FC8, 0, 0, 0, 0, 0); + // TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0); if (!getSubVar(0x40050052, 0x10130993)) { setSubVar(0x40050052, 0x10130993, 1); createSmackerScene(0x31093019, true, true, false); @@ -181,10 +181,10 @@ void Module3000::updateScene() { } break; case 2: - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); if (_flag) { _soundVolume = 0; - // TODO Sound1ChList_setVolume(0x90F0D1C3, 0); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, 0); } if (_moduleResult == 0) { createScene(3, 0); @@ -229,12 +229,12 @@ void Module3000::updateScene() { case 8: _flag = getGlobalVar(0x10938830); // CHECKME if (_moduleResult != 1) { - // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0): + // TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0): createScene(4, 1); } else if (getGlobalVar(0xF0402B0A)) { createScene(1008, -1); } else { - // TODO: Sound1ChList_setSoundValuesMulti(dword_4B7FC8, true, 0, 0, 0, 0); + // TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0); createScene(4, 1); } break; @@ -275,26 +275,26 @@ void Module3000::updateScene() { int navigationIndex = navigationScene()->getIndex(); if (navigationIndex == 1) { if (frameNumber == 0) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); + // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_setSoundVolume(0x48498E46, 70); + // TODO SoundMan_setSoundVolume(0x50399F64, 70); } else if (frameNumber == 100) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); } } else if (navigationIndex == 0) { if (frameNumber == 0) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); + // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_setSoundVolume(0x48498E46, 70); + // TODO SoundMan_setSoundVolume(0x50399F64, 70); } else if (frameNumber == 10) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); } if (_flag && _soundVolume < 90 && frameNumber % 2) { if (frameNumber == 0) _soundVolume = 40; else _soundVolume++; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume); } } } @@ -307,17 +307,17 @@ void Module3000::updateScene() { int navigationIndex = navigationScene()->getIndex(); if (_flag && _soundVolume > 1 && frameNumber % 2) { _soundVolume--; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume); } if (navigationIndex == 0) { if (frameNumber == 35) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x41861371, 0x43A2507F, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); } } else if (navigationIndex == 1) { if (frameNumber == 55) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO Sound1ChList_setVolume(0x48498E46, 70); - // TODO Sound1ChList_setVolume(0x50399F64, 70); + // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + // TODO SoundMan_setSoundVolume(0x48498E46, 70); + // TODO SoundMan_setSoundVolume(0x50399F64, 70); } } } @@ -330,14 +330,14 @@ void Module3000::updateScene() { int navigationIndex = navigationScene()->getIndex(); if (navigationIndex == 2) { if (frameNumber == 40) { - // TODO Sound1ChList_sub_407C70(0x81293110, 0x40030A51, 0xC862CA15, 0); + // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); } if (_flag && _soundVolume < 90 && frameNumber % 2) { if (frameNumber == 0) _soundVolume = 40; else _soundVolume++; - // TODO Sound1ChList_setVolume(0x90F0D1C3, _soundVolume); + // TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume); } } } @@ -346,7 +346,7 @@ void Module3000::updateScene() { case 5: #if 0 // ALL TODO if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { - // TODO Sound1ChList_sub_4080B0(false); + // TODO SoundMan_setTwoSoundsPlayFlag(false); } #endif break; diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 7a3161cb47..981e703c2e 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -60,8 +60,8 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint } NavigationScene::~NavigationScene() { - // TODO Sound1ChList_sub_4080B0(0); - // TODO Sound1ChList_sub_408110(0); + // TODO SoundMan_setTwoSoundsPlayFlag(false); + // TODO SoundMan_setSoundThreePlayFlag(false); } int NavigationScene::getNavigationAreaType() { @@ -88,8 +88,8 @@ void NavigationScene::update() { _soundFlag2 = false; _soundFlag1 = false; _interactive = true; - // TODO Sound1ChList_sub_4080B0(0); - // TODO Sound1ChList_sub_408110(0); + // TODO SoundMan_setTwoSoundsPlayFlag(false); + // TODO SoundMan_setSoundThreePlayFlag(false); _smackerDone = false; _smackerPlayer->open(navigationItem.fileHash, true); _vm->_screen->clear(); @@ -205,11 +205,11 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } if (oldSoundFlag2 != _soundFlag2) { - // TODO Sound1ChList_sub_408110(_soundFlag2); + // TODO SoundMan_setSoundThreePlayFlag(_soundFlag2); } if (oldSoundFlag1 != _soundFlag1) { - // TODO Sound1ChList_sub_4080B0(_soundFlag1); + // TODO SoundMan_setTwoSoundsPlayFlag(_soundFlag1); } } diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 38ccce9650..91a23bfc7b 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -52,6 +52,34 @@ void MusicResource::stop(int16 fadeVolumeStep) { // TODO } +MusicItem::MusicItem() + : _musicResource(NULL) { +} + +MusicItem::~MusicItem() { + if (_musicResource) + _musicResource->unload(); + delete _musicResource; +} + +SoundItem::SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash, + bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, + bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown) + : _soundResource(NULL), _nameHash(nameHash), _soundFileHash(soundFileHash), + _playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0), + _playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown), + _playLooping(false), _currCountdown(currCountdown) { + + _soundResource = new SoundResource(vm); + _soundResource->load(soundFileHash); +} + +SoundItem::~SoundItem() { + if (_soundResource) + _soundResource->unload(); + delete _soundResource; +} + SoundMan::SoundMan(NeverhoodEngine *vm) : _vm(vm), _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) { @@ -71,62 +99,43 @@ void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) { musicItem->_countdown = 24; musicItem->_musicResource = new MusicResource(_vm); musicItem->_musicResource->load(musicFileHash); - // TODO Is this needed? musicItem->_musicResource->init(); _musicItems.push_back(musicItem); } void SoundMan::deleteMusic(uint32 musicFileHash) { - for (uint i = 0; i < _musicItems.size(); ++i) { - MusicItem *musicItem = _musicItems[i]; - if (musicItem->_musicFileHash == musicFileHash) { - musicItem->_musicResource->unload(); - delete musicItem->_musicResource; - delete musicItem; - _musicItems.remove_at(i); - break; - } + MusicItem *musicItem = getMusicItemByHash(musicFileHash); + if (musicItem) { + delete musicItem; + for (uint i = 0; i < _musicItems.size(); ++i) + if (_musicItems[i]->_musicFileHash == musicFileHash) { + _musicItems.remove_at(i); + break; + } } } void SoundMan::startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) { - for (uint i = 0; i < _musicItems.size(); ++i) { - MusicItem *musicItem = _musicItems[i]; - if (musicItem->_musicFileHash == musicFileHash) { - musicItem->_play = true; - musicItem->_stop = false; - musicItem->_countdown = countdown; - musicItem->_fadeVolumeStep = fadeVolumeStep; - break; - } + MusicItem *musicItem = getMusicItemByHash(musicFileHash); + if (musicItem) { + musicItem->_play = true; + musicItem->_stop = false; + musicItem->_countdown = countdown; + musicItem->_fadeVolumeStep = fadeVolumeStep; } } void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) { - for (uint i = 0; i < _musicItems.size(); ++i) { - MusicItem *musicItem = _musicItems[i]; - if (musicItem->_musicFileHash == musicFileHash) { - musicItem->_play = false; - musicItem->_stop = true; - musicItem->_countdown = countdown; - musicItem->_fadeVolumeStep = fadeVolumeStep; - break; - } + MusicItem *musicItem = getMusicItemByHash(musicFileHash); + if (musicItem) { + musicItem->_play = false; + musicItem->_stop = true; + musicItem->_countdown = countdown; + musicItem->_fadeVolumeStep = fadeVolumeStep; } } void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) { - SoundItem *soundItem = new SoundItem(); - soundItem->_nameHash = nameHash; - soundItem->_soundFileHash = soundFileHash; - soundItem->_playOnceAfterRandomCountdown = false; - soundItem->_minCountdown = 50; - soundItem->_maxCountdown = 600; - soundItem->_playOnceAfterCountdown = false; - soundItem->_initialCountdown = 0; - soundItem->_playLooping = false; - soundItem->_currCountdown = 0; - soundItem->_soundResource = new SoundResource(_vm); - soundItem->_soundResource->load(soundFileHash); + SoundItem *soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 50, 600, false, 0, false, 0); _soundItems.push_back(soundItem); } @@ -136,15 +145,14 @@ void SoundMan::addSoundList(uint32 nameHash, uint32 *soundFileHashList) { } void SoundMan::deleteSound(uint32 soundFileHash) { - for (uint i = 0; i < _soundItems.size(); ++i) { - SoundItem *soundItem = _soundItems[i]; - if (soundItem->_soundFileHash == soundFileHash) { - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; - delete soundItem; - _soundItems.remove_at(i); - break; - } + SoundItem *soundItem = getSoundItemByHash(soundFileHash); + if (soundItem) { + delete soundItem; + for (uint i = 0; i < _soundItems.size(); ++i) + if (_soundItems[i]->_soundFileHash == soundFileHash) { + _soundItems.remove_at(i); + break; + } } } @@ -248,8 +256,6 @@ void SoundMan::deleteMusicGroup(uint32 nameHash) { for (int index = _musicItems.size() - 1; index >= 0; --index) { MusicItem *musicItem = _musicItems[index]; if (musicItem->_nameHash == nameHash) { - musicItem->_musicResource->unload(); - delete musicItem->_musicResource; delete musicItem; _musicItems.remove_at(index); } @@ -261,28 +267,18 @@ void SoundMan::deleteSoundGroup(uint32 nameHash) { SoundItem *soundItem; if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) { - soundItem = _soundItems[_soundIndex1]; - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; - delete soundItem; - _soundItems.remove_at(_soundIndex1); + deleteSoundByIndex(_soundIndex1); _soundIndex1 = -1; } if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->_nameHash == nameHash) { - soundItem = _soundItems[_soundIndex2]; - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; - delete soundItem; - _soundItems.remove_at(_soundIndex2); + deleteSoundByIndex(_soundIndex2); _soundIndex2 = -1; } for (int index = _soundItems.size() - 1; index >= 0; --index) { soundItem = _soundItems[index]; if (soundItem->_nameHash == nameHash) { - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; delete soundItem; _soundItems.remove_at(index); } @@ -297,22 +293,14 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun int16 currCountdown2 = _initialCountdown / 2; if (_soundIndex1 != -1) { - soundItem = _soundItems[_soundIndex1]; - currCountdown1 = soundItem->_currCountdown; - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; - delete soundItem; - _soundItems.remove_at(_soundIndex1); + currCountdown1 = _soundItems[_soundIndex1]->_currCountdown; + deleteSoundByIndex(_soundIndex1); _soundIndex1 = -1; } if (_soundIndex2 != -1) { - soundItem = _soundItems[_soundIndex2]; - currCountdown2 = soundItem->_currCountdown; - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; - delete soundItem; - _soundItems.remove_at(_soundIndex2); + currCountdown2 = _soundItems[_soundIndex2]->_currCountdown; + deleteSoundByIndex(_soundIndex2); _soundIndex2 = -1; } @@ -320,36 +308,16 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun _initialCountdown = initialCountdown; if (soundFileHash1 != 0) { - soundItem = new SoundItem(); - soundItem->_nameHash = nameHash; - soundItem->_soundFileHash = soundFileHash1; - soundItem->_playOnceAfterRandomCountdown = false; - soundItem->_minCountdown = 0; - soundItem->_maxCountdown = 0; - soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown; - soundItem->_initialCountdown = _initialCountdown; - soundItem->_playLooping = false; - soundItem->_currCountdown = currCountdown1; - soundItem->_soundResource = new SoundResource(_vm); - soundItem->_soundResource->load(soundFileHash1); + soundItem = new SoundItem(_vm, nameHash, soundFileHash1, false, 0, 0, + _playOnceAfterCountdown, _initialCountdown, false, currCountdown1); soundItem->_soundResource->setVolume(80); _soundIndex1 = _soundItems.size(); _soundItems.push_back(soundItem); } if (soundFileHash2 != 0) { - soundItem = new SoundItem(); - soundItem->_nameHash = nameHash; - soundItem->_soundFileHash = soundFileHash2; - soundItem->_playOnceAfterRandomCountdown = false; - soundItem->_minCountdown = 0; - soundItem->_maxCountdown = 0; - soundItem->_playOnceAfterCountdown = _playOnceAfterCountdown; - soundItem->_initialCountdown = _initialCountdown; - soundItem->_playLooping = false; - soundItem->_currCountdown = currCountdown2; - soundItem->_soundResource = new SoundResource(_vm); - soundItem->_soundResource->load(soundFileHash2); + soundItem = new SoundItem(_vm, nameHash, soundFileHash2, false, 0, 0, + _playOnceAfterCountdown, _initialCountdown, false, currCountdown2); soundItem->_soundResource->setVolume(80); _soundIndex2 = _soundItems.size(); _soundItems.push_back(soundItem); @@ -362,28 +330,14 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) { SoundItem *soundItem; if (_soundIndex3 != -1) { - soundItem = _soundItems[_soundIndex3]; - soundItem->_soundResource->unload(); - delete soundItem->_soundResource; - delete soundItem; - _soundItems.remove_at(_soundIndex3); + deleteSoundByIndex(_soundIndex3); _soundIndex3 = -1; } if (soundFileHash != 0) { - soundItem = new SoundItem(); - soundItem->_nameHash = nameHash; - soundItem->_soundFileHash = soundFileHash; - soundItem->_playOnceAfterRandomCountdown = false; - soundItem->_minCountdown = 0; - soundItem->_maxCountdown = 0; - soundItem->_playOnceAfterCountdown = false; - soundItem->_initialCountdown = _initialCountdown3; - soundItem->_playLooping = false; - soundItem->_currCountdown = 0; - soundItem->_soundResource = new SoundResource(_vm); - soundItem->_soundResource->load(soundFileHash); - _soundIndex2 = _soundItems.size(); + soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 0, 0, + false, _initialCountdown3, false, 0); + _soundIndex3 = _soundItems.size(); _soundItems.push_back(soundItem); } @@ -403,6 +357,13 @@ void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) { _playOnceAfterCountdown3 = playOnceAfterCountdown; } +MusicItem *SoundMan::getMusicItemByHash(uint32 musicFileHash) { + for (uint i = 0; i < _musicItems.size(); ++i) + if (_musicItems[i]->_musicFileHash == musicFileHash) + return _musicItems[i]; + return NULL; +} + SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { for (uint i = 0; i < _soundItems.size(); ++i) if (_soundItems[i]->_soundFileHash == soundFileHash) @@ -410,4 +371,9 @@ SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { return NULL; } +void SoundMan::deleteSoundByIndex(int index) { + delete _soundItems[index]; + _soundItems.remove_at(index); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h index 66ed700e1a..39bf7cd096 100644 --- a/engines/neverhood/sound.h +++ b/engines/neverhood/sound.h @@ -50,6 +50,8 @@ struct MusicItem { int16 _fadeVolumeStep; int16 _countdown; MusicResource *_musicResource; + MusicItem(); + ~MusicItem(); }; struct SoundItem { @@ -63,6 +65,11 @@ struct SoundItem { bool _playLooping; int16 _currCountdown; SoundResource *_soundResource; + + SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash, + bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, + bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown); + ~SoundItem(); }; class SoundMan { @@ -113,7 +120,9 @@ protected: Common::Array _musicItems; Common::Array _soundItems; + MusicItem *getMusicItemByHash(uint32 musicFileHash); SoundItem *getSoundItemByHash(uint32 soundFileHash); + void deleteSoundByIndex(int index); }; -- cgit v1.2.3 From fc0e40db304aa489d4117299fcce1f80ba0b6379 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 22 Sep 2012 00:55:40 +0000 Subject: NEVERHOOD: Implement the actual audio code Sounds and music play now in some scenes (I didn't change the comments to code in all modules yet) - Fix calcHash to ignore non-alphanumeric characters, this fixes at least one animation glitch (when inserting tapes into the player) - Move SoundResource to sound.cpp --- engines/neverhood/entity.h | 1 + engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/klayman.cpp | 20 +- engines/neverhood/klayman.h | 2 +- engines/neverhood/module1000.cpp | 20 +- engines/neverhood/module1100.cpp | 45 ++-- engines/neverhood/module1200.cpp | 27 +-- engines/neverhood/module1300.cpp | 42 ++-- engines/neverhood/module1400.cpp | 40 ++-- engines/neverhood/navigationscene.h | 2 + engines/neverhood/neverhood.cpp | 4 + engines/neverhood/neverhood.h | 2 + engines/neverhood/resource.cpp | 44 +--- engines/neverhood/resource.h | 16 -- engines/neverhood/resourceman.cpp | 2 +- engines/neverhood/scene.cpp | 16 +- engines/neverhood/sound.cpp | 463 ++++++++++++++++++++++++++++++++---- engines/neverhood/sound.h | 120 ++++++++++ 18 files changed, 673 insertions(+), 199 deletions(-) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 9256c13ba8..22eb780024 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -27,6 +27,7 @@ #include "neverhood/neverhood.h" #include "neverhood/gamevars.h" #include "neverhood/graphics.h" +#include "neverhood/sound.h" namespace Neverhood { diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e2494af453..7841e278c3 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -298,9 +298,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule(1500, 0); // Logos and intro video //Real -#if 0 +#if 1 _vm->gameState().sceneNum = 0; - createModule(1200, -1); + createModule(1400, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -339,7 +339,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 8; createModule(2600, -1); #endif -#if 1 +#if 0 _vm->gameState().which = 0; _vm->gameState().sceneNum = 1; createModule(2700, -1); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index ca30e3bccb..00008830e7 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -60,7 +60,7 @@ static const KlaymanIdleTableItem klaymanTable4[] = { Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0), - _counter2(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), + _tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) { @@ -2119,16 +2119,16 @@ void Klayman::cbLeverReleasedEvent() { void Klayman::stInsertDisk() { if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) { _status2 = 2; - _counter2 = 0; + _tapesToInsert = 0; for (uint32 i = 0; i < 20; i++) { if (getSubVar(0x02038314, i)) { setSubVar(0x02720344, i, 1); setSubVar(0x02038314, i, 0); - _counter2++; + _tapesToInsert++; } } - if (_counter2 == 0) { - gotoState(NULL); + if (_tapesToInsert == 0) { + GotoState(NULL); gotoNextStateExt(); } else { startAnimation(0xD8C8D100, 0, -1); @@ -2136,7 +2136,7 @@ void Klayman::stInsertDisk() { SetSpriteUpdate(&Klayman::spriteUpdate41F250); SetMessageHandler(&Klayman::hmInsertDisk); _acceptInput = false; - _counter2--; + _tapesToInsert--; } } } @@ -2145,12 +2145,12 @@ uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity * switch (messageNum) { case 0x100D: if (param.asInteger() == 0x06040580) { - if (_counter2 == 0) { - // TODO: Calc calcHash value somewhere else + if (_tapesToInsert == 0) { + // TODO: Calc calcHash value somewhere else nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); } - } else if (_counter2 != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { - _counter2--; + } else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { + _tapesToInsert--; startAnimationByHash(0xD8C8D100, 0x01084280, 0); } else if (param.asInteger() == 0x062A1510) { _soundResource1.play(0x41688704); diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index b752b1ecdb..cbf17a01f8 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -185,7 +185,7 @@ protected: int16 _counter, _counterMax; int16 _counter3, _counter3Max; int16 _counter1; - int16 _counter2; + int16 _tapesToInsert; bool _flagF6; bool _isLeverDown; bool _isWalkingOpenDoorNotified; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 1c30681401..2db598bb3e 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -31,8 +31,8 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) _musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144; - // TODO SoundMan_addMusic(0x03294419, 0x061880C6); - // TODO SoundMan_addMusic(0x03294419, _musicFileHash); + _vm->_soundMan->addMusic(0x03294419, 0x061880C6); + _vm->_soundMan->addMusic(0x03294419, _musicFileHash); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -45,7 +45,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) } Module1000::~Module1000() { - // TODO SoundMan_deleteMusicGroup(0x03294419); + _vm->_soundMan->deleteMusicGroup(0x03294419); } void Module1000::createScene(int sceneNum, int which) { @@ -53,24 +53,24 @@ void Module1000::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_startMusic(0x061880C6, 0, 0, 1); + _vm->_soundMan->startMusic(0x061880C6, 0, 0); _childObject = new Scene1001(_vm, this, which); break; case 1: - // TODO SoundMan_startMusic(0x061880C6, 0, 0, 1); + _vm->_soundMan->startMusic(0x061880C6, 0, 0); _childObject = new Scene1002(_vm, this, which); break; case 2: - // TODO SoundMan_startMusic(0x061880C6, 0, 0); + _vm->_soundMan->startMusic(0x061880C6, 0, 0); _childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00); break; case 3: - // TODO SoundMan_stopMusic(0x061880C6, 0, 2); + _vm->_soundMan->stopMusic(0x061880C6, 0, 2); _childObject = new Scene1004(_vm, this, which); break; case 4: - // TODO SoundMan_stopMusic(0x061880C6, 0, 0); - // TODO SoundMan_startMusic(_musicFileHash, 0, 0, 1); + _vm->_soundMan->stopMusic(0x061880C6, 0, 0); + _vm->_soundMan->startMusic(_musicFileHash, 0, 0); _childObject = new Scene1005(_vm, this, which); break; } @@ -105,7 +105,7 @@ void Module1000::updateScene() { createScene(1, 2); break; case 4: - // TODO SoundMan_stopMusic(_musicFileHash, 0, 1); + _vm->_soundMan->stopMusic(_musicFileHash, 0, 1); createScene(3, 1); break; } diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 8b73598e03..e948c2b045 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1100.h" #include "neverhood/gamemodule.h" +#include "neverhood/navigationscene.h" namespace Neverhood { @@ -36,16 +37,16 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) createScene(9, 3); } - // TODO SoundMan_addSoundList(0x2C818, dword_4B85B0, true); + // TODO SoundMan_addSoundList(0x0002C818, dword_4B85B0, true); // TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250); - // TODO SoundMan_setSoundParams(0x74E01054, false, 100, 200, 10, 20); - // TODO SoundMan_setSoundVolume(0x74E01054, 60); - // TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F); + _vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20); + _vm->_soundMan->setSoundVolume(0x74E01054, 60); + _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); } Module1100::~Module1100() { - // TODO SoundMan_deleteGroup(0x2C818); + _vm->_soundMan->deleteGroup(0x0002C818); } void Module1100::createScene(int sceneNum, int which) { @@ -86,11 +87,11 @@ void Module1100::createScene(int sceneNum, int which) { createSmackerScene(0x04180007, true, false, false); break; case 6: - // TODO SoundMan_deleteSoundGroup(0x2C818); + _vm->_soundMan->deleteSoundGroup(0x0002C818); createSmackerScene(kSmackerFileHashList06, true, true, false); break; case 7: - // TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); createSmackerScene(kSmackerFileHashList07, true, true, false); break; case 8: @@ -98,7 +99,7 @@ void Module1100::createScene(int sceneNum, int which) { break; case 1002: _countdown = 40; - // TODO SoundMan_setTwoSoundsPlayFlag(true); + _vm->_soundMan->setTwoSoundsPlayFlag(true); createSmackerScene(0x00012211, true, true, false); break; } @@ -111,9 +112,9 @@ void Module1100::updateScene() { switch (_vm->gameState().sceneNum) { case 0: _countdown = 0; - // TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64); - // TODO SoundMan_setSoundVolume(0x48498E46, 65); - // TODO SoundMan_setSoundVolume(0x50399F64, 65); + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 65); + _vm->_soundMan->setSoundVolume(0x50399F64, 65); if (_moduleResult == 0) { createScene(1, 0); } else if (_moduleResult == 1) { @@ -121,7 +122,7 @@ void Module1100::updateScene() { } break; case 1: - // TODO SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F); + _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); if (getGlobalVar(0x0C0288F4)) { if (_moduleResult == 0) { createScene(6, -1); @@ -137,7 +138,7 @@ void Module1100::updateScene() { } break; case 2: - // TODO SoundMan_setSoundParams(0x74E01054, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); if (_navigationAreaType == 3) { createScene(7, -1); } else if (_moduleResult == 1) { @@ -161,6 +162,7 @@ void Module1100::updateScene() { } break; case 5: + _vm->_soundMan->setTwoSoundsPlayFlag(false); if (getGlobalVar(0x610210B7)) { createScene(3, 0); } else { @@ -168,9 +170,11 @@ void Module1100::updateScene() { } break; case 6: + _vm->_soundMan->setTwoSoundsPlayFlag(false); leaveModule(1); break; case 7: + _vm->_soundMan->setTwoSoundsPlayFlag(false); createScene(2, 2); break; case 8: @@ -181,8 +185,9 @@ void Module1100::updateScene() { } break; case 1002: + _vm->_soundMan->setTwoSoundsPlayFlag(false); _countdown = 0; - // TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); createScene(1, 1); break; } @@ -191,7 +196,7 @@ void Module1100::updateScene() { case 0: #if 0 // TODO if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { - SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64); + SoundMan_playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64); SoundMan_setSoundVolume(0x48498E46, 65); SoundMan_setSoundVolume(0x50399F64, 65); } @@ -200,21 +205,21 @@ void Module1100::updateScene() { case 1: #if 0 // TODO if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { - SoundMan_playTwoSounds(0x2C818, 0x41861371, 0x43A2507F); + SoundMan_playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F); } #endif break; case 2: - // TODO SoundMan_setSoundParams(0x74E01054, !navigationScene()->soundFlag1, 0, 0, 0, 0); + _vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->getSoundFlag1(), 0, 0, 0, 0); break; case 5: case 6: case 7: case 1002: if (_countdown != 0 && (--_countdown == 0)) { - // TODO SoundMan_playTwoSounds(0x2C818, 0x48498E46, 0x50399F64); - // TODO SoundMan_setSoundVolume(0x48498E46, 65); - // TODO SoundMan_setSoundVolume(0x50399F64, 65); + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 65); + _vm->_soundMan->setSoundVolume(0x50399F64, 65); } break; } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 7599d7655d..33b791aa9b 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -39,12 +39,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - // TODO SoundMan_addMusic(0x00478311, 0x62222CAE); - // TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1); + _vm->_soundMan->addMusic(0x00478311, 0x62222CAE); + _vm->_soundMan->startMusic(0x62222CAE, 0, 0); } Module1200::~Module1200() { - // TODO SoundMan_deleteMusicGroup(0x00478311); + _vm->_soundMan->deleteMusicGroup(0x00478311); } void Module1200::createScene(int sceneNum, int which) { @@ -58,7 +58,7 @@ void Module1200::createScene(int sceneNum, int which) { _childObject = new Scene1202(_vm, this, which); break; case 2: - // TODO SoundMan_stopMusic(0x62222CAE, 0, 0); + _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); createSmackerScene(0x31890001, true, true, false); setGlobalVar(0x2A02C07B, 1); break; @@ -87,7 +87,7 @@ void Module1200::updateScene() { createScene(0, 1); break; case 2: - // TODO SoundMan_startMusic(0x62222CAE, 0, 0, 1); + _vm->_soundMan->startMusic(0x62222CAE, 0, 0); createScene(0, 3); break; } @@ -371,7 +371,7 @@ AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sp } AsScene1201TntMan::~AsScene1201TntMan() { - // TODO SoundMan_deleteSoundGroup(0x01D00560); + _vm->_soundMan->deleteSoundGroup(0x01D00560); } uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -426,8 +426,8 @@ void AsScene1201TntMan::sub40CD60() { } void AsScene1201TntMan::sub40CD90() { - // TODO SoundMan_addSound(0x01D00560, 0x4B044624, true); - // TODO SoundMan_playSoundLooping(0x4B044624); + _vm->_soundMan->addSound(0x01D00560, 0x4B044624); + _vm->_soundMan->playSoundLooping(0x4B044624); _flag = true; startAnimation(0x85084190, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); @@ -447,7 +447,7 @@ Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) } Class465::~Class465() { - // TODO SoundMan_deleteSoundGroup(0x041080A4); + _vm->_soundMan->deleteSoundGroup(0x041080A4); } void Class465::update() { @@ -455,8 +455,8 @@ void Class465::update() { if (getGlobalVar(0x20A0C516)) { setVisible(true); SetUpdateHandler(&AnimatedSprite::update); - // TODO SoundMan_addSound(0x041080A4, 0x460A1050, true); - // TODO SoundMan_playSoundLooping(0x460A1050); + _vm->_soundMan->addSound(0x041080A4, 0x460A1050); + _vm->_soundMan->playSoundLooping(0x460A1050); } } @@ -1227,10 +1227,7 @@ bool Scene1202::isSolved() { } void Scene1202::doPaletteEffect() { -#if 0 // TODO - Palette2 *palette2 = (Palette2*)_palette; - palette2->startFadeToPalette(24); -#endif + // TODO } } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index b7c588f114..ee4dc7a42c 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -35,12 +35,12 @@ namespace Neverhood { Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO SoundMan_addMusic(0x61C090, 0x203197); + _vm->_soundMan->addMusic(0x61C090, 0x203197); // TODO SoundMan_addSoundList(0x61C090, dword_4B2868, true); // TODO SoundMan_setSoundListParams(dword_4B2868, false, 50, 600, 20, 150); - // TODO SoundMan_playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); - // TODO SoundMan_setSoundVolume(0x48498E46, 70); - // TODO SoundMan_setSoundVolume(0x50399F64, 70); + _vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); if (which < 0) { if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17) @@ -94,7 +94,7 @@ Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) } Module1300::~Module1300() { - // TODO SoundMan_deleteGroup(0x61C090); + _vm->_soundMan->deleteGroup(0x61C090); } void Module1300::createScene(int sceneNum, int which) { @@ -103,82 +103,82 @@ void Module1300::createScene(int sceneNum, int which) { switch (_vm->gameState().sceneNum) { case 1: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_startMusic(0x203197, 0, 2, 1); + _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1302(_vm, this, which); break; case 2: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new Scene1303(_vm, this, which); break; case 3: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new Scene1304(_vm, this, which); break; case 4: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_startMusic(0x203197, 0, 2, 1); + _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1305(_vm, this, which); break; case 5: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_startMusic(0x203197, 0, 2, 1); + _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1306(_vm, this, which); break; case 6: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_startMusic(0x203197, 0, 2, 1); + _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1307(_vm, this, which); break; case 7: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_startMusic(0x203197, 0, 2, 1); + _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1308(_vm, this, which); break; case 8: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new DiskplayerScene(_vm, this, 1); break; case 9: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createSmackerScene(0x20082818, true, true, false); break; case 10: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createSmackerScene(0x20082828, true, true, false); break; case 11: // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B27A8, which); break; case 12: // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2718, which); break; case 13: // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B27D8, which); break; case 14: // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2808, which); break; case 15: // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2838, which); break; case 16: // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); - // TODO SoundMan_stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new Scene1317(_vm, this, which); break; case 17: diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 370735695d..8d40c340ec 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -32,8 +32,8 @@ namespace Neverhood { Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO SoundMan_addMusic(0x00AD0012, 0x06333232); - // TODO SoundMan_addMusic(0x00AD0012, 0x624A220E); + _vm->_soundMan->addMusic(0x00AD0012, 0x06333232); + _vm->_soundMan->addMusic(0x00AD0012, 0x624A220E); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -44,7 +44,7 @@ Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) } Module1400::~Module1400() { - // TODO SoundMan_deleteMusicGroup(0x00AD0012); + _vm->_soundMan->deleteMusicGroup(0x00AD0012); } void Module1400::createScene(int sceneNum, int which) { @@ -52,33 +52,33 @@ void Module1400::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_startMusic(0x06333232, 0, 2, 1); + _vm->_soundMan->startMusic(0x06333232, 0, 2); _childObject = new Scene1401(_vm, this, which); break; case 1: - // TODO SoundMan_stopMusic(0x06333232, 0, 2); - // TODO SoundMan_stopMusic(0x624A220E, 0, 2); + _vm->_soundMan->stopMusic(0x06333232, 0, 2); + _vm->_soundMan->stopMusic(0x624A220E, 0, 2); _childObject = new Scene1402(_vm, this, which); break; case 2: - // TODO SoundMan_stopMusic(0x06333232, 0, 2); - // TODO SoundMan_startMusic(0x624A220E, 0, 2, 1); + _vm->_soundMan->stopMusic(0x06333232, 0, 2); + _vm->_soundMan->startMusic(0x624A220E, 0, 2); _childObject = new Scene1403(_vm, this, which); break; case 3: - // TODO SoundMan_startMusic(0x06333232, 0, 2, 1); + _vm->_soundMan->startMusic(0x06333232, 0, 2); _childObject = new Scene1404(_vm, this, which); break; case 4: - // TODO SoundMan_startMusic(0x06333232, 0, 2, 1); + _vm->_soundMan->startMusic(0x06333232, 0, 2); _childObject = new Scene1405(_vm, this, which); break; case 5: - // TODO SoundMan_stopMusic(0x06333232, 0, 2); + _vm->_soundMan->stopMusic(0x06333232, 0, 2); _childObject = new DiskplayerScene(_vm, this, 2); break; case 6: - // TODO SoundMan_stopMusic(0x06333232, 0, 2); + _vm->_soundMan->stopMusic(0x06333232, 0, 2); _childObject = new Scene1407(_vm, this, which); break; } @@ -148,7 +148,7 @@ Class525::Class525(NeverhoodEngine *vm) } Class525::~Class525() { - // TODO SoundMan_deleteSoundGroup(0x01104C08); + _vm->_soundMan->deleteSoundGroup(0x01104C08); } void Class525::update4662A0() { @@ -157,8 +157,8 @@ void Class525::update4662A0() { sub466460(); } if (_countdown2 != 0 && (--_countdown2 == 0)) { - // TODO SoundMan_addSound(0x01104C08, 0x4A116437, true); - // TODO SoundMan_playSoundLooping(0x4A116437); + _vm->_soundMan->addSound(0x01104C08, 0x4A116437); + _vm->_soundMan->playSoundLooping(0x4A116437); } } @@ -211,7 +211,7 @@ void Class525::sub466420() { } void Class525::sub466460() { - // TODO SoundMan_deleteSound(0x4A116437); + _vm->_soundMan->deleteSound(0x4A116437); _soundResource1.play(0x4A120435); startAnimation(0x4C210500, 0, -1); } @@ -406,7 +406,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr } Class489::~Class489() { - // TODO SoundMan_deleteSoundGroup(0x05331081); + _vm->_soundMan->deleteSoundGroup(0x05331081); } uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -616,8 +616,8 @@ void Class489::sub434EC0() { NextState(&Class489::sub434F40); setGlobalVar(0x12A10DB3, 1); _soundResource1.play(0xCC4A8456); - // TODO SoundMan_addSound(0x05331081, 0xCE428854, true); - // TODO SoundMan_playSoundLooping(0xCE428854); + _vm->_soundMan->addSound(0x05331081, 0xCE428854); + _vm->_soundMan->playSoundLooping(0xCE428854); } void Class489::sub434F40() { @@ -634,7 +634,7 @@ void Class489::sub434F80() { NextState(&Class489::sub434E90); setGlobalVar(0x12A10DB3, 0); _soundResource1.play(0xCC4A8456); - // TODO SoundMan_deleteSound(0xCE428854); + _vm->_soundMan->deleteSound(0xCE428854); } void Class489::sub434FF0() { diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h index c37a7fc178..4397a4372b 100644 --- a/engines/neverhood/navigationscene.h +++ b/engines/neverhood/navigationscene.h @@ -34,6 +34,8 @@ public: NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes); virtual ~NavigationScene(); int getNavigationAreaType(); + bool getSoundFlag1() const { return _soundFlag1; } + bool getSoundFlag2() const { return _soundFlag2; } protected: SmackerPlayer *_smackerPlayer; bool _smackerDone; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index abd937497e..e5c07b5b8d 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -100,6 +100,7 @@ Common::Error NeverhoodEngine::run() { #if 1 _soundMan = new SoundMan(this); + _audioResourceMan = new AudioResourceMan(this); _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); @@ -139,6 +140,8 @@ Common::Error NeverhoodEngine::run() { //debug("millis %d", _system->getMillis()); _gameModule->handleUpdate(); _gameModule->draw(); + _soundMan->update(); + _audioResourceMan->update(); _screen->wait(); _screen->update(); @@ -149,6 +152,7 @@ Common::Error NeverhoodEngine::run() { delete _gameModule; delete _collisionMan; delete _soundMan; + delete _audioResourceMan; #endif diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 13ea39986a..2aa84e5cb7 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -46,6 +46,7 @@ class GameVars; class ResourceMan; class Screen; class SoundMan; +class AudioResourceMan; class StaticData; struct NPoint; @@ -87,6 +88,7 @@ public: CollisionMan *_collisionMan; SoundMan *_soundMan; + AudioResourceMan *_audioResourceMan; public: diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 7b0aa94b13..9bf6549ffe 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -640,44 +640,20 @@ DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash return NULL; } -// SoundResource -// ALL TODO - -SoundResource::SoundResource(NeverhoodEngine *vm) - : _vm(vm) { -} - -bool SoundResource::isPlaying() { - return false; -} - -void SoundResource::load(uint32 fileHash) { -} - -void SoundResource::unload() { -} - -void SoundResource::play(uint32 fileHash, bool looping) { -} - -void SoundResource::play() { -} - -void SoundResource::setVolume(int volume) { -} - uint32 calcHash(const char *value) { uint32 hash = 0, shiftValue = 0; while (*value != 0) { char ch = *value++; - if (ch >= 'a' && ch <= 'z') - ch -= 32; - else if (ch >= '0' && ch <= '9') - ch += 22; - shiftValue += ch - 64; - if (shiftValue >= 32) - shiftValue -= 32; - hash ^= 1 << shiftValue; + if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) { + if (ch >= 'a' && ch <= 'z') + ch -= 32; + else if (ch >= '0' && ch <= '9') + ch += 22; + shiftValue += ch - 64; + if (shiftValue >= 32) + shiftValue -= 32; + hash ^= 1 << shiftValue; + } } return hash; } diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index b0cd464e06..16782968f8 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -191,22 +191,6 @@ protected: DataResource::DRDirectoryItem *findDRDirectoryItem(uint32 nameHash, uint16 type); }; -// TODO: Dummy class atm - -class SoundResource { -public: - SoundResource(NeverhoodEngine *vm); - bool isPlaying(); - void load(uint32 fileHash); - void unload(); - void play(uint32 fileHash, bool looping = false); - void play(); - void stop() { /*DUMMY*/ } - void setVolume(int volume); -protected: - NeverhoodEngine *_vm; -}; - uint32 calcHash(const char *value); } // End of namespace Neverhood diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 0538f58e87..c073e976a4 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -35,7 +35,7 @@ void ResourceMan::addArchive(const Common::String &filename) { uint archiveIndex = _archives.size(); archive->open(filename); _archives.push_back(archive); - debug("ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount()); + debug(3, "ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount()); _entries.reserve(_entries.size() + archive->getCount()); for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) { BlbArchiveEntry *archiveEntry = archive->getEntry(archiveEntryIndex); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index d189fad240..8520d6467d 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -375,7 +375,7 @@ uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam ¶m, En } bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { - debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY); + //debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY); for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) { Sprite *sprite = _vm->_collisionMan->getSprite(i); if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && @@ -397,7 +397,7 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { for (uint j = 0; j < rectList[i].subRects.size(); j++) { debug(2, " (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2); if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) { - debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId); + //debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId); return setMessageList2(rectList[i].subRects[j].messageListId); } } @@ -416,7 +416,7 @@ void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackF } void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { - debug("Scene::setMessageList(%p)", (void*)messageList); + //debug("Scene::setMessageList(%p)", (void*)messageList); _messageList = messageList; _messageListCount = _messageList ? _messageList->size() : 0; _messageListIndex = 0; @@ -426,11 +426,13 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool _messageListStatus = 1; sendMessage(_klayman, 0x101C, 0); +#if 0 // DEBUG: Show message list for (uint i = 0; i < messageList->size(); i++) { debug("A: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); } debug("A: ================================================================"); +#endif } @@ -441,13 +443,15 @@ bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallback bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { bool result = false; - debug("Scene::setMessageList2(%p)", (void*)messageList); + //debug("Scene::setMessageList2(%p)", (void*)messageList); +#if 0 // DEBUG: Show message list for (uint i = 0; i < messageList->size(); i++) { debug("B: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); } debug("B: ================================================================"); +#endif if (_messageListStatus == 1) { if (messageList != _messageList2) { @@ -500,7 +504,7 @@ void Scene::runMessageList() { uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; - debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); + //debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); _messageListIndex++; if (_messageListIndex == _messageListCount) { @@ -573,7 +577,7 @@ void Scene::clearRectList() { void Scene::loadHitRectList() { HitRectList *hitRectList = _dataResource.getHitRectList(); - debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList); + //debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList); if (hitRectList) { _hitRectList = *hitRectList; _vm->_collisionMan->setHitRects(&_hitRectList); diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 91a23bfc7b..bd2f223998 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -20,36 +20,101 @@ * */ +#include "common/memstream.h" #include "graphics/palette.h" #include "neverhood/sound.h" +#include "neverhood/resourceman.h" namespace Neverhood { // TODO Put more stuff into the constructors/destructors of the item structs // TODO Some parts are quite bad here, but my priority is to get sound working at all +SoundResource::SoundResource(NeverhoodEngine *vm) + : _vm(vm), _soundIndex(-1) { +} + +SoundResource::~SoundResource() { + unload(); +} + +bool SoundResource::isPlaying() { + return _soundIndex >= 0 && + _vm->_audioResourceMan->isSoundPlaying(_soundIndex); +} + +void SoundResource::load(uint32 fileHash) { + unload(); + _soundIndex = _vm->_audioResourceMan->addSound(fileHash); + _vm->_audioResourceMan->loadSound(_soundIndex); +} + +void SoundResource::unload() { + if (_soundIndex >= 0) { + _vm->_audioResourceMan->removeSound(_soundIndex); + _soundIndex = -1; + } +} + +void SoundResource::play(uint32 fileHash) { + load(fileHash); + play(); +} + +void SoundResource::play() { + if (_soundIndex >= 0) + _vm->_audioResourceMan->playSound(_soundIndex, false); +} + +void SoundResource::stop() { + if (_soundIndex >= 0) + _vm->_audioResourceMan->stopSound(_soundIndex); +} + +void SoundResource::setVolume(int16 volume) { + if (_soundIndex >= 0) + _vm->_audioResourceMan->setSoundVolume(_soundIndex, volume); +} + +void SoundResource::setPan(int16 pan) { + if (_soundIndex >= 0) + _vm->_audioResourceMan->setSoundPan(_soundIndex, pan); +} + MusicResource::MusicResource(NeverhoodEngine *vm) - : _vm(vm) { + : _vm(vm), _musicIndex(-1) { } bool MusicResource::isPlaying() { - return false; + return _musicIndex >= 0 && + _vm->_audioResourceMan->isMusicPlaying(_musicIndex); } void MusicResource::load(uint32 fileHash) { - // TODO + unload(); + _musicIndex = _vm->_audioResourceMan->loadMusic(fileHash); } void MusicResource::unload() { - // TODO + if (_musicIndex >= 0) { + _vm->_audioResourceMan->unloadMusic(_musicIndex); + _musicIndex = -1; + } } void MusicResource::play(int16 fadeVolumeStep) { - // TODO + if (_musicIndex >= 0) + _vm->_audioResourceMan->playMusic(_musicIndex, fadeVolumeStep); } void MusicResource::stop(int16 fadeVolumeStep) { - // TODO + if (_musicIndex >= 0) + _vm->_audioResourceMan->stopMusic(_musicIndex, fadeVolumeStep); +} + +void MusicResource::setVolume(int16 volume) { + if (_musicIndex >= 0) + _vm->_audioResourceMan->setMusicVolume(_musicIndex, volume); } MusicItem::MusicItem() @@ -80,6 +145,8 @@ SoundItem::~SoundItem() { delete _soundResource; } +// SoundMan + SoundMan::SoundMan(NeverhoodEngine *vm) : _vm(vm), _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) { @@ -107,8 +174,8 @@ void SoundMan::deleteMusic(uint32 musicFileHash) { if (musicItem) { delete musicItem; for (uint i = 0; i < _musicItems.size(); ++i) - if (_musicItems[i]->_musicFileHash == musicFileHash) { - _musicItems.remove_at(i); + if (_musicItems[i] == musicItem) { + _musicItems[i] = NULL; break; } } @@ -149,8 +216,8 @@ void SoundMan::deleteSound(uint32 soundFileHash) { if (soundItem) { delete soundItem; for (uint i = 0; i < _soundItems.size(); ++i) - if (_soundItems[i]->_soundFileHash == soundFileHash) { - _soundItems.remove_at(i); + if (_soundItems[i] == soundItem) { + _soundItems[i] = NULL; break; } } @@ -213,35 +280,41 @@ void SoundMan::update() { for (uint i = 0; i < _soundItems.size(); ++i) { SoundItem *soundItem = _soundItems[i]; - if (soundItem->_playOnceAfterCountdown) { - if (soundItem->_currCountdown == 0) { - soundItem->_currCountdown = soundItem->_initialCountdown; - } else if (--soundItem->_currCountdown == 0) { - soundItem->_soundResource->play(); + if (soundItem) { + if (soundItem->_playOnceAfterCountdown) { + if (soundItem->_currCountdown == 0) { + soundItem->_currCountdown = soundItem->_initialCountdown; + } else if (--soundItem->_currCountdown == 0) { + soundItem->_soundResource->play(); + } + } else if (soundItem->_playOnceAfterRandomCountdown) { + if (soundItem->_currCountdown == 0) { + if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown) + soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown); + } else if (--soundItem->_currCountdown == 0) { + soundItem->_soundResource->play(); + } + } else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) { + soundItem->_soundResource->play(); // TODO Looping parameter? } - } else if (soundItem->_playOnceAfterRandomCountdown) { - if (soundItem->_currCountdown == 0) { - if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown) - soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown); - } else if (--soundItem->_currCountdown == 0) { - soundItem->_soundResource->play(); - } - } else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) { - soundItem->_soundResource->play(); // TODO Looping parameter? } } for (uint i = 0; i < _musicItems.size(); ++i) { MusicItem *musicItem = _musicItems[i]; - if (musicItem->_countdown) { - --musicItem->_countdown; - } else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) { - musicItem->_musicResource->play(musicItem->_fadeVolumeStep); - musicItem->_fadeVolumeStep = 0; - } else if (musicItem->_stop) { - musicItem->_musicResource->stop(musicItem->_fadeVolumeStep); - musicItem->_fadeVolumeStep = 0; - musicItem->_stop = false; + if (musicItem) { + if (musicItem->_countdown) { + --musicItem->_countdown; + } else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) { + debug("SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); + musicItem->_musicResource->play(musicItem->_fadeVolumeStep); + musicItem->_fadeVolumeStep = 0; + } else if (musicItem->_stop) { + debug("SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); + musicItem->_musicResource->stop(musicItem->_fadeVolumeStep); + musicItem->_fadeVolumeStep = 0; + musicItem->_stop = false; + } } } @@ -253,11 +326,11 @@ void SoundMan::deleteGroup(uint32 nameHash) { } void SoundMan::deleteMusicGroup(uint32 nameHash) { - for (int index = _musicItems.size() - 1; index >= 0; --index) { + for (uint index = 0; index < _musicItems.size(); ++index) { MusicItem *musicItem = _musicItems[index]; - if (musicItem->_nameHash == nameHash) { + if (musicItem && musicItem->_nameHash == nameHash) { delete musicItem; - _musicItems.remove_at(index); + _musicItems[index] = NULL; } } } @@ -276,11 +349,11 @@ void SoundMan::deleteSoundGroup(uint32 nameHash) { _soundIndex2 = -1; } - for (int index = _soundItems.size() - 1; index >= 0; --index) { + for (uint index = 0; index < _soundItems.size(); ++index) { soundItem = _soundItems[index]; - if (soundItem->_nameHash == nameHash) { + if (soundItem && soundItem->_nameHash == nameHash) { delete soundItem; - _soundItems.remove_at(index); + _soundItems[index] = NULL; } } @@ -359,21 +432,327 @@ void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) { MusicItem *SoundMan::getMusicItemByHash(uint32 musicFileHash) { for (uint i = 0; i < _musicItems.size(); ++i) - if (_musicItems[i]->_musicFileHash == musicFileHash) + if (_musicItems[i] && _musicItems[i]->_musicFileHash == musicFileHash) return _musicItems[i]; return NULL; } SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { for (uint i = 0; i < _soundItems.size(); ++i) - if (_soundItems[i]->_soundFileHash == soundFileHash) + if (_soundItems[i] && _soundItems[i]->_soundFileHash == soundFileHash) return _soundItems[i]; return NULL; } +int16 SoundMan::addMusicItem(MusicItem *musicItem) { + return 0; // TODO +} + +int16 SoundMan::addSoundItem(SoundItem *soundItem) { + for (uint i = 0; i < _soundItems.size(); ++i) + if (!_soundItems[i]) { + _soundItems[i] = soundItem; + return i; + } + int16 soundIndex = _soundItems.size(); + _soundItems.push_back(soundItem); + return soundIndex; +} + void SoundMan::deleteSoundByIndex(int index) { delete _soundItems[index]; - _soundItems.remove_at(index); + _soundItems[index] = NULL; +} + +// NeverhoodAudioStream + +NeverhoodAudioStream::NeverhoodAudioStream(int rate, byte shiftValue, bool isLooping, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream) + : _rate(rate), _shiftValue(shiftValue), _isLooping(isLooping), _isStereo(false), _stream(stream, disposeStream), _endOfData(false), _buffer(0), + _isCompressed(_shiftValue != 0xFF), _prevValue(0) { + // Setup our buffer for readBuffer + _buffer = new byte[kSampleBufferLength * (_isCompressed ? 1 : 2)]; + assert(_buffer); +} + +NeverhoodAudioStream::~NeverhoodAudioStream() { + delete[] _buffer; +} + +int NeverhoodAudioStream::readBuffer(int16 *buffer, const int numSamples) { + int samplesLeft = numSamples; + + while (samplesLeft > 0 && !_endOfData) { + + const int maxSamples = MIN(kSampleBufferLength, samplesLeft); + const int bytesToRead = maxSamples * (_isCompressed ? 1 : 2); + int bytesRead = _stream->read(_buffer, bytesToRead); + int samplesRead = bytesRead / (_isCompressed ? 1 : 2); + + samplesLeft -= samplesRead; + + const byte *src = _buffer; + if (_isCompressed) { + while (samplesRead--) { + _prevValue += (int8)(*src++); + *buffer++ = _prevValue << _shiftValue; + } + } else { + memcpy(buffer, _buffer, bytesRead); + buffer += bytesRead; + } + + if (bytesRead < bytesToRead || _stream->pos() >= _stream->size() || _stream->err() || _stream->eos()) { + if (_isLooping) + _stream->seek(0); + else + _endOfData = true; + } + + } + + return numSamples - samplesLeft; +} + +AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm) + : _vm(vm) { +} + +AudioResourceMan::~AudioResourceMan() { +} + +int16 AudioResourceMan::addSound(uint32 fileHash) { + AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem(); + soundItem->_resourceHandle = _vm->_res->useResource(fileHash); + soundItem->_fileHash = fileHash; + soundItem->_data = NULL; + soundItem->_isLoaded = false; + soundItem->_isPlaying = false; + soundItem->_volume = 100; + soundItem->_panning = 50; + + for (uint i = 0; i < _soundItems.size(); ++i) + if (!_soundItems[i]) { + _soundItems[i] = soundItem; + return i; + } + + int16 soundIndex = (int16)_soundItems.size(); + _soundItems.push_back(soundItem); + return soundIndex; +} + +void AudioResourceMan::removeSound(int16 soundIndex) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (soundItem->_data) { + _vm->_res->unloadResource(soundItem->_resourceHandle); + soundItem->_data = NULL; + } + if (soundItem->_resourceHandle != 1) { + _vm->_res->unuseResource(soundItem->_resourceHandle); + soundItem->_resourceHandle = -1; + } + if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) + _vm->_mixer->stopHandle(soundItem->_soundHandle); + delete soundItem; + _soundItems[soundIndex] = NULL; +} + +void AudioResourceMan::loadSound(int16 soundIndex) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (!soundItem->_data) { + // TODO Check if it's a sound resource + soundItem->_data = _vm->_res->loadResource(soundItem->_resourceHandle); + } +} + +void AudioResourceMan::unloadSound(int16 soundIndex) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (soundItem->_data) { + _vm->_res->unloadResource(soundItem->_resourceHandle); + soundItem->_data = NULL; + } +} + +void AudioResourceMan::setSoundVolume(int16 soundIndex, int16 volume) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + soundItem->_volume = MIN(volume, 100); + if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) + _vm->_mixer->setChannelVolume(soundItem->_soundHandle, VOLUME(soundItem->_volume)); +} + +void AudioResourceMan::setSoundPan(int16 soundIndex, int16 pan) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + soundItem->_panning = MIN(pan, 100); + if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) + _vm->_mixer->setChannelVolume(soundItem->_soundHandle, PANNING(soundItem->_panning)); +} + +void AudioResourceMan::playSound(int16 soundIndex, bool looping) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (!soundItem->_data) + loadSound(soundIndex); + + uint32 soundSize = _vm->_res->getResourceSize(soundItem->_resourceHandle); + Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundSize, DisposeAfterUse::NO); + byte *shiftValue = _vm->_res->getResourceExtData(soundItem->_resourceHandle); + NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream); + + _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle, + audioStream, -1, VOLUME(soundItem->_volume), PANNING(soundItem->_panning)); + + debug("playing sound %08X", soundItem->_fileHash); + + soundItem->_isPlaying = true; + +} + +void AudioResourceMan::stopSound(int16 soundIndex) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) + _vm->_mixer->stopHandle(soundItem->_soundHandle); + soundItem->_isPlaying = false; +} + +bool AudioResourceMan::isSoundPlaying(int16 soundIndex) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + return soundItem->_isPlaying; +} + +int16 AudioResourceMan::loadMusic(uint32 fileHash) { + + AudioResourceManMusicItem *musicItem; + + for (uint i = 0; i < _musicItems.size(); ++i) { + musicItem = _musicItems[i]; + if (musicItem && musicItem->_fileHash == fileHash && musicItem->_remove) { + musicItem->_remove = false; + musicItem->_isFadingOut = false; + musicItem->_isFadingIn = true; + return i; + } + } + + musicItem = new AudioResourceManMusicItem(); + musicItem->_fileHash = fileHash; + musicItem->_isPlaying = false; + musicItem->_remove = false; + musicItem->_volume = 100; + musicItem->_panning = 50; + musicItem->_start = false; + musicItem->_isFadingIn = false; + musicItem->_isFadingOut = false; + + for (uint i = 0; i < _musicItems.size(); ++i) { + if (!_musicItems[i]) { + _musicItems[i] = musicItem; + return i; + } + } + + int16 musicIndex = _musicItems.size(); + _musicItems.push_back(musicItem); + return musicIndex; + +} + +void AudioResourceMan::unloadMusic(int16 musicIndex) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + if (musicItem->_isFadingOut) { + musicItem->_remove = true; + } else { + if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) + _vm->_mixer->stopHandle(musicItem->_soundHandle); + musicItem->_isPlaying = false; + _musicItems[musicIndex] = NULL; + } +} + +void AudioResourceMan::setMusicVolume(int16 musicIndex, int16 volume) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + musicItem->_volume = MIN(volume, 100); + if (musicItem->_isPlaying && _vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) + _vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_volume)); +} + +void AudioResourceMan::playMusic(int16 musicIndex, int16 fadeVolumeStep) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + if (!musicItem->_isPlaying) { + musicItem->_isFadingIn = false; + musicItem->_isFadingOut = false; + if (fadeVolumeStep != 0) { + musicItem->_isFadingIn = true; + musicItem->_fadeVolume = 0; + musicItem->_fadeVolumeStep = fadeVolumeStep; + } + musicItem->_start = true; + } +} + +void AudioResourceMan::stopMusic(int16 musicIndex, int16 fadeVolumeStep) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { + if (fadeVolumeStep != 0) { + if (musicItem->_isFadingIn) + musicItem->_isFadingIn = false; + else + musicItem->_fadeVolume = musicItem->_volume; + musicItem->_isFadingOut = true; + musicItem->_fadeVolumeStep = fadeVolumeStep; + } else { + _vm->_mixer->stopHandle(musicItem->_soundHandle); + } + musicItem->_isPlaying = false; + } +} + +bool AudioResourceMan::isMusicPlaying(int16 musicIndex) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + return musicItem->_isPlaying; +} + +void AudioResourceMan::updateMusicItem(int16 musicIndex) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + + if (musicItem->_start && !_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { + Common::SeekableReadStream *stream = _vm->_res->createStream(musicItem->_fileHash); + byte *shiftValue = _vm->_res->getResourceExtDataByHash(musicItem->_fileHash); + NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream); + _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &musicItem->_soundHandle, + audioStream, -1, VOLUME(musicItem->_isFadingIn ? musicItem->_fadeVolume : musicItem->_volume), + PANNING(musicItem->_panning)); + musicItem->_start = false; + musicItem->_isPlaying = true; + } + + if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { + if (musicItem->_isFadingIn) { + musicItem->_fadeVolume += musicItem->_fadeVolumeStep; + if (musicItem->_fadeVolume >= musicItem->_volume) { + musicItem->_fadeVolume = musicItem->_volume; + musicItem->_isFadingIn = false; + } + _vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume)); + } + if (musicItem->_isFadingOut) { + musicItem->_fadeVolume -= musicItem->_fadeVolumeStep; + if (musicItem->_fadeVolume < 0) + musicItem->_fadeVolume = 0; + _vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume)); + if (musicItem->_fadeVolume == 0) { + musicItem->_isFadingOut = false; + stopMusic(musicIndex, 0); + if (musicItem->_remove) + unloadMusic(musicIndex); + } + } + } + +} + +void AudioResourceMan::update() { + for (uint i = 0; i < _musicItems.size(); ++i) + if (_musicItems[i]) + updateMusicItem(i); } } // End of namespace Neverhood diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h index 39bf7cd096..b724e898f0 100644 --- a/engines/neverhood/sound.h +++ b/engines/neverhood/sound.h @@ -23,6 +23,7 @@ #ifndef NEVERHOOD_SOUND_H #define NEVERHOOD_SOUND_H +#include "audio/audiostream.h" #include "common/array.h" #include "graphics/surface.h" #include "neverhood/neverhood.h" @@ -30,6 +31,29 @@ namespace Neverhood { +// Convert volume from percent to 0..255 +#define VOLUME(volume) (Audio::Mixer::kMaxChannelVolume / 100 * (volume)) + +// Convert panning from percent (50% equals center) to -127..0..+127 +#define PANNING(panning) (254 / 100 * (panning) - 127) + +class SoundResource { +public: + SoundResource(NeverhoodEngine *vm); + ~SoundResource(); + bool isPlaying(); + void load(uint32 fileHash); + void unload(); + void play(uint32 fileHash); + void play(); + void stop(); + void setVolume(int16 volume); + void setPan(int16 pan); +protected: + NeverhoodEngine *_vm; + int16 _soundIndex; +}; + class MusicResource { public: MusicResource(NeverhoodEngine *vm); @@ -38,8 +62,10 @@ public: void unload(); void play(int16 fadeVolumeStep); void stop(int16 fadeVolumeStep); + void setVolume(int16 volume); protected: NeverhoodEngine *_vm; + int16 _musicIndex; }; struct MusicItem { @@ -72,6 +98,8 @@ struct SoundItem { ~SoundItem(); }; +// TODO Give this a better name + class SoundMan { public: SoundMan(NeverhoodEngine *vm); @@ -122,10 +150,102 @@ protected: MusicItem *getMusicItemByHash(uint32 musicFileHash); SoundItem *getSoundItemByHash(uint32 soundFileHash); + int16 addMusicItem(MusicItem *musicItem); + int16 addSoundItem(SoundItem *soundItem); void deleteSoundByIndex(int index); }; +class NeverhoodAudioStream : public Audio::AudioStream { +public: + NeverhoodAudioStream(int rate, byte shiftValue, bool isLooping, DisposeAfterUse::Flag disposeStream, Common::SeekableReadStream *stream); + ~NeverhoodAudioStream(); + int readBuffer(int16 *buffer, const int numSamples); + bool isStereo() const { return _isStereo; } + bool endOfData() const { return _endOfData; } + int getRate() const { return _rate; } +private: + const int _rate; + const bool _isLooping; + const bool _isStereo; + const byte _shiftValue; + const bool _isCompressed; + int16 _prevValue; + Common::DisposablePtr _stream; + bool _endOfData; + byte *_buffer; + enum { + kSampleBufferLength = 2048 + }; + int fillBuffer(int maxSamples); +}; + +// TODO Rename these + +struct AudioResourceManSoundItem { + uint32 _fileHash; + int _resourceHandle; + byte *_data; + bool _isLoaded; + bool _isPlaying; + int16 _volume; + int16 _panning; + Audio::SoundHandle _soundHandle; +}; + +struct AudioResourceManMusicItem { + uint32 _fileHash; + // streamIndex dw + // needCreate db + bool _isPlaying; + bool _remove; + int16 _volume; + int16 _panning; + bool _start; + bool _isFadingIn; + bool _isFadingOut; + int16 _fadeVolume; + int16 _fadeVolumeStep; + Audio::SoundHandle _soundHandle; + // status dw + // updateCounter dd +}; + +class AudioResourceMan { +public: + AudioResourceMan(NeverhoodEngine *vm); + ~AudioResourceMan(); + + int16 addSound(uint32 fileHash); + void removeSound(int16 soundIndex); + void loadSound(int16 soundIndex); + void unloadSound(int16 soundIndex); + void setSoundVolume(int16 soundIndex, int16 volume); + void setSoundPan(int16 soundIndex, int16 pan); + void playSound(int16 soundIndex, bool looping); + void stopSound(int16 soundIndex); + bool isSoundPlaying(int16 soundIndex); + + int16 loadMusic(uint32 fileHash); + void unloadMusic(int16 musicIndex); + void setMusicVolume(int16 musicIndex, int16 volume); + void playMusic(int16 musicIndex, int16 fadeVolumeStep); + void stopMusic(int16 musicIndex, int16 fadeVolumeStep); + bool isMusicPlaying(int16 musicIndex); + void updateMusicItem(int16 musicIndex); + + void update(); + +protected: + NeverhoodEngine *_vm; + + Common::Array _musicItems; + Common::Array _soundItems; + + int16 addSoundItem(AudioResourceManSoundItem *soundItem); + +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_SOUND_H */ -- cgit v1.2.3 From f5a8c9d90d66de98f7eba43a2de0c4fdf3517a0d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 23 Sep 2012 12:12:37 +0000 Subject: NEVERHOOD: Add most SoundMan remaining calls Except for those which need a sound hash array (later) --- engines/neverhood/gamemodule.cpp | 6 +-- engines/neverhood/klayman.cpp | 6 +-- engines/neverhood/module1600.cpp | 4 +- engines/neverhood/module1700.cpp | 10 ++--- engines/neverhood/module1800.cpp | 13 +++--- engines/neverhood/module1900.cpp | 2 +- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2100.cpp | 6 +-- engines/neverhood/module2200.cpp | 46 ++++++++++---------- engines/neverhood/module2300.cpp | 22 +++++----- engines/neverhood/module2400.cpp | 32 +++++++------- engines/neverhood/module2500.cpp | 6 +-- engines/neverhood/module2600.cpp | 12 +++--- engines/neverhood/module2700.cpp | 22 +++++----- engines/neverhood/module2800.cpp | 81 +++++++++++++++++------------------ engines/neverhood/module3000.cpp | 60 +++++++++++++------------- engines/neverhood/navigationscene.cpp | 12 +++--- engines/neverhood/navigationscene.h | 1 + 18 files changed, 169 insertions(+), 174 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7841e278c3..3cd7e1d3ed 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -51,13 +51,13 @@ GameModule::GameModule(NeverhoodEngine *vm) // Other initializations moved to actual engine class // TODO - // TODO SoundMan_playSoundThree(0x2D0031, 0x8861079); + _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079); SetMessageHandler(&GameModule::handleMessage); } GameModule::~GameModule() { - // TODO SoundMan_deleteSoundGroup(0x2D0031); + _vm->_soundMan->deleteSoundGroup(0x002D0031); delete _childObject; _childObject = NULL; // TODO: Set palette to black but probably not neccessary @@ -300,7 +300,7 @@ void GameModule::startup() { // createModule(1500, 0); // Logos and intro video //Real #if 1 _vm->gameState().sceneNum = 0; - createModule(1400, -1); + createModule(1200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 00008830e7..87ab6e00d2 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4733,11 +4733,11 @@ void KmScene2205::sub423980() { KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // TODO SoundMan_addSound(0x80101800, 0xD3B02847); + _vm->_soundMan->addSound(0x80101800, 0xD3B02847); } KmScene2206::~KmScene2206() { - // TODO SoundMan_deleteSoundGroup(0x80101800); + _vm->_soundMan->deleteSoundGroup(0x80101800); } void KmScene2206::xUpdate() { @@ -4852,7 +4852,7 @@ void KmScene2206::sub482490() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(&KmScene2206::spriteUpdate482450); - // TODO SoundMan_playSoundLooping(0xD3B02847); + _vm->_soundMan->playSoundLooping(0xD3B02847); } } diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 77d135d4a6..5ff6cd017e 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -46,12 +46,12 @@ Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) // TODO SoundMan_addSoundList(0x1A008D8, dword_4B3BB0, true); // TODO SoundMan_setSoundListParams(dword_4B3BB0, true, 50, 600, 5, 150); - // TODO SoundMan_playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0); } Module1600::~Module1600() { - // TODO SoundMan_deleteGroup(0x1A008D8); + _vm->_soundMan->deleteGroup(0x1A008D8); } void Module1600::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 696f646af1..005792679c 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -27,10 +27,10 @@ namespace Neverhood { Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource(vm) { - // TODO SoundMan_addMusic(0x04212331); + _vm->_soundMan->addMusic(0x04212331, 0x31114225); // TODO SoundMan_addSoundList(0x04212331, dword_4AE930, true); // TODO SoundMan_setSoundListParams(dword_4AE930, true, 50, 600, 5, 150); - // TODO SoundMan_playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -45,7 +45,7 @@ Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) } Module1700::~Module1700() { - // TODO SoundMan_deleteGroup(0x04212331); + _vm->_soundMan->deleteGroup(0x04212331); } void Module1700::createScene(int sceneNum, int which) { @@ -68,7 +68,7 @@ void Module1700::createScene(int sceneNum, int which) { break; case 4: // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); - // TODO SoundMan_startMusic(0x31114225, 0, 2, 1); + _vm->_soundMan->startMusic(0x31114225, 0, 2); _childObject = new Scene1705(_vm, this, which); break; } @@ -97,7 +97,7 @@ void Module1700::updateScene() { createScene(1, 1); } else if (_moduleResult == 2) { if (!_soundResource.isPlaying()) { - // TODO _soundResource.setVolume(60); + _soundResource.setVolume(60); _soundResource.play(0x58B45E58); } createScene(2, 2); diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 7526a3aa76..fc31b2d0c5 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -30,7 +30,7 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) // TODO SoundMan_addSoundList(0x04A14718, dword_4AFE70); // TODO SoundMan_setSoundListParams(dword_4AFE70, true, 50, 600, 10, 150); - // TODO SoundMan_playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); + _vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -45,7 +45,7 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) } Module1800::~Module1800() { - // TODO SoundMan_deleteGroup(0x04A14718); + _vm->_soundMan->deleteGroup(0x04A14718); } void Module1800::createScene(int sceneNum, int which) { @@ -73,7 +73,7 @@ void Module1800::createScene(int sceneNum, int which) { createNavigationScene(0x004AFE40, which); break; case 6: - // TODO SoundMan_deleteGroup(0x04A14718); + _vm->_soundMan->deleteGroup(0x04A14718); createSmackerScene(0x08D84010, true, true, false); break; case 7: @@ -156,12 +156,9 @@ void Module1800::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 0: -#if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (navigationScene->soundFlag1 && navigationScene->index == 2) { - // TODO SoundMan_setTwoSoundsPlayFlag(false); + if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 2) { + _vm->_soundMan->setTwoSoundsPlayFlag(false); } -#endif break; } } diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index bf1aad6a49..d432bcb6e8 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -42,7 +42,7 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) } Module1900::~Module1900() { - // TODO SoundMan_deleteGroup(0x04E1C09C); + _vm->_soundMan->deleteGroup(0x04E1C09C); } void Module1900::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index e07129134c..d1d6b82577 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -40,7 +40,7 @@ Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) } Module2000::~Module2000() { - // TODO SoundMan_deleteGroup(0x81293110); + _vm->_soundMan->deleteGroup(0x81293110); } void Module2000::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 33c9d23cbf..fd2a793a28 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -29,7 +29,7 @@ namespace Neverhood { Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO SoundMan_addMusic(0x10A10C14, 0x11482B95); + _vm->_soundMan->addMusic(0x10A10C14, 0x11482B95); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -44,7 +44,7 @@ Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) } Module2100::~Module2100() { - // TODO SoundMan_deleteMusicGroup(0x10A10C14); + _vm->_soundMan->deleteMusicGroup(0x10A10C14); } void Module2100::createScene(int sceneNum, int which) { @@ -52,7 +52,7 @@ void Module2100::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_startMusic(0x11482B95, 0, 1, 1); + _vm->_soundMan->startMusic(0x11482B95, 0, 1); _childObject = new Scene2101(_vm, this, which); break; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index cbd232e834..bb2f59b340 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -33,7 +33,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) debug("Create Module2200(%d)", which); - // TODO: SoundMan_addMusic(0x11391412, 0x601C908C); + _vm->_soundMan->addMusic(0x11391412, 0x601C908C); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -44,7 +44,7 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) } Module2200::~Module2200() { - // TODO SoundMan_deleteGroup(0x11391412); + _vm->_soundMan->deleteGroup(0x11391412); } void Module2200::createScene(int sceneNum, int which) { @@ -57,23 +57,23 @@ void Module2200::createScene(int sceneNum, int which) { _childObject = new Scene2201(_vm, this, which); break; case 1: - // TODO SoundMan_startMusic(0x601C908C, 0, 2, 1); + _vm->_soundMan->startMusic(0x601C908C, 0, 2); _childObject = new Scene2202(_vm, this, which); break; case 2: - // TODO SoundMan_startMusic(0x601C908C, 0, 2, 1); + _vm->_soundMan->startMusic(0x601C908C, 0, 2); _childObject = new Scene2203(_vm, this, which); break; case 3: - // TODO SoundMan_stopMusic(0x601C908C, 0, 2); + _vm->_soundMan->stopMusic(0x601C908C, 0, 2); _childObject = new DiskplayerScene(_vm, this, 3); break; case 4: - // TODO SoundMan_stopMusic(0x601C908C, 0, 2); + _vm->_soundMan->stopMusic(0x601C908C, 0, 2); _childObject = new Scene2205(_vm, this, which); break; case 5: - // TODO SoundMan_stopMusic(0x601C908C, 0, 2); + _vm->_soundMan->stopMusic(0x601C908C, 0, 2); _childObject = new Scene2206(_vm, this, which); break; case 6: @@ -576,19 +576,19 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) insertSprite(); - // TODO SoundMan_addSound(0x04106220, 0x81212040, true); + _vm->_soundMan->addSound(0x04106220, 0x81212040); } Scene2201::~Scene2201() { setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); - // TODO SoundMan_deleteSoundGroup(0x04106220); + _vm->_soundMan->deleteSoundGroup(0x04106220); } void Scene2201::update() { Scene::update(); if (!_soundFlag) { - // TODO SoundMan_playSoundLooping(0x81212040); + _vm->_soundMan->playSoundLooping(0x81212040); _soundFlag = true; } } @@ -918,13 +918,13 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) _soundResource1.load(0x68E25540); _soundResource2.load(0x40400457); - // TODO SoundMan_addSound(0x60400854, 0x8101A241, true); - // TODO SoundMan_playSoundLooping(0x8101A241); + _vm->_soundMan->addSound(0x60400854, 0x8101A241); + _vm->_soundMan->playSoundLooping(0x8101A241); } Scene2202::~Scene2202() { - // TODO SoundMan_deleteSoundGroup(0x60400854); + _vm->_soundMan->deleteSoundGroup(0x60400854); } void Scene2202::update() { @@ -1714,7 +1714,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene } AsScene2207Elevator::~AsScene2207Elevator() { - // TODO SoundMan_deleteSoundGroup(0x02700413); + _vm->_soundMan->deleteSoundGroup(0x02700413); } void AsScene2207Elevator::update() { @@ -1727,7 +1727,7 @@ void AsScene2207Elevator::update() { if (_destPointIndexDelta != 0) { _destPointIndexDelta = 0; } else { - // TODO SoundMan_deleteSound(0xD3B02847); + _vm->_soundMan->deleteSound(0xD3B02847); _soundResource.play(0x53B8284A); } } @@ -1743,7 +1743,7 @@ void AsScene2207Elevator::update() { if (_destPointIndexDelta != 0) { _destPointIndexDelta = 0; } else { - // TODO SoundMan_deleteSound(0xD3B02847); + _vm->_soundMan->deleteSound(0xD3B02847); _soundResource.play(0x53B8284A); } } @@ -1802,8 +1802,8 @@ void AsScene2207Elevator::moveToY(int16 y) { } else { _destPointIndexDelta = 2; } - // TODO SoundMan_addSound(0x02700413, 0xD3B02847, true); - // TODO SoundMan_playSoundLooping(0xD3B02847); + _vm->_soundMan->addSound(0x02700413, 0xD3B02847); + _vm->_soundMan->playSoundLooping(0xD3B02847); } _isMoving = true; @@ -1888,7 +1888,7 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm } AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { - // TODO SoundMan_deleteSoundGroup(0x80D00820); + _vm->_soundMan->deleteSoundGroup(0x80D00820); } uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1897,14 +1897,14 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag case 0x100D: if (!_idle) { if (param.asInteger() == 0x3423093) { - // TODO SoundMan_addSound(0x80D00820, 0x12121943, true); - // TODO SoundMan_playSoundLooping(0x12121943); + _vm->_soundMan->addSound(0x80D00820, 0x12121943); + _vm->_soundMan->playSoundLooping(0x12121943); } else if (param.asInteger() == 0x834AB011) { _soundResource1.stop(); _soundResource2.stop(); _soundResource3.stop(); _soundResource4.stop(); - // TODO SoundMan_deleteSound(0x12121943); + _vm->_soundMan->deleteSound(0x12121943); } else if (param.asInteger() == 0x3A980501) { _soundResource2.play(); } else if (param.asInteger() == 0x2A2AD498) { @@ -1949,7 +1949,7 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() { _soundResource2.stop(); _soundResource3.stop(); _soundResource4.stop(); - // TODO SoundMan_deleteSound(0x12121943); + _vm->_soundMan->deleteSound(0x12121943); _idle = true; setVisible(false); } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index d3346eb31f..3f7c5e6616 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -33,14 +33,14 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) _flag = getGlobalVar(0x10938830) == 0; if (_flag) { - // TODO SoundMan_setSoundVolume(0x90F0D1C3, 0); - // TODO SoundMan_playSoundLooping(0x90F0D1C3); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); + _vm->_soundMan->playSoundLooping(0x90F0D1C3); } else { - // TODO SoundMan_setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0); } - // TODO SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); - // TODO SoundMan_playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0); if (which < 0) { createScene(_vm->gameState().sceneNum, -1); @@ -59,7 +59,7 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) } Module2300::~Module2300() { - // TODO SoundMan_deleteGroup(0x1A214010); + _vm->_soundMan->deleteGroup(0x1A214010); } void Module2300::createScene(int sceneNum, int which) { @@ -73,7 +73,7 @@ void Module2300::createScene(int sceneNum, int which) { createNavigationScene(0x004B67E8, which); if (_flag) { _volume = 15; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, 15); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 15); } break; case 2: @@ -83,16 +83,16 @@ void Module2300::createScene(int sceneNum, int which) { if (getGlobalVar(0x10938830)) { createNavigationScene(0x004B68F0, which); } else { - // TODO SoundMan_setSoundVolume(0x90F0D1C3, _volume); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _volume); createNavigationScene(0x004B68A8, which); if (_flag) { _volume = 87; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, 87); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 87); } } break; case 4: - // TODO SoundMan_setTwoSoundsPlayFlag(true); + _vm->_soundMan->setTwoSoundsPlayFlag(true); createSmackerScene(0x20080A0B, true, true, false); break; } @@ -140,7 +140,7 @@ void Module2300::updateScene() { } break; case 4: - // TODO SoundMan_setTwoSoundsPlayFlag(false); + _vm->_soundMan->setTwoSoundsPlayFlag(false); createScene(1, 2); break; } diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index f2f2da97d0..f1f9f04777 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -27,7 +27,7 @@ namespace Neverhood { Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO SoundMan_addMusic(0x202D1010, 0xB110382D); + _vm->_soundMan->addMusic(0x202D1010, 0xB110382D); if (which < 0) { createScene(_vm->gameState().sceneNum, _vm->gameState().which); @@ -38,7 +38,7 @@ Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) } Module2400::~Module2400() { - // TODO SoundMan_deleteMusicGroup(0x202D1010); + _vm->_soundMan->deleteMusicGroup(0x202D1010); } void Module2400::createScene(int sceneNum, int which) { @@ -46,27 +46,27 @@ void Module2400::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_stopMusic(0xB110382D, 0, 0); + _vm->_soundMan->stopMusic(0xB110382D, 0, 0); _childObject = new Scene2401(_vm, this, which); break; case 1: - // TODO SoundMan_startMusic(0xB110382D, 0, 2, 1); + _vm->_soundMan->startMusic(0xB110382D, 0, 2); _childObject = new Scene2402(_vm, this, which); break; case 2: - // TODO SoundMan_startMusic(0xB110382D, 0, 0, 1); + _vm->_soundMan->startMusic(0xB110382D, 0, 0); _childObject = new Scene2403(_vm, this, which); break; case 4: - // TODO SoundMan_stopMusic(0xB110382D, 0, 2); + _vm->_soundMan->stopMusic(0xB110382D, 0, 2); _childObject = new DiskplayerScene(_vm, this, 0); break; case 5: - // TODO SoundMan_startMusic(0xB110382D, 0, 2, 1); + _vm->_soundMan->startMusic(0xB110382D, 0, 2); _childObject = new Scene2406(_vm, this, which); break; case 6: - // TODO SoundMan_stopMusic(0xB110382D, 0, 2); + _vm->_soundMan->stopMusic(0xB110382D, 0, 2); createSmackerScene(0x20D80001, true, true, false); break; case 7: @@ -247,7 +247,7 @@ AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm) } AsScene2401FlowingWater::~AsScene2401FlowingWater() { - // TODO SoundMan_deleteSoundGroup(0x40F11C09); + _vm->_soundMan->deleteSoundGroup(0x40F11C09); } uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -260,15 +260,15 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam break; case 0x2002: if (!_isWaterFlowing) { - // TODO SoundMan_addSound(0x40F11C09, 0x980C1420, true); - // TODO SoundMan_playSoundLooping(0x980C1420); + _vm->_soundMan->addSound(0x40F11C09, 0x980C1420); + _vm->_soundMan->playSoundLooping(0x980C1420); startAnimation(0x10203116, 0, -1); setVisible(true); _isWaterFlowing = true; } break; case 0x2003: - // TODO SoundMan_deleteSound(0x980C1420); + _vm->_soundMan->deleteSound(0x980C1420); _isWaterFlowing = false; break; case 0x3002: @@ -664,7 +664,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) } AsScene2402TV::~AsScene2402TV() { - // TODO SoundMan_deleteSoundGroup(0x01520123); + _vm->_soundMan->deleteSoundGroup(0x01520123); } void AsScene2402TV::upWait() { @@ -687,12 +687,12 @@ void AsScene2402TV::upFocusKlayman() { startAnimation(0x050A0103, _currFrameIndex, -1); _newStickFrameIndex = _currFrameIndex; if (_countdown2 == 0) { - // TODO SoundMan_addSound(0x01520123, 0xC42D4528, true); - // TODO SoundMan_playSoundLooping(0xC42D4528); + _vm->_soundMan->addSound(0x01520123, 0xC42D4528); + _vm->_soundMan->playSoundLooping(0xC42D4528); } _countdown2 = 5; } else if (_countdown2 != 0 && (--_countdown2 == 0)) { - // TODO SoundMan_deleteSound(0xC42D4528); + _vm->_soundMan->deleteSound(0xC42D4528); } AnimatedSprite::update(); } diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 822204f36d..a12c516cbf 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -59,8 +59,8 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _soundIndex(0) { - // TODO SoundMan_addMusic(0x29220120, 0x05343184); - // TODO SoundMan_startMusic(0x05343184, 0, 0, 1); + _vm->_soundMan->addMusic(0x29220120, 0x05343184); + _vm->_soundMan->startMusic(0x05343184, 0, 0); SetMessageHandler(&Module2500::handleMessage); if (which < 0) { @@ -77,7 +77,7 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) } Module2500::~Module2500() { - // TODO SoundMan_deleteMusicGroup(0x29220120); + _vm->_soundMan->deleteMusicGroup(0x29220120); } void Module2500::createScene(int sceneNum, int which) { diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index be0503774e..9106eeb8b6 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -37,12 +37,12 @@ Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) // TODO SoundMan_addSoundList(0x40271018, dword_4B87E8, true); // TODO SoundMan_setSoundListParams(dword_4B87E8, true, 50, 600, 5, 150); - // TODO SoundMan_playTwoSounds(0x40271018, 0x41861371, 0x43A2507F); + _vm->_soundMan->playTwoSounds(0x40271018, 0x41861371, 0x43A2507F, 0); } Module2600::~Module2600() { - // TODO SoundMan_deleteGroup(0x40271018); + _vm->_soundMan->deleteGroup(0x40271018); } void Module2600::createScene(int sceneNum, int which) { @@ -72,7 +72,7 @@ void Module2600::createScene(int sceneNum, int which) { createNavigationScene(0x004B8698, which); break; case 7: - // TODO SoundMan_deleteGroup(0x40271018); + _vm->_soundMan->deleteGroup(0x40271018); createSmackerScene(0x30090001, true, true, false); break; case 8: @@ -268,7 +268,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) setDoDeltaX(1); createSurface1(0x9C210C90, 1200); setClipRect(260, 260, 400, 368); - // TODO SoundMan_addSound(0xDC2769B0, true); + _vm->_soundMan->addSound(0xDC2769B0, true); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2609Water::handleMessage); if (getGlobalVar(0x4E0BE910)) @@ -281,12 +281,12 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m case 0x2001: stopAnimation(); setVisible(false); - // TODO SoundMan_stopSound(0xDC2769B0); + _vm->_soundMan->stopSound(0xDC2769B0); break; case 0x2002: startAnimation(0x9C210C90, 0, -1); setVisible(true); - // TODO SoundMan_playSoundLooping(0xDC2769B0); + _vm->_soundMan->playSoundLooping(0xDC2769B0); break; } return messageResult; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index a91eea294b..aa5c98e4c2 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -86,8 +86,8 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) { - // TODO SoundMan_addMusic(0x42212411, 0x04020210); - // TODO SoundMan_startMusic(0x04020210, 24, 2, 1); + _vm->_soundMan->addMusic(0x42212411, 0x04020210); + _vm->_soundMan->startMusic(0x04020210, 24, 2); SetMessageHandler(&Module2700::handleMessage); if (which < 0) { @@ -107,7 +107,7 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) } Module2700::~Module2700() { - // TODO SoundMan_deleteGroup(0x42212411); + _vm->_soundMan->deleteGroup(0x42212411); } void Module2700::createScene(int sceneNum, int which) { @@ -414,9 +414,9 @@ void Module2700::updateScene() { case 21: // TODO? GameState_sub_469C50(&field_52, 0); // TODO MusicMan_stopAll (if field_52 above = 1) - // TODO SoundMan_deleteMusic(_musicFileHash); - // TODO SoundMan_startMusic(0x04020210, 0, 2, 1); - // TODO SoundMan_deleteSoundGroup(0x42212411); + _vm->_soundMan->deleteMusic(_musicFileHash); + _vm->_soundMan->startMusic(0x04020210, 0, 2); + _vm->_soundMan->deleteSoundGroup(0x42212411); createScene(20, 3); break; case 22: @@ -458,15 +458,15 @@ void Module2700::updateScene() { switch (_vm->gameState().sceneNum) { case 21: if (!_flag1) { - // TODO SoundMan_stopMusic(0x04020210, 0, 1); + _vm->_soundMan->stopMusic(0x04020210, 0, 1); // TODO _vm->gameModule()->initScene2801Vars(); _musicFileHash = getGlobalVar(0x89A82A15); // TODO? GameState_sub_469C50(&field_52, 0); // TODO MusicMan_create(); // Why? - // TODO SoundMan_addMusic(0x42212411, _musicFileHash); - // TODO SoundMan_startMusic(_musicFileHash, 0, /*TODO */???, 1); - // TODO SoundMan_addSound(0x42212411, 0x44014282, true); - // TODO SoundMan_setSoundParams(0x44014282, true, 120, 360, 72, 0); + _vm->_soundMan->addMusic(0x42212411, _musicFileHash); + _vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */); + _vm->_soundMan->addSound(0x42212411, 0x44014282); + _vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0); _flag1 = true; } break; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 558819c73c..f6c67482e8 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -35,7 +35,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) _fileHash = 0; // TODO music stuff - // TODO SoundMan_addMusic(0x64210814, 0xD2FA4D14); + _vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14); setGlobalVar(0x28D8C940, 1); if (which < 0) { @@ -52,8 +52,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) Module2800::~Module2800() { // TODO music stuff - // TODO SoundMan_deleteGroup(0x64210814); - // TODO Module2800_sub471DF0(); + _vm->_soundMan->deleteGroup(0x64210814); } void Module2800::createScene(int sceneNum, int which) { @@ -61,11 +60,11 @@ void Module2800::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0); + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); _childObject = new Scene2801(_vm, this, which); break; case 1: - // TODO SoundMan_stopMusic(0xD2FA4D14, 0, 0); + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); #if 0 _flag = true; // DEBUG! if (_flag) { @@ -76,7 +75,7 @@ void Module2800::createScene(int sceneNum, int which) { #endif break; case 2: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); //setGlobalVar(0x1860C990,1);//DEBUG if (getGlobalVar(0x1860C990)) _childObject = new Scene2803b(_vm, this, which); @@ -87,98 +86,98 @@ void Module2800::createScene(int sceneNum, int which) { _childObject = new Scene2804(_vm, this, which); break; case 4: - // TODO SoundMan_stopMusic(0xD2FA4D14, 0, 2); + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); break; case 5: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2806(_vm, this, which); break; case 6: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2807(_vm, this, which); break; case 7: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2808(_vm, this, 0); break; case 8: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2809(_vm, this, which); break; case 9: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2810(_vm, this, which); break; case 10: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2808(_vm, this, 1); break; case 11: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2812(_vm, this, which); break; case 12: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008); break; case 13: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x81C60635, 0x60631814); break; case 14: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0); break; case 15: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC); break; case 16: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0); break; case 17: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018); break; case 18: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018); break; case 19: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x10866205, 0x66201100); break; case 20: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x01C58000, 0x58004014); break; case 21: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2822(_vm, this, which); break; case 22: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948); break; case 23: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040); break; case 24: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A); break; case 25: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); if (getGlobalVar(0x190A1D18)) _childObject = new Class152(_vm, this, 0x01600204, 0x0020001E); else _childObject = new Class152(_vm, this, 0x08611204, 0x1120008E); break; case 26: - // TODO SoundMan_startMusic(0xD2FA4D14, 0, 2, 1); + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new DiskplayerScene(_vm, this, 4); break; // @@ -359,10 +358,10 @@ void Module2800::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 0: - // TODO Module2800_sub4731E0(true); + // TODO Module2800_updateMusic(true); break; case 1: - // TODO Module2800_sub4731E0(false); + // TODO Module2800_updateMusic(false); break; } } @@ -1527,7 +1526,7 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene _needRefresh = true; AnimatedSprite::updatePosition(); _soundResource.load(0x6352F051); - // TODO SoundMan_addSound(0xC5EA0B28, 0xEF56B094, true); + _vm->_soundMan->addSound(0xC5EA0B28, 0xEF56B094); SetUpdateHandler(&AsScene2804BeamCoil::update); SetMessageHandler(&AsScene2804BeamCoil::handleMessage); } @@ -1572,13 +1571,13 @@ void AsScene2804BeamCoil::hide() { setVisible(false); _ssBeamCoilBody->setVisible(false); // TODO _ssBeamCoilBody->update(); -> hide() - // TODO SoundMan_stopSound(0xEF56B094); + _vm->_soundMan->stopSound(0xEF56B094); } void AsScene2804BeamCoil::stBeaming() { startAnimation(0x00494891, 93, -1); NextState(&AsScene2804BeamCoil::stBeaming); - // TODO SoundMan_playSoundLooping(0xEF56B094); + _vm->_soundMan->playSoundLooping(0xEF56B094); } uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2735,9 +2734,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE738); _klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); - // TODO SoundMan_addSound(0x84400112, 0xC874EE6C, true); - // TODO SoundMan_playSoundLooping(0xC874EE6C); - // TODO SoundMan_setSoundVolume(0xC874EE6C, 50); + _vm->_soundMan->addSound(0x84400112, 0xC874EE6C); + _vm->_soundMan->playSoundLooping(0xC874EE6C); + _vm->_soundMan->setSoundVolume(0xC874EE6C, 50); _flag1 = false; } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { if (getGlobalVar(0x1860C990)) { @@ -2798,7 +2797,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) Scene2810::~Scene2810() { setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); setGlobalVar(0x00D30138, _klayman->getX()); - // TODO SoundMan_deleteSoundGroup(0x84400112); + _vm->_soundMan->deleteSoundGroup(0x84400112); } void Scene2810::sub406650() { @@ -2887,7 +2886,7 @@ AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm) } AsScene2812Winch::~AsScene2812Winch() { - // TODO SoundMan_deleteSoundGroup(0x00B000E2); + _vm->_soundMan->deleteSoundGroup(0x00B000E2); } uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2896,8 +2895,8 @@ uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m case 0x2000: startAnimation(0x20DA08A0, 0, -1); setVisible(true); - // TODO SoundMan_addSound(0x00B000E2, 0xC874EE6C, true); - // TODO SoundMan_playSoundLooping(0xC874EE6C); + _vm->_soundMan->addSound(0x00B000E2, 0xC874EE6C); + _vm->_soundMan->playSoundLooping(0xC874EE6C); break; case 0x3002: startAnimation(0x20DA08A0, 7, -1); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index ab86c48fc8..b76f9c7c60 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -31,16 +31,16 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) // TODO SoundMan_addSoundList(0x81293110, dword_4B7FC8, true); // TODO SoundMan_setSoundListParams(dword_4B7FC8, true, 50, 600, 5, 150); - // TODO SoundMan_setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000); - // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); - // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000); + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); _flag = getGlobalVar(0x10938830) != 0; if (_flag) { - // TODO SoundMan_setSoundVolume(0x90F0D1C3, 0); - // TODO SoundMan_playSoundLooping(0x90F0D1C3); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); + _vm->_soundMan->playSoundLooping(0x90F0D1C3); } if (which < 0) { @@ -58,7 +58,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) } Module3000::~Module3000() { - // TODO SoundMan_deleteGroup(0x81293110); + _vm->_soundMan->deleteGroup(0x81293110); } void Module3000::createScene(int sceneNum, int which) { @@ -77,10 +77,10 @@ void Module3000::createScene(int sceneNum, int which) { } break; case 2: - // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); if (_flag) { _soundVolume = 90; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, 90); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 90); } if (getGlobalVar(0x10938830)) { createNavigationScene(0x004B7D58, which); @@ -181,10 +181,10 @@ void Module3000::updateScene() { } break; case 2: - // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); if (_flag) { _soundVolume = 0; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, 0); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); } if (_moduleResult == 0) { createScene(3, 0); @@ -275,26 +275,26 @@ void Module3000::updateScene() { int navigationIndex = navigationScene()->getIndex(); if (navigationIndex == 1) { if (frameNumber == 0) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO SoundMan_setSoundVolume(0x48498E46, 70); - // TODO SoundMan_setSoundVolume(0x50399F64, 70); + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); } else if (frameNumber == 100) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); } } else if (navigationIndex == 0) { if (frameNumber == 0) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO SoundMan_setSoundVolume(0x48498E46, 70); - // TODO SoundMan_setSoundVolume(0x50399F64, 70); + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); } else if (frameNumber == 10) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); } if (_flag && _soundVolume < 90 && frameNumber % 2) { if (frameNumber == 0) _soundVolume = 40; else _soundVolume++; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } } } @@ -307,17 +307,17 @@ void Module3000::updateScene() { int navigationIndex = navigationScene()->getIndex(); if (_flag && _soundVolume > 1 && frameNumber % 2) { _soundVolume--; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } if (navigationIndex == 0) { if (frameNumber == 35) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); } } else if (navigationIndex == 1) { if (frameNumber == 55) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - // TODO SoundMan_setSoundVolume(0x48498E46, 70); - // TODO SoundMan_setSoundVolume(0x50399F64, 70); + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); } } } @@ -330,25 +330,23 @@ void Module3000::updateScene() { int navigationIndex = navigationScene()->getIndex(); if (navigationIndex == 2) { if (frameNumber == 40) { - // TODO SoundMan_playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); } if (_flag && _soundVolume < 90 && frameNumber % 2) { if (frameNumber == 0) _soundVolume = 40; else _soundVolume++; - // TODO SoundMan_setSoundVolume(0x90F0D1C3, _soundVolume); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } } } #endif break; case 5: -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1() && navigationScene()->getIndex() == 0) { - // TODO SoundMan_setTwoSoundsPlayFlag(false); + if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 0) { + _vm->_soundMan->setTwoSoundsPlayFlag(false); } -#endif break; } } diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 981e703c2e..a3e15369ae 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -60,8 +60,8 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint } NavigationScene::~NavigationScene() { - // TODO SoundMan_setTwoSoundsPlayFlag(false); - // TODO SoundMan_setSoundThreePlayFlag(false); + _vm->_soundMan->setTwoSoundsPlayFlag(false); + _vm->_soundMan->setSoundThreePlayFlag(false); } int NavigationScene::getNavigationAreaType() { @@ -88,8 +88,8 @@ void NavigationScene::update() { _soundFlag2 = false; _soundFlag1 = false; _interactive = true; - // TODO SoundMan_setTwoSoundsPlayFlag(false); - // TODO SoundMan_setSoundThreePlayFlag(false); + _vm->_soundMan->setTwoSoundsPlayFlag(false); + _vm->_soundMan->setSoundThreePlayFlag(false); _smackerDone = false; _smackerPlayer->open(navigationItem.fileHash, true); _vm->_screen->clear(); @@ -205,11 +205,11 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } if (oldSoundFlag2 != _soundFlag2) { - // TODO SoundMan_setSoundThreePlayFlag(_soundFlag2); + _vm->_soundMan->setSoundThreePlayFlag(_soundFlag2); } if (oldSoundFlag1 != _soundFlag1) { - // TODO SoundMan_setTwoSoundsPlayFlag(_soundFlag1); + _vm->_soundMan->setTwoSoundsPlayFlag(_soundFlag1); } } diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h index 4397a4372b..cf351d1bcd 100644 --- a/engines/neverhood/navigationscene.h +++ b/engines/neverhood/navigationscene.h @@ -34,6 +34,7 @@ public: NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes); virtual ~NavigationScene(); int getNavigationAreaType(); + int getNavigationIndex() const { return _navigationIndex; } bool getSoundFlag1() const { return _soundFlag1; } bool getSoundFlag2() const { return _soundFlag2; } protected: -- cgit v1.2.3 From a2bc19291216fd137a09fe6f9a9f5e6321e7b67e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 24 Sep 2012 11:08:24 +0000 Subject: NEVERHOOD: Add sound lists to all modules which have them --- engines/neverhood/module1100.cpp | 16 ++++++++++++-- engines/neverhood/module1300.cpp | 46 ++++++++++++++++++++++++---------------- engines/neverhood/module1600.cpp | 13 ++++++++++-- engines/neverhood/module1700.cpp | 21 ++++++++++++------ engines/neverhood/module1800.cpp | 16 +++++++++++--- engines/neverhood/module1900.cpp | 11 ++++++++-- engines/neverhood/module2300.cpp | 14 ++++++++++-- engines/neverhood/module2600.cpp | 13 ++++++++++-- engines/neverhood/module3000.cpp | 23 ++++++++++++++------ engines/neverhood/sound.cpp | 4 ++-- engines/neverhood/sound.h | 4 ++-- 11 files changed, 134 insertions(+), 47 deletions(-) diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index e948c2b045..e5cca2667d 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -26,6 +26,18 @@ namespace Neverhood { +static const uint32 kModule1100SoundList[] = { + 0x90805C50, + 0xB288D450, + 0x98C05840, + 0x98A01500, + 0xB4005E50, + 0x92025040, + 0x90035066, + 0x74E01054, + 0 +}; + Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { @@ -37,8 +49,8 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) createScene(9, 3); } - // TODO SoundMan_addSoundList(0x0002C818, dword_4B85B0, true); - // TODO SoundMan_setSoundListParams(dword_4B85B0, true, 50, 600, 20, 250); + _vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList); + _vm->_soundMan->setSoundListParams(kModule1100SoundList, true, 50, 600, 20, 250); _vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20); _vm->_soundMan->setSoundVolume(0x74E01054, 60); _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index ee4dc7a42c..45c68421eb 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -32,12 +32,22 @@ namespace Neverhood { +static const uint32 kModule1300SoundList[] = { + 0x16805648, + 0x16805C48, + 0xB4964448, + 0x96A05481, + 0xD0E14441, + 0x90815450, + 0 +}; + Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { _vm->_soundMan->addMusic(0x61C090, 0x203197); - // TODO SoundMan_addSoundList(0x61C090, dword_4B2868, true); - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 50, 600, 20, 150); + _vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150); _vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); _vm->_soundMan->setSoundVolume(0x48498E46, 70); _vm->_soundMan->setSoundVolume(0x50399F64, 70); @@ -102,82 +112,82 @@ void Module1300::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 1: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1302(_vm, this, which); break; case 2: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new Scene1303(_vm, this, which); break; case 3: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new Scene1304(_vm, this, which); break; case 4: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1305(_vm, this, which); break; case 5: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1306(_vm, this, which); break; case 6: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1307(_vm, this, which); break; case 7: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x203197, 0, 2); _childObject = new Scene1308(_vm, this, which); break; case 8: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new DiskplayerScene(_vm, this, 1); break; case 9: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createSmackerScene(0x20082818, true, true, false); break; case 10: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createSmackerScene(0x20082828, true, true, false); break; case 11: - // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B27A8, which); break; case 12: - // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2718, which); break; case 13: - // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B27D8, which); break; case 14: - // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2808, which); break; case 15: - // TODO SoundMan_setSoundListParams(0xdword_4B2868, true, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); createNavigationScene(0x004B2838, which); break; case 16: - // TODO SoundMan_setSoundListParams(dword_4B2868, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x203197, 0, 2); _childObject = new Scene1317(_vm, this, which); break; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 5ff6cd017e..864e4a6fed 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -27,6 +27,15 @@ namespace Neverhood { +static const uint32 kModule1600SoundList[] = { + 0x90805C50, + 0x90804450, + 0xB4005E60, + 0x91835066, + 0x90E14440, + 0 +}; + Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { @@ -44,8 +53,8 @@ Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - // TODO SoundMan_addSoundList(0x1A008D8, dword_4B3BB0, true); - // TODO SoundMan_setSoundListParams(dword_4B3BB0, true, 50, 600, 5, 150); + _vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList); + _vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150); _vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0); } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 005792679c..13d0f35198 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -24,12 +24,21 @@ namespace Neverhood { +static const uint32 kModule1700SoundList[] = { + 0xB288D450, + 0x90804450, + 0x99801500, + 0xB288D455, + 0x93825040, + 0 +}; + Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundResource(vm) { _vm->_soundMan->addMusic(0x04212331, 0x31114225); - // TODO SoundMan_addSoundList(0x04212331, dword_4AE930, true); - // TODO SoundMan_setSoundListParams(dword_4AE930, true, 50, 600, 5, 150); + _vm->_soundMan->addSoundList(0x04212331, kModule1700SoundList); + _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 50, 600, 5, 150); _vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); if (which < 0) { @@ -53,7 +62,7 @@ void Module1700::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); createSmackerScene(0x3028A005, true, true, false); break; case 1: @@ -63,11 +72,11 @@ void Module1700::createScene(int sceneNum, int which) { createNavigationScene(0x004AE8E8, which); break; case 3: - // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); createSmackerScene(0x01190041, true, true, false); break; case 4: - // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x31114225, 0, 2); _childObject = new Scene1705(_vm, this, which); break; @@ -80,7 +89,7 @@ void Module1700::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 0: - // TODO SoundMan_setSoundListParams(dword_4AE930, false, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 0, 0, 0, 0); createScene(1, 0); break; case 1: diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index fc31b2d0c5..14c48681fe 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -25,11 +25,21 @@ namespace Neverhood { +static const uint32 kModule1800SoundList[] = { + 0x16805548, + 0x16805048, + 0xD0E14441, + 0x90E090C2, + 0x90E1D0C2, + 0x90E2D0C2, + 0 +}; + Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - // TODO SoundMan_addSoundList(0x04A14718, dword_4AFE70); - // TODO SoundMan_setSoundListParams(dword_4AFE70, true, 50, 600, 10, 150); + _vm->_soundMan->addSoundList(0x04A14718, kModule1800SoundList); + _vm->_soundMan->setSoundListParams(kModule1800SoundList, true, 50, 600, 10, 150); _vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); if (which < 0) { @@ -77,7 +87,7 @@ void Module1800::createScene(int sceneNum, int which) { createSmackerScene(0x08D84010, true, true, false); break; case 7: - // TODO SoundMan_setSoundListParams(dword_4AFE70, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule1800SoundList, false, 0, 0, 0, 0); createSmackerScene(0x0168B121, true, true, false); break; case 8: diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index d432bcb6e8..c6ce15c461 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -25,6 +25,13 @@ namespace Neverhood { +static const uint32 kModule1900SoundList[] = { + 0xB4005E60, + 0x91835066, + 0x90E14440, + 0 +}; + Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { @@ -36,8 +43,8 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - // TODO SoundMan_addSoundList(0x04E1C09C, dword_4B8800, true); - // TODO SoundMan_setSoundListParams(dword_4B8800, true, 50, 600, 5, 150); + _vm->_soundMan->addSoundList(0x04E1C09C, kModule1900SoundList); + _vm->_soundMan->setSoundListParams(kModule1900SoundList, true, 50, 600, 5, 150); } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 3f7c5e6616..4f35122eb2 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -24,11 +24,21 @@ namespace Neverhood { +static const uint32 kModule2300SoundList[] = { + 0x90805C50, + 0x90804450, + 0xB4005E60, + 0x91835066, + 0x90E14440, + 0x90F0D1C3, + 0 +}; + Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _volume(0) { - // TODO SoundMan_addSoundList(0x1A214010, dword_4B6938, true); - // TODO SoundMan_setSoundListParams(dword_4B6938, true, 50, 600, 10, 10, 150); + _vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList); + _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); _flag = getGlobalVar(0x10938830) == 0; diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 9106eeb8b6..7cdfb69ed8 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -24,6 +24,15 @@ namespace Neverhood { +static const uint32 kModule2600SoundList[] = { + 0xB288D450, + 0x90804450, + 0x99801500, + 0xB288D455, + 0x93825040, + 0 +}; + Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { @@ -35,8 +44,8 @@ Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 1); } - // TODO SoundMan_addSoundList(0x40271018, dword_4B87E8, true); - // TODO SoundMan_setSoundListParams(dword_4B87E8, true, 50, 600, 5, 150); + _vm->_soundMan->addSoundList(0x40271018, kModule2600SoundList); + _vm->_soundMan->setSoundListParams(kModule2600SoundList, true, 50, 600, 5, 150); _vm->_soundMan->playTwoSounds(0x40271018, 0x41861371, 0x43A2507F, 0); } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index b76f9c7c60..3a6209e76a 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -26,11 +26,22 @@ namespace Neverhood { +static const uint32 kModule3000SoundList[] = { + 0x92025040, + 0x90035066, + 0x90815450, + 0x99801500, + 0x90E14440, + 0x16805048, + 0x90F0D1C3, + 0 +}; + Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _soundVolume(0) { - // TODO SoundMan_addSoundList(0x81293110, dword_4B7FC8, true); - // TODO SoundMan_setSoundListParams(dword_4B7FC8, true, 50, 600, 5, 150); + _vm->_soundMan->addSoundList(0x81293110, kModule3000SoundList); + _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 50, 600, 5, 150); _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000); _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); @@ -109,7 +120,7 @@ void Module3000::createScene(int sceneNum, int which) { createNavigationScene(0x004B7FB0, which, kNavigationTypes06); break; case 7: - // TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); if (!getSubVar(0x40050052, 0x089809C2)) { setSubVar(0x40050052, 0x089809C2, 1); createSmackerScene(0x90022001, true, true, false); @@ -126,7 +137,7 @@ void Module3000::createScene(int sceneNum, int which) { _childObject = new Scene3011(_vm, this, 0); break; case 11: - // TODO SoundMan_setSoundListParams(dword_4B7FC8, false, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); if (!getSubVar(0x40050052, 0x10130993)) { setSubVar(0x40050052, 0x10130993, 1); createSmackerScene(0x31093019, true, true, false); @@ -229,12 +240,12 @@ void Module3000::updateScene() { case 8: _flag = getGlobalVar(0x10938830); // CHECKME if (_moduleResult != 1) { - // TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0): + // TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0): createScene(4, 1); } else if (getGlobalVar(0xF0402B0A)) { createScene(1008, -1); } else { - // TODO: SoundMan_setSoundListParams(dword_4B7FC8, true, 0, 0, 0, 0); + // TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); createScene(4, 1); } break; diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index bd2f223998..df66c6b777 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -206,7 +206,7 @@ void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) { _soundItems.push_back(soundItem); } -void SoundMan::addSoundList(uint32 nameHash, uint32 *soundFileHashList) { +void SoundMan::addSoundList(uint32 nameHash, const uint32 *soundFileHashList) { while (*soundFileHashList) addSound(nameHash, *soundFileHashList++); } @@ -242,7 +242,7 @@ void SoundMan::setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCoun } } -void SoundMan::setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, +void SoundMan::setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) { while (*soundFileHashList) diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h index b724e898f0..1f0940c353 100644 --- a/engines/neverhood/sound.h +++ b/engines/neverhood/sound.h @@ -113,11 +113,11 @@ public: // Sound void addSound(uint32 nameHash, uint32 soundFileHash); - void addSoundList(uint32 nameHash, uint32 *soundFileHashList); + void addSoundList(uint32 nameHash, const uint32 *soundFileHashList); void deleteSound(uint32 soundFileHash); void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown); - void setSoundListParams(uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, + void setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown); void playSoundLooping(uint32 soundFileHash); void stopSound(uint32 soundFileHash); -- cgit v1.2.3 From ba991fe7021df572fd003ddda2f7f090081fd299 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 24 Sep 2012 11:15:34 +0000 Subject: NEVERHOOD: Fix addSound in AsScene2609Water and add a destructor --- engines/neverhood/module2600.cpp | 6 +++++- engines/neverhood/module2600.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 7cdfb69ed8..43c55ea49b 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -277,13 +277,17 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) setDoDeltaX(1); createSurface1(0x9C210C90, 1200); setClipRect(260, 260, 400, 368); - _vm->_soundMan->addSound(0xDC2769B0, true); + _vm->_soundMan->addSound(0x08526C36, 0xDC2769B0); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2609Water::handleMessage); if (getGlobalVar(0x4E0BE910)) sendMessage(this, 0x2002, 0); } +AsScene2609Water::~AsScene2609Water() { + _vm->_soundMan->deleteSoundGroup(0x08526C36); +} + uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h index d6580a6c7a..04c78008f0 100644 --- a/engines/neverhood/module2600.h +++ b/engines/neverhood/module2600.h @@ -57,6 +57,7 @@ protected: class AsScene2609Water : public AnimatedSprite { public: AsScene2609Water(NeverhoodEngine *vm); + virtual ~AsScene2609Water(); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 2ba49676eaff16c43be612579347ce0be8589812 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 24 Sep 2012 11:21:25 +0000 Subject: NEVERHOOD: Add destructor to AsScene2804BeamCoil --- engines/neverhood/module2800.cpp | 4 ++++ engines/neverhood/module2800.h | 1 + 2 files changed, 5 insertions(+) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index f6c67482e8..597227cd6f 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -1531,6 +1531,10 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene SetMessageHandler(&AsScene2804BeamCoil::handleMessage); } +AsScene2804BeamCoil::~AsScene2804BeamCoil() { + _vm->_soundMan->deleteSoundGroup(0xC5EA0B28); +} + void AsScene2804BeamCoil::update() { updateAnim(); updatePosition(); diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 50db1615c8..89e4d71b6e 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -224,6 +224,7 @@ protected: class AsScene2804BeamCoil : public AnimatedSprite { public: AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody); + virtual ~AsScene2804BeamCoil(); protected: SoundResource _soundResource; Scene *_parentScene; -- cgit v1.2.3 From 21d1372d7e2ab6a6263ebc3167ca141594756a96 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 24 Sep 2012 18:06:08 +0000 Subject: NEVERHOOD: Some work on the Klayman "idle" code (when the user doesn't do something for a certain time) - Fix startIdleAnimation and the Klayman update code which calls the idle code - Rename related variables/methods --- engines/neverhood/klayman.cpp | 141 +++++++++++++++++++++++------------------- engines/neverhood/klayman.h | 17 +++-- 2 files changed, 87 insertions(+), 71 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 87ab6e00d2..fa2dc7a7c0 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -42,12 +42,10 @@ static const KlaymanIdleTableItem klaymanTable2[] = { {1, &Klayman::sub41FEB0} }; -#if 0 static const KlaymanIdleTableItem klaymanTable3[] = { {1, &Klayman::sub421430}, {1, &Klayman::sub421480} }; -#endif static const KlaymanIdleTableItem klaymanTable4[] = { {1, &Klayman::sub41FDA0}, @@ -59,10 +57,10 @@ static const KlaymanIdleTableItem klaymanTable4[] = { Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), - _counterMax(0), _counter(0), _isMoveObjectRequested(false), _counter3Max(0), _isWalkingOpenDoorNotified(false), _counter1(0), + _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), - _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _resourceHandle(-1), _soundFlag(false) { + _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); @@ -105,9 +103,8 @@ void Klayman::setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCo _idleTable = table; _idleTableCount = tableCount; _idleTableMaxValue = 0; - for (int i = 0; i < tableCount; i++) { + for (int i = 0; i < tableCount; i++) _idleTableMaxValue += table[i].value; - } } void Klayman::setKlaymanIdleTable1() { @@ -119,7 +116,7 @@ void Klayman::setKlaymanIdleTable2() { } void Klayman::setKlaymanIdleTable3() { - // TODO setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3)); + setKlaymanIdleTable(klaymanTable3, ARRAYSIZE(klaymanTable3)); } void Klayman::stDoIdlePickEar() { @@ -276,38 +273,35 @@ void Klayman::sub421350() { _status2 = 0; _acceptInput = true; startAnimation(0x582EC138, 0, -1); - _counter = 0; + _idleCounter = 0; SetSpriteUpdate(NULL); SetUpdateHandler(&Klayman::update41D1C0); SetMessageHandler(&Klayman::handleMessage41D360); - _counter3 = 0; - _counterMax = 8; - _counter3Max = _vm->_rnd->getRandomNumber(64 - 1) + 24; + _blinkCounter = 0; + _idleCounterMax = 8; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } void Klayman::update41D1C0() { update(); - _counter++; - if (_counter >= _counterMax) { - _counter = 0; + _idleCounter++; + if (_idleCounter >= _idleCounterMax) { + _idleCounter = 0; if (_idleTable) { int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); for (int i = 0; i < _idleTableCount; i++) { - if (randomValue < _idleTable[_idleTableCount].value) { - (this->*(_idleTable[_idleTableCount].callback))(); - _counterMax = _vm->_rnd->getRandomNumber(128) + 24; + if (randomValue < _idleTable[i].value) { + (this->*(_idleTable[i].callback))(); + _idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24; break; } - randomValue -= _idleTable[_idleTableCount].value; + randomValue -= _idleTable[i].value; } } - } else { - _counter3++; - if (_counter3 >= _counter3Max) { - _counter3 = 0; - _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; - stIdleSitBlink(); - } + } else if (++_blinkCounter >= _blinkCounterMax) { + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + stIdleSitBlink(); } } @@ -449,24 +443,13 @@ void Klayman::sub41CE70() { } void Klayman::startIdleAnimation(uint32 fileHash, AnimationCb callback) { - _resourceHandle = _vm->_res->useResource(fileHash); - if (_resourceHandle != -1) { - // TODO _vm->_res->moveToFront(_resourceHandle); - NextState(callback); - SetUpdateHandler(&Klayman::upIdleAnimation); - } + debug("startIdleAnimation(%08X)", fileHash); + NextState(callback); + SetUpdateHandler(&Klayman::upIdleAnimation); } void Klayman::upIdleAnimation() { - // TODO Check if this odd stuff is needed or just some cache optimization - if (_vm->_res->isResourceDataValid(_resourceHandle)) { - gotoNextStateExt(); - // TODO _vm->_res->moveToBack(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - } else { - // TODO _vm->_res->moveToFront(_resourceHandle); - } + gotoNextStateExt(); update(); } @@ -518,9 +501,9 @@ void Klayman::stTryStandIdle() { _status2 = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); - _counter = 0; - _counter3 = 0; - _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + _idleCounter = 0; + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; SetUpdateHandler(&Klayman::update41D0F0); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(NULL); @@ -529,22 +512,22 @@ void Klayman::stTryStandIdle() { void Klayman::update41D0F0() { update(); - if (++_counter >= 720) { - _counter = 0; + if (++_idleCounter >= 720) { + _idleCounter = 0; if (_idleTable) { - int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); + int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1); for (int i = 0; i < _idleTableCount; i++) { - if (randomValue < _idleTable[_idleTableCount].value) { - (this->*(_idleTable[_idleTableCount].callback))(); + if (randomValue < _idleTable[i].value) { + (this->*(_idleTable[i].callback))(); break; } - randomValue -= _idleTable[_idleTableCount].value; + randomValue -= _idleTable[i].value; } } - } else if (++_counter3 >= _counter3Max) { - _counter3 = 0; - _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; - stStand(); + } else if (++_blinkCounter >= _blinkCounterMax) { + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + stIdleBlink(); } } @@ -583,7 +566,7 @@ uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::stStand() { +void Klayman::stIdleBlink() { _status2 = 1; _acceptInput = true; startAnimation(0x5900C41E, 0, -1); @@ -2299,6 +2282,34 @@ uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam ¶m, E return messageResult; } +void Klayman::sub421430() { + startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::sub421440)); +} + +void Klayman::sub421440() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x90EF8D38, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteUpdate(NULL); + NextState(&Klayman::stIdleSitBlinkSecond); +} + +void Klayman::sub421480() { + startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::sub421440)); +} + +void Klayman::sub421490() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x900F0930, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D480); + SetSpriteUpdate(NULL); + NextState(&Klayman::stIdleSitBlinkSecond); +} + //############################################################################## // KmScene1001 @@ -2528,7 +2539,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { void KmScene1002::update4497D0() { Klayman::update(); - if (_counter1 != 0 && (--_counter1 == 0)) { + if (_countdown1 != 0 && (--_countdown1 == 0)) { _surface->setVisible(true); SetUpdateHandler(&Klayman::update); } @@ -2719,7 +2730,7 @@ void KmScene1002::sub449E90() { } void KmScene1002::sub449EF0() { - _counter1 = 1; + _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x000BAB02, 0, -1); @@ -2752,7 +2763,7 @@ void KmScene1002::sub449F70() { } void KmScene1002::stSpitOutFall() { - _counter1 = 1; + _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x9308C132, 0, -1); @@ -2765,7 +2776,7 @@ void KmScene1002::stSpitOutFall() { } void KmScene1002::sub44A0D0() { - _counter1 = 1; + _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x0013A206, 0, -1); @@ -3309,9 +3320,9 @@ uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam ¶m, void KmScene1303::update4161A0() { Klayman::update(); - _counter3++; - if (_counter3 >= _counter3Max) - stPeekWall3(); + _blinkCounter++; + if (_blinkCounter >= _blinkCounterMax) + stPeekWallBlink(); } void KmScene1303::stPeekWall1() { @@ -3321,7 +3332,7 @@ void KmScene1303::stPeekWall1() { SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D480); - NextState(&KmScene1303::stPeekWall3); + NextState(&KmScene1303::stPeekWallBlink); } void KmScene1303::stPeekWall2() { @@ -3333,11 +3344,11 @@ void KmScene1303::stPeekWall2() { SetMessageHandler(&Klayman::handleMessage41D480); } -void KmScene1303::stPeekWall3() { - _counter3 = 0; +void KmScene1303::stPeekWallBlink() { + _blinkCounter = 0; _status2 = 0; _acceptInput = true; - _counter3Max = _vm->_rnd->getRandomNumber(64) + 24; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; startAnimation(0xAC20C012, 38, 42); SetUpdateHandler(&KmScene1303::update4161A0); SetSpriteUpdate(NULL); diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index cbf17a01f8..9e31cf2e04 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -171,6 +171,12 @@ public: void sub420500(); uint32 handleMessage41F0E0(int messageNum, const MessageParam ¶m, Entity *sender); + + void sub421430(); + void sub421440(); + + void sub421480(); + void sub421490(); protected: Entity *_parentScene; @@ -182,9 +188,9 @@ protected: bool _isMoveObjectRequested; bool _acceptInput; int16 _destX, _destY; - int16 _counter, _counterMax; - int16 _counter3, _counter3Max; - int16 _counter1; + int16 _idleCounter, _idleCounterMax; + int16 _blinkCounter, _blinkCounterMax; + int16 _countdown1; int16 _tapesToInsert; bool _flagF6; bool _isLeverDown; @@ -199,7 +205,6 @@ protected: int _idleTableMaxValue; NPointArray *_pathPoints; bool _soundFlag; - int _resourceHandle; virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -230,7 +235,7 @@ protected: void update41D0F0(); - void stStand(); + void stIdleBlink(); void stStandAround(); uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); @@ -381,7 +386,7 @@ protected: void update4161A0(); void stPeekWall1(); void stPeekWall2(); - void stPeekWall3(); + void stPeekWallBlink(); void stPeekWallReturn(); }; -- cgit v1.2.3 From 8bdddfdb02c0327af2985b81b4803b79de5a2b33 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 26 Sep 2012 17:57:06 +0000 Subject: NEVERHOOD: Rename many Klayman functions/variables --- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/klayman.cpp | 623 +++++++++++++++++++-------------------- engines/neverhood/klayman.h | 186 ++++++------ 3 files changed, 407 insertions(+), 408 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 3cd7e1d3ed..3b1a8c9573 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -298,7 +298,7 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule(1500, 0); // Logos and intro video //Real -#if 1 +#if 0 _vm->gameState().sceneNum = 0; createModule(1200, -1); #endif @@ -310,8 +310,8 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(2000, -1); #endif -#if 0 - _vm->gameState().sceneNum = 4; +#if 1 + _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif #if 0 diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index fa2dc7a7c0..d7e68e6b30 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -29,28 +29,28 @@ namespace Neverhood { static const KlaymanIdleTableItem klaymanTable1[] = { {1, &Klayman::stDoIdlePickEar}, - {1, &Klayman::sub41FDA0}, - {1, &Klayman::sub41FDF0}, + {1, &Klayman::stDoIdleSpinHead}, + {1, &Klayman::stDoIdleArms}, {1, &Klayman::stDoIdleChest}, - {1, &Klayman::sub41FEB0} + {1, &Klayman::stDoIdleHeadOff} }; static const KlaymanIdleTableItem klaymanTable2[] = { {1, &Klayman::stDoIdlePickEar}, - {1, &Klayman::sub41FDA0}, + {1, &Klayman::stDoIdleSpinHead}, {1, &Klayman::stDoIdleChest}, - {1, &Klayman::sub41FEB0} + {1, &Klayman::stDoIdleHeadOff} }; static const KlaymanIdleTableItem klaymanTable3[] = { - {1, &Klayman::sub421430}, - {1, &Klayman::sub421480} + {1, &Klayman::stDoIdleTeleporterHands}, + {1, &Klayman::stDoIdleTeleporterHands2} }; static const KlaymanIdleTableItem klaymanTable4[] = { - {1, &Klayman::sub41FDA0}, + {1, &Klayman::stDoIdleSpinHead}, {1, &Klayman::stDoIdleChest}, - {1, &Klayman::sub41FEB0}, + {1, &Klayman::stDoIdleHeadOff}, }; // Klayman @@ -150,21 +150,21 @@ void Klayman::evIdlePickEarDone() { _soundResource1.stop(); } -void Klayman::sub41FDA0() { - startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::sub41FDB0)); +void Klayman::stDoIdleSpinHead() { + startIdleAnimation(0xD122C137, AnimationCallback(&Klayman::stIdleSpinHead)); } -void Klayman::sub41FDB0() { +void Klayman::stIdleSpinHead() { _status2 = 1; _acceptInput = true; startAnimation(0xD122C137, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E980); + SetMessageHandler(&Klayman::hmIdleSpinHead); SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } -uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -176,26 +176,26 @@ uint32 Klayman::handleMessage41E980(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub41FDF0() { - startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::sub41FE00)); +void Klayman::stDoIdleArms() { + startIdleAnimation(0x543CD054, AnimationCallback(&Klayman::stIdleArms)); } -void Klayman::sub41FE00() { +void Klayman::stIdleArms() { _status2 = 1; _acceptInput = true; startAnimation(0x543CD054, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E9E0); + SetMessageHandler(&Klayman::hmIdleArms); SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); - FinalizeState(&Klayman::sub41FE50); + FinalizeState(&Klayman::evIdleArmsDone); } -void Klayman::sub41FE50() { +void Klayman::evIdleArmsDone() { _soundResource1.stop(); } -uint32 Klayman::handleMessage41E9E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -237,21 +237,21 @@ uint32 Klayman::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *s return messageResult; } -void Klayman::sub41FEB0() { - startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::sub41FEC0)); +void Klayman::stDoIdleHeadOff() { + startIdleAnimation(0x5120E137, AnimationCallback(&Klayman::stIdleHeadOff)); } -void Klayman::sub41FEC0() { +void Klayman::stIdleHeadOff() { _status2 = 1; _acceptInput = true; startAnimation(0x5120E137, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EFE0); + SetMessageHandler(&Klayman::hmIdleHeadOff); SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } -uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -269,20 +269,20 @@ uint32 Klayman::handleMessage41EFE0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421350() { +void Klayman::stSitIdleTeleporter() { _status2 = 0; _acceptInput = true; startAnimation(0x582EC138, 0, -1); _idleCounter = 0; SetSpriteUpdate(NULL); - SetUpdateHandler(&Klayman::update41D1C0); + SetUpdateHandler(&Klayman::upSitIdleTeleporter); SetMessageHandler(&Klayman::handleMessage41D360); _blinkCounter = 0; _idleCounterMax = 8; _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void Klayman::update41D1C0() { +void Klayman::upSitIdleTeleporter() { update(); _idleCounter++; if (_idleCounter >= _idleCounterMax) { @@ -319,7 +319,7 @@ void Klayman::stIdleSitBlinkSecond() { _status2 = 0; _acceptInput = true; startAnimation(0x5C24C018, 0, -1); - SetUpdateHandler(&Klayman::update41D1C0); + SetUpdateHandler(&Klayman::upSitIdleTeleporter); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(NULL); } @@ -336,9 +336,9 @@ void Klayman::stPickUpNeedle() { } } -void Klayman::sub41FFF0() { +void Klayman::stPickUpTube() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - if (!stStartAction(AnimationCallback(&Klayman::sub41FFF0))) { + if (!stStartAction(AnimationCallback(&Klayman::stPickUpTube))) { _status2 = 1; _acceptInput = false; startAnimation(0x0018C032, 0, -1); @@ -396,7 +396,7 @@ void Klayman::stStepOver() { startAnimation(0x004AA310, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -407,7 +407,7 @@ void Klayman::stSitInTeleporter() { startAnimation(0x392A0330, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmSitInTeleporter); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -429,12 +429,12 @@ void Klayman::stGetUpFromTeleporter() { startAnimation(0x913AB120, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } ///////////////////////////////////////////////////////////////// -void Klayman::sub41CE70() { +void Klayman::stopWalking() { _destX = _x; if (!_isWalking && !_isSneaking && !_isLargeStep) { gotoState(NULL); @@ -504,13 +504,13 @@ void Klayman::stTryStandIdle() { _idleCounter = 0; _blinkCounter = 0; _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; - SetUpdateHandler(&Klayman::update41D0F0); + SetUpdateHandler(&Klayman::upIdle); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(NULL); } } -void Klayman::update41D0F0() { +void Klayman::upIdle() { update(); if (++_idleCounter >= 720) { _idleCounter = 0; @@ -590,7 +590,7 @@ void Klayman::stStandAround() { _status2 = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update41D0F0); + SetUpdateHandler(&Klayman::upIdle); SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(NULL); } @@ -633,7 +633,7 @@ void Klayman::startWalkToX(int16 x, bool flag) { _destX = x; } else if (flag) { _destX = x; - GotoState(&Klayman::sub421550); + GotoState(&Klayman::stStartWalkingExt); } else { _destX = x; GotoState(&Klayman::stStartWalking); @@ -771,7 +771,7 @@ void Klayman::stSneak() { setDoDeltaX(_destX < _x ? 1 : 0); startAnimation(0x5C48C506, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); + SetMessageHandler(&Klayman::hmSneaking); SetSpriteUpdate(&Klayman::suWalking); FinalizeState(&Klayman::stWalkingDone); } @@ -780,7 +780,7 @@ void Klayman::stWalkingDone() { _isSneaking = false; } -uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -841,7 +841,7 @@ void Klayman::stWalking() { _acceptInput = true; startAnimation(0x1A249001, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); FinalizeState(&Klayman::stStartWalkingDone); NextState(&Klayman::stUpdateWalking); @@ -852,7 +852,7 @@ void Klayman::spriteUpdate41F300() { _deltaX = 0; } -uint32 Klayman::handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -892,7 +892,7 @@ void Klayman::stUpdateWalking() { } } SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); + SetMessageHandler(&Klayman::hmSneaking); SetSpriteUpdate(&Klayman::suWalking); FinalizeState(&Klayman::stWalkingDone); } @@ -1054,7 +1054,7 @@ void Klayman::startSpecialWalkRight(int16 x) { } else if (_x < x) { startWalkToX(x, false); } else if (_x - x <= 105) { - sub41CAC0(x); + startWalkToXExt(x); } else { startWalkToX(x, false); } @@ -1068,13 +1068,13 @@ void Klayman::startSpecialWalkLeft(int16 x) { } else if (x < _x) { startWalkToX(x, false); } else if (x - _x <= 105) { - sub41CAC0(x); + startWalkToXExt(x); } else { startWalkToX(x, false); } } -void Klayman::sub41CDE0(int16 x) { +void Klayman::startWalkToXSmall(int16 x) { _status3 = 2; if (_x == x) { _destX = x; @@ -1086,23 +1086,23 @@ void Klayman::sub41CDE0(int16 x) { _destX = x; } else { _destX = x; - GotoState(&Klayman::sub421680); + GotoState(&Klayman::stStartWalkingSmall); } } -void Klayman::sub421680() { +void Klayman::stStartWalkingSmall() { _isWalking = true; _acceptInput = true; _status3 = 2; setDoDeltaX(_destX < _x ? 1 : 0); startAnimation(0x3A4CD934, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41ED70); + SetMessageHandler(&Klayman::hmWalkingSmall); SetSpriteUpdate(&Klayman::suWalkingTestExit); FinalizeState(&Klayman::stStartWalkingDone); } -uint32 Klayman::handleMessage41ED70(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1114,7 +1114,7 @@ uint32 Klayman::handleMessage41ED70(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421640() { +void Klayman::stStandIdleSmall() { _status2 = 0; _acceptInput = true; startAnimation(0x90D0D1D0, 0, -1); @@ -1123,7 +1123,7 @@ void Klayman::sub421640() { SetSpriteUpdate(NULL); } -void Klayman::sub421740() { +void Klayman::stWonderAboutAfterSmall() { _status2 = 0; _acceptInput = true; startAnimation(0x11C8D156, 30, -1); @@ -1132,7 +1132,7 @@ void Klayman::sub421740() { SetSpriteUpdate(NULL); } -void Klayman::sub421780() { +void Klayman::stWonderAboutHalfSmall() { _status2 = 0; _acceptInput = true; startAnimation(0x11C8D156, 0, 10); @@ -1141,7 +1141,7 @@ void Klayman::sub421780() { SetSpriteUpdate(NULL); } -void Klayman::sub421700() { +void Klayman::stWonderAboutSmall() { _status2 = 0; _acceptInput = true; startAnimation(0x11C8D156, 0, -1); @@ -1150,16 +1150,16 @@ void Klayman::sub421700() { SetSpriteUpdate(NULL); } -void Klayman::sub421840() { +void Klayman::stWalkToFrontNoStepSmall() { _status2 = 0; _acceptInput = false; startAnimationByHash(0x3F9CC394, 0x14884392, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EE00); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klayman::suUpdateDestX); } -uint32 Klayman::handleMessage41EE00(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1176,72 +1176,72 @@ uint32 Klayman::handleMessage41EE00(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421800() { +void Klayman::stWalkToFront2Small() { _status2 = 0; _acceptInput = false; startAnimation(0x2F1C4694, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EE00); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klayman::suUpdateDestX); } -void Klayman::sub4217C0() { +void Klayman::stWalkToFrontSmall() { _status2 = 0; _acceptInput = false; startAnimation(0x3F9CC394, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EE00); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klayman::suUpdateDestX); } -void Klayman::sub421900() { +void Klayman::stTurnToBackHalfSmall() { _status2 = 0; _acceptInput = false; startAnimationByHash(0x37ECD436, 0, 0x8520108C); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EE00); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klayman::suUpdateDestX); } -void Klayman::sub4218C0() { +void Klayman::stTurnToBackWalkSmall() { _status2 = 0; _acceptInput = false; startAnimation(0x16EDDE36, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EE00); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klayman::suUpdateDestX); } -void Klayman::sub421880() { +void Klayman::stTurnToBackSmall() { _status2 = 0; _acceptInput = false; startAnimation(0x37ECD436, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EE00); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetMessageHandler(&Klayman::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klayman::suUpdateDestX); } -void Klayman::sub420F60() { - if (!stStartAction(AnimationCallback(&Klayman::sub420F60))) { +void Klayman::stPullCord() { + if (!stStartAction(AnimationCallback(&Klayman::stPullCord))) { _status2 = 2; _acceptInput = false; startAnimation(0x3F28E094, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E6C0); + SetMessageHandler(&Klayman::hmPullCord); SetSpriteUpdate(NULL); - NextState(&Klayman::sub420FB0); + NextState(&Klayman::stReleaseCord); } } -void Klayman::sub420FB0() { +void Klayman::stReleaseCord() { _acceptInput = false; startAnimation(0x3A28C094, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E6C0); + SetMessageHandler(&Klayman::hmPullCord); SetSpriteUpdate(NULL); } -uint32 Klayman::handleMessage41E6C0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPullCord(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1256,18 +1256,18 @@ uint32 Klayman::handleMessage41E6C0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421110() { - if (!stStartAction(AnimationCallback(&Klayman::sub421110))) { +void Klayman::stUseTube() { + if (!stStartAction(AnimationCallback(&Klayman::stUseTube))) { _status2 = 1; _acceptInput = false; startAnimation(0x1A38A814, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E750); + SetMessageHandler(&Klayman::hmUseTube); SetSpriteUpdate(NULL); } } -uint32 Klayman::handleMessage41E750(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1292,20 +1292,20 @@ uint32 Klayman::handleMessage41E750(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub4215E0() { +void Klayman::stWalkingExt() { _status2 = 0; _isWalking = true; _acceptInput = true; + startAnimation(0x5A2CBC00, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); - startAnimation(0x5A2CBC00, 0, -1); } -void Klayman::sub421550() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::sub421550))) { +void Klayman::stStartWalkingExt() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalkingExt))) { _status2 = 0; _isWalking = true; _acceptInput = true; @@ -1314,8 +1314,8 @@ void Klayman::sub421550() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::stStartWalkingDone); - NextState(&Klayman::sub4215E0); + FinalizeState(&Klayman::stStartWalkingDone); + NextState(&Klayman::stWalkingExt); } } @@ -1326,7 +1326,7 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { gotoState(NULL); gotoNextStateExt(); } else if (_x < x1 + x2) { - sub41CAC0(x1 + x2); + startWalkToXExt(x1 + x2); } else { startWalkToX(x1 + x2, false); } @@ -1336,14 +1336,14 @@ void Klayman::sub41CC40(int16 x1, int16 x2) { gotoState(NULL); gotoNextStateExt(); } else if (_x > x1 - x2) { - sub41CAC0(x1 - x2); + startWalkToXExt(x1 - x2); } else { startWalkToX(x1 - x2, false); } } } -void Klayman::sub41CAC0(int16 x) { +void Klayman::startWalkToXExt(int16 x) { int16 xdiff = ABS(x - _x); if (x == _x) { _destX = x; @@ -1540,8 +1540,8 @@ void Klayman::setupJumpToRing() { _acceptInput = false; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmJumpToRing); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); - NextState(&Klayman::sub420340); + SetSpriteUpdate(&Klayman::suUpdateDestX); + NextState(&Klayman::stHangOnRing); sendMessage(_attachedSprite, 0x482B, 0); } @@ -1566,12 +1566,12 @@ uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity * return messageResult; } -void Klayman::spriteUpdate41F230() { +void Klayman::suUpdateDestX() { AnimatedSprite::updateDeltaXY(); _destX = _x; } -void Klayman::sub420340() { +void Klayman::stHangOnRing() { _status2 = 0; _acceptInput = true; startAnimation(0x4829E0B8, 0, -1); @@ -1594,7 +1594,7 @@ void Klayman::stJumpToRing3() { _acceptInput = false; startAnimation(0xBA1910B2, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmJumpToRing3); NextState(&Klayman::stHoldRing); sendMessage(_attachedSprite, 0x482B, 0); @@ -1691,14 +1691,14 @@ void Klayman::stStartClimbLadderDown() { startAnimation(0x122D1505, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } else if (_ladderStatus == 3) { _ladderStatus = 2; _acceptInput = true; startAnimationByHash(0x122D1505, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } else if (_ladderStatus == 1) { _ladderStatus = 2; _acceptInput = true; @@ -1715,14 +1715,14 @@ void Klayman::stClimbLadderHalf() { startAnimationByHash(0x3A292504, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } else if (_ladderStatus == 2) { _ladderStatus = 0; _acceptInput = false; startAnimationByHash(0x122D1505, 0x02421405, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41DFD0); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } else { gotoNextStateExt(); } @@ -1783,14 +1783,14 @@ void Klayman::stStartClimbLadderUp() { startAnimation(0x3A292504, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } else if (_ladderStatus == 3) { _ladderStatus = 1; _acceptInput = true; startAnimationByHash(0x3A292504, 0x01084280, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } else if (_ladderStatus == 2) { _ladderStatus = 1; _acceptInput = true; @@ -1805,7 +1805,7 @@ void Klayman::stWalkToFrontNoStep() { startAnimationByHash(0xF229C003, 0x14884392, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1833,7 +1833,7 @@ void Klayman::stWalkToFront() { startAnimation(0xF229C003, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -1844,7 +1844,7 @@ void Klayman::stTurnToFront() { startAnimationByHash(0xCA221107, 0x8520108C, 0); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -1855,7 +1855,7 @@ void Klayman::stTurnToBack() { startAnimation(0xCA221107, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -1887,7 +1887,7 @@ void Klayman::stTurnToBackToUse() { startAnimation(0x91540140, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmTurnToBackToUse); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -1913,7 +1913,7 @@ void Klayman::stClayDoorOpen() { _acceptInput = false; startAnimation(0x5CCCB330, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmClayDoorOpen); } } @@ -1938,8 +1938,8 @@ void Klayman::stTurnToUse() { _acceptInput = false; startAnimation(0x9B250AD2, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); SetMessageHandler(&Klayman::hmTurnToUse); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -1948,7 +1948,7 @@ void Klayman::stReturnFromUse() { _acceptInput = false; startAnimation(0x98F88391, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmTurnToUse); } @@ -1975,11 +1975,11 @@ void Klayman::stMoveObjectSkipTurnFaceObject() { _acceptInput = true; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmMoveObjectTurn); } -void Klayman::sub420660() { +void Klayman::evMoveObjectTurnDone() { sendMessage(_attachedSprite, 0x4807, 0); } @@ -1993,7 +1993,7 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Enti if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { stMoveObjectSkipTurn(); } else { - FinalizeState(&Klayman::sub420660); + FinalizeState(&Klayman::evMoveObjectTurnDone); SetMessageHandler(&Klayman::handleMessage41D480); } } else if (param.asInteger() == 0x32180101) { @@ -2014,7 +2014,7 @@ void Klayman::stMoveObjectSkipTurn() { _acceptInput = true; startAnimationByHash(0x0C1CA072, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmMoveObjectTurn); } @@ -2026,7 +2026,7 @@ void Klayman::stMoveObjectFaceObject() { _acceptInput = true; startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmMoveObjectTurn); } } @@ -2040,7 +2040,7 @@ void Klayman::stUseLever() { sendMessage(_attachedSprite, 0x482B, 0); startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::handleMessage41E210); NextState(&Klayman::stPullLeverDown); _acceptInput = false; @@ -2058,7 +2058,7 @@ void Klayman::stPullLeverDown() { void Klayman::stHoldLeverDown() { startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::handleMessage41D360); _isLeverDown = true; _acceptInput = true; @@ -2067,7 +2067,7 @@ void Klayman::stHoldLeverDown() { void Klayman::stUseLeverRelease() { startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stPullLeverDown); @@ -2079,7 +2079,7 @@ void Klayman::stReleaseLever() { _status2 = 2; startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::handleMessage41E210); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stLetGoOfLever); @@ -2183,16 +2183,16 @@ void Klayman::walkAlongPathPoints() { } } -void Klayman::sub4204C0() { +void Klayman::stJumpToGrab() { _status2 = 0; _acceptInput = false; startAnimationByHash(0x00AB8C10, 0x01084280, 0); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F920); - SetMessageHandler(&Klayman::handleMessage41E5F0); + SetSpriteUpdate(&Klayman::suJumpToGrab); + SetMessageHandler(&Klayman::hmJumpToGrab); } -void Klayman::spriteUpdate41F920() { +void Klayman::suJumpToGrab() { updateDeltaXY(); if (_y >= _destY) { _y = _destY; @@ -2201,7 +2201,7 @@ void Klayman::spriteUpdate41F920() { } } -uint32 Klayman::handleMessage41E5F0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2218,7 +2218,7 @@ uint32 Klayman::handleMessage41E5F0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421230() { +void Klayman::sub421230() {//stGrow _status2 = 2; _acceptInput = false; startAnimationByHash(0x38445000, 0, -1); @@ -2238,40 +2238,40 @@ uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421270() { - if (!stStartAction(AnimationCallback(&Klayman::sub421270))) { +void Klayman::stTurnToUseExt() { + if (!stStartAction(AnimationCallback(&Klayman::stTurnToUseExt))) { _status2 = 2; _acceptInput = false; startAnimation(0x1B3D8216, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } -void Klayman::sub420460() { - if (!stStartAction(AnimationCallback(&Klayman::sub420460))) { +void Klayman::stJumpToGrabFall() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpToGrabFall))) { _status2 = 0; _acceptInput = false; startAnimation(0x00AB8C10, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41E5F0); - SetSpriteUpdate(&Klayman::spriteUpdate41F920); + SetMessageHandler(&Klayman::hmJumpToGrab); + SetSpriteUpdate(&Klayman::suJumpToGrab); sendMessage(_attachedSprite, 0x482B, 0); } } -void Klayman::sub420500() { +void Klayman::stJumpToGrabRelease() { _status2 = 1; _acceptInput = false; startAnimationByHash(0x00AB8C10, 0x320AC306, 0); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41F0E0); + SetMessageHandler(&Klayman::hmJumpToGrabRelease); NextState(&Klayman::stReleaseRing); } -uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2282,11 +2282,11 @@ uint32 Klayman::handleMessage41F0E0(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klayman::sub421430() { - startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::sub421440)); +void Klayman::stDoIdleTeleporterHands() { + startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::stIdleTeleporterHands)); } -void Klayman::sub421440() { +void Klayman::stIdleTeleporterHands() { _status2 = 0; _acceptInput = true; startAnimation(0x90EF8D38, 0, -1); @@ -2296,11 +2296,11 @@ void Klayman::sub421440() { NextState(&Klayman::stIdleSitBlinkSecond); } -void Klayman::sub421480() { - startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::sub421440)); +void Klayman::stDoIdleTeleporterHands2() { + startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::stIdleTeleporterHands2)); } -void Klayman::sub421490() { +void Klayman::stIdleTeleporterHands2() { _status2 = 0; _acceptInput = true; startAnimation(0x900F0930, 0, -1); @@ -2332,7 +2332,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stSleeping); break; case 0x480D: - GotoState(&KmScene1001::sub44FA50); + GotoState(&KmScene1001::stPullLever); break; case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); @@ -2391,18 +2391,18 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1001::sub44FA50() { - if (!stStartAction(AnimationCallback(&KmScene1001::sub44FA50))) { +void KmScene1001::stPullLever() { + if (!stStartAction(AnimationCallback(&KmScene1001::stPullLever))) { _status2 = 2; _acceptInput = false; startAnimation(0x00648953, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1001::handleMessage44FA00); + SetMessageHandler(&KmScene1001::hmPullLever); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } } -uint32 KmScene1001::handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1001::hmPullLever(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2439,7 +2439,7 @@ void KmScene1002::xUpdate() { uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2001: - GotoState(&KmScene1002::sub449E90); + GotoState(&KmScene1002::stStandIdleSpecial); break; case 0x2007: _otherSprite = (Sprite*)param.asEntity(); @@ -2481,7 +2481,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&KmScene1002::stMoveVenusFlyTrap); break; case 0x480D: - GotoState(&KmScene1002::sub449E20); + GotoState(&KmScene1002::stJumpToRingVenusFlyTrap); break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { @@ -2545,7 +2545,7 @@ void KmScene1002::update4497D0() { } } -uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2571,7 +2571,7 @@ uint32 KmScene1002::handleMessage449800(int messageNum, const MessageParam ¶ return messageResult; } -uint32 KmScene1002::handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x4811: _soundResource1.play(0x5252A0E4); @@ -2705,20 +2705,20 @@ void KmScene1002::suFallDown() { _vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0); } -void KmScene1002::sub449E20() { - if (!stStartAction(AnimationCallback(&KmScene1002::sub449E20))) { +void KmScene1002::stJumpToRingVenusFlyTrap() { + if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRingVenusFlyTrap))) { _status2 = 2; _acceptInput = false; startAnimation(0x584984B4, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1002::handleMessage449800); + SetMessageHandler(&KmScene1002::hmJumpToRingVenusFlyTrap); NextState(&Klayman::stLandOnFeet); sendMessage(_attachedSprite, 0x482B, 0); } } -void KmScene1002::sub449E90() { +void KmScene1002::stStandIdleSpecial() { _soundResource1.play(0x56548280); _status2 = 0; _acceptInput = false; @@ -2726,7 +2726,7 @@ void KmScene1002::sub449E90() { startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1002::handleMessage4498E0); + SetMessageHandler(&KmScene1002::hmStandIdleSpecial); } void KmScene1002::sub449EF0() { @@ -2998,7 +2998,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); else GotoState(&Klayman::stTryStandIdle); break; @@ -3036,16 +3036,16 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - sub461F30(); + stTeleporterAppear(); break; case 0x483E: - sub461F70(); + stTeleporterDisappear(); break; } return 0; } -uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1109::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -3059,22 +3059,22 @@ uint32 KmScene1109::handleMessage461EA0(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene1109::sub461F30() { +void KmScene1109::stTeleporterAppear() { _status2 = 0; _acceptInput = false; + startAnimation(0x2C2A4A1C, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1109::handleMessage461EA0); - startAnimation(0x2C2A4A1C, 0, -1); + SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear); } -void KmScene1109::sub461F70() { +void KmScene1109::stTeleporterDisappear() { _status2 = 0; _acceptInput = false; + startAnimation(0x3C2E4245, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1109::handleMessage461EA0); - startAnimation(0x3C2E4245, 0, -1); + SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear); } // KmScene1201 @@ -3109,7 +3109,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&KmScene1201::stTumbleHeadless); break; case 0x4815: - GotoState(&KmScene1201::sub40E040); + GotoState(&KmScene1201::stCloseEyes); break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { @@ -3150,7 +3150,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1201::update40DBE0() { +void KmScene1201::upMoveObject() { if (_x >= 380) gotoNextStateExt(); Klayman::update(); @@ -3239,7 +3239,7 @@ void KmScene1201::stMoveObject() { _countdown = 8; setDoDeltaX(0); startAnimation(0x0C1CA072, 0, -1); - SetUpdateHandler(&KmScene1201::update40DBE0); + SetUpdateHandler(&KmScene1201::upMoveObject); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmMoveObject); } @@ -3248,7 +3248,7 @@ void KmScene1201::stMoveObject() { void KmScene1201::stMoveObjectSkipTurn() { _acceptInput = false; startAnimationByHash(0x0C1CA072, 0x01084280, 0); - SetUpdateHandler(&KmScene1201::update40DBE0); + SetUpdateHandler(&KmScene1201::upMoveObject); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmMoveObject); } @@ -3268,8 +3268,8 @@ void KmScene1201::stTumbleHeadless() { } } -void KmScene1201::sub40E040() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::sub40E040))) { +void KmScene1201::stCloseEyes() { + if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stCloseEyes))) { _status2 = 1; _acceptInput = false; startAnimation(0x5420E254, 0, -1); @@ -3318,7 +3318,7 @@ uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam ¶m, return messageResult; } -void KmScene1303::update4161A0() { +void KmScene1303::upPeekWallBlink() { Klayman::update(); _blinkCounter++; if (_blinkCounter >= _blinkCounterMax) @@ -3350,7 +3350,7 @@ void KmScene1303::stPeekWallBlink() { _acceptInput = true; _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; startAnimation(0xAC20C012, 38, 42); - SetUpdateHandler(&KmScene1303::update4161A0); + SetUpdateHandler(&KmScene1303::upPeekWallBlink); SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D360); _newStickFrameIndex = 42; @@ -3384,7 +3384,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -3479,7 +3479,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); else GotoState(&Klayman::stTryStandIdle); break; @@ -3487,7 +3487,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -3572,10 +3572,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - sub417D40(); + stTeleporterAppear(); break; case 0x483E: - sub417D80(); + stTeleporterDisappear(); break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -3587,25 +3587,25 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -void KmScene1306::sub417D40() { +void KmScene1306::stTeleporterAppear() { _status2 = 0; _acceptInput = false; startAnimation(0xEE084A04, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1306::handleMessage417CB0); + SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear); } -void KmScene1306::sub417D80() { +void KmScene1306::stTeleporterDisappear() { _status2 = 0; _acceptInput = false; startAnimation(0xB86A4274, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1306::handleMessage417CB0); + SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear); } -uint32 KmScene1306::handleMessage417CB0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1306::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -3647,7 +3647,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -3658,7 +3658,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_INSERT_DISK: if (param.asInteger() == 1) { - GotoState(&KmScene1308::sub456150); + GotoState(&KmScene1308::stInsertDiskSide); } else { GotoState(&Klayman::stInsertDisk); } @@ -3692,7 +3692,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene1308::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1308::hmInsertDiskSide(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -3717,8 +3717,8 @@ uint32 KmScene1308::handleMessage(int messageNum, const MessageParam ¶m, Ent return messageResult; } -void KmScene1308::sub456150() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::sub456150))) { +void KmScene1308::stInsertDiskSide() { + if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::stInsertDiskSide))) { _status2 = 2; _flag1 = false; for (uint i = 0; i < 3; i++) { @@ -3747,7 +3747,7 @@ void KmScene1308::sub456150() { startAnimation(0xDC409440, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::spriteUpdate41F250); - SetMessageHandler(&KmScene1308::handleMessage); + SetMessageHandler(&KmScene1308::hmInsertDiskSide); _flag1 = false; } } @@ -3904,7 +3904,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -3961,7 +3961,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -4028,7 +4028,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); else GotoState(&Klayman::stTryStandIdle); break; @@ -4036,7 +4036,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -4057,7 +4057,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUseInTeleporter); break; case 0x481E: - if (_isSittingInTeleporter)//CHECKME + if (_isSittingInTeleporter) GotoState(&Klayman::stReturnFromUseInTeleporter); break; case 0x481F: @@ -4121,7 +4121,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) { - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); } else { GotoState(&Klayman::stTryStandIdle); } @@ -4133,7 +4133,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -4186,16 +4186,16 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - sub468AD0(); + stTeleporterAppear(); break; case 0x483E: - sub468B10(); + stTeleporterDisappear(); break; } return messageResult; } -uint32 KmScene1705::handleMessage4689A0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1705::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -4209,7 +4209,7 @@ uint32 KmScene1705::handleMessage4689A0(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene1705::spriteUpdate468A30() { +void KmScene1705::suFallSkipJump() { updateDeltaXY(); HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { @@ -4224,27 +4224,27 @@ void KmScene1705::stFallSkipJump() { _acceptInput = false; startAnimationByHash(0xB93AB151, 0x40A100F8, 0); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&KmScene1705::spriteUpdate468A30); + SetSpriteUpdate(&KmScene1705::suFallSkipJump); SetMessageHandler(&Klayman::handleMessage41D360); NextState(&Klayman::stLandOnFeet); } -void KmScene1705::sub468AD0() { +void KmScene1705::stTeleporterAppear() { _status2 = 0; _acceptInput = false; startAnimation(0x5E0A4905, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1705::handleMessage4689A0); + SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear); } -void KmScene1705::sub468B10() { +void KmScene1705::stTeleporterDisappear() { _status2 = 0; _acceptInput = false; startAnimation(0xD86E4477, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1705::handleMessage4689A0); + SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear); } KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4303,7 +4303,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) { - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); } else GotoState(&Klayman::stTryStandIdle); break; @@ -4341,16 +4341,16 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - sub440230(); + stTeleporterAppear(); break; case 0x483E: - stDoTeleport(); + stTeleporterDisappear(); break; } return 0; } -uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2001::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -4364,22 +4364,22 @@ uint32 KmScene2001::handleMessage4401A0(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene2001::sub440230() { +void KmScene2001::stTeleporterAppear() { _status2 = 0; _acceptInput = false; startAnimation(0xBE68CC54, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2001::handleMessage4401A0); + SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear); } -void KmScene2001::stDoTeleport() { +void KmScene2001::stTeleporterDisappear() { _status2 = 0; _acceptInput = false; startAnimation(0x18AB4ED4, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2001::handleMessage4401A0); + SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear); } KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4401,18 +4401,18 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); else GotoState(&Klayman::stTryStandIdle); break; case 0x4811: - GotoState(&KmScene2101::sub4862C0); + GotoState(&KmScene2101::stHitByDoor); break; case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -4459,16 +4459,16 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - sub486320(); + stTeleporterAppear(); break; case 0x483E: - sub486360(); + stTeleporterDisappear(); break; } return messageResult; } -uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); int16 speedUpFrameIndex; switch (messageNum) { @@ -4491,7 +4491,7 @@ uint32 KmScene2101::handleMessage486160(int messageNum, const MessageParam ¶ return messageResult; } -uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2101::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -4505,32 +4505,32 @@ uint32 KmScene2101::handleMessage486230(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene2101::sub4862C0() { +void KmScene2101::stHitByDoor() { _status2 = 1; _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene2101::handleMessage486160); + SetMessageHandler(&KmScene2101::hmHitByDoor); _soundResource1.play(0x402E82D4); } -void KmScene2101::sub486320() { +void KmScene2101::stTeleporterAppear() { _status2 = 0; _acceptInput = false; startAnimation(0xFF290E30, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2101::handleMessage486230); + SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear); } -void KmScene2101::sub486360() { +void KmScene2101::stTeleporterDisappear() { _status2 = 0; _acceptInput = false; startAnimation(0x9A28CA1C, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2101::handleMessage486230); + SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear); } KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) @@ -4624,7 +4624,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -4699,7 +4699,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2205::sub423980); + GotoState(&KmScene2205::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -4726,7 +4726,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2205::sub423980() { +void KmScene2205::stStartWalkingResume() { int16 frameIndex = getGlobalVar(0x18288913); if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; @@ -4735,7 +4735,7 @@ void KmScene2205::sub423980() { _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); @@ -4765,19 +4765,19 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x4803: - GotoState(&KmScene2206::sub482490); + GotoState(&KmScene2206::stRidePlatformDown); break; case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2206::sub482530); + GotoState(&KmScene2206::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } break; case NM_KLAYMAN_PICKUP: if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -4834,7 +4834,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4837: - sub41CE70(); + stopWalking(); break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -4846,15 +4846,15 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2206::spriteUpdate482450() { +void KmScene2206::suRidePlatformDown() { _yDelta++; _y += _yDelta; if (_y > 600) sendMessage(this, 0x1019, 0); } -void KmScene2206::sub482490() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::sub482490))) { +void KmScene2206::stRidePlatformDown() { + if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) { _status2 = 1; sendMessage(_parentScene, 0x4803, 0); _acceptInput = false; @@ -4862,12 +4862,12 @@ void KmScene2206::sub482490() { startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteUpdate(&KmScene2206::spriteUpdate482450); + SetSpriteUpdate(&KmScene2206::suRidePlatformDown); _vm->_soundMan->playSoundLooping(0xD3B02847); } } -void KmScene2206::sub482530() { +void KmScene2206::stStartWalkingResume() { int16 frameIndex = getGlobalVar(0x18288913) + 1; if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; @@ -4876,7 +4876,7 @@ void KmScene2206::sub482530() { _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); @@ -4890,10 +4890,10 @@ KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2001: - GotoState(&KmScene2207::sub442460); + GotoState(&KmScene2207::stRidePlatform); break; case 0x2005: - spriteUpdate442430(); + suRidePlatform(); GotoState(&KmScene2207::stTryStandIdle); break; case 0x4001: @@ -4904,7 +4904,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x480D: - GotoState(&KmScene2207::sub4424B0); + GotoState(&KmScene2207::stInteractLever); break; case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); @@ -4946,25 +4946,25 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2207::spriteUpdate442430() { +void KmScene2207::suRidePlatform() { _x = _attachedSprite->getX() - 20; _y = _attachedSprite->getY() + 46; processDelta(); } -void KmScene2207::sub442460() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::sub442460))) { +void KmScene2207::stRidePlatform() { + if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::stRidePlatform))) { _status2 = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&KmScene2207::spriteUpdate442430); + SetSpriteUpdate(&KmScene2207::suRidePlatform); SetMessageHandler(&Klayman::handleMessage41D360); } } -void KmScene2207::sub4424B0() { - if (!stStartAction(AnimationCallback(&KmScene2207::sub4424B0))) { +void KmScene2207::stInteractLever() { + if (!stStartAction(AnimationCallback(&KmScene2207::stInteractLever))) { _status2 = 0; if (_isLeverDown) { stUseLeverRelease(); @@ -4972,32 +4972,32 @@ void KmScene2207::sub4424B0() { _acceptInput = false; startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&KmScene2207::spriteUpdate41F230); + SetSpriteUpdate(&KmScene2207::suUpdateDestX); SetMessageHandler(&Klayman::handleMessage41E210); - NextState(&KmScene2207::sub442520); + NextState(&KmScene2207::stPullLever); } } } -void KmScene2207::sub442520() { +void KmScene2207::stPullLever() { startAnimation(0x0D318140, 0, -1); sendMessage(_attachedSprite, 0x480F, 0); - NextState(&KmScene2207::sub442560); + NextState(&KmScene2207::stLookLeverDown); } -void KmScene2207::sub442560() { +void KmScene2207::stLookLeverDown() { startAnimation(0x1564A2C0, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); - NextState(&KmScene2207::sub4425A0); + SetSpriteUpdate(&Klayman::suUpdateDestX); + NextState(&KmScene2207::stWaitLeverDown); _acceptInput = true; _isLeverDown = true; } -void KmScene2207::sub4425A0() { +void KmScene2207::stWaitLeverDown() { startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F230); + SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::handleMessage41D360); _acceptInput = true; _isLeverDown = true; @@ -5033,7 +5033,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) { GotoState(&Klayman::stPickUpNeedle); } else if (param.asInteger() == 1) { - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); } else { GotoState(&Klayman::stPickUpGeneric); } @@ -5067,7 +5067,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x4837: - sub41CE70(); + stopWalking(); break; } return 0; @@ -5082,7 +5082,7 @@ void KmScene2242::sub444D20() { _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); @@ -5136,7 +5136,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m gotoNextStateExt(); break; case 0x4837: - sub41CE70(); + stopWalking(); break; } return 0; @@ -5151,7 +5151,7 @@ void KmHallOfRecords::sub43B130() { _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); @@ -5205,7 +5205,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x4837: - sub41CE70(); + stopWalking(); break; } return 0; @@ -5220,7 +5220,7 @@ void KmScene2247::sub453520() { _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41EB70); + SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::spriteUpdate41F300); NextState(&Klayman::stUpdateWalking); FinalizeState(&Klayman::stStartWalkingDone); @@ -5289,7 +5289,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4832: - GotoState(&Klayman::sub421110); + GotoState(&Klayman::stUseTube); break; case 0x4833: if (param.asInteger() == 1) @@ -5470,7 +5470,7 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x480D: - GotoState(&Klayman::sub420F60); + GotoState(&Klayman::stPullCord); break; case 0x4812: GotoState(&Klayman::stPickUpGeneric); @@ -5567,7 +5567,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 2) GotoState(&Klayman::stPickUpNeedle); else if (param.asInteger() == 1) - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); else GotoState(&Klayman::stPickUpGeneric); break; @@ -5649,7 +5649,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); else GotoState(&Klayman::stTryStandIdle); break; @@ -5748,7 +5748,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4837: - sub41CE70(); + stopWalking(); break; } return 0; @@ -5772,14 +5772,14 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4803: _destY = param.asInteger(); - GotoState(&Klayman::sub4204C0); + GotoState(&Klayman::stJumpToGrab); break; case 0x4804: if (param.asInteger() == 3) GotoState(&Klayman::sub421230); break; case 0x480D: - GotoState(&Klayman::sub420F60); + GotoState(&Klayman::stPullCord); break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -5811,7 +5811,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stStepOver); break; case 0x4838: - GotoState(&Klayman::sub420500); + GotoState(&Klayman::stJumpToGrabRelease); break; } return 0; @@ -5828,41 +5828,41 @@ uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: - sub41CDE0(param.asPoint().x); + startWalkToXSmall(param.asPoint().x); break; case 0x4004: - GotoState(&Klayman::sub421640); + GotoState(&Klayman::stStandIdleSmall); break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x4818: - sub41CDE0(_dataResource.getPoint(param.asInteger()).x); + startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x); break; case 0x481F: if (param.asInteger() == 1) - GotoState(&Klayman::sub421740); + GotoState(&Klayman::stWonderAboutAfterSmall); else if (param.asInteger() == 0) - GotoState(&Klayman::sub421780); + GotoState(&Klayman::stWonderAboutHalfSmall); else - GotoState(&Klayman::sub421700); + GotoState(&Klayman::stWonderAboutSmall); break; case 0x482E: if (param.asInteger() == 1) - GotoState(&Klayman::sub421840); + GotoState(&Klayman::stWalkToFrontNoStepSmall); else if (param.asInteger() == 2) - GotoState(&Klayman::sub421800); + GotoState(&Klayman::stWalkToFront2Small); else - GotoState(&Klayman::sub4217C0); + GotoState(&Klayman::stWalkToFrontSmall); break; case 0x482F: if (param.asInteger() == 1) - GotoState(&Klayman::sub421900); + GotoState(&Klayman::stTurnToBackHalfSmall); else if (param.asInteger() == 2) - GotoState(&Klayman::sub4218C0); + GotoState(&Klayman::stTurnToBackWalkSmall); else - GotoState(&Klayman::sub421880); + GotoState(&Klayman::stTurnToBackSmall); break; case 0x4830: GotoState(&KmScene2803b::sub460670); @@ -5910,7 +5910,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (_isSittingInTeleporter) - GotoState(&Klayman::sub421350); + GotoState(&Klayman::stSitIdleTeleporter); else GotoState(&Klayman::stTryStandIdle); break; @@ -6012,7 +6012,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(440, true); break; case 0x480D: - GotoState(&Klayman::sub420F60); + GotoState(&Klayman::stPullCord); break; case 0x4816: if (param.asInteger() == 0) { @@ -6033,7 +6033,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 1) { GotoState(&KmScene2806::sub40F7C0); } else { - GotoState(&Klayman::sub421110); + GotoState(&Klayman::stUseTube); } break; } @@ -6174,7 +6174,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(226, true); break; case 0x480D: - GotoState(&Klayman::sub420F60); + GotoState(&Klayman::stPullCord); break; case 0x4816: if (param.asInteger() == 0) { @@ -6195,7 +6195,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 1) { GotoState(&KmScene2809::sub458590); } else { - GotoState(&Klayman::sub421110); + GotoState(&Klayman::stUseTube); } break; } @@ -6317,42 +6317,42 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x4001: case 0x4800: - sub41CDE0(param.asPoint().x); + startWalkToXSmall(param.asPoint().x); break; case 0x4004: - GotoState(&Klayman::sub421640); + GotoState(&Klayman::stStandIdleSmall); break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x4818: - sub41CDE0(_dataResource.getPoint(param.asInteger()).x); + startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x); break; case 0x481F: if (param.asInteger() == 1) - GotoState(&Klayman::sub421740); + GotoState(&Klayman::stWonderAboutAfterSmall); else if (param.asInteger() == 0) - GotoState(&Klayman::sub421780); + GotoState(&Klayman::stWonderAboutHalfSmall); else - GotoState(&Klayman::sub421700); + GotoState(&Klayman::stWonderAboutSmall); break; case 0x482E: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421840); + GotoState(&Klayman::stWalkToFrontNoStepSmall); } else { - GotoState(&Klayman::sub4217C0); + GotoState(&Klayman::stWalkToFrontSmall); } break; case 0x482F: if (param.asInteger() == 1) { - GotoState(&Klayman::sub421900); + GotoState(&Klayman::stTurnToBackHalfSmall); } else { - GotoState(&Klayman::sub421880); + GotoState(&Klayman::stTurnToBackSmall); } break; case 0x4837: - sub41CE70(); + stopWalking(); break; } return 0; @@ -6376,7 +6376,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4803: _destY = param.asInteger(); - GotoState(&Klayman::sub4204C0); + GotoState(&Klayman::stJumpToGrab); break; case 0x4804: if (param.asInteger() == 3) @@ -6409,7 +6409,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { } else if (param.asInteger() == 4) { GotoState(&Klayman::stTurnAwayFromUse); } else if (param.asInteger() == 5) { - GotoState(&Klayman::sub421270); + GotoState(&Klayman::stTurnToUseExt); } else { GotoState(&Klayman::stWonderAbout); } @@ -6447,7 +6447,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x4837: - sub41CE70(); + stopWalking(); break; } return 0; @@ -6469,14 +6469,13 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4805: _destY = param.asInteger(); - debug("_destY = %d", _destY); - GotoState(&Klayman::sub420460); + GotoState(&Klayman::stJumpToGrabFall); break; case 0x4812: if (param.asInteger() == 2) GotoState(&Klayman::stPickUpNeedle); else if (param.asInteger() == 1) - GotoState(&Klayman::sub41FFF0); + GotoState(&Klayman::stPickUpTube); else GotoState(&Klayman::stPickUpGeneric); break; diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 9e31cf2e04..3f3aafde35 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -53,10 +53,10 @@ public: void update(); void stDoIdlePickEar(); - void sub41FDA0(); - void sub41FDF0(); + void stDoIdleSpinHead(); + void stDoIdleArms(); void stDoIdleChest(); - void sub41FEB0(); + void stDoIdleHeadOff(); void stTryStandIdle(); void stWakeUp(); void stSleeping(); @@ -73,7 +73,7 @@ public: void stPeekWall(); void stJumpToRing1(); void setupJumpToRing(); - void sub420340(); + void stHangOnRing(); void stJumpToRing2(); void stJumpToRing3(); void stHoldRing(); @@ -93,18 +93,18 @@ public: void stTurnToUse(); void stReturnFromUse(); void stWalkingOpenDoor(); - void sub421350(); + void stSitIdleTeleporter(); void stIdleSitBlink(); void stIdleSitBlinkSecond(); void stPickUpNeedle(); - void sub41FFF0(); + void stPickUpTube(); void stTurnToUseInTeleporter(); void stReturnFromUseInTeleporter(); void stStepOver(); void stSitInTeleporter(); void stGetUpFromTeleporter(); void stMoveObjectSkipTurnFaceObject(); - void sub420660(); + void evMoveObjectTurnDone(); void stMoveObjectSkipTurn(); void stMoveObjectFaceObject(); void stUseLever(); @@ -119,19 +119,19 @@ public: void stUpdateWalking(); void stStartWalkingDone(); - void sub41CE70(); + void stopWalking(); void spriteUpdate41F250(); void suWalking(); void suLargeStep(); - void spriteUpdate41F230(); + void suUpdateDestX(); void suWalkingOpenDoor(); void spriteUpdate41F300(); void suWalkingTestExit(); uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41EB70(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount); @@ -141,42 +141,42 @@ public: void setSoundFlag(bool value) { _soundFlag = value; } - void sub421640(); - void sub421740(); - void sub421780(); - void sub421700(); - void sub421840(); - void sub421800(); - void sub4217C0(); - void sub421900(); - void sub4218C0(); - void sub421880(); - void sub420F60(); - void sub420FB0(); - uint32 handleMessage41E6C0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub421110(); - uint32 handleMessage41E750(int messageNum, const MessageParam ¶m, Entity *sender); - void sub4215E0(); - void sub421550(); + void stStandIdleSmall(); + void stWonderAboutAfterSmall(); + void stWonderAboutHalfSmall(); + void stWonderAboutSmall(); + void stWalkToFrontNoStepSmall(); + void stWalkToFront2Small(); + void stWalkToFrontSmall(); + void stTurnToBackHalfSmall(); + void stTurnToBackWalkSmall(); + void stTurnToBackSmall(); + void stPullCord(); + void stReleaseCord(); + uint32 hmPullCord(int messageNum, const MessageParam ¶m, Entity *sender); + void stUseTube(); + uint32 hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender); + void stWalkingExt(); + void stStartWalkingExt(); - void sub4204C0(); - void spriteUpdate41F920(); - uint32 handleMessage41E5F0(int messageNum, const MessageParam ¶m, Entity *sender); + void stJumpToGrab(); + void suJumpToGrab(); + uint32 hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender); - void sub421230(); + void sub421230();//stGrow?? uint32 handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub421270(); - void sub420460(); + void stTurnToUseExt(); + void stJumpToGrabFall(); - void sub420500(); - uint32 handleMessage41F0E0(int messageNum, const MessageParam ¶m, Entity *sender); + void stJumpToGrabRelease(); + uint32 hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender); - void sub421430(); - void sub421440(); + void stDoIdleTeleporterHands(); + void stIdleTeleporterHands(); - void sub421480(); - void sub421490(); + void stDoIdleTeleporterHands2(); + void stIdleTeleporterHands2(); protected: Entity *_parentScene; @@ -212,18 +212,18 @@ protected: void evIdlePickEarDone(); uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41FDB0(); - uint32 handleMessage41E980(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdleSpinHead(); + uint32 hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41FE00(); - void sub41FE50(); - uint32 handleMessage41E9E0(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdleArms(); + void evIdleArmsDone(); + uint32 hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender); void stIdleChest(); uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41FEC0(); - uint32 handleMessage41EFE0(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdleHeadOff(); + uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); void startIdleAnimation(uint32 fileHash, AnimationCb callback); void upIdleAnimation(); @@ -233,7 +233,7 @@ protected: void sub41C770(); void sub41C790(); - void update41D0F0(); + void upIdle(); void stIdleBlink(); void stStandAround(); @@ -248,7 +248,7 @@ protected: void stSneak(); void stWalkingDone(); - uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender); void startSpecialWalkLeft(int16 x); void stStartWalking(); uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); @@ -259,7 +259,7 @@ protected: void startSpecialWalkRight(int16 x); void sub41CC40(int16 x1, int16 x2); - void sub41CAC0(int16 x); + void startWalkToXExt(int16 x); void sub41CCE0(int16 x); void stLargeStepDone(); @@ -279,14 +279,14 @@ protected: uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); - void update41D1C0(); + void upSitIdleTeleporter(); uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); - void sub41CDE0(int16 x); - void sub421680(); - uint32 handleMessage41ED70(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41EE00(int messageNum, const MessageParam ¶m, Entity *sender); + void startWalkToXSmall(int16 x); + void stStartWalkingSmall(); + uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); void walkAlongPathPoints(); @@ -297,8 +297,8 @@ public: KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub44FA50(); - uint32 handleMessage44FA00(int messageNum, const MessageParam ¶m, Entity *sender); + void stPullLever(); + uint32 hmPullLever(int messageNum, const MessageParam ¶m, Entity *sender); }; class KmScene1002 : public Klayman { @@ -312,16 +312,16 @@ protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void update4497D0(); - uint32 handleMessage449800(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage4498E0(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender); void suFallDown(); - void sub449E20(); - void sub449E90(); + void stJumpToRingVenusFlyTrap(); + void stStandIdleSpecial(); void sub449EF0(); void sub449F70(); void stSpitOutFall(); @@ -353,9 +353,9 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage461EA0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub461F30(); - void sub461F70(); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + void stTeleporterAppear(); + void stTeleporterDisappear(); }; class KmScene1201 : public Klayman { @@ -365,7 +365,7 @@ protected: Entity *_class464; int _countdown; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void update40DBE0(); + void upMoveObject(); uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); void stFetchMatch(); void stLightMatch(); @@ -374,7 +374,7 @@ protected: void stMoveObject(); void stMoveObjectSkipTurn(); void stTumbleHeadless(); - void sub40E040(); + void stCloseEyes(); }; class KmScene1303 : public Klayman { @@ -383,7 +383,7 @@ public: protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); - void update4161A0(); + void upPeekWallBlink(); void stPeekWall1(); void stPeekWall2(); void stPeekWallBlink(); @@ -412,9 +412,9 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage417CB0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub417D40(); - void sub417D80(); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + void stTeleporterAppear(); + void stTeleporterDisappear(); }; class KmScene1308 : public Klayman { @@ -423,8 +423,8 @@ public: protected: bool _flag1; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub456150(); + uint32 hmInsertDiskSide(int messageNum, const MessageParam ¶m, Entity *sender); + void stInsertDiskSide(); }; class KmScene1401 : public Klayman { @@ -469,11 +469,11 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage4689A0(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate468A30(); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + void suFallSkipJump(); void stFallSkipJump(); - void sub468AD0(); - void sub468B10(); + void stTeleporterAppear(); + void stTeleporterDisappear(); }; class KmScene1901 : public Klayman { @@ -489,9 +489,9 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage4401A0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub440230(); - void stDoTeleport(); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + void stTeleporterAppear(); + void stTeleporterDisappear(); }; class KmScene2101 : public Klayman { @@ -500,11 +500,11 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage486160(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage486230(int messageNum, const MessageParam ¶m, Entity *sender); - void sub4862C0(); - void sub486320(); - void sub486360(); + uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + void stHitByDoor(); + void stTeleporterAppear(); + void stTeleporterDisappear(); }; class KmScene2201 : public Klayman { @@ -524,7 +524,7 @@ protected: class KmScene2205 : public Klayman { public: KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); - void sub423980(); + void stStartWalkingResume(); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -538,9 +538,9 @@ protected: int16 _yDelta; void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void spriteUpdate482450(); - void sub482490(); - void sub482530(); + void suRidePlatformDown(); + void stRidePlatformDown(); + void stStartWalkingResume(); }; class KmScene2207 : public Klayman { @@ -548,12 +548,12 @@ public: KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void spriteUpdate442430(); - void sub442460(); - void sub4424B0(); - void sub442520(); - void sub442560(); - void sub4425A0(); + void suRidePlatform(); + void stRidePlatform(); + void stInteractLever(); + void stPullLever(); + void stLookLeverDown(); + void stWaitLeverDown(); }; class KmScene2242 : public Klayman { -- cgit v1.2.3 From a5986fd7222f32dfb00487542086cdd765a39208 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 27 Sep 2012 17:07:41 +0000 Subject: NEVERHOOD: Fix resource file reading by introducing SafeMutexedSeekableSubReadStream which locks a mutex during reads and also lock the same mutex in BlbArchive::load; loading resources while music is playing shouldn't mess up the file position now - Fix loading of non-existent resources (not elegant and not checked everywhere yet, the resource system is subject to a minor rewrite anyway) - Rename more Klayman stuff --- engines/neverhood/blbarchive.cpp | 34 ++++++++++++++++++++++++++++++++-- engines/neverhood/blbarchive.h | 2 ++ engines/neverhood/gamemodule.cpp | 9 +++++---- engines/neverhood/klayman.cpp | 38 +++++++++++++++++++------------------- engines/neverhood/klayman.h | 16 ++++++++-------- engines/neverhood/resourceman.cpp | 16 ++++++++++++++++ engines/neverhood/sound.cpp | 11 ++++++----- 7 files changed, 88 insertions(+), 38 deletions(-) diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index f003728e4f..cb422a10e6 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -25,6 +25,29 @@ namespace Neverhood { +/** + * A special variant of SafeSeekableSubReadStream which locks a mutex during each read. + * This is neccessary because the music is streamed from disk and it could happen + * that a sound effect or another music track is played from the same read stream + * while the first music track is updated/read. + */ + +class SafeMutexedSeekableSubReadStream : public Common::SafeSeekableSubReadStream { +public: + SafeMutexedSeekableSubReadStream(SeekableReadStream *parentStream, uint32 begin, uint32 end, DisposeAfterUse::Flag disposeParentStream, + Common::Mutex &mutex) + : SafeSeekableSubReadStream(parentStream, begin, end, disposeParentStream), _mutex(mutex) { + } + virtual uint32 read(void *dataPtr, uint32 dataSize); +protected: + Common::Mutex &_mutex; +}; + +uint32 SafeMutexedSeekableSubReadStream::read(void *dataPtr, uint32 dataSize) { + Common::StackLock lock(_mutex); + return Common::SafeSeekableSubReadStream::read(dataPtr, dataSize); +} + BlbArchive::BlbArchive() : _extData(NULL) { } @@ -84,6 +107,8 @@ void BlbArchive::open(const Common::String &filename) { } void BlbArchive::load(uint index, byte *buffer, uint32 size) { + Common::StackLock lock(_mutex); + BlbArchiveEntry &entry = _entries[index]; _fd.seek(entry.offset); @@ -95,7 +120,11 @@ void BlbArchive::load(uint index, byte *buffer, uint32 size) { _fd.read(buffer, size); break; case 3: // DCL-compressed - Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size); + if (!Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size)) { + debug("decompressDCL(diskSize: %d; size: %d)", entry.diskSize, entry.size); + debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry.fileHash, entry.type, entry.offset, entry.offset + entry.diskSize); + debug("-> fd.pos() = %08X", _fd.pos()); + } break; default: error("BlbArchive::load() Unknown compression type %d", entry.comprType); @@ -110,7 +139,8 @@ byte *BlbArchive::getEntryExtData(uint index) { Common::SeekableReadStream *BlbArchive::createStream(uint index) { const BlbArchiveEntry &entry = _entries[index]; - return new Common::SafeSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize); + return new SafeMutexedSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize, + DisposeAfterUse::NO,_mutex); } } // End of namespace Neverhood diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h index ddb3f0196b..cd2fd117b7 100644 --- a/engines/neverhood/blbarchive.h +++ b/engines/neverhood/blbarchive.h @@ -25,6 +25,7 @@ #include "common/array.h" #include "common/file.h" +#include "common/mutex.h" #include "common/stream.h" #include "common/substream.h" #include "neverhood/neverhood.h" @@ -63,6 +64,7 @@ public: Common::SeekableReadStream *createStream(uint index); private: Common::File _fd; + Common::Mutex _mutex; Common::Array _entries; byte *_extData; }; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 3b1a8c9573..5b84e610ac 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -310,7 +310,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(2000, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif @@ -344,8 +344,9 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif -#if 0 - _vm->gameState().sceneNum = 11; +#if 1 + setGlobalVar(0x1860C990, 1); // DEBUG Make Klayman small + _vm->gameState().sceneNum = 2; createModule(2800, -1); #endif #if 0 @@ -354,7 +355,7 @@ void GameModule::startup() { createModule(2500, -1); #endif #if 0 - _vm->gameState().sceneNum = 2; + _vm->gameState().sceneNum = 1; createModule(2400, -1); #endif } diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index d7e68e6b30..dd5a5885b8 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5024,7 +5024,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2242::sub444D20); + GotoState(&KmScene2242::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -5073,8 +5073,8 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2242::sub444D20() { - int16 frameIndex = (int16)getGlobalVar(0x18288913); +void KmScene2242::stStartWalkingResume() { + int16 frameIndex = getGlobalVar(0x18288913); if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; @@ -5109,7 +5109,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmHallOfRecords::sub43B130); + GotoState(&KmHallOfRecords::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -5142,8 +5142,8 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m return 0; } -void KmHallOfRecords::sub43B130() { - int16 frameIndex = (int16)getGlobalVar(0x18288913); +void KmHallOfRecords::stStartWalkingResume() { + int16 frameIndex = getGlobalVar(0x18288913); if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; @@ -5178,7 +5178,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2247::sub453520); + GotoState(&KmScene2247::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -5211,8 +5211,8 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2247::sub453520() { - int16 frameIndex = (int16)getGlobalVar(0x18288913); +void KmScene2247::stStartWalkingResume() { + int16 frameIndex = getGlobalVar(0x18288913); if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; @@ -5384,7 +5384,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (!getGlobalVar(0x92603A79)) - GotoState(&KmScene2402::sub415840); + GotoState(&KmScene2402::stStandWonderAbout); else GotoState(&Klayman::stTryStandIdle); break; @@ -5442,7 +5442,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -void KmScene2402::sub415840() { +void KmScene2402::stStandWonderAbout() { if (_x > 260) setDoDeltaX(1); _status2 = 0; @@ -6027,11 +6027,11 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4831: - GotoState(&KmScene2806::sub40F780); + GotoState(&KmScene2806::stGrow); break; case 0x4832: if (param.asInteger() == 1) { - GotoState(&KmScene2806::sub40F7C0); + GotoState(&KmScene2806::stDrinkPotion); } else { GotoState(&Klayman::stUseTube); } @@ -6040,7 +6040,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene2806::handleMessage40F1F0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2806::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: @@ -6090,7 +6090,7 @@ uint32 KmScene2806::handleMessage40F1F0(int messageNum, const MessageParam ¶ return messageResult; } -uint32 KmScene2806::handleMessage40F570(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2806::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -6123,23 +6123,23 @@ uint32 KmScene2806::handleMessage40F570(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene2806::sub40F780() { +void KmScene2806::stGrow() { _status2 = 0; _acceptInput = false; SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene2806::handleMessage40F570); + SetMessageHandler(&KmScene2806::hmGrow); startAnimation(0x2838C010, 0, -1); } -void KmScene2806::sub40F7C0() { +void KmScene2806::stDrinkPotion() { _status2 = 1; _acceptInput = false; _flag1 = false; _flag2 = false; SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene2806::handleMessage40F1F0); + SetMessageHandler(&KmScene2806::hmDrinkPotion); startAnimation(0x1C388C04, 0, -1); } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3f3aafde35..25e6d38d2b 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -562,7 +562,7 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub444D20(); + void stStartWalkingResume(); }; class KmHallOfRecords : public Klayman { @@ -571,7 +571,7 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub43B130(); + void stStartWalkingResume(); }; class KmScene2247 : public Klayman { @@ -580,7 +580,7 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub453520(); + void stStartWalkingResume(); }; class KmScene2401 : public Klayman { @@ -605,7 +605,7 @@ public: KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void sub415840(); + void stStandWonderAbout(); }; class KmScene2403 : public Klayman { @@ -678,10 +678,10 @@ protected: bool _flag1; bool _flag2; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage40F1F0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40F570(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40F780(); - void sub40F7C0(); + uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); + void stGrow(); + void stDrinkPotion(); }; class KmScene2809 : public Klayman { diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index c073e976a4..28cef366e1 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -77,6 +77,8 @@ BlbArchiveEntry *ResourceMan::getArchiveEntry(ResourceFileEntry *entry) const { int ResourceMan::useResource(uint32 fileHash) { ResourceFileEntry *entry = findEntry(fileHash); + if (!entry) + return -1; if (entry->resourceHandle != -1) { _resources[entry->resourceHandle]->useRefCount++; } else { @@ -94,6 +96,8 @@ int ResourceMan::useResource(uint32 fileHash) { } void ResourceMan::unuseResource(int resourceHandle) { + if (resourceHandle < 0) + return; Resource *resource = _resources[resourceHandle]; if (resource->useRefCount > 0) resource->useRefCount--; @@ -111,15 +115,21 @@ int ResourceMan::getResourceHandleByHash(uint32 fileHash) { } bool ResourceMan::isResourceDataValid(int resourceHandle) const { + if (resourceHandle < 0) + return false; return _resources[resourceHandle]->data != NULL; } uint32 ResourceMan::getResourceSize(int resourceHandle) const { + if (resourceHandle < 0) + return 0; Resource *resource = _resources[resourceHandle]; return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->size; } byte ResourceMan::getResourceType(int resourceHandle) { + if (resourceHandle < 0) + return 0; Resource *resource = _resources[resourceHandle]; return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->type; } @@ -130,6 +140,8 @@ byte ResourceMan::getResourceTypeByHash(uint32 fileHash) { } byte *ResourceMan::getResourceExtData(int resourceHandle) { + if (resourceHandle < 0) + return NULL; Resource *resource = _resources[resourceHandle]; return _archives[resource->archiveIndex]->getEntryExtData(resource->entryIndex); } @@ -140,6 +152,8 @@ byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) { } byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) { + if (resourceHandle < 0) + return NULL; Resource *resource = _resources[resourceHandle]; if (resource->data != NULL) { resource->dataRefCount++; @@ -154,6 +168,8 @@ byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) { } void ResourceMan::unloadResource(int resourceHandle) { + if (resourceHandle < 0) + return; Resource *resource = _resources[resourceHandle]; if (resource->dataRefCount > 0) resource->dataRefCount--; diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index df66c6b777..c1db48c637 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -306,11 +306,11 @@ void SoundMan::update() { if (musicItem->_countdown) { --musicItem->_countdown; } else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) { - debug("SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); + debug(1, "SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); musicItem->_musicResource->play(musicItem->_fadeVolumeStep); musicItem->_fadeVolumeStep = 0; } else if (musicItem->_stop) { - debug("SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); + debug(1, "SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); musicItem->_musicResource->stop(musicItem->_fadeVolumeStep); musicItem->_fadeVolumeStep = 0; musicItem->_stop = false; @@ -529,13 +529,11 @@ int16 AudioResourceMan::addSound(uint32 fileHash) { soundItem->_isPlaying = false; soundItem->_volume = 100; soundItem->_panning = 50; - for (uint i = 0; i < _soundItems.size(); ++i) if (!_soundItems[i]) { _soundItems[i] = soundItem; return i; } - int16 soundIndex = (int16)_soundItems.size(); _soundItems.push_back(soundItem); return soundIndex; @@ -591,6 +589,9 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; if (!soundItem->_data) loadSound(soundIndex); + + if (!soundItem->_data) + return; uint32 soundSize = _vm->_res->getResourceSize(soundItem->_resourceHandle); Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundSize, DisposeAfterUse::NO); @@ -600,7 +601,7 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) { _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle, audioStream, -1, VOLUME(soundItem->_volume), PANNING(soundItem->_panning)); - debug("playing sound %08X", soundItem->_fileHash); + debug(1, "playing sound %08X", soundItem->_fileHash); soundItem->_isPlaying = true; -- cgit v1.2.3 From cce19001fd353664f4348adf291080cef9da50b0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 27 Sep 2012 17:56:17 +0000 Subject: NEVERHOOD: Rename more Klayman stuff (not much left :) --- engines/neverhood/gamemodule.cpp | 6 +-- engines/neverhood/klayman.cpp | 114 ++++++++++++++------------------------- engines/neverhood/klayman.h | 34 ++++++------ 3 files changed, 60 insertions(+), 94 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 5b84e610ac..56812ba9c7 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -314,8 +314,8 @@ void GameModule::startup() { _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif -#if 0 - _vm->gameState().sceneNum = 0; +#if 1 + _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif #if 0 @@ -344,7 +344,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif -#if 1 +#if 0 setGlobalVar(0x1860C990, 1); // DEBUG Make Klayman small _vm->gameState().sceneNum = 2; createModule(2800, -1); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index dd5a5885b8..6ce39a7930 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2537,7 +2537,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1002::update4497D0() { +void KmScene1002::upSpitOutFall() { Klayman::update(); if (_countdown1 != 0 && (--_countdown1 == 0)) { _surface->setVisible(true); @@ -2583,11 +2583,12 @@ uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam ¶m } _y = ((Sprite*)sender)->getY() - 200; if (param.asInteger() == 0) { - sub449EF0(); + stSpitOutFall0(); } else if (param.asInteger() == 1) { - sub44A0D0(); + // NOTE This is never used and the code was removed + // Also the animations used here in the original don't exist... } else if (param.asInteger() == 2) { - stSpitOutFall(); + stSpitOutFall2(); } break; } @@ -2659,7 +2660,7 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam & return messageResult; } -uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { int16 speedUpFrameIndex; uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { @@ -2682,7 +2683,7 @@ uint32 KmScene1002::handleMessage449C90(int messageNum, const MessageParam ¶ return messageResult; } -uint32 KmScene1002::handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D360(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2729,22 +2730,20 @@ void KmScene1002::stStandIdleSpecial() { SetMessageHandler(&KmScene1002::hmStandIdleSpecial); } -void KmScene1002::sub449EF0() { +void KmScene1002::stSpitOutFall0() { _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x000BAB02, 0, -1); - SetUpdateHandler(&KmScene1002::update4497D0); - // Weird stuff happening + SetUpdateHandler(&KmScene1002::upSpitOutFall); SetMessageHandler(&Klayman::handleMessage41D360); - //SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteUpdate(&KmScene1002::suFallDown); - NextState(&KmScene1002::sub449F70); + NextState(&KmScene1002::stFalling); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); } -void KmScene1002::sub449F70() { +void KmScene1002::stFalling() { sendMessage(_parentScene, 0x1024, 1); _soundResource1.play(0x41648271); _status2 = 1; @@ -2754,7 +2753,7 @@ void KmScene1002::sub449F70() { SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); SetMessageHandler(&KmScene1002::handleMessage41D480); - NextState(&KmScene1002::sub44A230); + NextState(&KmScene1002::stFallTouchdown); sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; @@ -2762,51 +2761,20 @@ void KmScene1002::sub449F70() { sendMessage(_ssLadderArch, 0x482B, 0); } -void KmScene1002::stSpitOutFall() { +void KmScene1002::stSpitOutFall2() { _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x9308C132, 0, -1); - SetUpdateHandler(&KmScene1002::update4497D0); - SetSpriteUpdate(&KmScene1002::suFallDown); + SetUpdateHandler(&KmScene1002::upSpitOutFall); SetMessageHandler(&Klayman::handleMessage41D480); - NextState(&KmScene1002::sub449F70); - sendMessage(_class599, 0x482A, 0); - sendMessage(_ssLadderArch, 0x482A, 0); -} - -void KmScene1002::sub44A0D0() { - _countdown1 = 1; - _status2 = 0; - _acceptInput = false; - startAnimation(0x0013A206, 0, -1); - SetUpdateHandler(&KmScene1002::update4497D0); - SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(&KmScene1002::suFallDown); - NextState(&KmScene1002::sub44A150); + NextState(&KmScene1002::stFalling); sendMessage(_class599, 0x482A, 0); sendMessage(_ssLadderArch, 0x482A, 0); } -void KmScene1002::sub44A150() { - sendMessage(_parentScene, 0x1024, 1); - _soundResource1.play(0x41648271); - _status2 = 1; - _acceptInput = false; - _isWalking = false; - startAnimationByHash(0x0013A206, 0x88003000, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage41D480); - SetSpriteUpdate(NULL); - NextState(&KmScene1002::sub44A230); - sendMessage(_parentScene, 0x2002, 0); - // TODO _callbackList = NULL; - _attachedSprite = NULL; - sendMessage(_class599, 0x482B, 0); - sendMessage(_ssLadderArch, 0x482B, 0); -} - -void KmScene1002::sub44A230() { +void KmScene1002::stFallTouchdown() { setDoDeltaX(2); stTryStandIdle(); } @@ -2818,7 +2786,7 @@ void KmScene1002::stJumpAndFall() { _acceptInput = false; startAnimation(0xB93AB151, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage449D60); + SetMessageHandler(&KmScene1002::hmJumpAndFall); SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&Klayman::stLandOnFeet); } @@ -2854,7 +2822,7 @@ void KmScene1002::stHitByBoxingGlove() { _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage449C90); + SetMessageHandler(&KmScene1002::hmHitByBoxingGlove); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); FinalizeState(&KmScene1002::stHitByBoxingGloveDone); } @@ -5865,13 +5833,13 @@ uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToBackSmall); break; case 0x4830: - GotoState(&KmScene2803b::sub460670); + GotoState(&KmScene2803b::stShrink); break; } return 0; } -uint32 KmScene2803b::handleMessage460600(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2803b::hmShrink(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -5884,14 +5852,14 @@ uint32 KmScene2803b::handleMessage460600(int messageNum, const MessageParam &par return messageResult; } -void KmScene2803b::sub460670() { +void KmScene2803b::stShrink() { _status2 = 0; _acceptInput = false; startAnimation(0x1AE88904, 0, -1); _soundResource1.play(0x4C69EA53); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene2803b::handleMessage460600); + SetMessageHandler(&KmScene2803b::hmShrink); } KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -5940,16 +5908,16 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - sub404890(); + stTeleporterAppear(); break; case 0x483E: - sub4048D0(); + stTeleporterDisappear(); break; } return 0; } -uint32 KmScene2805::handleMessage404800(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2805::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -5962,21 +5930,21 @@ uint32 KmScene2805::handleMessage404800(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene2805::sub404890() { +void KmScene2805::stTeleporterAppear() { _status2 = 0; _acceptInput = false; SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2805::handleMessage404800); + SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear); startAnimation(0xDE284B74, 0, -1); } -void KmScene2805::sub4048D0() { +void KmScene2805::stTeleporterDisappear() { _status2 = 0; _acceptInput = false; SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2805::handleMessage404800); + SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear); startAnimation(0xD82A4094, 0, -1); } @@ -6126,10 +6094,10 @@ uint32 KmScene2806::hmGrow(int messageNum, const MessageParam ¶m, Entity *se void KmScene2806::stGrow() { _status2 = 0; _acceptInput = false; + startAnimation(0x2838C010, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene2806::hmGrow); - startAnimation(0x2838C010, 0, -1); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } void KmScene2806::stDrinkPotion() { @@ -6137,10 +6105,10 @@ void KmScene2806::stDrinkPotion() { _acceptInput = false; _flag1 = false; _flag2 = false; + startAnimation(0x1C388C04, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene2806::hmDrinkPotion); - startAnimation(0x1C388C04, 0, -1); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, @@ -6189,11 +6157,11 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4831: - GotoState(&KmScene2809::sub458550); + GotoState(&KmScene2809::stGrow); break; case 0x4832: if (param.asInteger() == 1) { - GotoState(&KmScene2809::sub458590); + GotoState(&KmScene2809::stDrinkPotion); } else { GotoState(&Klayman::stUseTube); } @@ -6202,7 +6170,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene2809::handleMessage457FC0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2809::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: @@ -6254,7 +6222,7 @@ uint32 KmScene2809::handleMessage457FC0(int messageNum, const MessageParam ¶ return messageResult; } -uint32 KmScene2809::handleMessage458340(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2809::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -6287,23 +6255,23 @@ uint32 KmScene2809::handleMessage458340(int messageNum, const MessageParam ¶ return messageResult; } -void KmScene2809::sub458550() { +void KmScene2809::stGrow() { _status2 = 0; _acceptInput = false; startAnimation(0x2838C010, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2809::handleMessage458340); + SetMessageHandler(&KmScene2809::hmGrow); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } -void KmScene2809::sub458590() { +void KmScene2809::stDrinkPotion() { _status2 = 1; _acceptInput = false; _flag1 = false; _flag2 = false; startAnimation(0x1C388C04, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2809::handleMessage457FC0); + SetMessageHandler(&KmScene2809::hmDrinkPotion); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 25e6d38d2b..787ad7eb95 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -311,23 +311,21 @@ protected: int _status; void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void update4497D0(); + void upSpitOutFall(); uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage449C90(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage449D60(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); void suFallDown(); void stJumpToRingVenusFlyTrap(); void stStandIdleSpecial(); - void sub449EF0(); - void sub449F70(); - void stSpitOutFall(); - void sub44A0D0(); - void sub44A150(); - void sub44A230(); + void stSpitOutFall0(); + void stFalling(); + void stSpitOutFall2(); + void stFallTouchdown(); void stJumpAndFall(); void stDropFromRing(); void stPressDoorButton(); @@ -650,8 +648,8 @@ public: protected: SoundResource _soundResource; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage460600(int messageNum, const MessageParam ¶m, Entity *sender); - void sub460670(); + uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); + void stShrink(); }; class KmScene2805 : public Klayman { @@ -660,9 +658,9 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage404800(int messageNum, const MessageParam ¶m, Entity *sender); - void sub404890(); - void sub4048D0(); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + void stTeleporterAppear(); + void stTeleporterDisappear(); }; class KmScene2806 : public Klayman { @@ -697,10 +695,10 @@ protected: bool _flag1; bool _flag2; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage457FC0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage458340(int messageNum, const MessageParam ¶m, Entity *sender); - void sub458550(); - void sub458590(); + uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); + void stGrow(); + void stDrinkPotion(); }; class KmScene2810Small : public Klayman { -- cgit v1.2.3 From d1927ef8e6e0ebcc02400e97fa8f2055fc86983e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 11:03:00 +0000 Subject: NEVERHOOD: Move Klayman teleporter appear/disappear animation code from the several subclasses to the base Klayman class; the code was equal except for the animation hashes --- engines/neverhood/klayman.cpp | 254 ++++++++---------------------------------- engines/neverhood/klayman.h | 12 +- 2 files changed, 53 insertions(+), 213 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 6ce39a7930..2954852167 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2310,6 +2310,38 @@ void Klayman::stIdleTeleporterHands2() { NextState(&Klayman::stIdleSitBlinkSecond); } +void Klayman::teleporterAppear(uint32 fileHash) { + _status2 = 0; + _acceptInput = false; + startAnimation(fileHash, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmTeleporterAppearDisappear); + SetSpriteUpdate(NULL); +} + +void Klayman::teleporterDisappear(uint32 fileHash) { + _status2 = 0; + _acceptInput = false; + startAnimation(fileHash, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmTeleporterAppearDisappear); + SetSpriteUpdate(NULL); +} + +uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + _soundResource1.play(0x85B10BB8); + } else if (param.asInteger() == 0x4E6A0CA0) { + _soundResource1.play(0xC5B709B0); + } + break; + } + return messageResult; +} + //############################################################################## // KmScene1001 @@ -3004,47 +3036,15 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - stTeleporterAppear(); + teleporterAppear(0x2C2A4A1C); break; case 0x483E: - stTeleporterDisappear(); + teleporterDisappear(0x3C2E4245); break; } return 0; } -uint32 KmScene1109::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) { - _soundResource1.play(0x85B10BB8); - } else if (param.asInteger() == 0x4E6A0CA0) { - _soundResource1.play(0xC5B709B0); - } - break; - } - return messageResult; -} - -void KmScene1109::stTeleporterAppear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2C2A4A1C, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear); -} - -void KmScene1109::stTeleporterDisappear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x3C2E4245, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1109::hmTeleporterAppearDisappear); -} - // KmScene1201 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464) @@ -3540,10 +3540,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - stTeleporterAppear(); + teleporterAppear(0xEE084A04); break; case 0x483E: - stTeleporterDisappear(); + teleporterDisappear(0xB86A4274); break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -3555,37 +3555,6 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -void KmScene1306::stTeleporterAppear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0xEE084A04, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear); -} - -void KmScene1306::stTeleporterDisappear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0xB86A4274, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1306::hmTeleporterAppearDisappear); -} - -uint32 KmScene1306::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) { - _soundResource1.play(0x85B10BB8); - } else if (param.asInteger() == 0x4E6A0CA0) { - _soundResource1.play(0xC5B709B0); - } - } - return messageResult; -} - KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { @@ -4154,29 +4123,15 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - stTeleporterAppear(); + teleporterAppear(0x5E0A4905); break; case 0x483E: - stTeleporterDisappear(); + teleporterDisappear(0xD86E4477); break; } return messageResult; } -uint32 KmScene1705::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) { - _soundResource1.play(0x85B10BB8); - } else if (param.asInteger() == 0x4E6A0CA0) { - _soundResource1.play(0xC5B709B0); - } - break; - } - return messageResult; -} - void KmScene1705::suFallSkipJump() { updateDeltaXY(); HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); @@ -4197,24 +4152,6 @@ void KmScene1705::stFallSkipJump() { NextState(&Klayman::stLandOnFeet); } -void KmScene1705::stTeleporterAppear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x5E0A4905, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear); -} - -void KmScene1705::stTeleporterDisappear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0xD86E4477, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1705::hmTeleporterAppearDisappear); -} - KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -4309,47 +4246,15 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - stTeleporterAppear(); + teleporterAppear(0xBE68CC54); break; case 0x483E: - stTeleporterDisappear(); + teleporterDisappear(0x18AB4ED4); break; } return 0; } -uint32 KmScene2001::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) { - _soundResource1.play(0x85B10BB8); - } if (param.asInteger() == 0x4E6A0CA0) { - _soundResource1.play(0xC5B709B0); - } - break; - } - return messageResult; -} - -void KmScene2001::stTeleporterAppear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0xBE68CC54, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear); -} - -void KmScene2001::stTeleporterDisappear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x18AB4ED4, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2001::hmTeleporterAppearDisappear); -} - KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { @@ -4427,10 +4332,10 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - stTeleporterAppear(); + teleporterAppear(0xFF290E30); break; case 0x483E: - stTeleporterDisappear(); + teleporterDisappear(0x9A28CA1C); break; } return messageResult; @@ -4459,20 +4364,6 @@ uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam ¶m, Entit return messageResult; } -uint32 KmScene2101::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) { - _soundResource1.play(0x85B10BB8); - } else if (param.asInteger() == 0x4E6A0CA0) { - _soundResource1.play(0xC5B709B0); - } - break; - } - return messageResult; -} - void KmScene2101::stHitByDoor() { _status2 = 1; _acceptInput = false; @@ -4483,24 +4374,6 @@ void KmScene2101::stHitByDoor() { _soundResource1.play(0x402E82D4); } -void KmScene2101::stTeleporterAppear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0xFF290E30, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear); -} - -void KmScene2101::stTeleporterDisappear() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x9A28CA1C, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2101::hmTeleporterAppearDisappear); -} - KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) // TODO: NRect *rect1, int16 unk in Klayman ctor : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -5277,7 +5150,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -uint32 KmScene2401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 KmScene2401::hmSpit(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -5312,7 +5185,7 @@ void KmScene2401::stTrySpitIntoPipe() { _contSpit = false; startAnimation(0x1808B150, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2401::handleMessage); + SetMessageHandler(&KmScene2401::hmSpit); SetSpriteUpdate(NULL); } } @@ -5324,7 +5197,7 @@ void KmScene2401::spitIntoPipe() { _acceptInput = false; startAnimation(0x1B08B553, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2401::handleMessage); + SetMessageHandler(&KmScene2401::hmSpit); SetSpriteUpdate(NULL); NextState(&KmScene2401::stContSpitIntoPipe); } @@ -5334,7 +5207,7 @@ void KmScene2401::stContSpitIntoPipe() { _acceptInput = true; startAnimationByHash(0x1808B150, 0x16401CA6, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2401::handleMessage); + SetMessageHandler(&KmScene2401::hmSpit); SetSpriteUpdate(NULL); } @@ -5908,46 +5781,15 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stGetUpFromTeleporter); break; case 0x483D: - stTeleporterAppear(); + teleporterAppear(0xDE284B74); break; case 0x483E: - stTeleporterDisappear(); + teleporterDisappear(0xD82A4094); break; } return 0; } -uint32 KmScene2805::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) - _soundResource1.play(0x85B10BB8); - else if (param.asInteger() == 0x4E6A0CA0) - _soundResource1.play(0xC5B709B0); - break; - } - return messageResult; -} - -void KmScene2805::stTeleporterAppear() { - _status2 = 0; - _acceptInput = false; - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear); - startAnimation(0xDE284B74, 0, -1); -} - -void KmScene2805::stTeleporterDisappear() { - _status2 = 0; - _acceptInput = false; - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene2805::hmTeleporterAppearDisappear); - startAnimation(0xD82A4094, 0, -1); -} - KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000), diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 787ad7eb95..600cdbfdad 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -178,6 +178,10 @@ public: void stDoIdleTeleporterHands2(); void stIdleTeleporterHands2(); + void teleporterAppear(uint32 fileHash); + void teleporterDisappear(uint32 fileHash); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + protected: Entity *_parentScene; Sprite *_attachedSprite; @@ -351,7 +355,6 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); void stTeleporterAppear(); void stTeleporterDisappear(); }; @@ -410,7 +413,6 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); void stTeleporterAppear(); void stTeleporterDisappear(); }; @@ -467,7 +469,6 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); void suFallSkipJump(); void stFallSkipJump(); void stTeleporterAppear(); @@ -487,7 +488,6 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); void stTeleporterAppear(); void stTeleporterDisappear(); }; @@ -499,7 +499,6 @@ protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); void stHitByDoor(); void stTeleporterAppear(); void stTeleporterDisappear(); @@ -592,7 +591,7 @@ protected: uint32 _spitDestPipeIndex; uint32 _spitContDestPipeIndex; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); void stTrySpitIntoPipe(); void spitIntoPipe(); void stContSpitIntoPipe(); @@ -658,7 +657,6 @@ public: protected: bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); void stTeleporterAppear(); void stTeleporterDisappear(); }; -- cgit v1.2.3 From e1943c1e2bd83bad9dfb55a54a365d2d54e0ec06 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 11:23:05 +0000 Subject: NEVERHOOD: Move more into the Klayman base class - Fix header from previous commit --- engines/neverhood/klayman.cpp | 147 +++++++++++++++++++++--------------------- engines/neverhood/klayman.h | 49 +++++--------- 2 files changed, 89 insertions(+), 107 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 2954852167..da3004dcd8 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -56,11 +56,11 @@ static const KlaymanIdleTableItem klaymanTable4[] = { // Klayman Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) - : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), + : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), - _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) { + _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); @@ -2342,6 +2342,41 @@ uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam & return messageResult; } +uint32 Klayman::hmShrink(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) + sendMessage(_parentScene, 0x482A, 0); + else if (param.asInteger() == 0x33288344) + _soundResource3.play(0x10688664); + break; + } + return messageResult; +} + +void Klayman::stShrink() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x1AE88904, 0, -1); + _soundResource1.play(0x4C69EA53); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&Klayman::hmShrink); +} + +void Klayman::stStandWonderAbout() { + if (_x > 260) + setDoDeltaX(1); + _status2 = 0; + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); + _newStickFrameIndex = 10; + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteUpdate(NULL); +} + //############################################################################## // KmScene1001 @@ -2982,7 +3017,7 @@ void KmScene1004::stReadNote() { } KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -3019,7 +3054,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToUseInTeleporter); break; case 0x481E: - if (_isSittingInTeleporter)//CHECKME + if (_isSittingInTeleporter) GotoState(&Klayman::stReturnFromUseInTeleporter); break; case 0x4834: @@ -3432,7 +3467,6 @@ void KmScene1305::cbCrashDownEvent() { KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - _isSittingInTeleporter = false; } uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3951,7 +3985,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { } uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4040,7 +4074,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1705 KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -4192,7 +4226,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -4256,7 +4290,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5155,11 +5189,11 @@ uint32 KmScene2401::hmSpit(int messageNum, const MessageParam ¶m, Entity *se switch (messageNum) { case 0x100D: if (param.asInteger() == 0x16401CA6) { - _canSpit = true; - if (_contSpit) + _canSpitPipe = true; + if (_contSpitPipe) spitIntoPipe(); } else if (param.asInteger() == 0xC11C0008) { - _canSpit = false; + _canSpitPipe = false; _acceptInput = false; _readyToSpit = false; } else if (param.asInteger() == 0x018A0001) { @@ -5172,17 +5206,17 @@ uint32 KmScene2401::hmSpit(int messageNum, const MessageParam ¶m, Entity *se void KmScene2401::stTrySpitIntoPipe() { if (_readyToSpit) { - _contSpit = true; + _contSpitPipe = true; _spitContDestPipeIndex = _spitPipeIndex; - if (_canSpit) + if (_canSpitPipe) spitIntoPipe(); } else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) { _status2 = 2; _acceptInput = true; _spitDestPipeIndex = _spitPipeIndex; _readyToSpit = true; - _canSpit = false; - _contSpit = false; + _canSpitPipe = false; + _contSpitPipe = false; startAnimation(0x1808B150, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene2401::hmSpit); @@ -5191,9 +5225,9 @@ void KmScene2401::stTrySpitIntoPipe() { } void KmScene2401::spitIntoPipe() { - _contSpit = false; + _contSpitPipe = false; _spitDestPipeIndex = _spitContDestPipeIndex; - _canSpit = false; + _canSpitPipe = false; _acceptInput = false; startAnimation(0x1B08B553, 0, -1); SetUpdateHandler(&Klayman::update); @@ -5203,7 +5237,7 @@ void KmScene2401::spitIntoPipe() { } void KmScene2401::stContSpitIntoPipe() { - _canSpit = true; + _canSpitPipe = true; _acceptInput = true; startAnimationByHash(0x1808B150, 0x16401CA6, 0); SetUpdateHandler(&Klayman::update); @@ -5225,7 +5259,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4004: if (!getGlobalVar(0x92603A79)) - GotoState(&KmScene2402::stStandWonderAbout); + GotoState(&Klayman::stStandWonderAbout); else GotoState(&Klayman::stTryStandIdle); break; @@ -5283,18 +5317,6 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -void KmScene2402::stStandWonderAbout() { - if (_x > 260) - setDoDeltaX(1); - _status2 = 0; - _acceptInput = true; - startAnimation(0xD820A114, 0, -1); - _newStickFrameIndex = 10; - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteUpdate(NULL); -} - KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -5473,7 +5495,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5659,10 +5681,9 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _soundResource(vm) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { _dataResource.load(0x81120132); - _soundResource.load(0x10688664); } uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5706,37 +5727,14 @@ uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTurnToBackSmall); break; case 0x4830: - GotoState(&KmScene2803b::stShrink); + GotoState(&Klayman::stShrink); break; } return 0; } -uint32 KmScene2803b::hmShrink(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x80C110B5) - sendMessage(_parentScene, 0x482A, 0); - else if (param.asInteger() == 0x33288344) - _soundResource.play(); - break; - } - return messageResult; -} - -void KmScene2803b::stShrink() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x1AE88904, 0, -1); - _soundResource1.play(0x4C69EA53); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene2803b::hmShrink); -} - KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _isSittingInTeleporter(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5854,23 +5852,23 @@ uint32 KmScene2806::hmDrinkPotion(int messageNum, const MessageParam ¶m, Ent uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: - if (_flag1) { + if (_potionFlag1) { startAnimationByHash(0x1C388C04, 0x004A2148, 0); messageResult = 0; } else - _flag2 = true; + _potionFlag2 = true; break; case 0x100D: if (param.asInteger() == 0x0002418E) sendMessage(_parentScene, 0x2000, 0); else if (param.asInteger() == 0x924090C2) { - _flag1 = true; - if (_flag2) { + _potionFlag1 = true; + if (_potionFlag2) { startAnimationByHash(0x1C388C04, 0x004A2148, 0); messageResult = 0; } } else if (param.asInteger() == 0x004A2148) - _flag1 = false; + _potionFlag1 = false; else if (param.asInteger() == 0x02B20220) _soundResource1.play(0xC5408620); else if (param.asInteger() == 0x0A720138) @@ -5945,8 +5943,8 @@ void KmScene2806::stGrow() { void KmScene2806::stDrinkPotion() { _status2 = 1; _acceptInput = false; - _flag1 = false; - _flag2 = false; + _potionFlag1 = false; + _potionFlag2 = false; startAnimation(0x1C388C04, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene2806::hmDrinkPotion); @@ -6016,23 +6014,23 @@ uint32 KmScene2809::hmDrinkPotion(int messageNum, const MessageParam ¶m, Ent uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x1008: - if (_flag1) { + if (_potionFlag1) { startAnimationByHash(0x1C388C04, 0x004A2148, 0); messageResult = 0; } else - _flag2 = true; + _potionFlag2 = true; break; case 0x100D: if (param.asInteger() == 0x0002418E) sendMessage(_parentScene, 0x2000, 0); else if (param.asInteger() == 0x924090C2) { - _flag1 = true; - if (_flag2) { + _potionFlag1 = true; + if (_potionFlag2) { startAnimationByHash(0x1C388C04, 0x004A2148, 0); messageResult = 0; } } else if (param.asInteger() == 0x004A2148) - _flag1 = false; + _potionFlag1 = false; else if (param.asInteger() == 0x02B20220) _soundResource1.play(0xC5408620); else if (param.asInteger() == 0x0A720138) @@ -6109,15 +6107,14 @@ void KmScene2809::stGrow() { void KmScene2809::stDrinkPotion() { _status2 = 1; _acceptInput = false; - _flag1 = false; - _flag2 = false; + _potionFlag1 = false; + _potionFlag2 = false; startAnimation(0x1C388C04, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&KmScene2809::hmDrinkPotion); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } - KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 600cdbfdad..b32143d230 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -178,10 +178,15 @@ public: void stDoIdleTeleporterHands2(); void stIdleTeleporterHands2(); - void teleporterAppear(uint32 fileHash); - void teleporterDisappear(uint32 fileHash); + void teleporterAppear(uint32 fileHash); + void teleporterDisappear(uint32 fileHash); uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); + void stShrink(); + + void stStandWonderAbout(); + protected: Entity *_parentScene; Sprite *_attachedSprite; @@ -203,12 +208,16 @@ protected: bool _flagFA; SoundResource _soundResource1; SoundResource _soundResource2; + SoundResource _soundResource3; int _status3; const KlaymanIdleTableItem *_idleTable; int _idleTableCount; int _idleTableMaxValue; NPointArray *_pathPoints; bool _soundFlag; + + bool _isSittingInTeleporter; + virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -353,10 +362,7 @@ class KmScene1109 : public Klayman { public: KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stTeleporterAppear(); - void stTeleporterDisappear(); }; class KmScene1201 : public Klayman { @@ -411,10 +417,7 @@ class KmScene1306 : public Klayman { public: KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stTeleporterAppear(); - void stTeleporterDisappear(); }; class KmScene1308 : public Klayman { @@ -459,7 +462,6 @@ class KmScene1608 : public Klayman { public: KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; @@ -467,12 +469,9 @@ class KmScene1705 : public Klayman { public: KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void suFallSkipJump(); void stFallSkipJump(); - void stTeleporterAppear(); - void stTeleporterDisappear(); }; class KmScene1901 : public Klayman { @@ -486,22 +485,16 @@ class KmScene2001 : public Klayman { public: KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stTeleporterAppear(); - void stTeleporterDisappear(); }; class KmScene2101 : public Klayman { public: KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); void stHitByDoor(); - void stTeleporterAppear(); - void stTeleporterDisappear(); }; class KmScene2201 : public Klayman { @@ -584,8 +577,8 @@ class KmScene2401 : public Klayman { public: KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _canSpit; - bool _contSpit; + bool _canSpitPipe; + bool _contSpitPipe; bool _readyToSpit; uint32 _spitPipeIndex; uint32 _spitDestPipeIndex; @@ -602,7 +595,6 @@ public: KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stStandWonderAbout(); }; class KmScene2403 : public Klayman { @@ -623,7 +615,6 @@ class KmScene2501 : public Klayman { public: KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; @@ -645,20 +636,14 @@ class KmScene2803b : public Klayman { public: KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - SoundResource _soundResource; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); - void stShrink(); }; class KmScene2805 : public Klayman { public: KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _isSittingInTeleporter; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stTeleporterAppear(); - void stTeleporterDisappear(); }; class KmScene2806 : public Klayman { @@ -671,8 +656,8 @@ protected: SoundResource _soundRes3; SoundResource _soundRes4; SoundResource _soundRes5; - bool _flag1; - bool _flag2; + bool _potionFlag1; + bool _potionFlag2; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); @@ -690,8 +675,8 @@ protected: SoundResource _soundRes3; SoundResource _soundRes4; SoundResource _soundRes5; - bool _flag1; - bool _flag2; + bool _potionFlag1; + bool _potionFlag2; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 6160ee3cf2f0cb93807ea115b94601b11d5543c4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 16:49:36 +0000 Subject: NEVERHOOD: Move code from entity.h to new entity.cpp --- engines/neverhood/entity.cpp | 115 +++++++++++++++++++++++++++++++++++++++++++ engines/neverhood/entity.h | 98 +++++++++++------------------------- engines/neverhood/module.mk | 1 + 3 files changed, 145 insertions(+), 69 deletions(-) create mode 100644 engines/neverhood/entity.cpp diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp new file mode 100644 index 0000000000..e837225998 --- /dev/null +++ b/engines/neverhood/entity.cpp @@ -0,0 +1,115 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/entity.h" + +namespace Neverhood { + +uint32 MessageParam::asInteger() const { + assert(_type == mptInteger); + return _integer; +} + +NPoint MessageParam::asPoint() const { + assert(_type == mptInteger || _type == mptPoint); + if (_type == mptInteger) { + NPoint pt; + pt.x = _integer & 0xFFFF; + pt.y = (_integer >> 16) & 0xFFFF; + return pt; + } + return _point; +} + +Entity *MessageParam::asEntity() const { + assert(_type == mptEntity); + return _entity; +} + +// TODO: Disable heavy debug stuff in release mode + +#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler +#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler + +Entity::Entity(NeverhoodEngine *vm, int priority) + : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") { +} + +Entity::~Entity() { +} + +void Entity::draw() { +} + +void Entity::handleUpdate() { + //debug("Entity(%s).handleUpdate", _name.c_str()); + debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str()); + if (_updateHandlerCb) + (this->*_updateHandlerCb)(); +} + +uint32 Entity::receiveMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); + return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; +} + +uint32 Entity::sendMessage(Entity *receiver, int messageNum, const MessageParam ¶m) { + return receiver ? receiver->receiveMessage(messageNum, param, this) : 0; +} + +uint32 Entity::sendMessage(Entity *receiver, int messageNum, uint32 param) { + return sendMessage(receiver, messageNum, MessageParam(param)); +} + +uint32 Entity::sendPointMessage(Entity *receiver, int messageNum, const NPoint ¶m) { + return sendMessage(receiver, messageNum, MessageParam(param)); +} + +uint32 Entity::sendEntityMessage(Entity *receiver, int messageNum, Entity *param) { + return sendMessage(receiver, messageNum, MessageParam((Entity*)param)); +} + +uint32 Entity::getGlobalVar(uint32 nameHash) { + return _vm->_gameVars->getGlobalVar(nameHash); +} + +void Entity::setGlobalVar(uint32 nameHash, uint32 value) { + _vm->_gameVars->setGlobalVar(nameHash, value); +} + +uint32 Entity::getSubVar(uint32 nameHash, uint32 subNameHash) { + return _vm->_gameVars->getSubVar(nameHash, subNameHash); +} + +void Entity::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { + _vm->_gameVars->setSubVar(nameHash, subNameHash, value); +} + +void Entity::incGlobalVar(uint32 nameHash, int incrValue) { + setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue); +} + +void Entity::incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) { + setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 22eb780024..0f96eba3b4 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -44,24 +44,9 @@ public: MessageParam(uint32 value) : _type(mptInteger), _integer(value) {} MessageParam(NPoint value) : _type(mptPoint), _point(value) {} MessageParam(Entity *entity) : _type(mptEntity), _entity(entity) {} - uint32 asInteger() const { - assert(_type == mptInteger); - return _integer; - } - NPoint asPoint() const { - assert(_type == mptInteger || _type == mptPoint); - if (_type == mptInteger) { - NPoint pt; - pt.x = _integer & 0xFFFF; - pt.y = (_integer >> 16) & 0xFFFF; - return pt; - } - return _point; - } - Entity *asEntity() const { - assert(_type == mptEntity); - return _entity; - } + uint32 asInteger() const; + NPoint asPoint() const; + Entity *asEntity() const; protected: union { uint32 _integer; @@ -75,66 +60,41 @@ protected: // TODO: Disable heavy debug stuff in release mode -#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler -#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler +#define SetUpdateHandler(handler) \ + _updateHandlerCb = static_cast (handler); \ + debug(2, "SetUpdateHandler(" #handler ")"); \ + _updateHandlerCbName = #handler + +#define SetMessageHandler(handler) \ + _messageHandlerCb = static_cast (handler); \ + debug(2, "SetMessageHandler(" #handler ")"); \ + _messageHandlerCbName = #handler class Entity { public: Common::String _name; // Entity name for debugging purposes Common::String _updateHandlerCbName; Common::String _messageHandlerCbName; - Entity(NeverhoodEngine *vm, int priority) - : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") { - } - virtual ~Entity() { - } - virtual void draw() { - } - void handleUpdate() { - //debug("Entity(%s).handleUpdate", _name.c_str()); - debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str()); - if (_updateHandlerCb) - (this->*_updateHandlerCb)(); - } - bool hasMessageHandler() const { return _messageHandlerCb != NULL; } - uint32 receiveMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); - return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; - } + Entity(NeverhoodEngine *vm, int priority); + virtual ~Entity(); + virtual void draw(); + void handleUpdate(); + uint32 receiveMessage(int messageNum, const MessageParam ¶m, Entity *sender); // NOTE: These were overloaded before for the various message parameter types // it caused some problems so each type gets its own sendMessage variant now - uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam ¶m) { - return receiver ? receiver->receiveMessage(messageNum, param, this) : 0; - } - uint32 sendMessage(Entity *receiver, int messageNum, uint32 param) { - return sendMessage(receiver, messageNum, MessageParam(param)); - } - uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint ¶m) { - return sendMessage(receiver, messageNum, MessageParam(param)); - } - uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param) { - return sendMessage(receiver, messageNum, MessageParam((Entity*)param)); - } - int getPriority() const { return _priority; } + uint32 sendMessage(Entity *receiver, int messageNum, const MessageParam ¶m); + uint32 sendMessage(Entity *receiver, int messageNum, uint32 param); + uint32 sendPointMessage(Entity *receiver, int messageNum, const NPoint ¶m); + uint32 sendEntityMessage(Entity *receiver, int messageNum, Entity *param); // Shortcuts for game variable access - uint32 getGlobalVar(uint32 nameHash) { - return _vm->_gameVars->getGlobalVar(nameHash); - } - void setGlobalVar(uint32 nameHash, uint32 value) { - _vm->_gameVars->setGlobalVar(nameHash, value); - } - uint32 getSubVar(uint32 nameHash, uint32 subNameHash) { - return _vm->_gameVars->getSubVar(nameHash, subNameHash); - } - void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { - _vm->_gameVars->setSubVar(nameHash, subNameHash, value); - } - void incGlobalVar(uint32 nameHash, int incrValue) { - setGlobalVar(nameHash, getGlobalVar(nameHash) + incrValue); - } - void incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) { - setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue); - } + uint32 getGlobalVar(uint32 nameHash); + void setGlobalVar(uint32 nameHash, uint32 value); + uint32 getSubVar(uint32 nameHash, uint32 subNameHash); + void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value); + void incGlobalVar(uint32 nameHash, int incrValue); + void incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue); + int getPriority() const { return _priority; } + bool hasMessageHandler() const { return _messageHandlerCb != NULL; } protected: void (Entity::*_updateHandlerCb)(); uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index f9f349b04b..2ee28d2440 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -6,6 +6,7 @@ MODULE_OBJS = \ collisionman.o \ detection.o \ diskplayerscene.o \ + entity.o \ gamemodule.o \ gamevars.o \ graphics.o \ -- cgit v1.2.3 From 0f04a013380c07f76ca68a14917cd6bce607184e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 17:19:39 +0000 Subject: NEVERHOOD: Change sound playing Sounds can now be loaded/played by an entity without declaring/initializing a SoundResource which is a little nicer. I implemented this so far for Module1000 only, rest will follow. --- engines/neverhood/entity.cpp | 36 +++++++++++++++++- engines/neverhood/entity.h | 9 +++++ engines/neverhood/module1000.cpp | 79 +++++++++++++++++++--------------------- engines/neverhood/module1000.h | 14 ------- 4 files changed, 82 insertions(+), 56 deletions(-) diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index e837225998..f78d4cf23d 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/entity.h" +#include "neverhood/sound.h" namespace Neverhood { @@ -51,10 +52,12 @@ Entity *MessageParam::asEntity() const { #define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler Entity::Entity(NeverhoodEngine *vm, int priority) - : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _name("Entity") { + : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL), + _name("Entity") { } Entity::~Entity() { + deleteSoundResources(); } void Entity::draw() { @@ -112,4 +115,35 @@ void Entity::incSubVar(uint32 nameHash, uint32 subNameHash, int incrValue) { setSubVar(nameHash, subNameHash, getSubVar(nameHash, subNameHash) + incrValue); } +SoundResource *Entity::getSoundResource(uint index) { + assert(index < kMaxSoundResources); + if (!_soundResources) { + _soundResources = new SoundResource*[kMaxSoundResources]; + for (uint i = 0; i < kMaxSoundResources; ++i) + _soundResources[i] = NULL; + } + if (!_soundResources[index]) + _soundResources[index] = new SoundResource(_vm); + return _soundResources[index]; +} + +void Entity::loadSound(uint index, uint32 fileHash) { + getSoundResource(index)->load(fileHash); +} + +void Entity::playSound(uint index, uint32 fileHash) { + if (fileHash) + getSoundResource(index)->play(fileHash); + else + getSoundResource(index)->play(); +} + +void Entity::deleteSoundResources() { + if (_soundResources) { + for (uint i = 0; i < kMaxSoundResources; ++i) + delete _soundResources[i]; + delete[] _soundResources; + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 0f96eba3b4..f22243705a 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -32,6 +32,7 @@ namespace Neverhood { class Entity; +class SoundResource; enum MessageParamType { mptInteger, @@ -70,6 +71,8 @@ protected: debug(2, "SetMessageHandler(" #handler ")"); \ _messageHandlerCbName = #handler +const uint kMaxSoundResources = 16; + class Entity { public: Common::String _name; // Entity name for debugging purposes @@ -100,6 +103,12 @@ protected: uint32 (Entity::*_messageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); NeverhoodEngine *_vm; int _priority; + SoundResource **_soundResources; + SoundResource *getSoundResource(uint index); + // TODO Add other sound stuff + void loadSound(uint index, uint32 fileHash); + void playSound(uint index, uint32 fileHash = 0); + void deleteSoundResources(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 2db598bb3e..f4932c03e7 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -115,13 +115,13 @@ void Module1000::updateScene() { // Scene1001 AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm) { + : AnimatedSprite(vm, 1100) { createSurface(800, 137, 242); _x = 726; _y = 440; stShowIdleDoor(); - _soundResource2.load(0xED403E03); + loadSound(1, 0xED403E03); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1001Door::handleMessage); } @@ -143,12 +143,12 @@ void AsScene1001Door::hammerHitsDoor() { switch (getGlobalVar(0x52371C95)) { case 0: case 1: - _soundResource1.play(0x65482F03); + playSound(0, 0x65482F03); startAnimation(0x624C0498, 1, 3); NextState(&AsScene1001Door::stShowIdleDoor); break; case 2: - _soundResource2.play(); + playSound(1); startAnimation(0x624C0498, 6, 6); NextState(&AsScene1001Door::stBustedDoorMove); break; @@ -188,13 +188,13 @@ void AsScene1001Door::stBustedDoorMove() { } void AsScene1001Door::stBustedDoorGone() { - _soundResource1.play(); + playSound(0); stopAnimation(); setVisible(false); } AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) - : AnimatedSprite(vm, 1100), _soundResource(vm), _asDoor(asDoor) { + : AnimatedSprite(vm, 1100), _asDoor(asDoor) { _x = 547; _y = 206; @@ -212,12 +212,12 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ if (param.asInteger() == 0x00352100) { sendMessage(_asDoor, 0x2000, 0); } else if (param.asInteger() == 0x0A1A0109) { - _soundResource.play(0x66410886); + playSound(0, 0x66410886); } break; case 0x2000: startAnimation(0x022C90D4, 1, -1); - _soundResource.play(0xE741020A); + playSound(0, 0xE741020A); _newStickFrameIndex = -2; break; } @@ -225,7 +225,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ } AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _soundResource(vm) { + : AnimatedSprite(vm, 1200) { _x = 320; _y = 240; @@ -241,7 +241,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0E0A1410) { - _soundResource.play(0x60803F10); + playSound(0, 0x60803F10); } break; case 0x2001: @@ -257,7 +257,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ } AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { createSurface(1010, 71, 73); setDoDeltaX(deltaXType); @@ -276,7 +276,7 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m if (param.asInteger() == 0x00C0C444) { sendMessage(_parentScene, 0x480F, 0); } else if (param.asInteger() == 0xC41A02C0) { - _soundResource.play(0x40581882); + playSound(0, 0x40581882); } break; case 0x1011: @@ -301,7 +301,7 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m } SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash) - : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _soundResource(vm), _countdown(0) { + : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _countdown(0) { _priority = 1100; _soundFileHash = soundFileHash ? soundFileHash : 0x44141000; @@ -323,7 +323,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p sendMessage(_parentScene, 0x480B, 0); setVisible(true); _countdown = 8; - _soundResource.play(_soundFileHash); + playSound(0, _soundFileHash); break; } return messageResult; @@ -497,7 +497,7 @@ uint32 Class599::handleMessage(int messageNum, const MessageParam ¶m, Entity } AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _flag1(flag1) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _flag1(flag1) { SetUpdateHandler(&AsScene1002Ring::update); @@ -628,7 +628,7 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam ¶m switch (messageNum) { case 0x100D: if (param.asInteger() == 0x05410F72) { - _soundResource.play(0x21EE40A9); + playSound(0, 0x21EE40A9); } break; case 0x3002: @@ -742,8 +742,7 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess } AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect) - : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect), - _soundResource(vm) { + : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1002DoorSpy::handleMessage); @@ -751,7 +750,7 @@ AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Sce createSurface(800, 136, 147); setClipRect(clipRect); suDoorSpy(); - _soundResource.load(0xC0C40298); + loadSound(0, 0xC0C40298); startAnimation(0x586C1D48, 0, 0); } @@ -762,7 +761,7 @@ uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam &par if (param.asInteger() == 0xA61CA1C2) { sendMessage(_asBoxingGloveHitEffect, 0x2004, 0); } else if (param.asInteger() == 0x14CE0620) { - _soundResource.play(); + playSound(0); } break; case 0x2003: @@ -803,7 +802,7 @@ void AsScene1002DoorSpy::stDoorSpyBoxingGlove() { } Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) - : StaticSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm), _status(0) { + : StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) { _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; @@ -895,15 +894,14 @@ uint32 Class426::handleMessage(int messageNum, const MessageParam ¶m, Entity _status = 1; _countdown = 4; setVisible(true); - _soundResource.play(_soundFileHash); + playSound(0, _soundFileHash); break; } return messageResult; } AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _klayman(klayman), - _flag(flag), _countdown(0) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _flag(flag), _countdown(0) { createSurface(995, 175, 195); @@ -956,9 +954,9 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam switch (messageNum) { case 0x100D: if (param.asInteger() == 0x000890C4) { - _soundResource.play(0xC21190D8); + playSound(0, 0xC21190D8); } else if (param.asInteger() == 0x522200A0) { - _soundResource.play(0x931080C8); + playSound(0, 0x931080C8); } break; case 0x1011: @@ -1036,7 +1034,7 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara switch (messageNum) { case 0x100D: if (param.asInteger() == 0x000890C4) { - _soundResource.play(0xC21190D8); + playSound(0, 0xC21190D8); } else if (param.asInteger() == 0x41881801) { if (_flag) { if (_x > 330) { @@ -1052,7 +1050,7 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara sendMessage(_klayman, 0x4811, 0); } } else if (param.asInteger() == 0x522200A0) { - _soundResource.play(0x931080C8); + playSound(0, 0x931080C8); } break; case 0x3002: @@ -1309,8 +1307,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa } Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _flag1B4(false), _flag1BE(false) { + : Scene(vm, parentModule, true), _flag1B4(false), _flag1BE(false) { NRect tempClipRect; Sprite *tempSprite; @@ -1404,8 +1401,8 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B43A0); - _soundResource2.load(0x60755842); - _soundResource3.load(0x616D5821); + loadSound(1, 0x60755842); + loadSound(2, 0x616D5821); } @@ -1517,26 +1514,26 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit _flag1BE = true; if (sender == _asRing1) { setGlobalVar(0x4DE80AC0, 0); - _soundResource1.play(0x665198C0); + playSound(0, 0x665198C0); } else if (sender == _asRing2) { setGlobalVar(0x4DE80AC0, 0); - _soundResource1.play(0xE2D389C0); + playSound(0, 0xE2D389C0); } else if (sender == _asRing3) { setGlobalVar(0x4DE80AC0, 0); - _soundResource2.play(); + playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); } else if (sender == _asRing4) { setGlobalVar(0x4DE80AC0, 0); - _soundResource1.play(0xE0558848); + playSound(0, 0xE0558848); } else if (sender == _asRing5) { setGlobalVar(0x4DE80AC0, 1); - _soundResource1.play(0x44014282); + playSound(0, 0x44014282); } break; case 0x4807: if (sender == _asRing3) { - _soundResource3.play(); + playSound(2); sendMessage(_asDoor, 0x4809, 0); sendMessage(_asOutsideDoorBackground, 0x4809, 0); } else if (sender == _asVenusFlyTrap) { @@ -1550,7 +1547,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480F: setGlobalVar(0x4DE80AC0, 0); - _soundResource2.play(); + playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); break; @@ -1586,7 +1583,7 @@ uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity // Scene1004 AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100), _soundResource(vm) { + : AnimatedSprite(vm, 1100) { _x = 330; _y = 327; @@ -1601,7 +1598,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa switch (messageNum) { case 0x100D: if (param.asInteger() == 0x225A8587) { - _soundResource.play(0x109AFC4C); + playSound(0, 0x109AFC4C); } break; case 0x2002: diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index b8fa6365a6..60eb2fb7d8 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -47,8 +47,6 @@ class AsScene1001Door : public AnimatedSprite { public: AsScene1001Door(NeverhoodEngine *vm); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void hammerHitsDoor(); void stShowIdleDoor(); @@ -61,7 +59,6 @@ public: AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor); protected: Sprite *_asDoor; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -69,7 +66,6 @@ class AsScene1001Window : public AnimatedSprite { public: AsScene1001Window(NeverhoodEngine *vm); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -78,7 +74,6 @@ public: AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -87,7 +82,6 @@ public: SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 _soundFileHash; int16 _countdown; void update(); @@ -140,7 +134,6 @@ public: protected: Scene *_parentScene; bool _flag1; - SoundResource _soundResource; void update(); uint32 hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender); @@ -173,7 +166,6 @@ protected: Scene *_parentScene; Sprite *_asDoor; Sprite *_asBoxingGloveHitEffect; - SoundResource _soundResource; NRect _clipRect; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender); @@ -191,7 +183,6 @@ protected: int _countdown; uint32 _fileHashes[2]; int _status; - SoundResource _soundResource; uint32 _soundFileHash; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -204,7 +195,6 @@ protected: Scene *_parentScene; Sprite *_klayman; int _countdown; - SoundResource _soundResource; bool _flag; void update(); void upIdle(); @@ -279,9 +269,6 @@ protected: Sprite *_asKlaymanPeekHand; Sprite *_asOutsideDoorBackground; Sprite *_class426; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; bool _flag1B4; bool _flag1BE; bool _flag; @@ -295,7 +282,6 @@ class AsScene1004TrashCan : public AnimatedSprite { public: AsScene1004TrashCan(NeverhoodEngine *vm); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 7adc1d312e5d09c0566345d5264db7f4b2322f98 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 17:26:42 +0000 Subject: NEVERHOOD: Change sound stuff in Module1100 - Implement Entity::isSoundPlaying --- engines/neverhood/entity.cpp | 4 ++++ engines/neverhood/entity.h | 1 + engines/neverhood/module1100.cpp | 42 ++++++++++++++++++---------------------- engines/neverhood/module1100.h | 7 ------- 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index f78d4cf23d..d7d78969d2 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -138,6 +138,10 @@ void Entity::playSound(uint index, uint32 fileHash) { getSoundResource(index)->play(); } +bool Entity::isSoundPlaying(uint index) { + return getSoundResource(index)->isPlaying(); +} + void Entity::deleteSoundResources() { if (_soundResources) { for (uint i = 0; i < kMaxSoundResources; ++i) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index f22243705a..eafc467b55 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -108,6 +108,7 @@ protected: // TODO Add other sound stuff void loadSound(uint index, uint32 fileHash); void playSound(uint index, uint32 fileHash = 0); + bool isSoundPlaying(uint index); void deleteSoundResources(); }; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index e5cca2667d..257ee27d0d 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -272,8 +272,7 @@ static const uint32 kSsScene1105SymbolDieFileHashes[] = { }; SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect) - : StaticSprite(vm, fileHash, 200), _soundResource(vm), _parentScene(parentScene), - _countdown(0) { + : StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) { _rect = rect; SetMessageHandler(&SsScene1105Button::handleMessage); @@ -300,7 +299,7 @@ uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam ¶ case 0x480B: _countdown = 8; setVisible(true); - _soundResource.play(0x44141000); + playSound(0, 0x44141000); break; } return messageResult; @@ -356,8 +355,7 @@ void SsScene1105SymbolDie::hide() { } AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), - _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { // TODO createSurface3(100, dword_4AF4C0); createSurface(100, 640, 480); //TODO: Remeove once the line above is done @@ -370,8 +368,8 @@ AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentSce setVisible(false); _needRefresh = true; updatePosition(); - _soundResource1.load(0xCE840261); - _soundResource2.load(0xCCA41A62); + loadSound(0, 0xCE840261); + loadSound(1, 0xCCA41A62); } uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -380,10 +378,10 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p case 0x2002: if (getGlobalVar(0x610210B7)) { startAnimation(0x6B0C0432, 0, -1); - _soundResource1.play(); + playSound(0); } else { startAnimation(0x65084002, 0, -1); - _soundResource2.play(); + playSound(1); } break; case 0x3002: @@ -407,8 +405,7 @@ void AsScene1105TeddyBear::hide() { } SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 900), _soundResource(vm), _parentScene(parentScene), - _countdown(0), _flag1(false) { + : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) { _spriteResource.load2(0x8228A46C); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -422,7 +419,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS _needRefresh = true; processDelta(); setVisible(false); - _soundResource.load(0x44045140); + loadSound(0, 0x44045140); SetUpdateHandler(&SsScene1105OpenButton::update); SetMessageHandler(&SsScene1105OpenButton::handleMessage); } @@ -441,7 +438,7 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam & switch (messageNum) { case 0x1011: if (_countdown == 0 && !_flag1) { - _soundResource.play(); + playSound(0); setVisible(true); _flag1 = true; _countdown = 4; @@ -453,8 +450,7 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam & } Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _countdown(0), _flag1(false), _flag2(false), _flag3(false), + : Scene(vm, parentModule, true), _countdown(0), _flag1(false), _flag2(false), _flag3(false), _flag4(false), _flag5(false), _backgroundIndex(0) { Sprite *ssOpenButton; @@ -473,9 +469,9 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(ssOpenButton); insertMouse435(0x10006208, 20, 620); - _soundResource1.load(0x48442057); - _soundResource2.load(0xC025014F); - _soundResource3.load(0x68E25540); + loadSound(0, 0x48442057); + loadSound(1, 0xC025014F); + loadSound(2, 0x68E25540); } @@ -514,7 +510,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) && getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) { setGlobalVar(0x610210B7, 1); - _soundResource3.play(); + playSound(2); _flag3 = true; } else { sendMessage(_asTeddyBear, 0x2002, 0); @@ -617,7 +613,7 @@ void Scene1105::upOpenPanel() { _palette->addPalette(backgroundFileHash, 0, 256, 0); } if (_backgroundIndex == 10) { - _soundResource1.play(); + playSound(0); } if (_backgroundIndex == 0) { SetUpdateHandler(&Scene1105::update); @@ -642,7 +638,7 @@ void Scene1105::upClosePanel() { if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME if (_backgroundIndex == 4) { - _soundResource2.play(); + playSound(1); _asTeddyBear->hide(); } changeBackground(backgroundFileHash); @@ -667,10 +663,10 @@ void Scene1105::update() { if (_countdown != 0 && (--_countdown == 0)) { createObjects(); } - if (_flag4 && !_soundResource2.isPlaying()) { + if (_flag4 && !isSoundPlaying(1)) { leaveScene(_flag5); } - if (_flag3 && !_soundResource3.isPlaying()) { + if (_flag3 && !isSoundPlaying(2)) { sendMessage(_asTeddyBear, 0x2002, 0); _flag3 = false; } diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h index c46c1dfbca..98d1ae6311 100644 --- a/engines/neverhood/module1100.h +++ b/engines/neverhood/module1100.h @@ -46,7 +46,6 @@ public: SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect); protected: Scene *_parentScene; - SoundResource _soundResource; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -75,8 +74,6 @@ public: void hide(); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -85,7 +82,6 @@ public: SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource; int _countdown; bool _flag1; void update(); @@ -96,9 +92,6 @@ class Scene1105 : public Scene { public: Scene1105(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; int _countdown; int _backgroundIndex; bool _flag1; -- cgit v1.2.3 From fc359abd08c2553201f6965c23e9ee972a2514fc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 17:32:01 +0000 Subject: NEVERHOOD: Change sound stuff in Module1200 --- engines/neverhood/module1200.cpp | 50 +++++++++++++++++++--------------------- engines/neverhood/module1200.h | 12 ---------- 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 33b791aa9b..d6ca51b9c3 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -220,7 +220,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, } Class466::Class466(NeverhoodEngine *vm, bool flag) - : AnimatedSprite(vm, 1200), _soundResource(vm) { + : AnimatedSprite(vm, 1200) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class466::handleMessage); @@ -239,7 +239,7 @@ uint32 Class466::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02060018) { - _soundResource.play(0x47900E06); + playSound(0, 0x47900E06); } break; case 0x2006: @@ -265,7 +265,7 @@ void Class466::sub40D380() { } AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag) - : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) { + : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { createSurface1(0xD088AC30, 100); _x = 320; @@ -307,14 +307,14 @@ void AsScene1201RightDoor::sub40D7E0() { startAnimation(0xD088AC30, 0, -1); _newStickFrameIndex = -2; setVisible(true); - _soundResource.play(calcHash("fxDoorOpen20")); + playSound(0, calcHash("fxDoorOpen20")); } void AsScene1201RightDoor::sub40D830() { startAnimation(0xD088AC30, -1, -1); _playBackwards = true; setVisible(true); - _soundResource.play(calcHash("fxDoorClose20")); + playSound(0, calcHash("fxDoorClose20")); NextState(&AsScene1201RightDoor::sub40D880); } @@ -352,7 +352,7 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity } AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _class466(class466), + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _class466(class466), _flag(false) { flag = false; @@ -381,7 +381,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶ if (param.asInteger() == 0x092870C0) { sendMessage(_class466, 0x2006, 0); } else if (param.asInteger() == 0x11CA0144) { - _soundResource.play(0x51800A04); + playSound(0, 0x51800A04); } break; case 0x1011: @@ -466,7 +466,7 @@ void Class465::spriteUpdate40D150() { } AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { createSurface(1100, 57, 60); SetUpdateHandler(&AsScene1201Match::update); @@ -485,7 +485,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) _y = 112; _status = 2; sub40C470(); - _soundResource.load(0xD00230CD); + loadSound(0, 0xD00230CD); break; case 2: setDoDeltaX(1); @@ -511,7 +511,7 @@ uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam switch (messageNum) { case 0x100D: if (param.asInteger() == 0x86668011) { - _soundResource.play(); + playSound(0); } break; } @@ -589,8 +589,7 @@ void AsScene1201Match::sub40C4F0() { } AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman) - : AnimatedSprite(vm, 900), _soundResource(vm), _parentScene(parentScene), _klayman(klayman), - _flag(false) { + : AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _flag(false) { createSurface(1100, 203, 199); SetUpdateHandler(&AsScene1201Creature::update); @@ -619,7 +618,7 @@ uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessagePar switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02060018) { - _soundResource.play(0xCD298116); + playSound(0, 0xCD298116); } break; case 0x2004: @@ -654,7 +653,7 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02060018) { - _soundResource.play(0xCD298116); + playSound(0, 0xCD298116); sendMessage(_parentScene, 0x4814, 0); sendMessage(_klayman, 0x4814, 0); } @@ -709,7 +708,7 @@ void AsScene1201Creature::sub40C9E0() { } AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) - : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman) { + : AnimatedSprite(vm, 1100), _klayman(klayman) { _x = 320; _y = 240; @@ -717,7 +716,7 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) if (_klayman->getX() < 100) { startAnimation(0x508A111B, 0, -1); _newStickFrameIndex = -2; - _soundResource.play(calcHash("fxDoorOpen03")); + playSound(0, calcHash("fxDoorOpen03")); } else { startAnimation(0x508A111B, -1, -1); _newStickFrameIndex = -2; @@ -1109,8 +1108,7 @@ void AsScene1202TntItem::sub454160() { } Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _paletteResource(vm), _soundResource1(vm), - _soundResource2(vm), _soundResource3(vm), _soundResource4(vm), + : Scene(vm, parentModule, true), _paletteResource(vm), _flag(true), _soundFlag(false), _counter(0), _index(-1) { SetMessageHandler(&Scene1202::handleMessage453C10); @@ -1139,10 +1137,10 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1202::handleMessage453D90); } - _soundResource1.play(0x40106542); - _soundResource2.load(0x40005446); - _soundResource2.load(0x40005446); - _soundResource2.load(0x68E25540); + playSound(0, 0x40106542); + loadSound(1, 0x40005446); + loadSound(2, 0x40005446); + loadSound(3, 0x68E25540); } @@ -1155,13 +1153,13 @@ Scene1202::~Scene1202() { void Scene1202::update() { Scene::update(); if (_soundFlag) { - if (!_soundResource4.isPlaying()) + if (!isSoundPlaying(3)) leaveScene(0); } else if (_counter == 0 && isSolved()) { SetMessageHandler(&Scene1202::handleMessage453D90); setGlobalVar(0x000CF819, 1); doPaletteEffect(); - _soundResource4.play(); + playSound(3); _soundFlag = true; } else if (_index >= 0 && _counter == 0) { int index2 = kScene1202Table[_index]; @@ -1173,9 +1171,9 @@ void Scene1202::update() { _counter = 2; _index = -1; if (_flag) { - _soundResource2.play(); + playSound(1); } else { - _soundResource3.play(); + playSound(2); } _flag = !_flag; } diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index dc8e903472..1733fb43e2 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -55,7 +55,6 @@ class Class466 : public AnimatedSprite { public: Class466(NeverhoodEngine *vm, bool flag); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub40D340(); void sub40D360(); @@ -66,7 +65,6 @@ class AsScene1201RightDoor : public AnimatedSprite { public: AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag); protected: - SoundResource _soundResource; Sprite *_klayman; int _countdown; void update(); @@ -91,7 +89,6 @@ protected: Scene *_parentScene; Sprite *_class466; Sprite *_sprite; - SoundResource _soundResource; bool _flag; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender); @@ -116,7 +113,6 @@ public: AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource; int _countdown; int _status; void update(); @@ -136,7 +132,6 @@ public: protected: Scene *_parentScene; Sprite *_klayman; - SoundResource _soundResource; int _countdown1; int _countdown2; int _countdown3; @@ -158,7 +153,6 @@ public: AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman); protected: Sprite *_klayman; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub40D590(); }; @@ -176,8 +170,6 @@ public: Scene1201(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Scene1201(); protected: - // TODO ResourceTable _resourceTable1; - // TODO ResourceTable _resourceTable2; Sprite *_asMatch; AsScene1201TntMan *_asTntMan; Sprite *_asCreature; @@ -211,10 +203,6 @@ public: Scene1202(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Scene1202(); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; PaletteResource _paletteResource; Sprite *_asTntItems[18]; int _counter; -- cgit v1.2.3 From 5ab4eb6555bea4d2716720eff03b832de16ab87a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 28 Sep 2012 19:11:05 +0000 Subject: NEVERHOOD: Change sound stuff in Module1300 - Also fix a very stupid bug in AsScene1307Key which messed up the key moving animation --- engines/neverhood/gamemodule.cpp | 8 +-- engines/neverhood/module1300.cpp | 110 +++++++++++++++++++-------------------- engines/neverhood/module1300.h | 17 ------ 3 files changed, 57 insertions(+), 78 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 56812ba9c7..09299de118 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -298,9 +298,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule(1500, 0); // Logos and intro video //Real -#if 0 - _vm->gameState().sceneNum = 0; - createModule(1200, -1); +#if 1 + _vm->gameState().sceneNum = 6; + createModule(1300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -314,7 +314,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 45c68421eb..1c980b0698 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -298,7 +298,7 @@ void Module1300::updateScene() { } AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { _x = 320; _y = 240; @@ -312,8 +312,8 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) startAnimation(0x88148150, -1, -1); _newStickFrameIndex = -2; } - _soundResource1.load(0x68895082); - _soundResource2.load(0x689BD0C1); + loadSound(0, 0x68895082); + loadSound(1, 0x689BD0C1); } uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -335,14 +335,14 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶ void AsScene1302Bridge::stLowerBridge() { startAnimation(0x88148150, 0, -1); NextState(&AsScene1302Bridge::cbLowerBridgeEvent); - _soundResource2.play(); + playSound(1); } void AsScene1302Bridge::stRaiseBridge() { startAnimation(0x88148150, 7, -1); _playBackwards = true; _newStickFrameIndex = 0; - _soundResource1.play(); + playSound(0); } void AsScene1302Bridge::cbLowerBridgeEvent() { @@ -352,7 +352,7 @@ void AsScene1302Bridge::cbLowerBridgeEvent() { } SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) - : StaticSprite(vm, 0x11122122, 200), _soundResource1(vm), _soundResource2(vm) { + : StaticSprite(vm, 0x11122122, 200) { SetUpdateHandler(&SsScene1302Fence::update); SetMessageHandler(&SsScene1302Fence::handleMessage); @@ -360,8 +360,8 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) _firstY = _y; if (getGlobalVar(0x80101B1E)) _y += 152; - _soundResource1.load(0x7A00400C); - _soundResource2.load(0x78184098); + loadSound(0, 0x7A00400C); + loadSound(1, 0x78184098); } void SsScene1302Fence::update() { @@ -373,12 +373,12 @@ uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4808: - _soundResource1.play(); + playSound(0); SetSpriteUpdate(&SsScene1302Fence::suMoveDown); SetMessageHandler(NULL); break; case 0x4809: - _soundResource2.play(); + playSound(1); SetSpriteUpdate(&SsScene1302Fence::suMoveUp); SetMessageHandler(NULL); break; @@ -424,7 +424,7 @@ uint32 Class595::handleMessage(int messageNum, const MessageParam ¶m, Entity } Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm) { + : Scene(vm, parentModule, true) { SetMessageHandler(&Scene1302::handleMessage); setHitRects(0x004B0858); @@ -541,17 +541,17 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x4806: sendMessage(_parentModule, 0x1024, 2); if (sender == _asRing1) { - _soundResource.play(0x665198C0); + playSound(0, 0x665198C0); } else if (sender == _asRing2) { sendMessage(_asBridge, 0x4808, 0); setGlobalVar(0x13206309, 1); } else if (sender == _asRing3) { - _soundResource.play(0xE2D389C0); + playSound(0, 0xE2D389C0); } else if (sender == _asRing4) { sendMessage(_ssFence, 0x4808, 0); setGlobalVar(0x80101B1E, 1); } else if (sender == _asRing5) { - _soundResource.play(0x40428A09); + playSound(0, 0x40428A09); } break; case 0x4807: @@ -572,11 +572,11 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480F: if (sender == _asRing2) { - _soundResource.play(0x60755842); + playSound(0, 0x60755842); sendMessage(_asBridge, 0x4808, 0); setGlobalVar(0x13206309, 1); } else if (sender == _asRing4) { - _soundResource.play(0x60755842); + playSound(0, 0x60755842); sendMessage(_ssFence, 0x4808, 0); setGlobalVar(0x80101B1E, 1); } @@ -592,7 +592,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { // TODO createSurface3(200, dword_4AF9F8); createSurface(200, 640, 480); //TODO: Remeove once the line above is done @@ -623,11 +623,11 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p switch (messageNum) { case 0x100D: if (param.asInteger() == 0x020B0003) { - _soundResource.play(0x742B0055); + playSound(0, 0x742B0055); } break; case 0x3002: - _soundResource.play(0x470007EE); + playSound(0, 0x470007EE); stopAnimation(); SetMessageHandler(NULL); setVisible(false); @@ -802,8 +802,7 @@ uint32 Scene1305::handleMessage(int messageNum, const MessageParam ¶m, Entit } AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true), + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true), _countdown(0) { _x = 320; @@ -812,9 +811,9 @@ AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene startAnimation(0x043B0270, 0, -1); _newStickFrameIndex = 0; SetMessageHandler(&AsScene1306Elevator::handleMessage); - _soundResource1.load(0x1C100E83); - _soundResource2.load(0x1C08CEC5); - _soundResource3.load(0x5D011E87); + loadSound(0, 0x1C100E83); + loadSound(1, 0x1C08CEC5); + loadSound(2, 0x5D011E87); } void AsScene1306Elevator::update() { @@ -823,7 +822,7 @@ void AsScene1306Elevator::update() { } AnimatedSprite::update(); if (_currFrameIndex == 7) { - _soundResource3.play(); + playSound(1); _asElevatorDoor->setVisible(false); } } @@ -860,7 +859,7 @@ void AsScene1306Elevator::stGoingUp() { SetUpdateHandler(&AsScene1306Elevator::update); startAnimation(0x043B0270, 0, -1); NextState(&AsScene1306Elevator::cbGoingUpEvent); - _soundResource1.play(); + playSound(0); } void AsScene1306Elevator::cbGoingUpEvent() { @@ -879,7 +878,7 @@ void AsScene1306Elevator::stGoingDown() { startAnimation(0x043B0270, -1, -1); _playBackwards = true; NextState(&AsScene1306Elevator::cbGoingDownEvent); - _soundResource2.play(); + playSound(1); } void AsScene1306Elevator::cbGoingDownEvent() { @@ -1124,8 +1123,7 @@ const int16 kAsScene1307KeyXDelta = 70; const int16 kAsScene1307KeyYDelta = -12; AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _soundResource4(vm), _parentScene(parentScene), _index(index), _clipRects(clipRects), + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _clipRects(clipRects), _isClickable(true) { NPoint pt; @@ -1146,10 +1144,10 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind startAnimation(fileHashes[0], 0, -1); - _soundResource1.load(0xDC4A1280); - _soundResource2.load(0xCC021233); - _soundResource3.load(0xC4C23844); - _soundResource3.load(0xC4523208); + loadSound(0, 0xDC4A1280); + loadSound(1, 0xCC021233); + loadSound(2, 0xC4C23844); + loadSound(3, 0xC4523208); } @@ -1171,11 +1169,11 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, stMoveKey(); break; case 0x2003: - _soundResource4.play(); + playSound(3); stUnlock(); break; case 0x2004: - _soundResource3.play(); + playSound(2); stInsert(); break; } @@ -1200,7 +1198,7 @@ void AsScene1307Key::suInsertKey() { processDelta(); _pointIndex++; if (_pointIndex == 7) - _soundResource1.play(); + playSound(0); } else { SetSpriteUpdate(NULL); sendMessage(_parentScene, 0x2002, 0); @@ -1209,9 +1207,9 @@ void AsScene1307Key::suInsertKey() { void AsScene1307Key::suMoveKey() { if (_pointIndex < kAsScene1307KeyFrameIndicesCount) { - _currFrameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; - _x = _prevX + (_deltaX * _currFrameIndex) / kAsScene1307KeyDivValue; - _y = _prevY + (_deltaY * _currFrameIndex) / kAsScene1307KeyDivValue; + _frameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; + _x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue; + _y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue; processDelta(); _pointIndex++; } else { @@ -1227,7 +1225,7 @@ void AsScene1307Key::stRemoveKey() { _pointIndex = 0; SetSpriteUpdate(&AsScene1307Key::suRemoveKey); startAnimation(fileHashes[0], 0, -1); - _soundResource2.play(); + playSound(1); } void AsScene1307Key::stInsertKey() { @@ -1251,7 +1249,7 @@ void AsScene1307Key::stMoveKey() { } else { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; _pointIndex = 0; - _currFrameIndex = 0; + _frameIndex = 0; _deltaX = newX - _x; _deltaY = newY - _y; SetSpriteUpdate(&AsScene1307Key::suMoveKey); @@ -1272,8 +1270,8 @@ void AsScene1307Key::stInsert() { } Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm), _countdown(0), - _asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { + : Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL), + _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { //DEBUG setSubVar(0x08D0AB11, 0, 1); @@ -1325,7 +1323,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) } } - _soundResource.load(0x68E25540); + loadSound(0, 0x68E25540); } @@ -1336,7 +1334,7 @@ void Scene1307::update() { } else if (_countdown == 20) { _palette->startFadeToWhite(40); } - if (_doLeaveScene && !_soundResource.isPlaying()) { + if (_doLeaveScene && !isSoundPlaying(0)) { leaveScene(1); setGlobalVar(0x80455A41, 1); } @@ -1392,7 +1390,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_asKeys[keyIndex]) sendMessage(_asKeys[keyIndex], 0x2003, 1); } - _soundResource.play(); + playSound(0); _isPuzzleSolved = true; _countdown = 47; } else { @@ -1438,8 +1436,7 @@ static const uint32 kScene1308FileHashes[] = { }; Class549::Class549(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _soundResource(vm), - _parentScene(parentScene) { + : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) { SetMessageHandler(&Class549::handleMessage); setVisible(false); @@ -1466,7 +1463,7 @@ void Class549::sub455470() { startAnimation(0xBA0AE050, 0, -1); setVisible(true); NextState(&Class549::hide); - _soundResource.play(calcHash("fxDoorOpen38")); + playSound(0, calcHash("fxDoorOpen38")); } void Class549::hide() { @@ -1480,7 +1477,7 @@ void Class549::sub4554F0() { _playBackwards = true; setVisible(true); NextState(&Class549::sub455550); - _soundResource.play(calcHash("fxDoorClose38")); + playSound(0, calcHash("fxDoorClose38")); } void Class549::sub455550() { @@ -1489,12 +1486,11 @@ void Class549::sub455550() { } Class592::Class592(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _soundResource(vm), - _parentScene(parentScene) { + : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) { SetMessageHandler(&Class592::handleMessage); NextState(&Class592::sub455710); - _soundResource.play(0x51456049); + playSound(0, 0x51456049); } uint32 Class592::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1571,7 +1567,7 @@ Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index) } Class513::Class513(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100), _soundResource(vm) { + : AnimatedSprite(vm, 1100) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Class513::handleMessage); @@ -1586,11 +1582,11 @@ uint32 Class513::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x66382026) { - _soundResource.play(0x0CD84468); + playSound(0, 0x0CD84468); } else if (param.asInteger() == 0x6E28061C) { - _soundResource.play(0x78C8402C); + playSound(0, 0x78C8402C); } else if (param.asInteger() == 0x462F0410) { - _soundResource.play(0x60984E28); + playSound(0, 0x60984E28); } break; } diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index e404127655..b6761ddb03 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -47,8 +47,6 @@ public: AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stLowerBridge(); void stRaiseBridge(); @@ -59,8 +57,6 @@ class SsScene1302Fence : public StaticSprite { public: SsScene1302Fence(NeverhoodEngine *vm); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; int16 _firstY; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -80,7 +76,6 @@ class Scene1302 : public Scene { public: Scene1302(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource; Sprite *_asVenusFlyTrap; Sprite *_asBridge; Sprite *_ssFence; @@ -101,7 +96,6 @@ public: AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender); void stPopBalloon(); @@ -147,9 +141,6 @@ public: protected: Scene *_parentScene; AnimatedSprite *_asElevatorDoor; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; bool _isUp; bool _isDown; int _countdown; @@ -182,10 +173,6 @@ public: AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; NPointArray *_pointList; uint _pointIndex; int _frameIndex; @@ -209,7 +196,6 @@ class Scene1307 : public Scene { public: Scene1307(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource; NPointArray *_keyHolePoints; NRect _keyHoleRects[16]; NRect _clipRects[4]; @@ -228,7 +214,6 @@ public: Class549(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub455470(); void hide(); @@ -241,7 +226,6 @@ public: Class592(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub455710(); void sub455740(); @@ -267,7 +251,6 @@ class Class513 : public AnimatedSprite { public: Class513(NeverhoodEngine *vm); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From b119efd5ed8e210fdaedcdd5e9cda58f59d63148 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 07:42:25 +0000 Subject: NEVERHOOD: Change sound stuff in Module1400 --- engines/neverhood/module1400.cpp | 80 +++++++++++++++++++--------------------- engines/neverhood/module1400.h | 13 ------- 2 files changed, 37 insertions(+), 56 deletions(-) diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 8d40c340ec..a8c8b3cc35 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -135,8 +135,7 @@ void Module1400::updateScene() { // Scene1401 Class525::Class525(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), - _countdown1(0), _countdown2(0) { + : AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) { // TODO createSurface3(900, dword_4B6768); createSurface(900, 640, 480); //TODO: Remeove once the line above is done @@ -174,7 +173,7 @@ uint32 Class525::handleMessage466320(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0A8A1490) { - _soundResource2.play(0x6AB6666F); + playSound(1, 0x6AB6666F); } break; case 0x2000: @@ -207,12 +206,12 @@ uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam ¶m, void Class525::sub466420() { startAnimation(0x4C240100, 0, -1); - _soundResource1.play(0x4A30063F); + playSound(0, 0x4A30063F); } void Class525::sub466460() { _vm->_soundMan->deleteSound(0x4A116437); - _soundResource1.play(0x4A120435); + playSound(0, 0x4A120435); startAnimation(0x4C210500, 0, -1); } @@ -223,7 +222,7 @@ void Class525::sub4664B0() { } Class526::Class526(NeverhoodEngine *vm, Sprite *class525) - : AnimatedSprite(vm, 1100), _soundResource(vm), _class525(class525) { + : AnimatedSprite(vm, 1100), _class525(class525) { // TODO createSurface3(100, dword_4B6778); createSurface(100, 640, 480); //TODO: Remeove once the line above is done @@ -239,11 +238,11 @@ uint32 Class526::handleMessage(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x66382026) { - _soundResource.play(0x0CD84468); + playSound(0, 0x0CD84468); } else if (param.asInteger() == 0x6E28061C) { - _soundResource.play(0x78C8402C); + playSound(0, 0x78C8402C); } else if (param.asInteger() == 0x462F0410) { - _soundResource.play(0x60984E28); + playSound(0, 0x60984E28); } break; case 0x4839: @@ -256,7 +255,7 @@ uint32 Class526::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class526::spriteUpdate466720() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { - _soundResource.play(0x0E32247F); + playSound(0, 0x0E32247F); stopAnimation(); SetSpriteUpdate(NULL); SetMessageHandler(NULL); @@ -270,7 +269,7 @@ void Class526::sub466770() { } Class527::Class527(NeverhoodEngine *vm, Sprite *class526) - : AnimatedSprite(vm, 1100), _soundResource(vm), _class526(class526) { + : AnimatedSprite(vm, 1100), _class526(class526) { // TODO createSurface3(200, dword_4B6768); createSurface(200, 640, 480); //TODO: Remeove once the line above is done @@ -294,7 +293,7 @@ uint32 Class527::handleMessage(int messageNum, const MessageParam ¶m, Entity void Class527::spriteUpdate466920() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { - _soundResource.play(0x18020439); + playSound(0, 0x18020439); stopAnimation(); SetSpriteUpdate(NULL); SetMessageHandler(NULL); @@ -308,7 +307,7 @@ void Class527::sub466970() { } Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) - : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _countdown(0) { + : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { _x = 320; _y = 240; @@ -360,14 +359,14 @@ void Class528::sub466BF0() { setVisible(true); startAnimation(0x04551900, 0, -1); _newStickFrameIndex = -2; - _soundResource.play(calcHash("fxDoorOpen24")); + playSound(0, calcHash("fxDoorOpen24")); } void Class528::sub466C50() { _flag = false; setVisible(true); startAnimation(0x04551900, -1, -1); - _soundResource.play(calcHash("fxDoorClose24")); + playSound(0, calcHash("fxDoorClose24")); _playBackwards = true; NextState(&Class528::sub466CB0); } @@ -386,8 +385,7 @@ static const Class489Item kClass489Items[] = { }; Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525), - _soundResource1(vm), _soundResource2(vm), _soundResource3(vm) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525) { _class489Item = &kClass489Items[getGlobalVar(0x04A105B3)]; // TODO createSurface3(990, dword_4B26D8); @@ -402,7 +400,7 @@ Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Spr if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) { sub434E90(); } - _soundResource3.load(0xC8C2507C); + loadSound(2, 0xC8C2507C); } Class489::~Class489() { @@ -565,7 +563,7 @@ void Class489::sub434C80() { _flag = false; } } else if (soundFlag) { - _soundResource2.play(0x5440E474); + playSound(1, 0x5440E474); _flag = true; } @@ -593,7 +591,7 @@ void Class489::sub434DF0() { startAnimation(0x14A10137, 0, -1); SetSpriteUpdate(&Class489::spriteUpdate434B60); SetMessageHandler(&Class489::handleMessage); - _soundResource2.play(0xEC008474); + playSound(1, 0xEC008474); } void Class489::sub434E60() { @@ -615,7 +613,7 @@ void Class489::sub434EC0() { SetSpriteUpdate(NULL); NextState(&Class489::sub434F40); setGlobalVar(0x12A10DB3, 1); - _soundResource1.play(0xCC4A8456); + playSound(0, 0xCC4A8456); _vm->_soundMan->addSound(0x05331081, 0xCE428854); _vm->_soundMan->playSoundLooping(0xCE428854); } @@ -633,7 +631,7 @@ void Class489::sub434F80() { SetMessageHandler(&Class489::handleMessage434B20); NextState(&Class489::sub434E90); setGlobalVar(0x12A10DB3, 0); - _soundResource1.play(0xCC4A8456); + playSound(0, 0xCC4A8456); _vm->_soundMan->deleteSound(0xCE428854); } @@ -651,7 +649,7 @@ void Class489::sub435040() { SetSpriteUpdate(&Class489::sub434D80); SetMessageHandler(&Sprite::handleMessage); startAnimation(0x708D4712, 0, -1); - _soundResource3.play(); + playSound(2); } Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) @@ -813,8 +811,7 @@ Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) } Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource1(vm), - _soundResource2(vm) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { // TODO createSurface3(900, dword_4B6768); createSurface(900, 640, 480); //TODO: Remeove once the line above is done @@ -826,14 +823,14 @@ Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which) _y = 270; if (which == 2) { startAnimation(0x20060259, 0, -1); - _soundResource1.play(0x419014AC); - _soundResource2.load(0x61901C29); + playSound(0, 0x419014AC); + loadSound(1, 0x61901C29); } else if (which == 1) { startAnimation(0x210A0213, 0, -1); - _soundResource1.play(0x41809C6C); + playSound(0, 0x41809C6C); } else { startAnimation(0x20060259, 0, -1); - _soundResource2.load(0x61901C29); + loadSound(1, 0x61901C29); _newStickFrameIndex = -2; } } @@ -842,7 +839,7 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2002: - _soundResource2.play(); + playSound(1); startAnimation(0x20060259, -1, -1); _playBackwards = true; NextState(&Class482::sub428530); @@ -1257,8 +1254,7 @@ void AsScene1407Mouse::stArriveAtHole() { } Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm), _puzzleSolvedCountdown(0), - _resetButtonCountdown(0) { + : Scene(vm, parentModule, true), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { _surfaceFlag = true; @@ -1298,7 +1294,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // The reset button was clicked sendMessage(_asMouse, 0x2001, 0); _ssResetButton->setVisible(true); - _soundResource.play(0x44045000); + playSound(0, 0x44045000); _resetButtonCountdown = 12; } else { // Handle the mouse @@ -1312,7 +1308,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: // The mouse got the cheese (nomnom) setGlobalVar(0x70A1189C, 1); - _soundResource.play(0x68E25540); + playSound(0, 0x68E25540); showMouse(false); _puzzleSolvedCountdown = 72; break; @@ -1587,10 +1583,9 @@ static const NPoint kAsScene1405TileItemPositions[] = { }; AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _soundResource(vm), - _index(index), _countdown(0), _flag(false) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _countdown(0), _flag(false) { - _soundResource.load(0x05308101); + loadSound(0, 0x05308101); // TODO _soundResource.setPan _x = kAsScene1405TileItemPositions[_index].x; _y = kAsScene1405TileItemPositions[_index].y; @@ -1632,7 +1627,7 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, void AsScene1405Tile::show() { if (!_flag) { _flag = true; - _soundResource.play(); + playSound(0); setVisible(true); } } @@ -1640,14 +1635,13 @@ void AsScene1405Tile::show() { void AsScene1405Tile::hide() { if (_flag) { _flag = false; - _soundResource.play(); + playSound(0); setVisible(false); } } Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm), _selectFirstTile(true), - _tilesLeft(48), _countdown(0) { + : Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { _vm->gameModule()->initScene1405Vars(); _surfaceFlag = true; @@ -1675,7 +1669,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) _tilesLeft--; } - _soundResource.load(0x68E25540); + loadSound(0, 0x68E25540); SetMessageHandler(&Scene1405::handleMessage); SetUpdateHandler(&Scene1405::update); @@ -1722,7 +1716,7 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit setSubVar(0xCCE0280F, _secondTileIndex, 1); _tilesLeft -= 2; if (_tilesLeft == 0) { - _soundResource.play(); + playSound(0); } } else { _countdown = 10; diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index d256b82134..aed7ba9994 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -48,8 +48,6 @@ public: protected: int _countdown1; int _countdown2; - SoundResource _soundResource1; - SoundResource _soundResource2; void update4662A0(); void update466300(); uint32 handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender); @@ -64,7 +62,6 @@ public: Class526(NeverhoodEngine *vm, Sprite *class525); protected: Sprite *_class525; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void spriteUpdate466720(); void sub466770(); @@ -75,7 +72,6 @@ public: Class527(NeverhoodEngine *vm, Sprite *class526); protected: Sprite *_class526; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void spriteUpdate466920(); void sub466970(); @@ -86,7 +82,6 @@ public: Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag); protected: Sprite *_klayman; - SoundResource _soundResource; int _countdown; bool _flag; void update(); @@ -115,9 +110,6 @@ protected: Sprite *_klayman; Sprite *_class525; const Class489Item *_class489Item; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; int16 _remX; bool _flag; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -168,8 +160,6 @@ public: Class482(NeverhoodEngine *vm, Scene *parentScene, int which); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub428500(); void sub428530(); @@ -217,7 +207,6 @@ class Scene1407 : public Scene { public: Scene1407(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource; Sprite *_asMouse; Sprite *_ssResetButton; int _puzzleSolvedCountdown; @@ -267,7 +256,6 @@ public: void hide(); protected: Scene1405 *_parentScene; - SoundResource _soundResource; bool _flag; uint32 _index; int _countdown; @@ -280,7 +268,6 @@ public: Scene1405(NeverhoodEngine *vm, Module *parentModule, int which); int getCountdown() const { return _countdown; } protected: - SoundResource _soundResource; bool _selectFirstTile; int _firstTileIndex; int _secondTileIndex; -- cgit v1.2.3 From 2df0a0a2e18049da5c1b6822ebc5c98f521ac3bd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 07:44:58 +0000 Subject: NEVERHOOD: Change sound stuff in Module1500 --- engines/neverhood/module1500.cpp | 14 ++++---------- engines/neverhood/module1500.h | 1 - 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 76afb956ff..88b7e73da5 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -83,8 +83,7 @@ void Module1500::updateScene() { // Scene1501 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) - : Scene(vm, parentModule, true), _soundResource(vm), - _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) { + : Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) { SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); @@ -98,13 +97,8 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun _palette->addBasePalette(backgroundFileHash, 0, 256, 0); _palette->startFadeToPalette(12); - /* - if (soundFileHash != 0) { - _soundResource.set(soundFileHash); - _soundResource.load(); - _soundResource.play(); - } - */ + if (soundFileHash != 0) + playSound(0, soundFileHash); } @@ -121,7 +115,7 @@ void Scene1501::update() { _vm->_screen->clear(); leaveScene(0); } - } else if ((_countdown2 != 0 && (--_countdown2 == 0)) /*|| !_soundResource.isPlaying()*/) { + } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !isSoundPlaying(0)) { _countdown1 = 12; _palette->startFadeToBlack(11); } diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h index eeabec0618..c562a24615 100644 --- a/engines/neverhood/module1500.h +++ b/engines/neverhood/module1500.h @@ -45,7 +45,6 @@ class Scene1501 : public Scene { public: Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3); protected: - SoundResource _soundResource; int _countdown1; int _countdown2; int _countdown3; -- cgit v1.2.3 From 0c272631df66fc574e2d1bb67d4aa22f434dd178 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 08:08:18 +0000 Subject: NEVERHOOD: Change sound stuff in Module1600 --- engines/neverhood/module1600.cpp | 16 +++++++--------- engines/neverhood/module1600.h | 2 -- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 864e4a6fed..8b35942bc0 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -983,8 +983,7 @@ void Class521::sub45E0A0() { } Class546::Class546(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _soundResource(vm), - _parentScene(parentScene) { + : AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _parentScene(parentScene) { setVisible(false); SetMessageHandler(&Class546::handleMessage); @@ -1011,7 +1010,7 @@ void Class546::sub44D710() { startAnimation(0x08C80144, 0, -1); setVisible(true); NextState(&Class546::sub44D760); - _soundResource.play(calcHash("fxDoorOpen23")); + playSound(0, calcHash("fxDoorOpen23")); } void Class546::sub44D760() { @@ -1024,7 +1023,7 @@ void Class546::sub44D790() { startAnimation(0x08C80144, -1, -1); setVisible(true); NextState(&Class546::sub44D7F0); - _soundResource.play(calcHash("fxDoorClose23")); + playSound(0, calcHash("fxDoorClose23")); } void Class546::sub44D7F0() { @@ -1388,8 +1387,7 @@ uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam ¶m, } Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm), _countdown1(1), - _index1(0), _index3(0), _flag5(true), _flag6(false) { + : Scene(vm, parentModule, true), _countdown1(1), _index1(0), _index3(0), _flag5(true), _flag6(false) { // TODO _vm->gameModule()->initScene3011Vars(); _index2 = getGlobalVar(0x2414C2F2); @@ -1409,7 +1407,7 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x24A10929, 20, 620); - _soundResource.load(0x68E25540); + loadSound(0, 0x68E25540); } @@ -1428,7 +1426,7 @@ void Scene1609::update() { _countdown1 = 12; } } - if (_flag6 && !_soundResource.isPlaying()) { + if (_flag6 && !isSoundPlaying(0)) { leaveScene(1); } Scene::update(); @@ -1451,7 +1449,7 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit _index3++; if (_index3 >= 12) { if (testVars()) { - _soundResource.play(); + playSound(0); setGlobalVar(0x2C531AF8, 1); _flag6 = true; } else { diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index efb2b943ab..b5b8e6b7fc 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -110,7 +110,6 @@ public: Class546(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub44D710(); void sub44D760(); @@ -175,7 +174,6 @@ class Scene1609 : public Scene { public: Scene1609(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource; Sprite *_ssButton; AsScene3011Symbol *_asSymbols[12]; int _index1; -- cgit v1.2.3 From 0a1a228a883b3c13915a9e83886464b85ed2c81e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 10:40:10 +0000 Subject: NEVERHOOD: Change sound stuff in Module1700 - Add Entity::setSoundVolume --- engines/neverhood/entity.cpp | 4 ++++ engines/neverhood/entity.h | 1 + engines/neverhood/module1700.cpp | 8 ++++---- engines/neverhood/module1700.h | 1 - 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index d7d78969d2..0cb906acbd 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -142,6 +142,10 @@ bool Entity::isSoundPlaying(uint index) { return getSoundResource(index)->isPlaying(); } +void Entity::setSoundVolume(uint index, int volume) { + getSoundResource(index)->setVolume(volume); +} + void Entity::deleteSoundResources() { if (_soundResources) { for (uint i = 0; i < kMaxSoundResources; ++i) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index eafc467b55..b0348ea60b 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -109,6 +109,7 @@ protected: void loadSound(uint index, uint32 fileHash); void playSound(uint index, uint32 fileHash = 0); bool isSoundPlaying(uint index); + void setSoundVolume(uint index, int volume); void deleteSoundResources(); }; diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 13d0f35198..f914fa9c5b 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -34,7 +34,7 @@ static const uint32 kModule1700SoundList[] = { }; Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundResource(vm) { + : Module(vm, parentModule) { _vm->_soundMan->addMusic(0x04212331, 0x31114225); _vm->_soundMan->addSoundList(0x04212331, kModule1700SoundList); @@ -105,9 +105,9 @@ void Module1700::updateScene() { } else if (_moduleResult == 1) { createScene(1, 1); } else if (_moduleResult == 2) { - if (!_soundResource.isPlaying()) { - _soundResource.setVolume(60); - _soundResource.play(0x58B45E58); + if (!isSoundPlaying(0)) { + setSoundVolume(0, 60); + playSound(0, 0x58B45E58); } createScene(2, 2); } diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h index f7388484b2..2488c46e49 100644 --- a/engines/neverhood/module1700.h +++ b/engines/neverhood/module1700.h @@ -35,7 +35,6 @@ public: Module1700(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1700(); protected: - SoundResource _soundResource; void createScene(int sceneNum, int which); void updateScene(); }; -- cgit v1.2.3 From a8dda6c5b69657023b6b3c472c083af86a74cb0c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 10:43:24 +0000 Subject: NEVERHOOD: Change sound stuff in Module1900 --- engines/neverhood/module1900.cpp | 40 +++++++++++++++++++--------------------- engines/neverhood/module1900.h | 8 -------- 2 files changed, 19 insertions(+), 29 deletions(-) diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index c6ce15c461..77f031b19b 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -190,8 +190,7 @@ int AsScene1907Symbol::_symbolFlag1 = 0; int AsScene1907Symbol::_symbolFlag2 = 0; AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex) - : AnimatedSprite(vm, 1000 - positionIndex), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) { + : AnimatedSprite(vm, 1000 - positionIndex), _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) { _symbolFlag1 = 0; _symbolFlag2 = 0; @@ -212,9 +211,9 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene } else { _isPluggedIn = false; _currPositionIndex = positionIndex; - _soundResource1.load(0x74231924); - _soundResource2.load(0x36691914); - _soundResource3.load(0x5421D806); + loadSound(0, 0x74231924); + loadSound(1, 0x36691914); + loadSound(2, 0x5421D806); _parentScene->setPositionFree(_currPositionIndex, false); _x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x; _y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y; @@ -389,7 +388,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { } void AsScene1907Symbol::stFallOffHitGround() { - _soundResource2.play(); + playSound(1); sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); // TODO: Meh... Entity::_priority = 1000 - _newPositionIndex; @@ -418,11 +417,11 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() { SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteUpdate(NULL); processDelta(); - _soundResource3.play(); + playSound(2); } void AsScene1907Symbol::stPlugIn() { - _soundResource1.play(); + playSound(0); _currPositionIndex = _newPositionIndex; stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); @@ -456,7 +455,7 @@ void AsScene1907Symbol::moveDown() { } SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol) - : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol), + : StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol), _countdown1(0) { _spriteResource.load2(0x64516424); @@ -468,7 +467,7 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 _y = _spriteResource.getPosition().y; processDelta(); _needRefresh = true; - _soundResource.load(0x44061000); + loadSound(0, 0x44061000); SetUpdateHandler(&SsScene1907UpDownButton::update); SetMessageHandler(&SsScene1907UpDownButton::handleMessage); if (getGlobalVar(0xA9035F60)) { @@ -495,7 +494,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam setVisible(true); _countdown1 = 4; StaticSprite::update(); - _soundResource.play(); + playSound(0); } messageResult = 1; } @@ -558,8 +557,7 @@ void AsScene1907WaterHint::hide() { } Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _soundResource4(vm), _currMovingSymbolIndex(0), _pluggedInCount(0), + : Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { _surfaceFlag = true; @@ -590,10 +588,10 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0xA9035F60)) _pluggedInCount = 9; - _soundResource1.load(0x72004A10); - _soundResource2.load(0x22082A12); - _soundResource3.load(0x21100A10); - _soundResource4.load(0x68E25540); + loadSound(0, 0x72004A10); + loadSound(1, 0x22082A12); + loadSound(2, 0x21100A10); + loadSound(3, 0x68E25540); } @@ -646,17 +644,17 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO Debug stuff case 0x2000: if (getGlobalVar(0x09221A62)) { - _soundResource1.play(); + playSound(0); for (int i = 0; i < 9; i++) _asSymbols[i]->moveUp(); _ssUpDownButton->setToUpPosition(); setGlobalVar(0x09221A62, 0); } else { if (!getGlobalVar(0x10938830)) { - _soundResource3.play(); + playSound(2); _countdown3 = 5; } else { - _soundResource2.play(); + playSound(1); _ssUpDownButton->setToDownPosition(); setGlobalVar(0x09221A62, 1); } @@ -665,7 +663,7 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2001: - _soundResource4.play(); + playSound(3); setGlobalVar(0xA9035F60, 1); break; } diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h index 2eadd06a95..386d1c9fdb 100644 --- a/engines/neverhood/module1900.h +++ b/engines/neverhood/module1900.h @@ -60,9 +60,6 @@ public: bool isPluggedIn() { return _isPluggedIn; } bool isMoving() { return _isMoving; } protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; Scene1907 *_parentScene; int _elementIndex; int _currPositionIndex; @@ -111,7 +108,6 @@ public: void setToUpPosition(); void setToDownPosition(); protected: - SoundResource _soundResource; Scene1907 *_parentScene; AsScene1907Symbol *_asScene1907Symbol; int _countdown1; @@ -126,10 +122,6 @@ public: void setPositionFree(int index, bool value) { _positionFree[index] = value; } int getNextPosition() { return _pluggedInCount++; } protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; AsScene1907Symbol *_asSymbols[9]; SsScene1907UpDownButton *_ssUpDownButton; AsScene1907WaterHint *_asWaterHint; -- cgit v1.2.3 From 78df19c6486612ad57f0625099355b69c41badb8 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 10:53:08 +0000 Subject: NEVERHOOD: Change sound stuff in Module2100 --- engines/neverhood/module2100.cpp | 10 +++++----- engines/neverhood/module2100.h | 2 -- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index fd2a793a28..98b6e03cd4 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -78,7 +78,7 @@ void Module2100::updateScene() { // Scene2101 Class538::Class538(NeverhoodEngine *vm, bool flag) - : AnimatedSprite(vm, 1100), _soundResource(vm) { + : AnimatedSprite(vm, 1100) { // TODO createSurface3(100, dword_4B9018); createSurface(100, 640, 480); //TODO: Remove once the line above is done @@ -114,7 +114,7 @@ void Class538::openDoor() { startAnimation(0x0C202B9C, 0, -1); _newStickFrameIndex = -2; setVisible(true); - _soundResource.play(calcHash("fxDoorOpen32")); + playSound(0, calcHash("fxDoorOpen32")); } void Class538::closeDoor() { @@ -122,7 +122,7 @@ void Class538::closeDoor() { _newStickFrameIndex = -2; setVisible(true); NextState(&Class538::hide); - _soundResource.play(calcHash("fxDoorClose32")); + playSound(0, calcHash("fxDoorClose32")); } void Class538::hide() { @@ -157,7 +157,7 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity } Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) - : StaticSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), _countdown(0), + : StaticSprite(vm, 1100), _parentScene(parentScene), _countdown(0), _fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) { SetUpdateHandler(&Class427::update); @@ -193,7 +193,7 @@ uint32 Class427::handleMessage(int messageNum, const MessageParam ¶m, Entity load(_fileHash2, true, true); StaticSprite::update(); _countdown = 16; - _soundResource.play(_soundFileHash); + playSound(0, _soundFileHash); break; } return messageResult; diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h index 65846d7ded..ff6898c7b0 100644 --- a/engines/neverhood/module2100.h +++ b/engines/neverhood/module2100.h @@ -45,7 +45,6 @@ class Class538 : public AnimatedSprite { public: Class538(NeverhoodEngine *vm, bool flag); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void openDoor(); void closeDoor(); @@ -65,7 +64,6 @@ public: Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 _soundFileHash; uint32 _fileHash1, _fileHash2; int16 _countdown; -- cgit v1.2.3 From 3651d982c4229fb77d371836cdc3ddbca156d980 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:00:50 +0000 Subject: NEVERHOOD: Change sound stuff in Module2200 - Add Entity::stopSound --- engines/neverhood/entity.cpp | 4 ++ engines/neverhood/entity.h | 1 + engines/neverhood/module2200.cpp | 104 ++++++++++++++++++--------------------- engines/neverhood/module2200.h | 16 ------ 4 files changed, 54 insertions(+), 71 deletions(-) diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index 0cb906acbd..f66d129e26 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -138,6 +138,10 @@ void Entity::playSound(uint index, uint32 fileHash) { getSoundResource(index)->play(); } +void Entity::stopSound(uint index) { + getSoundResource(index)->stop(); +} + bool Entity::isSoundPlaying(uint index) { return getSoundResource(index)->isPlaying(); } diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index b0348ea60b..4bcd0c4e33 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -108,6 +108,7 @@ protected: // TODO Add other sound stuff void loadSound(uint index, uint32 fileHash); void playSound(uint index, uint32 fileHash = 0); + void stopSound(uint index); bool isSoundPlaying(uint index); void setSoundVolume(uint index, int volume); void deleteSoundResources(); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index bb2f59b340..f703971bf3 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -412,8 +412,7 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) } AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1) - : AnimatedSprite(vm, 1100), _soundResource(vm), _klayman(klayman), _doorLightSprite(doorLightSprite), - _countdown(0), _doorOpen(flag1) { + : AnimatedSprite(vm, 1100), _klayman(klayman), _doorLightSprite(doorLightSprite), _countdown(0), _doorOpen(flag1) { _x = 408; _y = 290; @@ -471,7 +470,7 @@ void AsScene2201Door::stOpenDoor() { _doorOpen = true; startAnimation(0xE2CB0412, 0, -1); _newStickFrameIndex = -2; - _soundResource.play(calcHash("fxDoorOpen33")); + playSound(0, calcHash("fxDoorOpen33")); } void AsScene2201Door::stCloseDoor() { @@ -479,7 +478,7 @@ void AsScene2201Door::stCloseDoor() { startAnimation(0xE2CB0412, -1, -1); _playBackwards = true; _newStickFrameIndex = 0; - _soundResource.play(calcHash("fxDoorClose33")); + playSound(0, calcHash("fxDoorClose33")); } Class444::Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex) @@ -671,8 +670,7 @@ static const uint32 kSsScene2202PuzzleTileFileHashes2[] = { }; SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value) - : StaticSprite(vm, 900), _soundResource1(vm), _soundResource2(vm), _parentScene(parentScene), - _value(value), _tileIndex(tileIndex), _isMoving(false) { + : StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) { SetUpdateHandler(&SsScene2202PuzzleTile::update); SetMessageHandler(&SsScene2202PuzzleTile::handleMessage); @@ -694,8 +692,8 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS processDelta(); _needRefresh = true; StaticSprite::update(); - _soundResource1.load(0x40958621); - _soundResource2.load(0x51108241); + loadSound(0, 0x40958621); + loadSound(1, 0x51108241); } void SsScene2202PuzzleTile::update() { @@ -853,7 +851,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { else _xFlagPos = _x / 2 + _newX; } - _soundResource1.play(); + playSound(0); } else { SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileY); if (_yIncr > 0) { @@ -867,7 +865,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { else _xFlagPos = _y / 2 + _newY; } - _soundResource2.play(); + playSound(1); } } @@ -885,8 +883,8 @@ void SsScene2202PuzzleTile::stopMoving() { } Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), - _isSolved(false), _leaveScene(false), _isTileMoving(false), _movingTileSprite(NULL), _doneMovingTileSprite(NULL) { + : Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isTileMoving(false), + _movingTileSprite(NULL), _doneMovingTileSprite(NULL) { // TODO initScene2201Vars(); SetMessageHandler(&Scene2202::handleMessage); @@ -915,8 +913,8 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x85500158, 400); insertStaticSprite(0x25547028, 600); - _soundResource1.load(0x68E25540); - _soundResource2.load(0x40400457); + loadSound(0, 0x68E25540); + loadSound(1, 0x40400457); _vm->_soundMan->addSound(0x60400854, 0x8101A241); _vm->_soundMan->playSoundLooping(0x8101A241); @@ -930,12 +928,12 @@ Scene2202::~Scene2202() { void Scene2202::update() { Scene::update(); - if (_leaveScene && !_soundResource2.isPlaying()) { + if (_leaveScene && !isSoundPlaying(1)) { leaveScene(0); } - if (_isSolved && !_soundResource1.isPlaying()) { - _soundResource2.play(); + if (_isSolved && !isSoundPlaying(0)) { + playSound(1); _isSolved = false; _leaveScene = true; } @@ -954,7 +952,7 @@ void Scene2202::update() { setSurfacePriority(_doneMovingTileSprite->getSurface(), _surfacePriority); _doneMovingTileSprite = NULL; if (testIsSolved()) { - _soundResource1.play(); + playSound(0); setGlobalVar(0x404290D5, 1); _isSolved = true; } @@ -1055,8 +1053,7 @@ static const uint32 kAsScene2203DoorFileHashes[] = { }; AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene), - _index(index) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2203Door::handleMessage); @@ -1104,7 +1101,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, } void AsScene2203Door::openDoor() { - _soundResource.play(0x341014C4); + playSound(0, 0x341014C4); startAnimation(kAsScene2203DoorFileHashes[_index], 1, -1); } @@ -1407,7 +1404,7 @@ static const int16 kClass603XDeltas2[] = { }; Class603::Class603(NeverhoodEngine *vm, uint32 fileHash) - : StaticSprite(vm, fileHash, 200), _soundResource(vm) { + : StaticSprite(vm, fileHash, 200) { if (getGlobalVar(0x18890C91)) _x -= 63; @@ -1428,13 +1425,13 @@ uint32 Class603::handleMessage(int messageNum, const MessageParam ¶m, Entity _index = 0; SetMessageHandler(NULL); SetSpriteUpdate(&Class603::spriteUpdate481E60); - _soundResource.play(0x032746E0); + playSound(0, 0x032746E0); break; case 0x4809: _index = 0; SetMessageHandler(NULL); SetSpriteUpdate(&Class603::spriteUpdate481E90); - _soundResource.play(0x002642C0); + playSound(0, 0x002642C0); break; } return messageResult; @@ -1520,7 +1517,7 @@ uint32 Class607::handleMessage(int messageNum, const MessageParam ¶m, Entity } Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm) { + : Scene(vm, parentModule, true) { uint32 fileHash; @@ -1580,7 +1577,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B88C8); _palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0); sub4819D0(); - _soundResource.play(0x53B8284A); + playSound(0, 0x53B8284A); } else if (which == 3) { insertKlayman(kScene2206XPositions[getGlobalVar(0x48A68852)], 430); if (getGlobalVar(0xC0418A02)) @@ -1695,8 +1692,7 @@ static const uint32 kScene2207FileHashes[] = { }; AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _soundResource(vm), - _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) { + : AnimatedSprite(vm, 900), _parentScene(parentScene), _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) { NPoint pt; @@ -1728,7 +1724,7 @@ void AsScene2207Elevator::update() { _destPointIndexDelta = 0; } else { _vm->_soundMan->deleteSound(0xD3B02847); - _soundResource.play(0x53B8284A); + playSound(0, 0x53B8284A); } } } @@ -1744,7 +1740,7 @@ void AsScene2207Elevator::update() { _destPointIndexDelta = 0; } else { _vm->_soundMan->deleteSound(0xD3B02847); - _soundResource.play(0x53B8284A); + playSound(0, 0x53B8284A); } } } @@ -1811,7 +1807,7 @@ void AsScene2207Elevator::moveToY(int16 y) { } AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX) - : AnimatedSprite(vm, 1100), _soundResource(vm), _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2207Lever::handleMessage); @@ -1853,7 +1849,7 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m void AsScene2207Lever::stLeverDown() { startAnimation(0x80880090, 1, -1); FinalizeState(&AsScene2207Lever::stLeverDownEvent); - _soundResource.play(0x40581882); + playSound(0, 0x40581882); } void AsScene2207Lever::stLeverDownEvent() { @@ -1864,7 +1860,7 @@ void AsScene2207Lever::stLeverUp() { startAnimation(0x80880090, 6, -1); FinalizeState(&AsScene2207Lever::stLeverUpEvent); _playBackwards = true; - _soundResource.play(0x40581882); + playSound(0, 0x40581882); } void AsScene2207Lever::stLeverUpEvent() { @@ -1872,8 +1868,7 @@ void AsScene2207Lever::stLeverUpEvent() { } AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1200), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _soundResource4(vm), _idle(true) { + : AnimatedSprite(vm, 1200), _idle(true) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); @@ -1882,9 +1877,9 @@ AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm _y = 320; startAnimation(0xCCFD6090, 0, -1); _newStickFrameIndex = 0; - _soundResource2.load(0x40330872); - _soundResource3.load(0x72A2914A); - _soundResource4.load(0xD4226080); + loadSound(1, 0x40330872); + loadSound(2, 0x72A2914A); + loadSound(3, 0xD4226080); } AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { @@ -1900,19 +1895,19 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag _vm->_soundMan->addSound(0x80D00820, 0x12121943); _vm->_soundMan->playSoundLooping(0x12121943); } else if (param.asInteger() == 0x834AB011) { - _soundResource1.stop(); - _soundResource2.stop(); - _soundResource3.stop(); - _soundResource4.stop(); + stopSound(0); + stopSound(1); + stopSound(2); + stopSound(3); _vm->_soundMan->deleteSound(0x12121943); } else if (param.asInteger() == 0x3A980501) { - _soundResource2.play(); + playSound(1); } else if (param.asInteger() == 0x2A2AD498) { - _soundResource3.play(); + playSound(2); } else if (param.asInteger() == 0xC4980008) { - _soundResource4.play(); + playSound(3); } else if (param.asInteger() == 0x06B84228) { - _soundResource1.play(0xE0702146); + playSound(0, 0xE0702146); } } break; @@ -1945,10 +1940,10 @@ void AsScene2207WallRobotAnimation::stStopAnimation() { void AsScene2207WallRobotAnimation::cbStopAnimation() { stopAnimation(); - _soundResource1.stop(); - _soundResource2.stop(); - _soundResource3.stop(); - _soundResource4.stop(); + stopSound(0); + stopSound(1); + stopSound(2); + stopSound(3); _vm->_soundMan->deleteSound(0x12121943); _idle = true; setVisible(false); @@ -2011,8 +2006,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i } Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm), - _klaymanAtElevator(true), _elevatorSurfacePriority(0) { + : Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { //DEBUG setGlobalVar(0x4D080E54, 1); @@ -2094,7 +2088,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(_klayman, 0x2001, 0); sendMessage(_asElevator, 0x2000, 480); - _soundResource2.load(calcHash("fxFogHornSoft")); + loadSound(1, calcHash("fxFogHornSoft")); } @@ -2166,10 +2160,10 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _ssButton) { if (getSubVar(0x14800353, 0x40119852)) { setSubVar(0x14800353, 0x40119852, 0); - _soundResource1.play(calcHash("fx3LocksDisable")); + playSound(0, calcHash("fx3LocksDisable")); } else { setSubVar(0x14800353, 0x40119852, 1); - _soundResource2.play(); + playSound(1); } } break; diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 76a59509f2..3767b7bd64 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -76,7 +76,6 @@ class AsScene2201Door : public AnimatedSprite { public: AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1); protected: - SoundResource _soundResource; Klayman *_klayman; Sprite *_doorLightSprite; bool _doorOpen; @@ -124,8 +123,6 @@ protected: int16 _xFlagPos; bool _counterDirection; bool _isMoving; - SoundResource _soundResource1; - SoundResource _soundResource2; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void suMoveTileX(); @@ -139,8 +136,6 @@ public: Scene2202(NeverhoodEngine *vm, Module *parentModule, int which); ~Scene2202(); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; Sprite *_movingTileSprite; Sprite *_doneMovingTileSprite; bool _isTileMoving; @@ -168,7 +163,6 @@ public: AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index); protected: Scene *_parentScene; - SoundResource _soundResource; Sprite *_otherDoor; uint _index; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -216,7 +210,6 @@ public: Class603(NeverhoodEngine *vm, uint32 fileHash); protected: int _index; - SoundResource _soundResource; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void spriteUpdate481E60(); @@ -253,7 +246,6 @@ protected: Sprite *_sprite5; Sprite *_class604; Sprite *_class607; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void sub481950(); void sub4819D0(); @@ -266,7 +258,6 @@ public: ~AsScene2207Elevator(); protected: Scene *_parentScene; - SoundResource _soundResource; NPointArray *_pointArray; int16 _pointIndex; int16 _destPointIndex, _destPointIndexDelta; @@ -282,7 +273,6 @@ public: AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stLeverDown(); void stLeverDownEvent(); @@ -295,10 +285,6 @@ public: AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene); ~AsScene2207WallRobotAnimation(); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; bool _idle; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stStartAnimation(); @@ -326,8 +312,6 @@ class Scene2207 : public Scene { public: Scene2207(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; Sprite *_asElevator; Sprite *_ssMaskPart1; Sprite *_ssMaskPart2; -- cgit v1.2.3 From 0c5a5b3c62826904166847b2626fe37b62023547 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:04:36 +0000 Subject: NEVERHOOD: Change sound stuff in Module2400 --- engines/neverhood/module2400.cpp | 48 +++++++++++++++++++--------------------- engines/neverhood/module2400.h | 10 --------- 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index f1f9f04777..6c120069b7 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -201,7 +201,7 @@ static const uint32 kAsScene2401WaterSpitFileHashes1[] = { }; AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _soundResource(vm) { + : AnimatedSprite(vm, 1200) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2401WaterSpit::handleMessage); @@ -217,13 +217,13 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x100D: if (param.asInteger() == 0x120A0013) - _soundResource.play(kAsScene2401WaterSpitFileHashes1[_soundIndex]); + playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]); break; case 0x2000: _x = 240; _y = 447; _soundIndex = getSubVar(0x0800547C, param.asInteger()); - _soundResource.play(0x48640244); + playSound(0, 0x48640244); startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1); setVisible(true); break; @@ -323,7 +323,7 @@ uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessagePara } AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) - : AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen), _soundResource(vm) { + : AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) { createSurface1(0x44687810, 100); _x = 320; @@ -348,7 +348,7 @@ void AsScene2401Door::update() { startAnimation(0x44687810, -1, -1); _newStickFrameIndex = 0; _playBackwards = true; - _soundResource.play(calcHash("fxDoorClose38")); + playSound(0, calcHash("fxDoorClose38")); } AnimatedSprite::update(); } @@ -370,7 +370,7 @@ uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam ¶m, _isOpen = true; setVisible(true); startAnimation(0x44687810, 0, -1); - _soundResource.play(calcHash("fxDoorOpen38")); + playSound(0, calcHash("fxDoorOpen38")); NextState(&AsScene2401Door::stDoorOpenFinished); } break; @@ -385,7 +385,7 @@ void AsScene2401Door::stDoorOpenFinished() { Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false), - _soundToggle(false), _asWaterSpitIndex(0), _soundResource1(vm), _soundResource2(vm) { + _soundToggle(false), _asWaterSpitIndex(0) { _vm->gameModule()->initScene2401Vars(); @@ -545,7 +545,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (sender == _ssFloorButton && getGlobalVar(0x4E0BE910)) { _countdown2 = 144; sendMessage(_asFlowingWater, 0x2002, 0); - _soundResource1.play(0xE1130324); + playSound(0, 0xE1130324); } break; case 0x482A: @@ -562,9 +562,9 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2401::playPipeSound(uint32 fileHash) { if (_soundToggle) - _soundResource1.play(fileHash); + playSound(0, fileHash); else - _soundResource2.play(fileHash); + playSound(1, fileHash); _soundToggle = !_soundToggle; } @@ -577,7 +577,7 @@ static const uint32 kScene2402FileHashes[] = { }; AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _soundResource(vm) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen) { SetUpdateHandler(&AsScene2402Door::update); SetMessageHandler(&AsScene2402Door::handleMessage); @@ -600,7 +600,7 @@ void AsScene2402Door::update() { setVisible(true); startAnimation(0x80495831, -1, -1); _playBackwards = true; - _soundResource.play(calcHash("fxDoorClose38")); + playSound(0, calcHash("fxDoorClose38")); NextState(&AsScene2402Door::stDoorClosingFinished); } AnimatedSprite::update(); @@ -623,7 +623,7 @@ uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam ¶m, setVisible(true); startAnimation(0x80495831, 0, -1); _newStickFrameIndex = -2; - _soundResource.play(calcHash("fxDoorOpen38")); + playSound(0, calcHash("fxDoorOpen38")); break; } return messageResult; @@ -635,8 +635,7 @@ void AsScene2402Door::stDoorClosingFinished() { } AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) - : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0), - _soundResource(vm) { + : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) { createSurface(100, 640, 480); // TODO Use correct size from the two hashes SetMessageHandler(&Sprite::handleMessage); @@ -645,7 +644,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) setDoDeltaX(1); if (!getGlobalVar(0x92603A79)) { - _soundResource.load(0x58208810); + loadSound(0, 0x58208810); _countdown1 = 48; startAnimation(0x4919397A, 0, -1); _newStickFrameIndex = 0; @@ -709,7 +708,7 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity * switch (messageNum) { case 0x100D: if (param.asInteger() == 0x431EA0B0) { - _soundResource.play(); + playSound(0); } break; case 0x3002: @@ -720,8 +719,7 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity * } Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _soundToggle(false), - _soundResource1(vm), _soundResource2(vm) { + : Scene(vm, parentModule, true), _countdown(0), _soundToggle(false) { _surfaceFlag = true; SetMessageHandler(&Scene2402::handleMessage); @@ -816,14 +814,14 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2402::playPipeSound(uint32 fileHash) { if (_soundToggle) - _soundResource1.play(fileHash); + playSound(0, fileHash); else - _soundResource2.play(fileHash); + playSound(1, fileHash); _soundToggle = !_soundToggle; } Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource1(vm), _soundResource2(vm) { + : Scene(vm, parentModule, true) { Sprite *tempSprite; @@ -868,7 +866,7 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); - _soundResource2.load(calcHash("fxFogHornSoft")); + loadSound(1, calcHash("fxFogHornSoft")); } @@ -894,10 +892,10 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _ssButton) { if (getSubVar(0x14800353, 0x304008D2)) { setSubVar(0x14800353, 0x304008D2, 0); - _soundResource1.play(calcHash("fx3LocksDisable")); + playSound(0, calcHash("fx3LocksDisable")); } else { setSubVar(0x14800353, 0x304008D2, 1); - _soundResource2.play(); + playSound(1); } } break; diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index e29f03da9a..bbfa47d07a 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -54,7 +54,6 @@ public: AsScene2401WaterSpit(NeverhoodEngine *vm); protected: int _soundIndex; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -83,7 +82,6 @@ public: protected: int _countdown; bool _isOpen; - SoundResource _soundResource; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stDoorOpenFinished(); @@ -107,8 +105,6 @@ protected: int _countdown2; int _pipeStatus; int _asWaterSpitIndex; - SoundResource _soundResource1; - SoundResource _soundResource2; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void playPipeSound(uint32 fileHash); @@ -121,7 +117,6 @@ protected: Scene *_parentScene; int _countdown; bool _isOpen; - SoundResource _soundResource; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stDoorClosingFinished(); @@ -135,7 +130,6 @@ protected: Klayman *_klayman; int _countdown1; int _countdown2; - SoundResource _soundResource; void upWait(); void upFocusKlayman(); void stJokeFinished(); @@ -155,8 +149,6 @@ protected: int _pipeStatus; int _countdown; bool _soundToggle; - SoundResource _soundResource1; - SoundResource _soundResource2; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void playPipeSound(uint32 fileHash); @@ -173,8 +165,6 @@ protected: Sprite *_class545; Sprite *_asLightCord; bool _flag1; - SoundResource _soundResource1; - SoundResource _soundResource2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From fb9d9c30e6a35de21c128abc09e40e1997d882b6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:08:32 +0000 Subject: NEVERHOOD: Change sound stuff in Module2500 --- engines/neverhood/module2500.cpp | 47 ++++++++++++++-------------------------- engines/neverhood/module2500.h | 8 ------- 2 files changed, 16 insertions(+), 39 deletions(-) diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index a12c516cbf..1efcb25ed1 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -56,8 +56,7 @@ static const uint32 kScene2508StaticSprites2[] = { static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448); Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _soundResource4(vm), _soundIndex(0) { + : Module(vm, parentModule), _soundIndex(0) { _vm->_soundMan->addMusic(0x29220120, 0x05343184); _vm->_soundMan->startMusic(0x05343184, 0, 0); @@ -69,10 +68,10 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - _soundResource1.load(0x00880CCC); - _soundResource2.load(0x00880CC0); - _soundResource3.load(0x00880CCC); - _soundResource4.load(0x00880CC0); + loadSound(0, 0x00880CCC); + loadSound(1, 0x00880CC0); + loadSound(2, 0x00880CCC); + loadSound(3, 0x00880CC0); } @@ -203,20 +202,7 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Enti uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x200D: - switch (_soundIndex) { - case 0: - _soundResource1.play(); - break; - case 1: - _soundResource2.play(); - break; - case 2: - _soundResource3.play(); - break; - case 3: - _soundResource4.play(); - break; - } + playSound(_soundIndex); _soundIndex++; if (_soundIndex >= 4) _soundIndex = 0; @@ -513,8 +499,7 @@ void Scene2501::updateKlaymanCliprect() { } Class450::Class450(NeverhoodEngine *vm) - : StaticSprite(vm, 1400), _countdown(0), _flag1(false), _soundResource1(vm), - _soundResource2(vm), _soundResource3(vm), _soundResource4(vm) { + : StaticSprite(vm, 1400), _countdown(0), _flag1(false) { _spriteResource.load2(0x070220D9); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -528,26 +513,26 @@ Class450::Class450(NeverhoodEngine *vm) processDelta(); _needRefresh = true; setVisible(false); - _soundResource3.load(0x44043000); - _soundResource4.load(0x44045000); - _soundResource1.load(0x4600204C); - _soundResource2.load(0x408C0034); + loadSound(0, 0x4600204C); + loadSound(1, 0x408C0034); + loadSound(2, 0x44043000); + loadSound(3, 0x44045000); SetMessageHandler(&Class450::handleMessage); SetUpdateHandler(&Class450::update); } void Class450::update() { StaticSprite::update(); - if (_flag1 && !_soundResource1.isPlaying() && !_soundResource2.isPlaying()) { - _soundResource4.play(); + if (_flag1 && !isSoundPlaying(0) && !isSoundPlaying(1)) { + playSound(3); setVisible(false); _flag1 = false; } if (_countdown != 0 && (--_countdown) == 0) { if (getSubVar(0x14800353, 0x01180951)) { - _soundResource1.play(); + playSound(0); } else { - _soundResource2.play(); + playSound(1); } _flag1 = true; } @@ -565,7 +550,7 @@ uint32 Class450::handleMessage(int messageNum, const MessageParam ¶m, Entity } else { setSubVar(0x14800353, 0x01180951, 1); } - _soundResource3.play(); + playSound(2); } messageResult = 1; break; diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index 756c75efde..fb61ba5010 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -39,10 +39,6 @@ public: Module2500(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2500(); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; int _soundIndex; void createScene(int sceneNum, int which); void updateScene(); @@ -99,10 +95,6 @@ public: protected: int _countdown; bool _flag1; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 26188a3a695d47feea6240695eb87488d67c969a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:10:05 +0000 Subject: NEVERHOOD: Change sound stuff in Module2600 --- engines/neverhood/module2600.cpp | 20 +++++++++----------- engines/neverhood/module2600.h | 4 ---- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 43c55ea49b..435c38c079 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -206,9 +206,7 @@ void Module2600::updateScene() { } SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _soundResource4(vm), _parentScene(parentScene), - _countdown(0) { + : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { _spriteResource.load2(0x825A6923); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -222,10 +220,10 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) processDelta(); _needRefresh = true; - _soundResource1.load(0x10267160); - _soundResource2.load(0x7027FD64); - _soundResource3.load(0x44043000); - _soundResource4.load(0x44045000); + loadSound(0, 0x10267160); + loadSound(1, 0x7027FD64); + loadSound(2, 0x44043000); + loadSound(3, 0x44045000); SetUpdateHandler(&SsScene2609Button::update); SetMessageHandler(&SsScene2609Button::handleMessage); @@ -253,13 +251,13 @@ uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam ¶ sendMessage(_parentScene, 0x2000, 0); if (getGlobalVar(0x4E0BE910)) { setVisible(false); - _soundResource4.play(); - _soundResource2.play(); + playSound(3); + playSound(1); _countdown = 12; } else { setVisible(true); - _soundResource3.play(); - _soundResource1.play(); + playSound(2); + playSound(0); _countdown = 96; } } diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h index 04c78008f0..107ee91788 100644 --- a/engines/neverhood/module2600.h +++ b/engines/neverhood/module2600.h @@ -45,10 +45,6 @@ public: SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 73f4e4bcac93cb96b2a6b5cde5b3c0342819fe13 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:11:38 +0000 Subject: NEVERHOOD: Change sound stuff in Module2700 --- engines/neverhood/module2700.cpp | 26 ++++++-------------------- engines/neverhood/module2700.h | 4 ---- 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index aa5c98e4c2..0a59abf0f2 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -83,8 +83,7 @@ static const uint32 kScene2725StaticSprites[] = { }; Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundResource1(vm), _soundResource2(vm), - _soundResource3(vm), _soundResource4(vm), _soundIndex(0), _flag1(false) { + : Module(vm, parentModule), _soundIndex(0), _flag1(false) { _vm->_soundMan->addMusic(0x42212411, 0x04020210); _vm->_soundMan->startMusic(0x04020210, 24, 2); @@ -99,10 +98,10 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) createScene(0, 0); } - _soundResource1.load(0x00880CCC); - _soundResource2.load(0x00880CC0); - _soundResource3.load(0x00880CCC); - _soundResource4.load(0x00880CC0); + loadSound(0, 0x00880CCC); + loadSound(1, 0x00880CC0); + loadSound(2, 0x00880CCC); + loadSound(3, 0x00880CC0); } @@ -482,20 +481,7 @@ uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Enti uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x200D: - switch (_soundIndex) { - case 0: - _soundResource1.play(); - break; - case 1: - _soundResource2.play(); - break; - case 2: - _soundResource3.play(); - break; - case 3: - _soundResource4.play(); - break; - } + playSound(_soundIndex); _soundIndex++; if (_soundIndex >= 4) _soundIndex = 0; diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index bed9a7d829..70c1a802bb 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -37,10 +37,6 @@ public: Module2700(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2700(); protected: - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; int _soundIndex; bool _flag1; uint32 _scene2711StaticSprites[6]; -- cgit v1.2.3 From eca881bd3ece18de6cc24087d66052632d9a7170 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:18:23 +0000 Subject: NEVERHOOD: Change sound stuff in Module2800 --- engines/neverhood/module2800.cpp | 118 ++++++++++++++++++--------------------- engines/neverhood/module2800.h | 24 -------- 2 files changed, 55 insertions(+), 87 deletions(-) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 597227cd6f..6d7e49f5c7 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -477,7 +477,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), - _flag1(false), _flag2(false), _soundResource(vm) { + _flag1(false), _flag2(false) { createSurface(1010, 640, 480); // TODO Use correct size from the two hashes SetUpdateHandler(&AnimatedSprite::update); @@ -493,7 +493,7 @@ uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &p case 0x100D: if (!_flag2 && param.asInteger() == calcHash("ClickSwitch")) { sendMessage(_parentScene, 0x480F, 0); - _soundResource.play(0x4E1CA4A0); + playSound(0, 0x4E1CA4A0); } break; case 0x480F: @@ -1184,8 +1184,7 @@ void Scene2803b::sub4601F0(bool flag) { } SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) - : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), - _soundResource(vm) { + : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) { if (getGlobalVar(0x190A1D18)) _spriteResource.load2(0x51A10202); @@ -1204,7 +1203,7 @@ SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *paren _needRefresh = true; SetUpdateHandler(&SsScene2804RedButton::update); SetMessageHandler(&SsScene2804RedButton::handleMessage); - _soundResource.load(0x44241240); + loadSound(0, 0x44241240); } void SsScene2804RedButton::update() { @@ -1219,7 +1218,7 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x1011: if (_countdown == 0 && !_parentScene->isWorking()) { - _soundResource.play(); + playSound(0); setVisible(true); _countdown = 4; sendMessage(_parentScene, 0x2000, 0); @@ -1299,7 +1298,7 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam } SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) - : StaticSprite(vm, 900), _soundResource(vm) { + : StaticSprite(vm, 900) { _spriteResource.load2(0x211003A0); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -1312,13 +1311,13 @@ SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) setVisible(false); _needRefresh = true; StaticSprite::update(); - _soundResource.load(0xCB36BA54); + loadSound(0, 0xCB36BA54); } void SsScene2804Flash::show() { setVisible(true); StaticSprite::update(); - _soundResource.play(); + playSound(0); } SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) @@ -1381,8 +1380,7 @@ static const uint32 kAsScene2804CrystalFileHashes[] = { }; AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex) - : AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex), - _isShowing(false), _soundResource(vm) { + : AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex), _isShowing(false) { static const NPoint kAsScene2804CrystalPoints[] = { {204, 196}, @@ -1410,7 +1408,7 @@ AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWa _needRefresh = true; _newStickFrameIndex = _colorNum; } - _soundResource.load(0x725294D4); + loadSound(0, 0x725294D4); SetUpdateHandler(&AnimatedSprite::update); } @@ -1420,7 +1418,7 @@ void AsScene2804Crystal::show() { _isShowing = true; if (_asCrystalWaves) _asCrystalWaves->show(); - _soundResource.play(); + playSound(0); } } @@ -1452,8 +1450,7 @@ void AsScene2804Crystal::activate() { } SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex) - : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal), - _crystalIndex(crystalIndex), _soundResource(vm) { + : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal), _crystalIndex(crystalIndex) { static const uint32 kSsScene2804CrystalButtonFileHashes1[] = { 0x911101B0, @@ -1486,7 +1483,7 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280 _deltaRect = _drawRect; processDelta(); setVisible(false); - _soundResource.load(0x44045140); + loadSound(0, 0x44045140); _needRefresh = true; SetUpdateHandler(&SsScene2804CrystalButton::update); SetMessageHandler(&SsScene2804CrystalButton::handleMessage); @@ -1504,7 +1501,7 @@ uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessagePara switch (messageNum) { case 0x1011: if (_countdown == 0 && !_parentScene->isWorking()) { - _soundResource.play(); + playSound(0); setVisible(true); _countdown = 4; _asCrystal->activate(); @@ -1516,8 +1513,7 @@ uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessagePara } AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody) - : AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), - _countdown(0), _soundResource(vm) { + : AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), _countdown(0) { createSurface1(0x00494891, 1000); _x = 125; @@ -1525,7 +1521,7 @@ AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene setVisible(false); _needRefresh = true; AnimatedSprite::updatePosition(); - _soundResource.load(0x6352F051); + loadSound(0, 0x6352F051); _vm->_soundMan->addSound(0xC5EA0B28, 0xEF56B094); SetUpdateHandler(&AsScene2804BeamCoil::update); SetMessageHandler(&AsScene2804BeamCoil::handleMessage); @@ -1564,7 +1560,7 @@ void AsScene2804BeamCoil::show() { // TODO _ssBeamCoilBody->update(); -> show() setVisible(true); startAnimation(0x00494891, 0, -1); - _soundResource.play(); + playSound(0); SetMessageHandler(&AsScene2804BeamCoil::hmBeaming); NextState(&AsScene2804BeamCoil::stBeaming); } @@ -1842,7 +1838,7 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entit } AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _soundResource(vm) { + : AnimatedSprite(vm, 1200) { createSurface1(0x04211490, 1200); _x = 378; @@ -1857,7 +1853,7 @@ uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: - _soundResource.play(0x48640244); + playSound(0, 0x48640244); startAnimation(0x04211490, 0, -1); setVisible(true); break; @@ -2137,10 +2133,7 @@ void SsScene2808Dispenser::startCountdown(int index) { } AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser) - : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser), - _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _soundResource4(vm), _soundResource5(vm), _soundResource6(vm), - _soundResource7(vm), _soundResource8(vm), _soundResource9(vm), _fillLevel(0) { + : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser), _fillLevel(0) { if (testTubeSetNum == 0) { _x = 504; @@ -2154,16 +2147,16 @@ AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum createSurface1(kClass490FileHashes[testTubeIndex], 1100); if (testTubeSetNum == 0) { - _soundResource1.load(0x30809E2D); - _soundResource2.load(0x72811E2D); - _soundResource3.load(0x78B01625); + loadSound(0, 0x30809E2D); + loadSound(1, 0x72811E2D); + loadSound(2, 0x78B01625); } else { - _soundResource4.load(0x70A41E0C); - _soundResource5.load(0x50205E2D); - _soundResource6.load(0xF8621E2D); - _soundResource7.load(0xF1A03C2D); - _soundResource8.load(0x70A43D2D); - _soundResource9.load(0xF0601E2D); + loadSound(3, 0x70A41E0C); + loadSound(4, 0x50205E2D); + loadSound(5, 0xF8621E2D); + loadSound(6, 0xF1A03C2D); + loadSound(7, 0x70A43D2D); + loadSound(8, 0xF0601E2D); } startAnimation(kClass490FileHashes[testTubeIndex], 0, -1); @@ -2194,16 +2187,18 @@ void AsScene2808TestTube::fill() { if ((int)_fillLevel >= _testTubeSetNum * 3 + 3) return; + // TODO Remove the two switches + if (_testTubeSetNum == 0) { switch (_fillLevel) { case 0: - _soundResource1.play(); + playSound(0); break; case 1: - _soundResource2.play(); + playSound(1); break; case 2: - _soundResource3.play(); + playSound(2); break; } setVisible(true); @@ -2212,22 +2207,22 @@ void AsScene2808TestTube::fill() { } else { switch (_fillLevel) { case 0: - _soundResource4.play(); + playSound(3); break; case 1: - _soundResource5.play(); + playSound(4); break; case 2: - _soundResource6.play(); + playSound(5); break; case 3: - _soundResource7.play(); + playSound(6); break; case 4: - _soundResource8.play(); + playSound(7); break; case 5: - _soundResource9.play(); + playSound(8); break; } setVisible(true); @@ -2252,10 +2247,9 @@ void AsScene2808TestTube::flush() { } AsScene2808Handle::AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) - : AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false), - _soundResource(vm) { + : AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false) { - _soundResource.load(0xE18D1F30); + loadSound(0, 0xE18D1F30); _x = 320; _y = 240; if (_testTubeSetNum == 1) @@ -2275,7 +2269,7 @@ uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam ¶ case 0x1011: if (!_isActivated) { sendMessage(_parentScene, 0x2001, 0); - _soundResource.play(); + playSound(0); activate(); } messageResult = 1; @@ -2308,8 +2302,7 @@ void AsScene2808Handle::stActivated() { } AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), - _soundResource(vm) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum) { if (testTubeSetNum == 0) { _x = 312; @@ -2323,7 +2316,7 @@ AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int te setVisible(false); _newStickFrameIndex = 0; _needRefresh = true; - _soundResource.load(0x6389B652); + loadSound(0, 0x6389B652); SetUpdateHandler(&AnimatedSprite::update); AnimatedSprite::updatePosition(); } @@ -2343,7 +2336,7 @@ void AsScene2808Flow::start() { setVisible(true); SetMessageHandler(&AsScene2808Flow::hmFlowing); NextState(&AsScene2808Flow::stKeepFlowing); - _soundResource.play(); + playSound(0); } void AsScene2808Flow::stKeepFlowing() { @@ -2481,7 +2474,7 @@ bool Scene2808::isAnyTestTubeFilled() { } AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _soundResource(vm) { + : AnimatedSprite(vm, 1200) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2809Spew::handleMessage); @@ -2496,7 +2489,7 @@ uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: - _soundResource.play(0x48640244); + playSound(0, 0x48640244); startAnimation(0x04211490, 0, -1); setVisible(true); break; @@ -2955,7 +2948,7 @@ void AsScene2812Rope::sub413E00() { } AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm) - : AnimatedSprite(vm, 0x805D0029, 100, 320, 240), _soundResource(vm) { + : AnimatedSprite(vm, 0x805D0029, 100, 320, 240) { SetMessageHandler(&AsScene2812TrapDoor::handleMessage); _newStickFrameIndex = 0; @@ -2966,7 +2959,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa switch (messageNum) { case 0x2000: startAnimation(0x805D0029, 0, -1); - _soundResource.play(0xEA005F40); + playSound(0, 0xEA005F40); _newStickFrameIndex = -2; break; } @@ -3133,8 +3126,7 @@ void Scene2812::setPalStatus(int fadeTime) { } Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0), - _soundResource1(vm), _soundResource2(vm), _soundResource3(vm) { + : Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0) { SetMessageHandler(&Scene2822::handleMessage); SetUpdateHandler(&Scene2822::update); @@ -3145,7 +3137,7 @@ Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x0028D089, 20, 620); _ssButton = insertStaticSprite(0x1A4D4120, 1100); _ssButton->setVisible(false); - _soundResource3.load(0x19044E72); + loadSound(2, 0x19044E72); } void Scene2822::update() { @@ -3163,7 +3155,7 @@ void Scene2822::update() { _countdownStatus = 1; _countdown = 48; } else if (_countdownStatus == 1) { - _soundResource1.play(0x1384CB60); + playSound(0, 0x1384CB60); _countdownStatus = 2; _countdown = 12; } else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) { @@ -3192,12 +3184,12 @@ uint32 Scene2822::handleMessage(int messageNum, const MessageParam ¶m, Entit _ssButton->setVisible(true); _countdownStatus = 0; _countdown = 12; - _soundResource2.play(0x44061000); + playSound(1, 0x44061000); if (getGlobalVar(0x0018CA22) == 0) { setGlobalVar(0x0018CA22, 1); setGlobalVar(0x00188211, 1); SetMessageHandler(NULL); - _soundResource3.play(); + playSound(2); _mouseCursor->setVisible(false); } } diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 89e4d71b6e..b5827bff50 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -62,7 +62,6 @@ public: void setFileHashes(uint32 fileHash1, uint32 fileHash2); protected: Scene *_parentScene; - SoundResource _soundResource; uint32 _fileHash1, _fileHash2; bool _flag1, _flag2; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -149,7 +148,6 @@ class SsScene2804RedButton : public StaticSprite { public: SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene); protected: - SoundResource _soundResource; Scene2804 *_parentScene; int _countdown; void update(); @@ -179,8 +177,6 @@ class SsScene2804Flash : public StaticSprite { public: SsScene2804Flash(NeverhoodEngine *vm); void show(); -protected: - SoundResource _soundResource; }; class AsScene2804CrystalWaves : public AnimatedSprite { @@ -205,14 +201,12 @@ protected: int16 _colorNum; bool _isLightOn; bool _isShowing; - SoundResource _soundResource; }; class SsScene2804CrystalButton : public StaticSprite { public: SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex); protected: - SoundResource _soundResource; Scene2804 *_parentScene; AsScene2804Crystal *_asCrystal; uint _crystalIndex; @@ -226,7 +220,6 @@ public: AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody); virtual ~AsScene2804BeamCoil(); protected: - SoundResource _soundResource; Scene *_parentScene; SsScene2804BeamCoilBody *_ssBeamCoilBody; int _countdown; @@ -280,7 +273,6 @@ class AsScene2806Spew : public AnimatedSprite { public: AsScene2806Spew(NeverhoodEngine *vm); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -332,15 +324,6 @@ protected: int _testTubeSetNum; uint32 _fillLevel; int _testTubeIndex; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; - SoundResource _soundResource4; - SoundResource _soundResource5; - SoundResource _soundResource6; - SoundResource _soundResource7; - SoundResource _soundResource8; - SoundResource _soundResource9; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -353,7 +336,6 @@ protected: Scene *_parentScene; int _testTubeSetNum; bool _isActivated; - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmActivating(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -366,7 +348,6 @@ public: protected: Scene *_parentScene; int _testTubeSetNum; - SoundResource _soundResource; uint32 hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -398,7 +379,6 @@ class AsScene2809Spew : public AnimatedSprite { public: AsScene2809Spew(NeverhoodEngine *vm); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -468,7 +448,6 @@ class AsScene2812TrapDoor : public AnimatedSprite { public: AsScene2812TrapDoor(NeverhoodEngine *vm); protected: - SoundResource _soundResource; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -503,9 +482,6 @@ protected: int _scrollIndex; int _countdown; int _countdownStatus; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 45da15adce31f2f46d52ab8a9f81f367bcbc9e2e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 11:23:37 +0000 Subject: NEVERHOOD: Change sound stuff in Module3000 (dirty, TODO) --- engines/neverhood/module3000.cpp | 91 +++++++++++++++++++--------------------- engines/neverhood/module3000.h | 12 ------ 2 files changed, 42 insertions(+), 61 deletions(-) diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 3a6209e76a..9ccda915c8 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -456,8 +456,7 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = { }; SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene) - : StaticSprite(vm, 1400), _soundResource(vm), _parentScene(parentScene), - _flag1(false) { + : StaticSprite(vm, 1400), _parentScene(parentScene), _flag1(false) { _spriteResource.load2(0x120B24B0); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -476,12 +475,12 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc _needRefresh = true; SetUpdateHandler(&SsScene3009FireCannonButton::update); SetMessageHandler(&SsScene3009FireCannonButton::handleMessage); - _soundResource.load(0x3901B44F); + loadSound(0, 0x3901B44F); } void SsScene3009FireCannonButton::update() { StaticSprite::update(); - if (_flag1 && !_soundResource.isPlaying()) { + if (_flag1 && !isSoundPlaying(0)) { sendMessage(_parentScene, 0x2000, 0); setVisible(false); } @@ -494,7 +493,7 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP if (!_flag1 && !_parentScene->sub462E90()) { _flag1 = true; setVisible(true); - _soundResource.play(); + playSound(0); } messageResult = 1; break; @@ -575,8 +574,7 @@ void SsScene3009TargetLine::show() { } SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index) - : StaticSprite(vm, 1400), _soundResource(vm), _asSymbol(asSymbol), - _index(index), _enabled(true), _countdown(0) { + : StaticSprite(vm, 1400), _asSymbol(asSymbol), _index(index), _enabled(true), _countdown(0) { _incrDecr = _index % 2; @@ -593,7 +591,7 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy _needRefresh = true; SetUpdateHandler(&SsScene3009SymbolArrow::update); SetMessageHandler(&SsScene3009SymbolArrow::handleMessage); - _soundResource.load(0x2C852206); + loadSound(0, 0x2C852206); } void SsScene3009SymbolArrow::hide() { @@ -625,7 +623,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam _drawRect.y = 0; _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; - _soundResource.play(); + playSound(0); sendMessage(_asSymbol, 0x2005, _incrDecr); } messageResult = 1; @@ -1072,9 +1070,7 @@ static const uint32 kAsScene3010DeadBoltFileHashes1[] = { }; SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled) - : StaticSprite(vm, 900), _parentScene(parentScene), _soundResource1(vm), - _soundResource2(vm), _soundResource3(vm), _buttonLocked(false), _countdown1(0), - _countdown2(0), _buttonIndex(buttonIndex) { + : StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) { NDimensions dimensions1, dimensions2; @@ -1092,9 +1088,9 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene } else if (_buttonEnabled) { _countdown1 = initCountdown * 12 + 1; } - _soundResource1.load(0xF4217243); - _soundResource2.load(0x44049000); - _soundResource3.load(0x6408107E); + loadSound(0, 0xF4217243); + loadSound(1, 0x44049000); + loadSound(2, 0x6408107E); SetUpdateHandler(&SsScene3010DeadBoltButton::update); SetMessageHandler(&SsScene3010DeadBoltButton::handleMessage); } @@ -1102,7 +1098,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene void SsScene3010DeadBoltButton::update() { if (_countdown1 != 0 && (--_countdown1 == 0)) { - _soundResource1.play(); + playSound(0); setVisible(false); setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); } @@ -1120,8 +1116,8 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar case 0x1011: if (!_buttonLocked && _countdown1 == 0) { if (_buttonEnabled) { - _soundResource2.play(); - _soundResource3.play(); + playSound(1); + playSound(2); setVisible(true); _buttonLocked = true; sendMessage(_parentScene, 0x2000, _buttonIndex); @@ -1162,9 +1158,8 @@ void SsScene3010DeadBoltButton::setCountdown(int count) { } AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked) - : AnimatedSprite(vm, 1100), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), _unlocked(false), _locked(false), - _countdown(0) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), + _unlocked(false), _locked(false), _countdown(0) { _x = kAsScene3010DeadBoltPoints[_boltIndex].x; _y = kAsScene3010DeadBoltPoints[_boltIndex].y; @@ -1172,12 +1167,12 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) { createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); - _soundResource1.load(0x46005BC4); + loadSound(0, 0x46005BC4); } else { createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200); startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); - _soundResource1.load(0x420073DC); - _soundResource2.load(0x420073DC); + loadSound(0, 0x420073DC); + loadSound(1, 0x420073DC); } setVisible(false); @@ -1226,10 +1221,10 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) { SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); FinalizeState(&AsScene3010DeadBolt::stIdleMessage); NextState(&AsScene3010DeadBolt::stIdle); - _soundResource1.play(); + playSound(0); } _unlocked = true; - _soundResource3.load(0x4010C345); + loadSound(2, 0x4010C345); } } @@ -1248,9 +1243,9 @@ void AsScene3010DeadBolt::lock() { FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); NextState(&AsScene3010DeadBolt::stIdle); if (_soundToggle) { - _soundResource1.play(); + playSound(0); } else { - _soundResource2.play(); + playSound(1); } _soundToggle = !_soundToggle; } @@ -1267,7 +1262,7 @@ void AsScene3010DeadBolt::stDisabled() { FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); NextState(&AsScene3010DeadBolt::stIdle); _playBackwards = true; - _soundResource3.play(); + playSound(2); } void AsScene3010DeadBolt::stDisabledMessage() { @@ -1276,8 +1271,7 @@ void AsScene3010DeadBolt::stDisabledMessage() { } Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundResource(vm), _countdown(0), - _doorUnlocked(false), _checkUnlocked(false) { + : Scene(vm, parentModule, true), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) { int initCountdown = 0; @@ -1305,7 +1299,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x02622800, 20, 620); } - _soundResource.load(0x68E25540); + loadSound(0, 0x68E25540); SetMessageHandler(&Scene3010::handleMessage); SetUpdateHandler(&Scene3010::update); @@ -1369,7 +1363,7 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) { if (!getGlobalVar(0x00040153)) { setGlobalVar(0x00040153, 1); - _soundResource.play(); + playSound(0); _countdown = 60; } else { _countdown = 48; @@ -1419,15 +1413,14 @@ static const uint32 kAsScene3011SymbolFileHashes[] = { }; SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag) - : StaticSprite(vm, 1400), _parentScene(parentScene), _soundResource(vm), - _countdown(0) { + : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { if (flag) { _spriteResource.load2(0x11282020); } else { _spriteResource.load2(0x994D0433); } - _soundResource.load(0x44061000); + loadSound(0, 0x44061000); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; @@ -1459,7 +1452,7 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶ setVisible(true); _countdown = 4; sendMessage(_parentScene, 0x2000, 0); - _soundResource.play(); + playSound(0); } messageResult = 1; break; @@ -1468,22 +1461,21 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶ } AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) - : AnimatedSprite(vm, 1000), _soundResource1(vm), _soundResource2(vm), - _index(index), _flag1(flag), _flag2(false) { + : AnimatedSprite(vm, 1000), _index(index), _flag1(flag), _flag2(false) { if (flag) { _x = 310; _y = 200; createSurface1(kAsScene3011SymbolFileHashes[_index], 1200); - _soundResource1.load(0x6052C60F); - _soundResource2.load(0x6890433B); + loadSound(0, 0x6052C60F); + loadSound(1, 0x6890433B); } else { _index = 12; _x = index * 39 + 96; _y = 225; createSurface(1200, 41, 48); - _soundResource1.load(0x64428609); - _soundResource2.load(0x7080023B); + loadSound(0, 0x64428609); + loadSound(1, 0x7080023B); } setVisible(false); _needRefresh = true; @@ -1495,9 +1487,9 @@ void AsScene3011Symbol::show(bool flag) { startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1); setVisible(true); if (flag) { - _soundResource2.play(); + playSound(1); } else { - _soundResource1.play(); + playSound(0); } } @@ -1508,9 +1500,10 @@ void AsScene3011Symbol::hide() { void AsScene3011Symbol::stopSound() { if (_flag2) { - _soundResource2.stop(); + Entity::stopSound(1); } else { - _soundResource2.stop(); + // CHECKME this is wrong + //_soundResource2.stop(); } } @@ -1520,9 +1513,9 @@ void AsScene3011Symbol::change(int index, bool flag) { startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1); setVisible(true); if (flag) { - _soundResource2.play(); + playSound(1); } else { - _soundResource1.play(); + playSound(0); } } diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 2e25a0dec1..0c1df86dd6 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -50,7 +50,6 @@ public: SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene); protected: Scene3009 *_parentScene; - SoundResource _soundResource; bool _flag1; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -80,7 +79,6 @@ public: SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index); void hide(); protected: - SoundResource _soundResource; Sprite *_asSymbol; int _index; int _incrDecr; @@ -162,9 +160,6 @@ public: void setCountdown(int count); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; int _buttonIndex; bool _buttonEnabled; bool _buttonLocked; @@ -184,9 +179,6 @@ public: void unlock(bool skipAnim); protected: Scene *_parentScene; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; int _boltIndex; int _countdown; bool _soundToggle; @@ -204,7 +196,6 @@ class Scene3010 : public Scene { public: Scene3010(NeverhoodEngine *vm, Module *parentModule, int which); protected: - SoundResource _soundResource; int _countdown; bool _doorUnlocked; bool _checkUnlocked; @@ -223,7 +214,6 @@ public: SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag); protected: Scene *_parentScene; - SoundResource _soundResource; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -239,8 +229,6 @@ public: bool getFlag1() { return _flag1; } int getIndex() { return _index; } protected: - SoundResource _soundResource1; - SoundResource _soundResource2; bool _flag1; bool _flag2; int _index; -- cgit v1.2.3 From 1b3a686cac9e6c7afab2bec7545ddb18938f1447 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 14:21:47 +0000 Subject: NEVERHOOD: Fix AsScene3011Symbol --- engines/neverhood/module1600.cpp | 2 +- engines/neverhood/module3000.cpp | 7 +++---- engines/neverhood/module3000.h | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 8b35942bc0..5c890e0653 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1445,7 +1445,7 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit if (!_flag6) { if (_flag5) _asSymbols[_index3]->change(_index1 + 12, false); - _asSymbols[_index3]->stopSound(); + _asSymbols[_index3]->stopSymbolSound(); _index3++; if (_index3 >= 12) { if (testVars()) { diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 9ccda915c8..78ab74d61a 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1498,12 +1498,11 @@ void AsScene3011Symbol::hide() { setVisible(false); } -void AsScene3011Symbol::stopSound() { +void AsScene3011Symbol::stopSymbolSound() { if (_flag2) { - Entity::stopSound(1); + stopSound(1); } else { - // CHECKME this is wrong - //_soundResource2.stop(); + stopSound(0); } } diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 0c1df86dd6..2f7c21f30e 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -224,7 +224,7 @@ public: AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag); void show(bool flag); void hide(); - void stopSound(); + void stopSymbolSound(); void change(int index, bool flag); bool getFlag1() { return _flag1; } int getIndex() { return _index; } -- cgit v1.2.3 From acdc0256bb6081cc82e4453c79e37b4a651b4feb Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 14:37:58 +0000 Subject: NEVERHOOD: Change sound stuff in DiskplayerScene --- engines/neverhood/diskplayerscene.cpp | 62 ++++++++++++++--------------------- engines/neverhood/diskplayerscene.h | 3 -- 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 94a53239b1..cb37a244c4 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -194,8 +194,7 @@ void Class494::sub43BE20() { } DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene) - : StaticSprite(vm, 1400), _soundResource1(vm), _soundResource2(vm), - _diskplayerScene(diskplayerScene), _isPlaying(false) { + : StaticSprite(vm, 1400), _diskplayerScene(diskplayerScene), _isPlaying(false) { _spriteResource.load2(0x24A4A664); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -213,8 +212,8 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene processDelta(); _needRefresh = true; StaticSprite::update(); - _soundResource1.load(0x44043000); - _soundResource2.load(0x44045000); + loadSound(0, 0x44043000); + loadSound(1, 0x44045000); SetMessageHandler(&DiskplayerPlayButton::handleMessage); } @@ -243,7 +242,7 @@ void DiskplayerPlayButton::press() { if (!_isPlaying) { _surface->setVisible(true); StaticSprite::update(); - _soundResource1.play(); + playSound(0); _isPlaying = true; } } @@ -252,24 +251,23 @@ void DiskplayerPlayButton::release() { if (_isPlaying) { _surface->setVisible(false); StaticSprite::update(); - _soundResource2.play(); + playSound(1); _isPlaying = false; } } DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value) - : Entity(vm, 0), _diskplayerScene(diskplayerScene), _soundResource(vm), _elementIndex(elementIndex), - _value(value), _flag2(false), _flag(false), _countdown(0), _initialCountdown(2), - _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { + : Entity(vm, 0), _diskplayerScene(diskplayerScene), _elementIndex(elementIndex), _value(value), + _flag2(false), _flag(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { if (value != 0 && elementIndex < 20) { _inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100)); _appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[_elementIndex], 1000)); _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[_elementIndex], 1100)); - _inactiveSlot->getSurface()->setVisible(false); - _appearSlot->getSurface()->setVisible(false); - _activeSlot->getSurface()->setVisible(false); - _soundResource.load(0x46210074); + _inactiveSlot->setVisible(false); + _appearSlot->setVisible(false); + _activeSlot->setVisible(false); + loadSound(0, 0x46210074); // TODO sound panning stuff } else if (elementIndex != 20) { _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100)); @@ -281,20 +279,16 @@ DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerS void DiskplayerSlot::update() { if (_countdown != 0 && (--_countdown == 0)) { if (_flag) { - if (_inactiveSlot) { + if (_inactiveSlot) _inactiveSlot->getSurface()->setVisible(true); - } - if (_activeSlot) { + if (_activeSlot) _activeSlot->getSurface()->setVisible(false); - } _countdown = _initialCountdown / 2; } else { - if (_inactiveSlot) { + if (_inactiveSlot) _inactiveSlot->getSurface()->setVisible(false); - } - if (_activeSlot) { + if (_activeSlot) _activeSlot->getSurface()->setVisible(true); - } _countdown = _initialCountdown; } _flag = !_flag; @@ -302,44 +296,36 @@ void DiskplayerSlot::update() { } void DiskplayerSlot::appear() { - if (_inactiveSlot) { + if (_inactiveSlot) _inactiveSlot->getSurface()->setVisible(true); - } - if (_appearSlot) { + if (_appearSlot) _appearSlot->getSurface()->setVisible(true); - } - if (_inactiveSlot) { - _soundResource.play(); - } + if (_inactiveSlot) + playSound(0); } void DiskplayerSlot::play() { if (!_flag2) { - if (_inactiveSlot) { + if (_inactiveSlot) _inactiveSlot->getSurface()->setVisible(false); - } - if (_activeSlot) { + if (_activeSlot) _activeSlot->getSurface()->setVisible(true); - } _flag = true; _countdown = 0; } } void DiskplayerSlot::activate() { - if (!_flag2) { + if (!_flag2) _countdown = _initialCountdown; - } } void DiskplayerSlot::stop() { if (!_flag2) { - if (_inactiveSlot) { + if (_inactiveSlot) _inactiveSlot->getSurface()->setVisible(true); - } - if (_activeSlot) { + if (_activeSlot) _activeSlot->getSurface()->setVisible(false); - } _flag = false; _countdown = 0; } diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h index 7969a7a03b..d005f79ed6 100644 --- a/engines/neverhood/diskplayerscene.h +++ b/engines/neverhood/diskplayerscene.h @@ -48,8 +48,6 @@ public: void release(); protected: DiskplayerScene *_diskplayerScene; - SoundResource _soundResource1; - SoundResource _soundResource2; bool _isPlaying; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -64,7 +62,6 @@ public: void setFlag2(bool value) { _flag2 = value; } protected: DiskplayerScene *_diskplayerScene; - SoundResource _soundResource; Sprite *_inactiveSlot; Sprite *_appearSlot; Sprite *_activeSlot; -- cgit v1.2.3 From e97bd306824dfbe47f08060b383fd79c163ab7fd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 17:21:36 +0000 Subject: NEVERHOOD: Change sound stuff in Klayman - Also merge some more code into the Klayman class - Rename hmInsertDiskSide to hmInsertKey (also related code) --- engines/neverhood/klayman.cpp | 706 ++++++++++++++++++------------------------ engines/neverhood/klayman.h | 43 +-- 2 files changed, 312 insertions(+), 437 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index da3004dcd8..06e6a43e62 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -56,11 +56,10 @@ static const KlaymanIdleTableItem klaymanTable4[] = { // Klayman Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) - : AnimatedSprite(vm, objectPriority), _soundResource1(vm), _soundResource2(vm), _soundResource3(vm), - _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0), - _tapesToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), - _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), - _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) { + : AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), + _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), + _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), + _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); @@ -139,7 +138,7 @@ uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x04DBC02C) { - _soundResource1.play(0x44528AA1); + playSound(0, 0x44528AA1); } break; } @@ -147,7 +146,7 @@ uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity } void Klayman::evIdlePickEarDone() { - _soundResource1.stop(); + stopSound(0); } void Klayman::stDoIdleSpinHead() { @@ -169,7 +168,7 @@ uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x808A0008) { - _soundResource1.play(0xD948A340); + playSound(0, 0xD948A340); } break; } @@ -192,7 +191,7 @@ void Klayman::stIdleArms() { } void Klayman::evIdleArmsDone() { - _soundResource1.stop(); + stopSound(0); } uint32 Klayman::hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -200,11 +199,11 @@ uint32 Klayman::hmIdleArms(int messageNum, const MessageParam ¶m, Entity *se switch (messageNum) { case 0x100D: if (param.asInteger() == 0x5A0F0104) { - _soundResource1.play(0x7970A100); + playSound(0, 0x7970A100); } else if (param.asInteger() == 0x9A9A0109) { - _soundResource1.play(0xD170CF04); + playSound(0, 0xD170CF04); } else if (param.asInteger() == 0x989A2169) { - _soundResource1.play(0xD073CF14); + playSound(0, 0xD073CF14); } break; } @@ -230,7 +229,7 @@ uint32 Klayman::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *s switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0D2A0288) { - _soundResource1.play(0xD192A368); + playSound(0, 0xD192A368); } break; } @@ -256,13 +255,13 @@ uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0xC006000C) { - _soundResource1.play(0x9D406340); + playSound(0, 0x9D406340); } else if (param.asInteger() == 0x2E4A2940) { - _soundResource1.play(0x53A4A1D4); + playSound(0, 0x53A4A1D4); } else if (param.asInteger() == 0xAA0A0860) { - _soundResource1.play(0x5BE0A3C6); + playSound(0, 0x5BE0A3C6); } else if (param.asInteger() == 0xC0180260) { - _soundResource1.play(0x5D418366); + playSound(0, 0x5D418366); } break; } @@ -355,16 +354,16 @@ uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam ¶m, E if (param.asInteger() == 0xC1380080) { if (_attachedSprite) { sendMessage(_attachedSprite, 0x4806, 0); - _soundResource1.play(0xC8004340); + playSound(0, 0xC8004340); } } else if (param.asInteger() == 0x02B20220) { - _soundResource1.play(0xC5408620); + playSound(0, 0xC5408620); } else if (param.asInteger() == 0x03020231) { - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); } else if (param.asInteger() == 0x67221A03) { - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); } else if (param.asInteger() == 0x925A0C1E) { - _soundResource1.play(0x40E5884D); + playSound(0, 0x40E5884D); } break; } @@ -416,7 +415,7 @@ uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam ¶m, Ent switch (messageNum) { case 0x100D: if (param.asInteger() == 0x001A2832) { - _soundResource1.play(0xC0E4884C); + playSound(0, 0xC0E4884C); } break; } @@ -600,9 +599,9 @@ uint32 Klayman::hmStartAction(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x271AA210) { - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x2B22AA81) { - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } break; } @@ -663,7 +662,7 @@ uint32 Klayman::hmSleeping(int messageNum, const MessageParam ¶m, Entity *se switch (messageNum) { case 0x100D: if (param.asInteger() == 0x03060012) { - _soundResource1.play(0xC0238244); + playSound(0, 0xC0238244); } break; } @@ -785,13 +784,13 @@ uint32 Klayman::hmSneaking(int messageNum, const MessageParam ¶m, Entity *se switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } else if (param.asInteger() == 0x32188010) { - _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x02A2909C) { - _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); } break; case 0x3002: @@ -826,9 +825,9 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); } break; } @@ -857,9 +856,9 @@ uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sen switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); } break; } @@ -977,17 +976,17 @@ uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entit if (_attachedSprite) { sendMessage(_attachedSprite, 0x4806, 0); } - _soundResource1.play(0x40208200); + playSound(0, 0x40208200); } else if (param.asInteger() == 0x02B20220) { - _soundResource1.play(0xC5408620); + playSound(0, 0xC5408620); } else if (param.asInteger() == 0x03020231) { - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); } else if (param.asInteger() == 0x67221A03) { - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); } else if (param.asInteger() == 0x2EAE0303) { - _soundResource1.play(0x03630300); + playSound(0, 0x03630300); } else if (param.asInteger() == 0x61CE4467) { - _soundResource1.play(0x03630300); + playSound(0, 0x03630300); } break; } @@ -1015,9 +1014,9 @@ uint32 Klayman::hmPressButton(int messageNum, const MessageParam ¶m, Entity sendMessage(_attachedSprite, 0x480B, 0); } } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } break; } @@ -1107,9 +1106,9 @@ uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); else if (param.asInteger() == 0x0A2A9098) - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } return messageResult; } @@ -1168,9 +1167,9 @@ uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, else if (param.asInteger() == 0x110010D1) sendMessage(_parentScene, 0x482B, 0); else if (param.asInteger() == 0x32180101) - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); else if (param.asInteger() == 0x0A2A9098) - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); break; } return messageResult; @@ -1272,21 +1271,21 @@ uint32 Klayman::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sen switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02B20220) - _soundResource1.play(0xC5408620); + playSound(0, 0xC5408620); else if (param.asInteger() == 0x0A720138) - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); else if (param.asInteger() == 0x03020231) - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); else if (param.asInteger() == 0xB613A180) - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); else if (param.asInteger() == 0x67221A03) - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); else if (param.asInteger() == 0x038A010B) - _soundResource1.play(0x00018040); + playSound(0, 0x00018040); else if (param.asInteger() == 0x422B0280) - _soundResource1.play(0x166FC6E0); + playSound(0, 0x166FC6E0); else if (param.asInteger() == 0x925A0C1E) - _soundResource1.play(0x40E5884D); + playSound(0, 0x40E5884D); break; } return messageResult; @@ -1428,9 +1427,9 @@ uint32 Klayman::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *s switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } break; case 0x3002: @@ -1473,9 +1472,9 @@ uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *s switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } break; } @@ -1519,9 +1518,9 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *se return 0; case 0x100D: if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x405002D8); + playSound(0, 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0460E2FA); + playSound(0, 0x0460E2FA); } break; } @@ -1555,7 +1554,7 @@ uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity * } _acceptInput = true; } else if (param.asInteger() == 0x320AC306) { - _soundResource1.play(0x5860C640); + playSound(0, 0x5860C640); } else if (param.asInteger() == 0x4AB28209) { sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { @@ -1610,7 +1609,7 @@ uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity sendMessage(_attachedSprite, 0x4806, 0); } } else if (param.asInteger() == 0x320AC306) { - _soundResource1.play(0x5860C640); + playSound(0, 0x5860C640); } else if (param.asInteger() == 0x4AB28209) { sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { @@ -1733,13 +1732,13 @@ uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x489B025C) { - _soundResource1.play(0x52C4C2D7); + playSound(0, 0x52C4C2D7); } else if (param.asInteger() == 0x400A0E64) { - _soundResource1.play(0x50E081D9); + playSound(0, 0x50E081D9); } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x405002D8); + playSound(0, 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0460E2FA); + playSound(0, 0x0460E2FA); } break; } @@ -1753,9 +1752,9 @@ uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, E if (param.asInteger() == 0x01084280) { _acceptInput = true; } else if (param.asInteger() == 0x489B025C) { - _soundResource1.play(0x52C4C2D7); + playSound(0, 0x52C4C2D7); } else if (param.asInteger() == 0x400A0E64) { - _soundResource1.play(0x50E081D9); + playSound(0, 0x50E081D9); } else if (param.asInteger() == 0x02421405) { if (_ladderStatus == 1) { startAnimationByHash(0x3A292504, 0x01084280, 0); @@ -1817,9 +1816,9 @@ uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity } else if (param.asInteger() == 0x110010D1) { sendMessage(_parentScene, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(_soundFlag ? 0x48498E46 : 0x405002D8); + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(_soundFlag ? 0x50399F64 : 0x0460E2FA); + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); } break; } @@ -1873,7 +1872,7 @@ uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity * switch (messageNum) { case 0x100D: if (param.asInteger() == 0x320AC306) { - _soundResource1.play(0x5860C640); + playSound(0, 0x5860C640); } break; } @@ -1896,11 +1895,11 @@ uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Ent switch (messageNum) { case 0x100D: if (param.asInteger() == 0xC61A0119) { - _soundResource1.play(0x402338C2); + playSound(0, 0x402338C2); } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x4924AAC4); + playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0A2AA8E0); + playSound(0, 0x0A2AA8E0); } break; } @@ -1997,9 +1996,9 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Enti SetMessageHandler(&Klayman::handleMessage41D480); } } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x405002D8); + playSound(0, 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0460E2FA); + playSound(0, 0x0460E2FA); } break; case 0x480A: @@ -2125,29 +2124,27 @@ void Klayman::stInsertDisk() { } uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x06040580) { - if (_tapesToInsert == 0) { - // TODO: Calc calcHash value somewhere else - nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); - } + if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) { + nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); } else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { _tapesToInsert--; startAnimationByHash(0xD8C8D100, 0x01084280, 0); } else if (param.asInteger() == 0x062A1510) { - _soundResource1.play(0x41688704); + playSound(0, 0x41688704); } else if (param.asInteger() == 0x02B20220) { - _soundResource1.play(0xC5408620); + playSound(0, 0xC5408620); } else if (param.asInteger() == 0x0A720138) { - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); } else if (param.asInteger() == 0xB613A180) { - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); } else if (param.asInteger() == 0x0E040501) { - _soundResource1.play(0xC6A129C1); + playSound(1, 0xC6A129C1); } } - return handleMessage41D480(messageNum, param, sender); + return messageResult; } void Klayman::walkAlongPathPoints() { @@ -2232,7 +2229,7 @@ uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x040C4C01) - _soundResource1.play(0x01E11140); + playSound(0, 0x01E11140); break; } return messageResult; @@ -2276,7 +2273,7 @@ uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, E switch (messageNum) { case 0x100D: if (param.asInteger() == 0x320AC306) - _soundResource1.play(0x5860C640); + playSound(0, 0x5860C640); break; } return messageResult; @@ -2333,9 +2330,9 @@ uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam & switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4E0A2C24) { - _soundResource1.play(0x85B10BB8); + playSound(0, 0x85B10BB8); } else if (param.asInteger() == 0x4E6A0CA0) { - _soundResource1.play(0xC5B709B0); + playSound(0, 0xC5B709B0); } break; } @@ -2349,7 +2346,7 @@ uint32 Klayman::hmShrink(int messageNum, const MessageParam ¶m, Entity *send if (param.asInteger() == 0x80C110B5) sendMessage(_parentScene, 0x482A, 0); else if (param.asInteger() == 0x33288344) - _soundResource3.play(0x10688664); + playSound(2, 0x10688664); break; } return messageResult; @@ -2359,7 +2356,7 @@ void Klayman::stShrink() { _status2 = 0; _acceptInput = false; startAnimation(0x1AE88904, 0, -1); - _soundResource1.play(0x4C69EA53); + playSound(0, 0x4C69EA53); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&Klayman::hmShrink); @@ -2377,6 +2374,172 @@ void Klayman::stStandWonderAbout() { SetSpriteUpdate(NULL); } +uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + if (_potionFlag1) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } else + _potionFlag2 = true; + break; + case 0x100D: + if (param.asInteger() == 0x0002418E) + sendMessage(_parentScene, 0x2000, 0); + else if (param.asInteger() == 0x924090C2) { + _potionFlag1 = true; + if (_potionFlag2) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } + } else if (param.asInteger() == 0x004A2148) + _potionFlag1 = false; + else if (param.asInteger() == 0x02B20220) + playSound(0, 0xC5408620); + else if (param.asInteger() == 0x0A720138) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0x03020231) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0xB613A180) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x67221A03) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x038A010B) + playSound(0, 0x00018040); + else if (param.asInteger() == 0x422B0280) + playSound(0, 0x166FC6E0); + else if (param.asInteger() == 0x925A0C1E) + playSound(0, 0x40E5884D); + else if (param.asInteger() == 0x000F0082) + playSound(0, 0x546CDCC1); + else if (param.asInteger() == 0x00020814) + playSound(0, 0x786CC6D0); + else if (param.asInteger() == 0x06020500) + playSound(0, 0x1069C0E1); + else if (param.asInteger() == 0x02128C00) + playSound(0, 0x5068C4C3); + else if (param.asInteger() == 0x82022030) + playSound(0, 0x5C48C0E8); + break; + } + return messageResult; +} + +uint32 Klayman::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) + playSound(0, 0x405002D8); + else if (param.asInteger() == 0x0A2A9098) + playSound(0, 0x0460E2FA); + else if (param.asInteger() == 0xD00A0C0C) + playSound(3); + else if (param.asInteger() == 0x04121920) + playSound(4); + else if (param.asInteger() == 0x030B4480) + playSound(5); + else if (param.asInteger() == 0x422B0280) + playSound(6); + else if (param.asInteger() == 0x038A010B) + playSound(7); + else if (param.asInteger() == 0x67221A03) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x02B20220) + playSound(0, 0xC5408620); + else if (param.asInteger() == 0x925A0C1E) + playSound(0, 0x40E5884D); + else if (param.asInteger() == 0x03020231) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0x08040840) + setDoDeltaX(2); + break; + } + return messageResult; +} + +void Klayman::stGrow() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2838C010, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmGrow); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +void Klayman::stDrinkPotion() { + _status2 = 1; + _acceptInput = false; + _potionFlag1 = false; + _potionFlag2 = false; + startAnimation(0x1C388C04, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmDrinkPotion); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +uint32 Klayman::hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_keysToInsert == 0 && param.asInteger() == 0x06040580) { + nextAnimationByHash(0xDC409440, 0x46431401, 0); + } else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) { + _keysToInsert--; + startAnimationByHash(0xDC409440, 0x01084280, 0); + } else if (param.asInteger() == 0x062A1510) { + playSound(0, 0x41688704); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } else if (param.asInteger() == 0x0E4C8141) { + playSound(0, 0xDC4A1280); + } + break; + } + return messageResult; +} + +void Klayman::stInsertKey() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertKey))) { + _status2 = 2; + _keysToInsert = 0; + for (uint32 i = 0; i < 3; i++) { + if (getSubVar(0x0090EA95, i)) { + bool more; + setSubVar(0x08D0AB11, i, 1); + setSubVar(0x0090EA95, i, 0); + do { + more = false; + setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1)); + for (uint j = 0; j < i && !more; j++) { + if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i)) + more = true; + } + if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i)) + more = true; + } while (more); + _keysToInsert++; + } + } + if (_keysToInsert == 0) { + GotoState(NULL); + gotoNextStateExt(); + } else { + _acceptInput = false; + startAnimation(0xDC409440, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::spriteUpdate41F250); + SetMessageHandler(&Klayman::hmInsertKey); + _keysToInsert--; + } + } +} + //############################################################################## // KmScene1001 @@ -2641,7 +2804,7 @@ uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x4811: - _soundResource1.play(0x5252A0E4); + playSound(0, 0x5252A0E4); setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); if (_doDeltaX) { _x = ((Sprite*)sender)->getX() - 75; @@ -2697,9 +2860,9 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m } else if (param.asInteger() == 0x88001184) { sendMessage(_attachedSprite, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x405002D8); + playSound(0, 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0460E2FA); + playSound(0, 0x0460E2FA); } break; case 0x480A: @@ -2718,9 +2881,9 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam & } else if (param.asInteger() == 0x88001184) { sendMessage(_attachedSprite, 0x482B, 0); } else if (param.asInteger() == 0x32180101) { - _soundResource1.play(0x405002D8); + playSound(0, 0x405002D8); } else if (param.asInteger() == 0x0A2A9098) { - _soundResource1.play(0x0460E2FA); + playSound(0, 0x0460E2FA); } break; } @@ -2741,9 +2904,9 @@ uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m break; case 0x100D: if (param.asInteger() == 0x1A1A0785) { - _soundResource1.play(0x40F0A342); + playSound(0, 0x40F0A342); } else if (param.asInteger() == 0x60428026) { - _soundResource1.play(0x40608A59); + playSound(0, 0x40608A59); } break; } @@ -2755,7 +2918,7 @@ uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam ¶m, Ent switch (messageNum) { case 0x100D: if (param.asInteger() == 0x1307050A) { - _soundResource1.play(0x40428A09); + playSound(0, 0x40428A09); } break; } @@ -2787,7 +2950,7 @@ void KmScene1002::stJumpToRingVenusFlyTrap() { } void KmScene1002::stStandIdleSpecial() { - _soundResource1.play(0x56548280); + playSound(0, 0x56548280); _status2 = 0; _acceptInput = false; _surface->setVisible(false); @@ -2812,7 +2975,7 @@ void KmScene1002::stSpitOutFall0() { void KmScene1002::stFalling() { sendMessage(_parentScene, 0x1024, 1); - _soundResource1.play(0x41648271); + playSound(0, 0x41648271); _status2 = 1; _acceptInput = false; _isWalking = false; @@ -3166,13 +3329,13 @@ uint32 KmScene1201::hmMatch(int messageNum, const MessageParam ¶m, Entity *s if (param.asInteger() == 0x51281850) { setGlobalVar(0x20A0C516, 1); } else if (param.asInteger() == 0x43000538) { - _soundResource1.play(0x21043059); + playSound(0, 0x21043059); } else if (param.asInteger() == 0x02B20220) { - _soundResource1.play(0xC5408620); + playSound(0, 0xC5408620); } else if (param.asInteger() == 0x0A720138) { - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); } else if (param.asInteger() == 0xB613A180) { - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); } break; } @@ -3206,7 +3369,7 @@ uint32 KmScene1201::hmMoveObject(int messageNum, const MessageParam ¶m, Enti switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { - _soundResource1.play(0x405002D8); + playSound(0, 0x405002D8); if (_attachedSprite) { sendMessage(_attachedSprite, 0x480B, 0); } @@ -3228,7 +3391,7 @@ uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x100D: if (param.asInteger() == 0x000F0082) { - _soundResource1.play(0x74E2810F); + playSound(0, 0x74E2810F); } break; } @@ -3267,7 +3430,7 @@ void KmScene1201::stTumbleHeadless() { SetMessageHandler(&KmScene1201::hmTumbleHeadless); NextState(&Klayman::stTryStandIdle); sendMessage(_class464, 0x2006, 0); - _soundResource1.play(0x62E0A356); + playSound(0, 0x62E0A356); } } @@ -3310,11 +3473,11 @@ uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam ¶m, if (param.asInteger() == calcHash("PopBalloon")) { sendMessage(_parentScene, 0x2000, 0); } else if (param.asInteger() == 0x02B20220) { - _soundResource1.play(0xC5408620); + playSound(0, 0xC5408620); } else if (param.asInteger() == 0x0A720138) { - _soundResource1.play(0xD4C08010); + playSound(0, 0xD4C08010); } else if (param.asInteger() == 0xB613A180) { - _soundResource1.play(0x44051000); + playSound(0, 0x44051000); } break; } @@ -3449,17 +3612,17 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene1305::stCrashDown() { - _soundResource1.play(0x41648271); + playSound(0, 0x41648271); _status2 = 1; _acceptInput = false; startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::handleMessage41D480); - NextState(&KmScene1305::cbCrashDownEvent); + NextState(&KmScene1305::stCrashDownFinished); } -void KmScene1305::cbCrashDownEvent() { +void KmScene1305::stCrashDownFinished() { setDoDeltaX(2); stTryStandIdle(); } @@ -3590,7 +3753,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _flag1(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -3629,7 +3792,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_INSERT_DISK: if (param.asInteger() == 1) { - GotoState(&KmScene1308::stInsertDiskSide); + GotoState(&Klayman::stInsertKey); } else { GotoState(&Klayman::stInsertDisk); } @@ -3663,67 +3826,6 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene1308::hmInsertDiskSide(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (!_flag1 && param.asInteger() == 0x06040580) { - nextAnimationByHash(0xDC409440, 0x46431401, 0); - } else if (_flag1 && param.asInteger() == 0x46431401) { - _flag1 = false; - startAnimationByHash(0xDC409440, 0x01084280, 0); - } else if (param.asInteger() == 0x062A1510) { - _soundResource1.play(0x41688704); - } else if (param.asInteger() == 0x02B20220) { - _soundResource1.play(0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - _soundResource1.play(0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - _soundResource1.play(0x44051000); - } else if (param.asInteger() == 0x0E4C8141) { - _soundResource1.play(0xDC4A1280); - } - break; - } - return messageResult; -} - -void KmScene1308::stInsertDiskSide() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene1308::stInsertDiskSide))) { - _status2 = 2; - _flag1 = false; - for (uint i = 0; i < 3; i++) { - if (getSubVar(0x0090EA95, i)) { - bool more; - setSubVar(0x08D0AB11, i, 1); - setSubVar(0x0090EA95, i, 0); - do { - more = false; - setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1)); - for (uint j = 0; j < i && !more; j++) { - if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i)) - more = true; - } - if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i)) - more = true; - } while (more); - _flag1 = true; - } - } - if (!_flag1) { - gotoState(NULL); - gotoNextStateExt(); - } else { - _acceptInput = false; - startAnimation(0xDC409440, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F250); - SetMessageHandler(&KmScene1308::hmInsertDiskSide); - _flag1 = false; - } - } -} - // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4389,9 +4491,9 @@ uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam ¶m, Entit break; case 0x100D: if (param.asInteger() == 0x1A1A0785) { - _soundResource1.play(0x40F0A342); + playSound(0, 0x40F0A342); } else if (param.asInteger() == 0x60428026) { - _soundResource1.play(0x40608A59); + playSound(0, 0x40608A59); } break; } @@ -4405,7 +4507,7 @@ void KmScene2101::stHitByDoor() { SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene2101::hmHitByDoor); - _soundResource1.play(0x402E82D4); + playSound(0, 0x402E82D4); } KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) @@ -5790,17 +5892,16 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000), - _soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty if (flag) { // TODO Maybe? Don't know. Set Klayman clip rects - _soundRes1.load(0x58E0C341); - _soundRes2.load(0x40A00342); - _soundRes3.load(0xD0A1C348); - _soundRes4.load(0x166FC6E0); - _soundRes5.load(0x00018040); + loadSound(3, 0x58E0C341); + loadSound(4, 0x40A00342); + loadSound(5, 0xD0A1C348); + loadSound(6, 0x166FC6E0); + loadSound(7, 0x00018040); } _dataResource.load(0x98182003); @@ -5839,7 +5940,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4832: if (param.asInteger() == 1) { - GotoState(&KmScene2806::stDrinkPotion); + GotoState(&Klayman::stDrinkPotion); } else { GotoState(&Klayman::stUseTube); } @@ -5848,121 +5949,17 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene2806::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x1008: - if (_potionFlag1) { - startAnimationByHash(0x1C388C04, 0x004A2148, 0); - messageResult = 0; - } else - _potionFlag2 = true; - break; - case 0x100D: - if (param.asInteger() == 0x0002418E) - sendMessage(_parentScene, 0x2000, 0); - else if (param.asInteger() == 0x924090C2) { - _potionFlag1 = true; - if (_potionFlag2) { - startAnimationByHash(0x1C388C04, 0x004A2148, 0); - messageResult = 0; - } - } else if (param.asInteger() == 0x004A2148) - _potionFlag1 = false; - else if (param.asInteger() == 0x02B20220) - _soundResource1.play(0xC5408620); - else if (param.asInteger() == 0x0A720138) - _soundResource1.play(0xD4C08010); - else if (param.asInteger() == 0x03020231) - _soundResource1.play(0xD4C08010); - else if (param.asInteger() == 0xB613A180) - _soundResource1.play(0x44051000); - else if (param.asInteger() == 0x67221A03) - _soundResource1.play(0x44051000); - else if (param.asInteger() == 0x038A010B) - _soundResource1.play(0x00018040); - else if (param.asInteger() == 0x422B0280) - _soundResource1.play(0x166FC6E0); - else if (param.asInteger() == 0x925A0C1E) - _soundResource1.play(0x40E5884D); - else if (param.asInteger() == 0x00020814) - _soundResource1.play(0x786CC6D0); - else if (param.asInteger() == 0x06020500) - _soundResource1.play(0x1069C0E1); - else if (param.asInteger() == 0x02128C00) - _soundResource1.play(0x5068C4C3); - else if (param.asInteger() == 0x82022030) - _soundResource1.play(0x5C48C0E8); - break; - } - return messageResult; -} - -uint32 KmScene2806::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) - _soundResource1.play(0x405002D8); - else if (param.asInteger() == 0x0A2A9098) - _soundResource1.play(0x0460E2FA); - else if (param.asInteger() == 0xD00A0C0C) - _soundRes1.play(); - else if (param.asInteger() == 0x04121920) - _soundRes2.play(); - else if (param.asInteger() == 0x030B4480) - _soundRes3.play(); - else if (param.asInteger() == 0x422B0280) - _soundRes4.play(); - else if (param.asInteger() == 0x038A010B) - _soundRes5.play(); - else if (param.asInteger() == 0x67221A03) - _soundResource1.play(0x44051000); - else if (param.asInteger() == 0x02B20220) - _soundResource1.play(0xC5408620); - else if (param.asInteger() == 0x925A0C1E) - _soundResource1.play(0x40E5884D); - else if (param.asInteger() == 0x03020231) - _soundResource1.play(0xD4C08010); - else if (param.asInteger() == 0x08040840) - setDoDeltaX(2); - break; - } - return messageResult; -} - -void KmScene2806::stGrow() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2838C010, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2806::hmGrow); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -void KmScene2806::stDrinkPotion() { - _status2 = 1; - _acceptInput = false; - _potionFlag1 = false; - _potionFlag2 = false; - startAnimation(0x1C388C04, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2806::hmDrinkPotion); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000), - _soundRes1(vm), _soundRes2(vm), _soundRes3(vm), _soundRes4(vm), _soundRes5(vm) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { if (flag) { - // TODO Maybe? Don't know. Set Klayman clip rects - _soundRes1.load(0x58E0C341); - _soundRes2.load(0x40A00342); - _soundRes3.load(0xD0A1C348); - _soundRes4.load(0x166FC6E0); - _soundRes5.load(0x00018040); + // TODO Maybe? Don't know. Set Klayman clip rects + loadSound(3, 0x58E0C341); + loadSound(4, 0x40A00342); + loadSound(5, 0xD0A1C348); + loadSound(6, 0x166FC6E0); + loadSound(7, 0x00018040); } _dataResource.load(0x1830009A); @@ -6001,7 +5998,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4832: if (param.asInteger() == 1) { - GotoState(&KmScene2809::stDrinkPotion); + GotoState(&Klayman::stDrinkPotion); } else { GotoState(&Klayman::stUseTube); } @@ -6010,111 +6007,6 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene2809::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x1008: - if (_potionFlag1) { - startAnimationByHash(0x1C388C04, 0x004A2148, 0); - messageResult = 0; - } else - _potionFlag2 = true; - break; - case 0x100D: - if (param.asInteger() == 0x0002418E) - sendMessage(_parentScene, 0x2000, 0); - else if (param.asInteger() == 0x924090C2) { - _potionFlag1 = true; - if (_potionFlag2) { - startAnimationByHash(0x1C388C04, 0x004A2148, 0); - messageResult = 0; - } - } else if (param.asInteger() == 0x004A2148) - _potionFlag1 = false; - else if (param.asInteger() == 0x02B20220) - _soundResource1.play(0xC5408620); - else if (param.asInteger() == 0x0A720138) - _soundResource1.play(0xD4C08010); - else if (param.asInteger() == 0x03020231) - _soundResource1.play(0xD4C08010); - else if (param.asInteger() == 0xB613A180) - _soundResource1.play(0x44051000); - else if (param.asInteger() == 0x67221A03) - _soundResource1.play(0x44051000); - else if (param.asInteger() == 0x038A010B) - _soundResource1.play(0x00018040); - else if (param.asInteger() == 0x422B0280) - _soundResource1.play(0x166FC6E0); - else if (param.asInteger() == 0x925A0C1E) - _soundResource1.play(0x40E5884D); - else if (param.asInteger() == 0x000F0082) - _soundResource1.play(0x546CDCC1); - else if (param.asInteger() == 0x00020814) - _soundResource1.play(0x786CC6D0); - else if (param.asInteger() == 0x06020500) - _soundResource1.play(0x1069C0E1); - else if (param.asInteger() == 0x02128C00) - _soundResource1.play(0x5068C4C3); - else if (param.asInteger() == 0x82022030) - _soundResource1.play(0x5C48C0E8); - break; - } - return messageResult; -} - -uint32 KmScene2809::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) - _soundResource1.play(0x405002D8); - else if (param.asInteger() == 0x0A2A9098) - _soundResource1.play(0x0460E2FA); - else if (param.asInteger() == 0xD00A0C0C) - _soundRes1.play(); - else if (param.asInteger() == 0x04121920) - _soundRes2.play(); - else if (param.asInteger() == 0x030B4480) - _soundRes3.play(); - else if (param.asInteger() == 0x422B0280) - _soundRes4.play(); - else if (param.asInteger() == 0x038A010B) - _soundRes5.play(); - else if (param.asInteger() == 0x67221A03) - _soundResource1.play(0x44051000); - else if (param.asInteger() == 0x02B20220) - _soundResource1.play(0xC5408620); - else if (param.asInteger() == 0x925A0C1E) - _soundResource1.play(0x40E5884D); - else if (param.asInteger() == 0x03020231) - _soundResource1.play(0xD4C08010); - else if (param.asInteger() == 0x08040840) - setDoDeltaX(2); - break; - } - return messageResult; -} - -void KmScene2809::stGrow() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2838C010, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2809::hmGrow); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -void KmScene2809::stDrinkPotion() { - _status2 = 1; - _acceptInput = false; - _potionFlag1 = false; - _potionFlag2 = false; - startAnimation(0x1C388C04, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2809::hmDrinkPotion); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index b32143d230..a52e7f6a85 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -187,6 +187,14 @@ public: void stStandWonderAbout(); + uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); + void stGrow(); + void stDrinkPotion(); + + uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); + void stInsertKey(); + protected: Entity *_parentScene; Sprite *_attachedSprite; @@ -200,15 +208,12 @@ protected: int16 _idleCounter, _idleCounterMax; int16 _blinkCounter, _blinkCounterMax; int16 _countdown1; - int16 _tapesToInsert; + int16 _tapesToInsert, _keysToInsert; bool _flagF6; bool _isLeverDown; bool _isWalkingOpenDoorNotified; int _status2; bool _flagFA; - SoundResource _soundResource1; - SoundResource _soundResource2; - SoundResource _soundResource3; int _status3; const KlaymanIdleTableItem *_idleTable; int _idleTableCount; @@ -218,6 +223,9 @@ protected: bool _isSittingInTeleporter; + bool _potionFlag1; + bool _potionFlag2; + virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -410,7 +418,7 @@ public: protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void stCrashDown(); - void cbCrashDownEvent(); + void stCrashDownFinished(); }; class KmScene1306 : public Klayman { @@ -424,10 +432,7 @@ class KmScene1308 : public Klayman { public: KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _flag1; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmInsertDiskSide(int messageNum, const MessageParam ¶m, Entity *sender); - void stInsertDiskSide(); }; class KmScene1401 : public Klayman { @@ -651,18 +656,7 @@ public: KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount); protected: - SoundResource _soundRes1; - SoundResource _soundRes2; - SoundResource _soundRes3; - SoundResource _soundRes4; - SoundResource _soundRes5; - bool _potionFlag1; - bool _potionFlag2; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); - void stGrow(); - void stDrinkPotion(); }; class KmScene2809 : public Klayman { @@ -670,18 +664,7 @@ public: KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount); protected: - SoundResource _soundRes1; - SoundResource _soundRes2; - SoundResource _soundRes3; - SoundResource _soundRes4; - SoundResource _soundRes5; - bool _potionFlag1; - bool _potionFlag2; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); - void stGrow(); - void stDrinkPotion(); }; class KmScene2810Small : public Klayman { -- cgit v1.2.3 From 7e4faf3505c8124838f7e89b873aa6e5844b3e43 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 18:08:08 +0000 Subject: NEVERHOOD: More Klayman merging - Also clean up parameter list of two Klayman subclass constructors and send a message to the parent class instead of operating on the entities inside the Klayman class --- engines/neverhood/klayman.cpp | 462 ++++++++++++++++++--------------------- engines/neverhood/klayman.h | 47 ++-- engines/neverhood/module1000.cpp | 20 +- engines/neverhood/module1200.cpp | 21 +- engines/neverhood/module1200.h | 1 + engines/neverhood/module1300.cpp | 10 +- 6 files changed, 268 insertions(+), 293 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 06e6a43e62..1155c57e43 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2540,6 +2540,185 @@ void Klayman::stInsertKey() { } } +uint32 Klayman::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x04684052) { + _acceptInput = true; + sendMessage(_parentScene, 0x2002, 0); + } + break; + } + return messageResult; +} + +void Klayman::stReadNote() { + _status2 = 2; + _acceptInput = false; + startAnimation(0x123E9C9F, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmReadNote); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +uint32 Klayman::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + int16 speedUpFrameIndex; + switch (messageNum) { + case 0x1008: + speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); + if (_currFrameIndex < speedUpFrameIndex) { + startAnimation(0x35AA8059, speedUpFrameIndex, -1); + _y = 438; + } + messageResult = 0; + break; + case 0x100D: + if (param.asInteger() == 0x1A1A0785) { + playSound(0, 0x40F0A342); + } else if (param.asInteger() == 0x60428026) { + playSound(0, 0x40608A59); + } + break; + } + return messageResult; +} + +void Klayman::stHitByDoor() { + _status2 = 1; + _acceptInput = false; + startAnimation(0x35AA8059, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&Klayman::hmHitByDoor); + playSound(0, 0x402E82D4); +} + +uint32 Klayman::hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage41D480(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == calcHash("PopBalloon")) { + sendMessage(_parentScene, 0x2000, 0); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } + break; + } + return messageResult; +} + +void Klayman::upPeekWallBlink() { + Klayman::update(); + _blinkCounter++; + if (_blinkCounter >= _blinkCounterMax) + stPeekWallBlink(); +} + +void Klayman::stPeekWall1() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xAC20C012, 8, 37); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::handleMessage41D480); + NextState(&Klayman::stPeekWallBlink); +} + +void Klayman::stPeekWall2() { + _status2 = 1; + _acceptInput = false; + startAnimation(0xAC20C012, 43, 49); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::handleMessage41D480); +} + +void Klayman::stPeekWallBlink() { + _blinkCounter = 0; + _status2 = 0; + _acceptInput = true; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; + startAnimation(0xAC20C012, 38, 42); + SetUpdateHandler(&Klayman::upPeekWallBlink); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::handleMessage41D360); + _newStickFrameIndex = 42; +} + +void Klayman::stPeekWallReturn() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2426932E, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::hmPeekWallReturn); +} + +void Klayman::stPullHammerLever() { + if (!stStartAction(AnimationCallback(&Klayman::stPullHammerLever))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x00648953, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmPullHammerLever); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + } +} + +uint32 Klayman::hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) + sendMessage(_attachedSprite, 0x480F, 0); + break; + } + return messageResult; +} + +void Klayman::suRidePlatformDown() { + _platformDeltaY++; + _y += _platformDeltaY; + if (_y > 600) + sendMessage(this, 0x1019, 0); +} + +void Klayman::stRidePlatformDown() { + if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) { + _status2 = 1; + sendMessage(_parentScene, 0x4803, 0); + _acceptInput = false; + _platformDeltaY = 0; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::handleMessage41D360); + SetSpriteUpdate(&Klayman::suRidePlatformDown); + _vm->_soundMan->playSoundLooping(0xD3B02847); + } +} + +void Klayman::startWalkingResume(int16 frameIncr) { + // TODO Make the parameter a field and change this method back to a callback (or similar) + int16 frameIndex = getGlobalVar(0x18288913) + frameIncr; + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _isWalking = true; + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmWalking); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); + NextState(&Klayman::stUpdateWalking); + FinalizeState(&Klayman::stStartWalkingDone); +} + //############################################################################## // KmScene1001 @@ -2562,7 +2741,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stSleeping); break; case 0x480D: - GotoState(&KmScene1001::stPullLever); + GotoState(&Klayman::stPullHammerLever); break; case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); @@ -2621,34 +2800,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1001::stPullLever() { - if (!stStartAction(AnimationCallback(&KmScene1001::stPullLever))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x00648953, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1001::hmPullLever); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - } -} - -uint32 KmScene1001::hmPullLever(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x480F, 0); - } - break; - } - return messageResult; -} - // KmScene1002 -KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch) - : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _class599(class599), _ssLadderArch(ssLadderArch), - _status(0) { +KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _idleTableNum(0) { setKlaymanIdleTable1(); @@ -2656,13 +2811,13 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 void KmScene1002::xUpdate() { if (_x >= 250 && _x <= 435 && _y >= 420) { - if (_status == 0) { + if (_idleTableNum == 0) { // TODO setKlaymanIdleTable(stru_4B44C8); - _status = 1; + _idleTableNum = 1; } - } else if (_status == 1) { + } else if (_idleTableNum == 1) { setKlaymanIdleTable1(); - _status = 0; + _idleTableNum = 0; } } @@ -2780,21 +2935,17 @@ uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam switch (messageNum) { case 0x100D: if (param.asInteger() == 0x168050A0) { - if (_attachedSprite) { + if (_attachedSprite) sendMessage(_attachedSprite, 0x480F, 0); - } } else if (param.asInteger() == 0x586B0300) { - if (_otherSprite) { + if (_otherSprite) sendMessage(_otherSprite, 0x480E, 1); - } } else if (param.asInteger() == 0x4AB28209) { - if (_attachedSprite) { + if (_attachedSprite) sendMessage(_attachedSprite, 0x482A, 0); - } } else if (param.asInteger() == 0x88001184) { - if (_attachedSprite) { + if (_attachedSprite) sendMessage(_attachedSprite, 0x482B, 0); - } } break; } @@ -2969,8 +3120,7 @@ void KmScene1002::stSpitOutFall0() { SetMessageHandler(&Klayman::handleMessage41D360); SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&KmScene1002::stFalling); - sendMessage(_class599, 0x482A, 0); - sendMessage(_ssLadderArch, 0x482A, 0); + sendMessage(_parentScene, 0x8000, 0); } void KmScene1002::stFalling() { @@ -2987,8 +3137,7 @@ void KmScene1002::stFalling() { sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; - sendMessage(_class599, 0x482B, 0); - sendMessage(_ssLadderArch, 0x482B, 0); + sendMessage(_parentScene, 0x8001, 0); } void KmScene1002::stSpitOutFall2() { @@ -3000,8 +3149,7 @@ void KmScene1002::stSpitOutFall2() { SetMessageHandler(&Klayman::handleMessage41D480); SetSpriteUpdate(&KmScene1002::suFallDown); NextState(&KmScene1002::stFalling); - sendMessage(_class599, 0x482A, 0); - sendMessage(_ssLadderArch, 0x482A, 0); + sendMessage(_parentScene, 0x8000, 0); } void KmScene1002::stFallTouchdown() { @@ -3114,7 +3262,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x481E: - GotoState(&KmScene1004::stReadNote); + GotoState(&Klayman::stReadNote); break; case 0x4820: sendMessage(_parentScene, 0x2000, 0); @@ -3157,28 +3305,6 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -uint32 KmScene1004::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x04684052) { - _acceptInput = true; - sendMessage(_parentScene, 0x2002, 0); - } - break; - } - return messageResult; -} - -void KmScene1004::stReadNote() { - _status2 = 2; - _acceptInput = false; - startAnimation(0x123E9C9F, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1004::hmReadNote); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -3245,8 +3371,8 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1201 -KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464) - : Klayman(vm, parentScene, x, y, 1000, 1000), _class464(class464), _countdown(0) { +KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) { // TODO setKlaymanIdleTable(dword_4AEF10, 3); _flagF6 = true; @@ -3429,7 +3555,7 @@ void KmScene1201::stTumbleHeadless() { SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&KmScene1201::hmTumbleHeadless); NextState(&Klayman::stTryStandIdle); - sendMessage(_class464, 0x2006, 0); + sendMessage(_parentScene, 0x8000, 0); playSound(0, 0x62E0A356); } } @@ -3454,83 +3580,18 @@ KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4804: - GotoState(&KmScene1303::stPeekWall1); + GotoState(&Klayman::stPeekWall1); break; case 0x483B: - GotoState(&KmScene1303::stPeekWallReturn); + GotoState(&Klayman::stPeekWallReturn); break; case 0x483C: - GotoState(&KmScene1303::stPeekWall2); + GotoState(&Klayman::stPeekWall2); break; } return 0; } -uint32 KmScene1303::hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == calcHash("PopBalloon")) { - sendMessage(_parentScene, 0x2000, 0); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - playSound(0, 0x44051000); - } - break; - } - return messageResult; -} - -void KmScene1303::upPeekWallBlink() { - Klayman::update(); - _blinkCounter++; - if (_blinkCounter >= _blinkCounterMax) - stPeekWallBlink(); -} - -void KmScene1303::stPeekWall1() { - _status2 = 0; - _acceptInput = true; - startAnimation(0xAC20C012, 8, 37); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D480); - NextState(&KmScene1303::stPeekWallBlink); -} - -void KmScene1303::stPeekWall2() { - _status2 = 1; - _acceptInput = false; - startAnimation(0xAC20C012, 43, 49); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D480); -} - -void KmScene1303::stPeekWallBlink() { - _blinkCounter = 0; - _status2 = 0; - _acceptInput = true; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; - startAnimation(0xAC20C012, 38, 42); - SetUpdateHandler(&KmScene1303::upPeekWallBlink); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D360); - _newStickFrameIndex = 42; -} - -void KmScene1303::stPeekWallReturn() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2426932E, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1303::hmPeekWallReturn); -} - KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -4415,7 +4476,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x4811: - GotoState(&KmScene2101::stHitByDoor); + GotoState(&Klayman::stHitByDoor); break; case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { @@ -4477,39 +4538,6 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -uint32 KmScene2101::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); - int16 speedUpFrameIndex; - switch (messageNum) { - case 0x1008: - speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_currFrameIndex < speedUpFrameIndex) { - startAnimation(0x35AA8059, speedUpFrameIndex, -1); - _y = 438; - } - messageResult = 0; - break; - case 0x100D: - if (param.asInteger() == 0x1A1A0785) { - playSound(0, 0x40F0A342); - } else if (param.asInteger() == 0x60428026) { - playSound(0, 0x40608A59); - } - break; - } - return messageResult; -} - -void KmScene2101::stHitByDoor() { - _status2 = 1; - _acceptInput = false; - startAnimation(0x35AA8059, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene2101::hmHitByDoor); - playSound(0, 0x402E82D4); -} - KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) // TODO: NRect *rect1, int16 unk in Klayman ctor : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -4704,18 +4732,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene2205::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(0x18288913); - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + startWalkingResume(0); } KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -4742,7 +4759,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x4803: - GotoState(&KmScene2206::stRidePlatformDown); + GotoState(&Klayman::stRidePlatformDown); break; case 0x4804: if (param.asInteger() != 0) { @@ -4823,40 +4840,8 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2206::suRidePlatformDown() { - _yDelta++; - _y += _yDelta; - if (_y > 600) - sendMessage(this, 0x1019, 0); -} - -void KmScene2206::stRidePlatformDown() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) { - _status2 = 1; - sendMessage(_parentScene, 0x4803, 0); - _acceptInput = false; - _yDelta = 0; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteUpdate(&KmScene2206::suRidePlatformDown); - _vm->_soundMan->playSoundLooping(0xD3B02847); - } -} - void KmScene2206::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(0x18288913) + 1; - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + startWalkingResume(1); } KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -5051,18 +5036,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene2242::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(0x18288913); - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + startWalkingResume(0); } KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -5120,18 +5094,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m } void KmHallOfRecords::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(0x18288913); - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + startWalkingResume(0); } KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -5189,18 +5152,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { } void KmScene2247::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(0x18288913); - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + startWalkingResume(0); } KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a52e7f6a85..a84ef96e86 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -195,6 +195,27 @@ public: uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); void stInsertKey(); + uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); + void stReadNote(); + + uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); + void stHitByDoor(); + + uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); + void upPeekWallBlink(); + void stPeekWall1(); + void stPeekWall2(); + void stPeekWallBlink(); + void stPeekWallReturn(); + + void stPullHammerLever(); + uint32 hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender); + + void suRidePlatformDown(); + void stRidePlatformDown(); + + void startWalkingResume(int16 frameIncr); + protected: Entity *_parentScene; Sprite *_attachedSprite; @@ -226,6 +247,8 @@ protected: bool _potionFlag1; bool _potionFlag2; + int16 _platformDeltaY; + virtual void xUpdate(); virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -318,18 +341,14 @@ public: KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stPullLever(); - uint32 hmPullLever(int messageNum, const MessageParam ¶m, Entity *sender); }; class KmScene1002 : public Klayman { public: - KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Sprite *class599, Sprite *ssLadderArch); + KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - Sprite *_class599; - Sprite *_ssLadderArch; Sprite *_otherSprite; - int _status; + int _idleTableNum; void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void upSpitOutFall(); @@ -362,8 +381,6 @@ public: KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); - void stReadNote(); }; class KmScene1109 : public Klayman { @@ -375,9 +392,8 @@ protected: class KmScene1201 : public Klayman { public: - KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, Entity *class464); + KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - Entity *_class464; int _countdown; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void upMoveObject(); @@ -397,12 +413,6 @@ public: KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); - void upPeekWallBlink(); - void stPeekWall1(); - void stPeekWall2(); - void stPeekWallBlink(); - void stPeekWallReturn(); }; class KmScene1304 : public Klayman { @@ -498,8 +508,6 @@ public: KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); - void stHitByDoor(); }; class KmScene2201 : public Klayman { @@ -530,11 +538,8 @@ public: KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); ~KmScene2206(); protected: - int16 _yDelta; void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void suRidePlatformDown(); - void stRidePlatformDown(); void stStartWalkingResume(); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index f4932c03e7..1e844c75bd 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1336,28 +1336,28 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { if (_vm->_gameState.field2 == 0) { - insertKlayman(90, 226, _class599, _ssLadderArch); + insertKlayman(90, 226); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); _asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { - insertKlayman(379, 435, _class599, _ssLadderArch); + insertKlayman(379, 435); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4270); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { - insertKlayman(650, 435, _class599, _ssLadderArch); + insertKlayman(650, 435); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4478); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); _vm->_gameState.field2 = 1; } else if (which == 2) { - insertKlayman(68, 645, _class599, _ssLadderArch); + insertKlayman(68, 645); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4298); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); @@ -1365,7 +1365,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_gameState.field2 = 1; sendMessage(_klayman, 0x4820, 0); } else { - insertKlayman(90, 226, _class599, _ssLadderArch); + insertKlayman(90, 226); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4470); _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); @@ -1550,7 +1550,15 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); - break; + break; + case 0x8000: + sendMessage(_class599, 0x482A, 0); + sendMessage(_ssLadderArch, 0x482A, 0); + break; + case 0x8001: + sendMessage(_class599, 0x482B, 0); + sendMessage(_ssLadderArch, 0x482B, 0); + break; } return messageResult; } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index d6ca51b9c3..a903759ce1 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -747,7 +747,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) int16 topY1, topY2, topY3, topY4; int16 x1, x2; - Sprite *tempSprite, *class464; + Sprite *tempSprite; SetUpdateHandler(&Scene1201::update); SetMessageHandler(&Scene1201::handleMessage); @@ -791,34 +791,34 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0xA29223FA, 1200); x2 = tempSprite->getX() + tempSprite->getDrawRect().width; - class464 = insertSprite(); + _class464 = insertSprite(); debug("Scene1201: which = %d", which); if (which < 0) { - insertKlayman(364, 333, class464); + insertKlayman(364, 333); setMessageList(0x004AEC08); } else if (which == 3) { - insertKlayman(400, 329, class464); + insertKlayman(400, 329); setMessageList(0x004AEC08); } else if (which == 2) { if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { - insertKlayman(374, 333, class464); + insertKlayman(374, 333); setMessageList(0x004AEC08); } else { - insertKlayman(640, 329, class464); + insertKlayman(640, 329); setMessageList(0x004AEC20); } } else if (which == 1) { if (getGlobalVar(0xC0418A02)) { - insertKlayman(364, 333, class464); + insertKlayman(364, 333); _klayman->setDoDeltaX(1); } else { - insertKlayman(246, 333, class464); + insertKlayman(246, 333); } setMessageList(0x004AEC30); } else { - insertKlayman(0, 336, class464); + insertKlayman(0, 336); setMessageList(0x004AEC10); } @@ -989,6 +989,9 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4829: sendMessage(_asRightDoor, 0x4829, 0); + break; + case 0x8000: + sendMessage(_class464, 0x2006, 0); break; } return messageResult; diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index 1733fb43e2..b92ff9297f 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -177,6 +177,7 @@ protected: Sprite *_asLeftDoor; Sprite *_asRightDoor; Sprite *_asTape; + Sprite *_class464; bool _flag; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 1c980b0698..f3677a1d29 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -451,10 +451,10 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); if (which < 0) { - insertKlayman(380, 364, _class595, (Sprite*)NULL); + insertKlayman(380, 364); setMessageList(0x004B0868); } else { - insertKlayman(293, 330, _class595, (Sprite*)NULL); + insertKlayman(293, 330); setMessageList(0x004B0870); } @@ -587,6 +587,12 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x482B: sendMessage(_asVenusFlyTrap, 0x482A, 0); break; + case 0x8000: + sendMessage(_class595, 0x482A, 0); + break; + case 0x8001: + sendMessage(_class595, 0x482B, 0); + break; } return messageResult; } -- cgit v1.2.3 From 22cfd04b1273beab28f09a9e7a852634aa2367a8 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 1 Oct 2012 18:10:47 +0000 Subject: NEVERHOOD: Rename handleMessage41D640 --- engines/neverhood/klayman.cpp | 4 ++-- engines/neverhood/klayman.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 1155c57e43..49f88aab6d 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -342,12 +342,12 @@ void Klayman::stPickUpTube() { _acceptInput = false; startAnimation(0x0018C032, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D640); + SetMessageHandler(&Klayman::hmPickUpTube); SetSpriteUpdate(NULL); } } -uint32 Klayman::handleMessage41D640(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage41D480(messageNum, param, sender); switch (messageNum) { case 0x100D: diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a84ef96e86..77001c3424 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -318,7 +318,7 @@ protected: uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D640(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 4fef1ac9f21ba3f86dc453d1b11d9233ecd11bc0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 2 Oct 2012 07:26:05 +0000 Subject: NEVERHOOD: Some more merging and renaming in the Klayman class --- engines/neverhood/klayman.cpp | 1384 ++++++++++++++++++++--------------------- engines/neverhood/klayman.h | 128 ++-- 2 files changed, 751 insertions(+), 761 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 49f88aab6d..76a2ebf5ef 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -59,7 +59,8 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int : AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), - _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false) { + _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), + _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); @@ -134,7 +135,7 @@ void Klayman::stIdlePickEar() { } uint32 Klayman::hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x04DBC02C) { @@ -164,7 +165,7 @@ void Klayman::stIdleSpinHead() { } uint32 Klayman::hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x808A0008) { @@ -195,7 +196,7 @@ void Klayman::evIdleArmsDone() { } uint32 Klayman::hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x5A0F0104) { @@ -225,7 +226,7 @@ void Klayman::stIdleChest() { } uint32 Klayman::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0D2A0288) { @@ -251,7 +252,7 @@ void Klayman::stIdleHeadOff() { } uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0xC006000C) { @@ -275,7 +276,7 @@ void Klayman::stSitIdleTeleporter() { _idleCounter = 0; SetSpriteUpdate(NULL); SetUpdateHandler(&Klayman::upSitIdleTeleporter); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); _blinkCounter = 0; _idleCounterMax = 8; _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; @@ -309,7 +310,7 @@ void Klayman::stIdleSitBlink() { _acceptInput = true; startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); NextState(&Klayman::stIdleSitBlinkSecond); } @@ -319,7 +320,7 @@ void Klayman::stIdleSitBlinkSecond() { _acceptInput = true; startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::upSitIdleTeleporter); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } @@ -348,14 +349,12 @@ void Klayman::stPickUpTube() { } uint32 Klayman::hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0xC1380080) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4806, 0); - playSound(0, 0xC8004340); - } + sendMessage(_attachedSprite, 0x4806, 0); + playSound(0, 0xC8004340); } else if (param.asInteger() == 0x02B20220) { playSound(0, 0xC5408620); } else if (param.asInteger() == 0x03020231) { @@ -375,7 +374,7 @@ void Klayman::stTurnToUseInTeleporter() { _acceptInput = false; startAnimation(0xD229823D, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -384,7 +383,7 @@ void Klayman::stReturnFromUseInTeleporter() { _acceptInput = false; startAnimation(0x9A2801E0, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -411,7 +410,7 @@ void Klayman::stSitInTeleporter() { } uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x001A2832) { @@ -427,7 +426,7 @@ void Klayman::stGetUpFromTeleporter() { _acceptInput = false; startAnimation(0x913AB120, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(&Klayman::suUpdateDestX); } @@ -504,7 +503,7 @@ void Klayman::stTryStandIdle() { _blinkCounter = 0; _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; SetUpdateHandler(&Klayman::upIdle); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } } @@ -530,7 +529,7 @@ void Klayman::upIdle() { } } -uint32 Klayman::handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender) { Sprite::handleMessage(messageNum, param, sender); uint32 messageResult = xHandleMessage(messageNum, param); switch (messageNum) { @@ -570,13 +569,13 @@ void Klayman::stIdleBlink() { _acceptInput = true; startAnimation(0x5900C41E, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); NextState(&Klayman::stStandAround); } -uint32 Klayman::handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); +uint32 Klayman::hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextStateExt(); @@ -590,12 +589,12 @@ void Klayman::stStandAround() { _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::upIdle); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } uint32 Klayman::hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x271AA210) { @@ -644,7 +643,7 @@ void Klayman::stWakeUp() { _acceptInput = false; startAnimation(0x527AC970, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -658,7 +657,7 @@ void Klayman::stSleeping() { } uint32 Klayman::hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x03060012) { @@ -780,7 +779,7 @@ void Klayman::stWalkingDone() { } uint32 Klayman::hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { @@ -821,7 +820,7 @@ void Klayman::stStartWalkingDone() { } uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { @@ -852,7 +851,7 @@ void Klayman::spriteUpdate41F300() { } uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { @@ -942,8 +941,8 @@ void Klayman::suWalkingTestExit() { } -uint32 Klayman::handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); +uint32 Klayman::hmLever(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { @@ -969,13 +968,11 @@ void Klayman::stPickUpGeneric() { } uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0xC1380080) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4806, 0); - } + sendMessage(_attachedSprite, 0x4806, 0); playSound(0, 0x40208200); } else if (param.asInteger() == 0x02B20220) { playSound(0, 0xC5408620); @@ -1006,13 +1003,11 @@ void Klayman::stTurnPressButton() { } uint32 Klayman::hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0D01B294) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x480B, 0); - } + sendMessage(_attachedSprite, 0x480B, 0); } else if (param.asInteger() == 0x32180101) { playSound(0, 0x4924AAC4); } else if (param.asInteger() == 0x0A2A9098) { @@ -1102,7 +1097,7 @@ void Klayman::stStartWalkingSmall() { } uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) @@ -1118,7 +1113,7 @@ void Klayman::stStandIdleSmall() { _acceptInput = true; startAnimation(0x90D0D1D0, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } @@ -1127,7 +1122,7 @@ void Klayman::stWonderAboutAfterSmall() { _acceptInput = true; startAnimation(0x11C8D156, 30, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1136,7 +1131,7 @@ void Klayman::stWonderAboutHalfSmall() { _acceptInput = true; startAnimation(0x11C8D156, 0, 10); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1145,7 +1140,7 @@ void Klayman::stWonderAboutSmall() { _acceptInput = true; startAnimation(0x11C8D156, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1159,7 +1154,7 @@ void Klayman::stWalkToFrontNoStepSmall() { } uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x80C110B5) @@ -1241,7 +1236,7 @@ void Klayman::stReleaseCord() { } uint32 Klayman::hmPullCord(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { @@ -1267,7 +1262,7 @@ void Klayman::stUseTube() { } uint32 Klayman::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02B20220) @@ -1423,7 +1418,7 @@ void Klayman::suLargeStep() { } uint32 Klayman::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { @@ -1445,7 +1440,7 @@ void Klayman::stWonderAboutHalf() { _acceptInput = true; startAnimation(0xD820A114, 0, 10); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1454,7 +1449,7 @@ void Klayman::stWonderAboutAfter() { _acceptInput = true; startAnimation(0xD820A114, 30, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1468,7 +1463,7 @@ void Klayman::stTurnToUseHalf() { } uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) { @@ -1495,7 +1490,7 @@ void Klayman::stWonderAbout() { _acceptInput = true; startAnimation(0xD820A114, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1524,7 +1519,7 @@ uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *se } break; } - return handleMessage41D480(messageNum, param, sender); + return hmLowLevelAnimation(messageNum, param, sender); } void Klayman::stJumpToRing1() { @@ -1545,13 +1540,11 @@ void Klayman::setupJumpToRing() { } uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x168050A0) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4806, 0); - } + sendMessage(_attachedSprite, 0x4806, 0); _acceptInput = true; } else if (param.asInteger() == 0x320AC306) { playSound(0, 0x5860C640); @@ -1575,7 +1568,7 @@ void Klayman::stHangOnRing() { _acceptInput = true; startAnimation(0x4829E0B8, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } @@ -1601,13 +1594,11 @@ void Klayman::stJumpToRing3() { } uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x168050A0) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4806, 0); - } + sendMessage(_attachedSprite, 0x4806, 0); } else if (param.asInteger() == 0x320AC306) { playSound(0, 0x5860C640); } else if (param.asInteger() == 0x4AB28209) { @@ -1634,19 +1625,17 @@ uint32 Klayman::hmHoldRing(int messageNum, const MessageParam ¶m, Entity *se stReleaseRing(); return 0; } - return handleMessage41D360(messageNum, param, sender); + return hmLowLevel(messageNum, param, sender); } void Klayman::stReleaseRing() { _status2 = 1; _acceptInput = false; - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4807, 0); - _attachedSprite = NULL; - } + sendMessage(_attachedSprite, 0x4807, 0); + _attachedSprite = NULL; startAnimation(0xB869A4B9, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); } @@ -1669,7 +1658,7 @@ void Klayman::stContinueClimbLadderUp() { startAnimationByHash(0x3A292504, 0x01084280, 0); _newStickFrameHash = 0x01084280; SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); gotoNextStateExt(); } @@ -1728,7 +1717,7 @@ void Klayman::stClimbLadderHalf() { } uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x489B025C) { @@ -1746,7 +1735,7 @@ uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam ¶m, E } uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { @@ -1808,7 +1797,7 @@ void Klayman::stWalkToFrontNoStep() { } uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x80C110B5) { @@ -1868,7 +1857,7 @@ void Klayman::stLandOnFeet() { } uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x320AC306) { @@ -1891,7 +1880,7 @@ void Klayman::stTurnToBackToUse() { } uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0xC61A0119) { @@ -1918,13 +1907,11 @@ void Klayman::stClayDoorOpen() { } uint32 Klayman::hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x040D4186) { - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x4808, 0); - } + sendMessage(_attachedSprite, 0x4808, 0); } break; } @@ -1986,14 +1973,13 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Enti switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { - if (_attachedSprite) - sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); + sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); } else if (param.asInteger() == 0x02421405) { if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { stMoveObjectSkipTurn(); } else { FinalizeState(&Klayman::evMoveObjectTurnDone); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); } } else if (param.asInteger() == 0x32180101) { playSound(0, 0x405002D8); @@ -2005,7 +1991,7 @@ uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Enti _isMoveObjectRequested = true; return 0; } - return handleMessage41D480(messageNum, param, sender); + return hmLowLevelAnimation(messageNum, param, sender); } void Klayman::stMoveObjectSkipTurn() { @@ -2040,7 +2026,7 @@ void Klayman::stUseLever() { startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::handleMessage41E210); + SetMessageHandler(&Klayman::hmLever); NextState(&Klayman::stPullLeverDown); _acceptInput = false; } @@ -2058,7 +2044,7 @@ void Klayman::stHoldLeverDown() { startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); _isLeverDown = true; _acceptInput = true; } @@ -2067,7 +2053,7 @@ void Klayman::stUseLeverRelease() { startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::handleMessage41E210); + SetMessageHandler(&Klayman::hmLever); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stPullLeverDown); _acceptInput = false; @@ -2079,7 +2065,7 @@ void Klayman::stReleaseLever() { startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::handleMessage41E210); + SetMessageHandler(&Klayman::hmLever); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stLetGoOfLever); _acceptInput = false; @@ -2124,7 +2110,7 @@ void Klayman::stInsertDisk() { } uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) { @@ -2199,7 +2185,7 @@ void Klayman::suJumpToGrab() { } uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x168050A0) @@ -2225,7 +2211,7 @@ void Klayman::sub421230() {//stGrow } uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x040C4C01) @@ -2269,7 +2255,7 @@ void Klayman::stJumpToGrabRelease() { } uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x320AC306) @@ -2288,7 +2274,7 @@ void Klayman::stIdleTeleporterHands() { _acceptInput = true; startAnimation(0x90EF8D38, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); NextState(&Klayman::stIdleSitBlinkSecond); } @@ -2302,7 +2288,7 @@ void Klayman::stIdleTeleporterHands2() { _acceptInput = true; startAnimation(0x900F0930, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); NextState(&Klayman::stIdleSitBlinkSecond); } @@ -2326,7 +2312,7 @@ void Klayman::teleporterDisappear(uint32 fileHash) { } uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4E0A2C24) { @@ -2340,7 +2326,7 @@ uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam & } uint32 Klayman::hmShrink(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x80C110B5) @@ -2370,12 +2356,12 @@ void Klayman::stStandWonderAbout() { startAnimation(0xD820A114, 0, -1); _newStickFrameIndex = 10; SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x1008: if (_potionFlag1) { @@ -2427,7 +2413,7 @@ uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity } uint32 Klayman::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x32180101) @@ -2480,7 +2466,7 @@ void Klayman::stDrinkPotion() { } uint32 Klayman::hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); + uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (_keysToInsert == 0 && param.asInteger() == 0x06040580) { @@ -2541,7 +2527,7 @@ void Klayman::stInsertKey() { } uint32 Klayman::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x04684052) { @@ -2563,7 +2549,7 @@ void Klayman::stReadNote() { } uint32 Klayman::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); int16 speedUpFrameIndex; switch (messageNum) { case 0x1008: @@ -2596,7 +2582,7 @@ void Klayman::stHitByDoor() { } uint32 Klayman::hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == calcHash("PopBalloon")) { @@ -2626,7 +2612,7 @@ void Klayman::stPeekWall1() { startAnimation(0xAC20C012, 8, 37); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); NextState(&Klayman::stPeekWallBlink); } @@ -2636,7 +2622,7 @@ void Klayman::stPeekWall2() { startAnimation(0xAC20C012, 43, 49); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D480); + SetMessageHandler(&Klayman::hmLowLevelAnimation); } void Klayman::stPeekWallBlink() { @@ -2647,7 +2633,7 @@ void Klayman::stPeekWallBlink() { startAnimation(0xAC20C012, 38, 42); SetUpdateHandler(&Klayman::upPeekWallBlink); SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); _newStickFrameIndex = 42; } @@ -2672,7 +2658,7 @@ void Klayman::stPullHammerLever() { } uint32 Klayman::hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41E210(messageNum, param, sender); + uint32 messageResult = Klayman::hmLever(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) @@ -2697,232 +2683,29 @@ void Klayman::stRidePlatformDown() { _platformDeltaY = 0; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41D360); + SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(&Klayman::suRidePlatformDown); _vm->_soundMan->playSoundLooping(0xD3B02847); } } -void Klayman::startWalkingResume(int16 frameIncr) { - // TODO Make the parameter a field and change this method back to a callback (or similar) - int16 frameIndex = getGlobalVar(0x18288913) + frameIncr; - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); +void Klayman::stCrashDown() { + playSound(0, 0x41648271); + _status2 = 1; + _acceptInput = false; + startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); -} - -//############################################################################## - -// KmScene1001 - -KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { -} - -uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() == 2) - GotoState(&Klayman::stSleeping); - break; - case 0x480D: - GotoState(&Klayman::stPullHammerLever); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - // TODO: It's not really a point but an x1/x2 pair - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4836: - if (param.asInteger() == 1) { - sendMessage(_parentScene, 0x2002, 0); - GotoState(&Klayman::stWakeUp); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -// KmScene1002 - -KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _otherSprite(NULL), _idleTableNum(0) { - - setKlaymanIdleTable1(); - + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + NextState(&KmScene1305::stCrashDownFinished); } -void KmScene1002::xUpdate() { - if (_x >= 250 && _x <= 435 && _y >= 420) { - if (_idleTableNum == 0) { - // TODO setKlaymanIdleTable(stru_4B44C8); - _idleTableNum = 1; - } - } else if (_idleTableNum == 1) { - setKlaymanIdleTable1(); - _idleTableNum = 0; - } -} - -uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x2001: - GotoState(&KmScene1002::stStandIdleSpecial); - break; - case 0x2007: - _otherSprite = (Sprite*)param.asEntity(); - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4803: - if (param.asInteger() == 1) { - GotoState(&KmScene1002::stJumpAndFall); - } else if (param.asInteger() == 2) { - GotoState(&KmScene1002::stDropFromRing); - } - break; - case 0x4804: - GotoState(&Klayman::stPeekWall); - break; - case 0x4805: - switch (param.asInteger()) { - case 1: - GotoState(&Klayman::stJumpToRing1); - break; - case 2: - GotoState(&Klayman::stJumpToRing2); - break; - case 3: - GotoState(&Klayman::stJumpToRing3); - break; - case 4: - GotoState(&Klayman::stJumpToRing4); - break; - } - break; - case 0x480A: - GotoState(&KmScene1002::stMoveVenusFlyTrap); - break; - case 0x480D: - GotoState(&KmScene1002::stJumpToRingVenusFlyTrap); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 0) { - GotoState(&KmScene1002::stPressDoorButton); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - sub41CCE0(param.asInteger()); - break; - case 0x4820: - sendMessage(_parentScene, 0x2005, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2005, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2005, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2006, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; +void Klayman::stCrashDownFinished() { + setDoDeltaX(2); + stTryStandIdle(); } -void KmScene1002::upSpitOutFall() { +void Klayman::upSpitOutFall() { Klayman::update(); if (_countdown1 != 0 && (--_countdown1 == 0)) { _surface->setVisible(true); @@ -2930,29 +2713,25 @@ void KmScene1002::upSpitOutFall() { } } -uint32 KmScene1002::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); +uint32 Klayman::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x168050A0) { - if (_attachedSprite) - sendMessage(_attachedSprite, 0x480F, 0); + sendMessage(_attachedSprite, 0x480F, 0); } else if (param.asInteger() == 0x586B0300) { - if (_otherSprite) - sendMessage(_otherSprite, 0x480E, 1); + sendMessage(_otherSprite, 0x480E, 1); } else if (param.asInteger() == 0x4AB28209) { - if (_attachedSprite) - sendMessage(_attachedSprite, 0x482A, 0); + sendMessage(_attachedSprite, 0x482A, 0); } else if (param.asInteger() == 0x88001184) { - if (_attachedSprite) - sendMessage(_attachedSprite, 0x482B, 0); + sendMessage(_attachedSprite, 0x482B, 0); } break; } return messageResult; } -uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x4811: playSound(0, 0x5252A0E4); @@ -2976,8 +2755,8 @@ uint32 KmScene1002::hmStandIdleSpecial(int messageNum, const MessageParam ¶m return 0; } -uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); +uint32 Klayman::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x942D2081) { @@ -2994,7 +2773,7 @@ uint32 KmScene1002::hmPressDoorButton(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x100D: if (param.asInteger() == 0x01084280) { @@ -3004,7 +2783,7 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) stContinueMovingVenusFlyTrap(); } else { - SetMessageHandler(&KmScene1002::hmFirstMoveVenusFlyTrap); + SetMessageHandler(&Klayman::hmFirstMoveVenusFlyTrap); } } else if (param.asInteger() == 0x4AB28209) { sendMessage(_attachedSprite, 0x482A, 0); @@ -3020,11 +2799,11 @@ uint32 KmScene1002::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m _isMoveObjectRequested = true; return 0; } - return handleMessage41D480(messageNum, param, sender); + return hmLowLevelAnimation(messageNum, param, sender); } -uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D480(messageNum, param, sender); +uint32 Klayman::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4AB28209) { @@ -3041,9 +2820,9 @@ uint32 KmScene1002::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam & return messageResult; } -uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { int16 speedUpFrameIndex; - uint32 messageResult = handleMessage41D480(messageNum, param, sender); + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x1008: speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); @@ -3064,8 +2843,8 @@ uint32 KmScene1002::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m return messageResult; } -uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage41D360(messageNum, param, sender); +uint32 Klayman::hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x1307050A) { @@ -3076,7 +2855,7 @@ uint32 KmScene1002::hmJumpAndFall(int messageNum, const MessageParam ¶m, Ent return messageResult; } -void KmScene1002::suFallDown() { +void Klayman::suFallDown() { AnimatedSprite::updateDeltaXY(); HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { @@ -3087,20 +2866,20 @@ void KmScene1002::suFallDown() { _vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0); } -void KmScene1002::stJumpToRingVenusFlyTrap() { - if (!stStartAction(AnimationCallback(&KmScene1002::stJumpToRingVenusFlyTrap))) { +void Klayman::stJumpToRingVenusFlyTrap() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpToRingVenusFlyTrap))) { _status2 = 2; _acceptInput = false; startAnimation(0x584984B4, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1002::hmJumpToRingVenusFlyTrap); + SetMessageHandler(&Klayman::hmJumpToRingVenusFlyTrap); NextState(&Klayman::stLandOnFeet); sendMessage(_attachedSprite, 0x482B, 0); } } -void KmScene1002::stStandIdleSpecial() { +void Klayman::stStandIdleSpecial() { playSound(0, 0x56548280); _status2 = 0; _acceptInput = false; @@ -3108,22 +2887,22 @@ void KmScene1002::stStandIdleSpecial() { startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1002::hmStandIdleSpecial); + SetMessageHandler(&Klayman::hmStandIdleSpecial); } -void KmScene1002::stSpitOutFall0() { +void Klayman::stSpitOutFall0() { _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x000BAB02, 0, -1); - SetUpdateHandler(&KmScene1002::upSpitOutFall); - SetMessageHandler(&Klayman::handleMessage41D360); - SetSpriteUpdate(&KmScene1002::suFallDown); - NextState(&KmScene1002::stFalling); + SetUpdateHandler(&Klayman::upSpitOutFall); + SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(&Klayman::suFallDown); + NextState(&Klayman::stFalling); sendMessage(_parentScene, 0x8000, 0); } -void KmScene1002::stFalling() { +void Klayman::stFalling() { sendMessage(_parentScene, 0x1024, 1); playSound(0, 0x41648271); _status2 = 1; @@ -3132,45 +2911,45 @@ void KmScene1002::stFalling() { startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1002::handleMessage41D480); - NextState(&KmScene1002::stFallTouchdown); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + NextState(&Klayman::stFallTouchdown); sendMessage(_parentScene, 0x2002, 0); // TODO _callbackList = NULL; _attachedSprite = NULL; sendMessage(_parentScene, 0x8001, 0); } -void KmScene1002::stSpitOutFall2() { +void Klayman::stSpitOutFall2() { _countdown1 = 1; _status2 = 0; _acceptInput = false; startAnimation(0x9308C132, 0, -1); - SetUpdateHandler(&KmScene1002::upSpitOutFall); - SetMessageHandler(&Klayman::handleMessage41D480); - SetSpriteUpdate(&KmScene1002::suFallDown); - NextState(&KmScene1002::stFalling); + SetUpdateHandler(&Klayman::upSpitOutFall); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + SetSpriteUpdate(&Klayman::suFallDown); + NextState(&Klayman::stFalling); sendMessage(_parentScene, 0x8000, 0); } -void KmScene1002::stFallTouchdown() { +void Klayman::stFallTouchdown() { setDoDeltaX(2); stTryStandIdle(); } -void KmScene1002::stJumpAndFall() { - if (!stStartAction(AnimationCallback(&KmScene1002::stJumpAndFall))) { +void Klayman::stJumpAndFall() { + if (!stStartAction(AnimationCallback(&Klayman::stJumpAndFall))) { sendMessage(_parentScene, 0x1024, 3); _status2 = 2; _acceptInput = false; startAnimation(0xB93AB151, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::hmJumpAndFall); - SetSpriteUpdate(&KmScene1002::suFallDown); + SetMessageHandler(&Klayman::hmJumpAndFall); + SetSpriteUpdate(&Klayman::suFallDown); NextState(&Klayman::stLandOnFeet); } } -void KmScene1002::stDropFromRing() { +void Klayman::stDropFromRing() { if (_attachedSprite) { _x = _attachedSprite->getX(); sendMessage(_attachedSprite, 0x4807, 0); @@ -3180,61 +2959,545 @@ void KmScene1002::stDropFromRing() { _acceptInput = false; startAnimation(0x586984B1, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::handleMessage41D360); - SetSpriteUpdate(&KmScene1002::suFallDown); + SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(&Klayman::suFallDown); NextState(&Klayman::stLandOnFeet); } -void KmScene1002::stPressDoorButton() { +void Klayman::stPressDoorButton() { _status2 = 2; _acceptInput = true; setDoDeltaX(0); startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::hmPressDoorButton); + SetMessageHandler(&Klayman::hmPressDoorButton); SetSpriteUpdate(&Klayman::spriteUpdate41F250); } -void KmScene1002::stHitByBoxingGlove() { +void Klayman::stHitByBoxingGlove() { _status2 = 1; _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::hmHitByBoxingGlove); + SetMessageHandler(&Klayman::hmHitByBoxingGlove); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&KmScene1002::stHitByBoxingGloveDone); + FinalizeState(&Klayman::stHitByBoxingGloveDone); } -void KmScene1002::stHitByBoxingGloveDone() { +void Klayman::stHitByBoxingGloveDone() { sendMessage(_parentScene, 0x1024, 1); } -void KmScene1002::stMoveVenusFlyTrap() { - if (!stStartAction(AnimationCallback(&KmScene1002::stMoveVenusFlyTrap))) { +void Klayman::stMoveVenusFlyTrap() { + if (!stStartAction(AnimationCallback(&Klayman::stMoveVenusFlyTrap))) { _status2 = 2; _isMoveObjectRequested = false; _acceptInput = true; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x5C01A870, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); + SetMessageHandler(&Klayman::hmMoveVenusFlyTrap); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone); + FinalizeState(&Klayman::stMoveVenusFlyTrapDone); + } +} + +void Klayman::stContinueMovingVenusFlyTrap() { + _isMoveObjectRequested = false; + _acceptInput = true; + startAnimationByHash(0x5C01A870, 0x01084280, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmMoveVenusFlyTrap); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + FinalizeState(&Klayman::stMoveVenusFlyTrapDone); +} + +void Klayman::stMoveVenusFlyTrapDone() { + sendMessage(_attachedSprite, 0x482A, 0); +} + +void Klayman::suFallSkipJump() { + updateDeltaXY(); + HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); + if (hitRect->type == 0x5001) { + _y = hitRect->rect.y1; + processDelta(); + sendMessage(this, 0x1019, 0); + } +} + +void Klayman::stFallSkipJump() { + _status2 = 2; + _acceptInput = false; + startAnimationByHash(0xB93AB151, 0x40A100F8, 0); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::suFallSkipJump); + SetMessageHandler(&Klayman::hmLowLevel); + NextState(&Klayman::stLandOnFeet); +} + +void Klayman::upMoveObject() { + if (_x >= 380) + gotoNextStateExt(); + Klayman::update(); +} + +uint32 Klayman::hmMatch(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x51281850) { + setGlobalVar(0x20A0C516, 1); + } else if (param.asInteger() == 0x43000538) { + playSound(0, 0x21043059); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } + break; + } + return messageResult; +} + +void Klayman::stFetchMatch() { + if (!stStartAction(AnimationCallback(&Klayman::stFetchMatch))) { + _status2 = 0; + _acceptInput = false; + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + startAnimation(0x9CAA0218, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::hmMatch); + NextState(&Klayman::stLightMatch); + } +} + +void Klayman::stLightMatch() { + _status2 = 1; + _acceptInput = false; + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + startAnimation(0x1222A513, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::hmMatch); +} + +uint32 Klayman::hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + playSound(0, 0x405002D8); + sendMessage(_attachedSprite, 0x480B, 0); + } else if (param.asInteger() == 0x02421405) { + if (_moveObjectCountdown != 0) { + _moveObjectCountdown--; + stContinueMoveObject(); + } else { + SetMessageHandler(&Klayman::hmLowLevelAnimation); + } + } + break; + } + return Klayman::hmLowLevelAnimation(messageNum, param, sender); +} + +uint32 Klayman::hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000F0082) { + playSound(0, 0x74E2810F); + } + break; + } + return messageResult; +} + +void Klayman::stMoveObject() { + if (!stStartAction(AnimationCallback(&Klayman::stMoveObject))) { + _status2 = 2; + _acceptInput = false; + _moveObjectCountdown = 8; + setDoDeltaX(0); + startAnimation(0x0C1CA072, 0, -1); + SetUpdateHandler(&Klayman::upMoveObject); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&Klayman::hmMoveObject); + } +} + +void Klayman::stContinueMoveObject() { + _acceptInput = false; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&Klayman::upMoveObject); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&Klayman::hmMoveObject); +} + +void Klayman::stTumbleHeadless() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTumbleHeadless))) { + _status2 = 1; + _acceptInput = false; + setDoDeltaX(0); + startAnimation(0x2821C590, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&Klayman::hmTumbleHeadless); + NextState(&Klayman::stTryStandIdle); + sendMessage(_parentScene, 0x8000, 0); + playSound(0, 0x62E0A356); + } +} + +void Klayman::stCloseEyes() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stCloseEyes))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klayman::hmLowLevel); + } +} + +uint32 Klayman::hmSpit(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x16401CA6) { + _canSpitPipe = true; + if (_contSpitPipe) + spitIntoPipe(); + } else if (param.asInteger() == 0xC11C0008) { + _canSpitPipe = false; + _acceptInput = false; + _readyToSpit = false; + } else if (param.asInteger() == 0x018A0001) { + sendMessage(_parentScene, 0x2001, _spitDestPipeIndex); + } + break; + } + return messageResult; +} + +void Klayman::stTrySpitIntoPipe() { + if (_readyToSpit) { + _contSpitPipe = true; + _spitContDestPipeIndex = _spitPipeIndex; + if (_canSpitPipe) + spitIntoPipe(); + } else if (!stStartAction(AnimationCallback(&Klayman::stTrySpitIntoPipe))) { + _status2 = 2; + _acceptInput = true; + _spitDestPipeIndex = _spitPipeIndex; + _readyToSpit = true; + _canSpitPipe = false; + _contSpitPipe = false; + startAnimation(0x1808B150, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmSpit); + SetSpriteUpdate(NULL); + } +} + +void Klayman::spitIntoPipe() { + _contSpitPipe = false; + _spitDestPipeIndex = _spitContDestPipeIndex; + _canSpitPipe = false; + _acceptInput = false; + startAnimation(0x1B08B553, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmSpit); + SetSpriteUpdate(NULL); + NextState(&Klayman::stContSpitIntoPipe); +} + +void Klayman::stContSpitIntoPipe() { + _canSpitPipe = true; + _acceptInput = true; + startAnimationByHash(0x1808B150, 0x16401CA6, 0); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmSpit); + SetSpriteUpdate(NULL); +} + +void Klayman::suRidePlatform() { + _x = _attachedSprite->getX() - 20; + _y = _attachedSprite->getY() + 46; + processDelta(); +} + +void Klayman::stRidePlatform() { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatform))) { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::suRidePlatform); + SetMessageHandler(&Klayman::hmLowLevel); + } +} + +void Klayman::stInteractLever() { + if (!stStartAction(AnimationCallback(&Klayman::stInteractLever))) { + _status2 = 0; + if (_isLeverDown) { + stUseLeverRelease(); + } else { + _acceptInput = false; + startAnimation(0x0C303040, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::suUpdateDestX); + SetMessageHandler(&Klayman::hmLever); + NextState(&Klayman::stPullLever); + } + } +} + +void Klayman::stPullLever() { + startAnimation(0x0D318140, 0, -1); + sendMessage(_attachedSprite, 0x480F, 0); + NextState(&Klayman::stLookLeverDown); +} + +void Klayman::stLookLeverDown() { + startAnimation(0x1564A2C0, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::suUpdateDestX); + NextState(&Klayman::stWaitLeverDown); + _acceptInput = true; + _isLeverDown = true; +} + +void Klayman::stWaitLeverDown() { + startAnimation(0x4464A440, 0, -1); + SetUpdateHandler(&Klayman::update); + SetSpriteUpdate(&Klayman::suUpdateDestX); + SetMessageHandler(&Klayman::hmLowLevel); + _acceptInput = true; + _isLeverDown = true; +} + +void Klayman::startWalkingResume(int16 frameIncr) { + // TODO Make the parameter a field and change this method back to a callback (or similar) + int16 frameIndex = getGlobalVar(0x18288913) + frameIncr; + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _isWalking = true; + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmWalking); + SetSpriteUpdate(&Klayman::spriteUpdate41F300); + NextState(&Klayman::stUpdateWalking); + FinalizeState(&Klayman::stStartWalkingDone); +} + +//############################################################################## + +// KmScene1001 + +KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { +} + +uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() == 2) + GotoState(&Klayman::stSleeping); + break; + case 0x480D: + GotoState(&Klayman::stPullHammerLever); + break; + case NM_KLAYMAN_PICKUP: + GotoState(&Klayman::stPickUpGeneric); + break; + case NM_KLAYMAN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klayman::stStampFloorButton); + } else { + GotoState(&Klayman::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + // TODO: It's not really a point but an x1/x2 pair + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klayman::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klayman::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klayman::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klayman::stTurnAwayFromUse); + } else { + GotoState(&Klayman::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4836: + if (param.asInteger() == 1) { + sendMessage(_parentScene, 0x2002, 0); + GotoState(&Klayman::stWakeUp); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +// KmScene1002 + +KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + + setKlaymanIdleTable1(); + +} + +void KmScene1002::xUpdate() { + if (_x >= 250 && _x <= 435 && _y >= 420) { + if (_idleTableNum == 0) { + // TODO setKlaymanIdleTable(stru_4B44C8); + _idleTableNum = 1; + } + } else if (_idleTableNum == 1) { + setKlaymanIdleTable1(); + _idleTableNum = 0; + } +} + +uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2001: + GotoState(&Klayman::stStandIdleSpecial); + break; + case 0x2007: + _otherSprite = (Sprite*)param.asEntity(); + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klayman::stTryStandIdle); + break; + case 0x4803: + if (param.asInteger() == 1) { + GotoState(&Klayman::stJumpAndFall); + } else if (param.asInteger() == 2) { + GotoState(&Klayman::stDropFromRing); + } + break; + case 0x4804: + GotoState(&Klayman::stPeekWall); + break; + case 0x4805: + switch (param.asInteger()) { + case 1: + GotoState(&Klayman::stJumpToRing1); + break; + case 2: + GotoState(&Klayman::stJumpToRing2); + break; + case 3: + GotoState(&Klayman::stJumpToRing3); + break; + case 4: + GotoState(&Klayman::stJumpToRing4); + break; + } + break; + case 0x480A: + GotoState(&Klayman::stMoveVenusFlyTrap); + break; + case 0x480D: + GotoState(&Klayman::stJumpToRingVenusFlyTrap); + break; + case NM_KLAYMAN_PRESS_BUTTON: + if (param.asInteger() == 0) { + GotoState(&Klayman::stPressDoorButton); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + sub41CCE0(param.asInteger()); + break; + case 0x4820: + sendMessage(_parentScene, 0x2005, 0); + GotoState(&Klayman::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2005, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2005, 0); + _destY = param.asInteger(); + GotoState(&Klayman::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2006, 0); + GotoState(&Klayman::stClimbLadderHalf); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klayman::stWalkToFrontNoStep); + } else { + GotoState(&Klayman::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klayman::stTurnToFront); + } else { + GotoState(&Klayman::stTurnToBack); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; } -} - -void KmScene1002::stContinueMovingVenusFlyTrap() { - _isMoveObjectRequested = false; - _acceptInput = true; - startAnimationByHash(0x5C01A870, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene1002::hmMoveVenusFlyTrap); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&KmScene1002::stMoveVenusFlyTrapDone); -} - -void KmScene1002::stMoveVenusFlyTrapDone() { - sendMessage(_attachedSprite, 0x482A, 0); + return 0; } // KmScene1004 @@ -3372,7 +3635,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1201 KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _countdown(0) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // TODO setKlaymanIdleTable(dword_4AEF10, 3); _flagF6 = true; @@ -3389,19 +3652,19 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x480A: - GotoState(&KmScene1201::stMoveObject); + GotoState(&Klayman::stMoveObject); break; case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; case 0x4813: - GotoState(&KmScene1201::stFetchMatch); + GotoState(&Klayman::stFetchMatch); break; case 0x4814: - GotoState(&KmScene1201::stTumbleHeadless); + GotoState(&Klayman::stTumbleHeadless); break; case 0x4815: - GotoState(&KmScene1201::stCloseEyes); + GotoState(&Klayman::stCloseEyes); break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 0) { @@ -3442,135 +3705,6 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1201::upMoveObject() { - if (_x >= 380) - gotoNextStateExt(); - Klayman::update(); -} - -uint32 KmScene1201::hmMatch(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x51281850) { - setGlobalVar(0x20A0C516, 1); - } else if (param.asInteger() == 0x43000538) { - playSound(0, 0x21043059); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - playSound(0, 0x44051000); - } - break; - } - return messageResult; -} - -void KmScene1201::stFetchMatch() { - if (!stStartAction(AnimationCallback(&KmScene1201::stFetchMatch))) { - _status2 = 0; - _acceptInput = false; - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - startAnimation(0x9CAA0218, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1201::hmMatch); - NextState(&KmScene1201::stLightMatch); - } -} - -void KmScene1201::stLightMatch() { - _status2 = 1; - _acceptInput = false; - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - startAnimation(0x1222A513, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&KmScene1201::hmMatch); -} - -uint32 KmScene1201::hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x01084280) { - playSound(0, 0x405002D8); - if (_attachedSprite) { - sendMessage(_attachedSprite, 0x480B, 0); - } - } else if (param.asInteger() == 0x02421405) { - if (_countdown != 0) { - _countdown--; - stMoveObjectSkipTurn(); - } else { - SetMessageHandler(&Klayman::handleMessage41D480); - } - } - break; - } - return Klayman::handleMessage41D480(messageNum, param, sender); -} - -uint32 KmScene1201::hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x000F0082) { - playSound(0, 0x74E2810F); - } - break; - } - return messageResult; -} - -void KmScene1201::stMoveObject() { - if (!stStartAction(AnimationCallback(&KmScene1201::stMoveObject))) { - _status2 = 2; - _acceptInput = false; - _countdown = 8; - setDoDeltaX(0); - startAnimation(0x0C1CA072, 0, -1); - SetUpdateHandler(&KmScene1201::upMoveObject); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::hmMoveObject); - } -} - -void KmScene1201::stMoveObjectSkipTurn() { - _acceptInput = false; - startAnimationByHash(0x0C1CA072, 0x01084280, 0); - SetUpdateHandler(&KmScene1201::upMoveObject); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::hmMoveObject); -} - -void KmScene1201::stTumbleHeadless() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stTumbleHeadless))) { - _status2 = 1; - _acceptInput = false; - setDoDeltaX(0); - startAnimation(0x2821C590, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&KmScene1201::hmTumbleHeadless); - NextState(&Klayman::stTryStandIdle); - sendMessage(_parentScene, 0x8000, 0); - playSound(0, 0x62E0A356); - } -} - -void KmScene1201::stCloseEyes() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene1201::stCloseEyes))) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D360); - } -} - KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -3662,7 +3796,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x4804: - GotoState(&KmScene1305::stCrashDown); + GotoState(&Klayman::stCrashDown); break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3672,22 +3806,6 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene1305::stCrashDown() { - playSound(0, 0x41648271); - _status2 = 1; - _acceptInput = false; - startAnimationByHash(0x000BAB02, 0x88003000, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41D480); - NextState(&KmScene1305::stCrashDownFinished); -} - -void KmScene1305::stCrashDownFinished() { - setDoDeltaX(2); - stTryStandIdle(); -} - KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -3836,7 +3954,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x480D: - GotoState(&KmScene1001::stUseLever); + GotoState(&Klayman::stUseLever); break; case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { @@ -4032,7 +4150,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x480D: - GotoState(&KmScene1001::stUseLever); + GotoState(&Klayman::stUseLever); break; case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { @@ -4261,7 +4379,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x4803: - GotoState(&KmScene1705::stFallSkipJump); + GotoState(&Klayman::stFallSkipJump); break; case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) { @@ -4329,26 +4447,6 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -void KmScene1705::suFallSkipJump() { - updateDeltaXY(); - HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); - if (hitRect->type == 0x5001) { - _y = hitRect->rect.y1; - processDelta(); - sendMessage(this, 0x1019, 0); - } -} - -void KmScene1705::stFallSkipJump() { - _status2 = 2; - _acceptInput = false; - startAnimationByHash(0xB93AB151, 0x40A100F8, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&KmScene1705::suFallSkipJump); - SetMessageHandler(&Klayman::handleMessage41D360); - NextState(&Klayman::stLandOnFeet); -} - KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -4852,11 +4950,11 @@ KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2001: - GotoState(&KmScene2207::stRidePlatform); + GotoState(&Klayman::stRidePlatform); break; case 0x2005: suRidePlatform(); - GotoState(&KmScene2207::stTryStandIdle); + GotoState(&Klayman::stTryStandIdle); break; case 0x4001: case 0x4800: @@ -4866,7 +4964,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stTryStandIdle); break; case 0x480D: - GotoState(&KmScene2207::stInteractLever); + GotoState(&Klayman::stInteractLever); break; case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); @@ -4908,63 +5006,6 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2207::suRidePlatform() { - _x = _attachedSprite->getX() - 20; - _y = _attachedSprite->getY() + 46; - processDelta(); -} - -void KmScene2207::stRidePlatform() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene2207::stRidePlatform))) { - _status2 = 1; - _acceptInput = true; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&KmScene2207::suRidePlatform); - SetMessageHandler(&Klayman::handleMessage41D360); - } -} - -void KmScene2207::stInteractLever() { - if (!stStartAction(AnimationCallback(&KmScene2207::stInteractLever))) { - _status2 = 0; - if (_isLeverDown) { - stUseLeverRelease(); - } else { - _acceptInput = false; - startAnimation(0x0C303040, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&KmScene2207::suUpdateDestX); - SetMessageHandler(&Klayman::handleMessage41E210); - NextState(&KmScene2207::stPullLever); - } - } -} - -void KmScene2207::stPullLever() { - startAnimation(0x0D318140, 0, -1); - sendMessage(_attachedSprite, 0x480F, 0); - NextState(&KmScene2207::stLookLeverDown); -} - -void KmScene2207::stLookLeverDown() { - startAnimation(0x1564A2C0, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); - NextState(&KmScene2207::stWaitLeverDown); - _acceptInput = true; - _isLeverDown = true; -} - -void KmScene2207::stWaitLeverDown() { - startAnimation(0x4464A440, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::handleMessage41D360); - _acceptInput = true; - _isLeverDown = true; -} - KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -5156,7 +5197,7 @@ void KmScene2247::stStartWalkingResume() { } KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000), _readyToSpit(false) { + : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5170,7 +5211,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klayman::stTryStandIdle); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -5225,7 +5266,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stWonderAbout); else { _spitPipeIndex = sendMessage(_parentScene, 0x2000, 0); - GotoState(&KmScene2401::stTrySpitIntoPipe); + GotoState(&Klayman::stTrySpitIntoPipe); } break; case 0x483F: @@ -5238,67 +5279,6 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -uint32 KmScene2401::hmSpit(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::handleMessage41D480(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x16401CA6) { - _canSpitPipe = true; - if (_contSpitPipe) - spitIntoPipe(); - } else if (param.asInteger() == 0xC11C0008) { - _canSpitPipe = false; - _acceptInput = false; - _readyToSpit = false; - } else if (param.asInteger() == 0x018A0001) { - sendMessage(_parentScene, 0x2001, _spitDestPipeIndex); - } - break; - } - return messageResult; -} - -void KmScene2401::stTrySpitIntoPipe() { - if (_readyToSpit) { - _contSpitPipe = true; - _spitContDestPipeIndex = _spitPipeIndex; - if (_canSpitPipe) - spitIntoPipe(); - } else if (!stStartAction(AnimationCallback(&KmScene2401::stTrySpitIntoPipe))) { - _status2 = 2; - _acceptInput = true; - _spitDestPipeIndex = _spitPipeIndex; - _readyToSpit = true; - _canSpitPipe = false; - _contSpitPipe = false; - startAnimation(0x1808B150, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2401::hmSpit); - SetSpriteUpdate(NULL); - } -} - -void KmScene2401::spitIntoPipe() { - _contSpitPipe = false; - _spitDestPipeIndex = _spitContDestPipeIndex; - _canSpitPipe = false; - _acceptInput = false; - startAnimation(0x1B08B553, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2401::hmSpit); - SetSpriteUpdate(NULL); - NextState(&KmScene2401::stContSpitIntoPipe); -} - -void KmScene2401::stContSpitIntoPipe() { - _canSpitPipe = true; - _acceptInput = true; - startAnimationByHash(0x1808B150, 0x16401CA6, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&KmScene2401::hmSpit); - SetSpriteUpdate(NULL); -} - KmScene2402::KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -5325,10 +5305,10 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPeekWall); } break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -5389,10 +5369,10 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klayman::stPullCord); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; - case 0x4816: + case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { GotoState(&Klayman::stTurnPressButton); } else if (param.asInteger() == 2) { @@ -5480,7 +5460,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klayman::stPeekWall); } break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) GotoState(&Klayman::stPickUpNeedle); else if (param.asInteger() == 1) @@ -5888,7 +5868,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4831: - GotoState(&KmScene2806::stGrow); + GotoState(&Klayman::stGrow); break; case 0x4832: if (param.asInteger() == 1) { @@ -5946,7 +5926,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x4831: - GotoState(&KmScene2809::stGrow); + GotoState(&Klayman::stGrow); break; case 0x4832: if (param.asInteger() == 1) { @@ -6033,7 +6013,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 3) GotoState(&Klayman::sub421230); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); break; case 0x4817: @@ -6122,7 +6102,7 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { _destY = param.asInteger(); GotoState(&Klayman::stJumpToGrabFall); break; - case 0x4812: + case NM_KLAYMAN_PICKUP: if (param.asInteger() == 2) GotoState(&Klayman::stPickUpNeedle); else if (param.asInteger() == 1) diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 77001c3424..4d0c969a10 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -129,10 +129,10 @@ public: void spriteUpdate41F300(); void suWalkingTestExit(); - uint32 handleMessage41D360(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41D480(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41E210(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLever(int messageNum, const MessageParam ¶m, Entity *sender); void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount); void setKlaymanIdleTable1(); @@ -214,6 +214,59 @@ public: void suRidePlatformDown(); void stRidePlatformDown(); + void stCrashDown(); + void stCrashDownFinished(); + + void upSpitOutFall(); + uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); + void suFallDown(); + void stJumpToRingVenusFlyTrap(); + void stStandIdleSpecial(); + void stSpitOutFall0(); + void stFalling(); + void stSpitOutFall2(); + void stFallTouchdown(); + void stJumpAndFall(); + void stDropFromRing(); + void stPressDoorButton(); + void stHitByBoxingGlove(); + void stHitByBoxingGloveDone(); + void stMoveVenusFlyTrap(); + void stContinueMovingVenusFlyTrap(); + void stMoveVenusFlyTrapDone(); + + void suFallSkipJump(); + void stFallSkipJump(); + + void upMoveObject(); + uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); + void stFetchMatch(); + void stLightMatch(); + uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); + void stMoveObject(); + void stContinueMoveObject(); + void stTumbleHeadless(); + void stCloseEyes(); + + uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); + void stTrySpitIntoPipe(); + void spitIntoPipe(); + void stContSpitIntoPipe(); + + void suRidePlatform(); + void stRidePlatform(); + void stInteractLever(); + void stPullLever(); + void stLookLeverDown(); + void stWaitLeverDown(); + void startWalkingResume(int16 frameIncr); protected: @@ -249,7 +302,20 @@ protected: int16 _platformDeltaY; + Sprite *_otherSprite; + int _idleTableNum; + + int _moveObjectCountdown; + + bool _canSpitPipe; + bool _contSpitPipe; + bool _readyToSpit; + uint32 _spitPipeIndex; + uint32 _spitDestPipeIndex; + uint32 _spitContDestPipeIndex; + virtual void xUpdate(); + // TODO Check if this can be turned into a void result virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void stIdlePickEar(); @@ -347,33 +413,8 @@ class KmScene1002 : public Klayman { public: KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - Sprite *_otherSprite; - int _idleTableNum; void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void upSpitOutFall(); - uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); - void suFallDown(); - void stJumpToRingVenusFlyTrap(); - void stStandIdleSpecial(); - void stSpitOutFall0(); - void stFalling(); - void stSpitOutFall2(); - void stFallTouchdown(); - void stJumpAndFall(); - void stDropFromRing(); - void stPressDoorButton(); - void stHitByBoxingGlove(); - void stHitByBoxingGloveDone(); - void stMoveVenusFlyTrap(); - void stContinueMovingVenusFlyTrap(); - void stMoveVenusFlyTrapDone(); }; class KmScene1004 : public Klayman { @@ -394,18 +435,7 @@ class KmScene1201 : public Klayman { public: KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - int _countdown; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void upMoveObject(); - uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); - void stFetchMatch(); - void stLightMatch(); - uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); - void stMoveObject(); - void stMoveObjectSkipTurn(); - void stTumbleHeadless(); - void stCloseEyes(); }; class KmScene1303 : public Klayman { @@ -427,8 +457,6 @@ public: KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stCrashDown(); - void stCrashDownFinished(); }; class KmScene1306 : public Klayman { @@ -485,8 +513,6 @@ public: KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void suFallSkipJump(); - void stFallSkipJump(); }; class KmScene1901 : public Klayman { @@ -548,12 +574,6 @@ public: KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void suRidePlatform(); - void stRidePlatform(); - void stInteractLever(); - void stPullLever(); - void stLookLeverDown(); - void stWaitLeverDown(); }; class KmScene2242 : public Klayman { @@ -587,17 +607,7 @@ class KmScene2401 : public Klayman { public: KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: - bool _canSpitPipe; - bool _contSpitPipe; - bool _readyToSpit; - uint32 _spitPipeIndex; - uint32 _spitDestPipeIndex; - uint32 _spitContDestPipeIndex; uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); - void stTrySpitIntoPipe(); - void spitIntoPipe(); - void stContSpitIntoPipe(); }; class KmScene2402 : public Klayman { -- cgit v1.2.3 From 3ef691f1afe733e21371eca11e170b8d71783f5c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 2 Oct 2012 07:52:15 +0000 Subject: NEVERHOOD: Rename - Also fix compilation (oops) --- engines/neverhood/klayman.cpp | 6 +++--- engines/neverhood/klayman.h | 28 ++++++++++++++-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 76a2ebf5ef..1036478932 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -502,13 +502,13 @@ void Klayman::stTryStandIdle() { _idleCounter = 0; _blinkCounter = 0; _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; - SetUpdateHandler(&Klayman::upIdle); + SetUpdateHandler(&Klayman::upStandIdle); SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } } -void Klayman::upIdle() { +void Klayman::upStandIdle() { update(); if (++_idleCounter >= 720) { _idleCounter = 0; @@ -588,7 +588,7 @@ void Klayman::stStandAround() { _status2 = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::upIdle); + SetUpdateHandler(&Klayman::upStandIdle); SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 4d0c969a10..a7ea670658 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -318,6 +318,19 @@ protected: // TODO Check if this can be turned into a void result virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + void startWalkToX(int16 x, bool flag); + void startWalkToXExt(int16 x); + void startWalkToXSmall(int16 x); + void startSpecialWalkLeft(int16 x); + void startSpecialWalkRight(int16 x); + void sub41CC40(int16 x1, int16 x2); + void sub41CCE0(int16 x); + + bool stStartActionFromIdle(AnimationCb callback); + void gotoNextStateExt(); + void sub41C770(); + void sub41C790(); + void stIdlePickEar(); void evIdlePickEarDone(); uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); @@ -338,20 +351,13 @@ protected: void startIdleAnimation(uint32 fileHash, AnimationCb callback); void upIdleAnimation(); - bool stStartActionFromIdle(AnimationCb callback); - void gotoNextStateExt(); - void sub41C770(); - void sub41C790(); - - void upIdle(); + void upStandIdle(); void stIdleBlink(); void stStandAround(); uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); - void startWalkToX(int16 x, bool flag); - uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); bool stStartAction(AnimationCb callback3); @@ -359,7 +365,6 @@ protected: void stSneak(); void stWalkingDone(); uint32 hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender); - void startSpecialWalkLeft(int16 x); void stStartWalking(); uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); @@ -367,10 +372,6 @@ protected: uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); - void startSpecialWalkRight(int16 x); - void sub41CC40(int16 x1, int16 x2); - void startWalkToXExt(int16 x); - void sub41CCE0(int16 x); void stLargeStepDone(); uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); @@ -393,7 +394,6 @@ protected: uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); - void startWalkToXSmall(int16 x); void stStartWalkingSmall(); uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From debc7e953d3cda85aefc2fae9325eb8ddf47d5c7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 07:08:09 +0000 Subject: NEVERHOOD: More changes to the Klayman class: - Rename some stuff - Reorder methods (in the Klayman header only until I'm happy with it :) --- engines/neverhood/klayman.cpp | 203 +++++++++--------- engines/neverhood/klayman.h | 486 +++++++++++++++++++++++------------------- 2 files changed, 368 insertions(+), 321 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 1036478932..ae08de913b 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -60,7 +60,7 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), - _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false) { + _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) { // TODO DirtySurface createSurface(surfacePriority, 320, 200); @@ -301,21 +301,21 @@ void Klayman::upSitIdleTeleporter() { } else if (++_blinkCounter >= _blinkCounterMax) { _blinkCounter = 0; _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; - stIdleSitBlink(); + stSitIdleTeleporterBlink(); } } -void Klayman::stIdleSitBlink() { +void Klayman::stSitIdleTeleporterBlink() { _status2 = 0; _acceptInput = true; startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); - NextState(&Klayman::stIdleSitBlinkSecond); + NextState(&Klayman::stSitIdleTeleporterBlinkSecond); } -void Klayman::stIdleSitBlinkSecond() { +void Klayman::stSitIdleTeleporterBlinkSecond() { _status2 = 0; _acceptInput = true; startAnimation(0x5C24C018, 0, -1); @@ -331,7 +331,7 @@ void Klayman::stPickUpNeedle() { _acceptInput = false; startAnimation(0x1449C169, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPickUpGeneric); + SetMessageHandler(&Klayman::hmPickUpObject); SetSpriteUpdate(NULL); } } @@ -675,7 +675,7 @@ bool Klayman::stStartAction(AnimationCb callback3) { startAnimation(0x5C7080D4, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartAction); - SetSpriteUpdate(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::suAction); NextState(callback3); return true; } else { @@ -684,7 +684,7 @@ bool Klayman::stStartAction(AnimationCb callback3) { } } -void Klayman::spriteUpdate41F250() { +void Klayman::suAction() { int16 xdiff = _destX - _x; @@ -715,7 +715,7 @@ void Klayman::spriteUpdate41F250() { } -void Klayman::suWalking() { +void Klayman::suSneaking() { int16 xdiff = _destX - _x; @@ -770,11 +770,11 @@ void Klayman::stSneak() { startAnimation(0x5C48C506, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmSneaking); - SetSpriteUpdate(&Klayman::suWalking); - FinalizeState(&Klayman::stWalkingDone); + SetSpriteUpdate(&Klayman::suSneaking); + FinalizeState(&Klayman::evSneakingDone); } -void Klayman::stWalkingDone() { +void Klayman::evSneakingDone() { _isSneaking = false; } @@ -810,12 +810,12 @@ void Klayman::stStartWalking() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::stStartWalkingDone); - NextState(&Klayman::stWalking); + FinalizeState(&Klayman::evStartWalkingDone); + NextState(&Klayman::stWalkingFirst); } } -void Klayman::stStartWalkingDone() { +void Klayman::evStartWalkingDone() { _isWalking = false; } @@ -833,19 +833,19 @@ uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Klayman::stWalking() { +void Klayman::stWalkingFirst() { _status2 = 0; _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - FinalizeState(&Klayman::stStartWalkingDone); - NextState(&Klayman::stUpdateWalking); + SetSpriteUpdate(&Klayman::suWalkingFirst); + FinalizeState(&Klayman::evStartWalkingDone); + NextState(&Klayman::stUpdateWalkingFirst); } -void Klayman::spriteUpdate41F300() { +void Klayman::suWalkingFirst() { SetSpriteUpdate(&Klayman::suWalkingTestExit); _deltaX = 0; } @@ -864,7 +864,7 @@ uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sen return messageResult; } -void Klayman::stUpdateWalking() { +void Klayman::stUpdateWalkingFirst() { if (_status3 == 2) { gotoNextStateExt(); } else if (_status3 == 3) { @@ -891,8 +891,8 @@ void Klayman::stUpdateWalking() { } SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmSneaking); - SetSpriteUpdate(&Klayman::suWalking); - FinalizeState(&Klayman::stWalkingDone); + SetSpriteUpdate(&Klayman::suSneaking); + FinalizeState(&Klayman::evSneakingDone); } } @@ -962,12 +962,12 @@ void Klayman::stPickUpGeneric() { _acceptInput = false; startAnimation(0x1C28C178, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPickUpGeneric); + SetMessageHandler(&Klayman::hmPickUpObject); SetSpriteUpdate(NULL); } } -uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPickUpObject(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -991,8 +991,8 @@ uint32 Klayman::hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entit } -void Klayman::stTurnPressButton() { - if (!stStartAction(AnimationCallback(&Klayman::stTurnPressButton))) { +void Klayman::stPressButton() { + if (!stStartAction(AnimationCallback(&Klayman::stPressButton))) { _status2 = 2; _acceptInput = true; startAnimation(0x1C02B03D, 0, -1); @@ -1018,8 +1018,8 @@ uint32 Klayman::hmPressButton(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Klayman::stStampFloorButton() { - if (!stStartAction(AnimationCallback(&Klayman::stStampFloorButton))) { +void Klayman::stPressFloorButton() { + if (!stStartAction(AnimationCallback(&Klayman::stPressFloorButton))) { _status2 = 2; _acceptInput = true; startAnimation(0x1C16B033, 0, -1); @@ -1036,7 +1036,7 @@ void Klayman::stPressButtonSide() { startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressButton); - SetSpriteUpdate(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::suAction); } } @@ -1093,7 +1093,7 @@ void Klayman::stStartWalkingSmall() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkingSmall); SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::stStartWalkingDone); + FinalizeState(&Klayman::evStartWalkingDone); } uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1221,7 +1221,7 @@ void Klayman::stPullCord() { _acceptInput = false; startAnimation(0x3F28E094, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPullCord); + SetMessageHandler(&Klayman::hmPullReleaseCord); SetSpriteUpdate(NULL); NextState(&Klayman::stReleaseCord); } @@ -1231,11 +1231,11 @@ void Klayman::stReleaseCord() { _acceptInput = false; startAnimation(0x3A28C094, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPullCord); + SetMessageHandler(&Klayman::hmPullReleaseCord); SetSpriteUpdate(NULL); } -uint32 Klayman::hmPullCord(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmPullReleaseCord(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1286,16 +1286,16 @@ uint32 Klayman::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sen return messageResult; } -void Klayman::stWalkingExt() { +void Klayman::stWalkingFirstExt() { _status2 = 0; _isWalking = true; _acceptInput = true; startAnimation(0x5A2CBC00, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + SetSpriteUpdate(&Klayman::suWalkingFirst); + NextState(&Klayman::stUpdateWalkingFirst); + FinalizeState(&Klayman::evStartWalkingDone); } void Klayman::stStartWalkingExt() { @@ -1308,8 +1308,8 @@ void Klayman::stStartWalkingExt() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::stStartWalkingDone); - NextState(&Klayman::stWalkingExt); + FinalizeState(&Klayman::evStartWalkingDone); + NextState(&Klayman::stWalkingFirstExt); } } @@ -1588,7 +1588,7 @@ void Klayman::stJumpToRing3() { SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmJumpToRing3); - NextState(&Klayman::stHoldRing); + NextState(&Klayman::stHoldRing3); sendMessage(_attachedSprite, 0x482B, 0); } } @@ -1611,16 +1611,16 @@ uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Klayman::stHoldRing() { +void Klayman::stHoldRing3() { _status2 = 0; _acceptInput = true; startAnimation(0x4A293FB0, 0, -1); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmHoldRing); + SetMessageHandler(&Klayman::hmHoldRing3); SetSpriteUpdate(NULL); } -uint32 Klayman::hmHoldRing(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *sender) { if (messageNum == 0x1008) { stReleaseRing(); return 0; @@ -1702,21 +1702,21 @@ void Klayman::stClimbLadderHalf() { _acceptInput = false; startAnimationByHash(0x3A292504, 0x02421405, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DFD0); + SetMessageHandler(&Klayman::hmClimbLadderHalf); SetSpriteUpdate(&Klayman::suUpdateDestX); } else if (_ladderStatus == 2) { _ladderStatus = 0; _acceptInput = false; startAnimationByHash(0x122D1505, 0x02421405, 0); SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::handleMessage41DFD0); + SetMessageHandler(&Klayman::hmClimbLadderHalf); SetSpriteUpdate(&Klayman::suUpdateDestX); } else { gotoNextStateExt(); } } -uint32 Klayman::handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmClimbLadderHalf(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -2077,10 +2077,10 @@ void Klayman::stReleaseLever() { void Klayman::stLetGoOfLever() { startAnimation(0x0928C048, 0, -1); - FinalizeState(&Klayman::cbLeverReleasedEvent); + FinalizeState(&Klayman::evLeverReleasedEvent); } -void Klayman::cbLeverReleasedEvent() { +void Klayman::evLeverReleasedEvent() { sendMessage(_attachedSprite, 0x482A, 0); } @@ -2101,7 +2101,7 @@ void Klayman::stInsertDisk() { } else { startAnimation(0xD8C8D100, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::suAction); SetMessageHandler(&Klayman::hmInsertDisk); _acceptInput = false; _tapesToInsert--; @@ -2249,8 +2249,8 @@ void Klayman::stJumpToGrabRelease() { _acceptInput = false; startAnimationByHash(0x00AB8C10, 0x320AC306, 0); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmJumpToGrabRelease); + SetSpriteUpdate(NULL); NextState(&Klayman::stReleaseRing); } @@ -2276,7 +2276,7 @@ void Klayman::stIdleTeleporterHands() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); - NextState(&Klayman::stIdleSitBlinkSecond); + NextState(&Klayman::stSitIdleTeleporterBlinkSecond); } void Klayman::stDoIdleTeleporterHands2() { @@ -2290,7 +2290,7 @@ void Klayman::stIdleTeleporterHands2() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLowLevelAnimation); SetSpriteUpdate(NULL); - NextState(&Klayman::stIdleSitBlinkSecond); + NextState(&Klayman::stSitIdleTeleporterBlinkSecond); } void Klayman::teleporterAppear(uint32 fileHash) { @@ -2519,7 +2519,7 @@ void Klayman::stInsertKey() { _acceptInput = false; startAnimation(0xDC409440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::suAction); SetMessageHandler(&Klayman::hmInsertKey); _keysToInsert--; } @@ -2676,7 +2676,7 @@ void Klayman::suRidePlatformDown() { } void Klayman::stRidePlatformDown() { - if (!stStartActionFromIdle(AnimationCallback(&KmScene2206::stRidePlatformDown))) { + if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatformDown))) { _status2 = 1; sendMessage(_parentScene, 0x4803, 0); _acceptInput = false; @@ -2697,7 +2697,7 @@ void Klayman::stCrashDown() { SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmLowLevelAnimation); - NextState(&KmScene1305::stCrashDownFinished); + NextState(&Klayman::stCrashDownFinished); } void Klayman::stCrashDownFinished() { @@ -2902,6 +2902,18 @@ void Klayman::stSpitOutFall0() { sendMessage(_parentScene, 0x8000, 0); } +void Klayman::stSpitOutFall2() { + _countdown1 = 1; + _status2 = 0; + _acceptInput = false; + startAnimation(0x9308C132, 0, -1); + SetUpdateHandler(&Klayman::upSpitOutFall); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + SetSpriteUpdate(&Klayman::suFallDown); + NextState(&Klayman::stFalling); + sendMessage(_parentScene, 0x8000, 0); +} + void Klayman::stFalling() { sendMessage(_parentScene, 0x1024, 1); playSound(0, 0x41648271); @@ -2919,18 +2931,6 @@ void Klayman::stFalling() { sendMessage(_parentScene, 0x8001, 0); } -void Klayman::stSpitOutFall2() { - _countdown1 = 1; - _status2 = 0; - _acceptInput = false; - startAnimation(0x9308C132, 0, -1); - SetUpdateHandler(&Klayman::upSpitOutFall); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(&Klayman::suFallDown); - NextState(&Klayman::stFalling); - sendMessage(_parentScene, 0x8000, 0); -} - void Klayman::stFallTouchdown() { setDoDeltaX(2); stTryStandIdle(); @@ -2971,7 +2971,7 @@ void Klayman::stPressDoorButton() { startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmPressDoorButton); - SetSpriteUpdate(&Klayman::spriteUpdate41F250); + SetSpriteUpdate(&Klayman::suAction); } void Klayman::stHitByBoxingGlove() { @@ -2981,10 +2981,10 @@ void Klayman::stHitByBoxingGlove() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmHitByBoxingGlove); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klayman::stHitByBoxingGloveDone); + FinalizeState(&Klayman::evHitByBoxingGloveDone); } -void Klayman::stHitByBoxingGloveDone() { +void Klayman::evHitByBoxingGloveDone() { sendMessage(_parentScene, 0x1024, 1); } @@ -2998,7 +2998,7 @@ void Klayman::stMoveVenusFlyTrap() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmMoveVenusFlyTrap); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klayman::stMoveVenusFlyTrapDone); + FinalizeState(&Klayman::evMoveVenusFlyTrapDone); } } @@ -3009,10 +3009,10 @@ void Klayman::stContinueMovingVenusFlyTrap() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmMoveVenusFlyTrap); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klayman::stMoveVenusFlyTrapDone); + FinalizeState(&Klayman::evMoveVenusFlyTrapDone); } -void Klayman::stMoveVenusFlyTrapDone() { +void Klayman::evMoveVenusFlyTrapDone() { sendMessage(_attachedSprite, 0x482A, 0); } @@ -3292,9 +3292,9 @@ void Klayman::startWalkingResume(int16 frameIncr) { startAnimation(0x1A249001, frameIndex, -1); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::spriteUpdate41F300); - NextState(&Klayman::stUpdateWalking); - FinalizeState(&Klayman::stStartWalkingDone); + SetSpriteUpdate(&Klayman::suWalkingFirst); + NextState(&Klayman::stUpdateWalkingFirst); + FinalizeState(&Klayman::evStartWalkingDone); } //############################################################################## @@ -3326,9 +3326,9 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -3592,7 +3592,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&Klayman::stWalking); + GotoState(&Klayman::stWalkingFirst); } else { GotoState(&Klayman::stPeekWall); } @@ -3838,9 +3838,9 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -4031,9 +4031,9 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -4510,7 +4510,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&Klayman::stWalking); + GotoState(&Klayman::stWalkingFirst); } else GotoState(&Klayman::stPeekWall); break; @@ -4587,9 +4587,9 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -4734,9 +4734,9 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -4836,6 +4836,7 @@ void KmScene2205::stStartWalkingResume() { KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { + _walkResumeFrameIncr = 1; _vm->_soundMan->addSound(0x80101800, 0xD3B02847); } @@ -4876,9 +4877,9 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -4971,9 +4972,9 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -5213,9 +5214,9 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -5300,7 +5301,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&Klayman::stWalking); + GotoState(&Klayman::stWalkingFirst); } else { GotoState(&Klayman::stPeekWall); } @@ -5310,9 +5311,9 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -5374,9 +5375,9 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case NM_KLAYMAN_PRESS_BUTTON: if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnPressButton); + GotoState(&Klayman::stPressButton); } else if (param.asInteger() == 2) { - GotoState(&Klayman::stStampFloorButton); + GotoState(&Klayman::stPressFloorButton); } else { GotoState(&Klayman::stPressButtonSide); } @@ -5455,7 +5456,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&Klayman::stWalking); + GotoState(&Klayman::stWalkingFirst); } else { GotoState(&Klayman::stPeekWall); } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index a7ea670658..89c59b6e2b 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -52,223 +52,330 @@ public: void update(); + void startIdleAnimation(uint32 fileHash, AnimationCb callback); + void upIdleAnimation(); + void stDoIdlePickEar(); + void stIdlePickEar(); + void evIdlePickEarDone(); + uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoIdleSpinHead(); + void stIdleSpinHead(); + uint32 hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoIdleArms(); + void stIdleArms(); + void evIdleArmsDone(); + uint32 hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoIdleChest(); + void stIdleChest(); + uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoIdleHeadOff(); + void stIdleHeadOff(); + uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDoIdleTeleporterHands(); + void stIdleTeleporterHands(); + + void stDoIdleTeleporterHands2(); + void stIdleTeleporterHands2(); + void stTryStandIdle(); - void stWakeUp(); - void stSleeping(); - void stPickUpGeneric(); - void stTurnPressButton(); - void stStampFloorButton(); - void stPressButtonSide(); - void stLargeStep(); - void stWonderAboutHalf(); - void stWonderAboutAfter(); - void stTurnToUseHalf(); - void stTurnAwayFromUse(); - void stWonderAbout(); - void stPeekWall(); - void stJumpToRing1(); - void setupJumpToRing(); - void stHangOnRing(); - void stJumpToRing2(); - void stJumpToRing3(); - void stHoldRing(); - void stReleaseRing(); - void stJumpToRing4(); - void stContinueClimbLadderUp(); - void stStartClimbLadderDown(); - void stClimbLadderHalf(); - void stStartClimbLadderUp(); + void stStandAround(); + void upStandIdle(); + void stIdleBlink(); + + bool stStartAction(AnimationCb callback3); + bool stStartActionFromIdle(AnimationCb callback); + uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); + + void stSneak(); + uint32 hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender); + void suSneaking(); + void evSneakingDone(); + + void stStartWalking(); + void stStartWalkingExt(); + void stWalkingOpenDoor(); + void suWalkingOpenDoor(); + void stStepOver(); + uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); + void evStartWalkingDone(); + + void stWalkingFirst(); + void stWalkingFirstExt(); + void startWalkingResume(int16 frameIncr); + void stUpdateWalkingFirst(); + uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); + void suWalkingFirst(); + void stWalkToFrontNoStep(); void stWalkToFront(); void stTurnToFront(); void stTurnToBack(); - void stLandOnFeet(); + uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); + void stTurnToBackToUse(); - void stClayDoorOpen(); - void stTurnToUse(); - void stReturnFromUse(); - void stWalkingOpenDoor(); - void stSitIdleTeleporter(); - void stIdleSitBlink(); - void stIdleSitBlinkSecond(); + uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPickUpGeneric(); void stPickUpNeedle(); - void stPickUpTube(); - void stTurnToUseInTeleporter(); - void stReturnFromUseInTeleporter(); - void stStepOver(); - void stSitInTeleporter(); - void stGetUpFromTeleporter(); - void stMoveObjectSkipTurnFaceObject(); - void evMoveObjectTurnDone(); - void stMoveObjectSkipTurn(); - void stMoveObjectFaceObject(); - void stUseLever(); - void stPullLeverDown(); - void stHoldLeverDown(); - void stUseLeverRelease(); - void stReleaseLever(); - void stLetGoOfLever(); - void cbLeverReleasedEvent(); - void stInsertDisk(); - void stWalking(); - void stUpdateWalking(); - void stStartWalkingDone(); + uint32 hmPickUpObject(int messageNum, const MessageParam ¶m, Entity *sender); - void stopWalking(); + void stPickUpTube(); + uint32 hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate41F250(); - void suWalking(); - void suLargeStep(); - void suUpdateDestX(); - void suWalkingOpenDoor(); - void spriteUpdate41F300(); - void suWalkingTestExit(); + void stTurnToUse(); + void stTurnToUseHalf(); + void stTurnAwayFromUse(); + void stReturnFromUse(); + void stTurnToUseExt(); + uint32 hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLever(int messageNum, const MessageParam ¶m, Entity *sender); + void stLargeStep(); + uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); - void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount); - void setKlaymanIdleTable1(); - void setKlaymanIdleTable2(); - void setKlaymanIdleTable3(); - - void setSoundFlag(bool value) { _soundFlag = value; } + void stInsertKey(); + uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); + + void stReadNote(); + uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHitByDoor(); + uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPeekWall(); + uint32 hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPeekWallReturn(); + uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPeekWallBlink(); + void upPeekWallBlink(); + + void stPeekWall1(); + + void stPeekWall2(); + + void stPullHammerLever(); + uint32 hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender); + + void stRidePlatformDown(); + void suRidePlatformDown(); + + void stCrashDown(); + void stCrashDownFinished(); + + void stShrink(); + uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); + + void stGrow(); + uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDrinkPotion(); + uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); - void stStandIdleSmall(); - void stWonderAboutAfterSmall(); - void stWonderAboutHalfSmall(); - void stWonderAboutSmall(); - void stWalkToFrontNoStepSmall(); - void stWalkToFront2Small(); - void stWalkToFrontSmall(); - void stTurnToBackHalfSmall(); - void stTurnToBackWalkSmall(); - void stTurnToBackSmall(); void stPullCord(); void stReleaseCord(); - uint32 hmPullCord(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPullReleaseCord(int messageNum, const MessageParam ¶m, Entity *sender); + void stUseTube(); uint32 hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender); - void stWalkingExt(); - void stStartWalkingExt(); - + + void stUseLever(); + void stUseLeverRelease(); + void stReleaseLever(); + void stInteractLever(); + uint32 hmLever(int messageNum, const MessageParam ¶m, Entity *sender); + + void stLetGoOfLever(); + void evLeverReleasedEvent(); + + void stWakeUp(); + + void stSleeping(); + uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPressButton(); + void stPressFloorButton(); + void stPressButtonSide(); + uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); + + void stWonderAbout(); + void stWonderAboutHalf(); + void stWonderAboutAfter(); + + void stStandWonderAbout(); + + void stStartClimbLadderUp(); + void stStartClimbLadderDown(); + uint32 hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender); + + void stContinueClimbLadderUp(); + + void stClimbLadderHalf(); + uint32 hmClimbLadderHalf(int messageNum, const MessageParam ¶m, Entity *sender); + + void setupJumpToRing(); + void stJumpToRing1(); + void stJumpToRing2(); + void stJumpToRing4(); + uint32 hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHangOnRing(); + + void stJumpToRing3(); + uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHoldRing3(); + uint32 hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *sender); + + void stReleaseRing(); + + void stLandOnFeet(); + uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPullLeverDown(); + void stHoldLeverDown(); + + void stInsertDisk(); + uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); + + void stMoveObjectSkipTurnFaceObject(); + void stMoveObjectSkipTurn(); + void stMoveObjectFaceObject(); + uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); + void evMoveObjectTurnDone(); + void stJumpToGrab(); - void suJumpToGrab(); - uint32 hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender); - - void sub421230();//stGrow?? - uint32 handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender); - - void stTurnToUseExt(); void stJumpToGrabFall(); + uint32 hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender); + void suJumpToGrab(); void stJumpToGrabRelease(); uint32 hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoIdleTeleporterHands(); - void stIdleTeleporterHands(); - - void stDoIdleTeleporterHands2(); - void stIdleTeleporterHands2(); + void stSitInTeleporter(); + uint32 hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender); + + void stSitIdleTeleporter(); + void upSitIdleTeleporter(); + + void stSitIdleTeleporterBlink(); + + void stSitIdleTeleporterBlinkSecond(); + + void stTurnToUseInTeleporter(); + + void stReturnFromUseInTeleporter(); + + void stGetUpFromTeleporter(); void teleporterAppear(uint32 fileHash); void teleporterDisappear(uint32 fileHash); uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); - void stShrink(); - - void stStandWonderAbout(); + void stClayDoorOpen(); + uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); - void stGrow(); - void stDrinkPotion(); + void stFallSkipJump(); + void suFallSkipJump(); - uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); - void stInsertKey(); + void stMoveObject(); + void stContinueMoveObject(); + uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); + void upMoveObject(); - uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); - void stReadNote(); + void stCloseEyes(); - uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); - void stHitByDoor(); + void stTumbleHeadless(); + uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); - void upPeekWallBlink(); - void stPeekWall1(); - void stPeekWall2(); - void stPeekWallBlink(); - void stPeekWallReturn(); + void stFetchMatch(); + void stLightMatch(); + uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); - void stPullHammerLever(); - uint32 hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender); + void stHitByBoxingGlove(); + uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); + void evHitByBoxingGloveDone(); - void suRidePlatformDown(); - void stRidePlatformDown(); + void stStandIdleSmall(); + void stWonderAboutSmall(); + void stWonderAboutHalfSmall(); + void stWonderAboutAfterSmall(); - void stCrashDown(); - void stCrashDownFinished(); + void stWalkToFrontNoStepSmall(); + void stWalkToFrontSmall(); + void stWalkToFront2Small(); + void stTurnToBackHalfSmall(); + void stTurnToBackWalkSmall(); + void stTurnToBackSmall(); + uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); - void upSpitOutFall(); + void sub421230();//stGrow?? + uint32 handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender); + + void stJumpToRingVenusFlyTrap(); uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDropFromRing(); + + void stStandIdleSpecial(); uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPressDoorButton(); uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); - void suFallDown(); - void stJumpToRingVenusFlyTrap(); - void stStandIdleSpecial(); + void stSpitOutFall0(); - void stFalling(); void stSpitOutFall2(); - void stFallTouchdown(); + void suFallDown(); + void upSpitOutFall(); + void stJumpAndFall(); - void stDropFromRing(); - void stPressDoorButton(); - void stHitByBoxingGlove(); - void stHitByBoxingGloveDone(); + uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); + + void stFalling(); + void stFallTouchdown(); + void stMoveVenusFlyTrap(); void stContinueMovingVenusFlyTrap(); - void stMoveVenusFlyTrapDone(); + uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + void evMoveVenusFlyTrapDone(); - void suFallSkipJump(); - void stFallSkipJump(); + //////////////////////////////////////////////////////////////////////////// - void upMoveObject(); - uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); - void stFetchMatch(); - void stLightMatch(); - uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); - void stMoveObject(); - void stContinueMoveObject(); - void stTumbleHeadless(); - void stCloseEyes(); + void stopWalking(); + + void suAction(); + void suLargeStep(); + void suUpdateDestX(); + void suWalkingTestExit(); + + uint32 hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + + void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount); + void setKlaymanIdleTable1(); + void setKlaymanIdleTable2(); + void setKlaymanIdleTable3(); + + void setSoundFlag(bool value) { _soundFlag = value; } - uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); - void stTrySpitIntoPipe(); void spitIntoPipe(); + void stTrySpitIntoPipe(); void stContSpitIntoPipe(); + uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); - void suRidePlatform(); void stRidePlatform(); - void stInteractLever(); + void suRidePlatform(); void stPullLever(); void stLookLeverDown(); void stWaitLeverDown(); - void startWalkingResume(int16 frameIncr); - protected: Entity *_parentScene; Sprite *_attachedSprite; @@ -305,6 +412,8 @@ protected: Sprite *_otherSprite; int _idleTableNum; + int16 _walkResumeFrameIncr; + int _moveObjectCountdown; bool _canSpitPipe; @@ -326,77 +435,14 @@ protected: void sub41CC40(int16 x1, int16 x2); void sub41CCE0(int16 x); - bool stStartActionFromIdle(AnimationCb callback); void gotoNextStateExt(); void sub41C770(); void sub41C790(); - - void stIdlePickEar(); - void evIdlePickEarDone(); - uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); - - void stIdleSpinHead(); - uint32 hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender); - - void stIdleArms(); - void evIdleArmsDone(); - uint32 hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender); - - void stIdleChest(); - uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); - - void stIdleHeadOff(); - uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); - void startIdleAnimation(uint32 fileHash, AnimationCb callback); - void upIdleAnimation(); - - void upStandIdle(); - - void stIdleBlink(); - void stStandAround(); - - uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); - - uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); - - bool stStartAction(AnimationCb callback3); - - void stSneak(); - void stWalkingDone(); - uint32 hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender); - void stStartWalking(); - uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); - - uint32 hmPickUpGeneric(int messageNum, const MessageParam ¶m, Entity *sender); - - uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); - void stLargeStepDone(); - uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmHoldRing(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage41DFD0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); - - void upSitIdleTeleporter(); - - uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); - void stStartWalkingSmall(); uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); void walkAlongPathPoints(); -- cgit v1.2.3 From bb4bda740489193ee13b4b7f4bff9e839df3f63a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 07:38:19 +0000 Subject: NEVERHOOD: More minor Klayman changes: - Normalize the calling order of the Set... macros - Actually use _walkResumeFrameIncr, change stStartWalkingResume --- engines/neverhood/klayman.cpp | 121 +++++++++++++++++------------------------- engines/neverhood/klayman.h | 12 ++--- 2 files changed, 53 insertions(+), 80 deletions(-) diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index ae08de913b..93cc49e305 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -273,10 +273,10 @@ void Klayman::stSitIdleTeleporter() { _status2 = 0; _acceptInput = true; startAnimation(0x582EC138, 0, -1); - _idleCounter = 0; - SetSpriteUpdate(NULL); SetUpdateHandler(&Klayman::upSitIdleTeleporter); SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(NULL); + _idleCounter = 0; _blinkCounter = 0; _idleCounterMax = 8; _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; @@ -475,7 +475,7 @@ void Klayman::gotoNextStateExt() { AnimationCb cb = _nextStateCb; _nextStateCb = NULL; (this->*cb)(); -#if 0 // TODO +#if 0 // TODO (So far, with almost all Klayman subclasses implemented, _callbackList and related code seems unused) } else if (_callbackList) { removeCallbackList(); #endif @@ -499,12 +499,12 @@ void Klayman::stTryStandIdle() { _status2 = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); - _idleCounter = 0; - _blinkCounter = 0; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; SetUpdateHandler(&Klayman::upStandIdle); SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); + _idleCounter = 0; + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; } } @@ -810,8 +810,8 @@ void Klayman::stStartWalking() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::evStartWalkingDone); NextState(&Klayman::stWalkingFirst); + FinalizeState(&Klayman::evStartWalkingDone); } } @@ -841,8 +841,8 @@ void Klayman::stWalkingFirst() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalking); SetSpriteUpdate(&Klayman::suWalkingFirst); - FinalizeState(&Klayman::evStartWalkingDone); NextState(&Klayman::stUpdateWalkingFirst); + FinalizeState(&Klayman::evStartWalkingDone); } void Klayman::suWalkingFirst() { @@ -1308,8 +1308,8 @@ void Klayman::stStartWalkingExt() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmStartWalking); SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::evStartWalkingDone); NextState(&Klayman::stWalkingFirstExt); + FinalizeState(&Klayman::evStartWalkingDone); } } @@ -1373,10 +1373,10 @@ void Klayman::stLargeStep() { SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLargeStep); SetSpriteUpdate(&Klayman::suLargeStep); - FinalizeState(&Klayman::stLargeStepDone); + FinalizeState(&Klayman::evLargeStepDone); } -void Klayman::stLargeStepDone() { +void Klayman::evLargeStepDone() { _isLargeStep = false; } @@ -1901,8 +1901,8 @@ void Klayman::stClayDoorOpen() { _acceptInput = false; startAnimation(0x5CCCB330, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmClayDoorOpen); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -1934,8 +1934,8 @@ void Klayman::stReturnFromUse() { _acceptInput = false; startAnimation(0x98F88391, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmTurnToUse); + SetSpriteUpdate(&Klayman::suUpdateDestX); } void Klayman::stWalkingOpenDoor() { @@ -1943,8 +1943,8 @@ void Klayman::stWalkingOpenDoor() { _acceptInput = false; startAnimation(0x11A8E012, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suWalkingOpenDoor); SetMessageHandler(&Klayman::hmStartWalking); + SetSpriteUpdate(&Klayman::suWalkingOpenDoor); } void Klayman::suWalkingOpenDoor() { @@ -2011,8 +2011,8 @@ void Klayman::stMoveObjectFaceObject() { _acceptInput = true; startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmMoveObjectTurn); + SetSpriteUpdate(&Klayman::suUpdateDestX); } } @@ -2024,9 +2024,9 @@ void Klayman::stUseLever() { } else { sendMessage(_attachedSprite, 0x482B, 0); startAnimation(0x0C303040, 0, -1); - SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmLever); + SetUpdateHandler(&Klayman::update); NextState(&Klayman::stPullLeverDown); _acceptInput = false; } @@ -2043,8 +2043,8 @@ void Klayman::stPullLeverDown() { void Klayman::stHoldLeverDown() { startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(&Klayman::suUpdateDestX); _isLeverDown = true; _acceptInput = true; } @@ -2052,8 +2052,8 @@ void Klayman::stHoldLeverDown() { void Klayman::stUseLeverRelease() { startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmLever); + SetSpriteUpdate(&Klayman::suUpdateDestX); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stPullLeverDown); _acceptInput = false; @@ -2064,8 +2064,8 @@ void Klayman::stReleaseLever() { _status2 = 2; startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmLever); + SetSpriteUpdate(&Klayman::suUpdateDestX); sendMessage(_attachedSprite, 0x4807, 0); NextState(&Klayman::stLetGoOfLever); _acceptInput = false; @@ -2101,8 +2101,8 @@ void Klayman::stInsertDisk() { } else { startAnimation(0xD8C8D100, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suAction); SetMessageHandler(&Klayman::hmInsertDisk); + SetSpriteUpdate(&Klayman::suAction); _acceptInput = false; _tapesToInsert--; } @@ -2341,11 +2341,11 @@ uint32 Klayman::hmShrink(int messageNum, const MessageParam ¶m, Entity *send void Klayman::stShrink() { _status2 = 0; _acceptInput = false; - startAnimation(0x1AE88904, 0, -1); playSound(0, 0x4C69EA53); + startAnimation(0x1AE88904, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&Klayman::hmShrink); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } void Klayman::stStandWonderAbout() { @@ -2354,10 +2354,10 @@ void Klayman::stStandWonderAbout() { _status2 = 0; _acceptInput = true; startAnimation(0xD820A114, 0, -1); - _newStickFrameIndex = 10; SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmLowLevel); SetSpriteUpdate(NULL); + _newStickFrameIndex = 10; } uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2519,8 +2519,8 @@ void Klayman::stInsertKey() { _acceptInput = false; startAnimation(0xDC409440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suAction); SetMessageHandler(&Klayman::hmInsertKey); + SetSpriteUpdate(&Klayman::suAction); _keysToInsert--; } } @@ -2576,8 +2576,8 @@ void Klayman::stHitByDoor() { _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&Klayman::hmHitByDoor); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); playSound(0, 0x402E82D4); } @@ -2611,8 +2611,8 @@ void Klayman::stPeekWall1() { _acceptInput = true; startAnimation(0xAC20C012, 8, 37); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmLowLevelAnimation); + SetSpriteUpdate(NULL); NextState(&Klayman::stPeekWallBlink); } @@ -2642,8 +2642,8 @@ void Klayman::stPeekWallReturn() { _acceptInput = false; startAnimation(0x2426932E, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmPeekWallReturn); + SetSpriteUpdate(NULL); } void Klayman::stPullHammerLever() { @@ -2872,8 +2872,8 @@ void Klayman::stJumpToRingVenusFlyTrap() { _acceptInput = false; startAnimation(0x584984B4, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&Klayman::hmJumpToRingVenusFlyTrap); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); NextState(&Klayman::stLandOnFeet); sendMessage(_attachedSprite, 0x482B, 0); } @@ -2886,8 +2886,8 @@ void Klayman::stStandIdleSpecial() { _surface->setVisible(false); startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmStandIdleSpecial); + SetSpriteUpdate(NULL); } void Klayman::stSpitOutFall0() { @@ -2926,7 +2926,7 @@ void Klayman::stFalling() { SetMessageHandler(&Klayman::hmLowLevelAnimation); NextState(&Klayman::stFallTouchdown); sendMessage(_parentScene, 0x2002, 0); - // TODO _callbackList = NULL; + // TODO _callbackList = NULL; (See comment above) _attachedSprite = NULL; sendMessage(_parentScene, 0x8001, 0); } @@ -3069,8 +3069,8 @@ void Klayman::stFetchMatch() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x9CAA0218, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmMatch); + SetSpriteUpdate(NULL); NextState(&Klayman::stLightMatch); } } @@ -3081,8 +3081,8 @@ void Klayman::stLightMatch() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x1222A513, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmMatch); + SetSpriteUpdate(NULL); } uint32 Klayman::hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -3124,8 +3124,8 @@ void Klayman::stMoveObject() { setDoDeltaX(0); startAnimation(0x0C1CA072, 0, -1); SetUpdateHandler(&Klayman::upMoveObject); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&Klayman::hmMoveObject); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } } @@ -3144,8 +3144,8 @@ void Klayman::stTumbleHeadless() { setDoDeltaX(0); startAnimation(0x2821C590, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&Klayman::hmTumbleHeadless); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); NextState(&Klayman::stTryStandIdle); sendMessage(_parentScene, 0x8000, 0); playSound(0, 0x62E0A356); @@ -3158,8 +3158,8 @@ void Klayman::stCloseEyes() { _acceptInput = false; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(NULL); } } @@ -3236,8 +3236,8 @@ void Klayman::stRidePlatform() { _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suRidePlatform); SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(&Klayman::suRidePlatform); } } @@ -3250,8 +3250,8 @@ void Klayman::stInteractLever() { _acceptInput = false; startAnimation(0x0C303040, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmLever); + SetSpriteUpdate(&Klayman::suUpdateDestX); NextState(&Klayman::stPullLever); } } @@ -3259,31 +3259,30 @@ void Klayman::stInteractLever() { void Klayman::stPullLever() { startAnimation(0x0D318140, 0, -1); - sendMessage(_attachedSprite, 0x480F, 0); NextState(&Klayman::stLookLeverDown); + sendMessage(_attachedSprite, 0x480F, 0); } void Klayman::stLookLeverDown() { + _acceptInput = true; + _isLeverDown = true; startAnimation(0x1564A2C0, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(&Klayman::suUpdateDestX); NextState(&Klayman::stWaitLeverDown); - _acceptInput = true; - _isLeverDown = true; } void Klayman::stWaitLeverDown() { + _acceptInput = true; + _isLeverDown = true; startAnimation(0x4464A440, 0, -1); SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); SetMessageHandler(&Klayman::hmLowLevel); - _acceptInput = true; - _isLeverDown = true; + SetSpriteUpdate(&Klayman::suUpdateDestX); } -void Klayman::startWalkingResume(int16 frameIncr) { - // TODO Make the parameter a field and change this method back to a callback (or similar) - int16 frameIndex = getGlobalVar(0x18288913) + frameIncr; +void Klayman::stStartWalkingResume() { + int16 frameIndex = getGlobalVar(0x18288913) + _walkResumeFrameIncr; if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; @@ -4802,7 +4801,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2205::stStartWalkingResume); + GotoState(&Klayman::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -4829,10 +4828,6 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2205::stStartWalkingResume() { - startWalkingResume(0); -} - KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -4863,7 +4858,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2206::stStartWalkingResume); + GotoState(&Klayman::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -4939,10 +4934,6 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2206::stStartWalkingResume() { - startWalkingResume(1); -} - KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -5028,7 +5019,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2242::stStartWalkingResume); + GotoState(&Klayman::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -5077,10 +5068,6 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2242::stStartWalkingResume() { - startWalkingResume(0); -} - KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -5102,7 +5089,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmHallOfRecords::stStartWalkingResume); + GotoState(&Klayman::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -5135,10 +5122,6 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m return 0; } -void KmHallOfRecords::stStartWalkingResume() { - startWalkingResume(0); -} - KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -5160,7 +5143,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4804: if (param.asInteger() != 0) { _destX = param.asInteger(); - GotoState(&KmScene2247::stStartWalkingResume); + GotoState(&Klayman::stStartWalkingResume); } else { GotoState(&Klayman::stPeekWall); } @@ -5193,10 +5176,6 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -void KmScene2247::stStartWalkingResume() { - startWalkingResume(0); -} - KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 89c59b6e2b..b83eb142f6 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -107,7 +107,7 @@ public: void stWalkingFirst(); void stWalkingFirstExt(); - void startWalkingResume(int16 frameIncr); + void stStartWalkingResume(); void stUpdateWalkingFirst(); uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); void suWalkingFirst(); @@ -137,6 +137,8 @@ public: void stLargeStep(); uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); + void suLargeStep(); + void evLargeStepDone(); void stInsertKey(); uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); @@ -351,7 +353,6 @@ public: void stopWalking(); void suAction(); - void suLargeStep(); void suUpdateDestX(); void suWalkingTestExit(); @@ -439,8 +440,6 @@ protected: void sub41C770(); void sub41C790(); - void stLargeStepDone(); - void stStartWalkingSmall(); uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); @@ -599,7 +598,6 @@ protected: class KmScene2205 : public Klayman { public: KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); - void stStartWalkingResume(); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -612,7 +610,6 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stStartWalkingResume(); }; class KmScene2207 : public Klayman { @@ -628,7 +625,6 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stStartWalkingResume(); }; class KmHallOfRecords : public Klayman { @@ -637,7 +633,6 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stStartWalkingResume(); }; class KmScene2247 : public Klayman { @@ -646,7 +641,6 @@ public: protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void stStartWalkingResume(); }; class KmScene2401 : public Klayman { -- cgit v1.2.3 From c88fdc34dd6ef0f26c65150ba35bff13854f7d93 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 07:51:00 +0000 Subject: NEVERHOOD: Rename Class152 to StaticScene --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module1000.cpp | 10 +++++----- engines/neverhood/module1000.h | 4 ++-- engines/neverhood/module2200.cpp | 8 ++++---- engines/neverhood/module2400.cpp | 6 +++--- engines/neverhood/module2500.cpp | 4 ++-- engines/neverhood/module2700.cpp | 2 +- engines/neverhood/module2800.cpp | 30 +++++++++++++++--------------- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 09299de118..f281a17b3d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -300,7 +300,7 @@ void GameModule::startup() { // createModule(1500, 0); // Logos and intro video //Real #if 1 _vm->gameState().sceneNum = 6; - createModule(1300, -1); + createModule(1000, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 1e844c75bd..ab4c051f5a 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -62,7 +62,7 @@ void Module1000::createScene(int sceneNum, int which) { break; case 2: _vm->_soundMan->startMusic(0x061880C6, 0, 0); - _childObject = new Class152(_vm, this, 0xC084110C, 0x41108C00); + _childObject = new StaticScene(_vm, this, 0xC084110C, 0x41108C00); break; case 3: _vm->_soundMan->stopMusic(0x061880C6, 0, 2); @@ -1563,21 +1563,21 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -// Class152 +// StaticScene -Class152::Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) +StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) : Scene(vm, parentModule, true) { _surfaceFlag = false; - SetMessageHandler(&Class152::handleMessage); + SetMessageHandler(&StaticScene::handleMessage); setBackground(backgroundFileHash); setPalette(backgroundFileHash); insertMouse435(cursorFileHash, 20, 620); } -uint32 Class152::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 StaticScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 60eb2fb7d8..db8fdb6448 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -103,9 +103,9 @@ protected: // TODO: Move this to some common file since it's used several times -class Class152 : public Scene { +class StaticScene : public Scene { public: - Class152(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash); + StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index f703971bf3..36be19a01f 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -202,14 +202,14 @@ void Module2200::createScene(int sceneNum, int which) { case 47: if (!getGlobalVar(0x98109F12)) { if (getGlobalVar(0x4D080E54)) - _childObject = new Class152(_vm, this, 0x83110287, 0x10283839); + _childObject = new StaticScene(_vm, this, 0x83110287, 0x10283839); else - _childObject = new Class152(_vm, this, 0x83412B9D, 0x12B9983C); + _childObject = new StaticScene(_vm, this, 0x83412B9D, 0x12B9983C); } else { if (getGlobalVar(0x4D080E54)) - _childObject = new Class152(_vm, this, 0x48632087, 0x3208348E); + _childObject = new StaticScene(_vm, this, 0x48632087, 0x3208348E); else - _childObject = new Class152(_vm, this, 0x08C74886, 0x74882084); + _childObject = new StaticScene(_vm, this, 0x08C74886, 0x74882084); } break; } diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 6c120069b7..5dcfa8dd55 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -70,13 +70,13 @@ void Module2400::createScene(int sceneNum, int which) { createSmackerScene(0x20D80001, true, true, false); break; case 7: - _childObject = new Class152(_vm, this, 0x81523218, 0x2321C81D); + _childObject = new StaticScene(_vm, this, 0x81523218, 0x2321C81D); break; case 8: - _childObject = new Class152(_vm, this, 0x08100210, 0x00214089); + _childObject = new StaticScene(_vm, this, 0x08100210, 0x00214089); break; case 9: - _childObject = new Class152(_vm, this, 0x8C020505, 0x205018C8); + _childObject = new StaticScene(_vm, this, 0x8C020505, 0x205018C8); break; } SetUpdateHandler(&Module2400::updateScene); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 1efcb25ed1..cc0dda9837 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -126,9 +126,9 @@ void Module2500::createScene(int sceneNum, int which) { break; case 9: if (getGlobalVar(0xD0A14D10)) - _childObject = new Class152(_vm, this, 0xC62A0645, 0xA0641C6A); + _childObject = new StaticScene(_vm, this, 0xC62A0645, 0xA0641C6A); else - _childObject = new Class152(_vm, this, 0x7A343546, 0x435427AB); + _childObject = new StaticScene(_vm, this, 0x7A343546, 0x435427AB); break; } SetUpdateHandler(&Module2500::updateScene); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 0a59abf0f2..f9a5c2abce 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -267,7 +267,7 @@ void Module2700::createScene(int sceneNum, int which) { createScene2704(which, 0x004B1E60, 150); break; case 30: - _childObject = new Class152(_vm, this, 0x09507248, 0x0724C09D); + _childObject = new StaticScene(_vm, this, 0x09507248, 0x0724C09D); break; case 31: //TODO _childObject = new Scene2732(_vm, this, which); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 6d7e49f5c7..7a35ddda23 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -70,7 +70,7 @@ void Module2800::createScene(int sceneNum, int which) { if (_flag) { _childObject = new Scene2802(_vm, this, which); } else { - _childObject = new Class152(_vm, this, 0x000C6444, 0xC6440008); + _childObject = new StaticScene(_vm, this, 0x000C6444, 0xC6440008); } #endif break; @@ -119,39 +119,39 @@ void Module2800::createScene(int sceneNum, int which) { break; case 12: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x0000A245, 0x0A241008); + _childObject = new StaticScene(_vm, this, 0x0000A245, 0x0A241008); break; case 13: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x81C60635, 0x60631814); + _childObject = new StaticScene(_vm, this, 0x81C60635, 0x60631814); break; case 14: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0xCA811204, 0x11200CA0); + _childObject = new StaticScene(_vm, this, 0xCA811204, 0x11200CA0); break; case 15: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x2D438A00, 0x38A042DC); + _childObject = new StaticScene(_vm, this, 0x2D438A00, 0x38A042DC); break; case 16: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x0A806204, 0x062000A0); + _childObject = new StaticScene(_vm, this, 0x0A806204, 0x062000A0); break; case 17: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x010F9284, 0xF9280018); + _childObject = new StaticScene(_vm, this, 0x010F9284, 0xF9280018); break; case 18: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x0100022B, 0x0022F018); + _childObject = new StaticScene(_vm, this, 0x0100022B, 0x0022F018); break; case 19: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x10866205, 0x66201100); + _childObject = new StaticScene(_vm, this, 0x10866205, 0x66201100); break; case 20: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x01C58000, 0x58004014); + _childObject = new StaticScene(_vm, this, 0x01C58000, 0x58004014); break; case 21: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); @@ -159,22 +159,22 @@ void Module2800::createScene(int sceneNum, int which) { break; case 22: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x9408121E, 0x8121A948); + _childObject = new StaticScene(_vm, this, 0x9408121E, 0x8121A948); break; case 23: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x048C0600, 0xC0604040); + _childObject = new StaticScene(_vm, this, 0x048C0600, 0xC0604040); break; case 24: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Class152(_vm, this, 0x04270A94, 0x70A9004A); + _childObject = new StaticScene(_vm, this, 0x04270A94, 0x70A9004A); break; case 25: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); if (getGlobalVar(0x190A1D18)) - _childObject = new Class152(_vm, this, 0x01600204, 0x0020001E); + _childObject = new StaticScene(_vm, this, 0x01600204, 0x0020001E); else - _childObject = new Class152(_vm, this, 0x08611204, 0x1120008E); + _childObject = new StaticScene(_vm, this, 0x08611204, 0x1120008E); break; case 26: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); -- cgit v1.2.3 From 81667d492a5513ebc390b2d563dca25db681729a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 09:39:26 +0000 Subject: NEVERHOOD: Remove SsScene1002LadderArch and Class599 and turn them into static sprites; the classes were only used to set the sprite surface priority with a message, which is now handled in the scene --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module1000.cpp | 50 +++++----------------------------------- engines/neverhood/module1000.h | 16 ------------- engines/neverhood/scene.cpp | 5 ++++ engines/neverhood/scene.h | 1 + 5 files changed, 13 insertions(+), 61 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index f281a17b3d..e3787757b0 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -299,7 +299,7 @@ void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule(1500, 0); // Logos and intro video //Real #if 1 - _vm->gameState().sceneNum = 6; + _vm->gameState().sceneNum = 1; createModule(1000, -1); #endif #if 0 diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index ab4c051f5a..4fdb3db523 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -458,44 +458,6 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1002 -SsScene1002LadderArch::SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 0x152C1313, 1015), _parentScene(parentScene) { - - SetMessageHandler(&SsScene1002LadderArch::handleMessage); -} - -uint32 SsScene1002LadderArch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x482A: - sendMessage(_parentScene, 0x1022, 995); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1015); - break; - } - return messageResult; -} - -Class599::Class599(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 0x316C4BB4, 1015), _parentScene(parentScene) { - - SetMessageHandler(&Class599::handleMessage); -} - -uint32 Class599::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x482A: - sendMessage(_parentScene, 0x1022, 995); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1015); - break; - } - return messageResult; -} - AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _flag1(flag1) { @@ -1327,12 +1289,12 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x06149428, 1100); insertStaticSprite(0x312C8774, 1100); - _ssLadderArch = insertSprite(this); + _ssLadderArch = insertStaticSprite(0x152C1313, 1015); _ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200); _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); - _class599 = insertSprite(this); + _class599 = insertStaticSprite(0x316C4BB4, 1015); if (which < 0) { if (_vm->_gameState.field2 == 0) { @@ -1552,12 +1514,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asOutsideDoorBackground, 0x4808, 0); break; case 0x8000: - sendMessage(_class599, 0x482A, 0); - sendMessage(_ssLadderArch, 0x482A, 0); + setSpriteSurfacePriority(_class599, 995); + setSpriteSurfacePriority(_ssLadderArch, 995); break; case 0x8001: - sendMessage(_class599, 0x482B, 0); - sendMessage(_ssLadderArch, 0x482B, 0); + setSpriteSurfacePriority(_class599, 1015); + setSpriteSurfacePriority(_ssLadderArch, 1015); break; } return messageResult; diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index db8fdb6448..864b5ccf94 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -112,22 +112,6 @@ protected: // Scene1002 -class SsScene1002LadderArch : public StaticSprite { -public: - SsScene1002LadderArch(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Class599 : public StaticSprite { -public: - Class599(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - class AsScene1002Ring : public AnimatedSprite { public: AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 8520d6467d..dde437dc62 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -169,6 +169,11 @@ void Scene::setSurfacePriority(BaseSurface *surface, int priority) { addSurface(surface); } +void Scene::setSpriteSurfacePriority(Sprite *sprite, int priority) { + if (sprite) + setSurfacePriority(sprite->getSurface(), priority); +} + void Scene::deleteSprite(Sprite **sprite) { _vm->_collisionMan->removeSprite(*sprite); removeSurface((*sprite)->getSurface()); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index f9e221a6da..35adb44ee8 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -49,6 +49,7 @@ public: Sprite *addSprite(Sprite *sprite); void removeSprite(Sprite *sprite); void setSurfacePriority(BaseSurface *surface, int priority); + void setSpriteSurfacePriority(Sprite *sprite, int priority); void deleteSprite(Sprite **sprite); Background *addBackground(Background *background); void setBackground(uint32 fileHash, bool dirtyBackground = true); -- cgit v1.2.3 From 5e08ab3e3f3d02a55765c9c5f22934666578fddc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 09:55:23 +0000 Subject: NEVERHOOD: Rename Class426 to SsCommonPressButton --- engines/neverhood/module1000.cpp | 16 ++++++++-------- engines/neverhood/module1000.h | 6 +++--- engines/neverhood/module2200.cpp | 6 +++--- engines/neverhood/module2200.h | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 4fdb3db523..dce4b8cfac 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -763,7 +763,7 @@ void AsScene1002DoorSpy::stDoorSpyBoxingGlove() { NextState(&AsScene1002DoorSpy::stDoorSpyIdle); } -Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) +SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) : StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) { _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; @@ -784,12 +784,12 @@ Class426::Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui setVisible(false); _needRefresh = true; - SetUpdateHandler(&Class426::update); - SetMessageHandler(&Class426::handleMessage); + SetUpdateHandler(&SsCommonPressButton::update); + SetMessageHandler(&SsCommonPressButton::handleMessage); } -void Class426::setFileHashes(uint32 fileHash1, uint32 fileHash2) { +void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHashes[0] = fileHash1; _fileHashes[1] = fileHash2; if (_status == 2) { @@ -815,7 +815,7 @@ void Class426::setFileHashes(uint32 fileHash1, uint32 fileHash2) { } } -void Class426::update() { +void SsCommonPressButton::update() { if (_countdown != 0 && (--_countdown) == 0) { if (_status == 1) { _status = 2; @@ -848,7 +848,7 @@ void Class426::update() { } } -uint32 Class426::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x480B: @@ -1353,7 +1353,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asDoor = insertSprite(tempClipRect); tempSprite = insertSprite(); _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); - _class426 = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); + _ssPressButton = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); _asVenusFlyTrap = insertSprite(this, _klayman, false); _vm->_collisionMan->addSprite(_asVenusFlyTrap); @@ -1440,7 +1440,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x42845B19) { sendEntityMessage(_klayman, 0x1014, _asRing5); } else if (param.asInteger() == 0xC0A07458) { - sendEntityMessage(_klayman, 0x1014, _class426); + sendEntityMessage(_klayman, 0x1014, _ssPressButton); } break; case 0x1024: diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 864b5ccf94..f63d1f0b21 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -158,9 +158,9 @@ protected: void stDoorSpyBoxingGlove(); }; -class Class426 : public StaticSprite { +class SsCommonPressButton : public StaticSprite { public: - Class426(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); + SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); void setFileHashes(uint32 fileHash1, uint32 fileHash2); protected: Scene *_parentScene; @@ -252,7 +252,7 @@ protected: Sprite *_asKlaymanLadderHands; Sprite *_asKlaymanPeekHand; Sprite *_asOutsideDoorBackground; - Sprite *_class426; + Sprite *_ssPressButton; bool _flag1B4; bool _flag1BE; bool _flag; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 36be19a01f..4460314d5e 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -518,7 +518,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); + _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); for (uint32 i = 0; i < 9; i++) { if ((int16)getSubVar(0x484498D0, i) >= 0) { @@ -1279,14 +1279,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x0008028D); addEntity(_palette); insertMouse433(0x80289008); - _ssLightSwitch = insertSprite(this, 0x2D339030, 0x2D309030, 100, 0); + _ssLightSwitch = insertSprite(this, 0x2D339030, 0x2D309030, 100, 0); } else { _isLightOn = false; setBackground(0xD00A028D); setPalette(0xD00A028D); addEntity(_palette); insertMouse433(0xA0289D08); - _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); + _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); } _palette->addBasePalette(0xD00A028D, 0, 256, 0); diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 3767b7bd64..53b94695d8 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -197,7 +197,7 @@ class Scene2205 : public Scene { public: Scene2205(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Class426 *_ssLightSwitch; + SsCommonPressButton *_ssLightSwitch; Sprite *_ssDoorFrame; bool _isKlaymanInLight; bool _isLightOn; -- cgit v1.2.3 From f77b12cf96aaebb47a1ead1b7daf25e75dd5abf4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 13:09:31 +0000 Subject: NEVERHOOD: Rename stuff in Module1200 - Fix Scene1201 (tnt man, match) --- engines/neverhood/module1200.cpp | 176 ++++++++++++++++++--------------------- engines/neverhood/module1200.h | 61 +++++++------- 2 files changed, 109 insertions(+), 128 deletions(-) diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index a903759ce1..efdb6debb7 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -219,22 +219,24 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, return messageResult; } -Class466::Class466(NeverhoodEngine *vm, bool flag) +AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag) : AnimatedSprite(vm, 1200) { SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class466::handleMessage); + SetMessageHandler(&AsScene1201TntManRope::handleMessage); createSurface(10, 34, 149); _x = 202; _y = -32; if (flag) { - sub40D380(); + startAnimation(0x928F0C10, 15, -1); + _newStickFrameIndex = -2; } else { - sub40D340(); + startAnimation(0x928F0C10, 0, -1); + _newStickFrameIndex = 0; } } -uint32 Class466::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -243,27 +245,13 @@ uint32 Class466::handleMessage(int messageNum, const MessageParam ¶m, Entity } break; case 0x2006: - sub40D360(); + startAnimation(0x928F0C10, 1, -1); + _newStickFrameIndex = -2; break; } return messageResult; } -void Class466::sub40D340() { - startAnimation(0x928F0C10, 0, -1); - _newStickFrameIndex = 0; -} - -void Class466::sub40D360() { - startAnimation(0x928F0C10, 1, -1); - _newStickFrameIndex = -2; -} - -void Class466::sub40D380() { - startAnimation(0x928F0C10, 15, -1); - _newStickFrameIndex = -2; -} - AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag) : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { @@ -285,7 +273,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, void AsScene1201RightDoor::update() { if (_countdown != 0 && (--_countdown == 0)) { - sub40D830(); + stCloseDoor(); } AnimatedSprite::update(); } @@ -297,43 +285,43 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p gotoNextState(); break; case 0x4829: - sub40D7E0(); + stOpenDoor(); break; } return messageResult; } -void AsScene1201RightDoor::sub40D7E0() { +void AsScene1201RightDoor::stOpenDoor() { startAnimation(0xD088AC30, 0, -1); _newStickFrameIndex = -2; setVisible(true); playSound(0, calcHash("fxDoorOpen20")); } -void AsScene1201RightDoor::sub40D830() { +void AsScene1201RightDoor::stCloseDoor() { startAnimation(0xD088AC30, -1, -1); _playBackwards = true; setVisible(true); playSound(0, calcHash("fxDoorClose20")); - NextState(&AsScene1201RightDoor::sub40D880); + NextState(&AsScene1201RightDoor::stCloseDoorDone); } -void AsScene1201RightDoor::sub40D880() { +void AsScene1201RightDoor::stCloseDoorDone() { stopAnimation(); setVisible(false); } -Class464::Class464(NeverhoodEngine *vm) +AsScene1201KlaymanHead::AsScene1201KlaymanHead(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200) { createSurface(1200, 69, 98); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class464::handleMessage); + SetMessageHandler(&AsScene1201KlaymanHead::handleMessage); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); setVisible(false); } -uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201KlaymanHead::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2006: @@ -351,22 +339,20 @@ uint32 Class464::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _class466(class466), - _flag(false) { +AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isComingDown) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _asTntManRope(asTntManRope), + _isMoving(false) { - flag = false; - SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1201TntMan::handleMessage); createSurface(990, 106, 181); _x = 201; - if (flag) { + if (isComingDown) { _y = 297; - sub40CD60(); + stComingDown(); } else { _y = 334; - sub40CD30(); + stStanding(); } } @@ -379,7 +365,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶ switch (messageNum) { case 0x100D: if (param.asInteger() == 0x092870C0) { - sendMessage(_class466, 0x2006, 0); + sendMessage(_asTntManRope, 0x2006, 0); } else if (param.asInteger() == 0x11CA0144) { playSound(0, 0x51800A04); } @@ -387,10 +373,11 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶ case 0x1011: sendMessage(_parentScene, 0x2002, 0); messageResult = 1; + break; case 0x480B: - if (!_flag) { + if (!_isMoving) { _sprite = (Sprite*)sender; - sub40CD90(); + stMoving(); } break; } @@ -398,7 +385,7 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶ } -uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -408,49 +395,49 @@ uint32 AsScene1201TntMan::handleMessage40CCD0(int messageNum, const MessageParam return messageResult; } -void AsScene1201TntMan::spriteUpdate40CD10() { +void AsScene1201TntMan::suMoving() { _x = _sprite->getX() + 100; } -void AsScene1201TntMan::sub40CD30() { +void AsScene1201TntMan::stStanding() { startAnimation(0x654913D0, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); SetSpriteUpdate(NULL); } -void AsScene1201TntMan::sub40CD60() { +void AsScene1201TntMan::stComingDown() { startAnimation(0x356803D0, 0, -1); - SetMessageHandler(&AsScene1201TntMan::handleMessage40CCD0); + SetMessageHandler(&AsScene1201TntMan::hmComingDown); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - NextState(&AsScene1201TntMan::sub40CD30); + NextState(&AsScene1201TntMan::stStanding); } -void AsScene1201TntMan::sub40CD90() { +void AsScene1201TntMan::stMoving() { _vm->_soundMan->addSound(0x01D00560, 0x4B044624); _vm->_soundMan->playSoundLooping(0x4B044624); - _flag = true; + _isMoving = true; startAnimation(0x85084190, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); - SetSpriteUpdate(&AsScene1201TntMan::spriteUpdate40CD10); + SetSpriteUpdate(&AsScene1201TntMan::suMoving); _newStickFrameIndex = -2; } -Class465::Class465(NeverhoodEngine *vm, Sprite *asTntMan) +AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan) : AnimatedSprite(vm, 1200), _asTntMan(asTntMan) { createSurface1(0x828C0411, 995); - SetUpdateHandler(&Class465::update); + SetUpdateHandler(&AsScene1201TntManFlame::update); SetMessageHandler(&Sprite::handleMessage); - SetSpriteUpdate(&Class465::spriteUpdate40D150); + SetSpriteUpdate(&AsScene1201TntManFlame::suUpdate); startAnimation(0x828C0411, 0, -1); setVisible(false); } -Class465::~Class465() { +AsScene1201TntManFlame::~AsScene1201TntManFlame() { _vm->_soundMan->deleteSoundGroup(0x041080A4); } -void Class465::update() { +void AsScene1201TntManFlame::update() { AnimatedSprite::update(); if (getGlobalVar(0x20A0C516)) { setVisible(true); @@ -460,31 +447,30 @@ void Class465::update() { } } -void Class465::spriteUpdate40D150() { +void AsScene1201TntManFlame::suUpdate() { _x = _asTntMan->getX() - 18; _y = _asTntMan->getY() - 158; } AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _countdown(0) { createSurface(1100, 57, 60); SetUpdateHandler(&AsScene1201Match::update); - SetMessageHandler(&AsScene1201Match::handleMessage40C2D0); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - switch (getGlobalVar(0x0112090A)) { case 0: _x = 521; _y = 112; _status = 0; - sub40C4C0(); + stIdleOnDoorFrame(); break; case 1: _x = 521; _y = 112; _status = 2; - sub40C470(); + stOnDoorFrameAboutToMove(); loadSound(0, 0xD00230CD); break; case 2: @@ -492,21 +478,20 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) _x = 403; _y = 337; _status = 0; - sub40C4F0(); + stIdleOnFloor(); break; } } void AsScene1201Match::update() { - if (_countdown != 0 && (--_countdown == 0)) { + if (_countdown != 0 && (--_countdown == 0)) gotoNextState(); - } updateAnim(); handleSpriteUpdate(); updatePosition(); } -uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -518,8 +503,8 @@ uint32 AsScene1201Match::handleMessage40C2D0(int messageNum, const MessageParam return messageResult; } -uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage40C2D0(messageNum, param, sender); +uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextState(); @@ -528,8 +513,8 @@ uint32 AsScene1201Match::handleMessage40C320(int messageNum, const MessageParam return messageResult; } -uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage40C2D0(messageNum, param, sender); +uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender); switch (messageNum) { case 0x1011: sendMessage(_parentScene, 0x2001, 0); @@ -543,48 +528,48 @@ uint32 AsScene1201Match::handleMessage40C360(int messageNum, const MessageParam return messageResult; } -void AsScene1201Match::sub40C3E0() { +void AsScene1201Match::stOnDoorFrameMoving() { startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::handleMessage40C320); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving); if (_status == 0) { - NextState(&AsScene1201Match::sub40C420); + NextState(&AsScene1201Match::stFallingFromDoorFrame); } else { - NextState(&AsScene1201Match::sub40C470); + NextState(&AsScene1201Match::stOnDoorFrameAboutToMove); } } -void AsScene1201Match::sub40C420() { +void AsScene1201Match::stFallingFromDoorFrame() { setGlobalVar(0x0112090A, 2); _x -= 199; _y += 119; startAnimation(0x018D0240, 0, -1); - SetMessageHandler(&AsScene1201Match::handleMessage40C320); - NextState(&AsScene1201Match::sub40C4F0); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving); + NextState(&AsScene1201Match::stIdleOnFloor); } -void AsScene1201Match::sub40C470() { +void AsScene1201Match::stOnDoorFrameAboutToMove() { startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::handleMessage40C2D0); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); _newStickFrameIndex = 0; if (_status != 0) { _countdown = 36; _status--; - NextState(&AsScene1201Match::sub40C3E0); + NextState(&AsScene1201Match::stOnDoorFrameMoving); } } -void AsScene1201Match::sub40C4C0() { +void AsScene1201Match::stIdleOnDoorFrame() { startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::handleMessage40C360); + SetMessageHandler(&AsScene1201Match::hmIdle); _newStickFrameIndex = 0; } -void AsScene1201Match::sub40C4F0() { +void AsScene1201Match::stIdleOnFloor() { setDoDeltaX(1); _x = 403; _y = 337; startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::handleMessage40C360); + SetMessageHandler(&AsScene1201Match::hmIdle); _newStickFrameIndex = 0; } @@ -743,7 +728,7 @@ void AsScene1201LeftDoor::sub40D590() { Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _flag(false), _asMatch(NULL), _asTntMan(NULL), - _asCreature(NULL), _class466(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { + _asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { int16 topY1, topY2, topY3, topY4; int16 x1, x2; @@ -780,8 +765,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x04063110, 500); topY4 = tempSprite->getY() + 1; - _class466 = insertSprite(getGlobalVar(0x000CF819) && which != 1); - _class466->setClipRect(0, topY4, 640, 480); + _asTntManRope = insertSprite(getGlobalVar(0x000CF819) && which != 1); + _asTntManRope->setClipRect(0, topY4, 640, 480); insertStaticSprite(0x400B04B0, 1200); @@ -791,9 +776,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0xA29223FA, 1200); x2 = tempSprite->getX() + tempSprite->getDrawRect().width; - _class464 = insertSprite(); - - debug("Scene1201: which = %d", which); + _asKlaymanHead = insertSprite(); if (which < 0) { insertKlayman(364, 333); @@ -838,11 +821,11 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(0x000CF819)) { insertStaticSprite(0x10002ED8, 500); if (!getGlobalVar(0x0A18CA33)) { - _asTntMan = insertSprite(this, _class466, which == 1); + _asTntMan = insertSprite(this, _asTntManRope, which == 1); _asTntMan->setClipRect(x1, 0, x2, 480); _asTntMan->setRepl(64, 0); _vm->_collisionMan->addSprite(_asTntMan); - tempSprite = insertSprite(_asTntMan); + tempSprite = insertSprite(_asTntMan); tempSprite->setClipRect(x1, 0, x2, 480); } @@ -909,7 +892,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asLeftDoor = insertSprite(_klayman); _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); - if (getGlobalVar(0x0A310817) && ! getGlobalVar(0x0112090A)) { + if (getGlobalVar(0x0A310817) && getGlobalVar(0x0112090A) == 0) { setGlobalVar(0x0112090A, 1); } @@ -920,7 +903,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asMatch); } - if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(0x0A310817) && getGlobalVar(0x0A18CA33) == 0) { _asCreature = insertSprite(this, _klayman); _asCreature->setClipRect(x1, 0, x2, 480); } @@ -932,9 +915,8 @@ Scene1201::~Scene1201() { void Scene1201::update() { Scene::update(); - if (_asMatch && getGlobalVar(0x0112090A)) { + if (_asMatch && getGlobalVar(0x0112090A) == 3) deleteSprite(&_asMatch); - } } uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -967,9 +949,11 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2002: if (getGlobalVar(0x20A0C516)) { + // Move the TNT dummy sendEntityMessage(_klayman, 0x1014, _asTntMan); setMessageList2(0x004AECF0, false); } else if (getGlobalVar(0x0112090A) == 3) { + // Light the TNT dummy sendEntityMessage(_klayman, 0x1014, _asTntMan); if (_klayman->getX() > _asTntMan->getX()) { setMessageList(0x004AECD0); @@ -991,7 +975,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asRightDoor, 0x4829, 0); break; case 0x8000: - sendMessage(_class464, 0x2006, 0); + sendMessage(_asKlaymanHead, 0x2006, 0); break; } return messageResult; diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index b92ff9297f..671d1d7d98 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -51,14 +51,11 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class466 : public AnimatedSprite { +class AsScene1201TntManRope : public AnimatedSprite { public: - Class466(NeverhoodEngine *vm, bool flag); + AsScene1201TntManRope(NeverhoodEngine *vm, bool flag); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40D340(); - void sub40D360(); - void sub40D380(); }; class AsScene1201RightDoor : public AnimatedSprite { @@ -69,43 +66,43 @@ protected: int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40D7E0(); - void sub40D830(); - void sub40D880(); + void stOpenDoor(); + void stCloseDoor(); + void stCloseDoorDone(); }; -class Class464 : public AnimatedSprite { +class AsScene1201KlaymanHead : public AnimatedSprite { public: - Class464(NeverhoodEngine *vm); + AsScene1201KlaymanHead(NeverhoodEngine *vm); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene1201TntMan : public AnimatedSprite { public: - AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *class466, bool flag); + AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isDown); virtual ~AsScene1201TntMan(); protected: Scene *_parentScene; - Sprite *_class466; + Sprite *_asTntManRope; Sprite *_sprite; - bool _flag; + bool _isMoving; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40CCD0(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate40CD10(); - void sub40CD30(); - void sub40CD60(); - void sub40CD90(); + uint32 hmComingDown(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoving(); + void stStanding(); + void stComingDown(); + void stMoving(); }; -class Class465 : public AnimatedSprite { +class AsScene1201TntManFlame : public AnimatedSprite { public: - Class465(NeverhoodEngine *vm, Sprite *asTntMan); - ~Class465(); + AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan); + ~AsScene1201TntManFlame(); protected: Sprite *_asTntMan; void update(); - void spriteUpdate40D150(); + void suUpdate(); }; class AsScene1201Match : public AnimatedSprite { @@ -116,14 +113,14 @@ protected: int _countdown; int _status; void update(); - uint32 handleMessage40C2D0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40C320(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40C360(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40C3E0(); - void sub40C420(); - void sub40C470(); - void sub40C4C0(); - void sub40C4F0(); + uint32 hmOnDoorFrameAboutToMove(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmOnDoorFrameMoving(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmIdle(int messageNum, const MessageParam ¶m, Entity *sender); + void stOnDoorFrameMoving(); + void stFallingFromDoorFrame(); + void stOnDoorFrameAboutToMove(); + void stIdleOnDoorFrame(); + void stIdleOnFloor(); }; class AsScene1201Creature : public AnimatedSprite { @@ -173,11 +170,11 @@ protected: Sprite *_asMatch; AsScene1201TntMan *_asTntMan; Sprite *_asCreature; - Sprite *_class466; + Sprite *_asTntManRope; Sprite *_asLeftDoor; Sprite *_asRightDoor; Sprite *_asTape; - Sprite *_class464; + Sprite *_asKlaymanHead; bool _flag; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 7b0b3000a771e423deb840bf6789c7a73e90db6f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 17:44:48 +0000 Subject: NEVERHOOD: Rename stuff in Module1200 - Remove unused countdowns/code in AsScene1201Creature - Fix AudioResourceMan::isSoundPlaying --- engines/neverhood/module1200.cpp | 171 +++++++++++++++++++-------------------- engines/neverhood/module1200.h | 43 +++++----- engines/neverhood/sound.cpp | 2 +- 3 files changed, 104 insertions(+), 112 deletions(-) diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index efdb6debb7..191789d723 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -574,22 +574,23 @@ void AsScene1201Match::stIdleOnFloor() { } AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _flag(false) { + : AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _klaymanTooClose(false) { + + // NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed createSurface(1100, 203, 199); SetUpdateHandler(&AsScene1201Creature::update); - SetMessageHandler(&AsScene1201Creature::handleMessage40C710); + SetMessageHandler(&AsScene1201Creature::hmWaiting); _x = 540; _y = 320; - sub40C8E0(); - _countdown3 = 2; + stWaiting(); } void AsScene1201Creature::update() { - bool oldFlag = _flag; - _flag = _x >= 385; - if (_flag != oldFlag) - sub40C8E0(); + bool oldFlag = _klaymanTooClose; + _klaymanTooClose = _klayman->getX() >= 385; + if (_klaymanTooClose != oldFlag) + stWaiting(); if (_countdown1 != 0 && (--_countdown1 == 0)) { gotoNextState(); } @@ -598,7 +599,7 @@ void AsScene1201Creature::update() { updatePosition(); } -uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -607,25 +608,18 @@ uint32 AsScene1201Creature::handleMessage40C710(int messageNum, const MessagePar } break; case 0x2004: - GotoState(&AsScene1201Creature::sub40C960); + GotoState(&AsScene1201Creature::stStartReachForTntDummy); break; case 0x2006: - GotoState(&AsScene1201Creature::sub40C9B0); + GotoState(&AsScene1201Creature::stPincerSnapKlayman); break; } return messageResult; } -uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage40C710(messageNum, param, sender); +uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmWaiting(messageNum, param, sender); switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02421405) { - if (_countdown2 != 0 && (--_countdown2 == 0)) { - sub40C990(); - } - } - break; case 0x3002: gotoNextState(); break; @@ -633,7 +627,7 @@ uint32 AsScene1201Creature::handleMessage40C7B0(int messageNum, const MessagePar return messageResult; } -uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201Creature::hmPincerSnapKlayman(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -650,45 +644,38 @@ uint32 AsScene1201Creature::handleMessage40C830(int messageNum, const MessagePar return messageResult; } -void AsScene1201Creature::sub40C8E0() { - _countdown3--; - if (_countdown3 == 0) - _countdown3 = 3; +void AsScene1201Creature::stWaiting() { startAnimation(0x08081513, 0, -1); - SetMessageHandler(&AsScene1201Creature::handleMessage40C710); - NextState(&AsScene1201Creature::sub40C930); + SetMessageHandler(&AsScene1201Creature::hmWaiting); + NextState(&AsScene1201Creature::stPincerSnap); _countdown1 = 36; } -void AsScene1201Creature::sub40C930() { - if (!_flag) { +void AsScene1201Creature::stPincerSnap() { + if (!_klaymanTooClose) { startAnimation(0xCA287133, 0, -1); - SetMessageHandler(&AsScene1201Creature::handleMessage40C7B0); - NextState(&AsScene1201Creature::sub40C8E0); + SetMessageHandler(&AsScene1201Creature::hmPincerSnap); + NextState(&AsScene1201Creature::stWaiting); } } -void AsScene1201Creature::sub40C960() { +void AsScene1201Creature::stStartReachForTntDummy() { startAnimation(0x08081513, 0, -1); - SetMessageHandler(&AsScene1201Creature::handleMessage40C710); - NextState(&AsScene1201Creature::sub40C9E0); + SetMessageHandler(&AsScene1201Creature::hmWaiting); + NextState(&AsScene1201Creature::stReachForTntDummy); _countdown1 = 48; } -void AsScene1201Creature::sub40C990() { - startAnimationByHash(0x0B6E13FB, 0x01084280, 0); -} - -void AsScene1201Creature::sub40C9B0() { - startAnimation(0xCA287133, 0, -1); - SetMessageHandler(&AsScene1201Creature::handleMessage40C830); - NextState(&AsScene1201Creature::sub40C8E0); +void AsScene1201Creature::stReachForTntDummy() { + startAnimation(0x5A201453, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmWaiting); _countdown1 = 0; } -void AsScene1201Creature::sub40C9E0() { - startAnimation(0x5A201453, 0, -1); - SetMessageHandler(&AsScene1201Creature::handleMessage40C710); +void AsScene1201Creature::stPincerSnapKlayman() { + startAnimation(0xCA287133, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlayman); + NextState(&AsScene1201Creature::stWaiting); _countdown1 = 0; } @@ -714,13 +701,13 @@ uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam &pa uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4809: - sub40D590(); + stCloseDoor(); break; } return messageResult; } -void AsScene1201LeftDoor::sub40D590() { +void AsScene1201LeftDoor::stCloseDoor() { startAnimation(0x508A111B, -1, -1); _playBackwards = true; _newStickFrameIndex = 0; @@ -1029,36 +1016,36 @@ static const uint32 kScene1202FileHashes[] = { 0x1AC14B8 }; -AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _index(index) { +AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _itemIndex(itemIndex) { int positionIndex; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0); - positionIndex = getSubVar(0x10055D14, _index); + SetMessageHandler(&AsScene1202TntItem::hmShowIdle); + positionIndex = getSubVar(0x10055D14, _itemIndex); createSurface(900, 37, 67); _x = kScene1202Points[positionIndex].x; _y = kScene1202Points[positionIndex].y; - sub4540A0(); + stShowIdle(); } -uint32 AsScene1202TntItem::handleMessage453FE0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - sendMessage(_parentScene, 0x2000, _index); + sendMessage(_parentScene, 0x2000, _itemIndex); messageResult = 1; break; case 0x2001: - _index2 = (int)param.asInteger(); - sub4540D0(); + _newPosition = (int)param.asInteger(); + stChangePositionFadeOut(); break; } return messageResult; } -uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -1068,37 +1055,37 @@ uint32 AsScene1202TntItem::handleMessage454060(int messageNum, const MessagePara return messageResult; } -void AsScene1202TntItem::sub4540A0() { - startAnimation(kScene1202FileHashes[_index], 0, -1); - SetMessageHandler(&AsScene1202TntItem::handleMessage453FE0); +void AsScene1202TntItem::stShowIdle() { + startAnimation(kScene1202FileHashes[_itemIndex], 0, -1); + SetMessageHandler(&AsScene1202TntItem::hmShowIdle); _newStickFrameIndex = 0; } -void AsScene1202TntItem::sub4540D0() { - startAnimation(kScene1202FileHashes[_index], 0, -1); - SetMessageHandler(&AsScene1202TntItem::handleMessage454060); - NextState(&AsScene1202TntItem::sub454100); +void AsScene1202TntItem::stChangePositionFadeOut() { + startAnimation(kScene1202FileHashes[_itemIndex], 0, -1); + SetMessageHandler(&AsScene1202TntItem::hmChangePosition); + NextState(&AsScene1202TntItem::stChangePositionFadeIn); } -void AsScene1202TntItem::sub454100() { - _x = kScene1202Points[_index2].x; - _y = kScene1202Points[_index2].y; - startAnimation(kScene1202FileHashes[_index], 6, -1); - SetMessageHandler(&AsScene1202TntItem::handleMessage454060); - NextState(&AsScene1202TntItem::sub454160); +void AsScene1202TntItem::stChangePositionFadeIn() { + _x = kScene1202Points[_newPosition].x; + _y = kScene1202Points[_newPosition].y; + startAnimation(kScene1202FileHashes[_itemIndex], 6, -1); + SetMessageHandler(&AsScene1202TntItem::hmChangePosition); + NextState(&AsScene1202TntItem::stChangePositionDone); _playBackwards = true; } -void AsScene1202TntItem::sub454160() { - sendMessage(_parentScene, 0x2002, _index); - sub4540A0(); +void AsScene1202TntItem::stChangePositionDone() { + sendMessage(_parentScene, 0x2002, _itemIndex); + stShowIdle(); } Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _paletteResource(vm), - _flag(true), _soundFlag(false), _counter(0), _index(-1) { + _flag(true), _soundFlag(false), _counter(0), _clickedIndex(-1) { - SetMessageHandler(&Scene1202::handleMessage453C10); + SetMessageHandler(&Scene1202::handleMessage); SetUpdateHandler(&Scene1202::update); _surfaceFlag = true; @@ -1121,7 +1108,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x8E8419C1, 1100); if (getGlobalVar(0x000CF819)) { - SetMessageHandler(&Scene1202::handleMessage453D90); + SetMessageHandler(&Scene1202::hmSolved); } playSound(0, 0x40106542); @@ -1140,23 +1127,25 @@ Scene1202::~Scene1202() { void Scene1202::update() { Scene::update(); if (_soundFlag) { + debug("CHECK SOLVED"); if (!isSoundPlaying(3)) leaveScene(0); } else if (_counter == 0 && isSolved()) { - SetMessageHandler(&Scene1202::handleMessage453D90); + _clickedIndex = 0; + SetMessageHandler(&Scene1202::hmSolved); setGlobalVar(0x000CF819, 1); doPaletteEffect(); playSound(3); _soundFlag = true; - } else if (_index >= 0 && _counter == 0) { - int index2 = kScene1202Table[_index]; - sendMessage(_asTntItems[_index], 0x2001, getSubVar(0x10055D14, index2)); - sendMessage(_asTntItems[index2], 0x2001, getSubVar(0x10055D14, _index)); - int temp = getSubVar(0x10055D14, index2); - setSubVar(0x10055D14, index2, getSubVar(0x10055D14, _index)); - setSubVar(0x10055D14, _index, temp); + } else if (_clickedIndex >= 0 && _counter == 0) { + int destIndex = kScene1202Table[_clickedIndex]; + sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(0x10055D14, destIndex)); + sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(0x10055D14, _clickedIndex)); + int temp = getSubVar(0x10055D14, destIndex); + setSubVar(0x10055D14, destIndex, getSubVar(0x10055D14, _clickedIndex)); + setSubVar(0x10055D14, _clickedIndex, temp); _counter = 2; - _index = -1; + _clickedIndex = -1; if (_flag) { playSound(1); } else { @@ -1166,7 +1155,7 @@ void Scene1202::update() { } } -uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene1202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -1183,7 +1172,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam ¶m, } break; case 0x2000: - _index = (int)param.asInteger(); + _clickedIndex = (int)param.asInteger(); break; case 0x2002: _counter--; @@ -1192,7 +1181,7 @@ uint32 Scene1202::handleMessage453C10(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene1202::hmSolved(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: @@ -1205,6 +1194,12 @@ uint32 Scene1202::handleMessage453D90(int messageNum, const MessageParam ¶m, } bool Scene1202::isSolved() { + + debug("isSolved() %d %d %d %d %d %d", + getSubVar(0x10055D14, 0), getSubVar(0x10055D14, 3), + getSubVar(0x10055D14, 6), getSubVar(0x10055D14, 9), + getSubVar(0x10055D14, 12), getSubVar(0x10055D14, 15)); + return getSubVar(0x10055D14, 0) == 0 && getSubVar(0x10055D14, 3) == 3 && getSubVar(0x10055D14, 6) == 6 && getSubVar(0x10055D14, 9) == 9 && diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index 671d1d7d98..bc3281c233 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -130,19 +130,16 @@ protected: Scene *_parentScene; Sprite *_klayman; int _countdown1; - int _countdown2; - int _countdown3; - bool _flag; + bool _klaymanTooClose; void update(); - uint32 handleMessage40C710(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40C7B0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage40C830(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40C8E0(); - void sub40C930(); - void sub40C960(); - void sub40C990(); - void sub40C9B0(); - void sub40C9E0(); + uint32 hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPincerSnapKlayman(int messageNum, const MessageParam ¶m, Entity *sender); + void stWaiting(); + void stPincerSnap(); + void stStartReachForTntDummy(); + void stReachForTntDummy(); + void stPincerSnapKlayman(); }; class AsScene1201LeftDoor : public AnimatedSprite { @@ -151,7 +148,7 @@ public: protected: Sprite *_klayman; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub40D590(); + void stCloseDoor(); }; class SsScene1201Tnt : public StaticSprite { @@ -187,13 +184,13 @@ public: AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index); protected: Scene *_parentScene; - int _index, _index2; - uint32 handleMessage453FE0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage454060(int messageNum, const MessageParam ¶m, Entity *sender); - void sub4540A0(); - void sub4540D0(); - void sub454100(); - void sub454160(); + int _itemIndex, _newPosition; + uint32 hmShowIdle(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmChangePosition(int messageNum, const MessageParam ¶m, Entity *sender); + void stShowIdle(); + void stChangePositionFadeOut(); + void stChangePositionFadeIn(); + void stChangePositionDone(); }; class Scene1202 : public Scene { @@ -204,13 +201,13 @@ protected: PaletteResource _paletteResource; Sprite *_asTntItems[18]; int _counter; - int _index; + int _clickedIndex; byte _paletteData[1024]; bool _soundFlag; bool _flag; void update(); - uint32 handleMessage453C10(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage453D90(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSolved(int messageNum, const MessageParam ¶m, Entity *sender); bool isSolved(); void doPaletteEffect(); }; diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index c1db48c637..18f40dccaa 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -616,7 +616,7 @@ void AudioResourceMan::stopSound(int16 soundIndex) { bool AudioResourceMan::isSoundPlaying(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - return soundItem->_isPlaying; + return _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle); } int16 AudioResourceMan::loadMusic(uint32 fileHash) { -- cgit v1.2.3 From 106ec42124de3fd68a2584ba1ae14f15ad4832d9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 21:40:28 +0000 Subject: NEVERHOOD: Work on Module1300: - Remove Class595, only used for setting the surface priority via a message - Rename stuff and fix some errors --- engines/neverhood/module1300.cpp | 157 +++++++++++++++++---------------------- engines/neverhood/module1300.h | 62 +++++++--------- 2 files changed, 95 insertions(+), 124 deletions(-) diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index f3677a1d29..42e8a73acc 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -404,25 +404,6 @@ void SsScene1302Fence::suMoveUp() { } } -Class595::Class595(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 0xB0420130, 1015), _parentScene(parentScene) { - - SetMessageHandler(&Class595::handleMessage); -} - -uint32 Class595::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x482A: - sendMessage(_parentScene, 0x1022, 995); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1015); - break; - } - return messageResult; -} - Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -434,7 +415,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x420643C4); insertMouse433(0x643C0428); - _class595 = insertSprite(this); + _class595 = insertStaticSprite(0xB0420130, 1015); _sprite1 = insertStaticSprite(0x942FC224, 300); _sprite2 = insertStaticSprite(0x70430830, 1200); _sprite2->setVisible(false); @@ -588,10 +569,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asVenusFlyTrap, 0x482A, 0); break; case 0x8000: - sendMessage(_class595, 0x482A, 0); + setSpriteSurfacePriority(_class595, 995); break; case 0x8001: - sendMessage(_class595, 0x482B, 0); + setSpriteSurfacePriority(_class595, 1015); break; } return messageResult; @@ -688,18 +669,14 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -Class544::Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) +AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { - - if (getGlobalVar(0x31C63C51)) { - setVisible(false); - SetMessageHandler(NULL); - } else { - SetMessageHandler(&Class544::handleMessage); - } + + // NOTE: Skipped check if Klayman already has the needle since that's done in the scene itself + SetMessageHandler(&AsScene1304Needle::handleMessage); } -uint32 Class544::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -735,10 +712,10 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) } if (!getGlobalVar(0x31C63C51)) { - _class544 = insertSprite(this, 1100, 278, 347); - _vm->_collisionMan->addSprite(_class544); + _asNeedle = insertSprite(this, 1100, 278, 347); + _vm->_collisionMan->addSprite(_asNeedle); } else { - _class544 = NULL; + _asNeedle = NULL; } _sprite1 = insertStaticSprite(0x0562E621, 1100); @@ -770,8 +747,8 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4826: - if (sender == _class544) { - sendEntityMessage(_klayman, 0x1014, _class544); + if (sender == _asNeedle) { + sendEntityMessage(_klayman, 0x1014, _asNeedle); setMessageList(0x004B9130); } else if (sender == _class545) { sendEntityMessage(_klayman, 0x1014, _class545); @@ -1021,7 +998,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit } } else if (sender == _asTape) { if (_klayman->getX() >= 249) { - sendEntityMessage(_klayman, 0x1014, _class545); + sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004AFC68); } } @@ -1279,10 +1256,11 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { - //DEBUG + //DEBUG>>> setSubVar(0x08D0AB11, 0, 1); setSubVar(0x08D0AB11, 1, 1); setSubVar(0x08D0AB11, 2, 1); + //DEBUG<<< Sprite *tempSprite; @@ -1422,7 +1400,7 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -static const uint32 kScene1308FileHashes[] = { +static const uint32 kScene1308NumberFileHashes[] = { 0x08006320, 0x10006320, 0x20006320, @@ -1441,65 +1419,65 @@ static const uint32 kScene1308FileHashes[] = { 0x00306322 }; -Class549::Class549(NeverhoodEngine *vm, Scene *parentScene) +AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) { - SetMessageHandler(&Class549::handleMessage); + SetMessageHandler(&AsScene1308JaggyDoor::handleMessage); setVisible(false); stopAnimation(); } -uint32 Class549::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextState(); break; case 0x4808: - sub455470(); + stOpenDoor(); break; case 0x4809: - sub4554F0(); + stCloseDoor(); break; } return messageResult; } -void Class549::sub455470() { +void AsScene1308JaggyDoor::stOpenDoor() { startAnimation(0xBA0AE050, 0, -1); setVisible(true); - NextState(&Class549::hide); + NextState(&AsScene1308JaggyDoor::stOpenDoorDone); playSound(0, calcHash("fxDoorOpen38")); } -void Class549::hide() { +void AsScene1308JaggyDoor::stOpenDoorDone() { sendMessage(_parentScene, 0x2000, 0); stopAnimation(); setVisible(false); } -void Class549::sub4554F0() { +void AsScene1308JaggyDoor::stCloseDoor() { startAnimation(0xBA0AE050, -1, -1); _playBackwards = true; setVisible(true); - NextState(&Class549::sub455550); + NextState(&AsScene1308JaggyDoor::stCloseDoorDone); playSound(0, calcHash("fxDoorClose38")); } -void Class549::sub455550() { +void AsScene1308JaggyDoor::stCloseDoorDone() { sendMessage(_parentScene, 0x2001, 0); stopAnimation(); } -Class592::Class592(NeverhoodEngine *vm, Scene *parentScene) +AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) { - SetMessageHandler(&Class592::handleMessage); - NextState(&Class592::sub455710); + SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage); + NextState(&AsScene1308KeyboardDoor::stFallingKeys); playSound(0, 0x51456049); } -uint32 Class592::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -1509,36 +1487,37 @@ uint32 Class592::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class592::sub455710() { +void AsScene1308KeyboardDoor::stFallingKeys() { startAnimation(0x6238B191, 0, -1); - NextState(&Class592::sub455740); + NextState(&AsScene1308KeyboardDoor::stFallingKeysDone); _x = 580; _y = 383; } -void Class592::sub455740() { +void AsScene1308KeyboardDoor::stFallingKeysDone() { sendMessage(_parentScene, 0x2004, 0); stopAnimation(); setVisible(false); } -Class593::Class593(NeverhoodEngine *vm, Scene *parentScene) +AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) { - SetMessageHandler(&Class593::handleMessage); + SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage); setVisible(false); stopAnimation(); Entity::_priority = 1200; } -uint32 Class593::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2002: - sub4558F0(); + stFadeIn(); break; case 0x2003: - sub455920(); + stFadeOut(); + break; case 0x3002: gotoNextState(); break; @@ -1546,25 +1525,25 @@ uint32 Class593::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class593::sub4558F0() { +void AsScene1308LightWallSymbols::stFadeIn() { startAnimation(0x80180A10, 0, -1); - setVisible(false); + setVisible(true); _newStickFrameIndex = -2; } -void Class593::sub455920() { +void AsScene1308LightWallSymbols::stFadeOut() { startAnimation(0x80180A10, -1, -1); _playBackwards = true; - NextState(&Class593::sub455950); + NextState(&AsScene1308LightWallSymbols::stFadeOutDone); } -void Class593::sub455950() { +void AsScene1308LightWallSymbols::stFadeOutDone() { sendMessage(_parentScene, 0x2003, 0); stopAnimation(); setVisible(false); } -Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index) +SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index) : StaticSprite(vm, fileHash, 100) { setVisible(false); @@ -1572,18 +1551,18 @@ Class601::Class601(NeverhoodEngine *vm, uint32 fileHash, int index) StaticSprite::update(); } -Class513::Class513(NeverhoodEngine *vm) +AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100) { SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class513::handleMessage); + SetMessageHandler(&AsScene1308Mouse::handleMessage); _x = 286; _y = 429; createSurface1(0xA282C472, 100); startAnimation(0xA282C472, 0, -1); } -uint32 Class513::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1615,22 +1594,22 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); if (getGlobalVar(0x01023818)) { - insertSprite(); + insertSprite(); insertSprite(0x461A1490, 200, 235, 429); } _sprite1 = insertStaticSprite(0x0A042060, 1100); - _class549 = insertSprite(this); - _class593 = insertSprite(this); + _asJaggyDoor = insertSprite(this); + _asLightWallSymbols = insertSprite(this); - _class601_1 = insertSprite(kScene1308FileHashes[getSubVar(0x0C10A000, 1)], 0); - _class601_2 = insertSprite(kScene1308FileHashes[getSubVar(0x0C10A000, 0)], 1); - _class601_2 = insertSprite(kScene1308FileHashes[getSubVar(0x0C10A000, 2)], 2); + _ssNumber1 = insertSprite(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 1)], 0); + _ssNumber2 = insertSprite(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 0)], 1); + _ssNumber3 = insertSprite(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 2)], 2); _sprite2 = insertStaticSprite(0x40043120, 995); _sprite3 = insertStaticSprite(0x43003100, 995); _sprite4 = NULL; - + if (which < 0) { insertKlayman(380, 440); setMessageList(0x004B57C0); @@ -1655,7 +1634,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(475, 440); setMessageList(0x004B58B0); if (getGlobalVar(0x80455A41)) { - _sprite5 = insertSprite(this); + _sprite5 = insertSprite(this); _sprite4 = insertStaticSprite(0x0101A624, 1100); _sprite4->setVisible(false); } else { @@ -1665,7 +1644,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } else { insertKlayman(41, 440); setMessageList(0x004B57D0); - sendMessage(_class549, 0x4808, 0); + sendMessage(_asJaggyDoor, 0x4808, 0); _sprite1->setVisible(false); if (getGlobalVar(0x80455A41)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1710,7 +1689,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit _flag1 = false; } else if (param.asInteger() == 0x4AC68808) { clearRectList(); - sendMessage(_class549, 0x4809, 0); + sendMessage(_asJaggyDoor, 0x4809, 0); _sprite1->setVisible(false); _klayman->setVisible(false); } @@ -1737,22 +1716,22 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit leaveScene(0); break; case 0x2003: - _class601_1->setVisible(false); - _class601_2->setVisible(false); - _class601_3->setVisible(false); + _ssNumber1->setVisible(false); + _ssNumber2->setVisible(false); + _ssNumber3->setVisible(false); break; case 0x2004: _sprite4->setVisible(true); setRectList(0x004B5990); break; case 0x4807: - sendMessage(_class593, 0x2003, 0); + sendMessage(_asLightWallSymbols, 0x2003, 0); break; case 0x480F: - sendMessage(_class593, 0x2002, 0); - _class601_1->setVisible(true); - _class601_2->setVisible(true); - _class601_3->setVisible(true); + sendMessage(_asLightWallSymbols, 0x2002, 0); + _ssNumber1->setVisible(true); + _ssNumber2->setVisible(true); + _ssNumber3->setVisible(true); break; case 0x4826: if (sender == _class489) { diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index b6761ddb03..70d6f3a000 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -64,14 +64,6 @@ protected: void suMoveUp(); }; -class Class595 : public StaticSprite { -public: - Class595(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - class Scene1302 : public Scene { public: Scene1302(NeverhoodEngine *vm, Module *parentModule, int which); @@ -110,9 +102,9 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class544 : public AnimatedSprite { +class AsScene1304Needle : public AnimatedSprite { public: - Class544(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y); + AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -124,7 +116,7 @@ public: protected: Sprite *_sprite1; Sprite *_class545; - Sprite *_class544; + Sprite *_asNeedle; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -209,47 +201,47 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class549 : public AnimatedSprite { +class AsScene1308JaggyDoor : public AnimatedSprite { public: - Class549(NeverhoodEngine *vm, Scene *parentScene); + AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub455470(); - void hide(); - void sub4554F0(); - void sub455550(); + void stOpenDoor(); + void stOpenDoorDone(); + void stCloseDoor(); + void stCloseDoorDone(); }; -class Class592 : public AnimatedSprite { +class AsScene1308KeyboardDoor : public AnimatedSprite { public: - Class592(NeverhoodEngine *vm, Scene *parentScene); + AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub455710(); - void sub455740(); + void stFallingKeys(); + void stFallingKeysDone(); }; -class Class593 : public AnimatedSprite { +class AsScene1308LightWallSymbols : public AnimatedSprite { public: - Class593(NeverhoodEngine *vm, Scene *parentScene); + AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub4558F0(); - void sub455920(); - void sub455950(); + void stFadeIn(); + void stFadeOut(); + void stFadeOutDone(); }; -class Class601 : public StaticSprite { +class SsScene1308Number : public StaticSprite { public: - Class601(NeverhoodEngine *vm, uint32 fileHash, int index); + SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index); }; -class Class513 : public AnimatedSprite { +class AsScene1308Mouse : public AnimatedSprite { public: - Class513(NeverhoodEngine *vm); + AsScene1308Mouse(NeverhoodEngine *vm); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -259,11 +251,11 @@ public: Scene1308(NeverhoodEngine *vm, Module *parentModule, int which); protected: Sprite *_asTape; - Sprite *_class549; - Sprite *_class593; - Sprite *_class601_1; - Sprite *_class601_2; - Sprite *_class601_3; + Sprite *_asJaggyDoor; + Sprite *_asLightWallSymbols; + Sprite *_ssNumber1; + Sprite *_ssNumber2; + Sprite *_ssNumber3; AnimatedSprite *_class489; Sprite *_sprite1; Sprite *_sprite2; -- cgit v1.2.3 From eefa175a2fb4ea0ccb6ed4f5fbc7477bc088278c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 4 Oct 2012 21:41:38 +0000 Subject: NEVERHOOD: Update todo.txt --- engines/neverhood/gamemodule.cpp | 13 +++++++++++-- engines/neverhood/todo.txt | 14 +++++++++----- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e3787757b0..e6564f3436 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -298,9 +298,18 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM // createModule(1500, 0); // Logos and intro video //Real + + // DEBUG>>> + setGlobalVar(0x0A310817, 1); + setGlobalVar(0x0A18CA33, 0); + setGlobalVar(0x0112090A, 0); + //setGlobalVar(0x000CF819, 1); + // <<gameState().sceneNum = 1; - createModule(1000, -1); + _vm->gameState().sceneNum = 7; + createModule(1300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt index abf8f27f84..5561ead209 100644 --- a/engines/neverhood/todo.txt +++ b/engines/neverhood/todo.txt @@ -18,20 +18,24 @@ TODOs which can be done any time: TODOs which should be done only after the game logic is finished: ------------------------------------------------------------------- - Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary -- Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors) - - Should be just a handle object which initializes itself - - Play routine should fill the handle so it can be stopped/queried later - - Basically like ScummVM own sound handles - Rework the resource system - The current system can be simplified a lot - Also resource purging needs to be implemented -- RE and implement yet unknown music/sound stuff - Implement game menus - Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes) - This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included - The move special scenes (SmackerScene) into the scenes file - Maybe merge CollisionMan with Scene (since it's so far never used independently) +DONE: +------- +- Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors) + - Should be just a handle object which initializes itself + - Play routine should fill the handle so it can be stopped/queried later + - Basically like ScummVM own sound handles +- RE and implement yet unknown music/sound stuff + + TODOs which are experimental: ------------------------------- NOTE: Since they affect the whole game, they really should be only implemented once the full game logic is implemented. -- cgit v1.2.3 From 39d1982e47e2785346832e0e3c6898447b07672b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 5 Oct 2012 11:19:40 +0000 Subject: NEVERHOOD: Work on Module1400: - Rename stuff - Fix some bugs (mistyped message numbers...) - More to come --- engines/neverhood/module1300.cpp | 22 +-- engines/neverhood/module1300.h | 2 +- engines/neverhood/module1400.cpp | 348 +++++++++++++++++++-------------------- engines/neverhood/module1400.h | 64 ++++--- 4 files changed, 217 insertions(+), 219 deletions(-) diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 42e8a73acc..35132b6dca 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1662,12 +1662,12 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x04A105B3) == 4) { - _class489 = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_class489); - _class489->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); - _class489->setRepl(64, 0); + _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _vm->_collisionMan->addSprite(_asProjector); + _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); + _asProjector->setRepl(64, 0); } else { - _class489 = NULL; + _asProjector = NULL; } } @@ -1680,7 +1680,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B59A0); _flag1 = true; } else if (param.asInteger() == 0x08821382) { - sendEntityMessage(_klayman, 0x1014, _class489); + sendEntityMessage(_klayman, 0x1014, _asProjector); if (getGlobalVar(0x80455A41)) { setRectList(0x004B5990); } else { @@ -1695,7 +1695,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x1022: - if (sender == _class489) { + if (sender == _asProjector) { if (param.asInteger() >= 1000) setSurfacePriority(_sprite3->getSurface(), 1100); else @@ -1734,15 +1734,15 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit _ssNumber3->setVisible(true); break; case 0x4826: - if (sender == _class489) { + if (sender == _asProjector) { if (_flag1) { setMessageList2(0x004B5868); } else { if (param.asInteger() == 1) { - sendEntityMessage(_klayman, 0x1014, _class489); + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B5848); - } else if (sendMessage(_class489, 0x480C, _klayman->getX() <= _class489->getX() ? 0 : 1) != 0) { - sendEntityMessage(_klayman, 0x1014, _class489); + } else if (sendMessage(_asProjector, 0x480C, _klayman->getX() <= _asProjector->getX() ? 0 : 1) != 0) { + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B5830); } else { setMessageList2(0x004B5800); diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index 70d6f3a000..b458602901 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -256,7 +256,7 @@ protected: Sprite *_ssNumber1; Sprite *_ssNumber2; Sprite *_ssNumber3; - AnimatedSprite *_class489; + AnimatedSprite *_asProjector; Sprite *_sprite1; Sprite *_sprite2; Sprite *_sprite3; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index a8c8b3cc35..33ec0fca2e 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -134,23 +134,23 @@ void Module1400::updateScene() { // Scene1401 -Class525::Class525(NeverhoodEngine *vm) +AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) { // TODO createSurface3(900, dword_4B6768); createSurface(900, 640, 480); //TODO: Remeove once the line above is done _x = 454; _y = 217; - SetUpdateHandler(&Class525::update4662A0); - SetMessageHandler(&Class525::handleMessage466320); + SetMessageHandler(&AsScene1401Pipe::handleMessage466320); + SetUpdateHandler(&AsScene1401Pipe::update4662A0); startAnimation(0x4C210500, 0, -1); } -Class525::~Class525() { +AsScene1401Pipe::~AsScene1401Pipe() { _vm->_soundMan->deleteSoundGroup(0x01104C08); } -void Class525::update4662A0() { +void AsScene1401Pipe::update4662A0() { AnimatedSprite::update(); if (_countdown1 != 0 && (--_countdown1 == 0)) { sub466460(); @@ -161,14 +161,14 @@ void Class525::update4662A0() { } } -void Class525::update466300() { +void AsScene1401Pipe::update466300() { AnimatedSprite::update(); if (_countdown1 != 0) { _countdown1--; } } -uint32 Class525::handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401Pipe::handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -188,7 +188,7 @@ uint32 Class525::handleMessage466320(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401Pipe::handleMessage4663C0(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -197,43 +197,43 @@ uint32 Class525::handleMessage4663C0(int messageNum, const MessageParam ¶m, } else { sub466460(); } - SetMessageHandler(&Class525::handleMessage466320); - SetUpdateHandler(&Class525::update4662A0); + SetMessageHandler(&AsScene1401Pipe::handleMessage466320); + SetUpdateHandler(&AsScene1401Pipe::update4662A0); break; } return messageResult; } -void Class525::sub466420() { +void AsScene1401Pipe::sub466420() { startAnimation(0x4C240100, 0, -1); playSound(0, 0x4A30063F); } -void Class525::sub466460() { +void AsScene1401Pipe::sub466460() { _vm->_soundMan->deleteSound(0x4A116437); playSound(0, 0x4A120435); startAnimation(0x4C210500, 0, -1); } -void Class525::sub4664B0() { +void AsScene1401Pipe::sub4664B0() { startAnimation(0x6C210810, 0, -1); - SetMessageHandler(&Class525::handleMessage4663C0); - SetUpdateHandler(&Class525::update466300); + SetMessageHandler(&AsScene1401Pipe::handleMessage4663C0); + SetUpdateHandler(&AsScene1401Pipe::update466300); } -Class526::Class526(NeverhoodEngine *vm, Sprite *class525) - : AnimatedSprite(vm, 1100), _class525(class525) { +AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { // TODO createSurface3(100, dword_4B6778); createSurface(100, 640, 480); //TODO: Remeove once the line above is done _x = 478; _y = 433; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class526::handleMessage); + SetMessageHandler(&AsScene1401Mouse::handleMessage); startAnimation(0xA282C472, 0, -1); } -uint32 Class526::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -246,13 +246,13 @@ uint32 Class526::handleMessage(int messageNum, const MessageParam ¶m, Entity } break; case 0x4839: - sub466770(); + stSuckedIn(); break; } return messageResult; } -void Class526::spriteUpdate466720() { +void AsScene1401Mouse::suSuckedIn() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { playSound(0, 0x0E32247F); @@ -263,34 +263,34 @@ void Class526::spriteUpdate466720() { } } -void Class526::sub466770() { +void AsScene1401Mouse::stSuckedIn() { startAnimation(0x34880040, 0, -1); - SetSpriteUpdate(&Class526::spriteUpdate466720); + SetSpriteUpdate(&AsScene1401Mouse::suSuckedIn); } -Class527::Class527(NeverhoodEngine *vm, Sprite *class526) - : AnimatedSprite(vm, 1100), _class526(class526) { +AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { // TODO createSurface3(200, dword_4B6768); createSurface(200, 640, 480); //TODO: Remeove once the line above is done _x = 427; _y = 433; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class527::handleMessage); + SetMessageHandler(&AsScene1401Cheese::handleMessage); startAnimation(0x461A1490, 0, -1); } -uint32 Class527::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4839: - sub466970(); + stSuckedIn(); break; } return messageResult; } -void Class527::spriteUpdate466920() { +void AsScene1401Cheese::suSuckedIn() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { playSound(0, 0x18020439); @@ -301,82 +301,82 @@ void Class527::spriteUpdate466920() { } } -void Class527::sub466970() { +void AsScene1401Cheese::stSuckedIn() { startAnimation(0x103B8020, 0, -1); - SetSpriteUpdate(&Class527::spriteUpdate466920); + SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn); } -Class528::Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag) +AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen) : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { _x = 320; _y = 240; createSurface1(0x04551900, 100); - SetUpdateHandler(&Class528::update); - SetMessageHandler(&Class528::handleMessage); + SetUpdateHandler(&AsScene1401BackDoor::update); + SetMessageHandler(&AsScene1401BackDoor::handleMessage); _newStickFrameIndex = -2; - if (flag) { - _flag = true; + if (isOpen) { + _isOpen = true; startAnimation(0x04551900, -1,- 1); _countdown = 48; } else { - _flag = false; + _isOpen = false; stopAnimation(); setVisible(false); } } -void Class528::update() { +void AsScene1401BackDoor::update() { if (_countdown != 0 && (--_countdown == 0)) { - sub466C50(); + stCloseDoor(); } AnimatedSprite::update(); } -uint32 Class528::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2001: - if (_flag) + if (_isOpen) _countdown = 168; - messageResult = _flag ? 1 : 0; + messageResult = _isOpen ? 1 : 0; break; case 0x3002: gotoNextState(); break; case 0x4808: _countdown = 168; - if (_flag) - sub466BF0(); + if (_isOpen) + stOpenDoor(); break; } return messageResult; } -void Class528::sub466BF0() { - _flag = true; +void AsScene1401BackDoor::stOpenDoor() { + _isOpen = true; setVisible(true); startAnimation(0x04551900, 0, -1); _newStickFrameIndex = -2; playSound(0, calcHash("fxDoorOpen24")); } -void Class528::sub466C50() { - _flag = false; +void AsScene1401BackDoor::stCloseDoor() { + _isOpen = false; setVisible(true); startAnimation(0x04551900, -1, -1); playSound(0, calcHash("fxDoorClose24")); _playBackwards = true; - NextState(&Class528::sub466CB0); + NextState(&AsScene1401BackDoor::stCloseDoorDone); } -void Class528::sub466CB0() { +void AsScene1401BackDoor::stCloseDoorDone() { stopAnimation(); setVisible(false); } -static const Class489Item kClass489Items[] = { +static const AsCommonProjectorItem kAsCommonProjectorItems[] = { {{154, 453}, 4, 2, 0, -1, 0, 1}, {{104, 391}, 4, -1, -1, -1, 1, 1}, {{ 22, 447}, 6, -1, -1, -1, 1, 1}, @@ -384,30 +384,30 @@ static const Class489Item kClass489Items[] = { {{262, 433}, 1, 1, 0, -1, 0, 0} }; -Class489::Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _class525(class525) { +AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) { - _class489Item = &kClass489Items[getGlobalVar(0x04A105B3)]; + _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(0x04A105B3)]; // TODO createSurface3(990, dword_4B26D8); createSurface(990, 640, 480); //TODO: Remeove once the line above is done startAnimation(0x10E3042B, 0, -1); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class489::handleMessage); - _x = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; + SetMessageHandler(&AsCommonProjector::handleMessage); + _x = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; _flag = true; sub434C80(); setDoDeltaX(1); - if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) { + if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) { sub434E90(); } loadSound(2, 0xC8C2507C); } -Class489::~Class489() { +AsCommonProjector::~AsCommonProjector() { _vm->_soundMan->deleteSoundGroup(0x05331081); } -uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -415,8 +415,8 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity messageResult = 1; break; case 0x4807: - setGlobalVar(0x04A10F33, (_x - _class489Item->point.x) / 108); - if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex2) { + setGlobalVar(0x04A10F33, (_x - _asProjectorItem->point.x) / 108); + if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) { sub434E60(); } else { sub434DD0(); @@ -424,7 +424,7 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) { + if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) { incGlobalVar(0x04A10F33, 1); } } else if (getGlobalVar(0x04A10F33) > 0) { @@ -434,7 +434,7 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity break; case 0x480C: if (param.asInteger() != 1) { - messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0; + messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0; } else { messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; } @@ -445,14 +445,14 @@ uint32 Class489::handleMessage(int messageNum, const MessageParam ¶m, Entity case 0x482B: sendMessage(_parentScene, 0x1022, 1010); break; - case 0x4828: + case 0x4839: sub435040(); break; } return messageResult; } -uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -470,7 +470,7 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1) { + if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) { incGlobalVar(0x04A10F33, 1); } } else if (getGlobalVar(0x04A10F33) > 0) { @@ -480,7 +480,7 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, break; case 0x480C: if (param.asInteger() != 1) { - messageResult = (int8)getGlobalVar(0x04A10F33) < _class489Item->varIndex1 ? 1 : 0; + messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0; } else { messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; } @@ -498,7 +498,7 @@ uint32 Class489::handleMessage4348E0(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 Class489::handleMessage434B20(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonProjector::handleMessage434B20(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -508,18 +508,18 @@ uint32 Class489::handleMessage434B20(int messageNum, const MessageParam ¶m, return messageResult; } -void Class489::spriteUpdate434B60() { +void AsCommonProjector::spriteUpdate434B60() { if (_x <= _klayman->getX()) _x = _klayman->getX() - 100; else _x = _klayman->getX() + 100; sub434C80(); if (_remX == _x) { - if (getGlobalVar(0x04A10F33) == 0 && _class489Item->flag4 != 0) { + if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->flag4 != 0) { sendMessage(_parentScene, 0x1019, 0); incGlobalVar(0x04A105B3, -1); - setGlobalVar(0x04A10F33, kClass489Items[getGlobalVar(0x04A105B3)].varIndex1); - } else if ((int8)getGlobalVar(0x04A10F33) == _class489Item->varIndex1 && _class489Item->flag != 0) { + setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].varIndex1); + } else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex1 && _asProjectorItem->flag != 0) { sendMessage(_parentScene, 0x1019, 1); incGlobalVar(0x04A105B3, +1); setGlobalVar(0x04A10F33, 0); @@ -528,33 +528,33 @@ void Class489::spriteUpdate434B60() { Sprite::processDelta(); } -void Class489::sub434C80() { +void AsCommonProjector::sub434C80() { bool soundFlag = false; - _y = _class489Item->point.y; + _y = _asProjectorItem->point.y; - if (_class489Item->index1 != -1) { - int16 elX = _class489Item->index1 * 108 + _class489Item->point.x; + if (_asProjectorItem->index1 != -1) { + int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x; if (elX - 20 < _x && elX + 20 > _x) { soundFlag = true; - _y = _class489Item->point.y + 10; + _y = _asProjectorItem->point.y + 10; } } - if (_class489Item->flag2 != -1) { - int16 elX = _class489Item->index1 * 108 + _class489Item->point.x; + if (_asProjectorItem->flag2 != -1) { + int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x; if (elX - 20 < _x && elX + 20 > _x) { soundFlag = true; - _y = _class489Item->point.y + 10; + _y = _asProjectorItem->point.y + 10; } } - if (_class489Item->varIndex2 != -1) { - int16 elX = _class489Item->varIndex2 * 108 + _class489Item->point.x; + if (_asProjectorItem->varIndex2 != -1) { + int16 elX = _asProjectorItem->varIndex2 * 108 + _asProjectorItem->point.x; if (elX - 20 < _x && elX + 20 > _x) { soundFlag = true; - _y = _class489Item->point.y + 10; + _y = _asProjectorItem->point.y + 10; } } @@ -569,10 +569,10 @@ void Class489::sub434C80() { } -void Class489::sub434D80() { +void AsCommonProjector::sub434D80() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { - sendMessage(_class525, 0x483A, 0); + sendMessage(_asPipe, 0x483A, 0); stopAnimation(); SetMessageHandler(&Sprite::handleMessage); SetSpriteUpdate(NULL); @@ -580,81 +580,81 @@ void Class489::sub434D80() { } } -void Class489::sub434DD0() { +void AsCommonProjector::sub434DD0() { SetSpriteUpdate(NULL); - SetMessageHandler(&Class489::handleMessage); + SetMessageHandler(&AsCommonProjector::handleMessage); startAnimation(0x10E3042B, 0, -1); } -void Class489::sub434DF0() { - _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; +void AsCommonProjector::sub434DF0() { + _remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; startAnimation(0x14A10137, 0, -1); - SetSpriteUpdate(&Class489::spriteUpdate434B60); - SetMessageHandler(&Class489::handleMessage); + SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60); + SetMessageHandler(&AsCommonProjector::handleMessage); playSound(1, 0xEC008474); } -void Class489::sub434E60() { +void AsCommonProjector::sub434E60() { SetSpriteUpdate(NULL); - SetMessageHandler(&Class489::handleMessage434B20); + SetMessageHandler(&AsCommonProjector::handleMessage434B20); startAnimation(0x80C32213, 0, -1); - NextState(&Class489::sub434E90); + NextState(&AsCommonProjector::sub434E90); } -void Class489::sub434E90() { +void AsCommonProjector::sub434E90() { SetSpriteUpdate(NULL); - SetMessageHandler(&Class489::handleMessage4348E0); + SetMessageHandler(&AsCommonProjector::handleMessage4348E0); startAnimation(0xD23B207F, 0, -1); } -void Class489::sub434EC0() { +void AsCommonProjector::sub434EC0() { startAnimation(0x50A80517, 0, -1); - SetMessageHandler(&Class489::handleMessage434B20); + SetMessageHandler(&AsCommonProjector::handleMessage434B20); SetSpriteUpdate(NULL); - NextState(&Class489::sub434F40); + NextState(&AsCommonProjector::sub434F40); setGlobalVar(0x12A10DB3, 1); playSound(0, 0xCC4A8456); _vm->_soundMan->addSound(0x05331081, 0xCE428854); _vm->_soundMan->playSoundLooping(0xCE428854); } -void Class489::sub434F40() { +void AsCommonProjector::sub434F40() { sendMessage(_parentScene, 0x480F, 0); startAnimation(0xD833207F, 0, -1); SetSpriteUpdate(NULL); - SetMessageHandler(&Class489::handleMessage4348E0); + SetMessageHandler(&AsCommonProjector::handleMessage4348E0); } -void Class489::sub434F80() { +void AsCommonProjector::sub434F80() { startAnimation(0x50A94417, 0, -1); SetSpriteUpdate(NULL); - SetMessageHandler(&Class489::handleMessage434B20); - NextState(&Class489::sub434E90); + SetMessageHandler(&AsCommonProjector::handleMessage434B20); + NextState(&AsCommonProjector::sub434E90); setGlobalVar(0x12A10DB3, 0); playSound(0, 0xCC4A8456); _vm->_soundMan->deleteSound(0xCE428854); } -void Class489::sub434FF0() { - _remX = getGlobalVar(0x04A10F33) * 108 + _class489Item->point.x; +void AsCommonProjector::sub434FF0() { + _remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; startAnimation(0x22CB4A33, 0, -1); - SetSpriteUpdate(&Class489::spriteUpdate434B60); - SetMessageHandler(&Class489::handleMessage434B20); - NextState(&Class489::sub434DF0); + SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60); + SetMessageHandler(&AsCommonProjector::handleMessage434B20); + NextState(&AsCommonProjector::sub434DF0); } -void Class489::sub435040() { +void AsCommonProjector::sub435040() { setGlobalVar(0x04A105B3, 4); setGlobalVar(0x04A10F33, 0); - SetSpriteUpdate(&Class489::sub434D80); + SetSpriteUpdate(&AsCommonProjector::sub434D80); SetMessageHandler(&Sprite::handleMessage); startAnimation(0x708D4712, 0, -1); playSound(2); } Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag(false), _class427(NULL), _class489(NULL), - _class525(NULL), _class526(NULL), _class527(NULL), _class528(NULL), + : Scene(vm, parentModule, true), _flag(false), _class427(NULL), _asProjector(NULL), + _asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { SetMessageHandler(&Scene1401::handleMessage); @@ -667,11 +667,11 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x21FA108A); _class427 = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); - _class525 = insertSprite(); + _asPipe = insertSprite(); if (!getGlobalVar(0x01023818)) { - _class526 = insertSprite(_class525); - _class527 = insertSprite(_class525); + _asMouse = insertSprite(); + _asCheese = insertSprite(); } _sprite3 = insertStaticSprite(0xA82BA811, 1100); @@ -700,35 +700,35 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x04A105B3) == 2) { - _class489 = insertSprite(this, _klayman, _class525); - _vm->_collisionMan->addSprite(_class489); + _asProjector = insertSprite(this, _klayman, _asPipe); + _vm->_collisionMan->addSprite(_asProjector); if (getGlobalVar(0x04A10F33) == 6) { - sendEntityMessage(_klayman, 0x1014, _class489); - _klayman->setX(_class489->getX() + 100); + sendEntityMessage(_klayman, 0x1014, _asProjector); + _klayman->setX(_asProjector->getX() + 100); _klayman->processDelta(); setMessageList(0x004B6670); } else if (getGlobalVar(0x04A10F33) == 0) { - sendEntityMessage(_klayman, 0x1014, _class489); - _klayman->setX(_class489->getX() - 100); + sendEntityMessage(_klayman, 0x1014, _asProjector); + _klayman->setX(_asProjector->getX() - 100); _klayman->processDelta(); setMessageList(0x004B6670); } - _class489->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); + _asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); } _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); - if (which == 0 && _class489) { - sendMessage(_class489, 0x482B, 0); + if (which == 0 && _asProjector) { + sendMessage(_asProjector, 0x482B, 0); } - _class528 = insertSprite(_klayman, which == 1); + _asBackDoor = insertSprite(_klayman, which == 1); } void Scene1401::update() { Scene::update(); - if (_class489 && !_flag && _class489->getY() < 360) { + if (_asProjector && !_flag && _asProjector->getY() < 360) { _sprite2->setVisible(true); _flag = true; } else { @@ -745,7 +745,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x402064D8) { sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x01C66840) { - if (sendMessage(_class528, 0x2001, 0) != 0) { + if (sendMessage(_asBackDoor, 0x2001, 0) != 0) { setMessageList(0x004B6690); } else { setMessageList(0x004B66B0); @@ -761,23 +761,23 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (sender == _class427) { - sendMessage(_class525, 0x2000, 0); + sendMessage(_asPipe, 0x2000, 0); if (!getGlobalVar(0x01023818)) { - sendMessage(_class526, 0x4839, 0); - sendMessage(_class527, 0x4839, 0); + sendMessage(_asMouse, 0x4839, 0); + sendMessage(_asCheese, 0x4839, 0); setGlobalVar(0x01023818, 1); } - if (_class489 && _class489->getX() > 404 && _class489->getX() < 504) { - sendMessage(_class489 , 0x4839, 0); + if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) { + sendMessage(_asProjector , 0x4839, 0); } } else if (sender == _ssButton) { sendMessage(_ssButton, 0x4808, 0); } break; case 0x4826: - if (sender == _class489) { - if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _class489); + if (sender == _asProjector) { + if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B6658); } else { setMessageList2(0x004B65F0); @@ -786,14 +786,14 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x482A: _sprite1->setVisible(true); - if (_class489) { - sendMessage(_class489, 0x482B, 0); + if (_asProjector) { + sendMessage(_asProjector, 0x482B, 0); } break; case 0x482B: _sprite1->setVisible(false); - if (_class489) { - sendMessage(_class489, 0x482A, 0); + if (_asProjector) { + sendMessage(_asProjector, 0x482A, 0); } break; } @@ -869,7 +869,7 @@ void Class482::sub428560() { } Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag(false), _class482(NULL), _class489(NULL) { + : Scene(vm, parentModule, true), _flag(false), _class482(NULL), _asProjector(NULL) { SetMessageHandler(&Scene1402::handleMessage); @@ -924,20 +924,20 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x4A105B3) == 1) { - _class489 = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_class489); + _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _vm->_collisionMan->addSprite(_asProjector); if (getGlobalVar(0x4A10F33) == 4) { - sendEntityMessage(_klayman, 0x1014, _class489); - _klayman->setX(_class489->getX() + 100); + sendEntityMessage(_klayman, 0x1014, _asProjector); + _klayman->setX(_asProjector->getX() + 100); _klayman->processDelta(); setMessageList(0x004B0BD0); } else if (getGlobalVar(0x4A10F33) == 0) { - sendEntityMessage(_klayman, 0x1014, _class489); - _klayman->setX(_class489->getX() - 100); + sendEntityMessage(_klayman, 0x1014, _asProjector); + _klayman->setX(_asProjector->getX() - 100); _klayman->processDelta(); setMessageList(0x004B0BD0); } - _class489->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2()); + _asProjector->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2()); } _klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2()); @@ -996,9 +996,9 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit sub428230(); break; case 0x4826: - if (sender == _class489) { - if (sendMessage(_class489, 0x408C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _class489); + if (sender == _asProjector) { + if (sendMessage(_asProjector, 0x408C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B0BB8); } else { setMessageList2(0x004B0B68); @@ -1319,7 +1319,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1403 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _class489(NULL), _flag(false) { + : Scene(vm, parentModule, true), _asProjector(NULL), _flag(false) { SetMessageHandler(&Scene1403::handleMessage); @@ -1355,16 +1355,16 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setRepl(64, 0); if (getGlobalVar(0x04A105B3) == 4) { - _class489 = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_class489); + _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _vm->_collisionMan->addSprite(_asProjector); if (getGlobalVar(0x04A10F33) == 4) { - sendEntityMessage(_klayman, 0x1014, _class489); - _klayman->setX(_class489->getX() + 100); + sendEntityMessage(_klayman, 0x1014, _asProjector); + _klayman->setX(_asProjector->getX() + 100); _klayman->processDelta(); setMessageList(0x004B1F70); } - _class489->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2()); - _class489->setRepl(64, 0); + _asProjector->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2()); + _asProjector->setRepl(64, 0); } } @@ -1377,7 +1377,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B2008); _flag = true; } else if (param.asInteger() == 0x08821382) { - sendEntityMessage(_klayman, 0x1014, _class489); + sendEntityMessage(_klayman, 0x1014, _asProjector); setRectList(0x004B1FF8); _flag = false; } @@ -1386,7 +1386,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit leaveScene(0); break; case 0x1022: - if (sender == _class489) { + if (sender == _asProjector) { if (param.asInteger() >= 1000) { setSurfacePriority(_class401_3->getSurface(), 1100); } else { @@ -1401,14 +1401,14 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit _class401_1->setVisible(true); break; case 0x4826: - if (sender == _class489) { + if (sender == _asProjector) { if (_flag) { setMessageList2(0x004B1FA8); } else if (param.asInteger() == 1) { - sendEntityMessage(_klayman, 0x1014, _class489); + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B1F88); - } else if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _class489); + } else if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B1F58); } else { setMessageList2(0x004B1F28); @@ -1429,7 +1429,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1404 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _class489(NULL), _class545(NULL) { + : Scene(vm, parentModule, true), _asProjector(NULL), _class545(NULL) { if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) { setGlobalVar(0x13382860, 5); @@ -1475,15 +1475,15 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(0x04A105B3) == 3) { - _class489 = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_class489); + _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _vm->_collisionMan->addSprite(_asProjector); if (getGlobalVar(0x04A10F33) == 0) { - sendEntityMessage(_klayman, 0x1014, _class489); - _klayman->setX(_class489->getX() - 100); + sendEntityMessage(_klayman, 0x1014, _asProjector); + _klayman->setX(_asProjector->getX() - 100); _klayman->processDelta(); setMessageList(0x004B8CB8); } - _class489->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); @@ -1499,7 +1499,7 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x410650C2) { - if (_class489 && _class489->getX() == 220) { + if (_asProjector && _asProjector->getX() == 220) { setMessageList(0x004B8C40); } else { setMessageList(0x004B8CE8); @@ -1510,9 +1510,9 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit leaveScene(0); break; case 0x4826: - if (sender == _class489) { - if (sendMessage(_class489, 0x480C, _klayman->getX() > _class489->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _class489); + if (sender == _asProjector) { + if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B8CA0); } else { setMessageList2(0x004B8C40); diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index aed7ba9994..7cd5262c03 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -41,10 +41,10 @@ protected: // Scene1401 -class Class525 : public AnimatedSprite { +class AsScene1401Pipe : public AnimatedSprite { public: - Class525(NeverhoodEngine *vm); - virtual ~Class525(); + AsScene1401Pipe(NeverhoodEngine *vm); + virtual ~AsScene1401Pipe(); protected: int _countdown1; int _countdown2; @@ -57,41 +57,39 @@ protected: void sub4664B0(); }; -class Class526 : public AnimatedSprite { +class AsScene1401Mouse : public AnimatedSprite { public: - Class526(NeverhoodEngine *vm, Sprite *class525); + AsScene1401Mouse(NeverhoodEngine *vm); protected: - Sprite *_class525; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate466720(); - void sub466770(); + void suSuckedIn(); + void stSuckedIn(); }; -class Class527 : public AnimatedSprite { +class AsScene1401Cheese : public AnimatedSprite { public: - Class527(NeverhoodEngine *vm, Sprite *class526); + AsScene1401Cheese(NeverhoodEngine *vm); protected: - Sprite *_class526; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate466920(); - void sub466970(); + void suSuckedIn(); + void stSuckedIn(); }; -class Class528 : public AnimatedSprite { +class AsScene1401BackDoor : public AnimatedSprite { public: - Class528(NeverhoodEngine *vm, Sprite *klayman, bool flag); + AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen); protected: Sprite *_klayman; int _countdown; - bool _flag; + bool _isOpen; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub466BF0(); - void sub466C50(); - void sub466CB0(); + void stOpenDoor(); + void stCloseDoor(); + void stCloseDoorDone(); }; -struct Class489Item { +struct AsCommonProjectorItem { NPoint point; int8 varIndex1; int8 varIndex2; @@ -101,15 +99,15 @@ struct Class489Item { int8 flag; }; -class Class489 : public AnimatedSprite { +class AsCommonProjector : public AnimatedSprite { public: - Class489(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *class525); - virtual ~Class489(); + AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe); + virtual ~AsCommonProjector(); protected: Scene *_parentScene; Sprite *_klayman; - Sprite *_class525; - const Class489Item *_class489Item; + Sprite *_asPipe; + const AsCommonProjectorItem *_asProjectorItem; int16 _remX; bool _flag; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -135,11 +133,11 @@ public: protected: bool _flag; Sprite *_class427; - Class489 *_class489; - Sprite *_class525; - Sprite *_class526; - Sprite *_class527; - Sprite *_class528; + AsCommonProjector *_asProjector; + Sprite *_asPipe; + Sprite *_asMouse; + Sprite *_asCheese; + Sprite *_asBackDoor; Sprite *_sprite1; Sprite *_sprite2; Sprite *_sprite3; @@ -174,7 +172,7 @@ protected: Sprite *_class454_2; Sprite *_class454_3; Sprite *_class482; - Class489 *_class489; + AsCommonProjector *_asProjector; bool _flag; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -226,7 +224,7 @@ protected: Sprite *_class401_3; AsScene1201Tape *_asTape1; AsScene1201Tape *_asTape2; - Class489 *_class489; + AsCommonProjector *_asProjector; bool _flag; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -240,7 +238,7 @@ public: protected: Sprite *_sprite1; Sprite *_asTape; - Class489 *_class489; + AsCommonProjector *_asProjector; Sprite *_class545; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From cb5ca835787a11d9ff99bcd8a35578586507a61c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 5 Oct 2012 17:14:03 +0000 Subject: NEVERHOOD: Rename more stuff in Module1400; also fix some bugs - Update globalvars.txt --- engines/neverhood/module1400.cpp | 362 +++++++++++++++++---------------------- engines/neverhood/module1400.h | 93 +++++----- 2 files changed, 206 insertions(+), 249 deletions(-) diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 33ec0fca2e..59ed0c470f 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -141,8 +141,8 @@ AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm) createSurface(900, 640, 480); //TODO: Remeove once the line above is done _x = 454; _y = 217; - SetMessageHandler(&AsScene1401Pipe::handleMessage466320); - SetUpdateHandler(&AsScene1401Pipe::update4662A0); + SetMessageHandler(&AsScene1401Pipe::handleMessage); + SetUpdateHandler(&AsScene1401Pipe::update); startAnimation(0x4C210500, 0, -1); } @@ -150,10 +150,10 @@ AsScene1401Pipe::~AsScene1401Pipe() { _vm->_soundMan->deleteSoundGroup(0x01104C08); } -void AsScene1401Pipe::update4662A0() { +void AsScene1401Pipe::update() { AnimatedSprite::update(); if (_countdown1 != 0 && (--_countdown1 == 0)) { - sub466460(); + stDoneSucking(); } if (_countdown2 != 0 && (--_countdown2 == 0)) { _vm->_soundMan->addSound(0x01104C08, 0x4A116437); @@ -161,14 +161,14 @@ void AsScene1401Pipe::update4662A0() { } } -void AsScene1401Pipe::update466300() { +void AsScene1401Pipe::upSuckInProjector() { AnimatedSprite::update(); if (_countdown1 != 0) { _countdown1--; } } -uint32 AsScene1401Pipe::handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -179,46 +179,46 @@ uint32 AsScene1401Pipe::handleMessage466320(int messageNum, const MessageParam & case 0x2000: _countdown1 = 70; _countdown2 = 8; - sub466420(); + stStartSucking(); break; case 0x483A: - sub4664B0(); + stSuckInProjector(); break; } return messageResult; } -uint32 AsScene1401Pipe::handleMessage4663C0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: if (_countdown1 != 0) { - sub466420(); + stStartSucking(); } else { - sub466460(); + stDoneSucking(); } - SetMessageHandler(&AsScene1401Pipe::handleMessage466320); - SetUpdateHandler(&AsScene1401Pipe::update4662A0); + SetMessageHandler(&AsScene1401Pipe::handleMessage); + SetUpdateHandler(&AsScene1401Pipe::update); break; } return messageResult; } -void AsScene1401Pipe::sub466420() { +void AsScene1401Pipe::stStartSucking() { startAnimation(0x4C240100, 0, -1); playSound(0, 0x4A30063F); } -void AsScene1401Pipe::sub466460() { +void AsScene1401Pipe::stDoneSucking() { _vm->_soundMan->deleteSound(0x4A116437); playSound(0, 0x4A120435); startAnimation(0x4C210500, 0, -1); } -void AsScene1401Pipe::sub4664B0() { +void AsScene1401Pipe::stSuckInProjector() { startAnimation(0x6C210810, 0, -1); - SetMessageHandler(&AsScene1401Pipe::handleMessage4663C0); - SetUpdateHandler(&AsScene1401Pipe::update466300); + SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector); + SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector); } AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) @@ -377,11 +377,11 @@ void AsScene1401BackDoor::stCloseDoorDone() { } static const AsCommonProjectorItem kAsCommonProjectorItems[] = { - {{154, 453}, 4, 2, 0, -1, 0, 1}, - {{104, 391}, 4, -1, -1, -1, 1, 1}, - {{ 22, 447}, 6, -1, -1, -1, 1, 1}, - {{112, 406}, 2, -1, -1, -1, 1, 0}, - {{262, 433}, 1, 1, 0, -1, 0, 0} + {{154, 453}, 4, 2, 0, 0, 1}, + {{104, 391}, 4, -1, -1, 1, 1}, + {{ 22, 447}, 6, -1, -1, 1, 1}, + {{112, 406}, 2, -1, -1, 1, 0}, + {{262, 433}, 1, 1, 0, 0, 0} }; AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe) @@ -394,11 +394,11 @@ AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sp SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsCommonProjector::handleMessage); _x = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; - _flag = true; - sub434C80(); + _lockedInSlot = true; + moveProjector(); setDoDeltaX(1); - if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) { - sub434E90(); + if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) { + stStayLockedInSlot(); } loadSound(2, 0xC8C2507C); } @@ -416,25 +416,26 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶ break; case 0x4807: setGlobalVar(0x04A10F33, (_x - _asProjectorItem->point.x) / 108); - if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex2) { - sub434E60(); + if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) { + stStartLockedInSlot(); } else { - sub434DD0(); + stIdle(); } break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) { + if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) { incGlobalVar(0x04A10F33, 1); } } else if (getGlobalVar(0x04A10F33) > 0) { incGlobalVar(0x04A10F33, -1); } - sub434DF0(); + stMoving(); break; case 0x480C: + // Check if the projector can be moved if (param.asInteger() != 1) { - messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0; + messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0; } else { messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; } @@ -446,13 +447,13 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶ sendMessage(_parentScene, 0x1022, 1010); break; case 0x4839: - sub435040(); + stStartSuckedIn(); break; } return messageResult; } -uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -466,27 +467,28 @@ uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam break; case 0x4807: sendMessage(_parentScene, 0x4807, 0); - sub434F80(); + stStopProjecting(); break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1) { + if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) { incGlobalVar(0x04A10F33, 1); } } else if (getGlobalVar(0x04A10F33) > 0) { incGlobalVar(0x04A10F33, -1); } - sub434FF0(); + stTurnToFront(); break; case 0x480C: + // Check if the projector can be moved if (param.asInteger() != 1) { - messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->varIndex1 ? 1 : 0; + messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0; } else { messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; } break; case 0x480F: - sub434EC0(); + stStartProjecting(); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -498,7 +500,7 @@ uint32 AsCommonProjector::handleMessage4348E0(int messageNum, const MessageParam return messageResult; } -uint32 AsCommonProjector::handleMessage434B20(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -508,18 +510,18 @@ uint32 AsCommonProjector::handleMessage434B20(int messageNum, const MessageParam return messageResult; } -void AsCommonProjector::spriteUpdate434B60() { +void AsCommonProjector::suMoving() { if (_x <= _klayman->getX()) _x = _klayman->getX() - 100; else _x = _klayman->getX() + 100; - sub434C80(); - if (_remX == _x) { - if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->flag4 != 0) { + moveProjector(); + if (_beforeMoveX == _x) { + if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->leftBorderLeaves != 0) { sendMessage(_parentScene, 0x1019, 0); incGlobalVar(0x04A105B3, -1); - setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].varIndex1); - } else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->varIndex1 && _asProjectorItem->flag != 0) { + setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].maxSlotCount); + } else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) { sendMessage(_parentScene, 0x1019, 1); incGlobalVar(0x04A105B3, +1); setGlobalVar(0x04A10F33, 0); @@ -528,48 +530,38 @@ void AsCommonProjector::spriteUpdate434B60() { Sprite::processDelta(); } -void AsCommonProjector::sub434C80() { +void AsCommonProjector::moveProjector() { - bool soundFlag = false; + bool nowLockedInSlot = false; _y = _asProjectorItem->point.y; if (_asProjectorItem->index1 != -1) { int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x; if (elX - 20 < _x && elX + 20 > _x) { - soundFlag = true; + nowLockedInSlot = true; _y = _asProjectorItem->point.y + 10; } } - if (_asProjectorItem->flag2 != -1) { - int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x; - if (elX - 20 < _x && elX + 20 > _x) { - soundFlag = true; - _y = _asProjectorItem->point.y + 10; - } - } - - if (_asProjectorItem->varIndex2 != -1) { - int16 elX = _asProjectorItem->varIndex2 * 108 + _asProjectorItem->point.x; + if (_asProjectorItem->lockSlotIndex != -1) { + int16 elX = _asProjectorItem->lockSlotIndex * 108 + _asProjectorItem->point.x; if (elX - 20 < _x && elX + 20 > _x) { - soundFlag = true; + nowLockedInSlot = true; _y = _asProjectorItem->point.y + 10; } } - if (_flag) { - if (!soundFlag) { - _flag = false; - } - } else if (soundFlag) { + if (_lockedInSlot && !nowLockedInSlot) { + _lockedInSlot = false; + } else if (!_lockedInSlot && nowLockedInSlot) { playSound(1, 0x5440E474); - _flag = true; + _lockedInSlot = true; } } -void AsCommonProjector::sub434D80() { +void AsCommonProjector::stSuckedIn() { AnimatedSprite::updateDeltaXY(); if (_rect.y1 <= 150) { sendMessage(_asPipe, 0x483A, 0); @@ -580,80 +572,80 @@ void AsCommonProjector::sub434D80() { } } -void AsCommonProjector::sub434DD0() { +void AsCommonProjector::stIdle() { SetSpriteUpdate(NULL); SetMessageHandler(&AsCommonProjector::handleMessage); startAnimation(0x10E3042B, 0, -1); } -void AsCommonProjector::sub434DF0() { - _remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; +void AsCommonProjector::stMoving() { + _beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; startAnimation(0x14A10137, 0, -1); - SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60); + SetSpriteUpdate(&AsCommonProjector::suMoving); SetMessageHandler(&AsCommonProjector::handleMessage); playSound(1, 0xEC008474); } -void AsCommonProjector::sub434E60() { +void AsCommonProjector::stStartLockedInSlot() { SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::handleMessage434B20); + SetMessageHandler(&AsCommonProjector::hmAnimation); startAnimation(0x80C32213, 0, -1); - NextState(&AsCommonProjector::sub434E90); + NextState(&AsCommonProjector::stStayLockedInSlot); } -void AsCommonProjector::sub434E90() { +void AsCommonProjector::stStayLockedInSlot() { SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::handleMessage4348E0); + SetMessageHandler(&AsCommonProjector::hmLockedInSlot); startAnimation(0xD23B207F, 0, -1); } -void AsCommonProjector::sub434EC0() { +void AsCommonProjector::stStartProjecting() { startAnimation(0x50A80517, 0, -1); - SetMessageHandler(&AsCommonProjector::handleMessage434B20); + SetMessageHandler(&AsCommonProjector::hmAnimation); SetSpriteUpdate(NULL); - NextState(&AsCommonProjector::sub434F40); + NextState(&AsCommonProjector::stLockedInSlot); setGlobalVar(0x12A10DB3, 1); playSound(0, 0xCC4A8456); _vm->_soundMan->addSound(0x05331081, 0xCE428854); _vm->_soundMan->playSoundLooping(0xCE428854); } -void AsCommonProjector::sub434F40() { +void AsCommonProjector::stLockedInSlot() { sendMessage(_parentScene, 0x480F, 0); startAnimation(0xD833207F, 0, -1); SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::handleMessage4348E0); + SetMessageHandler(&AsCommonProjector::hmLockedInSlot); } -void AsCommonProjector::sub434F80() { +void AsCommonProjector::stStopProjecting() { startAnimation(0x50A94417, 0, -1); SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::handleMessage434B20); - NextState(&AsCommonProjector::sub434E90); + SetMessageHandler(&AsCommonProjector::hmAnimation); + NextState(&AsCommonProjector::stStayLockedInSlot); setGlobalVar(0x12A10DB3, 0); playSound(0, 0xCC4A8456); _vm->_soundMan->deleteSound(0xCE428854); } -void AsCommonProjector::sub434FF0() { - _remX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; +void AsCommonProjector::stTurnToFront() { + _beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; startAnimation(0x22CB4A33, 0, -1); - SetSpriteUpdate(&AsCommonProjector::spriteUpdate434B60); - SetMessageHandler(&AsCommonProjector::handleMessage434B20); - NextState(&AsCommonProjector::sub434DF0); + SetSpriteUpdate(&AsCommonProjector::suMoving); + SetMessageHandler(&AsCommonProjector::hmAnimation); + NextState(&AsCommonProjector::stMoving); } -void AsCommonProjector::sub435040() { +void AsCommonProjector::stStartSuckedIn() { setGlobalVar(0x04A105B3, 4); setGlobalVar(0x04A10F33, 0); - SetSpriteUpdate(&AsCommonProjector::sub434D80); + SetSpriteUpdate(&AsCommonProjector::stSuckedIn); SetMessageHandler(&Sprite::handleMessage); startAnimation(0x708D4712, 0, -1); playSound(2); } Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag(false), _class427(NULL), _asProjector(NULL), + : Scene(vm, parentModule, true), _projectorBorderFlag(false), _class427(NULL), _asProjector(NULL), _asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { @@ -728,9 +720,9 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1401::update() { Scene::update(); - if (_asProjector && !_flag && _asProjector->getY() < 360) { + if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) { _sprite2->setVisible(true); - _flag = true; + _projectorBorderFlag = true; } else { _sprite2->setVisible(false); } @@ -767,9 +759,8 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asCheese, 0x4839, 0); setGlobalVar(0x01023818, 1); } - if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) { + if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) sendMessage(_asProjector , 0x4839, 0); - } } else if (sender == _ssButton) { sendMessage(_ssButton, 0x4808, 0); } @@ -802,7 +793,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1402 -Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) +SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) : StaticSprite(vm, fileHash, surfacePriority) { SetFilterY(&Sprite::defFilterY); @@ -810,7 +801,7 @@ Class454::Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) } -Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which) +AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { // TODO createSurface3(900, dword_4B6768); @@ -818,31 +809,36 @@ Class482::Class482(NeverhoodEngine *vm, Scene *parentScene, int which) SetFilterY(&Sprite::defFilterY); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class482::handleMessage); + SetMessageHandler(&AsScene1402PuzzleBox::handleMessage); _x = 279; _y = 270; if (which == 2) { + // Puzzle box after the puzzle was solved startAnimation(0x20060259, 0, -1); + NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone); playSound(0, 0x419014AC); loadSound(1, 0x61901C29); } else if (which == 1) { + // Puzzle box appears startAnimation(0x210A0213, 0, -1); + NextState(&AsScene1402PuzzleBox::stMoveUpDone); playSound(0, 0x41809C6C); } else { + // Puzzle box is here startAnimation(0x20060259, 0, -1); loadSound(1, 0x61901C29); _newStickFrameIndex = -2; } } -uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1402PuzzleBox::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2002: playSound(1); startAnimation(0x20060259, -1, -1); _playBackwards = true; - NextState(&Class482::sub428530); + NextState(&AsScene1402PuzzleBox::stMoveDownDone); break; case 0x3002: gotoNextState(); @@ -851,25 +847,25 @@ uint32 Class482::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class482::sub428500() { +void AsScene1402PuzzleBox::stMoveUpDone() { sendMessage(_parentScene, 0x2000, 0); stopAnimation(); setVisible(false); } -void Class482::sub428530() { +void AsScene1402PuzzleBox::stMoveDownDone() { sendMessage(_parentScene, 0x2001, 0); stopAnimation(); setVisible(false); } -void Class482::sub428560() { +void AsScene1402PuzzleBox::stMoveDownSolvedDone() { sendMessage(_parentScene, 0x2003, 0); stopAnimation(); } Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag(false), _class482(NULL), _asProjector(NULL) { + : Scene(vm, parentModule, true), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) { SetMessageHandler(&Scene1402::handleMessage); @@ -880,9 +876,9 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(0x91D3A391, 0, 64, 0); insertMouse433(0x482F4239); - _class454_1 = insertSprite(0x15402D64, 1100); - _class454_2 = insertSprite(0x10A02120, 1100); - _class454_3 = insertSprite(0x60882BE0, 1100); + _ssBridgePart1 = insertSprite(0x15402D64, 1100); + _ssBridgePart2 = insertSprite(0x10A02120, 1100); + _ssBridgePart3 = insertSprite(0x60882BE0, 1100); if (getGlobalVar(0x70A1189C)) setRectList(0x004B0C48); @@ -893,7 +889,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(377, 391); setMessageList(0x004B0B48); if (!getGlobalVar(0x70A1189C)) { - _class482 = insertSprite(this, 0); + _asPuzzleBox = insertSprite(this, 0); } } else if (which == 1) { insertKlayman(42, 391); @@ -903,25 +899,24 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B0B60); _klayman->setDoDeltaX(1); if (getGlobalVar(0x70A1189C)) { - _class482 = insertSprite(this, 1); + _asPuzzleBox = insertSprite(this, 1); clearRectList(); showMouse(false); - sub428220(); + startShaking(); } else { - _class482 = insertSprite(this, 0); + _asPuzzleBox = insertSprite(this, 0); } } else { insertKlayman(513, 391); setMessageList(0x004B0B58); if (!getGlobalVar(0x70A1189C)) { - _class482 = insertSprite(this, 2); - sub428220(); + _asPuzzleBox = insertSprite(this, 2); + startShaking(); } } - if (_class482) { - _class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2()); - } + if (_asPuzzleBox) + _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); if (getGlobalVar(0x4A105B3) == 1) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); @@ -937,15 +932,15 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->processDelta(); setMessageList(0x004B0BD0); } - _asProjector->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x, _class454_3->getDrawRect().y2()); + _asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2()); } - _klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2()); + _klayman->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); } -void Scene1402::update() { - if (_flag) { +void Scene1402::upShaking() { + if (_isShaking) { setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10); // TODO g_screen->field_26 = -10 - _background->getDrawRect().y; } else { @@ -954,10 +949,9 @@ void Scene1402::update() { SetUpdateHandler(&Scene::update); } Scene::update(); - if (_class482) { - _class482->setClipRect(0, 0, 640, _class454_3->getDrawRect().y2()); - } - _klayman->setClipRect(_class454_1->getDrawRect().x, 0, _class454_2->getDrawRect().x2(), _class454_3->getDrawRect().y2()); + if (_asPuzzleBox) + _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); + _klayman->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); } uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -971,8 +965,8 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit clearRectList(); _klayman->setVisible(false); showMouse(false); - sendMessage(_class482, 0x2002, 0); - sub428220(); + sendMessage(_asPuzzleBox, 0x2002, 0); + startShaking(); } } break; @@ -984,16 +978,16 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - sub428230(); + stopShaking(); showMouse(true); setRectList(0x004B0C48); break; case 0x2001: - sub428230(); + stopShaking(); leaveScene(0); break; case 0x2003: - sub428230(); + stopShaking(); break; case 0x4826: if (sender == _asProjector) { @@ -1008,13 +1002,13 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -void Scene1402::sub428220() { - _flag = true; - SetUpdateHandler(&Scene1402::update); +void Scene1402::startShaking() { + _isShaking = true; + SetUpdateHandler(&Scene1402::upShaking); } -void Scene1402::sub428230() { - _flag = false; +void Scene1402::stopShaking() { + _isShaking = false; } // Scene1407 @@ -1532,74 +1526,38 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1405 static const NPoint kAsScene1405TileItemPositions[] = { - {100, 80}, - {162, 78}, - {222, 76}, - {292, 76}, - {356, 82}, - {422, 84}, - {488, 86}, - {550, 90}, - {102, 134}, - {164, 132}, - {224, 136}, - {294, 136}, - {360, 136}, - {422, 138}, - {484, 144}, - {548, 146}, - { 98, 196}, - {160, 200}, - {228, 200}, - {294, 202}, - {360, 198}, - {424, 200}, - {482, 202}, - {548, 206}, - { 98, 260}, - {160, 264}, - {226, 260}, - {296, 262}, - {358, 260}, - {424, 262}, - {486, 264}, - {550, 266}, - { 94, 322}, - {160, 316}, - {226, 316}, - {296, 320}, - {358, 322}, - {422, 324}, - {488, 322}, - {550, 322}, - { 98, 380}, - {160, 376}, - {226, 376}, - {294, 378}, - {356, 380}, - {420, 380}, - {490, 378}, - {552, 376} + {100, 80}, {162, 78}, {222, 76}, {292, 76}, + {356, 82}, {422, 84}, {488, 86}, {550, 90}, + {102, 134}, {164, 132}, {224, 136}, {294, 136}, + {360, 136}, {422, 138}, {484, 144}, {548, 146}, + { 98, 196}, {160, 200}, {228, 200}, {294, 202}, + {360, 198}, {424, 200}, {482, 202}, {548, 206}, + { 98, 260}, {160, 264}, {226, 260}, {296, 262}, + {358, 260}, {424, 262}, {486, 264}, {550, 266}, + { 94, 322}, {160, 316}, {226, 316}, {296, 320}, + {358, 322}, {422, 324}, {488, 322}, {550, 322}, + { 98, 380}, {160, 376}, {226, 376}, {294, 378}, + {356, 380}, {420, 380}, {490, 378}, {552, 376} }; -AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _countdown(0), _flag(false) { +AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) { loadSound(0, 0x05308101); // TODO _soundResource.setPan - _x = kAsScene1405TileItemPositions[_index].x; - _y = kAsScene1405TileItemPositions[_index].y; + _x = kAsScene1405TileItemPositions[_tileIndex].x; + _y = kAsScene1405TileItemPositions[_tileIndex].y; createSurface1(0x844B805C, 1100); setVisible(false); - if (getSubVar(0xCCE0280F, _index)) + if (getSubVar(0xCCE0280F, _tileIndex)) _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; SetUpdateHandler(&AsScene1405Tile::update); SetMessageHandler(&AsScene1405Tile::handleMessage); - debug("getSubVar(0x0C65F80B, _index) = %d", getSubVar(0x0C65F80B, _index)); + debug("getSubVar(0x0C65F80B, _tileIndex) = %d", getSubVar(0x0C65F80B, _tileIndex)); - startAnimation(0x844B805C, getSubVar(0x0C65F80B, _index), -1); - _newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _index); + startAnimation(0x844B805C, getSubVar(0x0C65F80B, _tileIndex), -1); + _newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _tileIndex); } void AsScene1405Tile::update() { @@ -1614,9 +1572,9 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (getSubVar(0xCCE0280F, _index) == 0 && _parentScene->getCountdown() == 0) { + if (getSubVar(0xCCE0280F, _tileIndex) == 0 && _parentScene->getCountdown() == 0) { show(); - sendMessage(_parentScene, 0x2000, _index); + sendMessage(_parentScene, 0x2000, _tileIndex); } messageResult = 1; break; @@ -1625,16 +1583,16 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, } void AsScene1405Tile::show() { - if (!_flag) { - _flag = true; + if (!_isShowing) { + _isShowing = true; playSound(0); setVisible(true); } } void AsScene1405Tile::hide() { - if (_flag) { - _flag = false; + if (_isShowing) { + _isShowing = false; playSound(0); setVisible(false); } @@ -1662,10 +1620,10 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) } } - for (uint32 index = 0; index < 48; index++) { - _tiles[index] = insertSprite(this, index); - _vm->_collisionMan->addSprite(_tiles[index]); - if (getSubVar(0xCCE0280F, index)) + for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) { + _tiles[tileIndex] = insertSprite(this, tileIndex); + _vm->_collisionMan->addSprite(_tiles[tileIndex]); + if (getSubVar(0xCCE0280F, tileIndex)) _tilesLeft--; } diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 7cd5262c03..8cabc99002 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -48,13 +48,13 @@ public: protected: int _countdown1; int _countdown2; - void update4662A0(); - void update466300(); - uint32 handleMessage466320(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage4663C0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub466420(); - void sub466460(); - void sub4664B0(); + void update(); + void upSuckInProjector(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSuckInProjector(int messageNum, const MessageParam ¶m, Entity *sender); + void stStartSucking(); + void stDoneSucking(); + void stSuckInProjector(); }; class AsScene1401Mouse : public AnimatedSprite { @@ -91,12 +91,11 @@ protected: struct AsCommonProjectorItem { NPoint point; - int8 varIndex1; - int8 varIndex2; + int8 maxSlotCount; + int8 lockSlotIndex; int8 index1; - int8 flag2; - int8 flag4; - int8 flag; + int8 leftBorderLeaves; + int8 rightBorderLeaves; }; class AsCommonProjector : public AnimatedSprite { @@ -108,30 +107,30 @@ protected: Sprite *_klayman; Sprite *_asPipe; const AsCommonProjectorItem *_asProjectorItem; - int16 _remX; - bool _flag; + int16 _beforeMoveX; + bool _lockedInSlot; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage4348E0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage434B20(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate434B60(); - void sub434C80(); - void sub434D80(); - void sub434DD0(); - void sub434DF0(); - void sub434E60(); - void sub434E90(); - void sub434EC0(); - void sub434F40(); - void sub434F80(); - void sub434FF0(); - void sub435040(); + uint32 hmLockedInSlot(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoving(); + void moveProjector(); + void stSuckedIn(); + void stIdle(); + void stMoving(); + void stStartLockedInSlot(); + void stStayLockedInSlot(); + void stStartProjecting(); + void stLockedInSlot(); + void stStopProjecting(); + void stTurnToFront(); + void stStartSuckedIn(); }; class Scene1401 : public Scene { public: Scene1401(NeverhoodEngine *vm, Module *parentModule, int which); protected: - bool _flag; + bool _projectorBorderFlag; Sprite *_class427; AsCommonProjector *_asProjector; Sprite *_asPipe; @@ -148,36 +147,36 @@ protected: // Scene1402 -class Class454 : public StaticSprite { +class SsScene1402BridgePart : public StaticSprite { public: - Class454(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority); + SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority); }; -class Class482 : public AnimatedSprite { +class AsScene1402PuzzleBox : public AnimatedSprite { public: - Class482(NeverhoodEngine *vm, Scene *parentScene, int which); + AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub428500(); - void sub428530(); - void sub428560(); + void stMoveUpDone(); + void stMoveDownDone(); + void stMoveDownSolvedDone(); }; class Scene1402 : public Scene { public: Scene1402(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_class454_1; - Sprite *_class454_2; - Sprite *_class454_3; - Sprite *_class482; + Sprite *_ssBridgePart1; + Sprite *_ssBridgePart2; + Sprite *_ssBridgePart3; + Sprite *_asPuzzleBox; AsCommonProjector *_asProjector; - bool _flag; - void update(); + bool _isShaking; + void upShaking(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub428220(); - void sub428230(); + void startShaking(); + void stopShaking(); }; // Scene1407 @@ -249,13 +248,13 @@ class Scene1405; class AsScene1405Tile : public AnimatedSprite { public: - AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 index); + AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex); void show(); void hide(); protected: Scene1405 *_parentScene; - bool _flag; - uint32 _index; + bool _isShowing; + uint32 _tileIndex; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From b320c9f5a00c6009091cfd8121aa8deaa2624d8d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 5 Oct 2012 21:55:51 +0000 Subject: NEVERHOOD: Work on Module1600: - Rename stuff (also in related files) --- engines/neverhood/gamemodule.cpp | 5 +- engines/neverhood/module1400.cpp | 2 + engines/neverhood/module1500.cpp | 4 +- engines/neverhood/module1600.cpp | 519 ++++++++++++++++++++------------------- engines/neverhood/module1600.h | 78 +++--- engines/neverhood/module2500.cpp | 66 ++--- engines/neverhood/module2500.h | 2 +- engines/neverhood/module2700.cpp | 188 +++++++------- engines/neverhood/module2700.h | 26 +- 9 files changed, 449 insertions(+), 441 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e6564f3436..df001c4cc0 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -304,12 +304,13 @@ void GameModule::startup() { setGlobalVar(0x0A18CA33, 0); setGlobalVar(0x0112090A, 0); //setGlobalVar(0x000CF819, 1); + setGlobalVar(0x04A105B3, 2); // <<gameState().sceneNum = 7; - createModule(1300, -1); + _vm->gameState().sceneNum = 8; + createModule(1600, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 59ed0c470f..88b576ac39 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1608,6 +1608,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x0C0C007D); insertMouse435(0xC00790C8, 20, 620); + // DEBUG>>> // TODO: Some debug code: Leave two matching tiles open for (int i = 0; i < 48; i++) setSubVar(0xCCE0280F, i, 1); @@ -1619,6 +1620,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) break; } } + // <<(this, tileIndex); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 88b7e73da5..a46b8fc716 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -132,8 +132,10 @@ void Scene1501::update() { uint32 Scene1501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - if (messageNum == 0x0009) { + switch (messageNum) { + case 0x0009: _flag = true; + break; } return messageResult; } diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 5c890e0653..92c566e485 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -179,11 +179,11 @@ void Module1600::updateScene() { } } -Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) +AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : AnimatedSprite(vm, 1000), _parentScene(parentScene) { - SetUpdateHandler(&Class521::update); - SetMessageHandler(&Class521::handleMessage); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::handleMessage); SetSpriteUpdate(NULL); // TODO createSurface2(200, dword_4AF4C0); @@ -214,17 +214,17 @@ Class521::Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) } -Class521::~Class521() { - if (_finalizeStateCb == AnimationCallback(&Class521::sub45D620)) { +AsCommonCar::~AsCommonCar() { + if (_finalizeStateCb == AnimationCallback(&AsCommonCar::sub45D620)) { setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190)); } } -void Class521::setPathPoints(NPointArray *pathPoints) { +void AsCommonCar::setPathPoints(NPointArray *pathPoints) { _pathPoints = pathPoints; } -void Class521::update() { +void AsCommonCar::update() { if (_newDeltaXType >= 0) { setDoDeltaX(_newDeltaXType); _newDeltaXType = -1; @@ -242,14 +242,14 @@ void Class521::update() { sub45E0A0(); } -void Class521::update45C790() { - Class521::update(); +void AsCommonCar::update45C790() { + AsCommonCar::update(); if (++_idleCounter >= _idleCounterMax) sub45D050(); sub45E0A0(); } -uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1019: @@ -345,14 +345,14 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity _moreY = param.asInteger(); _steps = 0; _flag10E = 0; - SetSpriteUpdate(&Class521::suMoveToPrevPoint); + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); _lastDistance = 640; break; case 0x2008: _moreY = param.asInteger(); _steps = 0; _flag10E = 0; - SetSpriteUpdate(&Class521::suMoveToNextPoint); + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); _lastDistance = 640; break; case 0x2009: @@ -376,8 +376,8 @@ uint32 Class521::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Class521::handleMessage(messageNum, param, sender); +uint32 AsCommonCar::handleMessage45CC30(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: if (_flag10F && param.asInteger() == 0x025424A2) { @@ -391,20 +391,20 @@ uint32 Class521::handleMessage45CC30(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 Class521::handleMessage45CCA0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonCar::handleMessage45CCA0(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x2009: sub45CF80(); break; case 0x3002: sendMessage(_parentScene, 0x200A, 0); - SetMessageHandler(&Class521::handleMessage); + SetMessageHandler(&AsCommonCar::handleMessage); break; } return 0; } -void Class521::sub45CD00() { +void AsCommonCar::sub45CD00() { bool doDeltaX = _doDeltaX; SetSpriteUpdate(NULL); _againDestPtFlag = 0; @@ -415,12 +415,12 @@ void Class521::sub45CD00() { _flag114 = 0; _flag11A = 0; _rectList = NULL; - SetMessageHandler(&Class521::handleMessage45CC30); - NextState(&Class521::sub45CFE0); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + NextState(&AsCommonCar::sub45CFE0); startAnimation(0x35698F78, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update45C790); - FinalizeState(&Class521::sub45D040); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update45C790); + FinalizeState(&AsCommonCar::sub45D040); setDoDeltaX(doDeltaX ? 1 : 0); _currMoveDirection = 0; _newMoveDirection = 0; @@ -429,36 +429,36 @@ void Class521::sub45CD00() { _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void Class521::sub45CDC0() { +void AsCommonCar::sub45CDC0() { if (_value112 == 1) { _lastDistance = 640; _flag113 = 0; _flag10E = 0; - SetSpriteUpdate(&Class521::suMoveToNextPoint); + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); } else if (_value112 == 2) { _lastDistance = 640; _flag113 = 0; _flag10E = 0; - SetSpriteUpdate(&Class521::suMoveToPrevPoint); + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); } } -void Class521::sub45CE10() { +void AsCommonCar::sub45CE10() { if (_flag10E && !_flag113 && !_flag10F) { gotoNextState(); _flag114 = 0; _flag113 = 1; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45CFE0); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45CFE0); } else if (!_flag10E && _steps && _flag113) { gotoNextState(); _flag113 = 0; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45D100); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45D100); } else { bool flag = false; uint index = 0; @@ -483,25 +483,25 @@ void Class521::sub45CE10() { } } -void Class521::sub45CF80() { +void AsCommonCar::sub45CF80() { startAnimation(0xA86A9538, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45CFE0); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45CFE0); } -void Class521::sub45CFB0() { +void AsCommonCar::sub45CFB0() { startAnimation(0xA86A9538, -1, -1); _playBackwards = true; - SetMessageHandler(&Class521::handleMessage45CCA0); - SetUpdateHandler(&Class521::update); + SetMessageHandler(&AsCommonCar::handleMessage45CCA0); + SetUpdateHandler(&AsCommonCar::update); } -void Class521::sub45CFE0() { +void AsCommonCar::sub45CFE0() { startAnimation(0x35698F78, 0, -1); - SetMessageHandler(&Class521::handleMessage); - SetUpdateHandler(&Class521::update45C790); - FinalizeState(&Class521::sub45D040); + SetMessageHandler(&AsCommonCar::handleMessage); + SetUpdateHandler(&AsCommonCar::update45C790); + FinalizeState(&AsCommonCar::sub45D040); _idleCounter = 0; _currMoveDirection = 0; _newMoveDirection = 0; @@ -509,35 +509,35 @@ void Class521::sub45CFE0() { _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void Class521::sub45D040() { - SetUpdateHandler(&Class521::update); +void AsCommonCar::sub45D040() { + SetUpdateHandler(&AsCommonCar::update); } -void Class521::sub45D050() { +void AsCommonCar::sub45D050() { startAnimation(0xB579A77C, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45CFE0); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45CFE0); _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void Class521::sub45D0A0() { +void AsCommonCar::sub45D0A0() { _flag10F = 1; gotoNextState(); startAnimation(0x9C220DA4, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - FinalizeState(&Class521::sub45D0E0); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + FinalizeState(&AsCommonCar::sub45D0E0); } -void Class521::sub45D0E0() { +void AsCommonCar::sub45D0E0() { _flag10F = 0; _newMoveDirection = 0; sub45D100(); } -void Class521::sub45D100() { +void AsCommonCar::sub45D100() { _flag114 = 1; if (_currMoveDirection == 1) { startAnimation(0xD4AA03A4, 0, -1); @@ -551,18 +551,18 @@ void Class521::sub45D100() { setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0); } -void Class521::sub45D180() { +void AsCommonCar::sub45D180() { _flag10F = 1; gotoNextState(); startAnimation(0xF46A0324, 0, -1); _value112 = 0; - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - FinalizeState(&Class521::sub45D620); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + FinalizeState(&AsCommonCar::sub45D620); sub45CDC0(); } -void Class521::moveToNextPoint() { +void AsCommonCar::moveToNextPoint() { if (_currPointIndex >= (int)_pathPoints->size() - 1) { _moreY = 0; sendMessage(this, 0x1019, 0); @@ -585,39 +585,39 @@ void Class521::moveToNextPoint() { gotoNextState(); _flag113 = 0; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45D100); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45D100); } _flag10E = 0; - SetSpriteUpdate(&Class521::suMoveToNextPoint); + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); _lastDistance = 640; } } } -void Class521::sub45D350() { +void AsCommonCar::sub45D350() { gotoNextState(); _flag10F = 1; _flag10E = 1; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45D390); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45D390); } -void Class521::sub45D390() { +void AsCommonCar::sub45D390() { gotoNextState(); _flag10F = 1; startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - FinalizeState(&Class521::sub45D620); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + FinalizeState(&AsCommonCar::sub45D620); _value112 = 1; sub45CDC0(); } -void Class521::moveToPrevPoint() { +void AsCommonCar::moveToPrevPoint() { if (_currPointIndex == 0 && _stepError == 0) { _moreY = 0; sendMessage(this, 0x1019, 0); @@ -647,46 +647,46 @@ void Class521::moveToPrevPoint() { gotoNextState(); _flag113 = 0; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45D100); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45D100); } _flag10E = 0; - SetSpriteUpdate(&Class521::suMoveToPrevPoint); + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); _lastDistance = 640; } } } -void Class521::sub45D580() { +void AsCommonCar::sub45D580() { _flag10F = 1; _flag10E = 1; FinalizeState(NULL); startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - NextState(&Class521::sub45D5D0); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::sub45D5D0); } -void Class521::sub45D5D0() { +void AsCommonCar::sub45D5D0() { _flag10F = 1; FinalizeState(NULL); startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&Class521::handleMessage45CC30); - SetUpdateHandler(&Class521::update); - FinalizeState(&Class521::sub45D620); + SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetUpdateHandler(&AsCommonCar::update); + FinalizeState(&AsCommonCar::sub45D620); _value112 = 2; sub45CDC0(); } -void Class521::sub45D620() { +void AsCommonCar::sub45D620() { _flag10F = 0; _newMoveDirection = 0; setDoDeltaX(2); sub45D100(); } -void Class521::suMoveToNextPoint() { +void AsCommonCar::suMoveToNextPoint() { int16 newX = _x, newY = _y; if (_currPointIndex >= (int)_pathPoints->size()) { @@ -831,7 +831,7 @@ void Class521::suMoveToNextPoint() { } -void Class521::suMoveToPrevPoint() { +void AsCommonCar::suMoveToPrevPoint() { int16 newX = _x, newY = _y; if (_currPointIndex == 0 && _stepError == 0) { @@ -978,60 +978,60 @@ void Class521::suMoveToPrevPoint() { } -void Class521::sub45E0A0() { +void AsCommonCar::sub45E0A0() { // TODO } -Class546::Class546(NeverhoodEngine *vm, Scene *parentScene) +AsScene1608Door::AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _parentScene(parentScene) { setVisible(false); - SetMessageHandler(&Class546::handleMessage); + SetMessageHandler(&AsScene1608Door::handleMessage); stopAnimation(); } -uint32 Class546::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1608Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextState(); break; case 0x4808: - sub44D710(); + stOpenDoor(); break; case 0x4809: - sub44D790(); + stCloseDoor(); break; } return messageResult; } -void Class546::sub44D710() { +void AsScene1608Door::stOpenDoor() { startAnimation(0x08C80144, 0, -1); setVisible(true); - NextState(&Class546::sub44D760); + NextState(&AsScene1608Door::stOpenDoorDone); playSound(0, calcHash("fxDoorOpen23")); } -void Class546::sub44D760() { +void AsScene1608Door::stOpenDoorDone() { sendMessage(_parentScene, 0x2033, 0); stopAnimation(); setVisible(false); } -void Class546::sub44D790() { +void AsScene1608Door::stCloseDoor() { startAnimation(0x08C80144, -1, -1); setVisible(true); - NextState(&Class546::sub44D7F0); + NextState(&AsScene1608Door::stCloseDoorDone); playSound(0, calcHash("fxDoorClose23")); } -void Class546::sub44D7F0() { +void AsScene1608Door::stCloseDoorDone() { sendMessage(_parentScene, 0x2034, 0); stopAnimation(); } -Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y) +AsScene1608IdleCarLower::AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { setDoDeltaX(1); @@ -1039,35 +1039,39 @@ Class547::Class547(NeverhoodEngine *vm, int16 x, int16 y) _newStickFrameIndex = 1; } -Class548::Class548(NeverhoodEngine *vm, int16 x, int16 y) +AsScene1608IdleCarFull::AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { setDoDeltaX(1); _newStickFrameIndex = 0; } -Class518::Class518(NeverhoodEngine *vm, Class521 *class521) - : AnimatedSprite(vm, 1100), _class521(class521) { +AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar) + : AnimatedSprite(vm, 1100), _asCar(asCar) { - SetUpdateHandler(&Class518::update); + SetUpdateHandler(&AsCommonCarConnector::update); createSurface1(0x60281C10, 150); startAnimation(0x60281C10, -1, -1); _newStickFrameIndex = -2; } -void Class518::update() { - _x = _class521->getX(); - _y = _class521->getY(); +void AsCommonCarConnector::update() { + _x = _asCar->getX(); + _y = _asCar->getY(); AnimatedSprite::update(); } Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _class521(NULL), _countdown1(0) { + : Scene(vm, parentModule, true), _asCar(NULL), _countdown1(0) { + + /* TODO: Find out which of the message/update handlers are used for + the upper/lower floors and rename them accordingly. + */ setGlobalVar(0x21E60190, 1); _surfaceFlag = true; - SetMessageHandler(&Scene1608::handleMessage44D2A0); + SetMessageHandler(&Scene1608::hmLowerFloor); _class545 = insertSprite(this, 1, 1100, 198, 220); _vm->_collisionMan->addSprite(_class545); @@ -1078,9 +1082,9 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) else { setRectList(0x004B47D0); insertKlayman(380, 438); - _klayman2 = _klayman; - _flag4 = false; - _class546 = insertSprite(this); + _kmScene1608 = _klayman; + _klaymanInCar = false; + _asDoor = insertSprite(this); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); setMessageList(0x004B46A8); setBackground(0x10080E01); @@ -1088,7 +1092,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - SetUpdateHandler(&Scene1608::update44CE90); + SetUpdateHandler(&Scene1608::upLowerFloor); insertMouse433(0x80E05108); insertStaticSprite(0x4B18F868, 1200); } @@ -1096,8 +1100,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameState().which = 0; setRectList(0x004B47D0); insertKlayman(0, 438); - _klayman2 = _klayman; - _flag4 = false; + _kmScene1608 = _klayman; + _klaymanInCar = false; setMessageList(0x004B46B0); setBackground(0x10080E01); setPalette(0x10080E01); @@ -1105,10 +1109,10 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); insertMouse433(0x80E05108); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); - _class546 = insertSprite(this); + _asDoor = insertSprite(this); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - SetUpdateHandler(&Scene1608::update44CE90); - sendMessage(_class546, 0x4808, 0); + SetUpdateHandler(&Scene1608::upLowerFloor); + sendMessage(_asDoor, 0x4808, 0); insertStaticSprite(0x4B18F868, 1200); } else if (which == 2) { _vm->gameState().which = 1; @@ -1119,38 +1123,38 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette("paPodRed", 65, 31, 65); insertMouse433(0x01600988); _sprite2 = insertStaticSprite(0x491F38A8, 1100); - _class521 = createSprite(this, 375, 227); // Create but don't add to the sprite list yet - _class547 = insertSprite(375, 227); - _class548 = insertSprite(375, 227); - _class521->setVisible(false); + _asCar = createSprite(this, 375, 227); // Create but don't add to the sprite list yet + _asIdleCarLower = insertSprite(375, 227); + _asIdleCarFull = insertSprite(375, 227); + _asCar->setVisible(false); if (getGlobalVar(0xC0418A02)) { insertKlayman(373, 220); _klayman->setDoDeltaX(1); } else { insertKlayman(283, 220); } - _klayman2 = _klayman; + _kmScene1608 = _klayman; setMessageList(0x004B47A8); - SetMessageHandler(&Scene1608::handleMessage44D3C0); - SetUpdateHandler(&Scene1608::update44CED0); + SetMessageHandler(&Scene1608::hmUpperFloor); + SetUpdateHandler(&Scene1608::upUpperFloor); // NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original - _class521->setPathPoints(_roomPathPoints); - sendMessage(_class521, 0x2002, _roomPathPoints->size() - 1); + _asCar->setPathPoints(_roomPathPoints); + sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1); _sprite3 = insertStaticSprite(0xB47026B0, 1100); _rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _rect2 = _rect1; _rect2.y2 = 215; _klayman->setClipRect(_rect1); - _class521->setClipRect(_rect1); - _class547->setClipRect(_rect1); - _class548->setClipRect(_rect1); + _asCar->setClipRect(_rect1); + _asIdleCarLower->setClipRect(_rect1); + _asIdleCarFull->setClipRect(_rect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - insertSprite(_class521)->setClipRect(_rect1); - _flag4 = false; - _flag2 = false; - _flag1 = 0; + insertSprite(_asCar)->setClipRect(_rect1); + _klaymanInCar = false; + _carClipFlag = false; + _carStatus = 0; setRectList(0x004B4810); } @@ -1163,36 +1167,36 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x98001604); _palette->addPalette("paPodRed", 65, 31, 65); insertMouse433(0x01600988); - _class521 = insertSprite(this, 375, 227); - _class547 = insertSprite(375, 227); - _class548 = insertSprite(375, 227); + _asCar = insertSprite(this, 375, 227); + _asIdleCarLower = insertSprite(375, 227); + _asIdleCarFull = insertSprite(375, 227); _sprite2 = insertStaticSprite(0x491F38A8, 1100); - _klayman2 = createSprite(this, 439, 220); // Special Klayman handling... - sendMessage(_klayman2, 0x2032, 1); - _klayman2->setDoDeltaX(1); - SetMessageHandler(&Scene1608::handleMessage44D470); - SetUpdateHandler(&Scene1608::update44D1E0); - _class547->setVisible(false); - _class548->setVisible(false); + _kmScene1608 = createSprite(this, 439, 220); // Special Klayman handling... + sendMessage(_kmScene1608, 0x2032, 1); + _kmScene1608->setDoDeltaX(1); + SetMessageHandler(&Scene1608::hmRidingCar); + SetUpdateHandler(&Scene1608::upRidingCar); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); // NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original - _class521->setPathPoints(_roomPathPoints); - sendMessage(_class521, 0x2002, 0); - sendMessage(_class521, 0x2008, 90); + _asCar->setPathPoints(_roomPathPoints); + sendMessage(_asCar, 0x2002, 0); + sendMessage(_asCar, 0x2008, 90); _sprite3 = insertStaticSprite(0xB47026B0, 1100); _rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _rect2 = _rect1; _rect2.y2 = 215; - _klayman2->setClipRect(_rect1); - _class521->setClipRect(_rect1); - _class547->setClipRect(_rect1); - _class548->setClipRect(_rect1); + _kmScene1608->setClipRect(_rect1); + _asCar->setClipRect(_rect1); + _asIdleCarLower->setClipRect(_rect1); + _asIdleCarFull->setClipRect(_rect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); // ... _vm->_collisionMan->addSprite(_asTape); - insertSprite(_class521)->setClipRect(_rect1); - _flag4 = true; - _flag2 = true; - _flag1 = 0; + insertSprite(_asCar)->setClipRect(_rect1); + _klaymanInCar = true; + _carClipFlag = true; + _carStatus = 0; } _palette->addPalette("paKlayRed", 0, 64, 0); @@ -1200,113 +1204,100 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1608::~Scene1608() { - setGlobalVar(0xC0418A02, _klayman2->isDoDeltaX() ? 1 : 0); - // Weird - if (_flag4) { - delete _klayman2; + setGlobalVar(0xC0418A02, _kmScene1608->isDoDeltaX() ? 1 : 0); + if (_klaymanInCar) { + delete _kmScene1608; } else { - delete _class521; + delete _asCar; } } -void Scene1608::update44CE90() { +void Scene1608::upLowerFloor() { Scene::update(); if (_countdown1 != 0 && (--_countdown1 == 0)) { leaveScene(0); } } -void Scene1608::update44CED0() { +void Scene1608::upUpperFloor() { Scene::update(); - if (_flag1 == 1) { + if (_carStatus == 1) { removeSurface(_klayman->getSurface()); removeEntity(_klayman); - addSprite(_class521); - _flag4 = true; + addSprite(_asCar); + _klaymanInCar = true; clearRectList(); - SetUpdateHandler(&Scene1608::update44CFE0); - SetMessageHandler(&Scene1608::handleMessage44D510); - _class547->setVisible(false); - _class548->setVisible(false); - _class521->setVisible(true); - sendMessage(_class521, 0x2009, 0); - _class521->handleUpdate(); + SetUpdateHandler(&Scene1608::upCarAtHome); + SetMessageHandler(&Scene1608::hmCarAtHome); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); + _asCar->setVisible(true); + sendMessage(_asCar, 0x2009, 0); + _asCar->handleUpdate(); _klayman = NULL; - _flag1 = 0; - } - if (_klayman2->getX() <= 375) { - _klayman2->setClipRect(_rect1); - } else { - _klayman2->setClipRect(_rect2); + _carStatus = 0; } + updateKlaymanCliprect(); } -void Scene1608::update44CFE0() { +void Scene1608::upCarAtHome() { Scene::update(); if (_mouseClicked) { - if (_mouseClickPos.x <= 329 && _class521->getX() == 375 && _class521->getY() == 227) { - sendMessage(_class521, 0x200A, 0); - SetUpdateHandler(&Scene1608::update44D0C0); + if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) { + sendMessage(_asCar, 0x200A, 0); + SetUpdateHandler(&Scene1608::upGettingOutOfCar); } else { - sendPointMessage(_class521, 0x2004, _mouseClickPos); - SetMessageHandler(&Scene1608::handleMessage44D470); - SetUpdateHandler(&Scene1608::update44D1E0); + sendPointMessage(_asCar, 0x2004, _mouseClickPos); + SetMessageHandler(&Scene1608::hmRidingCar); + SetUpdateHandler(&Scene1608::upRidingCar); } _mouseClicked = false; } - if (_klayman2->getX() <= 375) { - _klayman2->setClipRect(_rect1); - } else { - _klayman2->setClipRect(_rect2); - } + updateKlaymanCliprect(); } -void Scene1608::update44D0C0() { +void Scene1608::upGettingOutOfCar() { Scene::update(); - if (_flag1 == 2) { - _klayman = _klayman2; - removeSurface(_class521->getSurface()); - removeEntity(_class521); + if (_carStatus == 2) { + _klayman = _kmScene1608; + removeSurface(_asCar->getSurface()); + removeEntity(_asCar); addSprite(_klayman); - _flag4 = false; - SetMessageHandler(&Scene1608::handleMessage44D3C0); - SetUpdateHandler(&Scene1608::update44CED0); + _klaymanInCar = false; + SetMessageHandler(&Scene1608::hmUpperFloor); + SetUpdateHandler(&Scene1608::update); setRectList(0x004B4810); - _class547->setVisible(true); - _class548->setVisible(true); - _class521->setVisible(false); + _asIdleCarLower->setVisible(true); + _asIdleCarFull->setVisible(true); + _asCar->setVisible(false); setMessageList(0x004B4748); runMessageList(); _klayman->handleUpdate(); - _flag1 = 0; - } - if (_klayman2->getX() <= 375) { - _klayman2->setClipRect(_rect1); - } else { - _klayman2->setClipRect(_rect2); + _carStatus = 0; } + updateKlaymanCliprect(); } -void Scene1608::update44D1E0() { +void Scene1608::upRidingCar() { Scene::update(); if (_mouseClicked) { - sendPointMessage(_class521, 0x2004, _mouseClickPos); + sendPointMessage(_asCar, 0x2004, _mouseClickPos); _mouseClicked = false; } - if (_class521->getX() < 300) { - if (_flag2) { - _flag2 = false; - _class521->setClipRect(_rect1); - if (!_class521->isDoDeltaX()) - sendMessage(_class521, 0x200E, 0); + if (_asCar->getX() < 300) { + if (_carClipFlag) { + _carClipFlag = false; + _asCar->setClipRect(_rect1); + if (!_asCar->isDoDeltaX()) + sendMessage(_asCar, 0x200E, 0); } - } else if (!_flag2) { - _flag2 = true; - _class521->setClipRect(_rect3); + } else if (!_carClipFlag) { + _carClipFlag = true; + _asCar->setClipRect(_rect3); } } -uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1315,7 +1306,7 @@ uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam ¶m, _klayman->setVisible(false); showMouse(false); _sprite1->setVisible(false); - sendMessage(_class546, 0x4809, 0); + sendMessage(_asDoor, 0x4809, 0); _countdown1 = 28; } break; @@ -1324,7 +1315,7 @@ uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam ¶m, break; case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman2, 0x1014, _asTape); + sendEntityMessage(_kmScene1608, 0x1014, _asTape); setMessageList(0x004B4770); } else if (sender == _class545) { setMessageList(0x004B46C8); @@ -1334,12 +1325,12 @@ uint32 Scene1608::handleMessage44D2A0(int messageNum, const MessageParam ¶m, return 0; } -uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x60842040) { - _flag1 = true; + _carStatus = 1; } break; case 0x200D: @@ -1347,7 +1338,7 @@ uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam ¶m, break; case 0x4826: if (sender == _class545) { - sendEntityMessage(_klayman2, 0x1014, _class545); + sendEntityMessage(_kmScene1608, 0x1014, _class545); setMessageList(0x004B4760); } break; @@ -1355,16 +1346,16 @@ uint32 Scene1608::handleMessage44D3C0(int messageNum, const MessageParam ¶m, return 0; } -uint32 Scene1608::handleMessage44D470(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2005: leaveScene(1); break; case 0x2006: - SetMessageHandler(&Scene1608::handleMessage44D510); - SetUpdateHandler(&Scene1608::update44CFE0); - sendMessage(_class521, 0x200F, 1); + SetMessageHandler(&Scene1608::hmCarAtHome); + SetUpdateHandler(&Scene1608::upCarAtHome); + sendMessage(_asCar, 0x200F, 1); break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -1373,11 +1364,11 @@ uint32 Scene1608::handleMessage44D470(int messageNum, const MessageParam ¶m, return 0; } -uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x200A: - _flag1 = 2; + _carStatus = 2; break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -1386,11 +1377,18 @@ uint32 Scene1608::handleMessage44D510(int messageNum, const MessageParam ¶m, return 0; } +void Scene1608::updateKlaymanCliprect() { + if (_kmScene1608->getX() <= 375) + _kmScene1608->setClipRect(_rect1); + else + _kmScene1608->setClipRect(_rect2); +} + Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown1(1), _index1(0), _index3(0), _flag5(true), _flag6(false) { + : Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { // TODO _vm->gameModule()->initScene3011Vars(); - _index2 = getGlobalVar(0x2414C2F2); + _noisySymbolIndex = getGlobalVar(0x2414C2F2); _surfaceFlag = true; SetMessageHandler(&Scene1609::handleMessage); @@ -1399,8 +1397,8 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x92124A14); setPalette(0x92124A14); - for (int i = 0; i < 12; i++) - _asSymbols[i] = insertSprite(i, false); + for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++) + _asSymbols[symbolPosition] = insertSprite(symbolPosition, false); _ssButton = insertSprite(this, true); _vm->_collisionMan->addSprite(_ssButton); @@ -1412,21 +1410,21 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) } void Scene1609::update() { - if (!_flag6 && _countdown1 != 0 && (--_countdown1 == 0)) { - if (_flag5) { - _index1++; - if (_index1 >= 12) - _index1 = 0; - _asSymbols[_index3]->change(_index1 + 12, _index1 == (int)getSubVar(0x04909A50, _index2)); - _flag5 = false; + if (!_isSolved && _countdown1 != 0 && (--_countdown1 == 0)) { + if (_changeCurrentSymbol) { + _currentSymbolIndex++; + if (_currentSymbolIndex >= 12) + _currentSymbolIndex = 0; + _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(0x04909A50, _noisySymbolIndex)); + _changeCurrentSymbol = false; _countdown1 = 36; } else { - _asSymbols[_index3]->hide(); - _flag5 = true; + _asSymbols[_symbolPosition]->hide(); + _changeCurrentSymbol = true; _countdown1 = 12; } } - if (_flag6 && !isSoundPlaying(0)) { + if (_isSolved && !isSoundPlaying(0)) { leaveScene(1); } Scene::update(); @@ -1442,23 +1440,23 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit break; // TODO: Debug stuff case 0x2000: - if (!_flag6) { - if (_flag5) - _asSymbols[_index3]->change(_index1 + 12, false); - _asSymbols[_index3]->stopSymbolSound(); - _index3++; - if (_index3 >= 12) { + if (!_isSolved) { + if (_changeCurrentSymbol) + _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false); + _asSymbols[_symbolPosition]->stopSymbolSound(); + _symbolPosition++; + if (_symbolPosition >= 12) { if (testVars()) { playSound(0); setGlobalVar(0x2C531AF8, 1); - _flag6 = true; + _isSolved = true; } else { - _index3 = 0; + _symbolPosition = 0; for (int i = 0; i < 12; i++) _asSymbols[i]->hide(); } } - _flag5 = true; + _changeCurrentSymbol = true; _countdown1 = 1; } break; @@ -1468,6 +1466,8 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit bool Scene1609::testVars() { int index1 = 0; + + // Find the position of the first symbol do { int cmpIndex = _asSymbols[0]->getIndex(); if (!_asSymbols[0]->getFlag1()) @@ -1476,17 +1476,20 @@ bool Scene1609::testVars() { break; index1++; } while(1); + + // Check if the entered symbols match for (int index2 = 0; index2 < 12; index2++) { int cmpIndex = _asSymbols[index2]->getIndex(); if (!_asSymbols[index2]->getFlag1()) cmpIndex -= 12; if ((int)getSubVar(0x04909A50, index1) != cmpIndex) return false; - _index1++; - if (_index1 >= 12) - _index1 = 0; - _index2++; + index1++; + if (index1 >= 12) + index1 = 0; + index2++; } + return true; } diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index b5b8e6b7fc..ec31b68a0f 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -41,10 +41,10 @@ protected: void updateScene(); }; -class Class521 : public AnimatedSprite { +class AsCommonCar : public AnimatedSprite { public: - Class521(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); - ~Class521(); + AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); + ~AsCommonCar(); void setPathPoints(NPointArray *pathPoints); protected: Scene *_parentScene; @@ -105,33 +105,33 @@ protected: void sub45E0A0(); }; -class Class546 : public AnimatedSprite { +class AsScene1608Door : public AnimatedSprite { public: - Class546(NeverhoodEngine *vm, Scene *parentScene); + AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub44D710(); - void sub44D760(); - void sub44D790(); - void sub44D7F0(); + void stOpenDoor(); + void stOpenDoorDone(); + void stCloseDoor(); + void stCloseDoorDone(); }; -class Class547 : public AnimatedSprite { +class AsScene1608IdleCarLower : public AnimatedSprite { public: - Class547(NeverhoodEngine *vm, int16 x, int16 y); + AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y); }; -class Class548 : public AnimatedSprite { +class AsScene1608IdleCarFull : public AnimatedSprite { public: - Class548(NeverhoodEngine *vm, int16 x, int16 y); + AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y); }; -class Class518 : public AnimatedSprite { +class AsCommonCarConnector : public AnimatedSprite { public: - Class518(NeverhoodEngine *vm, Class521 *class521); + AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar); protected: - Class521 *_class521; + AsCommonCar *_asCar; void update(); }; @@ -140,34 +140,34 @@ public: Scene1608(NeverhoodEngine *vm, Module *parentModule, int which); ~Scene1608(); protected: - Class521 *_class521; + AsCommonCar *_asCar; Sprite *_class545; - Sprite *_class546; - Sprite *_class547; - Sprite *_class548; + Sprite *_asDoor; + Sprite *_asIdleCarLower; + Sprite *_asIdleCarFull; Sprite *_sprite1; Sprite *_sprite2; Sprite *_sprite3; Sprite *_asTape; - Klayman *_klayman2; + Klayman *_kmScene1608; NRect _rect1; NRect _rect2; NRect _rect3; - int _flag1; - bool _flag2; - bool _flag3; - bool _flag4; + int _carStatus; + bool _carClipFlag; + bool _klaymanInCar; int _countdown1; NPointArray *_roomPathPoints; - void update44CE90(); - void update44CED0(); - void update44CFE0(); - void update44D0C0(); - void update44D1E0(); - uint32 handleMessage44D2A0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage44D3C0(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage44D470(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage44D510(int messageNum, const MessageParam ¶m, Entity *sender); + void upLowerFloor(); + void upUpperFloor(); + void upCarAtHome(); + void upGettingOutOfCar(); + void upRidingCar(); + uint32 hmLowerFloor(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); + void updateKlaymanCliprect(); }; class Scene1609 : public Scene { @@ -176,12 +176,12 @@ public: protected: Sprite *_ssButton; AsScene3011Symbol *_asSymbols[12]; - int _index1; - int _index2; - int _index3; + int _currentSymbolIndex; + int _noisySymbolIndex; + int _symbolPosition; int _countdown1; - bool _flag5; - bool _flag6; + bool _changeCurrentSymbol; + bool _isSolved; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); bool testVars(); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index cc0dda9837..26d0d88de1 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -249,7 +249,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _class437 = createSprite(0x99BE9015); // Don't add this to the sprite list addEntity(_class437); - _class521 = createSprite(this, 211, 400); // Create but don't add to the sprite list yet + _asCar = createSprite(this, 211, 400); // Create but don't add to the sprite list yet _class541 = insertSprite(211, 400); _class542 = insertSprite(211, 400); insertStaticSprite(0xC42AC521, 1500); @@ -262,11 +262,11 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B2608); SetMessageHandler(&Scene2501::handleMessage); SetUpdateHandler(&Scene2501::update); - sendMessage(_class521, 0x2009, 0); - _class521->setVisible(false); + sendMessage(_asCar, 0x2009, 0); + _asCar->setVisible(false); _currTrackIndex = 0; } else if (which == 1 || which == 2) { - addSprite(_class521); + addSprite(_asCar); _kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393); _klaymanInCar = true; sendMessage(_kmScene2501, 0x2000, 1); @@ -284,33 +284,33 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B2608); SetMessageHandler(&Scene2501::handleMessage); SetUpdateHandler(&Scene2501::update); - sendMessage(_class521, 0x2009, 0); - _class521->setVisible(false); + sendMessage(_asCar, 0x2009, 0); + _asCar->setVisible(false); _currTrackIndex = 0; } - _class517 = insertSprite(_class521, _class437->getSurface(), 4); - _class520 = insertSprite(_class521, _class437->getSurface(), 4); - _class519 = insertSprite(_class521, _class437->getSurface(), 4); - insertSprite(_class521); + _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + _class520 = insertSprite(_asCar, _class437->getSurface(), 4); + _class519 = insertSprite(_asCar, _class437->getSurface(), 4); + insertSprite(_asCar); _pointListsCount = 3; _newTrackIndex = -1; _dataResource.load(calcHash("Ashooded")); _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) { NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_class521, 0x2007, 150); + sendMessage(_asCar, 0x2007, 150); } else { NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_class521, 0x2008, 150); + sendMessage(_asCar, 0x2008, 150); } _carStatus = 0; @@ -322,23 +322,23 @@ Scene2501::~Scene2501() { if (_klaymanInCar) delete _kmScene2501; else - delete _class521; + delete _asCar; } void Scene2501::update() { Scene::update(); if (_carStatus == 1) { removeSprite(_klayman); - addSprite(_class521); + addSprite(_asCar); clearRectList(); _klaymanInCar = true; SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); _class541->setVisible(false); _class542->setVisible(false); - _class521->setVisible(true); - sendMessage(_class521, 0x2009, 0); - _class521->handleUpdate(); + _asCar->setVisible(true); + sendMessage(_asCar, 0x2009, 0); + _asCar->handleUpdate(); _klayman = NULL; _carStatus = 0; } @@ -348,8 +348,8 @@ void Scene2501::update() { void Scene2501::upCarAtHome() { Scene::update(); if (_mouseClicked) { - if (_mouseClickPos.x <= 210 && _class521->getX() == 211 && _class521->getY() == 400) { - sendMessage(_class521, 0x200A, 0); + if (_mouseClickPos.x <= 210 && _asCar->getX() == 211 && _asCar->getY() == 400) { + sendMessage(_asCar, 0x200A, 0); SetUpdateHandler(&Scene2501::upGettingOutOfCar); } else { findClosestTrack(_mouseClickPos); @@ -365,7 +365,7 @@ void Scene2501::upGettingOutOfCar() { Scene::update(); if (_carStatus == 2) { _klayman = _kmScene2501; - removeSprite(_class521); + removeSprite(_asCar); addSprite(_klayman); _klaymanInCar = false; SetMessageHandler(&Scene2501::handleMessage); @@ -373,7 +373,7 @@ void Scene2501::upGettingOutOfCar() { setRectList(0x004B2608); _class541->setVisible(true); _class542->setVisible(true); - _class521->setVisible(false); + _asCar->setVisible(false); setMessageList(0x004B2570); runMessageList(); _klayman->handleUpdate(); @@ -413,7 +413,7 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity } else if (_sceneInfos[_currTrackIndex]->which1 == 0) { SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); - sendMessage(_class521, 0x200F, 1); + sendMessage(_asCar, 0x200F, 1); } else if (_sceneInfos[_currTrackIndex]->which1 > 0) { leaveScene(_sceneInfos[_currTrackIndex]->which1); } @@ -424,7 +424,7 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity } else if (_sceneInfos[_currTrackIndex]->which2 == 0) { SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); - sendMessage(_class521, 0x200F, 1); + sendMessage(_asCar, 0x200F, 1); } else if (_sceneInfos[_currTrackIndex]->which2 > 0) { leaveScene(_sceneInfos[_currTrackIndex]->which2); } @@ -452,13 +452,13 @@ uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity void Scene2501::changeTrack() { _currTrackIndex = _newTrackIndex; _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (_currTrackIndex == 0) { - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); } else { - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); } - sendPointMessage(_class521, 0x2004, _clickPoint); + sendPointMessage(_asCar, 0x2004, _clickPoint); _newTrackIndex = -1; } @@ -482,12 +482,12 @@ void Scene2501::findClosestTrack(NPoint &pt) { _newTrackIndex = minMatchTrackIndex; _clickPoint = pt; if (_currTrackIndex == 0) - sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else - sendMessage(_class521, 0x2003, 0); + sendMessage(_asCar, 0x2003, 0); } else { _newTrackIndex = -1; - sendMessage(_class521, 0x2004, pt); + sendMessage(_asCar, 0x2004, pt); } } diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index fb61ba5010..e5b915761a 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -61,7 +61,7 @@ public: Scene2501(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Scene2501(); protected: - Class521 *_class521; + AsCommonCar *_asCar; Sprite *_class437; Sprite *_class517; Sprite *_class519; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index f9a5c2abce..7c93aa7c9a 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -523,8 +523,8 @@ Class437::Class437(NeverhoodEngine *vm, uint32 fileHash) StaticSprite::update(); } -Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index) - : AnimatedSprite(vm, 1100), _class521(class521), _index(index), _animFileHash(0) { +Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index) + : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) { SetUpdateHandler(&Class517::update); createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource @@ -537,28 +537,28 @@ void Class517::update() { } void Class517::updateShadow() { - if (_class521->getFrameIndex() != _currFrameIndex || _class521->getCurrAnimFileHash() != _animFileHash) { - uint32 fileHash = _class521->getCurrAnimFileHash(); + if (_asCar->getFrameIndex() != _currFrameIndex || _asCar->getCurrAnimFileHash() != _animFileHash) { + uint32 fileHash = _asCar->getCurrAnimFileHash(); if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 || fileHash == 0x9966B138 || fileHash == 0xB579A77C || fileHash == 0xA86A9538 || fileHash == 0xD4220027 || fileHash == 0xD00A1364 || fileHash == 0xD4AA03A4 || fileHash == 0xF46A0324) { - startAnimation(fileHash, _class521->getFrameIndex(), -1); - _newStickFrameIndex = _class521->getFrameIndex(); + startAnimation(fileHash, _asCar->getFrameIndex(), -1); + _newStickFrameIndex = _asCar->getFrameIndex(); } _animFileHash = fileHash; } - _x = _class521->getX() + kClass517Points[_index].x; - _y = _class521->getY() + kClass517Points[_index].y; - if (!_class521->getVisible()) { + _x = _asCar->getX() + kClass517Points[_index].x; + _y = _asCar->getY() + kClass517Points[_index].y; + if (!_asCar->getVisible()) { startAnimation(0x1209E09F, 0, -1); _newStickFrameIndex = 0; } - setDoDeltaX(_class521->isDoDeltaX() ? 1 : 0); + setDoDeltaX(_asCar->isDoDeltaX() ? 1 : 0); } -Class519::Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index) - : AnimatedSprite(vm, 1100), _class521(class521), _index(index) { +Class519::Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index) + : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index) { SetUpdateHandler(&Class519::update); createShadowSurface1(shadowSurface, 0x60281C10, 150); @@ -567,13 +567,13 @@ Class519::Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSur } void Class519::update() { - _x = _class521->getX() + kClass517Points[_index].x; - _y = _class521->getY() + kClass517Points[_index].y; + _x = _asCar->getX() + kClass517Points[_index].x; + _y = _asCar->getY() + kClass517Points[_index].y; AnimatedSprite::update(); } -Class520::Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex) - : AnimatedSprite(vm, 1100), _class521(class521) { +Class520::Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex) + : AnimatedSprite(vm, 1100), _asCar(asCar) { SetUpdateHandler(&Class520::update); createShadowSurface1(shadowSurface, 0x0759129C, 100); @@ -582,8 +582,8 @@ Class520::Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSur } void Class520::update() { - _x = _class521->getX(); - _y = _class521->getY(); + _x = _asCar->getX(); + _y = _asCar->getY(); AnimatedSprite::update(); } @@ -613,43 +613,43 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) _class437 = createSprite(sceneInfo->class437Filename); addEntity(_class437); - _class521 = insertSprite(this, 320, 240); - _class517 = insertSprite(_class521, _class437->getSurface(), 4); - _class520 = insertSprite(_class521, _class437->getSurface(), 4); - _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _asCar = insertSprite(this, 320, 240); + _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + _class520 = insertSprite(_asCar, _class437->getSurface(), 4); + _class519 = insertSprite(_asCar, _class437->getSurface(), 4); } else { _class437 = NULL; - _class521 = insertSprite(this, 320, 240); + _asCar = insertSprite(this, 320, 240); } - _class518 = insertSprite(_class521); + _asCarConnector = insertSprite(_asCar); _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; _dataResource.load(sceneInfo->dataResourceFilename); _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (which == _which2) { NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_class521, 0x2007, 150); + sendMessage(_asCar, 0x2007, 150); } else { NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_class521, 0x2008, 150); + sendMessage(_asCar, 0x2008, 150); } - _class521->setClipRect(clipRect); - _class518->setClipRect(clipRect); + _asCar->setClipRect(clipRect); + _asCarConnector->setClipRect(clipRect); if (which == 1) { SetMessageHandler(&Scene2701::handleMessage42F500); } else { - sendMessage(_class521, 0x2009, 0); + sendMessage(_asCar, 0x2009, 0); SetMessageHandler(&Scene2701::handleMessage42F600); } @@ -659,7 +659,7 @@ uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam ¶m, Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - sendPointMessage(_class521, 0x2004, param.asPoint()); + sendPointMessage(_asCar, 0x2004, param.asPoint()); break; case 0x2005: if (_which1 >= 0) @@ -683,7 +683,7 @@ uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam ¶m, if (param.asPoint().x >= 385) { leaveScene(0); } else { - sendPointMessage(_class521, 0x2004, param.asPoint()); + sendPointMessage(_asCar, 0x2004, param.asPoint()); SetMessageHandler(&Scene2701::handleMessage42F500); } break; @@ -723,11 +723,11 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) _class437 = createSprite(0x12002035); addEntity(_class437); - _class521 = insertSprite(this, 320, 240); - _class517 = insertSprite(_class521, _class437->getSurface(), 4); - insertSprite(_class521); - _class520 = insertSprite(_class521, _class437->getSurface(), 4); - _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _asCar = insertSprite(this, 320, 240); + _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + insertSprite(_asCar); + _class520 = insertSprite(_asCar, _class437->getSurface(), 4); + _class519 = insertSprite(_asCar, _class437->getSurface(), 4); _dataResource.load(0x04310014); @@ -761,14 +761,14 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) } _trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (which == _currSceneInfos[_currTrackIndex]->which2) { - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); - sendMessage(_class521, 0x2007, 150); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2007, 150); } else { - sendMessage(_class521, 0x2002, 0); - sendMessage(_class521, 0x2008, 150); + sendMessage(_asCar, 0x2002, 0); + sendMessage(_asCar, 0x2008, 150); } _palette->copyBasePalette(0, 256, 0); @@ -777,13 +777,13 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) void Scene2702::update() { Scene::update(); - if (_flag1 && _class521->getX() > 422) { + if (_flag1 && _asCar->getX() > 422) { debug("fade #1"); _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); _palette->startFadeToPalette(12); _flag1 = false; - } else if (!_flag1 && _class521->getX() <= 422) { + } else if (!_flag1 && _asCar->getX() <= 422) { debug("fade #2"); _palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0); @@ -839,35 +839,35 @@ void Scene2702::findClosestTrack(NPoint pt) { _newTrackDestX = pt.x; if (_currSceneInfos == _sceneInfos[0]) { if (_currTrackIndex == 0) - sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else - sendMessage(_class521, 0x2003, 0); + sendMessage(_asCar, 0x2003, 0); } else if (_currTrackIndex == 2) { - sendMessage(_class521, 0x2003, 0); + sendMessage(_asCar, 0x2003, 0); } else { - sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); } } else { _newTrackIndex = -1; - sendMessage(_class521, 0x2004, pt.x); + sendMessage(_asCar, 0x2004, pt.x); } } void Scene2702::changeTrack() { _currTrackIndex = _newTrackIndex; _trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (_currSceneInfos == _sceneInfos[0]) { if (_currTrackIndex == 0) - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); else - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); } else if (_currTrackIndex == 2) { - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); } else { - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); } - sendMessage(_class521, 0x2004, _newTrackDestX); + sendMessage(_asCar, 0x2004, _newTrackDestX); _newTrackIndex = -1; } @@ -900,56 +900,56 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _class437 = createSprite(sceneInfo->class437Filename); addEntity(_class437); - _class521 = insertSprite(this, 320, 240); - _class517 = insertSprite(_class521, _class437->getSurface(), 4); - _class520 = insertSprite(_class521, _class437->getSurface(), 4); - _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _asCar = insertSprite(this, 320, 240); + _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + _class520 = insertSprite(_asCar, _class437->getSurface(), 4); + _class519 = insertSprite(_asCar, _class437->getSurface(), 4); } else { _class437 = NULL; _class517 = NULL; - _class521 = insertSprite(this, 320, 240); + _asCar = insertSprite(this, 320, 240); } - _class518 = insertSprite(_class521); + _asCarConnector = insertSprite(_asCar); _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; _dataResource.load(sceneInfo->dataResourceFilename); _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (sceneInfo->rectListName) { _rectList = _dataResource.getRectArray(sceneInfo->rectListName); - // TODO _class521->setPathRects(_rectList); + // TODO _asCar->setPathRects(_rectList); } if (which == _which2) { NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) - sendMessage(_class521, 0x2009, 0); + sendMessage(_asCar, 0x2009, 0); else - sendMessage(_class521, 0x2007, 0); + sendMessage(_asCar, 0x2007, 0); } else { NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) - sendMessage(_class521, 0x2009, 0); + sendMessage(_asCar, 0x2009, 0); else - sendMessage(_class521, 0x2008, 0); + sendMessage(_asCar, 0x2008, 0); } if (clipRect) { - _class521->getClipRect() = *clipRect; + _asCar->getClipRect() = *clipRect; if (_class517) _class517->getClipRect() = *clipRect; if (_class520) _class520->getClipRect() = *clipRect; if (_class519) _class519->getClipRect() = *clipRect; - if (_class518) - _class518->getClipRect() = *clipRect; + if (_asCarConnector) + _asCarConnector->getClipRect() = *clipRect; } } @@ -957,7 +957,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 void Scene2704::update() { Scene::update(); if (_mouseClicked) { - sendPointMessage(_class521, 0x2004, _mouseClickPos); + sendPointMessage(_asCar, 0x2004, _mouseClickPos); _mouseClicked = false; } } @@ -1004,11 +1004,11 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) _class437 = createSprite(0x18808B88); addEntity(_class437); - _class521 = insertSprite(this, 320, 240); - _class517 = insertSprite(_class521, _class437->getSurface(), 4); - _class518 = insertSprite(_class521); - _class520 = insertSprite(_class521, _class437->getSurface(), 4); - _class519 = insertSprite(_class521, _class437->getSurface(), 4); + _asCar = insertSprite(this, 320, 240); + _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarConnector = insertSprite(_asCar); + _class520 = insertSprite(_asCar, _class437->getSurface(), 4); + _class519 = insertSprite(_asCar, _class437->getSurface(), 4); _dataResource.load(0x06000162); @@ -1020,20 +1020,20 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) _currTrackIndex = 0; _trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName)); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (which == kSceneInfo2706[_currTrackIndex].which2) { - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); if (which == 5) - sendMessage(_class521, 0x2007, 50); + sendMessage(_asCar, 0x2007, 50); else - sendMessage(_class521, 0x2007, 150); + sendMessage(_asCar, 0x2007, 150); } else { - sendMessage(_class521, 0x2002, 0); + sendMessage(_asCar, 0x2002, 0); if (which == 5) - sendMessage(_class521, 0x2008, 50); + sendMessage(_asCar, 0x2008, 50); else - sendMessage(_class521, 0x2008, 150); + sendMessage(_asCar, 0x2008, 150); } } @@ -1084,24 +1084,24 @@ void Scene2706::findClosestTrack(NPoint pt) { _newTrackIndex = minMatchTrackIndex; _newTrackDestX = pt.x; if (_currTrackIndex == 0) - sendMessage(_class521, 0x2003, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else - sendMessage(_class521, 0x2003, 0); + sendMessage(_asCar, 0x2003, 0); } else { _newTrackIndex = -1; - sendMessage(_class521, 0x2004, pt.x); + sendMessage(_asCar, 0x2004, pt.x); } } void Scene2706::changeTrack() { _currTrackIndex = _newTrackIndex; _trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName)); - _class521->setPathPoints(_trackPoints); + _asCar->setPathPoints(_trackPoints); if (_currTrackIndex == 0) - sendMessage(_class521, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); else - sendMessage(_class521, 0x2002, 0); - sendMessage(_class521, 0x2004, _newTrackDestX); + sendMessage(_asCar, 0x2002, 0); + sendMessage(_asCar, 0x2004, _newTrackDestX); _newTrackIndex = -1; } diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index 70c1a802bb..b2210c5d49 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -56,10 +56,10 @@ public: class Class517 : public AnimatedSprite { public: - Class517(NeverhoodEngine *vm, AnimatedSprite *class521, BaseSurface *shadowSurface, uint index); + Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index); protected: uint _index; - AnimatedSprite *_class521; + AnimatedSprite *_asCar; uint32 _animFileHash; void update(); void updateShadow(); @@ -67,18 +67,18 @@ protected: class Class519 : public AnimatedSprite { public: - Class519(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, uint index); + Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index); protected: uint _index; - Sprite *_class521; + Sprite *_asCar; void update(); }; class Class520 : public AnimatedSprite { public: - Class520(NeverhoodEngine *vm, Sprite *class521, BaseSurface *shadowSurface, int16 frameIndex); + Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex); protected: - Sprite *_class521; + Sprite *_asCar; void update(); }; @@ -86,12 +86,12 @@ class Scene2701 : public Scene { public: Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Class521 *_class521; + AsCommonCar *_asCar; Sprite *_class437; Sprite *_class517; Sprite *_class520; Sprite *_class519; - Sprite *_class518; + Sprite *_asCarConnector; Sprite *_sprite1; int _which1, _which2; NPointArray *_trackPoints; @@ -103,7 +103,7 @@ class Scene2702 : public Scene { public: Scene2702(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Class521 *_class521; + AsCommonCar *_asCar; Sprite *_class437; Sprite *_class517; Sprite *_class520; @@ -126,10 +126,10 @@ public: Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); protected: - Class521 *_class521; + AsCommonCar *_asCar; Sprite *_class437; Sprite *_class517; - Sprite *_class518; + Sprite *_asCarConnector; Sprite *_class520; Sprite *_class519; int _which1, _which2; @@ -143,10 +143,10 @@ class Scene2706 : public Scene { public: Scene2706(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Class521 *_class521; + AsCommonCar *_asCar; Sprite *_class437; Sprite *_class517; - Sprite *_class518; + Sprite *_asCarConnector; Sprite *_class520; Sprite *_class519; int16 _newTrackDestX; -- cgit v1.2.3 From 2fa76ccca14a50588f6c69e39c67f1cae187c9b3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 6 Oct 2012 20:13:01 +0000 Subject: NEVERHOOD: Work on Module1700: - Rename stuff - Add puzzle var initialization in Scene1705 --- engines/neverhood/gamemodule.cpp | 4 ++-- engines/neverhood/module1700.cpp | 33 ++++++++++++++++----------------- engines/neverhood/module1700.h | 12 ++++++------ engines/neverhood/module2800.cpp | 10 +++++----- engines/neverhood/module2800.h | 2 +- 5 files changed, 30 insertions(+), 31 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index df001c4cc0..edc9b5594f 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,8 +309,8 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 8; - createModule(1600, -1); + _vm->gameState().sceneNum = 4; + createModule(1700, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index f914fa9c5b..b75167fa4d 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/module1700.h" +#include "neverhood/gamemodule.h" namespace Neverhood { @@ -139,19 +140,19 @@ static const uint32 kScene1705FileHashes[] = { 0x910EA800 }; -Class602::Class602(NeverhoodEngine *vm, uint32 fileHash, int index) +SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex) : StaticSprite(vm, fileHash, 100) { - _x = _spriteResource.getPosition().x + index * 30; + _x = _spriteResource.getPosition().x + symbolIndex * 30; _y = _spriteResource.getPosition().y + 160; StaticSprite::update(); } -Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash) - : StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _index(index) { +SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash) + : StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _tapeIndex(tapeIndex) { - if (!getSubVar(0x02038314, _index) && !getSubVar(0x02720344, _index)) { - SetMessageHandler(&Class606::handleMessage); + if (!getSubVar(0x02038314, _tapeIndex) && !getSubVar(0x02720344, _tapeIndex)) { + SetMessageHandler(&SsScene1705Tape::handleMessage); } else { setVisible(false); SetMessageHandler(NULL); @@ -164,7 +165,7 @@ Class606::Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfa Sprite::processDelta(); } -uint32 Class606::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -172,7 +173,7 @@ uint32 Class606::handleMessage(int messageNum, const MessageParam ¶m, Entity messageResult = 1; break; case 0x4806: - setSubVar(0x02038314, _index, 1); + setSubVar(0x02038314, _tapeIndex, 1); setVisible(false); SetMessageHandler(NULL); break; @@ -186,7 +187,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; setGlobalVar(0xE7498218, 1); - // TODO _vm->initVarsScene1705(); + _vm->gameModule()->initScene3009Vars(); SetMessageHandler(&Scene1705::handleMessage); SetUpdateHandler(&Scene1705::update); @@ -204,16 +205,14 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x18222039); - insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0); - insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1); - insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2); + insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0); + insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1); + insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2); _sprite = insertStaticSprite(0x31313A22, 1100); - _class606 = insertSprite(this, 15, 1100, 238, 439, 0x02363852); - _vm->_collisionMan->addSprite(_class606); - - which = 4; + _ssTape = insertSprite(this, 15, 1100, 238, 439, 0x02363852); + _vm->_collisionMan->addSprite(_ssTape); if (which < 0) { insertKlayman(231, 434); @@ -275,7 +274,7 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4826: - if (sender == _class606 && _klayman->getX() <= 318) { + if (sender == _ssTape && _klayman->getX() <= 318) { sendEntityMessage(_klayman, 0x1014, sender); setMessageList(0x004B6AC0); } diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h index 2488c46e49..c0ec9e5123 100644 --- a/engines/neverhood/module1700.h +++ b/engines/neverhood/module1700.h @@ -41,17 +41,17 @@ protected: // Scene1705 -class Class602 : public StaticSprite { +class SsScene1705WallSymbol : public StaticSprite { public: - Class602(NeverhoodEngine *vm, uint32 fileHash, int index); + SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex); }; -class Class606 : public StaticSprite { +class SsScene1705Tape : public StaticSprite { public: - Class606(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y, uint32 fileHash); + SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash); protected: Scene *_parentScene; - int _index; + uint32 _tapeIndex; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -60,7 +60,7 @@ public: Scene1705(NeverhoodEngine *vm, Module *parentModule, int which); protected: Sprite *_sprite; - Sprite *_class606; + Sprite *_ssTape; int _paletteArea; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 7a35ddda23..203854878a 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -422,7 +422,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x061601C8, 1100); _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); insertMouse433(0x00680116); - _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); _vm->_collisionMan->addSprite(_asTape); } else { setRectList(0x004B6CF0); @@ -2991,8 +2991,8 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_class545); } - _class606 = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); - _vm->_collisionMan->addSprite(_class606); + _ssTape = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); + _vm->_collisionMan->addSprite(_ssTape); _asWinch = insertSprite(); _asTrapDoor = insertSprite(); @@ -3068,8 +3068,8 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asTrapDoor, 0x2000, 0); break; case 0x4826: - if (sender == _class606 && !_flag1) { - sendEntityMessage(_klayman, 0x1014, _class606); + if (sender == _ssTape && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _ssTape); setMessageList(0x004AF658); } else if (sender == _class545 && !_flag1) { sendEntityMessage(_klayman, 0x1014, _class545); diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index b5827bff50..1027a6fa6b 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -461,7 +461,7 @@ protected: Sprite *_sprite3; Sprite *_sprite2; Sprite *_sprite4; - Sprite *_class606; + Sprite *_ssTape; Sprite *_class545; Sprite *_sprite1; bool _flag1; -- cgit v1.2.3 From 8a9ca493b63cbb81b968fc3db57a957e677846ba Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 6 Oct 2012 20:33:22 +0000 Subject: NEVERHOOD: Rename stuff in several modules --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/module1400.cpp | 8 ++-- engines/neverhood/module1400.h | 2 +- engines/neverhood/module1800.cpp | 1 + engines/neverhood/module1900.cpp | 7 +-- engines/neverhood/module1900.h | 2 +- engines/neverhood/module2000.cpp | 6 ++- engines/neverhood/module2000.h | 1 - engines/neverhood/module2100.cpp | 92 ++++++++++++++++++++-------------------- engines/neverhood/module2100.h | 27 ++++++------ engines/neverhood/module2400.cpp | 2 +- 11 files changed, 76 insertions(+), 76 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index edc9b5594f..d1321056f4 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,8 +309,8 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 4; - createModule(1700, -1); + _vm->gameState().sceneNum = 0; + createModule(2100, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 88b576ac39..e5c25ca5ec 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -645,7 +645,7 @@ void AsCommonProjector::stStartSuckedIn() { } Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _projectorBorderFlag(false), _class427(NULL), _asProjector(NULL), + : Scene(vm, parentModule, true), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), _asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { @@ -658,7 +658,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x08221FA5); insertMouse433(0x21FA108A); - _class427 = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); + _ssFloorButton = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); _asPipe = insertSprite(); if (!getGlobalVar(0x01023818)) { @@ -733,7 +733,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02144CB1) { - sendEntityMessage(_klayman, 0x1014, _class427); + sendEntityMessage(_klayman, 0x1014, _ssFloorButton); } else if (param.asInteger() == 0x402064D8) { sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x01C66840) { @@ -752,7 +752,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480B: - if (sender == _class427) { + if (sender == _ssFloorButton) { sendMessage(_asPipe, 0x2000, 0); if (!getGlobalVar(0x01023818)) { sendMessage(_asMouse, 0x4839, 0); diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 8cabc99002..437632dd8f 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -131,7 +131,7 @@ public: Scene1401(NeverhoodEngine *vm, Module *parentModule, int which); protected: bool _projectorBorderFlag; - Sprite *_class427; + Sprite *_ssFloorButton; AsCommonProjector *_asProjector; Sprite *_asPipe; Sprite *_asMouse; diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 14c48681fe..43355955d5 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -156,6 +156,7 @@ void Module1800::updateScene() { leaveModule(3); break; case 8: + // NOTE: After Klayman jumped into the hole and died... leaveModule(1); // TODO GameState stuff break; diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 77f031b19b..5bb03d4aa1 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -533,7 +533,7 @@ void AsScene1907WaterHint::update() { AnimatedSprite::updatePosition(); } -uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -546,7 +546,7 @@ uint32 AsScene1907WaterHint::handleMessage46BA20(int messageNum, const MessagePa void AsScene1907WaterHint::show() { setVisible(true); startAnimation(0x110A1061, 0, -1); - SetMessageHandler(&AsScene1907WaterHint::handleMessage46BA20); + SetMessageHandler(&AsScene1907WaterHint::hmShowing); NextState(&AsScene1907WaterHint::hide); } @@ -561,9 +561,6 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { _surfaceFlag = true; - - //setGlobalVar(0x10938830, 1); - setBackground(0x20628E05); setPalette(0x20628E05); diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h index 386d1c9fdb..5f26c9e7ae 100644 --- a/engines/neverhood/module1900.h +++ b/engines/neverhood/module1900.h @@ -98,7 +98,7 @@ public: void show(); protected: void update(); - uint32 handleMessage46BA20(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmShowing(int messageNum, const MessageParam ¶m, Entity *sender); void hide(); }; diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index d1d6b82577..6ff8a405c3 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -98,6 +98,8 @@ void Module2000::updateScene() { Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { + Sprite *tempSprite; + _surfaceFlag = true; SetMessageHandler(&Scene2001::handleMessage); @@ -105,7 +107,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0xA6417244); insertMouse433(0x17240A6C); - _class401 = insertStaticSprite(0x0D641724, 1100); + tempSprite = insertStaticSprite(0x0D641724, 1100); if (which < 0) { insertKlayman(300, 345); @@ -133,7 +135,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setDoDeltaX(1); } - _klayman->setClipRect(_class401->getDrawRect().x, 0, 640, 480); + _klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); } diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h index 8e741b357e..8533092b2c 100644 --- a/engines/neverhood/module2000.h +++ b/engines/neverhood/module2000.h @@ -46,7 +46,6 @@ class Scene2001 : public Scene { public: Scene2001(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_class401; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 98b6e03cd4..06806c7ca1 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -77,7 +77,7 @@ void Module2100::updateScene() { // Scene2101 -Class538::Class538(NeverhoodEngine *vm, bool flag) +AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag) : AnimatedSprite(vm, 1100) { // TODO createSurface3(100, dword_4B9018); @@ -85,7 +85,7 @@ Class538::Class538(NeverhoodEngine *vm, bool flag) _x = 320; _y = 240; SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class538::handleMessage); + SetMessageHandler(&AsScene2101Door::handleMessage); if (flag) { startAnimation(0x0C202B9C, -1, -1); _newStickFrameIndex = -2; @@ -94,52 +94,52 @@ Class538::Class538(NeverhoodEngine *vm, bool flag) } } -uint32 Class538::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: gotoNextState(); break; case 0x4808: - openDoor(); + stOpenDoor(); break; case 0x4809: - closeDoor(); + stCloseDoor(); break; } return messageResult; } -void Class538::openDoor() { +void AsScene2101Door::stOpenDoor() { startAnimation(0x0C202B9C, 0, -1); _newStickFrameIndex = -2; setVisible(true); playSound(0, calcHash("fxDoorOpen32")); } -void Class538::closeDoor() { +void AsScene2101Door::stCloseDoor() { startAnimation(0xC222A8D4, 0, -1); _newStickFrameIndex = -2; setVisible(true); - NextState(&Class538::hide); + NextState(&AsScene2101Door::stCloseDoorDone); playSound(0, calcHash("fxDoorClose32")); } -void Class538::hide() { +void AsScene2101Door::stCloseDoorDone() { stopAnimation(); setVisible(false); } -Class539::Class539(NeverhoodEngine *vm, Sprite *klayman) +AsScene2101HitByDoorEffect::AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klayman) : AnimatedSprite(vm, 1400), _klayman(klayman) { SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class539::handleMessage); + SetMessageHandler(&AsScene2101HitByDoorEffect::handleMessage); createSurface(1200, 88, 165); setVisible(false); } -uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2101HitByDoorEffect::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2001: @@ -156,12 +156,12 @@ uint32 Class539::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) +SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) : StaticSprite(vm, 1100), _parentScene(parentScene), _countdown(0), _fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) { - SetUpdateHandler(&Class427::update); - SetMessageHandler(&Class427::handleMessage); + SetUpdateHandler(&SsCommonFloorButton::update); + SetMessageHandler(&SsCommonFloorButton::handleMessage); if (_soundFileHash == 0) _soundFileHash = 0x44141000; createSurface(1010, 61, 30); @@ -172,7 +172,7 @@ Class427::Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, ui setVisible(false); } -void Class427::update() { +void SsCommonFloorButton::update() { if (_countdown != 0 && (--_countdown == 0)) { sendMessage(_parentScene, 0x1022, 1010); if (_fileHash1) { @@ -183,7 +183,7 @@ void Class427::update() { } } -uint32 Class427::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x480B: @@ -202,6 +202,8 @@ uint32 Class427::handleMessage(int messageNum, const MessageParam ¶m, Entity Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { + Sprite *tempSprite; + _surfaceFlag = true; SetMessageHandler(&Scene2101::handleMessage); SetUpdateHandler(&Scene2101::update); @@ -211,8 +213,8 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x4230144A); insertStaticSprite(0x00502330, 1100); - _sprite1 = insertStaticSprite(0x78492010, 1100); - _class427 = insertSprite(this, 0x72427010, 0x32423010, 200, 0); + tempSprite = insertStaticSprite(0x78492010, 1100); + _ssFloorButton = insertSprite(this, 0x72427010, 0x32423010, 200, 0); _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); _vm->_collisionMan->addSprite(_asTape1); _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); @@ -222,71 +224,71 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(380, 438); setMessageList(0x004B8E48); sendMessage(this, 0x2000, 0); - _class538 = insertSprite(false); - _value1 = 1; + _asDoor = insertSprite(false); + _doorStatus = 1; _countdown1 = 0; } else if (which == 1) { insertKlayman(640, 438); setMessageList(0x004B8E50); sendMessage(this, 0x2000, 0); - _class538 = insertSprite(true); - _value1 = 2; + _asDoor = insertSprite(true); + _doorStatus = 2; _countdown1 = 48; } else if (which == 2) { insertKlayman(115, 438); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B8F58); sendMessage(this, 0x2000, 1); - _class538 = insertSprite(false); - _value1 = 1; + _asDoor = insertSprite(false); + _doorStatus = 1; _countdown1 = 0; } else if (which == 3) { insertKlayman(115, 438); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B8EB0); sendMessage(this, 0x2000, 1); - _class538 = insertSprite(false); - _value1 = 1; + _asDoor = insertSprite(false); + _doorStatus = 1; _countdown1 = 0; } else { insertKlayman(115, 438); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B8EA0); sendMessage(this, 0x2000, 1); - _class538 = insertSprite(false); - _value1 = 1; + _asDoor = insertSprite(false); + _doorStatus = 1; _countdown1 = 0; } - _class539 = insertSprite(_klayman); - _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); + _asHitByDoorEffect = insertSprite(_klayman); + _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); } void Scene2101::update() { if (_countdown1 != 0) { - if (_value1 == 2) { + if (_doorStatus == 2) { if (--_countdown1 == 0) { - sendMessage(_class538, 0x4809, 0); - _value1 = 1; + sendMessage(_asDoor, 0x4809, 0); + _doorStatus = 1; } } else { if (_klayman->getX() > 575) _messageListFlag = false; if (--_countdown1 == 0) { if (_klayman->getX() < 480) { - sendMessage(_class538, 0x4809, 0); - _value1 = 1; + sendMessage(_asDoor, 0x4809, 0); + _doorStatus = 1; } else if (_klayman->getX() >= 480 && _klayman->getX() <= 575) { _klayman->setDoDeltaX(0); setMessageList2(0x004B8F48); - sendMessage(_class538, 0x4809, 0); - sendMessage(_class539, 0x2001, 0); - _value1 = 1; + sendMessage(_asDoor, 0x4809, 0); + sendMessage(_asHitByDoorEffect, 0x2001, 0); + _doorStatus = 1; } } } - } else if (_value1 == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) { + } else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) { setMessageList2(0x004B8F50); } Scene::update(); @@ -297,9 +299,9 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02144CB1) { - sendEntityMessage(_klayman, 0x1014, _class427); + sendEntityMessage(_klayman, 0x1014, _ssFloorButton); } else if (param.asInteger() == 0x21E64A00) { - if (_value1 == 0) { + if (_doorStatus == 0) { setMessageList(0x004B8E80); } else { setMessageList(0x004B8EC8); @@ -318,9 +320,9 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480B: - if (sender == _class427 && _value1 == 1) { - sendMessage(_class538, 0x4808, 0); - _value1 = 0; + if (sender == _ssFloorButton && _doorStatus == 1) { + sendMessage(_asDoor, 0x4808, 0); + _doorStatus = 0; _countdown1 = 90; } break; diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h index ff6898c7b0..4690913cb3 100644 --- a/engines/neverhood/module2100.h +++ b/engines/neverhood/module2100.h @@ -41,27 +41,27 @@ protected: // Scene1901 -class Class538 : public AnimatedSprite { +class AsScene2101Door : public AnimatedSprite { public: - Class538(NeverhoodEngine *vm, bool flag); + AsScene2101Door(NeverhoodEngine *vm, bool flag); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void openDoor(); - void closeDoor(); - void hide(); + void stOpenDoor(); + void stCloseDoor(); + void stCloseDoorDone(); }; -class Class539 : public AnimatedSprite { +class AsScene2101HitByDoorEffect : public AnimatedSprite { public: - Class539(NeverhoodEngine *vm, Sprite *klayman); + AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klayman); protected: Sprite *_klayman; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class427 : public StaticSprite { +class SsCommonFloorButton : public StaticSprite { public: - Class427(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); + SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); protected: Scene *_parentScene; uint32 _soundFileHash; @@ -76,14 +76,13 @@ class Scene2101 : public Scene { public: Scene2101(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_sprite1; - Sprite *_class427; + Sprite *_ssFloorButton; Sprite *_asTape1; Sprite *_asTape2; - Sprite *_class538; - Sprite *_class539; + Sprite *_asDoor; + Sprite *_asHitByDoorEffect; int _countdown1; - int _value1; + int _doorStatus; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 5dcfa8dd55..e2973ecc8a 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -409,7 +409,7 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) _asFlowingWater = insertSprite(); insertStaticSprite(0x90C0A4B4, 200); _ssButton = insertSprite(this, 0x0092916A, 100, 0); - _ssFloorButton = insertSprite(this, 0x28001120, 0x00911068, 100, 0); + _ssFloorButton = insertSprite(this, 0x28001120, 0x00911068, 100, 0); for (uint i = 0; i < 5; i++) _asWaterFlushing[i] = insertSprite(kScene2401Points[i].x, kScene2401Points[i].y); -- cgit v1.2.3 From 15cfb9f787d577c130beb4d0fc486acd5f6af355 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 6 Oct 2012 21:15:18 +0000 Subject: NEVERHOOD: Implement clipping against multiple clipRects, used only in several scenes for the Klayman sprite. Currently only implemented in KmScene2201 for testing. --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/graphics.cpp | 7 +++++-- engines/neverhood/graphics.h | 4 ++++ engines/neverhood/klayman.cpp | 5 +++-- engines/neverhood/module2200.cpp | 26 +++++++++++++------------- engines/neverhood/module2200.h | 3 +-- engines/neverhood/screen.cpp | 6 ++++++ engines/neverhood/screen.h | 1 + 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d1321056f4..174edd305d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -310,7 +310,7 @@ void GameModule::startup() { #if 1 _vm->gameState().sceneNum = 0; - createModule(2100, -1); + createModule(2200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index b1597f2d5e..84aa3d67da 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -27,7 +27,8 @@ namespace Neverhood { BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height) - : _vm(vm), _priority(priority), _visible(true), _transparent(true) { + : _vm(vm), _priority(priority), _visible(true), _transparent(true), + _clipRects(NULL), _clipRectsCount(0) { _drawRect.x = 0; _drawRect.y = 0; @@ -52,7 +53,9 @@ BaseSurface::~BaseSurface() { void BaseSurface::draw() { if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { - if (_sysRect.x == 0 && _sysRect.y == 0) { + if (_clipRects && _clipRectsCount) { + _vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent); + } else if (_sysRect.x == 0 && _sysRect.y == 0) { _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent); } else { _vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent); diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 3b30b25338..57c22509f8 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -101,6 +101,8 @@ public: NDrawRect& getSysRect() { return _sysRect; } NRect& getClipRect() { return _clipRect; } void setClipRect(NRect clipRect) { _clipRect = clipRect; } + void setClipRects(NRect *clipRects, uint clipRectsCount) { _clipRects = clipRects; _clipRectsCount = clipRectsCount; } + void clearClipRects() { _clipRects = NULL; _clipRectsCount = 0; } bool getVisible() const { return _visible; } void setVisible(bool value) { _visible = value; } void setTransparent(bool value) { _transparent = value; } @@ -113,6 +115,8 @@ protected: NDrawRect _drawRect; NDrawRect _sysRect; NRect _clipRect; + NRect *_clipRects; + uint _clipRectsCount; bool _transparent; }; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 93cc49e305..82c6114d5d 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -4636,9 +4636,10 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - // TODO: NRect *rect1, int16 unk in Klayman ctor : Klayman(vm, parentScene, x, y, 1000, 1000) { + _surface->setClipRects(clipRects, clipRectsCount); + _dataResource.load(0x04104242); _flagF6 = false; } @@ -4831,7 +4832,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - _walkResumeFrameIncr = 1; + _walkResumeFrameIncr = 1; _vm->_soundMan->addSound(0x80101800, 0xD3B02847); } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 4460314d5e..d7991c2bd7 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -526,49 +526,49 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) } } - _rect1.y1 = 0; - _rect1.x2 = 640; - _rect2.x2 = 640; - _rect2.y2 = 480; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = 640; + _clipRects[1].x2 = 640; + _clipRects[1].y2 = 480; if (!getGlobalVar(0x404290D5)) { insertStaticSprite(0x00026027, 900); } tempSprite = insertStaticSprite(0x030326A0, 1100); - _rect1.x1 = tempSprite->getDrawRect().x; + _clipRects[0].x1 = tempSprite->getDrawRect().x; insertStaticSprite(0x811DA061, 1100); tempSprite = insertStaticSprite(0x11180022, 1100); - _rect2.x1 = tempSprite->getDrawRect().x; + _clipRects[1].x1 = tempSprite->getDrawRect().x; tempSprite = insertStaticSprite(0x0D411130, 1100); - _rect1.y2 = tempSprite->getDrawRect().y2(); - _rect2.y1 = tempSprite->getDrawRect().y2(); + _clipRects[0].y2 = tempSprite->getDrawRect().y2(); + _clipRects[1].y1 = tempSprite->getDrawRect().y2(); _doorLightSprite = insertStaticSprite(0xA4062212, 900); if (which < 0) { - insertKlayman(300, 427, &_rect1, 2); + insertKlayman(300, 427, _clipRects, 2); setMessageList(0x004B8118); _asDoor = insertSprite(_klayman, _doorLightSprite, false); } else if (which == 1) { - insertKlayman(412, 393, &_rect1, 2); + insertKlayman(412, 393, _clipRects, 2); setMessageList(0x004B8130); _asDoor = insertSprite(_klayman, _doorLightSprite, false); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { - insertKlayman(379, 427, &_rect1, 2); + insertKlayman(379, 427, _clipRects, 2); _klayman->setDoDeltaX(1); } else { - insertKlayman(261, 427, &_rect1, 2); + insertKlayman(261, 427, _clipRects, 2); } setMessageList(0x004B8178); _asDoor = insertSprite(_klayman, _doorLightSprite, false); } else { NPoint pt = _dataResource.getPoint(0x0304D8DC); - insertKlayman(pt.x, pt.y, &_rect1, 2); + insertKlayman(pt.x, pt.y, _clipRects, 2); setMessageList(0x004B8120); _asDoor = insertSprite(_klayman, _doorLightSprite, true); } diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 53b94695d8..e869e4c89c 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -96,8 +96,7 @@ public: Scene2201(NeverhoodEngine *vm, Module *parentModule, int which); ~Scene2201(); protected: - NRect _rect1; - NRect _rect2; + NRect _clipRects[2]; Sprite *_doorLightSprite; Sprite *_asDoor; Sprite *_ssDoorButton; diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index dfc5358c5b..372c705b3e 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -299,4 +299,10 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra } +void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent) { + NDrawRect clipDrawRect(0, 0, drawRect.width, drawRect.height); + for (uint i = 0; i < clipRectsCount; i++) + drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 07be04cf32..fe5a2546c0 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -50,6 +50,7 @@ public: const Graphics::Surface *shadowSurface = NULL); void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent); + void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent); protected: NeverhoodEngine *_vm; Graphics::Surface *_backScreen; -- cgit v1.2.3 From 9b7bb71dd952c85fea54d6526d9b2aaa1bd0498f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 07:40:39 +0000 Subject: NEVERHOOD: Simplify code and rename things - Add Module::createStaticScene to simplify creation of static scenes (and use it in the relevant places) - Rename Class545 to AsCommonKey and rename related variables - Rename stuff in Module2200 --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module.cpp | 5 + engines/neverhood/module.h | 1 + engines/neverhood/module1000.cpp | 2 +- engines/neverhood/module1300.cpp | 20 +- engines/neverhood/module1300.h | 4 +- engines/neverhood/module1400.cpp | 10 +- engines/neverhood/module1400.h | 2 +- engines/neverhood/module1600.cpp | 10 +- engines/neverhood/module1600.h | 2 +- engines/neverhood/module2200.cpp | 386 ++++++++++++++++++--------------------- engines/neverhood/module2200.h | 87 ++++----- engines/neverhood/module2400.cpp | 14 +- engines/neverhood/module2400.h | 4 +- engines/neverhood/module2500.cpp | 4 +- engines/neverhood/module2700.cpp | 2 +- engines/neverhood/module2800.cpp | 38 ++-- engines/neverhood/module2800.h | 2 +- 18 files changed, 282 insertions(+), 313 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 174edd305d..ef1b09320a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,7 +309,7 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 0; + _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif #if 0 diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 5be9a6321f..1cd6c0d0b1 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -23,6 +23,7 @@ #include "neverhood/module.h" #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" +#include "neverhood/module1000.h" namespace Neverhood { @@ -93,6 +94,10 @@ void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, _childObject = smackerScene; } +void Module::createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash) { + _childObject = new StaticScene(_vm, this, backgroundFileHash, cursorFileHash); +} + bool Module::updateChild() { if (_childObject) { _childObject->handleUpdate(); diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 57a42c623b..bb01218364 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -61,6 +61,7 @@ protected: void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort); + void createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash); bool updateChild(); void leaveModule(uint32 result); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index dce4b8cfac..878a0e7ef7 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -62,7 +62,7 @@ void Module1000::createScene(int sceneNum, int which) { break; case 2: _vm->_soundMan->startMusic(0x061880C6, 0, 0); - _childObject = new StaticScene(_vm, this, 0xC084110C, 0x41108C00); + createStaticScene(0xC084110C, 0x41108C00); break; case 3: _vm->_soundMan->stopMusic(0x061880C6, 0, 2); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 35132b6dca..80a210bc3a 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -704,11 +704,11 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xC021006A); if (getGlobalVar(0xAC00C0D0)) { - _class545 = insertSprite(this, 0, 1100, 278, 347); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 0, 1100, 278, 347); + _vm->_collisionMan->addSprite(_asKey); } else { - _class545 = insertSprite(0x80106018, 100, 279, 48); - // TODO _class545->setUpdateDeltaXY(); + _asKey = insertSprite(0x80106018, 100, 279, 48); + // TODO _asKey->setUpdateDeltaXY(); } if (!getGlobalVar(0x31C63C51)) { @@ -750,8 +750,8 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _asNeedle) { sendEntityMessage(_klayman, 0x1014, _asNeedle); setMessageList(0x004B9130); - } else if (sender == _class545) { - sendEntityMessage(_klayman, 0x1014, _class545); + } else if (sender == _asKey) { + sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004B9140); } break; @@ -885,8 +885,8 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x0311005B); if (!getGlobalVar(0x13382860)) { - _class545 = insertSprite(this, 2, 1100, 435, 445); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 2, 1100, 435, 445); + _vm->_collisionMan->addSprite(_asKey); } _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); @@ -991,9 +991,9 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4826: - if (sender == _class545) { + if (sender == _asKey) { if (_klayman->getX() >= 249) { - sendEntityMessage(_klayman, 0x1014, _class545); + sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004AFC58); } } else if (sender == _asTape) { diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index b458602901..e01daf1f15 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -115,7 +115,7 @@ public: Scene1304(NeverhoodEngine *vm, Module *parentModule, int which); protected: Sprite *_sprite1; - Sprite *_class545; + Sprite *_asKey; Sprite *_asNeedle; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -155,7 +155,7 @@ protected: AnimatedSprite *_asElevatorDoor; Sprite *_asElevator; Sprite *_sprite1; - Sprite *_class545; + Sprite *_asKey; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index e5c25ca5ec..d31f3decad 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1423,7 +1423,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1404 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asProjector(NULL), _class545(NULL) { + : Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) { if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) { setGlobalVar(0x13382860, 5); @@ -1440,8 +1440,8 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xB006BAC8); if (getGlobalVar(0x13382860) == 5) { - _class545 = insertSprite(this, 2, 1100, 267, 411); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 2, 1100, 267, 411); + _vm->_collisionMan->addSprite(_asKey); } _sprite1 = insertStaticSprite(0x1900A1F8, 1100); @@ -1514,8 +1514,8 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (sender == _asTape && _messageListStatus != 2) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B8CD0); - } else if (sender == _class545 && _messageListStatus != 2) { - sendEntityMessage(_klayman, 0x1014, _class545); + } else if (sender == _asKey && _messageListStatus != 2) { + sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004B8D18); } break; diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 437632dd8f..8f5a4c9a63 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -238,7 +238,7 @@ protected: Sprite *_sprite1; Sprite *_asTape; AsCommonProjector *_asProjector; - Sprite *_class545; + Sprite *_asKey; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 92c566e485..d324130a53 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1073,8 +1073,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; SetMessageHandler(&Scene1608::hmLowerFloor); - _class545 = insertSprite(this, 1, 1100, 198, 220); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 1, 1100, 198, 220); + _vm->_collisionMan->addSprite(_asKey); if (which < 0) { if (_vm->gameState().which == 1) @@ -1317,7 +1317,7 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity if (sender == _asTape) { sendEntityMessage(_kmScene1608, 0x1014, _asTape); setMessageList(0x004B4770); - } else if (sender == _class545) { + } else if (sender == _asKey) { setMessageList(0x004B46C8); } break; @@ -1337,8 +1337,8 @@ uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam ¶m, Entity sendMessage(_parentModule, 0x200D, 0); break; case 0x4826: - if (sender == _class545) { - sendEntityMessage(_kmScene1608, 0x1014, _class545); + if (sender == _asKey) { + sendEntityMessage(_kmScene1608, 0x1014, _asKey); setMessageList(0x004B4760); } break; diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index ec31b68a0f..3d6e831562 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -141,7 +141,7 @@ public: ~Scene1608(); protected: AsCommonCar *_asCar; - Sprite *_class545; + Sprite *_asKey; Sprite *_asDoor; Sprite *_asIdleCarLower; Sprite *_asIdleCarFull; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index d7991c2bd7..2220fb7729 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -86,115 +86,115 @@ void Module2200::createScene(int sceneNum, int which) { _childObject = new Scene2208(_vm, this, which); break; case 9: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7180); + createHallOfRecordsScene(which, 0x004B7180); break; case 10: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7198); + createHallOfRecordsScene(which, 0x004B7198); break; case 11: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71B0); + createHallOfRecordsScene(which, 0x004B71B0); break; case 12: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71C8); + createHallOfRecordsScene(which, 0x004B71C8); break; case 13: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71E0); + createHallOfRecordsScene(which, 0x004B71E0); break; case 14: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B71F8); + createHallOfRecordsScene(which, 0x004B71F8); break; case 15: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7210); + createHallOfRecordsScene(which, 0x004B7210); break; case 16: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7228); + createHallOfRecordsScene(which, 0x004B7228); break; case 17: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7240); + createHallOfRecordsScene(which, 0x004B7240); break; case 18: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7258); + createHallOfRecordsScene(which, 0x004B7258); break; case 19: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7270); + createHallOfRecordsScene(which, 0x004B7270); break; case 20: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7288); + createHallOfRecordsScene(which, 0x004B7288); break; case 21: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72A0); + createHallOfRecordsScene(which, 0x004B72A0); break; case 22: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72B8); + createHallOfRecordsScene(which, 0x004B72B8); break; case 23: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72D0); + createHallOfRecordsScene(which, 0x004B72D0); break; case 24: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B72E8); + createHallOfRecordsScene(which, 0x004B72E8); break; case 25: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7300); + createHallOfRecordsScene(which, 0x004B7300); break; case 26: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7318); + createHallOfRecordsScene(which, 0x004B7318); break; case 27: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7330); + createHallOfRecordsScene(which, 0x004B7330); break; case 28: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7348); + createHallOfRecordsScene(which, 0x004B7348); break; case 29: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7360); + createHallOfRecordsScene(which, 0x004B7360); break; case 30: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7378); + createHallOfRecordsScene(which, 0x004B7378); break; case 31: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7390); + createHallOfRecordsScene(which, 0x004B7390); break; case 32: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73A8); + createHallOfRecordsScene(which, 0x004B73A8); break; case 33: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73C0); + createHallOfRecordsScene(which, 0x004B73C0); break; case 34: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73D8); + createHallOfRecordsScene(which, 0x004B73D8); break; case 35: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B73F0); + createHallOfRecordsScene(which, 0x004B73F0); break; case 36: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7408); + createHallOfRecordsScene(which, 0x004B7408); break; case 37: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7420); + createHallOfRecordsScene(which, 0x004B7420); break; case 38: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7438); + createHallOfRecordsScene(which, 0x004B7438); break; case 39: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7450); + createHallOfRecordsScene(which, 0x004B7450); break; case 40: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7468); + createHallOfRecordsScene(which, 0x004B7468); break; case 41: _childObject = new Scene2242(_vm, this, which); break; case 42: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7480); + createHallOfRecordsScene(which, 0x004B7480); break; case 43: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B7498); + createHallOfRecordsScene(which, 0x004B7498); break; case 44: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74B0); + createHallOfRecordsScene(which, 0x004B74B0); break; case 45: - _childObject = new HallOfRecordsScene(_vm, this, which, 0x004B74C8); + createHallOfRecordsScene(which, 0x004B74C8); break; case 46: _childObject = new Scene2247(_vm, this, which); @@ -202,14 +202,14 @@ void Module2200::createScene(int sceneNum, int which) { case 47: if (!getGlobalVar(0x98109F12)) { if (getGlobalVar(0x4D080E54)) - _childObject = new StaticScene(_vm, this, 0x83110287, 0x10283839); + createStaticScene(0x83110287, 0x10283839); else - _childObject = new StaticScene(_vm, this, 0x83412B9D, 0x12B9983C); + createStaticScene(0x83412B9D, 0x12B9983C); } else { if (getGlobalVar(0x4D080E54)) - _childObject = new StaticScene(_vm, this, 0x48632087, 0x3208348E); + createStaticScene(0x48632087, 0x3208348E); else - _childObject = new StaticScene(_vm, this, 0x08C74886, 0x74882084); + createStaticScene(0x08C74886, 0x74882084); } break; } @@ -399,6 +399,10 @@ void Module2200::updateScene() { #undef HallOfRecordsSceneLink +void Module2200::createHallOfRecordsScene(int which, uint32 sceneInfo140Id) { + _childObject = new HallOfRecordsScene(_vm, this, which, sceneInfo140Id); +} + // Scene2201 AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) @@ -411,8 +415,8 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) SetUpdateHandler(&AnimatedSprite::update); } -AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1) - : AnimatedSprite(vm, 1100), _klayman(klayman), _doorLightSprite(doorLightSprite), _countdown(0), _doorOpen(flag1) { +AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1) + : AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _doorOpen(flag1) { _x = 408; _y = 290; @@ -426,7 +430,7 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite * } else { startAnimation(0xE2CB0412, 0, -1); _newStickFrameIndex = 0; - _doorLightSprite->setVisible(false); + _ssDoorLight->setVisible(false); } } @@ -443,10 +447,10 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, case 0x100D: if (param.asInteger() == 0x11001090) { if (_doorOpen) - _doorLightSprite->setVisible(true); + _ssDoorLight->setVisible(true); } else if (param.asInteger() == 0x11283090) { if (!_doorOpen) - _doorLightSprite->setVisible(false); + _ssDoorLight->setVisible(false); } break; case 0x2000: @@ -481,22 +485,22 @@ void AsScene2201Door::stCloseDoor() { playSound(0, calcHash("fxDoorClose33")); } -Class444::Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex) +SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex) : StaticSprite(vm, 900) { - _spriteResource.load2(kClass444FileHashes[spriteIndex]); + _spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]); createSurface(100, 16, 16); _drawRect.x = -(_spriteResource.getDimensions().width / 2); _drawRect.y = -(_spriteResource.getDimensions().height / 2); _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; - _x = kClass444Points[pointIndex].x; - _y = kClass444Points[pointIndex].y; + _x = kSsScene2201PuzzleCubePoints[positionIndex].x; + _y = kSsScene2201PuzzleCubePoints[positionIndex].y; _needRefresh = true; } Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _soundFlag(false) { + : Scene(vm, parentModule, true), _isSoundPlaying(false) { Sprite *tempSprite; @@ -520,11 +524,9 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); - for (uint32 i = 0; i < 9; i++) { - if ((int16)getSubVar(0x484498D0, i) >= 0) { - insertSprite(i, (int16)getSubVar(0x484498D0, i)); - } - } + for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) + if ((int16)getSubVar(0x484498D0, cubeIndex) >= 0) + insertSprite(cubeIndex, (int16)getSubVar(0x484498D0, cubeIndex)); _clipRects[0].y1 = 0; _clipRects[0].x2 = 640; @@ -547,16 +549,16 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[0].y2 = tempSprite->getDrawRect().y2(); _clipRects[1].y1 = tempSprite->getDrawRect().y2(); - _doorLightSprite = insertStaticSprite(0xA4062212, 900); + _ssDoorLight = insertStaticSprite(0xA4062212, 900); if (which < 0) { insertKlayman(300, 427, _clipRects, 2); setMessageList(0x004B8118); - _asDoor = insertSprite(_klayman, _doorLightSprite, false); + _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else if (which == 1) { insertKlayman(412, 393, _clipRects, 2); setMessageList(0x004B8130); - _asDoor = insertSprite(_klayman, _doorLightSprite, false); + _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else if (which == 2) { if (getGlobalVar(0xC0418A02)) { insertKlayman(379, 427, _clipRects, 2); @@ -565,12 +567,12 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(261, 427, _clipRects, 2); } setMessageList(0x004B8178); - _asDoor = insertSprite(_klayman, _doorLightSprite, false); + _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else { NPoint pt = _dataResource.getPoint(0x0304D8DC); insertKlayman(pt.x, pt.y, _clipRects, 2); setMessageList(0x004B8120); - _asDoor = insertSprite(_klayman, _doorLightSprite, true); + _asDoor = insertSprite(_klayman, _ssDoorLight, true); } insertSprite(); @@ -586,9 +588,9 @@ Scene2201::~Scene2201() { void Scene2201::update() { Scene::update(); - if (!_soundFlag) { + if (!_isSoundPlaying) { _vm->_soundMan->playSoundLooping(0x81212040); - _soundFlag = true; + _isSoundPlaying = true; } } @@ -884,7 +886,7 @@ void SsScene2202PuzzleTile::stopMoving() { Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isTileMoving(false), - _movingTileSprite(NULL), _doneMovingTileSprite(NULL) { + _ssMovingTile(NULL), _ssDoneMovingTile(NULL) { // TODO initScene2201Vars(); SetMessageHandler(&Scene2202::handleMessage); @@ -897,9 +899,10 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); insertMouse435(0x00A08089, 20, 620); - //DEBUG! + //DEBUG>>> for (uint32 index = 0; index < 9; index++) setSubVar(0x484498D0, index, 7 - index); + //DEBUG<<< for (uint32 index = 0; index < 9; index++) { int16 value = (int16)getSubVar(0x484498D0, index); @@ -938,19 +941,19 @@ void Scene2202::update() { _leaveScene = true; } - if (_movingTileSprite && !_isTileMoving) { - int16 value = getFreeTileIndex(_movingTileIndex); - if (value != -1) { - setSurfacePriority(_movingTileSprite->getSurface(), 700); - sendMessage(_movingTileSprite, 0x2001, value); - _movingTileSprite = NULL; + if (_ssMovingTile && !_isTileMoving) { + int16 freeTileIndex = getFreeTileIndex(_movingTileIndex); + if (freeTileIndex != -1) { + setSurfacePriority(_ssMovingTile->getSurface(), 700); + sendMessage(_ssMovingTile, 0x2001, freeTileIndex); + _ssMovingTile = NULL; _isTileMoving = true; } } - if (_doneMovingTileSprite) { - setSurfacePriority(_doneMovingTileSprite->getSurface(), _surfacePriority); - _doneMovingTileSprite = NULL; + if (_ssDoneMovingTile) { + setSurfacePriority(_ssDoneMovingTile->getSurface(), _surfacePriority); + _ssDoneMovingTile = NULL; if (testIsSolved()) { playSound(0); setGlobalVar(0x404290D5, 1); @@ -974,11 +977,11 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2000: _movingTileIndex = (int16)param.asInteger(); - _movingTileSprite = (Sprite*)sender; + _ssMovingTile = (Sprite*)sender; break; case 0x2002: _isTileMoving = false; - _doneMovingTileSprite = (Sprite*)sender; + _ssDoneMovingTile = (Sprite*)sender; if (param.asInteger() <= 2) { _surfacePriority = 100; } else if (param.asInteger() >= 3 && param.asInteger() <= 5) { @@ -1015,24 +1018,22 @@ bool Scene2202::testIsSolved() { getSubVar(0x484498D0, 8) == 7; } -static const uint32 kClass545FileHashes[] = { - 0x2450D850, - 0x0C9CE8D0, - 0x2C58A152 +static const uint32 kAsCommonKeyFileHashes[] = { + 0x2450D850, 0x0C9CE8D0, 0x2C58A152 }; -Class545::Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y) - : AnimatedSprite(vm, kClass545FileHashes[index], surfacePriority, x, y), _parentScene(parentScene), _index(index) { +AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y) + : AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) { - if (!getSubVar(0x0090EA95, _index) && !getSubVar(0x08D0AB11, _index)) { - SetMessageHandler(&Class545::handleMessage); + if (!getSubVar(0x0090EA95, _keyIndex) && !getSubVar(0x08D0AB11, _keyIndex)) { + SetMessageHandler(&AsCommonKey::handleMessage); } else { setVisible(false); SetMessageHandler(NULL); } } -uint32 Class545::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -1040,7 +1041,7 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam ¶m, Entity messageResult = 1; break; case 0x4806: - setSubVar(0x0090EA95, _index, 1); + setSubVar(0x0090EA95, _keyIndex, 1); setVisible(false); SetMessageHandler(NULL); } @@ -1048,23 +1049,22 @@ uint32 Class545::handleMessage(int messageNum, const MessageParam ¶m, Entity } static const uint32 kAsScene2203DoorFileHashes[] = { - 0x7868AE10, - 0x1A488110 + 0x7868AE10, 0x1A488110 }; -AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) { +AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _doorIndex(doorIndex) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2203Door::handleMessage); _x = 320; _y = 240; - createSurface1(kAsScene2203DoorFileHashes[_index], 900); - if (getGlobalVar(0x9A500914) == _index) { - startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1); + createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900); + if (getGlobalVar(0x9A500914) == _doorIndex) { + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); _newStickFrameIndex = -2; } else { - startAnimation(kAsScene2203DoorFileHashes[_index], 0, -1); + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1); _newStickFrameIndex = 0; } } @@ -1073,7 +1073,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (_index == getGlobalVar(0x9A500914)) + if (_doorIndex == getGlobalVar(0x9A500914)) sendMessage(_parentScene, 0x2002, 0); else sendMessage(_parentScene, 0x2001, 0); @@ -1083,12 +1083,12 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, _otherDoor = (Sprite*)param.asEntity(); break; case 0x3002: - if (_index == getGlobalVar(0x9A500914)) + if (_doorIndex == getGlobalVar(0x9A500914)) sendMessage(_parentScene, 0x4808, 0); stopAnimation(); break; case 0x4808: - setGlobalVar(0x9A500914, _index); + setGlobalVar(0x9A500914, _doorIndex); sendMessage(_otherDoor, 0x4809, 0); openDoor(); break; @@ -1102,11 +1102,11 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, void AsScene2203Door::openDoor() { playSound(0, 0x341014C4); - startAnimation(kAsScene2203DoorFileHashes[_index], 1, -1); + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 1, -1); } void AsScene2203Door::closeDoor() { - startAnimation(kAsScene2203DoorFileHashes[_index], -1, -1); + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); _playBackwards = true; _newStickFrameIndex = 0; } @@ -1126,9 +1126,11 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B8320); + //DEBUG setGlobalVar(0x13382860, 1);//###//TODO CHECK IF Below... + if (getGlobalVar(0x13382860) == 1) { - _class545 = insertSprite(this, 2, 1100, 282, 432); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 2, 1100, 282, 432); + _vm->_collisionMan->addSprite(_asKey); } _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); @@ -1222,8 +1224,8 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _asTape) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B83E0); - } else if (sender == _class545) { - sendEntityMessage(_klayman, 0x1014, _class545); + } else if (sender == _asKey) { + sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004B83F0); } break; @@ -1395,112 +1397,112 @@ static const uint32 kScene2206MessageIds2[] = { 0x004B8A48 }; -static const int16 kClass603XDeltas1[] = { +static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = { -24, -28, -18, 6, 9, -8 }; -static const int16 kClass603XDeltas2[] = { +static const int16 kAsScene2206DoorSpikesXDeltasClose[] = { -8, 7, 11, 26, 13, 14 }; -Class603::Class603(NeverhoodEngine *vm, uint32 fileHash) +AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash) : StaticSprite(vm, fileHash, 200) { if (getGlobalVar(0x18890C91)) _x -= 63; - SetUpdateHandler(&Class603::update); - SetMessageHandler(&Class603::handleMessage); + SetUpdateHandler(&AsScene2206DoorSpikes::update); + SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); SetSpriteUpdate(NULL); } -void Class603::update() { +void AsScene2206DoorSpikes::update() { handleSpriteUpdate(); StaticSprite::update(); } -uint32 Class603::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4808: - _index = 0; + _deltaIndex = 0; SetMessageHandler(NULL); - SetSpriteUpdate(&Class603::spriteUpdate481E60); + SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen); playSound(0, 0x032746E0); break; case 0x4809: - _index = 0; + _deltaIndex = 0; SetMessageHandler(NULL); - SetSpriteUpdate(&Class603::spriteUpdate481E90); + SetSpriteUpdate(&AsScene2206DoorSpikes::suClose); playSound(0, 0x002642C0); break; } return messageResult; } -void Class603::spriteUpdate481E60() { - if (_index < 6) { - _x += kClass603XDeltas1[_index]; - _index++; +void AsScene2206DoorSpikes::suOpen() { + if (_deltaIndex < 6) { + _x += kAsScene2206DoorSpikesXDeltasOpen[_deltaIndex]; + _deltaIndex++; } else { - SetMessageHandler(&Class603::handleMessage); + SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); SetSpriteUpdate(NULL); } } -void Class603::spriteUpdate481E90() { - if (_index < 6) { - _x += kClass603XDeltas2[_index]; - _index++; +void AsScene2206DoorSpikes::suClose() { + if (_deltaIndex < 6) { + _x += kAsScene2206DoorSpikesXDeltasClose[_deltaIndex]; + _deltaIndex++; } else { - SetMessageHandler(&Class603::handleMessage); + SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); SetSpriteUpdate(NULL); } } -Class604::Class604(NeverhoodEngine *vm, uint32 fileHash) +AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash) : StaticSprite(vm, fileHash, 50) { - SetUpdateHandler(&Class604::update); - SetMessageHandler(&Class604::handleMessage); + SetUpdateHandler(&AsScene2206Platform::update); + SetMessageHandler(&AsScene2206Platform::handleMessage); SetSpriteUpdate(NULL); } -void Class604::update() { +void AsScene2206Platform::update() { handleSpriteUpdate(); StaticSprite::update(); } -uint32 Class604::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4803: SetMessageHandler(NULL); - SetSpriteUpdate(&Class604::spriteUpdate482020); + SetSpriteUpdate(&AsScene2206Platform::suMoveDown); _yDelta = 0; break; } return messageResult; } -void Class604::spriteUpdate482020() { +void AsScene2206Platform::suMoveDown() { _yDelta++; _y += _yDelta; } -Class607::Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) +SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { if (getGlobalVar(0x45080C38)) { setVisible(false); SetMessageHandler(NULL); } else { - SetMessageHandler(&Class607::handleMessage); + SetMessageHandler(&SsScene2206TestTube::handleMessage); } _deltaRect = _drawRect; processDelta(); } -uint32 Class607::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -1530,28 +1532,28 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x2201266A, 100); _sprite2 = insertStaticSprite(0x3406A333, 300); _sprite3 = insertStaticSprite(0x24A223A2, 100); - _sprite4 = insertSprite(0x26133023); - _sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); + _asDoorSpikes = insertSprite(0x26133023); + _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8AF8); - _sprite5 = insertSprite(this, 0x0E038022, 100, 0); + _ssButton = insertSprite(this, 0x0E038022, 100, 0); insertMouse433(0x83212411); - _class607 = insertSprite(this, 1100, /*464, 433, */0x5E00E262); - _class604 = insertSprite(0x085E25E0); + _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x5E00E262); + _asPlatform = insertSprite(0x085E25E0); } else { fileHash = 0xE0102A45; _sprite1 = insertStaticSprite(0x1C1106B8, 100); _sprite2 = insertStaticSprite(0x020462E0, 300); _sprite3 = insertStaticSprite(0x900626A2, 100); - _sprite4 = insertSprite(0x544822A8); - _sprite4->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); + _asDoorSpikes = insertSprite(0x544822A8); + _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8B58); - _sprite5 = insertSprite(this, 0x16882608, 100, 0); + _ssButton = insertSprite(this, 0x16882608, 100, 0); insertMouse433(0x02A41E09); - _class607 = insertSprite(this, 1100, /*464, 433, */0x52032563); - _class604 = insertSprite(0x317831A0); + _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x52032563); + _asPlatform = insertSprite(0x317831A0); } - _class604->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + _asPlatform->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); setBackground(fileHash); @@ -1564,7 +1566,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(0x0263D144, 0, 65, 0); } - _vm->_collisionMan->addSprite(_class607); + _vm->_collisionMan->addSprite(_ssTestTube); if (which < 0) { insertKlayman(200, 430); @@ -1576,7 +1578,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(205, 396); setMessageList(0x004B88C8); _palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0); - sub4819D0(); + klaymanBehindSpikes(); playSound(0, 0x53B8284A); } else if (which == 3) { insertKlayman(kScene2206XPositions[getGlobalVar(0x48A68852)], 430); @@ -1602,9 +1604,9 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x800C6694) { - sub481B00(); + readClickedColumn(); } else if (param.asInteger() == 0x402064D8) { - sendEntityMessage(_klayman, 0x1014, _sprite5); + sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x11C40840) { if (getGlobalVar(0x18890C91)) setMessageList(0x004B8948); @@ -1613,32 +1615,32 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4803: - sendMessage(_class604, 0x4803, 0); + sendMessage(_asPlatform, 0x4803, 0); break; case 0x480B: - if (sender == _sprite5) { + if (sender == _ssButton) { setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1); if (getGlobalVar(0x18890C91)) - sendMessage(_sprite4, 0x4808, 0); + sendMessage(_asDoorSpikes, 0x4808, 0); else - sendMessage(_sprite4, 0x4809, 0); + sendMessage(_asDoorSpikes, 0x4809, 0); } break; case 0x4826: - sendEntityMessage(_klayman, 0x1014, _class607); + sendEntityMessage(_klayman, 0x1014, _ssTestTube); setMessageList(0x004B8988); break; case 0x482A: - sub4819D0(); + klaymanBehindSpikes(); break; case 0x482B: - sub481950(); + klaymanInFrontSpikes(); break; } return messageResult; } -void Scene2206::sub481950() { +void Scene2206::klaymanInFrontSpikes() { if (getGlobalVar(0x4D080E54)) { _palette->addBasePalette(0x41983216, 0, 65, 0); _palette->startFadeToPalette(12); @@ -1646,11 +1648,11 @@ void Scene2206::sub481950() { setSurfacePriority(_sprite1->getSurface(), 100); setSurfacePriority(_sprite2->getSurface(), 300); setSurfacePriority(_sprite3->getSurface(), 100); - setSurfacePriority(_sprite4->getSurface(), 200); + setSurfacePriority(_asDoorSpikes->getSurface(), 200); _klayman->setClipRect(0, 0, 640, 480); } -void Scene2206::sub4819D0() { +void Scene2206::klaymanBehindSpikes() { if (!getGlobalVar(0x4D080E54)) { _palette->addBasePalette(0xB103B604, 0, 65, 0); _palette->startFadeToPalette(12); @@ -1658,11 +1660,11 @@ void Scene2206::sub4819D0() { setSurfacePriority(_sprite1->getSurface(), 1100); setSurfacePriority(_sprite2->getSurface(), 1300); setSurfacePriority(_sprite3->getSurface(), 1100); - setSurfacePriority(_sprite4->getSurface(), 1200); + setSurfacePriority(_asDoorSpikes->getSurface(), 1200); _klayman->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); } -void Scene2206::sub481B00() { +void Scene2206::readClickedColumn() { setGlobalVar(0x48A68852, (_mouseClickPos.x - 354) / 96); if (getGlobalVar(0x48A68852) > 2) setGlobalVar(0x48A68852, 2); @@ -2008,8 +2010,9 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { - //DEBUG + //DEBUG>>> setGlobalVar(0x4D080E54, 1); + //DEBUG<<< _vm->gameModule()->initScene3009Vars(); @@ -2208,21 +2211,13 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Enti } static const uint32 kScene2208FileHashes1[] = { - 0x041023CB, - 0x041020CB, - 0x041026CB, - 0x04102ACB, - 0x041032CB, - 0x041002CB + 0x041023CB, 0x041020CB, 0x041026CB, 0x04102ACB, + 0x041032CB, 0x041002CB }; static const uint32 kScene2208FileHashes2[] = { - 0x091206C9, - 0x091406C9, - 0x091806C9, - 0x090006C9, - 0x093006C9, - 0x095006C9 + 0x091206C9, 0x091406C9, 0x091806C9, 0x090006C9, + 0x093006C9, 0x095006C9 }; Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) @@ -2402,18 +2397,15 @@ void Scene2208::drawRow(int16 rowIndex) { } static const int16 kScene2242XPositions[] = { - 68, - 158 + 68, 158 }; static const uint32 kScene2242MessageListIds2[] = { - 0x004B3CB8, - 0x004B3CD8 + 0x004B3CB8, 0x004B3CD8 }; static const uint32 kScene2242MessageListIds1[] = { - 0x004B3CF8, - 0x004B3D20 + 0x004B3CF8, 0x004B3D20 }; Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) @@ -2520,33 +2512,18 @@ void Scene2242::readClickedColumn() { } static const int16 kHallOfRecordsKlaymanXPos[] = { - 68, - 157, - 246, - 335, - 424, - 513, - 602 + 68, 157, 246, 335, + 424, 513, 602 }; static const uint32 kHallOfRecordsSceneMessageListIds2[] = { - 0x004B2978, - 0x004B2998, - 0x004B29B8, - 0x004B29D8, - 0x004B29F8, - 0x004B2A18, - 0x004B2A38 + 0x004B2978, 0x004B2998, 0x004B29B8, 0x004B29D8, + 0x004B29F8, 0x004B2A18, 0x004B2A38 }; static const uint32 kHallOfRecordsSceneMessageListIds1[] = { - 0x004B2A58, - 0x004B2A80, - 0x004B2AA8, - 0x004B2AD0, - 0x004B2AF8, - 0x004B2B20, - 0x004B2B48 + 0x004B2A58, 0x004B2A80, 0x004B2AA8, 0x004B2AD0, + 0x004B2AF8, 0x004B2B20, 0x004B2B48 }; HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id) @@ -2629,18 +2606,15 @@ void HallOfRecordsScene::readClickedColumn() { } static const int16 kScene2247XPositions[] = { - 513, - 602 + 513, 602 }; static const uint32 kScene2247MessageListIds2[] = { - 0x004B54A0, - 0x004B54C0 + 0x004B54A0, 0x004B54C0 }; static const uint32 kScene2247MessageListIds1[] = { - 0x004B54E0, - 0x004B5508 + 0x004B54E0, 0x004B5508 }; Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index e869e4c89c..625990bfca 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -40,31 +40,20 @@ public: protected: void createScene(int sceneNum, int which); void updateScene(); + void createHallOfRecordsScene(int which, uint32 sceneInfo140Id); }; // Scene2201 -static const NPoint kClass444Points[] = { - {305, 305}, - {321, 305}, - {336, 305}, - {305, 319}, - {321, 319}, - {336, 319}, - {305, 332}, - {321, 332}, +static const NPoint kSsScene2201PuzzleCubePoints[] = { + {305, 305}, {321, 305}, {336, 305}, {305, 319}, + {321, 319}, {336, 319}, {305, 332}, {321, 332}, {336, 333} }; -static const uint32 kClass444FileHashes[] = { - 0x88134A44, - 0xAA124340, - 0xB8124602, - 0xA902464C, - 0x890A4244, - 0xA8124642, - 0xB812C204, - 0x381A4A4C +static const uint32 kSsScene2201PuzzleCubeFileHashes[] = { + 0x88134A44, 0xAA124340, 0xB8124602, 0xA902464C, + 0x890A4244, 0xA8124642, 0xB812C204, 0x381A4A4C }; class AsScene2201CeilingFan : public AnimatedSprite { @@ -74,10 +63,10 @@ public: class AsScene2201Door : public AnimatedSprite { public: - AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *doorLightSprite, bool flag1); + AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1); protected: Klayman *_klayman; - Sprite *_doorLightSprite; + Sprite *_ssDoorLight; bool _doorOpen; int _countdown; void update(); @@ -86,9 +75,9 @@ protected: void stCloseDoor(); }; -class Class444 : public StaticSprite { +class SsScene2201PuzzleCube : public StaticSprite { public: - Class444(NeverhoodEngine *vm, int pointIndex, int spriteIndex); + SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex); }; class Scene2201 : public Scene { @@ -97,11 +86,11 @@ public: ~Scene2201(); protected: NRect _clipRects[2]; - Sprite *_doorLightSprite; + Sprite *_ssDoorLight; Sprite *_asDoor; Sprite *_ssDoorButton; Sprite *_asTape; - bool _soundFlag; + bool _isSoundPlaying; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -135,8 +124,8 @@ public: Scene2202(NeverhoodEngine *vm, Module *parentModule, int which); ~Scene2202(); protected: - Sprite *_movingTileSprite; - Sprite *_doneMovingTileSprite; + Sprite *_ssMovingTile; + Sprite *_ssDoneMovingTile; bool _isTileMoving; int16 _movingTileIndex; int _surfacePriority; @@ -148,22 +137,22 @@ protected: bool testIsSolved(); }; -class Class545 : public AnimatedSprite { +class AsCommonKey : public AnimatedSprite { public: - Class545(NeverhoodEngine *vm, Scene *parentScene, int index, int surfacePriority, int16 x, int16 y); + AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y); protected: Scene *_parentScene; - int _index; + int _keyIndex; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene2203Door : public AnimatedSprite { public: - AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint index); + AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex); protected: Scene *_parentScene; Sprite *_otherDoor; - uint _index; + uint _doorIndex; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void openDoor(); void closeDoor(); @@ -179,7 +168,7 @@ protected: Sprite *_ssSmallLeftDoor; Sprite *_ssSmallRightDoor; Sprite *_asTape; - Sprite *_class545; + Sprite *_asKey; NRect _leftDoorClipRect; NRect _rightDoorClipRect; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -204,30 +193,30 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class Class603 : public StaticSprite { +class AsScene2206DoorSpikes : public StaticSprite { public: - Class603(NeverhoodEngine *vm, uint32 fileHash); + AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash); protected: - int _index; + int _deltaIndex; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate481E60(); - void spriteUpdate481E90(); + void suOpen(); + void suClose(); }; -class Class604 : public StaticSprite { +class AsScene2206Platform : public StaticSprite { public: - Class604(NeverhoodEngine *vm, uint32 fileHash); + AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash); protected: int16 _yDelta; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void spriteUpdate482020(); + void suMoveDown(); }; -class Class607 : public StaticSprite { +class SsScene2206TestTube : public StaticSprite { public: - Class607(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash); + SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -241,14 +230,14 @@ protected: Sprite *_sprite1; Sprite *_sprite2; Sprite *_sprite3; - Sprite *_sprite4; - Sprite *_sprite5; - Sprite *_class604; - Sprite *_class607; + Sprite *_asDoorSpikes; + Sprite *_ssButton; + Sprite *_asPlatform; + Sprite *_ssTestTube; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub481950(); - void sub4819D0(); - void sub481B00(); + void klaymanInFrontSpikes(); + void klaymanBehindSpikes(); + void readClickedColumn(); }; class AsScene2207Elevator : public AnimatedSprite { diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index e2973ecc8a..5f1d5bbfbe 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -70,13 +70,13 @@ void Module2400::createScene(int sceneNum, int which) { createSmackerScene(0x20D80001, true, true, false); break; case 7: - _childObject = new StaticScene(_vm, this, 0x81523218, 0x2321C81D); + createStaticScene(0x81523218, 0x2321C81D); break; case 8: - _childObject = new StaticScene(_vm, this, 0x08100210, 0x00214089); + createStaticScene(0x08100210, 0x00214089); break; case 9: - _childObject = new StaticScene(_vm, this, 0x8C020505, 0x205018C8); + createStaticScene(0x8C020505, 0x205018C8); break; } SetUpdateHandler(&Module2400::updateScene); @@ -930,8 +930,8 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xB03001A8); if (getGlobalVar(0x13382860) == 2) { - _class545 = insertSprite(this, 2, 1100, 560, 409); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 2, 1100, 560, 409); + _vm->_collisionMan->addSprite(_asKey); } _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); @@ -1016,8 +1016,8 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _asTape && !_flag1) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B77C8); - } else if (sender == _class545 && !_flag1) { - sendEntityMessage(_klayman, 0x1014, _class545); + } else if (sender == _asKey && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004B77D8); } break; diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index bbfa47d07a..2fa7a9a4be 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -162,7 +162,7 @@ protected: Sprite *_sprite2; Sprite *_ssButton; Sprite *_asTape; - Sprite *_class545; + Sprite *_asKey; Sprite *_asLightCord; bool _flag1; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -174,7 +174,7 @@ public: protected: Sprite *_sprite1; Sprite *_asTape; - Sprite *_class545; + Sprite *_asKey; NRect _clipRects[2]; bool _flag1; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 26d0d88de1..978695d26c 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -126,9 +126,9 @@ void Module2500::createScene(int sceneNum, int which) { break; case 9: if (getGlobalVar(0xD0A14D10)) - _childObject = new StaticScene(_vm, this, 0xC62A0645, 0xA0641C6A); + createStaticScene(0xC62A0645, 0xA0641C6A); else - _childObject = new StaticScene(_vm, this, 0x7A343546, 0x435427AB); + createStaticScene(0x7A343546, 0x435427AB); break; } SetUpdateHandler(&Module2500::updateScene); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 7c93aa7c9a..ec0ddf00b3 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -267,7 +267,7 @@ void Module2700::createScene(int sceneNum, int which) { createScene2704(which, 0x004B1E60, 150); break; case 30: - _childObject = new StaticScene(_vm, this, 0x09507248, 0x0724C09D); + createStaticScene(0x09507248, 0x0724C09D); break; case 31: //TODO _childObject = new Scene2732(_vm, this, which); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 203854878a..95e2c3e1b6 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -70,7 +70,7 @@ void Module2800::createScene(int sceneNum, int which) { if (_flag) { _childObject = new Scene2802(_vm, this, which); } else { - _childObject = new StaticScene(_vm, this, 0x000C6444, 0xC6440008); + createStaticScene(0x000C6444, 0xC6440008); } #endif break; @@ -119,39 +119,39 @@ void Module2800::createScene(int sceneNum, int which) { break; case 12: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x0000A245, 0x0A241008); + createStaticScene(0x0000A245, 0x0A241008); break; case 13: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x81C60635, 0x60631814); + createStaticScene(0x81C60635, 0x60631814); break; case 14: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0xCA811204, 0x11200CA0); + createStaticScene(0xCA811204, 0x11200CA0); break; case 15: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x2D438A00, 0x38A042DC); + createStaticScene(0x2D438A00, 0x38A042DC); break; case 16: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x0A806204, 0x062000A0); + createStaticScene(0x0A806204, 0x062000A0); break; case 17: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x010F9284, 0xF9280018); + createStaticScene(0x010F9284, 0xF9280018); break; case 18: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x0100022B, 0x0022F018); + createStaticScene(0x0100022B, 0x0022F018); break; case 19: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x10866205, 0x66201100); + createStaticScene(0x10866205, 0x66201100); break; case 20: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x01C58000, 0x58004014); + createStaticScene(0x01C58000, 0x58004014); break; case 21: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); @@ -159,22 +159,22 @@ void Module2800::createScene(int sceneNum, int which) { break; case 22: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x9408121E, 0x8121A948); + createStaticScene(0x9408121E, 0x8121A948); break; case 23: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x048C0600, 0xC0604040); + createStaticScene(0x048C0600, 0xC0604040); break; case 24: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new StaticScene(_vm, this, 0x04270A94, 0x70A9004A); + createStaticScene(0x04270A94, 0x70A9004A); break; case 25: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); if (getGlobalVar(0x190A1D18)) - _childObject = new StaticScene(_vm, this, 0x01600204, 0x0020001E); + createStaticScene(0x01600204, 0x0020001E); else - _childObject = new StaticScene(_vm, this, 0x08611204, 0x1120008E); + createStaticScene(0x08611204, 0x1120008E); break; case 26: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); @@ -2987,8 +2987,8 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x0060203E); if (getGlobalVar(0x13382860) == 3) { - _class545 = insertSprite(this, 2, 1100, 474, 437); - _vm->_collisionMan->addSprite(_class545); + _asKey = insertSprite(this, 2, 1100, 474, 437); + _vm->_collisionMan->addSprite(_asKey); } _ssTape = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); @@ -3071,8 +3071,8 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _ssTape && !_flag1) { sendEntityMessage(_klayman, 0x1014, _ssTape); setMessageList(0x004AF658); - } else if (sender == _class545 && !_flag1) { - sendEntityMessage(_klayman, 0x1014, _class545); + } else if (sender == _asKey && !_flag1) { + sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004AF668); } break; diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 1027a6fa6b..63177832ab 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -462,7 +462,7 @@ protected: Sprite *_sprite2; Sprite *_sprite4; Sprite *_ssTape; - Sprite *_class545; + Sprite *_asKey; Sprite *_sprite1; bool _flag1; int _palStatus; -- cgit v1.2.3 From 483d76d635dac1ea4418a4ab6cbb639e9314a0c7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 10:17:20 +0000 Subject: NEVERHOOD: Enable/fixup navigation scene sound update code in several modules - Rename some NavigationScene stuff --- engines/neverhood/gamemodule.cpp | 4 +-- engines/neverhood/module1100.cpp | 18 +++++------- engines/neverhood/module1800.cpp | 4 +-- engines/neverhood/module2300.cpp | 55 +++++++++++++++-------------------- engines/neverhood/module2300.h | 2 +- engines/neverhood/module3000.cpp | 24 ++++++--------- engines/neverhood/navigationscene.cpp | 41 +++++++++++++------------- engines/neverhood/navigationscene.h | 11 +++---- 8 files changed, 70 insertions(+), 89 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index ef1b09320a..190934f91b 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,8 +309,8 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 5; - createModule(2200, -1); + _vm->gameState().sceneNum = 1; + createModule(2300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 257ee27d0d..53ede4315d 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -206,23 +206,19 @@ void Module1100::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 0: -#if 0 // TODO - if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { - SoundMan_playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64); - SoundMan_setSoundVolume(0x48498E46, 65); - SoundMan_setSoundVolume(0x50399F64, 65); + if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) { + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 65); + _vm->_soundMan->setSoundVolume(0x50399F64, 65); } -#endif break; case 1: -#if 0 // TODO - if (navigationScene()->soundFlag1 && _countdown != 0 && (--_countdown == 0)) { - SoundMan_playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F); + if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) { + _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); } -#endif break; case 2: - _vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->getSoundFlag1(), 0, 0, 0, 0); + _vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0); break; case 5: case 6: diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 43355955d5..ea6182d746 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -158,7 +158,7 @@ void Module1800::updateScene() { case 8: // NOTE: After Klayman jumped into the hole and died... leaveModule(1); - // TODO GameState stuff + // TODO GameState stuff // Restarts the game? break; case 9: leaveModule(0); @@ -167,7 +167,7 @@ void Module1800::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 0: - if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 2) { + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) { _vm->_soundMan->setTwoSoundsPlayFlag(false); } break; diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 4f35122eb2..9e2acff997 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -21,25 +21,25 @@ */ #include "neverhood/module2300.h" +#include "neverhood/navigationscene.h" namespace Neverhood { static const uint32 kModule2300SoundList[] = { - 0x90805C50, - 0x90804450, - 0xB4005E60, - 0x91835066, - 0x90E14440, - 0x90F0D1C3, - 0 + 0x90805C50, 0x90804450, 0xB4005E60, 0x91835066, + 0x90E14440, 0x90F0D1C3, 0 }; Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _volume(0) { + : Module(vm, parentModule), _soundVolume(0) { _vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList); _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); + //DEBUG>>> + setGlobalVar(0x10938830, 0); + //DEBUG<<< + _flag = getGlobalVar(0x10938830) == 0; if (_flag) { @@ -82,7 +82,7 @@ void Module2300::createScene(int sceneNum, int which) { case 1: createNavigationScene(0x004B67E8, which); if (_flag) { - _volume = 15; + _soundVolume = 15; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 15); } break; @@ -93,10 +93,10 @@ void Module2300::createScene(int sceneNum, int which) { if (getGlobalVar(0x10938830)) { createNavigationScene(0x004B68F0, which); } else { - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _volume); + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); createNavigationScene(0x004B68A8, which); if (_flag) { - _volume = 87; + _soundVolume = 87; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 87); } } @@ -157,32 +157,23 @@ void Module2300::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 1: -#if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (_flag && navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 4 && - navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { - _volume++; - SoundMan_setSoundVolume(0x90F0D1C3, _volume); + if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && + navigationScene()->getFrameNumber() % 2) { + _soundVolume++; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } -#endif -#if 0 // TODO - if (navigationScene->getSoundFlag1() && navigationScene->getNavigationIndex() == 0 && - navigationScene->getSmackerPlayer() && navigationScene->getSmackerPlayer()->getFrameNumber() == 50) { - SoundMan_playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64); - SoundMan_setSoundVolume(0x48498E46, 70); - SoundMan_setSoundVolume(0x50399F64, 70); + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0 && + navigationScene()->getFrameNumber() == 50) { + _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); } -#endif break; case 3: -#if 0 // TODO - NavigationScene *navigationScene = (NavigationScene*)_childObject; - if (_flag && navigationScene->getSoundFlag1() && navigationScene->getSmackerPlayer() && - navigationScene->getSmackerPlayer()->getFrameNumber() % 2) { - _volume--; - SoundMan_setSoundVolume(0x90F0D1C3, _volume); + if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) { + _soundVolume--; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } -#endif break; } } diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h index 722255978c..ed39a45b35 100644 --- a/engines/neverhood/module2300.h +++ b/engines/neverhood/module2300.h @@ -37,7 +37,7 @@ public: virtual ~Module2300(); protected: bool _flag; - int _volume; + int _soundVolume; void createScene(int sceneNum, int which); void updateScene(); }; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 78ab74d61a..55ad05b58a 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -240,12 +240,12 @@ void Module3000::updateScene() { case 8: _flag = getGlobalVar(0x10938830); // CHECKME if (_moduleResult != 1) { - // TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0): + _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); createScene(4, 1); } else if (getGlobalVar(0xF0402B0A)) { createScene(1008, -1); } else { - // TODO: SoundMan_setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); + _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); createScene(4, 1); } break; @@ -280,10 +280,9 @@ void Module3000::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 1: -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { + if (navigationScene()->isWalkingForward()) { uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); + int navigationIndex = navigationScene()->getNavigationIndex(); if (navigationIndex == 1) { if (frameNumber == 0) { _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); @@ -309,13 +308,11 @@ void Module3000::updateScene() { } } } -#endif break; case 2: -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { + if (navigationScene()->isWalkingForward()) { uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); + int navigationIndex = navigationScene()->getNavigationIndex(); if (_flag && _soundVolume > 1 && frameNumber % 2) { _soundVolume--; _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); @@ -332,13 +329,11 @@ void Module3000::updateScene() { } } } -#endif break; case 3: -#if 0 // ALL TODO - if (navigationScene()->getSoundFlag1()) { + if (navigationScene()->isWalkingForward()) { uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getIndex(); + int navigationIndex = navigationScene()->getNavigationIndex(); if (navigationIndex == 2) { if (frameNumber == 40) { _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); @@ -352,10 +347,9 @@ void Module3000::updateScene() { } } } -#endif break; case 5: - if (navigationScene()->getSoundFlag1() && navigationScene()->getNavigationIndex() == 0) { + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0) { _vm->_soundMan->setTwoSoundsPlayFlag(false); } break; diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index a3e15369ae..66b30cf79e 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -27,13 +27,16 @@ namespace Neverhood { NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes) : Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false), - _soundFlag1(false), _soundFlag2(false), _smackerFileHash(0), _interactive(true), _done(false) { + _isWalkingForward(false), _isTurning(false), _smackerFileHash(0), _interactive(true), _leaveSceneAfter(false) { _navigationList = _vm->_staticData->getNavigationList(navigationListId); + + //DEBUG>>> for (NavigationList::iterator it = _navigationList->begin(); it != _navigationList->end(); it++) { debug("%08X %08X %08X %08X %d %d %08X", (*it).fileHash, (*it).leftSmackerFileHash, (*it).rightSmackerFileHash, (*it).middleSmackerFileHash, (*it).interactive, (*it).middleFlag, (*it).mouseCursorFileHash); } + //DEBUG<<< if (_navigationIndex < 0) { _navigationIndex = (int)getGlobalVar(0x4200189E); @@ -46,9 +49,7 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint SetMessageHandler(&NavigationScene::handleMessage); _smackerPlayer = new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true); - addEntity(_smackerPlayer); - addSurface(_smackerPlayer->getSurface()); createMouseCursor(); @@ -79,14 +80,14 @@ void NavigationScene::update() { _smackerDone = false; _smackerFileHash = 0; } else if (_smackerDone) { - if (_done) { + if (_leaveSceneAfter) { sendMessage(_parentModule, 0x1009, _navigationIndex); } else { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; createMouseCursor(); showMouse(true); - _soundFlag2 = false; - _soundFlag1 = false; + _isTurning = false; + _isWalkingForward = false; _interactive = true; _vm->_soundMan->setTwoSoundsPlayFlag(false); _vm->_soundMan->setSoundThreePlayFlag(false); @@ -151,8 +152,8 @@ void NavigationScene::createMouseCursor() { void NavigationScene::handleNavigation(const NPoint &mousePos) { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; - bool oldSoundFlag1 = _soundFlag1; - bool oldSoundFlag2 = _soundFlag2; + bool oldIsWalkingForward = _isWalkingForward; + bool oldIsTurning = _isTurning; uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos); switch (direction) { @@ -161,8 +162,8 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { if (navigationItem.leftSmackerFileHash != 0) { _smackerFileHash = navigationItem.leftSmackerFileHash; _interactive = false; - _soundFlag1 = false; - _soundFlag2 = true; + _isWalkingForward = false; + _isTurning = true; do { _navigationIndex--; if (_navigationIndex < 0) @@ -177,8 +178,8 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { if (navigationItem.rightSmackerFileHash != 0) { _smackerFileHash = navigationItem.rightSmackerFileHash; _interactive = false; - _soundFlag1 = false; - _soundFlag2 = true; + _isWalkingForward = false; + _isTurning = true; do { _navigationIndex++; if (_navigationIndex >= (int)_navigationList->size()) @@ -197,20 +198,18 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } else if (navigationItem.middleSmackerFileHash != 0) { _smackerFileHash = navigationItem.middleSmackerFileHash; _interactive = false; - _soundFlag1 = true; - _soundFlag2 = false; - _done = true; + _isWalkingForward = true; + _isTurning = false; + _leaveSceneAfter = true; } break; } - if (oldSoundFlag2 != _soundFlag2) { - _vm->_soundMan->setSoundThreePlayFlag(_soundFlag2); - } + if (oldIsTurning != _isTurning) + _vm->_soundMan->setSoundThreePlayFlag(_isTurning); - if (oldSoundFlag1 != _soundFlag1) { - _vm->_soundMan->setTwoSoundsPlayFlag(_soundFlag1); - } + if (oldIsWalkingForward != _isWalkingForward) + _vm->_soundMan->setTwoSoundsPlayFlag(_isWalkingForward); } diff --git a/engines/neverhood/navigationscene.h b/engines/neverhood/navigationscene.h index cf351d1bcd..ebe9a3597c 100644 --- a/engines/neverhood/navigationscene.h +++ b/engines/neverhood/navigationscene.h @@ -35,8 +35,9 @@ public: virtual ~NavigationScene(); int getNavigationAreaType(); int getNavigationIndex() const { return _navigationIndex; } - bool getSoundFlag1() const { return _soundFlag1; } - bool getSoundFlag2() const { return _soundFlag2; } + bool isWalkingForward() const { return _isWalkingForward; } + bool isTurning() const { return _isTurning; } + int getFrameNumber() const { return _smackerPlayer->getFrameNumber(); } protected: SmackerPlayer *_smackerPlayer; bool _smackerDone; @@ -44,9 +45,9 @@ protected: int _navigationIndex; uint32 _smackerFileHash; bool _interactive; - bool _soundFlag1; - bool _soundFlag2; - bool _done; + bool _isWalkingForward; + bool _isTurning; + bool _leaveSceneAfter; const byte *_itemsTypes; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From 4c421a09c8f8cdc4455f3644e7ea7fbf0bbb95fc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 10:58:00 +0000 Subject: NEVERHOOD: Add clipRects to all Klayman subclasses - Rename stuff in Module2400 - Move some temp sprites from class scope to local scope in the respective constructors --- engines/neverhood/gamemodule.cpp | 4 +-- engines/neverhood/klayman.cpp | 13 ++++++-- engines/neverhood/klayman.h | 2 +- engines/neverhood/module2400.cpp | 72 +++++++++++++++++++++------------------- engines/neverhood/module2400.h | 8 ++--- 5 files changed, 52 insertions(+), 47 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 190934f91b..7fa6906399 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,8 +309,8 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 1; - createModule(2300, -1); + _vm->gameState().sceneNum = 2; + createModule(2400, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 82c6114d5d..90ba8aab4c 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5420,7 +5420,9 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // TODO Cliprects + + _surface->setClipRects(clipRects, clipRectsCount); + } uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5635,7 +5637,8 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2803::KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // TODO ClipRects stuff + _surface->setClipRects(clipRects, clipRectsCount); + _dataResource.load(0x00900849); } @@ -5808,6 +5811,8 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty + _surface->setClipRects(clipRects, clipRectsCount); + if (flag) { // TODO Maybe? Don't know. Set Klayman clip rects loadSound(3, 0x58E0C341); @@ -5866,6 +5871,8 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 bool flag, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { + _surface->setClipRects(clipRects, clipRectsCount); + if (flag) { // TODO Maybe? Don't know. Set Klayman clip rects loadSound(3, 0x58E0C341); @@ -5973,7 +5980,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶ KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // TODO ClipRects stuff + _surface->setClipRects(clipRects, clipRectsCount); } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index b83eb142f6..90e71de22d 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -413,7 +413,7 @@ protected: Sprite *_otherSprite; int _idleTableNum; - int16 _walkResumeFrameIncr; + int16 _walkResumeFrameIncr; int _moveObjectCountdown; diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 5f1d5bbfbe..3b6c6bb8cf 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -720,7 +720,9 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity * Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown(0), _soundToggle(false) { - + + Sprite *tempSprite; + _surfaceFlag = true; SetMessageHandler(&Scene2402::handleMessage); SetUpdateHandler(&Scene2402::update); @@ -748,9 +750,9 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AF7D0); } - _sprite1 = insertStaticSprite(0x081A60A8, 1100); + tempSprite = insertStaticSprite(0x081A60A8, 1100); _ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100); - _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, _sprite1->getDrawRect().y2()); + _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2()); _asDoor = insertSprite(this, which == 1/*CHECKME or != ?*/); insertSprite(_klayman); insertStaticSprite(0x3A01A020, 200); @@ -823,7 +825,7 @@ void Scene2402::playPipeSound(uint32 fileHash) { Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - Sprite *tempSprite; + Sprite *tempSprite1, *tempSprite2, *tempSprite3; _surfaceFlag = true; SetMessageHandler(&Scene2403::handleMessage); @@ -837,34 +839,34 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) _asLightCord->setClipRect(0, 25, 640, 480); if (which < 0) { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(220, 449); setMessageList(0x004B5C98); setRectList(0x004B5E18); } else if (which == 1) { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(433, 449); setMessageList(0x004B5D70); setRectList(0x004B5E18); } else if (which == 2) { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(440, 449); _klayman->setDoDeltaX(1); setMessageList(0x004B5C98); setRectList(0x004B5E18); } else { - _flag1 = true; + _isClimbingLadder = true; insertKlayman(122, 599); setMessageList(0x004B5CA0); setRectList(0x004B5E28); } _ssButton = insertSprite(this, 0x3130B0EB, 100, 0); - _sprite1 = insertStaticSprite(0x20C24220, 1100); - _sprite2 = insertStaticSprite(0x03080900, 1300); - tempSprite = insertSprite(_klayman); - tempSprite->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, _sprite2->getDrawRect().y2()); + tempSprite1 = insertStaticSprite(0x20C24220, 1100); + tempSprite2 = insertStaticSprite(0x03080900, 1300); + tempSprite3 = insertSprite(_klayman); + tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); + _klayman->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); loadSound(1, calcHash("fxFogHornSoft")); @@ -881,11 +883,11 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - _flag1 = true; + _isClimbingLadder = true; setRectList(0x004B5E28); break; case 0x2001: - _flag1 = false; + _isClimbingLadder = false; setRectList(0x004B5E18); break; case 0x480B: @@ -905,7 +907,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4826: - if (sender == _asTape && !_flag1) { + if (sender == _asTape && !_isClimbingLadder) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B5D98); } @@ -917,7 +919,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - Sprite *tempSprite; + Sprite *tempSprite1, *tempSprite2; if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) { setGlobalVar(0x13382860, 2); @@ -937,58 +939,58 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - tempSprite = insertStaticSprite(0x19625293, 1100); + tempSprite2 = insertStaticSprite(0x19625293, 1100); _clipRects[0].x1 = 0; _clipRects[0].y1 = 0; - _clipRects[0].x2 = tempSprite->getDrawRect().x2(); + _clipRects[0].x2 = tempSprite2->getDrawRect().x2(); _clipRects[0].y2 = 480; if (getGlobalVar(0x18890C91)) { setBackground(0x1A0B0304); setPalette(0x1A0B0304); - _sprite1 = insertStaticSprite(0x32923922, 1100); + tempSprite1 = insertStaticSprite(0x32923922, 1100); } else { setBackground(0x0A038595); setPalette(0x0A038595); - _sprite1 = insertStaticSprite(0x1712112A, 1100); + tempSprite1 = insertStaticSprite(0x1712112A, 1100); } - tempSprite = insertStaticSprite(0x22300924, 1300); + tempSprite2 = insertStaticSprite(0x22300924, 1300); - _clipRects[1].x1 = _sprite1->getDrawRect().x; - _clipRects[1].y1 = tempSprite->getDrawRect().y; + _clipRects[1].x1 = tempSprite1->getDrawRect().x; + _clipRects[1].y1 = tempSprite2->getDrawRect().y; _clipRects[1].x2 = 640; _clipRects[1].y2 = 480; if (which < 0) { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(307, 404, _clipRects, 2); setMessageList(0x004B76C8); setRectList(0x004B78C8); } else if (which == 1) { - _flag1 = true; + _isClimbingLadder = true; insertKlayman(253, -16, _clipRects, 2); setMessageList(0x004B76D8); setRectList(0x004B78D8); } else if (which == 2) { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(480, 404, _clipRects, 2); setMessageList(0x004B77C0); setRectList(0x004B78C8); } else if (which == 3) { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(387, 404, _clipRects, 2); setMessageList(0x004B7810); setRectList(0x004B78C8); } else { - _flag1 = false; + _isClimbingLadder = false; insertKlayman(0, 404, _clipRects, 2); setMessageList(0x004B76D0); setRectList(0x004B78C8); } - tempSprite = insertSprite(_klayman); - tempSprite->setClipRect(_clipRects[1]); + tempSprite2 = insertSprite(_klayman); + tempSprite2->setClipRect(_clipRects[1]); } @@ -1005,18 +1007,18 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - _flag1 = true; + _isClimbingLadder = true; setRectList(0x004B78D8); break; case 0x2001: - _flag1 = false; + _isClimbingLadder = false; setRectList(0x004B78C8); break; case 0x4826: - if (sender == _asTape && !_flag1) { + if (sender == _asTape && !_isClimbingLadder) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B77C8); - } else if (sender == _asKey && !_flag1) { + } else if (sender == _asKey && !_isClimbingLadder) { sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004B77D8); } diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 2fa7a9a4be..8074c58dba 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -141,7 +141,6 @@ public: Scene2402(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Scene2402(); protected: - Sprite *_sprite1; Sprite *_asDoor; Sprite *_ssButton; Sprite *_asTape; @@ -158,13 +157,11 @@ class Scene2403 : public Scene { public: Scene2403(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_sprite1; - Sprite *_sprite2; Sprite *_ssButton; Sprite *_asTape; Sprite *_asKey; Sprite *_asLightCord; - bool _flag1; + bool _isClimbingLadder; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -172,11 +169,10 @@ class Scene2406 : public Scene { public: Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_sprite1; Sprite *_asTape; Sprite *_asKey; NRect _clipRects[2]; - bool _flag1; + bool _isClimbingLadder; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 1da6b95af9d94ba5e8ceb6ce03467c3627022a48 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 11:11:23 +0000 Subject: NEVERHOOD: Work on Module2500: - Remove Class541 and Class542 and instead use AsCommonIdleCarLower and AsCommonIdleCarFull - Some renaming --- engines/neverhood/gamemodule.cpp | 4 +-- engines/neverhood/module1600.cpp | 12 ++++---- engines/neverhood/module1600.h | 8 +++--- engines/neverhood/module2500.cpp | 59 ++++++++++++++++------------------------ engines/neverhood/module2500.h | 20 ++++---------- 5 files changed, 40 insertions(+), 63 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7fa6906399..066c4b4bbf 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,8 +309,8 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 2; - createModule(2400, -1); + _vm->gameState().sceneNum = 3; + createModule(2500, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index d324130a53..9d965101e5 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1031,7 +1031,7 @@ void AsScene1608Door::stCloseDoorDone() { stopAnimation(); } -AsScene1608IdleCarLower::AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y) +AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { setDoDeltaX(1); @@ -1039,7 +1039,7 @@ AsScene1608IdleCarLower::AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, i _newStickFrameIndex = 1; } -AsScene1608IdleCarFull::AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y) +AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { setDoDeltaX(1); @@ -1124,8 +1124,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x01600988); _sprite2 = insertStaticSprite(0x491F38A8, 1100); _asCar = createSprite(this, 375, 227); // Create but don't add to the sprite list yet - _asIdleCarLower = insertSprite(375, 227); - _asIdleCarFull = insertSprite(375, 227); + _asIdleCarLower = insertSprite(375, 227); + _asIdleCarFull = insertSprite(375, 227); _asCar->setVisible(false); if (getGlobalVar(0xC0418A02)) { insertKlayman(373, 220); @@ -1168,8 +1168,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette("paPodRed", 65, 31, 65); insertMouse433(0x01600988); _asCar = insertSprite(this, 375, 227); - _asIdleCarLower = insertSprite(375, 227); - _asIdleCarFull = insertSprite(375, 227); + _asIdleCarLower = insertSprite(375, 227); + _asIdleCarFull = insertSprite(375, 227); _sprite2 = insertStaticSprite(0x491F38A8, 1100); _kmScene1608 = createSprite(this, 439, 220); // Special Klayman handling... sendMessage(_kmScene1608, 0x2032, 1); diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 3d6e831562..8c794e07a1 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -117,14 +117,14 @@ protected: void stCloseDoorDone(); }; -class AsScene1608IdleCarLower : public AnimatedSprite { +class AsCommonIdleCarLower : public AnimatedSprite { public: - AsScene1608IdleCarLower(NeverhoodEngine *vm, int16 x, int16 y); + AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y); }; -class AsScene1608IdleCarFull : public AnimatedSprite { +class AsCommonIdleCarFull : public AnimatedSprite { public: - AsScene1608IdleCarFull(NeverhoodEngine *vm, int16 x, int16 y); + AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y); }; class AsCommonCarConnector : public AnimatedSprite { diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 978695d26c..5d60a1743d 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/module2500.h" +#include "neverhood/module1600.h" namespace Neverhood { @@ -212,24 +213,10 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Enti } void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { + // TODO Move to module class? _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); } -Class541::Class541(NeverhoodEngine *vm, int16 x, int16 y) - : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { - - startAnimation(0x1209E09F, 1, -1); - _newStickFrameIndex = 1; - setDoDeltaX(1); -} - -Class542::Class542(NeverhoodEngine *vm, int16 x, int16 y) - : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { - - _newStickFrameIndex = 0; - setDoDeltaX(1); -} - Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -250,8 +237,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_class437); _asCar = createSprite(this, 211, 400); // Create but don't add to the sprite list yet - _class541 = insertSprite(211, 400); - _class542 = insertSprite(211, 400); + _asIdleCarLower = insertSprite(211, 400); + _asIdleCarFull = insertSprite(211, 400); insertStaticSprite(0xC42AC521, 1500); if (which < 0) { @@ -273,8 +260,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _kmScene2501->setDoDeltaX(1); SetMessageHandler(&Scene2501::hmRidingCar); SetUpdateHandler(&Scene2501::upRidingCar); - _class541->setVisible(false); - _class542->setVisible(false); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); _currTrackIndex = which; } else { insertKlayman(162, 393); @@ -334,8 +321,8 @@ void Scene2501::update() { _klaymanInCar = true; SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); - _class541->setVisible(false); - _class542->setVisible(false); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); _asCar->setVisible(true); sendMessage(_asCar, 0x2009, 0); _asCar->handleUpdate(); @@ -371,8 +358,8 @@ void Scene2501::upGettingOutOfCar() { SetMessageHandler(&Scene2501::handleMessage); SetUpdateHandler(&Scene2501::update); setRectList(0x004B2608); - _class541->setVisible(true); - _class542->setVisible(true); + _asIdleCarLower->setVisible(true); + _asIdleCarFull->setVisible(true); _asCar->setVisible(false); setMessageList(0x004B2570); runMessageList(); @@ -498,8 +485,8 @@ void Scene2501::updateKlaymanCliprect() { _kmScene2501->setClipRect(0, 0, 640, 388); } -Class450::Class450(NeverhoodEngine *vm) - : StaticSprite(vm, 1400), _countdown(0), _flag1(false) { +SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) + : StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) { _spriteResource.load2(0x070220D9); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -517,16 +504,16 @@ Class450::Class450(NeverhoodEngine *vm) loadSound(1, 0x408C0034); loadSound(2, 0x44043000); loadSound(3, 0x44045000); - SetMessageHandler(&Class450::handleMessage); - SetUpdateHandler(&Class450::update); + SetMessageHandler(&SsScene2504Button::handleMessage); + SetUpdateHandler(&SsScene2504Button::update); } -void Class450::update() { +void SsScene2504Button::update() { StaticSprite::update(); - if (_flag1 && !isSoundPlaying(0) && !isSoundPlaying(1)) { + if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) { playSound(3); setVisible(false); - _flag1 = false; + _isSoundPlaying = false; } if (_countdown != 0 && (--_countdown) == 0) { if (getSubVar(0x14800353, 0x01180951)) { @@ -534,15 +521,15 @@ void Class450::update() { } else { playSound(1); } - _flag1 = true; + _isSoundPlaying = true; } } -uint32 Class450::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (_countdown == 0 && !_flag1) { + if (_countdown == 0 && !_isSoundPlaying) { setVisible(true); _countdown = 2; if (getSubVar(0x14800353, 0x01180951)) { @@ -561,13 +548,13 @@ uint32 Class450::handleMessage(int messageNum, const MessageParam ¶m, Entity Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - Sprite *class450; + Sprite *ssButton; _surfaceFlag = true; setBackground(0x90791B80); setPalette(0x90791B80); - class450 = insertSprite(); - _vm->_collisionMan->addSprite(class450); + ssButton = insertSprite(); + _vm->_collisionMan->addSprite(ssButton); insertMouse435(0x91B8490F, 20, 620); SetMessageHandler(&Scene2504::handleMessage); SetUpdateHandler(&Scene::update); diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index e5b915761a..60f762fb65 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -46,16 +46,6 @@ protected: void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; -class Class541 : public AnimatedSprite { -public: - Class541(NeverhoodEngine *vm, int16 x, int16 y); -}; - -class Class542 : public AnimatedSprite { -public: - Class542(NeverhoodEngine *vm, int16 x, int16 y); -}; - class Scene2501 : public Scene { public: Scene2501(NeverhoodEngine *vm, Module *parentModule, int which); @@ -66,8 +56,8 @@ protected: Sprite *_class517; Sprite *_class519; Sprite *_class520; - Sprite *_class541; - Sprite *_class542; + Sprite *_asIdleCarLower; + Sprite *_asIdleCarFull; Klayman *_kmScene2501; NPointArray *_trackPoints; SceneInfo2700 *_sceneInfos[3]; @@ -89,12 +79,12 @@ protected: void updateKlaymanCliprect(); }; -class Class450 : public StaticSprite { +class SsScene2504Button : public StaticSprite { public: - Class450(NeverhoodEngine *vm); + SsScene2504Button(NeverhoodEngine *vm); protected: int _countdown; - bool _flag1; + bool _isSoundPlaying; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From fcbab805079bff0b55cfdda51eb0ba15d6a2f228 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 11:53:01 +0000 Subject: NEVERHOOD: Rename stuff in Module2700 (also in Module2500 which uses some of it) --- engines/neverhood/gamemodule.cpp | 5 ++- engines/neverhood/module2500.cpp | 10 ++--- engines/neverhood/module2500.h | 8 ++-- engines/neverhood/module2700.cpp | 96 ++++++++++++++++++++-------------------- engines/neverhood/module2700.h | 49 ++++++++++---------- 5 files changed, 85 insertions(+), 83 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 066c4b4bbf..68a59def97 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -309,8 +309,9 @@ void GameModule::startup() { #if 1 - _vm->gameState().sceneNum = 3; - createModule(2500, -1); + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 1; + createModule(2700, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 5d60a1743d..f8053d2482 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -233,8 +233,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette("paKlayRed", 0, 64, 0); insertMouse433(0xE81111B0); - _class437 = createSprite(0x99BE9015); // Don't add this to the sprite list - addEntity(_class437); + _ssTrackShadowBackground = createSprite(0x99BE9015); // Don't add this to the sprite list + addEntity(_ssTrackShadowBackground); _asCar = createSprite(this, 211, 400); // Create but don't add to the sprite list yet _asIdleCarLower = insertSprite(211, 400); @@ -276,9 +276,9 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _currTrackIndex = 0; } - _class517 = insertSprite(_asCar, _class437->getSurface(), 4); - _class520 = insertSprite(_asCar, _class437->getSurface(), 4); - _class519 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); insertSprite(_asCar); _pointListsCount = 3; diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index 60f762fb65..3e018f950c 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -52,10 +52,10 @@ public: virtual ~Scene2501(); protected: AsCommonCar *_asCar; - Sprite *_class437; - Sprite *_class517; - Sprite *_class519; - Sprite *_class520; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarConnectorShadow; + Sprite *_asCarTrackShadow; Sprite *_asIdleCarLower; Sprite *_asIdleCarFull; Klayman *_kmScene2501; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index ec0ddf00b3..73ea264392 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -498,7 +498,7 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); } -static const NPoint kClass517Points[] = { +static const NPoint kCarShadowOffsets[] = { {-63, 3}, {-48, 40}, {-33, 58}, @@ -511,7 +511,7 @@ static const NPoint kClass517Points[] = { { 26, 25} }; -Class437::Class437(NeverhoodEngine *vm, uint32 fileHash) +SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash) : StaticSprite(vm, 0) { _spriteResource.load2(fileHash); @@ -523,20 +523,20 @@ Class437::Class437(NeverhoodEngine *vm, uint32 fileHash) StaticSprite::update(); } -Class517::Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index) +AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index) : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) { - SetUpdateHandler(&Class517::update); + SetUpdateHandler(&AsCommonCarShadow::update); createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource updateShadow(); } -void Class517::update() { +void AsCommonCarShadow::update() { updateShadow(); AnimatedSprite::update(); } -void Class517::updateShadow() { +void AsCommonCarShadow::updateShadow() { if (_asCar->getFrameIndex() != _currFrameIndex || _asCar->getCurrAnimFileHash() != _animFileHash) { uint32 fileHash = _asCar->getCurrAnimFileHash(); if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 || @@ -548,8 +548,8 @@ void Class517::updateShadow() { } _animFileHash = fileHash; } - _x = _asCar->getX() + kClass517Points[_index].x; - _y = _asCar->getY() + kClass517Points[_index].y; + _x = _asCar->getX() + kCarShadowOffsets[_index].x; + _y = _asCar->getY() + kCarShadowOffsets[_index].y; if (!_asCar->getVisible()) { startAnimation(0x1209E09F, 0, -1); _newStickFrameIndex = 0; @@ -557,31 +557,31 @@ void Class517::updateShadow() { setDoDeltaX(_asCar->isDoDeltaX() ? 1 : 0); } -Class519::Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index) +AsCommonCarConnectorShadow::AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index) : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index) { - SetUpdateHandler(&Class519::update); + SetUpdateHandler(&AsCommonCarConnectorShadow::update); createShadowSurface1(shadowSurface, 0x60281C10, 150); startAnimation(0x60281C10, -1, -1); _newStickFrameIndex = -2; } -void Class519::update() { - _x = _asCar->getX() + kClass517Points[_index].x; - _y = _asCar->getY() + kClass517Points[_index].y; +void AsCommonCarConnectorShadow::update() { + _x = _asCar->getX() + kCarShadowOffsets[_index].x; + _y = _asCar->getY() + kCarShadowOffsets[_index].y; AnimatedSprite::update(); } -Class520::Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex) +AsCommonCarTrackShadow::AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex) : AnimatedSprite(vm, 1100), _asCar(asCar) { - SetUpdateHandler(&Class520::update); + SetUpdateHandler(&AsCommonCarTrackShadow::update); createShadowSurface1(shadowSurface, 0x0759129C, 100); startAnimation(0x0759129C, frameIndex, -1); _newStickFrameIndex = frameIndex; } -void Class520::update() { +void AsCommonCarTrackShadow::update() { _x = _asCar->getX(); _y = _asCar->getY(); AnimatedSprite::update(); @@ -590,6 +590,8 @@ void Class520::update() { Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { + Sprite *tempSprite; + NRect clipRect; SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240); setGlobalVar(0x21E60190, 1); @@ -604,21 +606,21 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B08180); - _sprite1 = insertStaticSprite(0x1E086325, 1200); + tempSprite = insertStaticSprite(0x1E086325, 1200); - clipRect.set(0, 0, 640, _sprite1->getDrawRect().x2()); + clipRect.set(0, 0, 640, tempSprite->getDrawRect().x2()); if (sceneInfo->class437Filename) { - _class437 = createSprite(sceneInfo->class437Filename); - addEntity(_class437); + _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); + addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); - _class517 = insertSprite(_asCar, _class437->getSurface(), 4); - _class520 = insertSprite(_asCar, _class437->getSurface(), 4); - _class519 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); } else { - _class437 = NULL; + _ssTrackShadowBackground = NULL; _asCar = insertSprite(this, 320, 240); } @@ -720,14 +722,14 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B04180); - _class437 = createSprite(0x12002035); - addEntity(_class437); + _ssTrackShadowBackground = createSprite(0x12002035); + addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); - _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); insertSprite(_asCar); - _class520 = insertSprite(_asCar, _class437->getSurface(), 4); - _class519 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); _dataResource.load(0x04310014); @@ -897,16 +899,16 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 if (sceneInfo->class437Filename) { - _class437 = createSprite(sceneInfo->class437Filename); - addEntity(_class437); + _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); + addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); - _class517 = insertSprite(_asCar, _class437->getSurface(), 4); - _class520 = insertSprite(_asCar, _class437->getSurface(), 4); - _class519 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); } else { - _class437 = NULL; - _class517 = NULL; + _ssTrackShadowBackground = NULL; + _asCarShadow = NULL; _asCar = insertSprite(this, 320, 240); } @@ -942,12 +944,12 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 if (clipRect) { _asCar->getClipRect() = *clipRect; - if (_class517) - _class517->getClipRect() = *clipRect; - if (_class520) - _class520->getClipRect() = *clipRect; - if (_class519) - _class519->getClipRect() = *clipRect; + if (_asCarShadow) + _asCarShadow->getClipRect() = *clipRect; + if (_asCarTrackShadow) + _asCarTrackShadow->getClipRect() = *clipRect; + if (_asCarConnectorShadow) + _asCarConnectorShadow->getClipRect() = *clipRect; if (_asCarConnector) _asCarConnector->getClipRect() = *clipRect; } @@ -1001,14 +1003,14 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x08B8C180); - _class437 = createSprite(0x18808B88); - addEntity(_class437); + _ssTrackShadowBackground = createSprite(0x18808B88); + addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); - _class517 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); _asCarConnector = insertSprite(_asCar); - _class520 = insertSprite(_asCar, _class437->getSurface(), 4); - _class519 = insertSprite(_asCar, _class437->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); _dataResource.load(0x06000162); diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index b2210c5d49..4274bcce05 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -49,14 +49,14 @@ protected: void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; -class Class437 : public StaticSprite { +class SsCommonTrackShadowBackground : public StaticSprite { public: - Class437(NeverhoodEngine *vm, uint32 fileHash); + SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash); }; -class Class517 : public AnimatedSprite { +class AsCommonCarShadow : public AnimatedSprite { public: - Class517(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index); + AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index); protected: uint _index; AnimatedSprite *_asCar; @@ -65,18 +65,18 @@ protected: void updateShadow(); }; -class Class519 : public AnimatedSprite { +class AsCommonCarConnectorShadow : public AnimatedSprite { public: - Class519(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index); + AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index); protected: uint _index; Sprite *_asCar; void update(); }; -class Class520 : public AnimatedSprite { +class AsCommonCarTrackShadow : public AnimatedSprite { public: - Class520(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex); + AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex); protected: Sprite *_asCar; void update(); @@ -87,12 +87,11 @@ public: Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); protected: AsCommonCar *_asCar; - Sprite *_class437; - Sprite *_class517; - Sprite *_class520; - Sprite *_class519; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; Sprite *_asCarConnector; - Sprite *_sprite1; int _which1, _which2; NPointArray *_trackPoints; uint32 handleMessage42F500(int messageNum, const MessageParam ¶m, Entity *sender); @@ -104,10 +103,10 @@ public: Scene2702(NeverhoodEngine *vm, Module *parentModule, int which); protected: AsCommonCar *_asCar; - Sprite *_class437; - Sprite *_class517; - Sprite *_class520; - Sprite *_class519; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; int16 _newTrackDestX; int _currTrackIndex, _newTrackIndex; int _count; @@ -127,11 +126,11 @@ public: const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); protected: AsCommonCar *_asCar; - Sprite *_class437; - Sprite *_class517; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; Sprite *_asCarConnector; - Sprite *_class520; - Sprite *_class519; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; int _which1, _which2; NPointArray *_trackPoints; NRectArray *_rectList; @@ -144,11 +143,11 @@ public: Scene2706(NeverhoodEngine *vm, Module *parentModule, int which); protected: AsCommonCar *_asCar; - Sprite *_class437; - Sprite *_class517; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; Sprite *_asCarConnector; - Sprite *_class520; - Sprite *_class519; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; int16 _newTrackDestX; int _currTrackIndex, _newTrackIndex; NPointArray *_trackPoints; -- cgit v1.2.3 From 5aee04b127f96305542d7b37d33f57c5dfc0f9ec Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 17:27:44 +0000 Subject: NEVERHOOD: Work on Module2800: - Rename KmScene2803b to KmScene2803Small; Scene2803b to Scene2803Small - Rename lots of stuff --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/klayman.cpp | 4 +- engines/neverhood/klayman.h | 4 +- engines/neverhood/module2800.cpp | 397 +++++++++++++++++++-------------------- engines/neverhood/module2800.h | 78 ++++---- 5 files changed, 241 insertions(+), 246 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 68a59def97..5bcd29a25b 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -310,8 +310,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 1; - createModule(2700, -1); + _vm->gameState().sceneNum = 11; + createModule(2800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 90ba8aab4c..ee4bfe1b82 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -5698,13 +5698,13 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2803b::KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { _dataResource.load(0x81120132); } -uint32 KmScene2803b::xHandleMessage(int messageNum, const MessageParam ¶m) { +uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x4001: case 0x4800: diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 90e71de22d..1ac4519fc4 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -692,9 +692,9 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; -class KmScene2803b : public Klayman { +class KmScene2803Small : public Klayman { public: - KmScene2803b(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 95e2c3e1b6..1ec23e0153 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -78,7 +78,7 @@ void Module2800::createScene(int sceneNum, int which) { _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); //setGlobalVar(0x1860C990,1);//DEBUG if (getGlobalVar(0x1860C990)) - _childObject = new Scene2803b(_vm, this, which); + _childObject = new Scene2803Small(_vm, this, which); else _childObject = new Scene2803(_vm, this, which); break; @@ -477,27 +477,27 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), - _flag1(false), _flag2(false) { + _isPulled(false), _isBusy(false) { createSurface(1010, 640, 480); // TODO Use correct size from the two hashes SetUpdateHandler(&AnimatedSprite::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); _x = x; _y = y; - sub4343C0(); + stIdle(); } uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (!_flag2 && param.asInteger() == calcHash("ClickSwitch")) { + if (!_isBusy && param.asInteger() == calcHash("ClickSwitch")) { sendMessage(_parentScene, 0x480F, 0); playSound(0, 0x4E1CA4A0); } break; case 0x480F: - sub434380(); + stPulled(); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -509,7 +509,7 @@ uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam &p return messageResult; } -uint32 AsScene2803LightCord::handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2803LightCord::hmPulled(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -519,16 +519,16 @@ uint32 AsScene2803LightCord::handleMessage434340(int messageNum, const MessagePa return messageResult; } -void AsScene2803LightCord::sub434380() { - _flag2 = false; - _flag1 = true; +void AsScene2803LightCord::stPulled() { + _isBusy = false; + _isPulled = true; startAnimation(_fileHash2, 0, -1); - SetMessageHandler(&AsScene2803LightCord::handleMessage434340); - NextState(&AsScene2803LightCord::sub4343C0); + SetMessageHandler(&AsScene2803LightCord::hmPulled); + NextState(&AsScene2803LightCord::stIdle); } -void AsScene2803LightCord::sub4343C0() { - _flag1 = false; +void AsScene2803LightCord::stIdle() { + _isPulled = false; startAnimation(_fileHash1, 0, -1); SetMessageHandler(&AsScene2803LightCord::handleMessage); } @@ -536,9 +536,9 @@ void AsScene2803LightCord::sub4343C0() { void AsScene2803LightCord::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHash1 = fileHash1; _fileHash2 = fileHash2; - if (_flag1) { + if (_isPulled) { startAnimation(_fileHash2, _currFrameIndex, -1); - _flag2 = true; + _isBusy = true; } else { startAnimation(_fileHash1, 0, -1); } @@ -575,7 +575,7 @@ AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); SetMessageHandler(&AsScene2803Rope::handleMessage); startAnimation(0x9D098C23, 35, 53); - NextState(&AsScene2803Rope::sub476A70); + NextState(&AsScene2803Rope::stReleased); _x = x; _y = -276; } @@ -585,7 +585,7 @@ uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x3002: startAnimation(0x9D098C23, 50, -1); - SetMessageHandler(&AsScene2803Rope::handleMessage4769E0); + SetMessageHandler(&AsScene2803Rope::hmReleased); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -597,7 +597,7 @@ uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 AsScene2803Rope::handleMessage4769E0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2803Rope::hmReleased(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -613,7 +613,7 @@ uint32 AsScene2803Rope::handleMessage4769E0(int messageNum, const MessageParam & return messageResult; } -void AsScene2803Rope::sub476A70() { +void AsScene2803Rope::stReleased() { startAnimation(0x8258A030, 0, 1); NextState(&AsScene2803Rope::stHide); } @@ -624,7 +624,7 @@ void AsScene2803Rope::stHide() { } Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _field134(0) { + : Scene(vm, parentModule, true), _paletteArea(0) { static const uint32 kScene2803FileHashes1[] = { 0, @@ -648,7 +648,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x00900849); _surfaceFlag = true; - + _background = new DirtyBackground(_vm, 0); _background->createSurface(0, 640, 480); addBackground(_background); @@ -682,75 +682,75 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) _sprite9 = (StaticSprite*)insertStaticSprite(0x341A0237, 1100); _sprite10 = insertStaticSprite(0x855820A3, 1200); - _clipRects1[0].x1 = 0; - _clipRects1[0].y1 = 0; - _clipRects1[0].x2 = 640; - _clipRects1[0].y2 = _sprite8->getDrawRect().y2(); + _clipRectsFloor[0].x1 = 0; + _clipRectsFloor[0].y1 = 0; + _clipRectsFloor[0].x2 = 640; + _clipRectsFloor[0].y2 = _sprite8->getDrawRect().y2(); - _clipRects1[1].x1 = _sprite8->getDrawRect().x2(); - _clipRects1[1].y1 = _sprite8->getDrawRect().y2(); - _clipRects1[1].x2 = 640; - _clipRects1[1].y2 = 480; + _clipRectsFloor[1].x1 = _sprite8->getDrawRect().x2(); + _clipRectsFloor[1].y1 = _sprite8->getDrawRect().y2(); + _clipRectsFloor[1].x2 = 640; + _clipRectsFloor[1].y2 = 480; - _clipRects2[0].x1 = _sprite5->getDrawRect().x; - _clipRects2[0].y1 = 0; - _clipRects2[0].x2 = _sprite5->getDrawRect().x2(); - _clipRects2[0].y2 = _sprite5->getDrawRect().y2(); + _clipRectsStairs[0].x1 = _sprite5->getDrawRect().x; + _clipRectsStairs[0].y1 = 0; + _clipRectsStairs[0].x2 = _sprite5->getDrawRect().x2(); + _clipRectsStairs[0].y2 = _sprite5->getDrawRect().y2(); - _clipRects2[1].x1 = _sprite6->getDrawRect().x; - _clipRects2[1].y1 = 0; - _clipRects2[1].x2 = _sprite3->getDrawRect().x; - _clipRects2[1].y2 = _sprite6->getDrawRect().y2(); + _clipRectsStairs[1].x1 = _sprite6->getDrawRect().x; + _clipRectsStairs[1].y1 = 0; + _clipRectsStairs[1].x2 = _sprite3->getDrawRect().x; + _clipRectsStairs[1].y2 = _sprite6->getDrawRect().y2(); - _clipRects2[2].x1 = _sprite3->getDrawRect().x; - _clipRects2[2].y1 = 0; - _clipRects2[2].x2 = _sprite4->getDrawRect().x2(); - _clipRects2[2].y2 = 480; + _clipRectsStairs[2].x1 = _sprite3->getDrawRect().x; + _clipRectsStairs[2].y1 = 0; + _clipRectsStairs[2].x2 = _sprite4->getDrawRect().x2(); + _clipRectsStairs[2].y2 = 480; if (which < 0) { - insertKlayman(302, 445, _clipRects1, 2); + insertKlayman(302, 445, _clipRectsFloor, 2); setMessageList(0x004B79F0); - sub476090(); + klaymanFloor(); } else if (which == 1) { - insertKlayman(200, 445, _clipRects1, 2); + insertKlayman(200, 445, _clipRectsFloor, 2); setMessageList(0x004B79C8); - sub476090(); + klaymanFloor(); } else if (which == 3) { NPoint pt = _dataResource.getPoint(0xC2A08694); - insertKlayman(pt.x, pt.y, _clipRects2, 3); + insertKlayman(pt.x, pt.y, _clipRectsStairs, 3); setMessageList(0x004B7A00); - sub475FF0(); + klaymanStairs(); } else if (which == 5) { - insertKlayman(253, 298, _clipRects2, 3); + insertKlayman(253, 298, _clipRectsStairs, 3); setMessageList(0x004B7A00); - sub475FF0(); + klaymanStairs(); } else if (which == 6) { _asRope = insertSprite(this, 384); _asRope->setClipRect(0, 25, 640, 480); - insertKlayman(384, 0, _clipRects1, 2); + insertKlayman(384, 0, _clipRectsFloor, 2); sendEntityMessage(_klayman, 0x1014, _asRope); _klayman->setClipRect(0, 25, 640, 480); setMessageList(0x004B7A78); - sub476090(); + klaymanFloor(); } else if (which == 2) { - insertKlayman(400, 445, _clipRects1, 2); + insertKlayman(400, 445, _clipRectsFloor, 2); setMessageList(0x004B79F8); - sub476090(); + klaymanFloor(); } else { - insertKlayman(50, 231, _clipRects2, 3); + insertKlayman(50, 231, _clipRectsStairs, 3); setMessageList(0x004B79C0); - sub475FF0(); + klaymanStairs(); } - sub476180(); + changeBackground(); } -void Scene2803::update475E40() { +void Scene2803::upKlaymanStairs() { if (_klayman->getX() < 350) { - sub4765D0(); + setPaletteArea0(); } else { - sub4765F0(); + setPaletteArea1(); } Scene::update(); } @@ -759,7 +759,7 @@ uint32 Scene2803::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x480F: - sub476130(); + toggleBackground(); // NOTE Intentional fall-through case 0x100D: if (param.asInteger() == 0x84251F82) @@ -777,20 +777,20 @@ uint32 Scene2803::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B7A88); break; case 0x482A: - sub475FF0(); - sub4765F0(); + klaymanStairs(); + setPaletteArea1(); break; case 0x482B: - sub476090(); - sub4765D0(); + klaymanFloor(); + setPaletteArea0(); break; } return messageResult; } -void Scene2803::sub475FF0() { - SetUpdateHandler(&Scene2803::update475E40); - // TODO _klayman->setClipRects(_clipRects2, 3); +void Scene2803::klaymanStairs() { + SetUpdateHandler(&Scene2803::upKlaymanStairs); + _klayman->getSurface()->setClipRects(_clipRectsStairs, 3); sendMessage(_klayman, 0x482C, 0xE5A48297); _sprite3->setVisible(true); _sprite4->setVisible(true); @@ -801,9 +801,9 @@ void Scene2803::sub475FF0() { _sprite9->setVisible(false); } -void Scene2803::sub476090() { +void Scene2803::klaymanFloor() { SetUpdateHandler(&Scene::update); - // TODO _klayman->setClipRects(_clipRects1, 2); + _klayman->getSurface()->setClipRects(_clipRectsFloor, 2); sendMessage(_klayman, 0x482C, 0); _sprite3->setVisible(false); _sprite4->setVisible(false); @@ -814,12 +814,12 @@ void Scene2803::sub476090() { _sprite9->setVisible(true); } -void Scene2803::sub476130() { +void Scene2803::toggleBackground() { setGlobalVar(0x190A1D18, getGlobalVar(0x190A1D18) ? 0 : 1); - sub476180(); + changeBackground(); } -void Scene2803::sub476180() { +void Scene2803::changeBackground() { // TODO? g_screen->resetDirtyRects(); if (getGlobalVar(0x190A1D18)) { _asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D); @@ -892,46 +892,46 @@ void Scene2803::sub476180() { } _sprite10->setVisible(false); } - sub476610(); + updatePaletteArea(); } -void Scene2803::sub4765D0() { - if (_field134) { - _field134 = 0; - sub476610(); +void Scene2803::setPaletteArea0() { + if (_paletteArea != 0) { + _paletteArea = 0; + updatePaletteArea(); } } -void Scene2803::sub4765F0() { - if (!_field134) { - _field134 = 1; - sub476610(); +void Scene2803::setPaletteArea1() { + if (_paletteArea != 1) { + _paletteArea = 1; + updatePaletteArea(); } } -void Scene2803::sub476610() { +void Scene2803::updatePaletteArea() { uint32 fadePaletteHash; if (getGlobalVar(0x190A1D18)) - fadePaletteHash = _field134 ? 0xB103B604 : 0x412A423E; + fadePaletteHash = (_paletteArea == 1) ? 0xB103B604 : 0x412A423E; else - fadePaletteHash = _field134 ? 0x0263D144 : 0x29800A01; + fadePaletteHash = (_paletteArea == 1) ? 0x0263D144 : 0x29800A01; _palette->addBasePalette(fadePaletteHash, 0, 64, 0); _palette->startFadeToPalette(12); } -Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _palStatus(0) { +Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _paletteArea(0) { - static const uint32 kScene2803bFileHashes1[] = { + static const uint32 kScene2803SmallFileHashes1[] = { 0, 0x081000F1, 0x08100171, 0x08100271 }; - static const uint32 kScene2803bFileHashes2[] = { + static const uint32 kScene2803SmallFileHashes2[] = { 0, 0x286800D4, 0x286806D4, 0x28680AD4 }; _surfaceFlag = true; - SetMessageHandler(&Scene2803b::handleMessage); + SetMessageHandler(&Scene2803Small::handleMessage); loadDataResource(0x81120132); insertMouse433(0x00A05290); @@ -954,7 +954,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) if (getSubVar(0x0C601058, 0) == 0) insertStaticSprite(0x66121222, 100); else - insertSprite(kScene2803bFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326); + insertSprite(kScene2803SmallFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326); if (getSubVar(0x0C601058, 1) == 3) insertStaticSprite(0x64330236, 100); @@ -980,7 +980,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) if (getSubVar(0x0C601058, 0) == 0) insertStaticSprite(0x50C027A8, 100); else - insertSprite(kScene2803bFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326); + insertSprite(kScene2803SmallFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326); if (getSubVar(0x0C601058, 1) == 3) insertStaticSprite(0xD48077A0, 100); @@ -994,35 +994,35 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) _sprite7->setVisible(false); if (which < 0) { - insertKlayman(479, 435); - sub460110(); + insertKlayman(479, 435); + klaymanFloor(); setMessageList(0x004B60D8); } else if (which == 3) { NPoint pt = _dataResource.getPoint(0x096520ED); - insertKlayman(pt.x, pt.y); - sub460090(); + insertKlayman(pt.x, pt.y); + klaymanSlope(); setMessageList(0x004B6100); _klayman->setRepl(64, 0); } else if (which == 4) { NPoint pt = _dataResource.getPoint(0x20C6238D); - insertKlayman(pt.x, pt.y); - sub460090(); + insertKlayman(pt.x, pt.y); + klaymanSlope(); setMessageList(0x004B60F8); _klayman->setRepl(64, 0); } else if (which == 5) { NPoint pt = _dataResource.getPoint(0x2146690D); - insertKlayman(pt.x, pt.y); - sub460090(); + insertKlayman(pt.x, pt.y); + klaymanSlope(); setMessageList(0x004B6100); _klayman->setRepl(64, 0); } else if (which == 2) { NPoint pt = _dataResource.getPoint(0x104C03ED); - insertKlayman(pt.x, pt.y); - sub460110(); + insertKlayman(pt.x, pt.y); + klaymanFloor(); setMessageList(0x004B6138); } else { - insertKlayman(135, 444); - sub460110(); + insertKlayman(135, 444); + klaymanFloor(); setMessageList(0x004B60E0, false); _sprite6->setVisible(true); _sprite7->setVisible(true); @@ -1030,7 +1030,7 @@ Scene2803b::Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which) } -uint32 Scene2803b::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1041,7 +1041,7 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam ¶m, Enti _klayman->setX(pt.x); _klayman->setY(pt.y); _klayman->processDelta(); - sub460110(); + klaymanFloor(); _klayman->setClipRect(517, 401, 536, 480); setMessageList(0x004B6198); } else if (param.asInteger() == 0xB00C7C48) { @@ -1055,7 +1055,7 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam ¶m, Enti _klayman->setX(560); _klayman->setY(315); _klayman->processDelta(); - sub460090(); + klaymanSlope(); setMessageList(0x004B61A0); } else if (param.asInteger() == 0x002CAA68) { setMessageList(0x004B61A8); @@ -1063,14 +1063,14 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam ¶m, Enti break; case 0x482A: if (_klayman->getX() < 200) { - sub4601D0(); + setPaletteArea3(); } else if (_klayman->getX() < 500) { setSurfacePriority(_sprite5->getSurface(), 1100); sendMessage(_klayman, 0x482C, 0); - sub4601B0(); + setPaletteArea2(); } else { _klayman->setClipRect(517, 401, 536, 480); - sub4601B0(); + setPaletteArea2(); } break; case 0x482B: @@ -1084,72 +1084,72 @@ uint32 Scene2803b::handleMessage(int messageNum, const MessageParam ¶m, Enti return 0; } -void Scene2803b::update45FCB0() { +void Scene2803Small::upKlaymanSlope() { if (_klayman->getX() < 388) { _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - sub460170(); + setPaletteArea0(); } else if (_klayman->getX() < 500) { _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); - sub460190(); + setPaletteArea1(); } Scene::update(); } -void Scene2803b::update45FD50() { +void Scene2803Small::upKlaymanFloor() { if (_klayman->getX() > 194 && _klayman->getX() < 273) - sub4601B0(); + setPaletteArea2(); else if (_klayman->getX() > 155 && _klayman->getX() < 300) - sub460170(); + setPaletteArea0(); Scene::update(); } -void Scene2803b::sub460090() { - SetUpdateHandler(&Scene2803b::update45FCB0); +void Scene2803Small::klaymanSlope() { + SetUpdateHandler(&Scene2803Small::upKlaymanSlope); sendMessage(_klayman, 0x482C, 0x23C630D9); _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); _klayman->setRepl(64, 0); _sprite1->setVisible(true); } -void Scene2803b::sub460110() { - SetUpdateHandler(&Scene2803b::update45FD50); +void Scene2803Small::klaymanFloor() { + SetUpdateHandler(&Scene2803Small::upKlaymanFloor); sendMessage(_klayman, 0x482C, 0x2086222D); _klayman->setClipRect(0, 0, 640, 480); _klayman->clearRepl(); _sprite1->setVisible(false); } -void Scene2803b::sub460170() { - if (_palStatus != 0) { - _palStatus = 0; - sub4601F0(false); +void Scene2803Small::setPaletteArea0() { + if (_paletteArea != 0) { + _paletteArea = 0; + updatePaletteArea(false); } } -void Scene2803b::sub460190() { - if (_palStatus != 1) { - _palStatus = 1; - sub4601F0(false); +void Scene2803Small::setPaletteArea1() { + if (_paletteArea != 1) { + _paletteArea = 1; + updatePaletteArea(false); } } -void Scene2803b::sub4601B0() { - if (_palStatus != 2) { - _palStatus = 2; - sub4601F0(false); +void Scene2803Small::setPaletteArea2() { + if (_paletteArea != 2) { + _paletteArea = 2; + updatePaletteArea(false); } } -void Scene2803b::sub4601D0() { - if (_palStatus != 3) { - _palStatus = 3; - sub4601F0(true); +void Scene2803Small::setPaletteArea3() { + if (_paletteArea != 3) { + _paletteArea = 3; + updatePaletteArea(true); } } -void Scene2803b::sub4601F0(bool flag) { +void Scene2803Small::updatePaletteArea(bool instantly) { if (getGlobalVar(0x190A1D18)) { - switch (_palStatus) { + switch (_paletteArea) { case 1: _palette->addBasePalette(0x0A938204, 0, 64, 0); break; @@ -1164,7 +1164,7 @@ void Scene2803b::sub4601F0(bool flag) { break; } } else { - switch (_palStatus) { + switch (_paletteArea) { case 2: _palette->addBasePalette(0x0263D144, 0, 64, 0); break; @@ -1176,11 +1176,7 @@ void Scene2803b::sub4601F0(bool flag) { break; } } - if (flag) { - _palette->startFadeToPalette(0); - } else { - _palette->startFadeToPalette(12); - } + _palette->startFadeToPalette(instantly ? 0 : 12); } SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) @@ -2441,10 +2437,11 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2808::update() { - // DEBUG: Show correct values + // DEBUG>>>: Show correct values debug("---------------"); debug("%03d %03d %03d", getSubVar(0x0C601058, 0), getSubVar(0x0C601058, 1), getSubVar(0x0C601058, 2)); debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); + // DEBUG<<< Scene::update(); if (_countdown != 0 && (--_countdown) == 0) { @@ -2699,7 +2696,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE438); setRectList(0x004AE810); - _flag1 = false; + _isRopingDown = false; _vm->_collisionMan->removeSprite(_asTape); } else { insertKlayman(300, 424, _clipRects, 2); @@ -2711,7 +2708,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertSprite(_klayman); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); _clipRects[0].y1 = _sprite1->getDrawRect().y; - _flag1 = false; + _isRopingDown = false; } } else if (which == 1) { insertKlayman(186, 64, _clipRects, 2); @@ -2719,7 +2716,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x84130112); tempSprite = insertSprite(_klayman); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); - _flag1 = true; + _isRopingDown = true; _clipRects[0].y1 = _sprite1->getDrawRect().y; } else if (which == 5) { insertStaticSprite(0xC3007EA0, 100); @@ -2734,7 +2731,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addSound(0x84400112, 0xC874EE6C); _vm->_soundMan->playSoundLooping(0xC874EE6C); _vm->_soundMan->setSoundVolume(0xC874EE6C, 50); - _flag1 = false; + _isRopingDown = false; } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { if (getGlobalVar(0x1860C990)) { insertKlayman((int16)getGlobalVar(0x00D30138), 448); @@ -2743,30 +2740,30 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE6D8); setRectList(0x004AE810); - _flag1 = false; + _isRopingDown = false; _vm->_collisionMan->removeSprite(_asTape); } else { - sub406650(); + insertKlaymanLadder(); if (getGlobalVar(0x00188211)) { setMessageList(0x004AE6E8); setGlobalVar(0x00188211, 0); - _flag1 = false; + _isRopingDown = false; } else { setMessageList(0x004AE6D8); - _flag1 = false; + _isRopingDown = false; } } } else if (which >= 15 && which <= 18) { - sub406650(); + insertKlaymanLadder(); setMessageList(0x004AE6E0); - _flag1 = false; + _isRopingDown = false; } else if (which == 4) { if (getGlobalVar(0x1860C990)) { insertKlayman(473, 448); _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE428); setRectList(0x004AE810); - _flag1 = false; + _isRopingDown = false; _vm->_collisionMan->removeSprite(_asTape); } else { insertKlayman(450, 424, _clipRects, 2); @@ -2778,14 +2775,14 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertSprite(_klayman); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); _clipRects[0].y1 = _sprite1->getDrawRect().y; - _flag1 = false; + _isRopingDown = false; } } else { insertKlayman(120, 448); _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE410); setRectList(0x004AE810); - _flag1 = false; + _isRopingDown = false; _vm->_collisionMan->removeSprite(_asTape); } @@ -2797,7 +2794,7 @@ Scene2810::~Scene2810() { _vm->_soundMan->deleteSoundGroup(0x84400112); } -void Scene2810::sub406650() { +void Scene2810::insertKlaymanLadder() { Sprite *tempSprite; if (getGlobalVar(0x00188211)) { @@ -2851,18 +2848,20 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004AE688); break; case 0x2000: + debug("0x2000"); setRectList(0x004AE800); - _flag1 = true; + _isRopingDown = true; break; case 0x2001: + debug("0x2001"); if (getGlobalVar(0x0018CA22)) loadDataResource(0x84130112); else loadDataResource(0x84500132); - _flag1 = false; + _isRopingDown = false; break; case 0x4826: - if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_flag1) { + if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_isRopingDown) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004AE750); } @@ -2919,7 +2918,7 @@ uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x4806: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - sub413E00(); + stRopingDown(); break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -2931,7 +2930,7 @@ uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam ¶m, return messageResult; } -uint32 AsScene2812Rope::handleMessage413DC0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene2812Rope::hmRopingDown(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -2941,10 +2940,10 @@ uint32 AsScene2812Rope::handleMessage413DC0(int messageNum, const MessageParam & return messageResult; } -void AsScene2812Rope::sub413E00() { +void AsScene2812Rope::stRopingDown() { sendMessage(_parentScene, 0x4806, 0); startAnimation(0x9D098C23, 0, -1); - SetMessageHandler(&AsScene2812Rope::handleMessage413DC0); + SetMessageHandler(&AsScene2812Rope::hmRopingDown); } AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm) @@ -2967,7 +2966,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa } Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _palStatus(0) { + : Scene(vm, parentModule, true), _paletteArea(0) { if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) setGlobalVar(0x13382860, 3); @@ -3003,19 +3002,19 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) _sprite4 = insertStaticSprite(0x08592134, 1100); if (which < 0) { - _flag1 = false; + _isRopingDown = false; insertKlayman(272, 432); setMessageList(0x004AF560); _sprite1->setVisible(false); _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); } else if (which == 1) { - _flag1 = false; + _isRopingDown = false; insertKlayman(338, 398); setMessageList(0x004AF588); - setPalStatus1(1); + setPaletteArea1(true); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); } else if (which == 2) { - _flag1 = false; + _isRopingDown = false; if (getGlobalVar(0xC0418A02)) { insertKlayman(554, 432); _klayman->setDoDeltaX(1); @@ -3026,10 +3025,10 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1->setVisible(false); _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); } else { - _flag1 = true; + _isRopingDown = true; insertKlayman(150, 582); setMessageList(0x004AF568); - setPalStatus2(1); + setPaletteArea2(true); _sprite1->setVisible(false); _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); } @@ -3040,9 +3039,9 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) void Scene2812::update() { if (_klayman->getX() < 220) - setPalStatus2(0); + setPaletteArea2(false); else if (_klayman->getX() < 240) - setPalStatus0(0); + setPaletteArea0(false); Scene::update(); } @@ -3054,12 +3053,12 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit sendEntityMessage(_klayman, 0x1014, _asRope); break; case 0x2001: - _flag1 = true; + _isRopingDown = true; setRectList(0x004AF710); _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2()); break; case 0x2002: - _flag1 = false; + _isRopingDown = false; setRectList(0x004AF700); _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); break; @@ -3068,21 +3067,21 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asTrapDoor, 0x2000, 0); break; case 0x4826: - if (sender == _ssTape && !_flag1) { + if (sender == _ssTape && !_isRopingDown) { sendEntityMessage(_klayman, 0x1014, _ssTape); setMessageList(0x004AF658); - } else if (sender == _asKey && !_flag1) { + } else if (sender == _asKey && !_isRopingDown) { sendEntityMessage(_klayman, 0x1014, _asKey); setMessageList(0x004AF668); } break; case 0x482A: - setPalStatus1(0); + setPaletteArea1(false); _sprite1->setVisible(true); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); break; case 0x482B: - setPalStatus0(false); + setPaletteArea0(false); _sprite1->setVisible(false); _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); break; @@ -3090,39 +3089,35 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -void Scene2812::setPalStatus0(int fadeTime) { - if (_palStatus != 0) { - _palStatus = 0; - setPalStatus(fadeTime); +void Scene2812::setPaletteArea0(bool instantly) { + if (_paletteArea != 0) { + _paletteArea = 0; + updatePaletteArea(instantly); } } -void Scene2812::setPalStatus1(int fadeTime) { - if (_palStatus != 1) { - _palStatus = 1; - setPalStatus(fadeTime); +void Scene2812::setPaletteArea1(bool instantly) { + if (_paletteArea != 1) { + _paletteArea = 1; + updatePaletteArea(instantly); } } -void Scene2812::setPalStatus2(int fadeTime) { - if (_palStatus != 2) { - _palStatus = 2; - setPalStatus(fadeTime); +void Scene2812::setPaletteArea2(bool instantly) { + if (_paletteArea != 2) { + _paletteArea = 2; + updatePaletteArea(instantly); } } -void Scene2812::setPalStatus(int fadeTime) { - if (_palStatus == 0) +void Scene2812::updatePaletteArea(bool instantly) { + if (_paletteArea == 0) _palette->addBasePalette(0x05D30F11, 0, 64, 0); - else if (_palStatus == 1) + else if (_paletteArea == 1) _palette->addBasePalette(0x92CA2C9B, 0, 64, 0); - else if (_palStatus == 2) + else if (_paletteArea == 2) _palette->addBasePalette(0x381F92C5, 0, 64, 0); - if (fadeTime > 0) { - _palette->startFadeToPalette(0); - } else { - _palette->startFadeToPalette(12); - } + _palette->startFadeToPalette(instantly ? 0 : 12); } Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 63177832ab..f0403f4990 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -57,15 +57,15 @@ protected: class AsScene2803LightCord : public AnimatedSprite { public: AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); - void sub434380(); - void sub4343C0(); + void stPulled(); + void stIdle(); void setFileHashes(uint32 fileHash1, uint32 fileHash2); protected: Scene *_parentScene; uint32 _fileHash1, _fileHash2; - bool _flag1, _flag2; + bool _isPulled, _isBusy; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage434340(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPulled(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene2803TestTubeOne : public AnimatedSprite { @@ -82,8 +82,8 @@ public: protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage4769E0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub476A70(); + uint32 hmReleased(int messageNum, const MessageParam ¶m, Entity *sender); + void stReleased(); void stHide(); }; @@ -104,25 +104,25 @@ protected: StaticSprite *_sprite8; StaticSprite *_sprite9; Sprite *_sprite10; - NRect _clipRects1[2]; - NRect _clipRects2[3]; - bool _field134; + NRect _clipRectsFloor[2]; + NRect _clipRectsStairs[3]; + int _paletteArea; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void update475E40(); - void sub475FF0(); - void sub476090(); - void sub476130(); - void sub476180(); - void sub4765D0(); - void sub4765F0(); - void sub476610(); + void upKlaymanStairs(); + void klaymanStairs(); + void klaymanFloor(); + void toggleBackground(); + void changeBackground(); + void setPaletteArea0(); + void setPaletteArea1(); + void updatePaletteArea(); }; -class Scene2803b : public Scene { +class Scene2803Small : public Scene { public: - Scene2803b(NeverhoodEngine *vm, Module *parentModule, int which); + Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which); protected: - int _palStatus; + int _paletteArea; Sprite *_sprite1; Sprite *_sprite2; Sprite *_sprite3; @@ -131,15 +131,15 @@ protected: Sprite *_sprite6; Sprite *_sprite7; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void update45FCB0(); - void update45FD50(); - void sub460090(); - void sub460110(); - void sub460170(); - void sub460190(); - void sub4601B0(); - void sub4601D0(); - void sub4601F0(bool flag); + void upKlaymanSlope(); + void upKlaymanFloor(); + void klaymanSlope(); + void klaymanFloor(); + void setPaletteArea0(); + void setPaletteArea1(); + void setPaletteArea2(); + void setPaletteArea3(); + void updatePaletteArea(bool instantly); }; class Scene2804; @@ -420,10 +420,10 @@ protected: Sprite *_asTape; Sprite *_sprite5; Sprite *_sprite6; - bool _flag1; + bool _isRopingDown; NRect _clipRects[2]; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub406650(); + void insertKlaymanLadder(); }; class AsScene2812Winch : public AnimatedSprite { @@ -440,8 +440,8 @@ public: protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage413DC0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub413E00(); + uint32 hmRopingDown(int messageNum, const MessageParam ¶m, Entity *sender); + void stRopingDown(); }; class AsScene2812TrapDoor : public AnimatedSprite { @@ -464,14 +464,14 @@ protected: Sprite *_ssTape; Sprite *_asKey; Sprite *_sprite1; - bool _flag1; - int _palStatus; + bool _isRopingDown; + int _paletteArea; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void setPalStatus0(int fadeTime); - void setPalStatus1(int fadeTime); - void setPalStatus2(int fadeTime); - void setPalStatus(int fadeTime); + void setPaletteArea0(bool instantly); + void setPaletteArea1(bool instantly); + void setPaletteArea2(bool instantly); + void updatePaletteArea(bool instantly); }; class Scene2822 : public Scene { -- cgit v1.2.3 From 016638bd9ef38e1d46ae855ee1944ff149c11310 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 8 Oct 2012 17:39:15 +0000 Subject: NEVERHOOD: Rename stuff in Module2700 - Also fix the clipRect in Scene2701 --- engines/neverhood/gamemodule.cpp | 4 ++-- engines/neverhood/module2700.cpp | 18 +++++++++--------- engines/neverhood/module2700.h | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 5bcd29a25b..807d6e17c1 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -310,8 +310,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 11; - createModule(2800, -1); + _vm->gameState().sceneNum = 0; + createModule(2700, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 73ea264392..983e265125 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -591,7 +591,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { Sprite *tempSprite; - + NRect clipRect; SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240); setGlobalVar(0x21E60190, 1); @@ -608,7 +608,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x1E086325, 1200); - clipRect.set(0, 0, 640, tempSprite->getDrawRect().x2()); + clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); if (sceneInfo->class437Filename) { @@ -625,7 +625,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) } _asCarConnector = insertSprite(_asCar); - + _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; @@ -649,15 +649,15 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) _asCarConnector->setClipRect(clipRect); if (which == 1) { - SetMessageHandler(&Scene2701::handleMessage42F500); + SetMessageHandler(&Scene2701::hmRidingCar); } else { sendMessage(_asCar, 0x2009, 0); - SetMessageHandler(&Scene2701::handleMessage42F600); + SetMessageHandler(&Scene2701::hmCarAtHome); } } -uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene2701::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: @@ -665,7 +665,7 @@ uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam ¶m, break; case 0x2005: if (_which1 >= 0) - SetMessageHandler(&Scene2701::handleMessage42F600); + SetMessageHandler(&Scene2701::hmCarAtHome); break; case 0x2006: if (_which2 >= 0) @@ -678,7 +678,7 @@ uint32 Scene2701::handleMessage42F500(int messageNum, const MessageParam ¶m, return 0; } -uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: @@ -686,7 +686,7 @@ uint32 Scene2701::handleMessage42F600(int messageNum, const MessageParam ¶m, leaveScene(0); } else { sendPointMessage(_asCar, 0x2004, param.asPoint()); - SetMessageHandler(&Scene2701::handleMessage42F500); + SetMessageHandler(&Scene2701::hmRidingCar); } break; case 0x200D: diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index 4274bcce05..d11586ea3e 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -94,8 +94,8 @@ protected: Sprite *_asCarConnector; int _which1, _which2; NPointArray *_trackPoints; - uint32 handleMessage42F500(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage42F600(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); }; class Scene2702 : public Scene { -- cgit v1.2.3 From 59901c5d13f59c64e4ed3174544f39b7b507b0ca Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 9 Oct 2012 11:36:44 +0000 Subject: NEVERHOOD: Rename stuff in Module3000 - Also change Scene1609::testVars - Update globalvars.txt --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/module1600.cpp | 26 ++-- engines/neverhood/module3000.cpp | 273 +++++++++++++++++++++------------------ engines/neverhood/module3000.h | 40 +++--- 4 files changed, 177 insertions(+), 166 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 807d6e17c1..8c5e3693b8 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -310,8 +310,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 0; - createModule(2700, -1); + _vm->gameState().sceneNum = 8; + createModule(3000, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 9d965101e5..114bc3e65c 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1465,29 +1465,19 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit } bool Scene1609::testVars() { - int index1 = 0; + int cmpSymbolIndex = 0; // Find the position of the first symbol - do { - int cmpIndex = _asSymbols[0]->getIndex(); - if (!_asSymbols[0]->getFlag1()) - cmpIndex -= 12; - if ((int)getSubVar(0x04909A50, index1) == cmpIndex) - break; - index1++; - } while(1); + while ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex()) + cmpSymbolIndex++; // Check if the entered symbols match - for (int index2 = 0; index2 < 12; index2++) { - int cmpIndex = _asSymbols[index2]->getIndex(); - if (!_asSymbols[index2]->getFlag1()) - cmpIndex -= 12; - if ((int)getSubVar(0x04909A50, index1) != cmpIndex) + for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) { + if ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex()) return false; - index1++; - if (index1 >= 12) - index1 = 0; - index2++; + cmpSymbolIndex++; + if (cmpSymbolIndex >= 12) + cmpSymbolIndex = 0; } return true; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 55ad05b58a..f4dd6747cf 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -359,7 +359,26 @@ void Module3000::updateScene() { // Scene3009 -static const uint32 kScene3009SmackerFileHashes[] = { +enum { + kCTSNull = 0, + kCTSBreakWall = 1, + kCTSWall = 2, + kCTSEmptyness = 3, + kCTSFireRobotNoTarget = 4, + kCTSFireRobotIsTarget = 5, + kCTSFireNoRobot = 6, + kCTSRaiseCannon = 7, + kCTSRightRobotNoTarget = 8, + kCTSRightRobotIsTarget = 9, + kCTSRightNoRobot = 10, + kCTSLeftRobotNoTarget = 11, + kCTSLeftRobotIsTarget = 12, + kCTSLeftNoRobot = 13, + kCTSLowerCannon = 14, + kCTSCount = 14 +}; + +static const uint32 kScene3009CannonScopeVideos[] = { 0x1010000D, 0x340A0049, 0x340A0049, @@ -377,22 +396,22 @@ static const uint32 kScene3009SmackerFileHashes[] = { 0x340A0049 }; -static const uint32 kScene3009CannonLocationFileHashes[] = { +static const uint32 kScene3009CannonActionVideos[] = { 0x00000000, - 0x8004001B, - 0x0004001A, - 0x1048404B, - 0x50200109, - 0x12032109, - 0x10201109, - 0x000A2030, - 0x000A0028, - 0x000A0028, - 0x000A0028, - 0x040A1069, - 0x040A1069, - 0x040A1069, - 0x240A1101 + 0x8004001B, // 1 Fire cannon at wall, it breaks (lowered) + 0x0004001A, // 2 Fire cannon at wall, nothing happens (lowered) + 0x1048404B, // 3 Fire cannon at emptyness (raised) + 0x50200109, // 4 Fire cannon, robot missed (raised) + 0x12032109, // 5 Fire cannon, robot hit (raised) + 0x10201109, // 6 Fire cannon, no robot (raised) + 0x000A2030, // 7 Raise the cannon + 0x000A0028, // 8 + 0x000A0028, // 9 + 0x000A0028, // 10 + 0x040A1069, // 11 + 0x040A1069, // 12 + 0x040A1069, // 13 + 0x240A1101 // 14 Lower the cannon }; static const uint32 kSsScene3009SymbolEdgesFileHashes[] = { @@ -450,7 +469,7 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = { }; SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene) - : StaticSprite(vm, 1400), _parentScene(parentScene), _flag1(false) { + : StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) { _spriteResource.load2(0x120B24B0); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -474,7 +493,7 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc void SsScene3009FireCannonButton::update() { StaticSprite::update(); - if (_flag1 && !isSoundPlaying(0)) { + if (_isClicked && !isSoundPlaying(0)) { sendMessage(_parentScene, 0x2000, 0); setVisible(false); } @@ -484,8 +503,8 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (!_flag1 && !_parentScene->sub462E90()) { - _flag1 = true; + if (!_isClicked && !_parentScene->isTurning()) { + _isClicked = true; setVisible(true); playSound(0); } @@ -659,7 +678,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message return messageResult; } -AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue) +AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus) : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { _x = getGlobalVar(0x9040018A) ? 533 : 92; @@ -670,7 +689,7 @@ AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine * setVisible(false); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage); - if (varValue == 8 || varValue == 9 || varValue == 10) { + if (cannonTargetStatus == kCTSRightRobotNoTarget || cannonTargetStatus == kCTSRightRobotIsTarget || cannonTargetStatus == kCTSRightNoRobot) { SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); _x = 280; } @@ -722,23 +741,23 @@ void AsScene3009HorizontalIndicator::stMoveRight() { SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); } -AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index) { +AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _symbolPosition(symbolPosition) { - _symbolIndex = getSubVar(0x00000914, _index); + _symbolIndex = getSubVar(0x00000914, _symbolPosition); - _x = kAsScene3009SymbolPoints[_index].x; - _y = kAsScene3009SymbolPoints[_index].y; - createSurface1(kAsScene3009SymbolFileHashes[_index / 3], 1200); - startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); + _x = kAsScene3009SymbolPoints[_symbolPosition].x; + _y = kAsScene3009SymbolPoints[_symbolPosition].y; + createSurface1(kAsScene3009SymbolFileHashes[_symbolPosition / 3], 1200); + startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); _newStickFrameIndex = _symbolIndex; _needRefresh = true; updatePosition(); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009Symbol::handleMessage); - _ssArrowPrev = _parentScene->insertSprite(this, _index * 2 + 0); + _ssArrowPrev = _parentScene->insertSprite(this, _symbolPosition * 2 + 0); _vm->_collisionMan->addSprite(_ssArrowPrev); - _ssArrowNext = _parentScene->insertSprite(this, _index * 2 + 1); + _ssArrowNext = _parentScene->insertSprite(this, _symbolPosition * 2 + 1); _vm->_collisionMan->addSprite(_ssArrowNext); } @@ -757,10 +776,10 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶ else _symbolIndex--; } - startAnimation(kAsScene3009SymbolFileHashes[_index / 3], _symbolIndex, -1); + startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); _newStickFrameIndex = _symbolIndex; - setSubVar(0x00000914, _index, _symbolIndex); - if (_index / 3 == 0) { + setSubVar(0x00000914, _symbolPosition, _symbolIndex); + if (_symbolPosition / 3 == 0) { sendMessage(_parentScene, 0x2001, 0); } else { sendMessage(_parentScene, 0x2003, 0); @@ -777,11 +796,11 @@ void AsScene3009Symbol::hide() { } Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _keepVideo(false), _flag2(false), - /*_flag3(false), */_flag4(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { + : Scene(vm, parentModule, true), _keepVideo(false), _moveCannonLeftFirst(false), + _isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { - _cannonLocation = getGlobalVar(0x20580A86); - debug("_cannonLocation = %d", _cannonLocation); + _cannonTargetStatus = getGlobalVar(0x20580A86); + debug("_cannonTargetStatus = %d", _cannonTargetStatus); _vm->gameModule()->initScene3009Vars(); @@ -797,23 +816,23 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _ssFireCannonButton = insertSprite(this); _vm->_collisionMan->addSprite(_ssFireCannonButton); - _asVerticalIndicator = insertSprite(this, _cannonLocation); + _asVerticalIndicator = insertSprite(this, _cannonTargetStatus); _vm->_collisionMan->addSprite(_asVerticalIndicator); - _asHorizontalIndicator = insertSprite(this, _cannonLocation); + _asHorizontalIndicator = insertSprite(this, _cannonTargetStatus); _vm->_collisionMan->addSprite(_asHorizontalIndicator); - if (_cannonLocation != 0 && _cannonLocation != 8 && _cannonLocation != 9 && _cannonLocation != 10) { + if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) { _keepVideo = true; } else { _keepVideo = false; - if (_cannonLocation != 0) { + if (_cannonTargetStatus != kCTSNull) { _asHorizontalIndicator->stMoveRight(); - _flag4 = true; + _isTurning = true; } } - _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009SmackerFileHashes[_cannonLocation], false, _keepVideo)); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009CannonScopeVideos[_cannonTargetStatus], false, _keepVideo)); _smackerPlayer->setDrawPos(89, 37); _palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage @@ -824,12 +843,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _ssTargetLines[i] = insertSprite(i); } - for (int i = 0; i < 6; i++) { - _asSymbols[i] = insertSprite(this, i); - if (i < 3) - _correctSymbols[i] = getSubVar(0x00504B86, i); + for (int symbolPosition = 0; symbolPosition < 6; symbolPosition++) { + _asSymbols[symbolPosition] = insertSprite(this, symbolPosition); + if (symbolPosition < 3) + _correctSymbols[symbolPosition] = getSubVar(0x00504B86, symbolPosition); else - _correctSymbols[i] = getSubVar(0x0A4C0A9A, i - 3); + _correctSymbols[symbolPosition] = getSubVar(0x0A4C0A9A, symbolPosition - 3); } SetMessageHandler(&Scene3009::handleMessage); @@ -846,47 +865,47 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) void Scene3009::update() { Scene::update(); - if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonLocation <= 14) { - switch (_cannonLocation) { - case 0: - case 14: + if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonTargetStatus <= kCTSCount) { + switch (_cannonTargetStatus) { + case kCTSNull: + case kCTSLowerCannon: _smackerPlayer->open(0x340A0049, true); _palette->usePalette(); _keepVideo = true; break; - case 8: + case kCTSRightRobotNoTarget: _smackerPlayer->open(0x0082080D, true); _palette->usePalette(); _keepVideo = true; - _flag4 = false; + _isTurning = false; break; - case 9: + case kCTSRightRobotIsTarget: _smackerPlayer->open(0x0282080D, true); _palette->usePalette(); _keepVideo = true; - _flag4 = false; + _isTurning = false; break; - case 10: + case kCTSRightNoRobot: _smackerPlayer->open(0x0882080D, true); _palette->usePalette(); _keepVideo = true; - _flag4 = false; + _isTurning = false; break; - case 11: - case 12: - case 13: - if (_flag2) { - if (_cannonLocation == 11) + case kCTSLeftRobotNoTarget: + case kCTSLeftRobotIsTarget: + case kCTSLeftNoRobot: + if (_moveCannonLeftFirst) { + if (_cannonTargetStatus == kCTSLeftRobotNoTarget) _smackerPlayer->open(0x110A000F, false); - else if (_cannonLocation == 12) + else if (_cannonTargetStatus == kCTSLeftRobotIsTarget) _smackerPlayer->open(0x500B004F, false); - else if (_cannonLocation == 13) + else if (_cannonTargetStatus == kCTSLeftNoRobot) _smackerPlayer->open(0x100B010E, false); _palette->usePalette(); - _flag2 = false; + _moveCannonLeftFirst = false; _asHorizontalIndicator->stMoveLeft(); } else { - playExtVideo(); + playActionVideo(); } break; } @@ -930,68 +949,72 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (!getGlobalVar(0x000809C2)) { if (!getGlobalVar(0x10938830)) { - _cannonLocation = 1; + _cannonTargetStatus = kCTSBreakWall; setGlobalVar(0x10938830, 1); } else { - _cannonLocation = 2; + _cannonTargetStatus = kCTSWall; } } else if (!getGlobalVar(0x9040018A)) { - _cannonLocation = 3; + _cannonTargetStatus = kCTSEmptyness; } else if (!getGlobalVar(0x610210B7)) { - _cannonLocation = 4; + _cannonTargetStatus = kCTSFireRobotNoTarget; } else if (!getGlobalVar(0x0C0288F4)) { setGlobalVar(0x0C0288F4, 1); - _cannonLocation = 5; + _cannonTargetStatus = kCTSFireRobotIsTarget; } else { - _cannonLocation = 6; + _cannonTargetStatus = kCTSFireNoRobot; } - playExtVideo(); + playActionVideo(); break; case 0x2001: _lockSymbolsPart1Countdown = 24; break; case 0x2002: - if (!getGlobalVar(0x9040018A) && !_flag4) { + // Raise/lower the cannon + if (!getGlobalVar(0x9040018A) && !_isTurning) { if (getGlobalVar(0x000809C2)) { - _cannonLocation = 14; + _cannonTargetStatus = kCTSLowerCannon; setGlobalVar(0x000809C2, 0); } else { - _cannonLocation = 7; + _cannonTargetStatus = kCTSRaiseCannon; setGlobalVar(0x000809C2, 1); } - playExtVideo(); + playActionVideo(); } break; case 0x2003: _lockSymbolsPart2Countdown = 24; break; case 0x2004: + // Turn the cannon if it's raised if (getGlobalVar(0x000809C2)) { if (!getGlobalVar(0x9040018A)) { + // Cannon is at the left position if (!getGlobalVar(0x610210B7)) { - _cannonLocation = 8; + _cannonTargetStatus = kCTSRightRobotNoTarget; } else if (!getGlobalVar(0x0C0288F4)) { - _cannonLocation = 9; + _cannonTargetStatus = kCTSRightRobotIsTarget; } else { - _cannonLocation = 10; + _cannonTargetStatus = kCTSRightNoRobot; } setGlobalVar(0x9040018A, 1); - _flag4 = true; - playExtVideo(); + _isTurning = true; + playActionVideo(); } else { + // Cannon is at the right position if (!getGlobalVar(0x610210B7)) { - _cannonLocation = 11; + _cannonTargetStatus = kCTSLeftRobotNoTarget; _smackerPlayer->open(0x108A000F, false); } else if (!getGlobalVar(0x0C0288F4)) { - _cannonLocation = 12; + _cannonTargetStatus = kCTSLeftRobotIsTarget; _smackerPlayer->open(0x500B002F, false); } else { - _cannonLocation = 13; + _cannonTargetStatus = kCTSLeftNoRobot; _smackerPlayer->open(0x100B008E, false); } _palette->usePalette(); - _flag2 = true; - _flag4 = true; + _moveCannonLeftFirst = true; + _isTurning = true; _keepVideo = false; setGlobalVar(0x9040018A, 0); } @@ -1001,9 +1024,9 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -void Scene3009::playExtVideo() { - setGlobalVar(0x20580A86, _cannonLocation); - setGlobalVar(0xF0402B0A, kScene3009CannonLocationFileHashes[_cannonLocation]); +void Scene3009::playActionVideo() { + setGlobalVar(0x20580A86, _cannonTargetStatus); + setGlobalVar(0xF0402B0A, kScene3009CannonActionVideos[_cannonTargetStatus]); leaveScene(1); } @@ -1021,8 +1044,8 @@ bool Scene3009::isSymbolsPart2Solved() { return true; } -bool Scene3009::sub462E90() { - return _flag4; +bool Scene3009::isTurning() { + return _isTurning; } // Scene3010 @@ -1454,18 +1477,18 @@ uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶ return messageResult; } -AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) - : AnimatedSprite(vm, 1000), _index(index), _flag1(flag), _flag2(false) { +AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol) + : AnimatedSprite(vm, 1000), _symbolIndex(symbolIndex), _largeSymbol(largeSymbol), _isNoisy(false) { - if (flag) { + if (_largeSymbol) { _x = 310; _y = 200; - createSurface1(kAsScene3011SymbolFileHashes[_index], 1200); + createSurface1(kAsScene3011SymbolFileHashes[_symbolIndex], 1200); loadSound(0, 0x6052C60F); loadSound(1, 0x6890433B); } else { - _index = 12; - _x = index * 39 + 96; + _symbolIndex = 12; + _x = symbolIndex * 39 + 96; _y = 225; createSurface(1200, 41, 48); loadSound(0, 0x64428609); @@ -1476,11 +1499,11 @@ AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag) SetUpdateHandler(&AnimatedSprite::update); } -void AsScene3011Symbol::show(bool flag) { - _flag2 = flag; - startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1); +void AsScene3011Symbol::show(bool isNoisy) { + _isNoisy = isNoisy; + startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1); setVisible(true); - if (flag) { + if (_isNoisy) { playSound(1); } else { playSound(0); @@ -1493,19 +1516,19 @@ void AsScene3011Symbol::hide() { } void AsScene3011Symbol::stopSymbolSound() { - if (_flag2) { + if (_isNoisy) { stopSound(1); } else { stopSound(0); } } -void AsScene3011Symbol::change(int index, bool flag) { - _index = index; - _flag2 = flag; - startAnimation(kAsScene3011SymbolFileHashes[_index], 0, -1); +void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) { + _symbolIndex = symbolIndex; + _isNoisy = isNoisy; + startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1); setVisible(true); - if (flag) { + if (_isNoisy) { playSound(1); } else { playSound(0); @@ -1513,10 +1536,10 @@ void AsScene3011Symbol::change(int index, bool flag) { } Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _index2(0) { + : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) { // TODO _vm->gameModule()->initScene3011Vars(); - _index1 = getGlobalVar(0x2414C2F2); + _noisySymbolIndex = getGlobalVar(0x2414C2F2); _surfaceFlag = true; SetMessageHandler(&Scene3011::handleMessage); @@ -1528,8 +1551,8 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x24A00929, 20, 620); - for (int i = 0; i < 12; i++) - _asSymbols[i] = insertSprite(i, true); + for (int symbolIndex = 0; symbolIndex < 12; symbolIndex++) + _asSymbols[symbolIndex] = insertSprite(symbolIndex, true); _ssButton = insertSprite(this, true); _vm->_collisionMan->addSprite(_ssButton); @@ -1543,13 +1566,13 @@ void Scene3011::update() { switch (_updateStatus) { case 0: if (_buttonClicked) { - if (_index1 == _index2) { + if (_noisySymbolIndex == _currentSymbolIndex) { do { - _index3 = _vm->_rnd->getRandomNumber(12 - 1); - } while (_index1 == _index3); - _asSymbols[getSubVar(0x04909A50, _index3)]->show(true); + _noisyRandomSymbolIndex = _vm->_rnd->getRandomNumber(12 - 1); + } while (_noisySymbolIndex == _noisyRandomSymbolIndex); + _asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->show(true); } else { - _asSymbols[getSubVar(0x04909A50, _index2)]->show(false); + _asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->show(false); } _updateStatus = 1; _countdown = 24; @@ -1569,14 +1592,14 @@ void Scene3011::update() { case 3: _updateStatus = 0; _countdown = 1; - if (_index1 == _index2) { - _asSymbols[getSubVar(0x04909A50, _index3)]->hide(); + if (_noisySymbolIndex == _currentSymbolIndex) { + _asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->hide(); } else { - _asSymbols[getSubVar(0x04909A50, _index2)]->hide(); + _asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->hide(); } - _index2++; - if (_index2 >= 12) - _index2 = 0; + _currentSymbolIndex++; + if (_currentSymbolIndex >= 12) + _currentSymbolIndex = 0; break; } } diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 2f7c21f30e..945ca7ec79 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -50,7 +50,7 @@ public: SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene); protected: Scene3009 *_parentScene; - bool _flag1; + bool _isClicked; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -100,7 +100,7 @@ protected: class AsScene3009HorizontalIndicator : public AnimatedSprite { public: - AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 varValue); + AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus); void show(); void stMoveLeft(); void stMoveRight(); @@ -114,11 +114,11 @@ protected: class AsScene3009Symbol : public AnimatedSprite { public: - AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int index); + AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition); void hide(); protected: Scene3009 *_parentScene; - int _index; + int _symbolPosition; uint32 _symbolIndex; SsScene3009SymbolArrow *_ssArrowPrev; SsScene3009SymbolArrow *_ssArrowNext; @@ -128,7 +128,7 @@ protected: class Scene3009 : public Scene { public: Scene3009(NeverhoodEngine *vm, Module *parentModule, int which); - bool sub462E90(); + bool isTurning(); protected: int _lockSymbolsPart1Countdown; int _lockSymbolsPart2Countdown; @@ -139,15 +139,14 @@ protected: AsScene3009VerticalIndicator *_asVerticalIndicator; AsScene3009HorizontalIndicator *_asHorizontalIndicator; AsScene3009Symbol *_asSymbols[6]; - uint32 _cannonLocation; + uint32 _cannonTargetStatus; uint32 _correctSymbols[6]; bool _keepVideo; - bool _flag2; - // UNUSED? bool _flag3; - bool _flag4; + bool _moveCannonLeftFirst; + bool _isTurning; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void playExtVideo(); + void playActionVideo(); bool isSymbolsPart1Solved(); bool isSymbolsPart2Solved(); }; @@ -221,17 +220,16 @@ protected: class AsScene3011Symbol : public AnimatedSprite { public: - AsScene3011Symbol(NeverhoodEngine *vm, int index, bool flag); - void show(bool flag); + AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol); + void show(bool isNoisy); void hide(); void stopSymbolSound(); - void change(int index, bool flag); - bool getFlag1() { return _flag1; } - int getIndex() { return _index; } + void change(int symbolIndex, bool isNoisy); + int getSymbolIndex() { return _largeSymbol ? _symbolIndex : _symbolIndex - 12; } protected: - bool _flag1; - bool _flag2; - int _index; + bool _largeSymbol; + bool _isNoisy; + int _symbolIndex; }; class Scene3011 : public Scene { @@ -243,9 +241,9 @@ protected: int _updateStatus; bool _buttonClicked; int _countdown; - int _index1; - int _index2; - int _index3; + int _noisySymbolIndex; + int _currentSymbolIndex; + int _noisyRandomSymbolIndex; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void fadeIn(); -- cgit v1.2.3 From fd13b546a7d2a2f63cca8ace7aa900a590f665bb Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 9 Oct 2012 18:30:39 +0000 Subject: NEVERHOOD: Rename stuff in the Scene class and clean up a little - Try to stay close to the actual frame rate - Also use the Smacker frame rate when a video is playing to keep videos in sync with the audio --- engines/neverhood/diskplayerscene.cpp | 8 +- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/klayman.cpp | 1 + engines/neverhood/module1200.cpp | 4 +- engines/neverhood/module1300.cpp | 6 +- engines/neverhood/module1600.cpp | 2 +- engines/neverhood/module2100.cpp | 4 +- engines/neverhood/module2200.cpp | 10 +- engines/neverhood/module2400.cpp | 2 +- engines/neverhood/module2500.cpp | 2 +- engines/neverhood/navigationscene.cpp | 9 +- engines/neverhood/scene.cpp | 186 ++++++++++++++-------------------- engines/neverhood/scene.h | 57 ++++++----- engines/neverhood/screen.cpp | 11 +- engines/neverhood/screen.h | 7 +- engines/neverhood/smackerplayer.h | 1 + engines/neverhood/smackerscene.cpp | 8 +- 17 files changed, 160 insertions(+), 164 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index cb37a244c4..8788dcfe1d 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -347,10 +347,11 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _class494 = new Class494(_vm); addSprite(_class494); - // DEBUG: Give all disks + // DEBUG>>>: Give all disks for (int i = 0; i < 19; i++) { setSubVar(0x02720344, i, 1); } + // DEBUG<<< for (int i = 0; i < 20; i++) { _diskAvailable[i] = 0; @@ -385,6 +386,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int addSurface(_smackerPlayer->getSurface()); _smackerPlayer->setDrawPos(154, 86); // TODO _smackerPlayer->gotoFrame(0); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _palette->usePalette(); @@ -517,6 +519,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, void DiskplayerScene::stop() { _smackerPlayer->open(0x08288103, true); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _palette->usePalette(); _playButton->release(); _updateStatus = 0; @@ -525,6 +528,7 @@ void DiskplayerScene::stop() { void DiskplayerScene::tuneIn() { _smackerPlayer->open(0x900001C1, false); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _palette->usePalette(); _playButton->release(); _updateStatus = 1; @@ -533,6 +537,7 @@ void DiskplayerScene::tuneIn() { void DiskplayerScene::playDisk() { _smackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _palette->usePalette(); _updateStatus = 2; _diskSlots[_diskIndex]->play(); @@ -540,6 +545,7 @@ void DiskplayerScene::playDisk() { void DiskplayerScene::playStatic() { _smackerPlayer->open(0x90000101, false); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _palette->usePalette(); _playButton->release(); _updateStatus = 2; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 8c5e3693b8..e35e16e93a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -300,18 +300,20 @@ void GameModule::startup() { // createModule(1500, 0); // Logos and intro video //Real // DEBUG>>> + /* setGlobalVar(0x0A310817, 1); setGlobalVar(0x0A18CA33, 0); setGlobalVar(0x0112090A, 0); //setGlobalVar(0x000CF819, 1); setGlobalVar(0x04A105B3, 2); + */ // <<gameState().which = 0; - _vm->gameState().sceneNum = 8; - createModule(3000, -1); + _vm->gameState().sceneNum = 0; + createModule(1200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index ee4bfe1b82..7343b0a120 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -480,6 +480,7 @@ void Klayman::gotoNextStateExt() { removeCallbackList(); #endif } else { + // Inform the scene that the current Klayman animation sequence has finished sendMessage(_parentScene, 0x1006, 0); } } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 191789d723..a20ed94cd0 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -916,7 +916,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x140E5744) { sendMessage(_asCreature, 0x2005, 0); } else if (param.asInteger() == 0x40253C40) { - _messageListFlag = false; + _canAcceptInput = false; sendMessage(_asCreature, 0x2006, 0); } else if (param.asInteger() == 0x090EB048) { if (_klayman->getX() < 572) { @@ -950,7 +950,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4814: - messageList402220(); + cancelMessageList(); break; case 0x4826: if (sender == _asTape) { diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 80a210bc3a..f38583576a 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -487,13 +487,13 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit if (getGlobalVar(0x13206309)) { setMessageList2(0x004B0910); } else { - messageList402220(); + cancelMessageList(); } } else if (param.asInteger() == 0x012E2070) { if (getGlobalVar(0x13206309)) { setMessageList2(0x004B0968); } else { - messageList402220(); + cancelMessageList(); } } else if (param.asInteger() == 0x11C40840) { if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) { @@ -740,7 +740,7 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x415634A4) { if (getGlobalVar(0xAC00C0D0)) { - messageList402220(); + cancelMessageList(); } else { setMessageList(0x004B9158); } diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 114bc3e65c..5d0207b133 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1271,7 +1271,7 @@ void Scene1608::upGettingOutOfCar() { _asIdleCarFull->setVisible(true); _asCar->setVisible(false); setMessageList(0x004B4748); - runMessageList(); + processMessageList(); _klayman->handleUpdate(); _carStatus = 0; } diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 06806c7ca1..44ef868adb 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -274,7 +274,7 @@ void Scene2101::update() { } } else { if (_klayman->getX() > 575) - _messageListFlag = false; + _canAcceptInput = false; if (--_countdown1 == 0) { if (_klayman->getX() < 480) { sendMessage(_asDoor, 0x4809, 0); @@ -307,7 +307,7 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B8EC8); } } else if (param.asInteger() == 0x41442820) { - messageList402220(); + cancelMessageList(); } break; case 0x2000: diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 2220fb7729..777b84828e 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2116,16 +2116,16 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); } else { - messageList402220(); + cancelMessageList(); } } else if (param.asInteger() == 0x34569073) { if (_klaymanAtElevator) { - _messageListFlag1 = true; + _isKlaymanBusy = true; sendMessage(_asElevator, 0x2000, 0); sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); } else { - messageList402220(); + cancelMessageList(); } } else if (param.asInteger() == 0x4054C877) { if (_klaymanAtElevator) { @@ -2133,7 +2133,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); } else { - messageList402220(); + cancelMessageList(); } } else if (param.asInteger() == 0x0CBC6211) { sendEntityMessage(_klayman, 0x1014, _asElevator); @@ -2153,7 +2153,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit _elevatorSurfacePriority = param.asInteger(); break; case 0x2003: - _messageListFlag1 = false; + _isKlaymanBusy = false; break; case 0x4807: sendMessage(_asWallRobotAnimation, 0x2007, 0); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 3b6c6bb8cf..238768c557 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -517,7 +517,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit setSurfacePriority(_sprite1->getSurface(), 1100); } else if (param.asInteger() == 0x80C40322) { setSurfacePriority(_sprite1->getSurface(), 200); - messageList402220(); + cancelMessageList(); _flag = true; } else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) { _countdown2 = 12; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index f8053d2482..b4d39d9e1d 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -362,7 +362,7 @@ void Scene2501::upGettingOutOfCar() { _asIdleCarFull->setVisible(true); _asCar->setVisible(false); setMessageList(0x004B2570); - runMessageList(); + processMessageList(); _klayman->handleUpdate(); _carStatus = 0; } diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 66b30cf79e..5594cce8da 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -51,10 +51,11 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint _smackerPlayer = new SmackerPlayer(_vm, this, (*_navigationList)[_navigationIndex].fileHash, true, true); addEntity(_smackerPlayer); addSurface(_smackerPlayer->getSurface()); - + createMouseCursor(); _vm->_screen->clear(); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); sendMessage(_parentModule, 0x100A, _navigationIndex); @@ -77,10 +78,12 @@ void NavigationScene::update() { showMouse(false); _smackerPlayer->open(_smackerFileHash, false); _vm->_screen->clear(); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _smackerDone = false; _smackerFileHash = 0; } else if (_smackerDone) { if (_leaveSceneAfter) { + _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } else { const NavigationItem &navigationItem = (*_navigationList)[_navigationIndex]; @@ -94,6 +97,7 @@ void NavigationScene::update() { _smackerDone = false; _smackerPlayer->open(navigationItem.fileHash, true); _vm->_screen->clear(); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); sendMessage(_parentModule, 0x100A, _navigationIndex); } } @@ -171,6 +175,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(0x4200189E, _navigationIndex); } else { + _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } break; @@ -187,6 +192,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { } while (!(*_navigationList)[_navigationIndex].interactive); setGlobalVar(0x4200189E, _navigationIndex); } else { + _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } break; @@ -194,6 +200,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { case 3: case 4: if (navigationItem.middleFlag) { + _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); } else if (navigationItem.middleSmackerFileHash != 0) { _smackerFileHash = navigationItem.middleSmackerFileHash; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index dde437dc62..318a0df10a 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -28,7 +28,7 @@ namespace Neverhood { Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) { - _messageListFlag1 = false; + _isKlaymanBusy = false; _systemCallbackFlag = false; _messageList = NULL; _rectType = 0; @@ -40,22 +40,18 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _mouseCursor = NULL; _palette = NULL; _background = NULL; - // TODO _field_8E = -1; if (clearHitRects) { _vm->_collisionMan->clearHitRects(); _vm->_collisionMan->clearSprites(); } _vm->_screen->setFps(24); - // TODO g_screen->hSmack = NULL; - // TODO g_screen->field_24 = 0; - // TODO g_screen->field_26 = 0; + _vm->_screen->setSmackerDecoder(NULL); // TODO g_screen->resetDirtyRects(); - _messageListFlag = true; + _canAcceptInput = true; _surfaceFlag = false; _messageList2 = NULL; _smackerPlayer = NULL; - _smkFileHash = 0; - _messageListFlag2 = false; + _isMessageListBusy = false; _messageValue = -1; SetUpdateHandler(&Scene::update); @@ -96,7 +92,6 @@ void Scene::draw() { } #endif for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { - //debug(4, "priority = %d", (*iter)->getPriority()); (*iter)->draw(); } } @@ -244,43 +239,29 @@ SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) { void Scene::update() { - if (_smkFileHash != 0) { - // TODO - _smackerPlayer = new SmackerPlayer(_vm, this, _smkFileHash, true, 0); - _savedUpdateHandlerCb = _updateHandlerCb; - _savedMessageHandlerCb = _messageHandlerCb; - SetUpdateHandler(&Scene::smackerUpdate); - SetMessageHandler(&Scene::smackerHandleMessage); - _smackerDone = false; - smackerUpdate(); - // g_screen->smackerPlayer = _smackerPlayer; - _smkFileHash = 0; - } else { - if (_mouseClicked) { - if (_klayman) { - // TODO: Merge later - if (_messageListFlag && - _klayman->hasMessageHandler() && - sendMessage(_klayman, 0x1008, 0) != 0 && - queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { - _mouseClicked = false; - } else if (_messageListFlag && - _klayman->hasMessageHandler() && - sendMessage(_klayman, 0x1008, 0) != 0) { - _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); - } - } else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { + if (_mouseClicked) { + if (_klayman) { + // TODO: Merge later + if (_canAcceptInput && + _klayman->hasMessageHandler() && + sendMessage(_klayman, 0x1008, 0) != 0 && + queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; + } else if (_canAcceptInput && + _klayman->hasMessageHandler() && + sendMessage(_klayman, 0x1008, 0) != 0) { + _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); } + } else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { + _mouseClicked = false; } + } - runMessageList(); + processMessageList(); - // Update all entities - for (Common::Array::iterator iter = _entities.begin(); iter != _entities.end(); iter++) - (*iter)->handleUpdate(); - - } + // Update all entities + for (Common::Array::iterator iter = _entities.begin(); iter != _entities.end(); iter++) + (*iter)->handleUpdate(); } @@ -293,7 +274,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s case 0: // mouse moved if (_mouseCursor && _mouseCursor->hasMessageHandler()) sendMessage(_mouseCursor, 0x4002, param); - // TODO queryPositionSomeRects(param.asPoint().x, param.asPoint().y); + // TODO Seems unused: queryPositionSomeRects(param.asPoint().x, param.asPoint().y); break; case 1: // mouse clicked _mouseClicked = true; @@ -309,44 +290,53 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s drawRectListRects(); break; */ + /* ORIGINAL DEBUG case 5: -#if 0 broadcastObjectMessage5(); -#endif break; + */ case 6: sendMessage(_parentModule, 0x1009, param); break; case 0x1006: - if (_messageListFlag1) { - _messageListFlag1 = false; - if (_messageListIndex == _messageListCount) + // Sent by Klayman when its animation sequence has finished + if (_isKlaymanBusy) { + _isKlaymanBusy = false; + if (_messageListIndex == _messageListCount) { + // If the current message list was processed completely, + // sent Klayman into the idle state. sendMessage(_klayman, 0x4004, 0); - else { - runMessageList(); + } else { + // Else continue with the next message in the current message list + processMessageList(); } } break; case 0x1007: - if (_messageListFlag1) { - _messageListFlag1 = false; + // This isn't sent by any code, check if it's in a message list + // This cancels the current message list and sets Klayman into the idle state. + if (_isKlaymanBusy) { + _isKlaymanBusy = false; _messageList = NULL; sendMessage(_klayman, 0x4004, 0); } break; case 0x101D: + // Hide the mouse cursor if (_mouseCursor) { - _prevVisible = _mouseCursor->getSurface()->getVisible(); + _mouseCursorWasVisible = _mouseCursor->getSurface()->getVisible(); _mouseCursor->getSurface()->setVisible(false); } break; case 0x101E: - if (_prevVisible && _mouseCursor) { - _mouseCursor->getSurface()->setVisible(false); + // Show the mouse cursor + if (_mouseCursorWasVisible && _mouseCursor) { + _mouseCursor->getSurface()->setVisible(true);//CHECKME?!? // TODO sendMessage(_mouseCursor, 0x4002, g_Screen->_mousePos); } break; case 0x1022: + // Set the sender's surface priority setSurfacePriority(((Sprite*)sender)->getSurface(), param.asInteger()); break; } @@ -416,17 +406,17 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { return true; } -void Scene::setMessageList(uint32 id, bool messageListFlag, bool systemCallbackFlag) { - setMessageList(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag); +void Scene::setMessageList(uint32 id, bool canAcceptInput, bool systemCallbackFlag) { + setMessageList(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag); } -void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { +void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) { //debug("Scene::setMessageList(%p)", (void*)messageList); _messageList = messageList; _messageListCount = _messageList ? _messageList->size() : 0; _messageListIndex = 0; - _messageListFlag1 = false; - _messageListFlag = messageListFlag; + _isKlaymanBusy = false; + _canAcceptInput = canAcceptInput; _systemCallbackFlag = systemCallbackFlag; _messageListStatus = 1; sendMessage(_klayman, 0x101C, 0); @@ -441,13 +431,11 @@ void Scene::setMessageList(MessageList *messageList, bool messageListFlag, bool } -bool Scene::setMessageList2(uint32 id, bool messageListFlag, bool systemCallbackFlag) { - return setMessageList2(_vm->_staticData->getMessageList(id), messageListFlag, systemCallbackFlag); +bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool systemCallbackFlag) { + return setMessageList2(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag); } -bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool systemCallbackFlag) { - bool result = false; - +bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) { //debug("Scene::setMessageList2(%p)", (void*)messageList); #if 0 @@ -457,46 +445,26 @@ bool Scene::setMessageList2(MessageList *messageList, bool messageListFlag, bool } debug("B: ================================================================"); #endif - - if (_messageListStatus == 1) { - if (messageList != _messageList2) { - if (_messageValue >= 0) { - sendMessage(_parentModule, 0x1023, _messageValue); - _messageValue = -1; - } - _messageList2 = messageList; - setMessageList(messageList, messageListFlag, systemCallbackFlag); - result = true; - } - } else if (_messageListStatus == 2) { - if (messageList == _messageList2) { - if (_messageValue >= 0) { - sendMessage(_parentModule, 0x1023, _messageValue); - _messageValue = -1; - } - _messageList2 = messageList; - setMessageList(messageList, messageListFlag, systemCallbackFlag); - result = true; - } - } else { - if (_messageValue >= 0) { - sendMessage(_parentModule, 0x1023, _messageValue); - _messageValue = -1; - } + + if (_messageListStatus == 0 || + (_messageListStatus == 1 && messageList != _messageList2) || + (_messageListStatus == 2 && messageList == _messageList2)) { + // NOTE Skipped unneeded resource preloading code + _messageValue = -1; _messageList2 = messageList; - setMessageList(messageList, messageListFlag, systemCallbackFlag); - result = true; + setMessageList(messageList, canAcceptInput, systemCallbackFlag); + return true; } - return result; + return false; } -void Scene::runMessageList() { - debug(7, "Scene::runMessageList() _messageListFlag2 = %d; _messageListFlag1 = %d", _messageListFlag2, _messageListFlag1); +void Scene::processMessageList() { + debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymanBusy = %d", _isMessageListBusy, _isKlaymanBusy); - if (_messageListFlag2 || _messageListFlag1) + if (_isMessageListBusy || _isKlaymanBusy) return; - _messageListFlag2 = true; + _isMessageListBusy = true; if (!_messageList) { _messageList2 = NULL; @@ -505,11 +473,11 @@ void Scene::runMessageList() { if (_messageList && _klayman) { - while (_messageList && _messageListIndex < _messageListCount && !_messageListFlag1) { + while (_messageList && _messageListIndex < _messageListCount && !_isKlaymanBusy) { uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; - //debug("Scene::runMessageList() %04X, %08X", messageNum, messageParam); + //debug("Scene::processMessageList() %04X, %08X", messageNum, messageParam); _messageListIndex++; if (_messageListIndex == _messageListCount) { @@ -525,7 +493,7 @@ void Scene::runMessageList() { _messageValue = messageParam; sendMessage(_parentModule, messageNum, messageParam); } else if (messageNum == 0x4001) { - _messageListFlag1 = true; + _isKlaymanBusy = true; sendPointMessage(_klayman, 0x4001, _mouseClickPos); } else if (messageNum == 0x100D) { if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0) @@ -535,34 +503,34 @@ void Scene::runMessageList() { } else if (messageNum == 0x101B) { _messageListStatus = 2; } else if (messageNum == 0x1020) { - _messageListFlag = false; + _canAcceptInput = false; } else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) { if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) { - _messageListFlag2 = false; + _isMessageListBusy = false; return; } } else { - _messageListFlag1 = true; + _isKlaymanBusy = true; if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) { - _messageListFlag1 = false; + _isKlaymanBusy = false; } } } if (_messageListIndex == _messageListCount) { - _messageListFlag = true; + _canAcceptInput = true; _messageList = NULL; } } } - _messageListFlag2 = false; + _isMessageListBusy = false; } -void Scene::messageList402220() { - _messageListFlag1 = false; +void Scene::cancelMessageList() { + _isKlaymanBusy = false; _messageList = NULL; - _messageListFlag = true; + _canAcceptInput = true; sendMessage(_klayman, 0x4004, 0); } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 35adb44ee8..a0f7dafd25 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -159,54 +159,55 @@ protected: Module *_parentModule; Common::Array _entities; Common::Array _surfaces; - bool _systemCallbackFlag; + + bool _surfaceFlag; + + Klayman *_klayman; + Background *_background; + Palette *_palette; + SmackerPlayer *_smackerPlayer; + MessageList *_messageList; + MessageList *_messageList2; + int _messageListStatus; uint _messageListCount; uint _messageListIndex; - bool _messageListFlag1; + bool _systemCallbackFlag; + + bool _canAcceptInput; + bool _isKlaymanBusy; + bool _isMessageListBusy; + + Mouse *_mouseCursor; NPoint _mouseClickPos; bool _mouseClicked; - DataResource _dataResource; + bool _mouseCursorWasVisible; + + int _rectType; RectList *_rectList; + DataResource _dataResource; + HitRectList _hitRectList; - int _rectType; - // TODO 0000008E field_8E dw ? - Mouse *_mouseCursor; - Klayman *_klayman; - Palette *_palette; - Background *_background; - bool _surfaceFlag; - bool _messageListFlag; - MessageList *_messageList2; - int _messageListStatus; - SmackerPlayer *_smackerPlayer; + void (Entity::*_savedUpdateHandlerCb)(); uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); bool _smackerDone; - // TODO 000000BD field_BD db ? - // TODO 000000BE field_BE db ? - // TODO 000000BF field_BF db ? - uint32 _smkFileHash; - // TODO 000000C4 hitArray dd ? - bool _messageListFlag2; - bool _prevVisible; int _messageValue; - // TODO 000000CF field_CF db ? uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void smackerUpdate(); uint32 smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender); bool queryPositionSprite(int16 mouseX, int16 mouseY); bool queryPositionRectList(int16 mouseX, int16 mouseY); - void setMessageList(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false); - void setMessageList(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false); - bool setMessageList2(uint32 id, bool messageListFlag = true, bool systemCallbackFlag = false); - bool setMessageList2(MessageList *messageList, bool messageListFlag = true, bool systemCallbackFlag = false); - void runMessageList(); + void setMessageList(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false); + void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false); + bool setMessageList2(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false); + bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false); + void processMessageList(); void setRectList(uint32 id); void setRectList(RectList *rectList); void clearRectList(); void loadHitRectList(); - void messageList402220(); + void cancelMessageList(); void loadDataResource(uint32 fileHash); uint16 convertMessageNum(uint32 messageNum); }; diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 372c705b3e..4689d3ba2d 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -26,7 +26,7 @@ namespace Neverhood { Screen::Screen(NeverhoodEngine *vm) - : _vm(vm), _paletteData(NULL), _paletteChanged(false) { + : _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL) { _ticks = _vm->_system->getMillis(); @@ -48,8 +48,13 @@ void Screen::update() { } void Screen::wait() { - // TODO - _vm->_system->delayMillis(40); + int32 frameDelay = _frameDelay; + if (_smackerDecoder && _smackerDecoder->isVideoLoaded() && !_smackerDecoder->endOfVideo()) + frameDelay = _smackerDecoder->getTimeToNextFrame(); + int32 waitTicks = frameDelay - (_vm->_system->getMillis() - _ticks); + if (waitTicks > 0) + _vm->_system->delayMillis(waitTicks); + _ticks = _vm->_system->getMillis(); } void Screen::setFps(int fps) { diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index fe5a2546c0..56a256757c 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -24,6 +24,7 @@ #define NEVERHOOD_SCREEN_H #include "graphics/surface.h" +#include "video/smk_decoder.h" #include "neverhood/neverhood.h" #include "neverhood/graphics.h" @@ -51,11 +52,13 @@ public: void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent); void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent); + void setSmackerDecoder(Video::SmackerDecoder *smackerDecoder) { _smackerDecoder = smackerDecoder; } protected: NeverhoodEngine *_vm; Graphics::Surface *_backScreen; - uint32 _ticks; - uint32 _frameDelay; + Video::SmackerDecoder *_smackerDecoder; + int32 _ticks; + int32 _frameDelay; byte *_paletteData; bool _paletteChanged; }; diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index 65c0c84e11..697893d8c5 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -60,6 +60,7 @@ public: uint getStatus(); void setDrawPos(int16 x, int16 y); void rewind(); + Video::SmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; } protected: Scene *_scene; Palette *_palette; diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 9982043dea..375f7f3aa8 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -73,6 +73,7 @@ void SmackerScene::nextVideo() { uint32 smackerFileHash = _fileHashList[_fileHashListIndex]; if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) { // Not a Smacker file + _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, 0); return; } @@ -80,12 +81,13 @@ void SmackerScene::nextVideo() { if (!_fieldDF) { setSubVar(0x00800410, smackerFileHash, 1); } - if (_fileHashListIndex == 0) { + if (_fileHashListIndex == 0) _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false)); - } else { + else _smackerPlayer->open(smackerFileHash, false); - } + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); } else { + _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, 0); } -- cgit v1.2.3 From 97ee348c2aaabcab5ebb6e7009b7cc96dbd907eb Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 10 Oct 2012 11:23:46 +0000 Subject: NEVERHOOD: Rename stuff in DiskplayerScene - Add SmackerPlayer::isDone() - Fix puzzle key variable handling - Update globalvars.txt --- engines/neverhood/diskplayerscene.cpp | 231 ++++++++++++++++------------------ engines/neverhood/diskplayerscene.h | 39 +++--- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/module1300.cpp | 4 +- engines/neverhood/module1400.cpp | 3 +- engines/neverhood/module2200.cpp | 3 +- engines/neverhood/module2400.cpp | 3 +- engines/neverhood/module3000.cpp | 2 +- engines/neverhood/smackerplayer.h | 1 + 9 files changed, 139 insertions(+), 151 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 8788dcfe1d..e20dec0529 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -155,7 +155,7 @@ static const uint32 kDiskplayerSlotFileHashes4[] = { 0xDC802161 }; -Class494::Class494(NeverhoodEngine *vm) +AsDiskplayerSceneKey::AsDiskplayerSceneKey(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100) { createSurface1(0x100B90B4, 1200); @@ -168,7 +168,7 @@ Class494::Class494(NeverhoodEngine *vm) _surface->setVisible(false); } -uint32 Class494::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsDiskplayerSceneKey::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: @@ -178,19 +178,19 @@ uint32 Class494::handleMessage(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Class494::sub43BE00() { - stopAnimation(); +void AsDiskplayerSceneKey::stDropKey() { + startAnimation(0x100B90B4, 0, -1); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Sprite::handleMessage); - _surface->setVisible(false); + SetMessageHandler(&AsDiskplayerSceneKey::handleMessage); + NextState(&AsDiskplayerSceneKey::stDropKeyDone); + _surface->setVisible(true); } -void Class494::sub43BE20() { - startAnimation(0x100B90B4, 0, -1); +void AsDiskplayerSceneKey::stDropKeyDone() { + stopAnimation(); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Class494::handleMessage); - NextState(&Class494::sub43BE00); - _surface->setVisible(true); + SetMessageHandler(&Sprite::handleMessage); + _surface->setVisible(false); } DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene) @@ -202,16 +202,13 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene _drawRect.y = 0; _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = _spriteResource.getDimensions().width; - _deltaRect.height = _spriteResource.getDimensions().height; + _deltaRect = _drawRect; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _surface->setVisible(false); processDelta(); _needRefresh = true; StaticSprite::update(); + _surface->setVisible(false); loadSound(0, 0x44043000); loadSound(1, 0x44045000); SetMessageHandler(&DiskplayerPlayButton::handleMessage); @@ -222,7 +219,7 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (!_diskplayerScene->getFlag3()) { + if (!_diskplayerScene->getDropKey()) { if (_isPlaying) { sendMessage(_diskplayerScene, 0x2001, 0); release(); @@ -258,7 +255,7 @@ void DiskplayerPlayButton::release() { DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value) : Entity(vm, 0), _diskplayerScene(diskplayerScene), _elementIndex(elementIndex), _value(value), - _flag2(false), _flag(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { + _isLocked(false), _isBlinking(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { if (value != 0 && elementIndex < 20) { _inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100)); @@ -271,84 +268,84 @@ DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerS // TODO sound panning stuff } else if (elementIndex != 20) { _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100)); - _activeSlot->getSurface()->setVisible(false); + _activeSlot->setVisible(false); } SetUpdateHandler(&DiskplayerSlot::update); } void DiskplayerSlot::update() { if (_countdown != 0 && (--_countdown == 0)) { - if (_flag) { + if (_isBlinking) { if (_inactiveSlot) - _inactiveSlot->getSurface()->setVisible(true); + _inactiveSlot->setVisible(true); if (_activeSlot) - _activeSlot->getSurface()->setVisible(false); + _activeSlot->setVisible(false); _countdown = _initialCountdown / 2; } else { if (_inactiveSlot) - _inactiveSlot->getSurface()->setVisible(false); + _inactiveSlot->setVisible(false); if (_activeSlot) - _activeSlot->getSurface()->setVisible(true); + _activeSlot->setVisible(true); _countdown = _initialCountdown; } - _flag = !_flag; + _isBlinking = !_isBlinking; } } void DiskplayerSlot::appear() { if (_inactiveSlot) - _inactiveSlot->getSurface()->setVisible(true); + _inactiveSlot->setVisible(true); if (_appearSlot) - _appearSlot->getSurface()->setVisible(true); + _appearSlot->setVisible(true); if (_inactiveSlot) playSound(0); } void DiskplayerSlot::play() { - if (!_flag2) { + if (!_isLocked) { if (_inactiveSlot) - _inactiveSlot->getSurface()->setVisible(false); + _inactiveSlot->setVisible(false); if (_activeSlot) - _activeSlot->getSurface()->setVisible(true); - _flag = true; + _activeSlot->setVisible(true); + _isBlinking = true; _countdown = 0; } } void DiskplayerSlot::activate() { - if (!_flag2) + if (!_isLocked) _countdown = _initialCountdown; } void DiskplayerSlot::stop() { - if (!_flag2) { + if (!_isLocked) { if (_inactiveSlot) - _inactiveSlot->getSurface()->setVisible(true); + _inactiveSlot->setVisible(true); if (_activeSlot) - _activeSlot->getSurface()->setVisible(false); - _flag = false; + _activeSlot->setVisible(false); + _isBlinking = false; _countdown = 0; } } -DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _which(which), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0), - _fullFlag(false), _flag3(false), _inputDisabled(true), _updateStatus(0) { +DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int paletteIndex) + : Scene(vm, parentModule, true), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0), + _hasAllDisks(false), _dropKey(false), _inputDisabled(true), _updateStatus(kUSStopped) { - int count = 0; + int availableDisksCount = 0; _surfaceFlag = true; setBackground(0x8A000044); - setPalette(kDiskplayerPaletteFileHashes[_which]); - _playButton = new DiskplayerPlayButton(_vm, this); - addSprite(_playButton); - _vm->_collisionMan->addSprite(_playButton); - _class494 = new Class494(_vm); - addSprite(_class494); + setPalette(kDiskplayerPaletteFileHashes[paletteIndex]); + + _ssPlayButton = insertSprite(this); + _vm->_collisionMan->addSprite(_ssPlayButton); + + _asKey = insertSprite(); // DEBUG>>>: Give all disks - for (int i = 0; i < 19; i++) { + for (int i = 0; i < 20; i++) { setSubVar(0x02720344, i, 1); } // DEBUG<<< @@ -356,37 +353,34 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int for (int i = 0; i < 20; i++) { _diskAvailable[i] = 0; if (getSubVar(0x02720344, i)) - count++; + availableDisksCount++; } - for (int i = 0; i < count; i++) { + for (int i = 0; i < availableDisksCount; i++) _diskAvailable[kDiskplayerInitArray[i] - 1] = 1; - } for (int i = 0; i < 20; i++) { _diskSlots[i] = new DiskplayerSlot(_vm, this, i, _diskAvailable[i]); addEntity(_diskSlots[i]); } - _fullFlag = count == 20; + _hasAllDisks = availableDisksCount == 20; - if (_fullFlag && !getGlobalVar(0xC0780812)) - _flag3 = true; - - _flag4 = _flag3; + if (_hasAllDisks && !getGlobalVar(0xC0780812)) + _dropKey = true; - _class650 = new DiskplayerSlot(_vm, this, 20, 0); - addEntity(_class650); + _finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0); + addEntity(_finalDiskSlot); insertMouse435(0x000408A8, 20, 620); showMouse(false); - _smackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true); - addEntity(_smackerPlayer); - addSurface(_smackerPlayer->getSurface()); - _smackerPlayer->setDrawPos(154, 86); - // TODO _smackerPlayer->gotoFrame(0); - _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); + _diskSmackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true); + addEntity(_diskSmackerPlayer); + addSurface(_diskSmackerPlayer->getSurface()); + _diskSmackerPlayer->setDrawPos(154, 86); + // TODO _diskSmackerPlayer->gotoFrame(0); + _vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder()); _palette->usePalette(); @@ -399,73 +393,63 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int void DiskplayerScene::update() { Scene::update(); - debug("_updateStatus = %d", _updateStatus); - - if (_updateStatus == 1) { - if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) { - if (_diskAvailable[_diskIndex]) { - playDisk(); - } else { - playStatic(); - } + if (_updateStatus == kUSTuningIn && _diskSmackerPlayer->isDone()) { + if (_diskAvailable[_diskIndex]) { + playDisk(); + } else { + playStatic(); } - } else if (_updateStatus == 2) { - if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) { - _diskSlots[_diskIndex]->stop(); - _diskIndex++; - if (_fullFlag) { - if (_diskIndex == 20) { - if (_flag3) { - playDisk(); - _updateStatus = 3; - } else { - _diskIndex = 0; - stop(); - } - } else { - playDisk(); - } + } else if (_updateStatus == kUSPlaying && _diskSmackerPlayer->isDone()) { + _diskSlots[_diskIndex]->stop(); + _diskIndex++; + if (_hasAllDisks) { + if (_diskIndex != 20) { + playDisk(); + } else if (_dropKey) { + playDisk(); + _updateStatus = kUSPlayingFinal; } else { - if (_diskIndex == 20) { - _diskIndex = 0; - stop(); - } else { - tuneIn(); - } + _diskIndex = 0; + stop(); } + } else if (_diskIndex != 20) { + tuneIn(); + } else { + _diskIndex = 0; + stop(); } - } else if (_updateStatus == 3) { - if (_smackerPlayer->getFrameNumber() == 133) { - _class494->sub43BE20(); + } else if (_updateStatus == kUSPlayingFinal) { + if (_diskSmackerPlayer->getFrameNumber() == 133) { + _asKey->stDropKey(); setGlobalVar(0xC0780812, 1); - } else if (_smackerPlayer->getFrameNumber() == _smackerPlayer->getFrameCount() - 1) { + } else if (_diskSmackerPlayer->isDone()) { for (int i = 0; i < 20; i++) { - _diskSlots[i]->setFlag2(false); + _diskSlots[i]->setLocked(false); _diskSlots[i]->stop(); } _diskIndex = 0; stop(); showMouse(true); - _flag3 = false; + _dropKey = false; } } if (_appearCountdown != 0 && (--_appearCountdown == 0)) { _diskSlots[_diskIndex]->appear(); - if (_flag3) { + if (_dropKey) { _diskSlots[_diskIndex]->activate(); - _diskSlots[_diskIndex]->setFlag2(true); + _diskSlots[_diskIndex]->setLocked(true); } _diskIndex++; - while (_diskAvailable[_diskIndex] == 0 && _diskIndex < 19) + while (!_diskAvailable[_diskIndex] && _diskIndex < 19) _diskIndex++; if (_diskIndex < 20) { _appearCountdown = 1; } else { _diskIndex = 0; _inputDisabled = false; - if (_flag3) { - _playButton->press(); + if (_dropKey) { + _ssPlayButton->press(); _tuneInCountdown = 2; } else { showMouse(true); @@ -474,9 +458,8 @@ void DiskplayerScene::update() { } } - if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0)) { + if (_tuneInCountdown != 0 && (--_tuneInCountdown == 0)) playDisk(); - } } @@ -489,14 +472,14 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, // TODO: Debug/Cheat if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { sendMessage(_parentModule, 0x1009, 0); - } else if (!_flag3 && + } else if (!_dropKey && param.asPoint().x > 38 && param.asPoint().x < 598 && param.asPoint().y > 400 && param.asPoint().y < 460) { _diskSlots[_diskIndex]->stop(); _diskIndex = (param.asPoint().x - 38) / 28; _diskSlots[_diskIndex]->activate(); - if (_updateStatus == 2) { + if (_updateStatus == kUSPlaying) { if (_diskAvailable[_diskIndex]) { playDisk(); } else { @@ -518,37 +501,37 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, } void DiskplayerScene::stop() { - _smackerPlayer->open(0x08288103, true); - _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); + _diskSmackerPlayer->open(0x08288103, true); + _vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder()); _palette->usePalette(); - _playButton->release(); - _updateStatus = 0; + _ssPlayButton->release(); + _updateStatus = kUSStopped; _diskSlots[_diskIndex]->activate(); } void DiskplayerScene::tuneIn() { - _smackerPlayer->open(0x900001C1, false); - _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); + _diskSmackerPlayer->open(0x900001C1, false); + _vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder()); _palette->usePalette(); - _playButton->release(); - _updateStatus = 1; + _ssPlayButton->release(); + _updateStatus = kUSTuningIn; _diskSlots[_diskIndex]->activate(); } void DiskplayerScene::playDisk() { - _smackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false); - _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); + _diskSmackerPlayer->open(kDiskplayerSmackerFileHashes[_diskIndex], false); + _vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder()); _palette->usePalette(); - _updateStatus = 2; + _updateStatus = kUSPlaying; _diskSlots[_diskIndex]->play(); } void DiskplayerScene::playStatic() { - _smackerPlayer->open(0x90000101, false); - _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); + _diskSmackerPlayer->open(0x90000101, false); + _vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder()); _palette->usePalette(); - _playButton->release(); - _updateStatus = 2; + _ssPlayButton->release(); + _updateStatus = kUSPlaying; _diskSlots[_diskIndex]->activate(); } diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h index d005f79ed6..7225ff6341 100644 --- a/engines/neverhood/diskplayerscene.h +++ b/engines/neverhood/diskplayerscene.h @@ -32,13 +32,13 @@ namespace Neverhood { class DiskplayerScene; -class Class494 : public AnimatedSprite { +class AsDiskplayerSceneKey : public AnimatedSprite { public: - Class494(NeverhoodEngine *vm); - void sub43BE20(); + AsDiskplayerSceneKey(NeverhoodEngine *vm); + void stDropKey(); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void sub43BE00(); + void stDropKeyDone(); }; class DiskplayerPlayButton : public StaticSprite { @@ -59,7 +59,7 @@ public: void stop(); void appear(); void play(); - void setFlag2(bool value) { _flag2 = value; } + void setLocked(bool isLocked) { _isLocked = isLocked; } protected: DiskplayerScene *_diskplayerScene; Sprite *_inactiveSlot; @@ -68,32 +68,37 @@ protected: int _elementIndex; int _initialCountdown; int _countdown; - bool _flag2; + bool _isLocked; int _value; - bool _flag; + bool _isBlinking; void update(); }; +enum { + kUSStopped = 0, + kUSTuningIn = 1, + kUSPlaying = 2, + kUSPlayingFinal = 3 +}; + class DiskplayerScene : public Scene { public: - DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int which); - bool getFlag3() const { return _flag3; } + DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int paletteIndex); + bool getDropKey() const { return _dropKey; } protected: - SmackerPlayer *_smackerPlayer; - DiskplayerPlayButton *_playButton; - Class494 *_class494; + SmackerPlayer *_diskSmackerPlayer; + DiskplayerPlayButton *_ssPlayButton; + AsDiskplayerSceneKey *_asKey; DiskplayerSlot *_diskSlots[20]; - DiskplayerSlot *_class650; + DiskplayerSlot *_finalDiskSlot; int _updateStatus; byte _diskAvailable[20]; - bool _flag4; - int _which; int _diskIndex; int _appearCountdown; int _tuneInCountdown; - bool _fullFlag; + bool _hasAllDisks; bool _inputDisabled; - bool _flag3; + bool _dropKey; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stop(); diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e35e16e93a..4be87854ae 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -312,8 +312,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 0; - createModule(1200, -1); + _vm->gameState().sceneNum = 3; + createModule(1300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index f38583576a..6533e07814 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -874,7 +874,7 @@ void AsScene1306Elevator::cbGoingDownEvent() { Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) setGlobalVar(0x13382860, 4); _surfaceFlag = true; @@ -884,7 +884,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x05303114); insertMouse433(0x0311005B); - if (!getGlobalVar(0x13382860)) { + if (getGlobalVar(0x13382860) == 4) { _asKey = insertSprite(this, 2, 1100, 435, 445); _vm->_collisionMan->addSprite(_asKey); } diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index d31f3decad..9cfb826882 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1425,9 +1425,8 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) { - if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) { + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) setGlobalVar(0x13382860, 5); - } SetMessageHandler(&Scene1404::handleMessage); _surfaceFlag = true; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 777b84828e..29b4103bb5 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -1028,6 +1028,7 @@ AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, if (!getSubVar(0x0090EA95, _keyIndex) && !getSubVar(0x08D0AB11, _keyIndex)) { SetMessageHandler(&AsCommonKey::handleMessage); } else { + // If Klayman already has the key or it's already inserted then don't show it setVisible(false); SetMessageHandler(NULL); } @@ -1114,7 +1115,7 @@ void AsScene2203Door::closeDoor() { Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - if (getGlobalVar(0xC0780812) && !getGlobalVar(0x13382860)) + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) setGlobalVar(0x13382860, 1); SetMessageHandler(&Scene2203::handleMessage); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 238768c557..a29795bc21 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -921,9 +921,8 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite1, *tempSprite2; - if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) { + if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) setGlobalVar(0x13382860, 2); - } _surfaceFlag = true; SetMessageHandler(&Scene2406::handleMessage); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index f4dd6747cf..88caff944a 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -865,7 +865,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) void Scene3009::update() { Scene::update(); - if (!_keepVideo && _smackerPlayer->getFrameNumber() + 1 == _smackerPlayer->getFrameCount() && _cannonTargetStatus <= kCTSCount) { + if (!_keepVideo && _smackerPlayer->isDone() && _cannonTargetStatus <= kCTSCount) { switch (_cannonTargetStatus) { case kCTSNull: case kCTSLowerCannon: diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index 697893d8c5..c480c2d8d8 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -60,6 +60,7 @@ public: uint getStatus(); void setDrawPos(int16 x, int16 y); void rewind(); + bool isDone() { return getFrameNumber() + 1 == getFrameCount(); } Video::SmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; } protected: Scene *_scene; -- cgit v1.2.3 From 1539023834a2ad7cf8942711d60983891a10a82a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 10 Oct 2012 21:10:51 +0000 Subject: NEVERHOOD: Use constants for the numbers in get/setGlobalVar Now the code is much more readable - Still TODO is to do the same with get/setSubVar --- engines/neverhood/diskplayerscene.cpp | 4 +- engines/neverhood/gamemodule.cpp | 55 +++++----- engines/neverhood/gamevars.h | 96 +++++++++++++++++ engines/neverhood/klayman.cpp | 16 +-- engines/neverhood/module1000.cpp | 150 +++++++++++++------------- engines/neverhood/module1100.cpp | 16 +-- engines/neverhood/module1200.cpp | 52 ++++----- engines/neverhood/module1300.cpp | 72 ++++++------- engines/neverhood/module1400.cpp | 101 +++++++++-------- engines/neverhood/module1600.cpp | 24 ++--- engines/neverhood/module1700.cpp | 2 +- engines/neverhood/module1900.cpp | 28 ++--- engines/neverhood/module2000.cpp | 6 +- engines/neverhood/module2100.cpp | 2 +- engines/neverhood/module2200.cpp | 198 +++++++++++++++++----------------- engines/neverhood/module2300.cpp | 6 +- engines/neverhood/module2400.cpp | 34 +++--- engines/neverhood/module2500.cpp | 12 +-- engines/neverhood/module2600.cpp | 34 +++--- engines/neverhood/module2700.cpp | 4 +- engines/neverhood/module2800.cpp | 110 ++++++++++--------- engines/neverhood/module3000.cpp | 104 +++++++++--------- engines/neverhood/navigationscene.cpp | 8 +- engines/neverhood/resource.cpp | 11 ++ engines/neverhood/smackerscene.cpp | 2 +- 25 files changed, 626 insertions(+), 521 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index e20dec0529..54c33ddcae 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -366,7 +366,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _hasAllDisks = availableDisksCount == 20; - if (_hasAllDisks && !getGlobalVar(0xC0780812)) + if (_hasAllDisks && !getGlobalVar(V_HAS_FINAL_KEY)) _dropKey = true; _finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0); @@ -421,7 +421,7 @@ void DiskplayerScene::update() { } else if (_updateStatus == kUSPlayingFinal) { if (_diskSmackerPlayer->getFrameNumber() == 133) { _asKey->stDropKey(); - setGlobalVar(0xC0780812, 1); + setGlobalVar(V_HAS_FINAL_KEY, 1); } else if (_diskSmackerPlayer->isDone()) { for (int i = 0; i < 20; i++) { _diskSlots[i]->setLocked(false); diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 4be87854ae..ac20138a5e 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -301,19 +301,20 @@ void GameModule::startup() { // DEBUG>>> /* - setGlobalVar(0x0A310817, 1); + setGlobalVar(V_SEEN_MUSIC_BOX, 1); setGlobalVar(0x0A18CA33, 0); setGlobalVar(0x0112090A, 0); //setGlobalVar(0x000CF819, 1); - setGlobalVar(0x04A105B3, 2); + setGlobalVar(V_PROJECTOR_LOCATION, 2); */ + //setGlobalVar(V_ENTRANCE_OPEN, 0); + //setGlobalVar(V_DOOR_SPIKES_OPEN, 1); // <<gameState().which = 0; - _vm->gameState().sceneNum = 3; - createModule(1300, -1); + _vm->gameState().sceneNum = 5; + createModule(2200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -358,7 +359,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 0 - setGlobalVar(0x1860C990, 1); // DEBUG Make Klayman small + setGlobalVar(V_KLAYMAN_SMALL, 1); // DEBUG Make Klayman small _vm->gameState().sceneNum = 2; createModule(2800, -1); #endif @@ -378,84 +379,84 @@ void GameModule::createModule(int moduleNum, int which) { _moduleNum = moduleNum; switch (_moduleNum) { case 1000: - setGlobalVar(0x91080831, 0x03294419); + setGlobalVar(V_MODULE_NAME, 0x03294419); _childObject = new Module1000(_vm, this, which); break; case 1100: - setGlobalVar(0x91080831, 0x0002C818); + setGlobalVar(V_MODULE_NAME, 0x0002C818); _childObject = new Module1100(_vm, this, which); break; case 1200: - setGlobalVar(0x91080831, 0x00478311); + setGlobalVar(V_MODULE_NAME, 0x00478311); _childObject = new Module1200(_vm, this, which); break; case 1300: - setGlobalVar(0x91080831, 0x0061C090); + setGlobalVar(V_MODULE_NAME, 0x0061C090); _childObject = new Module1300(_vm, this, which); break; case 1400: - setGlobalVar(0x91080831, 0x00AD0012); + setGlobalVar(V_MODULE_NAME, 0x00AD0012); _childObject = new Module1400(_vm, this, which); break; case 1500: _someFlag1 = false; - setGlobalVar(0x91080831, 0x00F10114); + setGlobalVar(V_MODULE_NAME, 0x00F10114); _childObject = new Module1500(_vm, this, which, true); break; case 1600: - setGlobalVar(0x91080831, 0x01A008D8); + setGlobalVar(V_MODULE_NAME, 0x01A008D8); _childObject = new Module1600(_vm, this, which); break; case 1700: - setGlobalVar(0x91080831, 0x04212331); + setGlobalVar(V_MODULE_NAME, 0x04212331); _childObject = new Module1700(_vm, this, which); break; case 1800: - setGlobalVar(0x91080831, 0x04A14718); + setGlobalVar(V_MODULE_NAME, 0x04A14718); _childObject = new Module1800(_vm, this, which); break; case 1900: - setGlobalVar(0x91080831, 0x04E1C09C); + setGlobalVar(V_MODULE_NAME, 0x04E1C09C); _childObject = new Module1900(_vm, this, which); break; case 2000: - setGlobalVar(0x91080831, 0x08250000); + setGlobalVar(V_MODULE_NAME, 0x08250000); _childObject = new Module2000(_vm, this, which); break; case 2100: - setGlobalVar(0x91080831, 0x10A10C14); + setGlobalVar(V_MODULE_NAME, 0x10A10C14); _childObject = new Module2100(_vm, this, which); break; case 2200: - setGlobalVar(0x91080831, 0x11391412); + setGlobalVar(V_MODULE_NAME, 0x11391412); _childObject = new Module2200(_vm, this, which); break; case 2300: - setGlobalVar(0x91080831, 0x1A214010); + setGlobalVar(V_MODULE_NAME, 0x1A214010); _childObject = new Module2300(_vm, this, which); break; case 2400: - setGlobalVar(0x91080831, 0x202D1010); + setGlobalVar(V_MODULE_NAME, 0x202D1010); _childObject = new Module2400(_vm, this, which); break; case 2500: - setGlobalVar(0x91080831, 0x29220120); + setGlobalVar(V_MODULE_NAME, 0x29220120); _childObject = new Module2500(_vm, this, which); break; case 2600: - setGlobalVar(0x91080831, 0x40271018); + setGlobalVar(V_MODULE_NAME, 0x40271018); _childObject = new Module2600(_vm, this, which); break; case 2700: - setGlobalVar(0x91080831, 0x42212411); + setGlobalVar(V_MODULE_NAME, 0x42212411); _childObject = new Module2700(_vm, this, which); break; case 2800: - setGlobalVar(0x91080831, 0x64210814); + setGlobalVar(V_MODULE_NAME, 0x64210814); _childObject = new Module2800(_vm, this, which); break; case 3000: - setGlobalVar(0x91080831, 0x81293110); + setGlobalVar(V_MODULE_NAME, 0x81293110); _childObject = new Module3000(_vm, this, which); break; default: @@ -482,7 +483,7 @@ void GameModule::updateModule() { if (_moduleResult == 0) { createModule(2900, 2); } else { - setGlobalVar(0xD0A14D10, 1); + setGlobalVar(V_ENTRANCE_OPEN, 1); createModule(1300, 0); } break; diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 863aa1b2c1..a99459fb6a 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -28,6 +28,102 @@ namespace Neverhood { +enum { + // Misc + V_MODULE_NAME = 0x91080831, // Currently active module name hash + V_DEBUG = 0xA4014072, // Original debug-flag, can probably be removed + V_SMACKER_CAN_ABORT = 0x06C02850, // Not set anywhere (yet), seems like a debug flag + V_KEY3_LOCATION = 0x13382860, // Location of the third key + V_TEXT_FLAG1 = 0x8440001F, + V_TEXT_INDEX = 0x01830201, + V_TEXT_COUNTING_INDEX1 = 0x29408F00, + V_TEXT_COUNTING_INDEX2 = 0x8A140C21, + V_TALK_COUNTING_INDEX = 0xA0808898, + V_FRUIT_COUNTING_INDEX = 0x40040831, + V_NOISY_SYMBOL_INDEX = 0x2414C2F2, + V_COLUMN_BACK_NAME = 0x4CE79018, + V_COLUMN_TEXT_NAME = 0xC8C28808, + V_CLICKED_COLUMN_INDEX = 0x48A68852, + V_CLICKED_COLUMN_ROW = 0x49C40058, + V_MUSIC_NAME = 0x89A82A15, + // Klayman + V_KLAYMAN_SMALL = 0x1860C990, // Is Klayman small? + V_KLAYMAN_FRAMEINDEX = 0x18288913, + V_KLAYMAN_IS_DELTA_X = 0xC0418A02, + V_KLAYMAN_SAVED_X = 0x00D30138, + V_CAR_DELTA_X = 0x21E60190, + // Flags + V_CRYSTAL_COLORS_INIT = 0xDE2EC914, + V_TV_JOKE_TOLD = 0x92603A79, + V_NOTES_DOOR_UNLOCKED = 0x0045D021, + V_WATER_RUNNING = 0x4E0BE910, + V_CREATURE_ANGRY = 0x0A310817, // After having played with the music box + V_BEEN_SHRINKING_ROOM = 0x1C1B8A9A, + V_BEEN_STATUE_ROOM = 0xCB45DE03, + V_MOUSE_PUZZLE_SOLVED = 0x70A1189C, + V_NOTES_PUZZLE_SOLVED = 0x86615030, + V_TILE_PUZZLE_SOLVED = 0x404290D5, + V_STAIRS_PUZZLE_SOLVED = 0xA9035F60, + V_SPIKES_RETRACTED = 0x18890C91, + V_LARGE_DOOR_NUMBER = 0x9A500914, // Number of the currently "large" door + V_LIGHTS_ON = 0x4D080E54, + V_SHRINK_LIGHTS_ON = 0x190A1D18, // Lights on in the room with the shrinking device + V_STAIRS_DOWN = 0x09221A62, + V_LADDER_DOWN = 0x0018CA22, // Is the ladder in the statue room down? + V_LADDER_DOWN_ACTION = 0x00188211, + V_WALL_BROKEN = 0x10938830, + V_BOLT_DOOR_OPEN = 0x01BA1A52, + V_BOLT_DOOR_UNLOCKED = 0x00040153, + V_SEEN_SYMBOLS_NO_LIGHT = 0x81890D14, + V_FELL_DOWN_HOLE = 0xE7498218, + V_DOOR_PASSED = 0x2090590C, // Auto-closing door was passed + V_ENTRANCE_OPEN = 0xD0A14D10, // Is the entrance to Module1300 open (after the robot got his teddy) + V_WINDOW_OPEN = 0x03C698DA, + V_DOOR_STATUS = 0x52371C95, + V_DOOR_BUSTED = 0xD217189D, + V_WORLDS_JOINED = 0x98109F12, // Are the worlds joined? + V_KEYDOOR_UNLOCKED = 0x80455A41, // Is the keyboard-door unlocked? + V_MOUSE_SUCKED_IN = 0x01023818, // Are mouse/cheese in Scene1308? + V_BALLOON_POPPED = 0xAC00C0D0, // Has the balloon with the key been popped? + V_TNT_DUMMY_BUILT = 0x000CF819, // Are all TNT parts on the dummy? + V_TNT_DUMMY_FUSE_LIT = 0x20A0C516, + V_RING5_PULLED = 0x4DE80AC0, + V_CREATURE_EXPLODED = 0x2A02C07B, + // Match + V_MATCH_STATUS = 0x0112090A, + // Venus fly trap + V_FLYTRAP_RING_EATEN = 0x2B514304, + V_FLYTRAP_RING_DOOR = 0x8306F218, + V_FLYTRAP_RING_FENCE = 0x80101B1E, + V_FLYTRAP_RING_BRIDGE = 0x13206309, + V_FLYTRAP_POSITION_1 = 0x1B144052, + V_FLYTRAP_POSITION_2 = 0x86341E88, + // Navigation + V_NAVIGATION_INDEX = 0x4200189E, // Navigation scene: Current navigation index + // Cannon + V_CANNON_RAISED = 0x000809C2, // Is the cannon raised? + V_CANNON_TURNED = 0x9040018A, // Is the cannon turned? + V_ROBOT_HIT = 0x0C0288F4, // Was the robot hit by the cannon? + V_ROBOT_TARGET = 0x610210B7, // Is the robot at the cannon target position? (teddy) + V_CANNON_SMACKER_NAME = 0xF0402B0A, + V_CANNON_TARGET_STATUS = 0x20580A86, + // Projector + V_PROJECTOR_SLOT = 0x04A10F33, // Projector x slot index + V_PROJECTOR_LOCATION = 0x04A105B3, // Projector scene location + V_PROJECTOR_ACTIVE = 0x12A10DB3, // Is the projecor projecting? + // Inventory + V_HAS_NEEDLE = 0x31C63C51, // Has Klayman the needle? + V_HAS_FINAL_KEY = 0xC0780812, // Has Klayman the key from the diskplayer? + V_HAS_TEST_TUBE = 0x45080C38, +#if 0 +Arrays: +0x0800547C Water pipes water level (index equals pipe number; 0 to 4) +0x0090EA95 Has Klayman the key (index equals the key number; 0 to 2) +0x08D0AB11 Has Klayman inserted the key (index equals the key number; 0 to 2) +#endif + V_END_ +}; + struct GameVar { uint32 nameHash; uint32 value; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 7343b0a120..0342b02f3c 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3048,7 +3048,7 @@ uint32 Klayman::hmMatch(int messageNum, const MessageParam ¶m, Entity *sende switch (messageNum) { case 0x100D: if (param.asInteger() == 0x51281850) { - setGlobalVar(0x20A0C516, 1); + setGlobalVar(V_TNT_DUMMY_FUSE_LIT, 1); } else if (param.asInteger() == 0x43000538) { playSound(0, 0x21043059); } else if (param.asInteger() == 0x02B20220) { @@ -3283,7 +3283,7 @@ void Klayman::stWaitLeverDown() { } void Klayman::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(0x18288913) + _walkResumeFrameIncr; + int16 frameIndex = getGlobalVar(V_KLAYMAN_FRAMEINDEX) + _walkResumeFrameIncr; if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; _status2 = 0; @@ -4788,7 +4788,7 @@ KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } void KmScene2205::xUpdate() { - setGlobalVar(0x18288913, _currFrameIndex); + setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); } uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4842,7 +4842,7 @@ KmScene2206::~KmScene2206() { } void KmScene2206::xUpdate() { - setGlobalVar(0x18288913, _currFrameIndex); + setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); } uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5006,7 +5006,7 @@ KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } void KmScene2242::xUpdate() { - setGlobalVar(0x18288913, _currFrameIndex); + setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); } uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5076,7 +5076,7 @@ KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 } void KmHallOfRecords::xUpdate() { - setGlobalVar(0x18288913, _currFrameIndex); + setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); } uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5130,7 +5130,7 @@ KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } void KmScene2247::xUpdate() { - setGlobalVar(0x18288913, _currFrameIndex); + setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); } uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5274,7 +5274,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(param.asPoint().x, false); break; case 0x4004: - if (!getGlobalVar(0x92603A79)) + if (!getGlobalVar(V_TV_JOKE_TOLD)) GotoState(&Klayman::stStandWonderAbout); else GotoState(&Klayman::stTryStandIdle); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 878a0e7ef7..2c528429ea 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -29,7 +29,7 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) debug("Create Module1000(%d)", which); - _musicFileHash = getGlobalVar(0xD0A14D10) ? 0x81106480 : 0x00103144; + _musicFileHash = getGlobalVar(V_ENTRANCE_OPEN) ? 0x81106480 : 0x00103144; _vm->_soundMan->addMusic(0x03294419, 0x061880C6); _vm->_soundMan->addMusic(0x03294419, _musicFileHash); @@ -140,7 +140,7 @@ uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, } void AsScene1001Door::hammerHitsDoor() { - switch (getGlobalVar(0x52371C95)) { + switch (getGlobalVar(V_DOOR_STATUS)) { case 0: case 1: playSound(0, 0x65482F03); @@ -156,11 +156,11 @@ void AsScene1001Door::hammerHitsDoor() { // Nothing break; } - incGlobalVar(0x52371C95, 1); + incGlobalVar(V_DOOR_STATUS, 1); } void AsScene1001Door::stShowIdleDoor() { - switch (getGlobalVar(0x52371C95)) { + switch (getGlobalVar(V_DOOR_STATUS)) { case 1: startAnimation(0x624C0498, 4, -1); _newStickFrameIndex = 4; @@ -181,7 +181,7 @@ void AsScene1001Door::stShowIdleDoor() { } void AsScene1001Door::stBustedDoorMove() { - setGlobalVar(0xD217189D, 1); + setGlobalVar(V_DOOR_BUSTED, 1); startAnimation(0x624C0498, 6, 6); NextState(&AsScene1001Door::stBustedDoorGone); _x = 30; @@ -249,7 +249,7 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ break; case 0x3002: SetMessageHandler(NULL); - setGlobalVar(0x03C698DA, 1); + setGlobalVar(V_WINDOW_OPEN, 1); setVisible(false); break; } @@ -354,7 +354,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B4898); } else if (which == 2) { setRectList(0x004B49F0); - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(390, 433); _klayman->setDoDeltaX(1); } else { @@ -371,7 +371,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); - if (getGlobalVar(0xD217189D) == 0) { + if (getGlobalVar(V_DOOR_BUSTED) == 0) { _asDoor = insertSprite(); _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); } else { @@ -385,7 +385,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = insertSprite(this, 0x15288120, 100, 0); - if (getGlobalVar(0x03C698DA) == 0) { + if (getGlobalVar(V_WINDOW_OPEN) == 0) { tempSprite = insertStaticSprite(0x8C066150, 200); _asWindow = insertSprite(); _asWindow->setClipRect(tempSprite->getDrawRect()); @@ -398,7 +398,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1001::~Scene1001() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX()); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX()); } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -407,7 +407,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { + if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) { leaveScene(0); } break; @@ -423,7 +423,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList2(0x004B4910); messageResult = 1; } else if (param.asInteger() == 0x21E64A00) { - if (getGlobalVar(0xD217189D)) { + if (getGlobalVar(V_DOOR_BUSTED)) { setMessageList(0x004B48A8); } else { setMessageList(0x004B48C8); @@ -432,7 +432,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x040424D0) { sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x80006358) { - if (getGlobalVar(0x03C698DA)) { + if (getGlobalVar(V_WINDOW_OPEN)) { setMessageList(0x004B4938); } else { setMessageList(0x004B4960); @@ -615,7 +615,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) _x = 526; - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { _y = 49; } else { _y = 239; @@ -644,11 +644,11 @@ uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4808: - setGlobalVar(0x8306F218, 1); + setGlobalVar(V_FLYTRAP_RING_DOOR, 1); SetSpriteUpdate(&AsScene1002Door::suOpenDoor); break; case 0x4809: - setGlobalVar(0x8306F218, 0); + setGlobalVar(V_FLYTRAP_RING_DOOR, 0); SetSpriteUpdate(&AsScene1002Door::suCloseDoor); break; } @@ -872,20 +872,20 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); if (!_flag) { - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { setDoDeltaX(1); _x = 366; _y = 435; stRingGrabbed(); } else { - _x = 174 + getGlobalVar(0x1B144052) * 32; + _x = 174 + getGlobalVar(V_FLYTRAP_POSITION_1) * 32; _y = 435; stIdle(); } } else { - _x = 186 + getGlobalVar(0x86341E88) * 32; + _x = 186 + getGlobalVar(V_FLYTRAP_POSITION_2) * 32; _y = 364; - if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) { stRingGrabbed(); } else { stIdle(); @@ -937,13 +937,13 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam case 0x480B: setDoDeltaX(param.asInteger() != 0 ? 1 : 0); if (!_flag) { - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { stRelease(); } else { stWalk(); } } else { - if (getGlobalVar(0x13206309) || getGlobalVar(0x80101B1E)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) { stRelease(); } else { stWalk(); @@ -1079,14 +1079,14 @@ void AsScene1002VenusFlyTrap::stIdle() { SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); if (_flag) { if (_x >= 154 && _x <= 346) { - setGlobalVar(0x86341E88, (_x - 186) / 32); + setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32); } else { NextState(&AsScene1002VenusFlyTrap::stWalkBack); _countdown = 12; } } else { if (_x >= 174 && _x <= 430) { - setGlobalVar(0x1B144052, (_x - 174) / 32); + setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32); } else { NextState(&AsScene1002VenusFlyTrap::stWalkBack); _countdown = 12; @@ -1129,7 +1129,7 @@ AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngi createSurface(850, 186, 212); _x = 320; _y = 240; - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { startAnimation(0x004A4495, -1, -1); _newStickFrameIndex = -2; } else { @@ -1346,7 +1346,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asRing1 = insertSprite(this, false, 258, 191, _class599->getDrawRect().y, false); _asRing2 = insertSprite(this, false, 297, 189, _class599->getDrawRect().y, false); - _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(0x8306F218) != 0); + _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR) != 0); _asRing4 = insertSprite(this, false, 334, 191, _class599->getDrawRect().y, false); _asRing5 = insertSprite(this, false, 425, 184, _class599->getDrawRect().y, false); @@ -1395,24 +1395,24 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: // Debug stuff (original) - if (param.asPoint().x == 0 && getGlobalVar(0xA4014072)) { - setGlobalVar(0x8306F218, 1); - setGlobalVar(0x1B144052, 3); + if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) { + setGlobalVar(V_FLYTRAP_RING_DOOR, 1); + setGlobalVar(V_FLYTRAP_POSITION_1, 3); leaveScene(1); } break; case 0x000D: // Debug stuff (original) if (param.asInteger() == 0x48848178) { - setGlobalVar(0x8306F218, 1); - setGlobalVar(0x1B144052, 3); + setGlobalVar(V_FLYTRAP_RING_DOOR, 1); + setGlobalVar(V_FLYTRAP_POSITION_1, 3); leaveScene(1); } messageResult = 1; break; case 0x100D: if (param.asInteger() == 0xE6EE60E1) { - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { setMessageList(0x004B4428); } else { setMessageList(0x004B4448); @@ -1423,12 +1423,12 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x43807801) { sendEntityMessage(_klayman, 0x1014, _asRing2); } else if (param.asInteger() == 0x46C26A01) { - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { setMessageList(0x004B44B8); } else { sendEntityMessage(_klayman, 0x1014, _asRing3); if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) { - setGlobalVar(0x2B514304, 1); + setGlobalVar(V_FLYTRAP_RING_EATEN, 1); setMessageList(0x004B44A8); } else { setMessageList(0x004B44A0); @@ -1475,21 +1475,21 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_parentModule, 0x1024, 2); _flag1BE = true; if (sender == _asRing1) { - setGlobalVar(0x4DE80AC0, 0); + setGlobalVar(V_RING5_PULLED, 0); playSound(0, 0x665198C0); } else if (sender == _asRing2) { - setGlobalVar(0x4DE80AC0, 0); + setGlobalVar(V_RING5_PULLED, 0); playSound(0, 0xE2D389C0); } else if (sender == _asRing3) { - setGlobalVar(0x4DE80AC0, 0); + setGlobalVar(V_RING5_PULLED, 0); playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); } else if (sender == _asRing4) { - setGlobalVar(0x4DE80AC0, 0); + setGlobalVar(V_RING5_PULLED, 0); playSound(0, 0xE0558848); } else if (sender == _asRing5) { - setGlobalVar(0x4DE80AC0, 1); + setGlobalVar(V_RING5_PULLED, 1); playSound(0, 0x44014282); } break; @@ -1499,7 +1499,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asDoor, 0x4809, 0); sendMessage(_asOutsideDoorBackground, 0x4809, 0); } else if (sender == _asVenusFlyTrap) { - if (getGlobalVar(0x8306F218)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { sendMessage(_asRing3, 0x4807, 0); } } @@ -1508,7 +1508,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendEntityMessage(_klayman, 0x1014, _asDoorSpy); break; case 0x480F: - setGlobalVar(0x4DE80AC0, 0); + setGlobalVar(V_RING5_PULLED, 0); playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); @@ -1595,7 +1595,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x50C03005); - if (getGlobalVar(0x0D0A14D10)) { + if (getGlobalVar(V_ENTRANCE_OPEN)) { setPalette(0xA30BA329); _palette->addBasePalette(0xA30BA329, 0, 256, 0); } else { @@ -1689,7 +1689,7 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - if (getGlobalVar(0xD0A14D10)) { + if (getGlobalVar(V_ENTRANCE_OPEN)) { setBackground(0x2800E011); setPalette(0x2800E011); insertStaticSprite(0x492D5AD7, 100); @@ -1745,7 +1745,7 @@ FontSurface *Scene1005::createFontSurface() { uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight); - if (getGlobalVar(0xD0A14D10)) { + if (getGlobalVar(V_ENTRANCE_OPEN)) { fontSprite.load2(0x283CE401); } else { fontSprite.load2(0xC6604282); @@ -1757,71 +1757,71 @@ FontSurface *Scene1005::createFontSurface() { uint32 Scene1005::getTextIndex() { uint32 textIndex; textIndex = getTextIndex1(); - if (getGlobalVar(0xD0A14D10)) { + if (getGlobalVar(V_ENTRANCE_OPEN)) { textIndex = getTextIndex2(); } - if (getGlobalVar(0x8440001F) && getGlobalVar(0x01830201) == textIndex) { + if (getGlobalVar(V_TEXT_FLAG1) && getGlobalVar(V_TEXT_INDEX) == textIndex) { textIndex = getTextIndex3(); } else { - setGlobalVar(0x8440001F, 1); - setGlobalVar(0x01830201, textIndex); + setGlobalVar(V_TEXT_FLAG1, 1); + setGlobalVar(V_TEXT_INDEX, textIndex); } return textIndex; } uint32 Scene1005::getTextIndex1() { uint32 textIndex; - if (getGlobalVar(0x98109F12)) { - if (!getGlobalVar(0x2090590C)) + if (getGlobalVar(V_WORLDS_JOINED)) { + if (!getGlobalVar(V_DOOR_PASSED)) textIndex = 18; - else if (!getGlobalVar(0x610210B7)) + else if (!getGlobalVar(V_ROBOT_TARGET)) textIndex = 19; - else if (getGlobalVar(0x0C0288F4)) { - if (!getGlobalVar(0xD0A14D10)) + else if (getGlobalVar(V_ROBOT_HIT)) { + if (!getGlobalVar(V_ENTRANCE_OPEN)) textIndex = 23; else if (!getSubVar(0x0090EA95, 0) && !getSubVar(0x08D0AB11, 0)) textIndex = 24; - else if (!getGlobalVar(0xC0780812)) + else if (!getGlobalVar(V_HAS_FINAL_KEY)) textIndex = 26; else if (!getSubVar(0x0090EA95, 1) && !getSubVar(0x08D0AB11, 1)) textIndex = 27; - else if (!getGlobalVar(0xC0780812)) + else if (!getGlobalVar(V_HAS_FINAL_KEY)) textIndex = 28; else textIndex = 29; - } else if (!getGlobalVar(0xE7498218)) + } else if (!getGlobalVar(V_FELL_DOWN_HOLE)) textIndex = 20; - else if (!getGlobalVar(0x081890D14)) + else if (!getGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT)) textIndex = 21; else textIndex = 22; - } else if (getGlobalVar(0x00040153)) { - if (!getGlobalVar(0x10938830)) + } else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { + if (!getGlobalVar(V_WALL_BROKEN)) textIndex = 12; else if (!getGlobalVar(0x2050861A)) textIndex = 13; - else if (!getGlobalVar(0x4DE80AC0)) + else if (!getGlobalVar(V_RING5_PULLED)) textIndex = 50; else if (!getGlobalVar(0x89C669AA)) textIndex = 14; - else if (!getGlobalVar(0x1C1B8A9A)) + else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM)) textIndex = 15; - else if (!getGlobalVar(0xCB45DE03)) + else if (!getGlobalVar(V_BEEN_STATUE_ROOM)) textIndex = 16; else textIndex = 17; - } else if (!getGlobalVar(0x2B514304)) { + } else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) { textIndex = 0; } else if (getGlobalVar(0x0A18CA33)) { - if (!getGlobalVar(0x404290D5)) + if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) textIndex = 4; - else if (!getGlobalVar(0x45080C38)) + else if (!getGlobalVar(V_HAS_TEST_TUBE)) textIndex = 5; else if (!getSubVar(0x14800353, 0x40119852)) textIndex = 6; - else if (!getGlobalVar(0x4E0BE910)) + else if (!getGlobalVar(V_WATER_RUNNING)) textIndex = 7; - else if (!getGlobalVar(0x86615030)) + else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED)) textIndex = 8; else if (!getSubVar(0x14800353, 0x304008D2)) textIndex = 9; @@ -1829,9 +1829,9 @@ uint32 Scene1005::getTextIndex1() { textIndex = 10; else textIndex = 11; - } else if (!getGlobalVar(0x0A310817)) { + } else if (!getGlobalVar(V_CREATURE_ANGRY)) { textIndex = 1; - } else if (getGlobalVar(0x000CF819)) { + } else if (getGlobalVar(V_TNT_DUMMY_BUILT)) { textIndex = 3; } else { textIndex = 2; @@ -1840,23 +1840,23 @@ uint32 Scene1005::getTextIndex1() { } uint32 Scene1005::getTextIndex2() { - uint32 textIndex = getGlobalVar(0x29408F00); + uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX1); if (textIndex + 1 >= 10) { - setGlobalVar(0x29408F00, 0); + setGlobalVar(V_TEXT_COUNTING_INDEX1, 0); textIndex = 0; } else { - setGlobalVar(0x29408F00, textIndex + 1); + setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1); } return textIndex + 40; } uint32 Scene1005::getTextIndex3() { - uint32 textIndex = getGlobalVar(0x8A140C21); + uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX2); if (textIndex + 1 >= 10) { - setGlobalVar(0x8A140C21, 0); + setGlobalVar(V_TEXT_COUNTING_INDEX2, 0); textIndex = 0; } else { - setGlobalVar(0x8A140C21, textIndex + 1); + setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1); } return textIndex + 30; } diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 53ede4315d..44fe70eb88 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -76,14 +76,14 @@ void Module1100::createScene(int sceneNum, int which) { createNavigationScene(0x004B8460, which); break; case 2: - if (getGlobalVar(0x610210B7)) { + if (getGlobalVar(V_ROBOT_TARGET)) { createNavigationScene(0x004B84F0, which); } else { createNavigationScene(0x004B8490, which); } break; case 3: - if (getGlobalVar(0x610210B7)) { + if (getGlobalVar(V_ROBOT_TARGET)) { createNavigationScene(0x004B8580, which); } else { createNavigationScene(0x004B8550, which); @@ -93,7 +93,7 @@ void Module1100::createScene(int sceneNum, int which) { _childObject = new Scene1105(_vm, this, which); break; case 5: - if (getGlobalVar(0x610210B7)) + if (getGlobalVar(V_ROBOT_TARGET)) createSmackerScene(0x04180001, true, false, false); else createSmackerScene(0x04180007, true, false, false); @@ -135,7 +135,7 @@ void Module1100::updateScene() { break; case 1: _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); - if (getGlobalVar(0x0C0288F4)) { + if (getGlobalVar(V_ROBOT_HIT)) { if (_moduleResult == 0) { createScene(6, -1); } else if (_moduleResult == 1) { @@ -175,7 +175,7 @@ void Module1100::updateScene() { break; case 5: _vm->_soundMan->setTwoSoundsPlayFlag(false); - if (getGlobalVar(0x610210B7)) { + if (getGlobalVar(V_ROBOT_TARGET)) { createScene(3, 0); } else { createScene(4, 0); @@ -372,7 +372,7 @@ uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam &p uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2002: - if (getGlobalVar(0x610210B7)) { + if (getGlobalVar(V_ROBOT_TARGET)) { startAnimation(0x6B0C0432, 0, -1); playSound(0); } else { @@ -505,7 +505,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit if (getSubVar(0x7500993A, 0) == getSubVar(0x61084036, 0) && getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) && getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) { - setGlobalVar(0x610210B7, 1); + setGlobalVar(V_ROBOT_TARGET, 1); playSound(2); _flag3 = true; } else { @@ -520,7 +520,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _ssActionButton) { sendMessage(_ssActionButton, 0x480B, 0); _flag1 = false; - } else if (!getGlobalVar(0x610210B7)) { + } else if (!getGlobalVar(V_ROBOT_TARGET)) { if (sender == _ssSymbol1UpButton) { if (getSubVar(0x61084036, 0) < 9) { incSubVar(0x61084036, 0, +1); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index a20ed94cd0..041be6f8bd 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -60,7 +60,7 @@ void Module1200::createScene(int sceneNum, int which) { case 2: _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); createSmackerScene(0x31890001, true, true, false); - setGlobalVar(0x2A02C07B, 1); + setGlobalVar(V_CREATURE_EXPLODED, 1); break; } SetUpdateHandler(&Module1200::updateScene); @@ -74,7 +74,7 @@ void Module1200::updateScene() { if (_moduleResult == 1) { createScene(1, 0); } else if (_moduleResult == 2) { - if (getGlobalVar(0x0A18CA33) && !getGlobalVar(0x2A02C07B)) { + if (getGlobalVar(0x0A18CA33) && !getGlobalVar(V_CREATURE_EXPLODED)) { createScene(2, -1); } else { leaveModule(1); @@ -439,7 +439,7 @@ AsScene1201TntManFlame::~AsScene1201TntManFlame() { void AsScene1201TntManFlame::update() { AnimatedSprite::update(); - if (getGlobalVar(0x20A0C516)) { + if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { setVisible(true); SetUpdateHandler(&AnimatedSprite::update); _vm->_soundMan->addSound(0x041080A4, 0x460A1050); @@ -459,7 +459,7 @@ AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) SetUpdateHandler(&AsScene1201Match::update); SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - switch (getGlobalVar(0x0112090A)) { + switch (getGlobalVar(V_MATCH_STATUS)) { case 0: _x = 521; _y = 112; @@ -522,7 +522,7 @@ uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam ¶m, Entit break; case 0x4806: setVisible(false); - setGlobalVar(0x0112090A, 3); + setGlobalVar(V_MATCH_STATUS, 3); break; } return messageResult; @@ -539,7 +539,7 @@ void AsScene1201Match::stOnDoorFrameMoving() { } void AsScene1201Match::stFallingFromDoorFrame() { - setGlobalVar(0x0112090A, 2); + setGlobalVar(V_MATCH_STATUS, 2); _x -= 199; _y += 119; startAnimation(0x018D0240, 0, -1); @@ -752,7 +752,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x04063110, 500); topY4 = tempSprite->getY() + 1; - _asTntManRope = insertSprite(getGlobalVar(0x000CF819) && which != 1); + _asTntManRope = insertSprite(getGlobalVar(V_TNT_DUMMY_BUILT) && which != 1); _asTntManRope->setClipRect(0, topY4, 640, 480); insertStaticSprite(0x400B04B0, 1200); @@ -772,7 +772,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(400, 329); setMessageList(0x004AEC08); } else if (which == 2) { - if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { insertKlayman(374, 333); setMessageList(0x004AEC08); } else { @@ -780,7 +780,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AEC20); } } else if (which == 1) { - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(364, 333); _klayman->setDoDeltaX(1); } else { @@ -795,7 +795,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(x1, 0, x2, 480); _klayman->setRepl(64, 0); - if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { setBackground(0x4019A2C4); setPalette(0x4019A2C4); _asRightDoor = NULL; @@ -805,7 +805,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asRightDoor = insertSprite(_klayman, which == 2); } - if (getGlobalVar(0x000CF819)) { + if (getGlobalVar(V_TNT_DUMMY_BUILT)) { insertStaticSprite(0x10002ED8, 500); if (!getGlobalVar(0x0A18CA33)) { _asTntMan = insertSprite(this, _asTntManRope, which == 1); @@ -838,7 +838,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tntIndex += 3; } - if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { setRectList(0x004AEE58); } else { setRectList(0x004AEDC8); @@ -866,7 +866,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tntIndex++; } - if (getGlobalVar(0x0A310817) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { setRectList(0x004AEE18); } else { setRectList(0x004AED88); @@ -879,18 +879,18 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asLeftDoor = insertSprite(_klayman); _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); - if (getGlobalVar(0x0A310817) && getGlobalVar(0x0112090A) == 0) { - setGlobalVar(0x0112090A, 1); + if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) { + setGlobalVar(V_MATCH_STATUS, 1); } _asMatch = NULL; - if (getGlobalVar(0x0112090A) < 3) { + if (getGlobalVar(V_MATCH_STATUS) < 3) { _asMatch = insertSprite(this); _vm->_collisionMan->addSprite(_asMatch); } - if (getGlobalVar(0x0A310817) && getGlobalVar(0x0A18CA33) == 0) { + if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(0x0A18CA33) == 0) { _asCreature = insertSprite(this, _klayman); _asCreature->setClipRect(x1, 0, x2, 480); } @@ -902,7 +902,7 @@ Scene1201::~Scene1201() { void Scene1201::update() { Scene::update(); - if (_asMatch && getGlobalVar(0x0112090A) == 3) + if (_asMatch && getGlobalVar(V_MATCH_STATUS) == 3) deleteSprite(&_asMatch); } @@ -927,7 +927,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2001: - if (!getGlobalVar(0x0112090A)) { + if (getGlobalVar(V_MATCH_STATUS) == 0) { setMessageList2(0x004AECB0); } else { sendEntityMessage(_klayman, 0x1014, _asMatch); @@ -935,12 +935,12 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2002: - if (getGlobalVar(0x20A0C516)) { - // Move the TNT dummy + if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { + // Move the TNT dummy if the fuse is burning sendEntityMessage(_klayman, 0x1014, _asTntMan); setMessageList2(0x004AECF0, false); - } else if (getGlobalVar(0x0112090A) == 3) { - // Light the TNT dummy + } else if (getGlobalVar(V_MATCH_STATUS) == 3) { + // Light the TNT dummy if we have the match sendEntityMessage(_klayman, 0x1014, _asTntMan); if (_klayman->getX() > _asTntMan->getX()) { setMessageList(0x004AECD0); @@ -1107,7 +1107,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x8E8419C1, 1100); - if (getGlobalVar(0x000CF819)) { + if (getGlobalVar(V_TNT_DUMMY_BUILT)) { SetMessageHandler(&Scene1202::hmSolved); } @@ -1120,7 +1120,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) Scene1202::~Scene1202() { if (isSolved()) { - setGlobalVar(0x000CF819, 1); + setGlobalVar(V_TNT_DUMMY_BUILT, 1); } } @@ -1133,7 +1133,7 @@ void Scene1202::update() { } else if (_counter == 0 && isSolved()) { _clickedIndex = 0; SetMessageHandler(&Scene1202::hmSolved); - setGlobalVar(0x000CF819, 1); + setGlobalVar(V_TNT_DUMMY_BUILT, 1); doPaletteEffect(); playSound(3); _soundFlag = true; diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 6533e07814..e8cc843b78 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -305,7 +305,7 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) createSurface1(0x88148150, 500); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1302Bridge::handleMessage); - if (!getGlobalVar(0x13206309)) { + if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { startAnimation(0x88148150, 0, -1); _newStickFrameIndex = 0; } else { @@ -358,7 +358,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) SetMessageHandler(&SsScene1302Fence::handleMessage); SetSpriteUpdate(NULL); _firstY = _y; - if (getGlobalVar(0x80101B1E)) + if (getGlobalVar(V_FLYTRAP_RING_FENCE)) _y += 152; loadSound(0, 0x7A00400C); loadSound(1, 0x78184098); @@ -422,9 +422,9 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _sprite3 = insertStaticSprite(0x16E01E20, 1100); _asRing1 = insertSprite(this, false, 218, 122, _class595->getDrawRect().y, false); - _asRing2 = insertSprite(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x13206309)); + _asRing2 = insertSprite(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE)); _asRing3 = insertSprite(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false); - _asRing4 = insertSprite(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(0x80101B1E)); + _asRing4 = insertSprite(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE)); _asRing5 = insertSprite(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false); _asBridge = insertSprite(this); @@ -456,7 +456,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asInteger() == 0x4A845A00) { sendEntityMessage(_klayman, 0x1014, _asRing1); } else if (param.asInteger() == 0x43807801) { - if (!getGlobalVar(0x13206309)) { + if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { sendEntityMessage(_klayman, 0x1014, _asRing2); if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) { setMessageList(0x004B0940); @@ -470,7 +470,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x46C26A01) { sendEntityMessage(_klayman, 0x1014, _asRing3); } else if (param.asInteger() == 0x468C7B11) { - if (!getGlobalVar(0x80101B1E)) { + if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) { sendEntityMessage(_klayman, 0x1014, _asRing4); if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) { setMessageList(0x004B0940); @@ -484,13 +484,13 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x42845B19) { sendEntityMessage(_klayman, 0x1014, _asRing5); } else if (param.asInteger() == 0x430A6060) { - if (getGlobalVar(0x13206309)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { setMessageList2(0x004B0910); } else { cancelMessageList(); } } else if (param.asInteger() == 0x012E2070) { - if (getGlobalVar(0x13206309)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { setMessageList2(0x004B0968); } else { cancelMessageList(); @@ -525,12 +525,12 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit playSound(0, 0x665198C0); } else if (sender == _asRing2) { sendMessage(_asBridge, 0x4808, 0); - setGlobalVar(0x13206309, 1); + setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); } else if (sender == _asRing3) { playSound(0, 0xE2D389C0); } else if (sender == _asRing4) { sendMessage(_ssFence, 0x4808, 0); - setGlobalVar(0x80101B1E, 1); + setGlobalVar(V_FLYTRAP_RING_FENCE, 1); } else if (sender == _asRing5) { playSound(0, 0x40428A09); } @@ -538,13 +538,13 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x4807: if (sender == _asRing2) { sendMessage(_asBridge, 0x4809, 0); - setGlobalVar(0x13206309, 0); + setGlobalVar(V_FLYTRAP_RING_BRIDGE, 0); _sprite2->setVisible(false); } else if (sender == _asRing4) { sendMessage(_ssFence, 0x4809, 0); - setGlobalVar(0x80101B1E, 0); + setGlobalVar(V_FLYTRAP_RING_FENCE, 0); } else if (sender == _asVenusFlyTrap) { - if (getGlobalVar(0x13206309)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { sendMessage(_asRing2, 0x4807, 0); } else { sendMessage(_asRing4, 0x4807, 0); @@ -555,11 +555,11 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _asRing2) { playSound(0, 0x60755842); sendMessage(_asBridge, 0x4808, 0); - setGlobalVar(0x13206309, 1); + setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); } else if (sender == _asRing4) { playSound(0, 0x60755842); sendMessage(_ssFence, 0x4808, 0); - setGlobalVar(0x80101B1E, 1); + setGlobalVar(V_FLYTRAP_RING_FENCE, 1); } break; case 0x482A: @@ -639,7 +639,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x01581A9C); insertMouse433(0x81A9801D); - if (!getGlobalVar(0xAC00C0D0)) { + if (!getGlobalVar(V_BALLOON_POPPED)) { _asBalloon = insertSprite(this); _vm->_collisionMan->addSprite(_asBalloon); } @@ -657,11 +657,11 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: - setGlobalVar(0xAC00C0D0, 1); + setGlobalVar(V_BALLOON_POPPED, 1); sendMessage(_asBalloon, 0x2000, 0); break; case 0x4826: - if (sender == _asBalloon && getGlobalVar(0x31C63C51)) { + if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) { setMessageList(0x004AF9B8); } break; @@ -684,7 +684,7 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶ messageResult = 1; break; case 0x4806: - setGlobalVar(0x31C63C51, 1); + setGlobalVar(V_HAS_NEEDLE, 1); setVisible(false); SetMessageHandler(NULL); break; @@ -703,7 +703,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x062C0214); insertMouse433(0xC021006A); - if (getGlobalVar(0xAC00C0D0)) { + if (getGlobalVar(V_BALLOON_POPPED)) { _asKey = insertSprite(this, 0, 1100, 278, 347); _vm->_collisionMan->addSprite(_asKey); } else { @@ -711,7 +711,7 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) // TODO _asKey->setUpdateDeltaXY(); } - if (!getGlobalVar(0x31C63C51)) { + if (!getGlobalVar(V_HAS_NEEDLE)) { _asNeedle = insertSprite(this, 1100, 278, 347); _vm->_collisionMan->addSprite(_asNeedle); } else { @@ -739,7 +739,7 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x415634A4) { - if (getGlobalVar(0xAC00C0D0)) { + if (getGlobalVar(V_BALLOON_POPPED)) { cancelMessageList(); } else { setMessageList(0x004B9158); @@ -874,8 +874,8 @@ void AsScene1306Elevator::cbGoingDownEvent() { Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) - setGlobalVar(0x13382860, 4); + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 4); _surfaceFlag = true; SetMessageHandler(&Scene1306::handleMessage); @@ -884,7 +884,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x05303114); insertMouse433(0x0311005B); - if (getGlobalVar(0x13382860) == 4) { + if (getGlobalVar(V_KEY3_LOCATION) == 4) { _asKey = insertSprite(this, 2, 1100, 435, 445); _vm->_collisionMan->addSprite(_asKey); } @@ -915,7 +915,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 2) { - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(515, 440); _klayman->setDoDeltaX(1); } else { @@ -955,7 +955,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1306::~Scene1306() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1320,7 +1320,7 @@ void Scene1307::update() { } if (_doLeaveScene && !isSoundPlaying(0)) { leaveScene(1); - setGlobalVar(0x80455A41, 1); + setGlobalVar(V_KEYDOOR_UNLOCKED, 1); } } @@ -1593,7 +1593,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 17, 1100, 502, 445, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - if (getGlobalVar(0x01023818)) { + if (getGlobalVar(V_MOUSE_SUCKED_IN)) { insertSprite(); insertSprite(0x461A1490, 200, 235, 429); } @@ -1613,7 +1613,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { insertKlayman(380, 440); setMessageList(0x004B57C0); - if (getGlobalVar(0x80455A41)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); setRectList(0x004B5990); } else { @@ -1623,7 +1623,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 1) { insertKlayman(640, 440); setMessageList(0x004B57C8); - if (getGlobalVar(0x80455A41)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); setRectList(0x004B5990); } else { @@ -1633,7 +1633,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 2) { insertKlayman(475, 440); setMessageList(0x004B58B0); - if (getGlobalVar(0x80455A41)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite5 = insertSprite(this); _sprite4 = insertStaticSprite(0x0101A624, 1100); _sprite4->setVisible(false); @@ -1646,7 +1646,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B57D0); sendMessage(_asJaggyDoor, 0x4808, 0); _sprite1->setVisible(false); - if (getGlobalVar(0x80455A41)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); _klayman->setVisible(false); } else { @@ -1661,7 +1661,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } - if (getGlobalVar(0x04A105B3) == 4) { + if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_asProjector); _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); @@ -1681,7 +1681,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit _flag1 = true; } else if (param.asInteger() == 0x08821382) { sendEntityMessage(_klayman, 0x1014, _asProjector); - if (getGlobalVar(0x80455A41)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { setRectList(0x004B5990); } else { setRectList(0x004B5980); @@ -1703,7 +1703,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - if (getGlobalVar(0x80455A41)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { setRectList(0x004B5990); } else { setRectList(0x004B5980); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 9cfb826882..d207428d80 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -387,19 +387,18 @@ static const AsCommonProjectorItem kAsCommonProjectorItems[] = { AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) { - _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(0x04A105B3)]; + _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)]; // TODO createSurface3(990, dword_4B26D8); createSurface(990, 640, 480); //TODO: Remeove once the line above is done startAnimation(0x10E3042B, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsCommonProjector::handleMessage); - _x = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; + _x = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; _lockedInSlot = true; moveProjector(); setDoDeltaX(1); - if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) { + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) stStayLockedInSlot(); - } loadSound(2, 0xC8C2507C); } @@ -415,8 +414,8 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶ messageResult = 1; break; case 0x4807: - setGlobalVar(0x04A10F33, (_x - _asProjectorItem->point.x) / 108); - if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->lockSlotIndex) { + setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108); + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) { stStartLockedInSlot(); } else { stIdle(); @@ -424,20 +423,20 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶ break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) { - incGlobalVar(0x04A10F33, 1); + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) { + incGlobalVar(V_PROJECTOR_SLOT, 1); } - } else if (getGlobalVar(0x04A10F33) > 0) { - incGlobalVar(0x04A10F33, -1); + } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) { + incGlobalVar(V_PROJECTOR_SLOT, -1); } stMoving(); break; case 0x480C: // Check if the projector can be moved if (param.asInteger() != 1) { - messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0; + messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; } else { - messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; + messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; } break; case 0x482A: @@ -471,20 +470,20 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount) { - incGlobalVar(0x04A10F33, 1); + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) { + incGlobalVar(V_PROJECTOR_SLOT, 1); } - } else if (getGlobalVar(0x04A10F33) > 0) { - incGlobalVar(0x04A10F33, -1); + } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) { + incGlobalVar(V_PROJECTOR_SLOT, -1); } stTurnToFront(); break; case 0x480C: // Check if the projector can be moved if (param.asInteger() != 1) { - messageResult = (int8)getGlobalVar(0x04A10F33) < _asProjectorItem->maxSlotCount ? 1 : 0; + messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; } else { - messageResult = getGlobalVar(0x04A10F33) > 0 ? 1 : 0; + messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; } break; case 0x480F: @@ -517,14 +516,14 @@ void AsCommonProjector::suMoving() { _x = _klayman->getX() + 100; moveProjector(); if (_beforeMoveX == _x) { - if (getGlobalVar(0x04A10F33) == 0 && _asProjectorItem->leftBorderLeaves != 0) { + if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) { sendMessage(_parentScene, 0x1019, 0); - incGlobalVar(0x04A105B3, -1); - setGlobalVar(0x04A10F33, kAsCommonProjectorItems[getGlobalVar(0x04A105B3)].maxSlotCount); - } else if ((int8)getGlobalVar(0x04A10F33) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) { + incGlobalVar(V_PROJECTOR_LOCATION, -1); + setGlobalVar(V_PROJECTOR_SLOT, kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)].maxSlotCount); + } else if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) { sendMessage(_parentScene, 0x1019, 1); - incGlobalVar(0x04A105B3, +1); - setGlobalVar(0x04A10F33, 0); + incGlobalVar(V_PROJECTOR_LOCATION, +1); + setGlobalVar(V_PROJECTOR_SLOT, 0); } } Sprite::processDelta(); @@ -579,7 +578,7 @@ void AsCommonProjector::stIdle() { } void AsCommonProjector::stMoving() { - _beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; + _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; startAnimation(0x14A10137, 0, -1); SetSpriteUpdate(&AsCommonProjector::suMoving); SetMessageHandler(&AsCommonProjector::handleMessage); @@ -604,7 +603,7 @@ void AsCommonProjector::stStartProjecting() { SetMessageHandler(&AsCommonProjector::hmAnimation); SetSpriteUpdate(NULL); NextState(&AsCommonProjector::stLockedInSlot); - setGlobalVar(0x12A10DB3, 1); + setGlobalVar(V_PROJECTOR_ACTIVE, 1); playSound(0, 0xCC4A8456); _vm->_soundMan->addSound(0x05331081, 0xCE428854); _vm->_soundMan->playSoundLooping(0xCE428854); @@ -622,13 +621,13 @@ void AsCommonProjector::stStopProjecting() { SetSpriteUpdate(NULL); SetMessageHandler(&AsCommonProjector::hmAnimation); NextState(&AsCommonProjector::stStayLockedInSlot); - setGlobalVar(0x12A10DB3, 0); + setGlobalVar(V_PROJECTOR_ACTIVE, 0); playSound(0, 0xCC4A8456); _vm->_soundMan->deleteSound(0xCE428854); } void AsCommonProjector::stTurnToFront() { - _beforeMoveX = getGlobalVar(0x04A10F33) * 108 + _asProjectorItem->point.x; + _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; startAnimation(0x22CB4A33, 0, -1); SetSpriteUpdate(&AsCommonProjector::suMoving); SetMessageHandler(&AsCommonProjector::hmAnimation); @@ -636,8 +635,8 @@ void AsCommonProjector::stTurnToFront() { } void AsCommonProjector::stStartSuckedIn() { - setGlobalVar(0x04A105B3, 4); - setGlobalVar(0x04A10F33, 0); + setGlobalVar(V_PROJECTOR_LOCATION, 4); + setGlobalVar(V_PROJECTOR_SLOT, 0); SetSpriteUpdate(&AsCommonProjector::stSuckedIn); SetMessageHandler(&Sprite::handleMessage); startAnimation(0x708D4712, 0, -1); @@ -661,7 +660,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _ssFloorButton = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); _asPipe = insertSprite(); - if (!getGlobalVar(0x01023818)) { + if (!getGlobalVar(V_MOUSE_SUCKED_IN)) { _asMouse = insertSprite(); _asCheese = insertSprite(); } @@ -691,15 +690,15 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1->setVisible(false); } - if (getGlobalVar(0x04A105B3) == 2) { + if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) { _asProjector = insertSprite(this, _klayman, _asPipe); _vm->_collisionMan->addSprite(_asProjector); - if (getGlobalVar(0x04A10F33) == 6) { + if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); _klayman->processDelta(); setMessageList(0x004B6670); - } else if (getGlobalVar(0x04A10F33) == 0) { + } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); _klayman->processDelta(); @@ -754,10 +753,10 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x480B: if (sender == _ssFloorButton) { sendMessage(_asPipe, 0x2000, 0); - if (!getGlobalVar(0x01023818)) { + if (!getGlobalVar(V_MOUSE_SUCKED_IN)) { sendMessage(_asMouse, 0x4839, 0); sendMessage(_asCheese, 0x4839, 0); - setGlobalVar(0x01023818, 1); + setGlobalVar(V_MOUSE_SUCKED_IN, 1); } if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) sendMessage(_asProjector , 0x4839, 0); @@ -880,7 +879,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _ssBridgePart2 = insertSprite(0x10A02120, 1100); _ssBridgePart3 = insertSprite(0x60882BE0, 1100); - if (getGlobalVar(0x70A1189C)) + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) setRectList(0x004B0C48); else setRectList(0x004B0C98); @@ -888,7 +887,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { insertKlayman(377, 391); setMessageList(0x004B0B48); - if (!getGlobalVar(0x70A1189C)) { + if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { _asPuzzleBox = insertSprite(this, 0); } } else if (which == 1) { @@ -898,7 +897,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(377, 391); setMessageList(0x004B0B60); _klayman->setDoDeltaX(1); - if (getGlobalVar(0x70A1189C)) { + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { _asPuzzleBox = insertSprite(this, 1); clearRectList(); showMouse(false); @@ -909,7 +908,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) } else { insertKlayman(513, 391); setMessageList(0x004B0B58); - if (!getGlobalVar(0x70A1189C)) { + if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { _asPuzzleBox = insertSprite(this, 2); startShaking(); } @@ -959,7 +958,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x00F43389) { - if (getGlobalVar(0x70A1189C)) { + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { leaveScene(0); } else { clearRectList(); @@ -1301,7 +1300,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2000: // The mouse got the cheese (nomnom) - setGlobalVar(0x70A1189C, 1); + setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1); playSound(0, 0x68E25540); showMouse(false); _puzzleSolvedCountdown = 72; @@ -1348,10 +1347,10 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) } _klayman->setRepl(64, 0); - if (getGlobalVar(0x04A105B3) == 4) { + if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_asProjector); - if (getGlobalVar(0x04A10F33) == 4) { + if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); _klayman->processDelta(); @@ -1425,8 +1424,8 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) { - if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) - setGlobalVar(0x13382860, 5); + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 5); SetMessageHandler(&Scene1404::handleMessage); _surfaceFlag = true; @@ -1438,7 +1437,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(0x00801510, 0, 65, 0); insertMouse433(0xB006BAC8); - if (getGlobalVar(0x13382860) == 5) { + if (getGlobalVar(V_KEY3_LOCATION) == 5) { _asKey = insertSprite(this, 2, 1100, 267, 411); _vm->_collisionMan->addSprite(_asKey); } @@ -1455,7 +1454,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(376, 406); setMessageList(0x004B8C30); } else if (which == 2) { - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(347, 406); _klayman->setDoDeltaX(1); } else { @@ -1467,10 +1466,10 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B8C38); } - if (getGlobalVar(0x04A105B3) == 3) { + if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_asProjector); - if (getGlobalVar(0x04A10F33) == 0) { + if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); _klayman->processDelta(); @@ -1484,7 +1483,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1404::~Scene1404() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 5d0207b133..f45f87faca 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -95,17 +95,17 @@ void Module1600::createScene(int sceneNum, int which) { _childObject = new Scene1609(_vm, this, which); break; case 1001: - if (getGlobalVar(0xA0808898) == 1) { + if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) { createSmackerScene(0x80050200, true, true, false); - } else if (getGlobalVar(0xA0808898) == 2) { + } else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) { createSmackerScene(0x80090200, true, true, false); } else { createSmackerScene(0x80000200, true, true, false); } - if (getGlobalVar(0xA0808898) >= 2) - setGlobalVar(0xA0808898, 0); + if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2) + setGlobalVar(V_TALK_COUNTING_INDEX, 0); else - incGlobalVar(0xA0808898, +1); + incGlobalVar(V_TALK_COUNTING_INDEX, +1); break; } SetUpdateHandler(&Module1600::updateScene); @@ -210,13 +210,13 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 _rectList = NULL; startAnimation(0xD4220027, 0, -1); - setDoDeltaX(getGlobalVar(0x21E60190)); + setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); } AsCommonCar::~AsCommonCar() { if (_finalizeStateCb == AnimationCallback(&AsCommonCar::sub45D620)) { - setGlobalVar(0x21E60190, !getGlobalVar(0x21E60190)); + setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X)); } } @@ -548,7 +548,7 @@ void AsCommonCar::sub45D100() { } else { startAnimation(0xD4220027, 0, -1); } - setGlobalVar(0x21E60190, _doDeltaX ? 1 : 0); + setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0); } void AsCommonCar::sub45D180() { @@ -1068,7 +1068,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) the upper/lower floors and rename them accordingly. */ - setGlobalVar(0x21E60190, 1); + setGlobalVar(V_CAR_DELTA_X, 1); _surfaceFlag = true; SetMessageHandler(&Scene1608::hmLowerFloor); @@ -1127,7 +1127,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower = insertSprite(375, 227); _asIdleCarFull = insertSprite(375, 227); _asCar->setVisible(false); - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(373, 220); _klayman->setDoDeltaX(1); } else { @@ -1204,7 +1204,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1608::~Scene1608() { - setGlobalVar(0xC0418A02, _kmScene1608->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); if (_klaymanInCar) { delete _kmScene1608; } else { @@ -1388,7 +1388,7 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { // TODO _vm->gameModule()->initScene3011Vars(); - _noisySymbolIndex = getGlobalVar(0x2414C2F2); + _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); _surfaceFlag = true; SetMessageHandler(&Scene1609::handleMessage); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index b75167fa4d..f6d140b904 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -186,7 +186,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - setGlobalVar(0xE7498218, 1); + setGlobalVar(V_FELL_DOWN_HOLE, 1); _vm->gameModule()->initScene3009Vars(); SetMessageHandler(&Scene1705::handleMessage); diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 5bb03d4aa1..7925c46b9a 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -101,9 +101,9 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x42213133, 1100); - if (!getGlobalVar(0xA9035F60)) { + if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { insertStaticSprite(0x40A40168, 100); - } else if (getGlobalVar(0x09221A62)) { + } else if (getGlobalVar(V_STAIRS_DOWN)) { insertStaticSprite(0x124404C4, 100); setGlobalVar(0x2050861A, 1); } else { @@ -195,10 +195,10 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene _symbolFlag1 = 0; _symbolFlag2 = 0; - if (getGlobalVar(0xA9035F60)) { + if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { _isPluggedIn = true; _currPositionIndex = elementIndex; - if (!getGlobalVar(0x09221A62)) { + if (!getGlobalVar(V_STAIRS_DOWN)) { _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; } else { @@ -325,7 +325,7 @@ void AsScene1907Symbol::suMoveDown() { void AsScene1907Symbol::suMoveUp() { _y -= _yIncr; - if (getGlobalVar(0x10938830)) { + if (getGlobalVar(V_WALL_BROKEN)) { if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { _yIncr--; } else { @@ -470,8 +470,8 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 loadSound(0, 0x44061000); SetUpdateHandler(&SsScene1907UpDownButton::update); SetMessageHandler(&SsScene1907UpDownButton::handleMessage); - if (getGlobalVar(0xA9035F60)) { - if (getGlobalVar(0x09221A62)) + if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { + if (getGlobalVar(V_STAIRS_DOWN)) setToDownPosition(); else setToUpPosition(); @@ -490,7 +490,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(0xA9035F60)) { + if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { setVisible(true); _countdown1 = 4; StaticSprite::update(); @@ -582,7 +582,7 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1907::handleMessage); SetUpdateHandler(&Scene1907::update); - if (getGlobalVar(0xA9035F60)) + if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) _pluggedInCount = 9; loadSound(0, 0x72004A10); @@ -640,20 +640,20 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entit break; // TODO Debug stuff case 0x2000: - if (getGlobalVar(0x09221A62)) { + if (getGlobalVar(V_STAIRS_DOWN)) { playSound(0); for (int i = 0; i < 9; i++) _asSymbols[i]->moveUp(); _ssUpDownButton->setToUpPosition(); - setGlobalVar(0x09221A62, 0); + setGlobalVar(V_STAIRS_DOWN, 0); } else { - if (!getGlobalVar(0x10938830)) { + if (!getGlobalVar(V_WALL_BROKEN)) { playSound(2); _countdown3 = 5; } else { playSound(1); _ssUpDownButton->setToDownPosition(); - setGlobalVar(0x09221A62, 1); + setGlobalVar(V_STAIRS_DOWN, 1); } _moveDownCountdown = 1; _currMovingSymbolIndex = 8; @@ -661,7 +661,7 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2001: playSound(3); - setGlobalVar(0xA9035F60, 1); + setGlobalVar(V_STAIRS_PUZZLE_SOLVED, 1); break; } return 0; diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 6ff8a405c3..befcc3414a 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -51,10 +51,10 @@ void Module2000::createScene(int sceneNum, int which) { _childObject = new Scene2001(_vm, this, which); break; case 1: - createNavigationScene(getGlobalVar(0x98109F12) ? 0x004B7B48 : 0x004B7B00, which); + createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which); break; case 2: - setGlobalVar(0x98109F12, 1); + setGlobalVar(V_WORLDS_JOINED, 1); setSubVar(0x2C145A98, 1, 1); createSmackerScene(0x204B2031, true, true, false); break; @@ -75,7 +75,7 @@ void Module2000::updateScene() { break; case 1: if (_moduleResult == 0) { - if (getGlobalVar(0x98109F12)) { + if (getGlobalVar(V_WORLDS_JOINED)) { createScene(1, 0); } else { createScene(2, -1); diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 44ef868adb..700f0cdbd8 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -65,7 +65,7 @@ void Module2100::updateScene() { switch (_vm->gameState().sceneNum) { case 0: if (_moduleResult == 1) { - setGlobalVar(0x2090590C, 1); + setGlobalVar(V_DOOR_PASSED, 1); leaveModule(0); } else { leaveModule(1); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 29b4103bb5..503a1d37c0 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -200,13 +200,13 @@ void Module2200::createScene(int sceneNum, int which) { _childObject = new Scene2247(_vm, this, which); break; case 47: - if (!getGlobalVar(0x98109F12)) { - if (getGlobalVar(0x4D080E54)) + if (!getGlobalVar(V_WORLDS_JOINED)) { + if (getGlobalVar(V_LIGHTS_ON)) createStaticScene(0x83110287, 0x10283839); else createStaticScene(0x83412B9D, 0x12B9983C); } else { - if (getGlobalVar(0x4D080E54)) + if (getGlobalVar(V_LIGHTS_ON)) createStaticScene(0x48632087, 0x3208348E); else createStaticScene(0x08C74886, 0x74882084); @@ -533,7 +533,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[1].x2 = 640; _clipRects[1].y2 = 480; - if (!getGlobalVar(0x404290D5)) { + if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) { insertStaticSprite(0x00026027, 900); } @@ -560,7 +560,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B8130); _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else if (which == 2) { - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(379, 427, _clipRects, 2); _klayman->setDoDeltaX(1); } else { @@ -582,7 +582,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2201::~Scene2201() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); _vm->_soundMan->deleteSoundGroup(0x04106220); } @@ -607,7 +607,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B81B8); } } else if (param.asInteger() == 0x51445010) { - if (getGlobalVar(0x404290D5)) { + if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) { setMessageList(0x004B8108); } else { setMessageList(0x004B8150); @@ -615,7 +615,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x1D203082) { setMessageList(0x004B8180); } else if (param.asInteger() == 0x00049091) { - if (getGlobalVar(0x404290D5)) { + if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) { setMessageList(0x004B8138); } else { setMessageList(0x004B8108); @@ -707,7 +707,7 @@ uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam & uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (!_isMoving && !getGlobalVar(0x404290D5)) { + if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) { sendMessage(_parentScene, 0x2000, _tileIndex); } messageResult = 1; @@ -956,7 +956,7 @@ void Scene2202::update() { _ssDoneMovingTile = NULL; if (testIsSolved()) { playSound(0); - setGlobalVar(0x404290D5, 1); + setGlobalVar(V_TILE_PUZZLE_SOLVED, 1); _isSolved = true; } } @@ -1061,7 +1061,7 @@ AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint d _x = 320; _y = 240; createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900); - if (getGlobalVar(0x9A500914) == _doorIndex) { + if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) { startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); _newStickFrameIndex = -2; } else { @@ -1074,7 +1074,7 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (_doorIndex == getGlobalVar(0x9A500914)) + if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) sendMessage(_parentScene, 0x2002, 0); else sendMessage(_parentScene, 0x2001, 0); @@ -1084,12 +1084,12 @@ uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, _otherDoor = (Sprite*)param.asEntity(); break; case 0x3002: - if (_doorIndex == getGlobalVar(0x9A500914)) + if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) sendMessage(_parentScene, 0x4808, 0); stopAnimation(); break; case 0x4808: - setGlobalVar(0x9A500914, _doorIndex); + setGlobalVar(V_LARGE_DOOR_NUMBER, _doorIndex); sendMessage(_otherDoor, 0x4809, 0); openDoor(); break; @@ -1115,8 +1115,8 @@ void AsScene2203Door::closeDoor() { Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) - setGlobalVar(0x13382860, 1); + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 1); SetMessageHandler(&Scene2203::handleMessage); _surfaceFlag = true; @@ -1127,9 +1127,9 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B8320); - //DEBUG setGlobalVar(0x13382860, 1);//###//TODO CHECK IF Below... + //DEBUG setGlobalVar(V_KEY3_LOCATION, 1);//###//TODO CHECK IF Below... - if (getGlobalVar(0x13382860) == 1) { + if (getGlobalVar(V_KEY3_LOCATION) == 1) { _asKey = insertSprite(this, 2, 1100, 282, 432); _vm->_collisionMan->addSprite(_asKey); } @@ -1159,7 +1159,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(640, 427); setMessageList(0x004B8350); } else if (which == 2) { - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(362, 427); _klayman->setDoDeltaX(1); } else { @@ -1171,7 +1171,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B8348); } - if (getGlobalVar(0x9A500914)) { + if (getGlobalVar(V_LARGE_DOOR_NUMBER)) { _ssSmallLeftDoor->setVisible(false); _klayman->setClipRect(_rightDoorClipRect); } else { @@ -1184,7 +1184,7 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2203::~Scene2203() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1238,7 +1238,7 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) : StaticSprite(vm, 900) { SetMessageHandler(&SsScene2205DoorFrame::handleMessage); - _spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0); + _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); createSurface(1100, 45, 206); _drawRect.x = 0; _drawRect.y = 0; @@ -1254,7 +1254,7 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: - _spriteResource.load2(getGlobalVar(0x4D080E54) ? 0x24306227 : 0xD90032A0); + _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); _drawRect.x = 0; _drawRect.y = 0; _drawRect.width = _spriteResource.getDimensions().width; @@ -1276,7 +1276,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B0620); _surfaceFlag = true; - if (getGlobalVar(0x4D080E54)) { + if (getGlobalVar(V_LIGHTS_ON)) { _isLightOn = true; setBackground(0x0008028D); setPalette(0x0008028D); @@ -1299,14 +1299,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { insertKlayman(320, 417); setMessageList(0x004B0658); - if (!getGlobalVar(0x4D080E54)) { + if (!getGlobalVar(V_LIGHTS_ON)) { _palette->addPalette(0x68033B1C, 0, 65, 0); } _isKlaymanInLight = false; } else if (which == 1) { insertKlayman(640, 417); setMessageList(0x004B0648); - if (!getGlobalVar(0x4D080E54)) { + if (!getGlobalVar(V_LIGHTS_ON)) { _palette->addPalette(0x68033B1C, 0, 65, 0); } _isKlaymanInLight = false; @@ -1326,14 +1326,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) void Scene2205::update() { Scene::update(); - if (!_isLightOn && getGlobalVar(0x4D080E54)) { + if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) { _palette->addPalette(0x0008028D, 0, 256, 0); changeBackground(0x0008028D); _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); sendMessage(_ssDoorFrame, 0x2000, 0); changeMouseCursor(0x80289008); _isLightOn = true; - } else if (_isLightOn && !getGlobalVar(0x4D080E54)) { + } else if (_isLightOn && !getGlobalVar(V_LIGHTS_ON)) { _palette->addPalette(0xD00A028D, 0, 256, 0); changeBackground(0xD00A028D); _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); @@ -1347,7 +1347,7 @@ void Scene2205::update() { _isLightOn = false; } - if (!getGlobalVar(0x4D080E54)) { + if (!getGlobalVar(V_LIGHTS_ON)) { if (_isKlaymanInLight && _klayman->getX() > 85) { _palette->addBasePalette(0x68033B1C, 0, 65, 0); _palette->startFadeToPalette(12); @@ -1374,7 +1374,7 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480B: - setGlobalVar(0x4D080E54, getGlobalVar(0x4D080E54) ? 0 : 1); + setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1); break; } return 0; @@ -1409,7 +1409,7 @@ static const int16 kAsScene2206DoorSpikesXDeltasClose[] = { AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash) : StaticSprite(vm, fileHash, 200) { - if (getGlobalVar(0x18890C91)) + if (getGlobalVar(V_SPIKES_RETRACTED)) _x -= 63; SetUpdateHandler(&AsScene2206DoorSpikes::update); SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); @@ -1493,7 +1493,7 @@ void AsScene2206Platform::suMoveDown() { SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { - if (getGlobalVar(0x45080C38)) { + if (getGlobalVar(V_HAS_TEST_TUBE)) { setVisible(false); SetMessageHandler(NULL); } else { @@ -1511,7 +1511,7 @@ uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &pa messageResult = 1; break; case 0x4806: - setGlobalVar(0x45080C38, 1); + setGlobalVar(V_HAS_TEST_TUBE, 1); setVisible(false); SetMessageHandler(NULL); break; @@ -1528,7 +1528,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2206::handleMessage); _surfaceFlag = true; - if (getGlobalVar(0x4D080E54)) { + if (getGlobalVar(V_LIGHTS_ON)) { fileHash = 0x41983216; _sprite1 = insertStaticSprite(0x2201266A, 100); _sprite2 = insertStaticSprite(0x3406A333, 300); @@ -1563,7 +1563,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(fileHash, 0, 256, 0); - if (!getGlobalVar(0x4D080E54)) { + if (!getGlobalVar(V_LIGHTS_ON)) { _palette->addPalette(0x0263D144, 0, 65, 0); } @@ -1578,12 +1578,12 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 2) { insertKlayman(205, 396); setMessageList(0x004B88C8); - _palette->addPalette(getGlobalVar(0x4D080E54) ? 0xB103B604 : 0x0263D144, 0, 65, 0); + _palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0); klaymanBehindSpikes(); playSound(0, 0x53B8284A); } else if (which == 3) { - insertKlayman(kScene2206XPositions[getGlobalVar(0x48A68852)], 430); - if (getGlobalVar(0xC0418A02)) + insertKlayman(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430); + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); setMessageList(0x004B8A70); } else { @@ -1597,7 +1597,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2206::~Scene2206() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1609,7 +1609,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (param.asInteger() == 0x402064D8) { sendEntityMessage(_klayman, 0x1014, _ssButton); } else if (param.asInteger() == 0x11C40840) { - if (getGlobalVar(0x18890C91)) + if (getGlobalVar(V_SPIKES_RETRACTED)) setMessageList(0x004B8948); else setMessageList(0x004B8970); @@ -1620,8 +1620,8 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (sender == _ssButton) { - setGlobalVar(0x18890C91, getGlobalVar(0x18890C91) ? 0 : 1); - if (getGlobalVar(0x18890C91)) + setGlobalVar(V_SPIKES_RETRACTED, getGlobalVar(V_SPIKES_RETRACTED) ? 0 : 1); + if (getGlobalVar(V_SPIKES_RETRACTED)) sendMessage(_asDoorSpikes, 0x4808, 0); else sendMessage(_asDoorSpikes, 0x4809, 0); @@ -1642,7 +1642,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene2206::klaymanInFrontSpikes() { - if (getGlobalVar(0x4D080E54)) { + if (getGlobalVar(V_LIGHTS_ON)) { _palette->addBasePalette(0x41983216, 0, 65, 0); _palette->startFadeToPalette(12); } @@ -1654,7 +1654,7 @@ void Scene2206::klaymanInFrontSpikes() { } void Scene2206::klaymanBehindSpikes() { - if (!getGlobalVar(0x4D080E54)) { + if (!getGlobalVar(V_LIGHTS_ON)) { _palette->addBasePalette(0xB103B604, 0, 65, 0); _palette->startFadeToPalette(12); } @@ -1666,16 +1666,16 @@ void Scene2206::klaymanBehindSpikes() { } void Scene2206::readClickedColumn() { - setGlobalVar(0x48A68852, (_mouseClickPos.x - 354) / 96); - if (getGlobalVar(0x48A68852) > 2) - setGlobalVar(0x48A68852, 2); - setGlobalVar(0x49C40058, (_mouseClickPos.y - 183) / 7); - setGlobalVar(0xC8C28808, calcHash("stLineagex")); - setGlobalVar(0x4CE79018, 0); - if (ABS(kScene2206XPositions[getGlobalVar(0x48A68852)] - _klayman->getX()) >= 144) { - setMessageList2(kScene2206MessageIds1[getGlobalVar(0x48A68852)]); + setGlobalVar(V_CLICKED_COLUMN_INDEX, (_mouseClickPos.x - 354) / 96); + if (getGlobalVar(V_CLICKED_COLUMN_INDEX) > 2) + setGlobalVar(V_CLICKED_COLUMN_INDEX, 2); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7); + setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); + setGlobalVar(V_COLUMN_BACK_NAME, 0); + if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144) { + setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); } else { - setMessageList2(kScene2206MessageIds2[getGlobalVar(0x48A68852)]); + setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); } } @@ -1705,7 +1705,7 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene _x = pt.x; _y = pt.y; createSurface(1100, 129, 103); - startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, 0, 0); + startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0); SetUpdateHandler(&AsScene2207Elevator::update); SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); SetMessageHandler(&AsScene2207Elevator::handleMessage); @@ -1720,7 +1720,7 @@ void AsScene2207Elevator::update() { if (_destPointIndex + _destPointIndexDelta > _pointIndex) { _pointIndex++; - startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); _newStickFrameIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { if (_destPointIndexDelta != 0) { @@ -1736,7 +1736,7 @@ void AsScene2207Elevator::update() { _pointIndex--; if (_pointIndex == 0) sendMessage(_parentScene, 0x2003, 0); - startAnimation(getGlobalVar(0x4D080E54) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); _newStickFrameIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { if (_destPointIndexDelta != 0) { @@ -2012,7 +2012,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { //DEBUG>>> - setGlobalVar(0x4D080E54, 1); + //setGlobalVar(V_LIGHTS_ON, 1); //DEBUG<<< _vm->gameModule()->initScene3009Vars(); @@ -2031,7 +2031,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _asElevator = insertSprite(this); - if (getGlobalVar(0x4D080E54)) { + if (getGlobalVar(V_LIGHTS_ON)) { setBackground(0x88C00241); setPalette(0x88C00241); @@ -2061,7 +2061,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) } else { - setGlobalVar(0x81890D14, 1); + setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1); setBackground(0x05C02A55); setPalette(0x05C02A55); @@ -2227,18 +2227,18 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) SpriteResource spriteResource(_vm); const char *textStart, *textEnd; - if (!getGlobalVar(0xC8C28808)) - setGlobalVar(0xC8C28808, calcHash("stLineagex")); + if (!getGlobalVar(V_COLUMN_TEXT_NAME)) + setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); - _textResource.load(getGlobalVar(0xC8C28808)); + _textResource.load(getGlobalVar(V_COLUMN_TEXT_NAME)); - textStart = _textResource.getString(getGlobalVar(0x48A68852), textEnd); + textStart = _textResource.getString(getGlobalVar(V_CLICKED_COLUMN_INDEX), textEnd); while (textStart < textEnd) { _strings.push_back(textStart); textStart += strlen(textStart) + 1; } - _maxRowIndex = 8 + 10 * (3 - (getGlobalVar(0xC8C28808) == calcHash("stLineagex") ? 1 : 0)); + _maxRowIndex = 8 + 10 * (3 - (getGlobalVar(V_COLUMN_TEXT_NAME) == calcHash("stLineagex") ? 1 : 0)); _background = new Background(_vm, 0); _background->createSurface(0, 640, 528); @@ -2257,11 +2257,11 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); - spriteResource.load2(!getGlobalVar(0x4CE79018) ? kScene2208FileHashes1[getGlobalVar(0x48A68852) % 6] : getGlobalVar(0x4CE79018)); + spriteResource.load2(!getGlobalVar(V_COLUMN_BACK_NAME) ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] : getGlobalVar(V_COLUMN_BACK_NAME)); _topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); - spriteResource.load2(kScene2208FileHashes2[getGlobalVar(0x48A68852) % 6]); + spriteResource.load2(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6]); _bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); SetUpdateHandler(&Scene2208::update); @@ -2269,7 +2269,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _visibleRowsCount = 10; - _newRowIndex = (int16)getGlobalVar(0x49C40058); + _newRowIndex = (int16)getGlobalVar(V_CLICKED_COLUMN_ROW); if (_newRowIndex + _visibleRowsCount > _maxRowIndex) _newRowIndex = _maxRowIndex - _visibleRowsCount; if (_newRowIndex < 6) @@ -2416,7 +2416,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); - if (getGlobalVar(0x4D080E54)) { + if (getGlobalVar(V_LIGHTS_ON)) { setBackground(0x11840E24); setPalette(0x11840E24); insertMouse433(0x40E20110); @@ -2441,9 +2441,9 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(530, 430); setMessageList(0x004B3D60); } else if (which == 2) { - insertKlayman(kScene2242XPositions[!getGlobalVar(0x48A68852) ? 0 : 1], 430); + insertKlayman(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430); setMessageList(0x004B3D48); - if (getGlobalVar(0xC0418A02)) + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); } else { insertKlayman(0, 430); @@ -2455,11 +2455,11 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2242::~Scene2242() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } void Scene2242::update() { - if (!getGlobalVar(0x4D080E54)) { + if (!getGlobalVar(V_LIGHTS_ON)) { if (_isKlaymanInLight && _klayman->getX() < 440) { _palette->addBasePalette(0x68033B1C, 0, 65, 0); _palette->startFadeToPalette(12); @@ -2494,17 +2494,17 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2242::readClickedColumn() { int index; if (_mouseClickPos.x < 108) { - setGlobalVar(0xC8C28808, 0x04290188); - setGlobalVar(0x48A68852, 42); - setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart1")); + setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188); + setGlobalVar(V_CLICKED_COLUMN_INDEX, 42); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart1")); index = 0; } else { - setGlobalVar(0xC8C28808, 0x04290188); - setGlobalVar(0x48A68852, 43); - setGlobalVar(0x4CE79018, calcHash("bgRecPanelStart2")); + setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188); + setGlobalVar(V_CLICKED_COLUMN_INDEX, 43); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart2")); index = 1; } - setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) { setMessageList2(kScene2242MessageListIds1[index]); } else { @@ -2536,7 +2536,7 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule SetMessageHandler(&HallOfRecordsScene::handleMessage); SetUpdateHandler(&Scene::update); - if (!getGlobalVar(0x4D080E54) && _sceneInfo140->bgFilename2) { + if (!getGlobalVar(V_LIGHTS_ON) && _sceneInfo140->bgFilename2) { setRectList(0x004B2BF8); setBackground(_sceneInfo140->bgFilename2); setPalette(_sceneInfo140->bgFilename2); @@ -2555,9 +2555,9 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule insertKlayman(640, 430); setMessageList(0x004B2910); } else if (which == 2) { - insertKlayman(kHallOfRecordsKlaymanXPos[getGlobalVar(0x48A68852) - _sceneInfo140->xPosIndex], 430); + insertKlayman(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _sceneInfo140->xPosIndex], 430); setMessageList(0x004B2B70); - if (getGlobalVar(0xC0418A02)) + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); } else { insertKlayman(0, 430); @@ -2570,7 +2570,7 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule } HallOfRecordsScene::~HallOfRecordsScene() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2590,13 +2590,13 @@ void HallOfRecordsScene::readClickedColumn() { if (index >= _sceneInfo140->count) { setMessageList2(0x004B2920); } else { - setGlobalVar(0x48A68852, _sceneInfo140->xPosIndex + index); - setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7); - setGlobalVar(0xC8C28808, _sceneInfo140->txFilename); + setGlobalVar(V_CLICKED_COLUMN_INDEX, _sceneInfo140->xPosIndex + index); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); + setGlobalVar(V_COLUMN_TEXT_NAME, _sceneInfo140->txFilename); if (index == 0 && _sceneInfo140->bgFilename3) { - setGlobalVar(0x4CE79018, _sceneInfo140->bgFilename3); + setGlobalVar(V_COLUMN_BACK_NAME, _sceneInfo140->bgFilename3); } else { - setGlobalVar(0x4CE79018, 0); + setGlobalVar(V_COLUMN_BACK_NAME, 0); } if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) { setMessageList2(kHallOfRecordsSceneMessageListIds1[index]); @@ -2622,13 +2622,13 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { //DEBUG - setGlobalVar(0x4D080E54, 1); + setGlobalVar(V_LIGHTS_ON, 1); _surfaceFlag = true; SetMessageHandler(&Scene2247::handleMessage); SetUpdateHandler(&Scene::update); - if (getGlobalVar(0x4D080E54)) { + if (getGlobalVar(V_LIGHTS_ON)) { setRectList(0x004B5588); setBackground(0x40339414); setPalette(0x40339414); @@ -2647,8 +2647,8 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(640, 430); setMessageList(0x004B5438); } else if (which == 2) { - insertKlayman(kScene2247XPositions[getGlobalVar(0xC8C28808) == 0x0008E486 ? 0 : 1], 430); - if (getGlobalVar(0xC0418A02)) + insertKlayman(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430); + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); setMessageList(0x004B5530); } else { @@ -2661,7 +2661,7 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2247::~Scene2247() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2680,16 +2680,16 @@ uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2247::readClickedColumn() { int index; if (_mouseClickPos.x < 553) { - setGlobalVar(0xC8C28808, 0x0008E486); - setGlobalVar(0x4CE79018, calcHash("bgFatherHeader")); + setGlobalVar(V_COLUMN_TEXT_NAME, 0x0008E486); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgFatherHeader")); index = 0; } else { - setGlobalVar(0xC8C28808, 0x03086004); - setGlobalVar(0x4CE79018, calcHash("bgQuaterHeader")); + setGlobalVar(V_COLUMN_TEXT_NAME, 0x03086004); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgQuaterHeader")); index = 1; } - setGlobalVar(0x48A68852, 0); - setGlobalVar(0x49C40058, (_mouseClickPos.y - 100) / 7); + setGlobalVar(V_CLICKED_COLUMN_INDEX, 0); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) { setMessageList2(kScene2247MessageListIds1[index]); } else { diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 9e2acff997..c2cf0df133 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -37,10 +37,10 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); //DEBUG>>> - setGlobalVar(0x10938830, 0); + setGlobalVar(V_WALL_BROKEN, 0); //DEBUG<<< - _flag = getGlobalVar(0x10938830) == 0; + _flag = getGlobalVar(V_WALL_BROKEN) == 0; if (_flag) { _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); @@ -90,7 +90,7 @@ void Module2300::createScene(int sceneNum, int which) { createNavigationScene(0x004B6878, which); break; case 3: - if (getGlobalVar(0x10938830)) { + if (getGlobalVar(V_WALL_BROKEN)) { createNavigationScene(0x004B68F0, which); } else { _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index a29795bc21..4e8d26d3a7 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -389,8 +389,8 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene2401Vars(); - setGlobalVar(0x4E0BE910, 1); //DEBUG! Enables water - setGlobalVar(0x45080C38, 1); //DEBUG! Gives the test tube + setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water + setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube _surfaceFlag = true; SetMessageHandler(&Scene2401::handleMessage); @@ -454,8 +454,8 @@ void Scene2401::update() { waterInside = true; } if (puzzleSolved) { - setGlobalVar(0x0045D021, 1); - setGlobalVar(0x86615030, 1); + setGlobalVar(V_NOTES_DOOR_UNLOCKED, 1); + setGlobalVar(V_NOTES_PUZZLE_SOLVED, 1); sendMessage(_asDoor, 0x4808, 0); } else if (waterInside) { playPipeSound(0xD0431020); @@ -495,20 +495,20 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit else if (param.asInteger() == 0x02144CB1) sendEntityMessage(_klayman, 0x1014, _ssFloorButton); else if (param.asInteger() == 0x11C40840) { - if (getGlobalVar(0x0045D021) && sendMessage(_asDoor, 0x2004, 0)) { + if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) { setMessageList(0x004B3090); } else { setMessageList(0x004B30B0); } } else if (param.asInteger() == 0x412722C0) { - if (_countdown2 > 0 && getGlobalVar(0x45080C38)) { + if (_countdown2 > 0 && getGlobalVar(V_HAS_TEST_TUBE)) { _countdown2 = 144; setMessageList(0x004B3020); } else { setMessageList(0x004B3050); } } else if (param.asInteger() == 0x21142050) { - if (_flag && _countdown1 == 0 && getGlobalVar(0x86615030) == 0) { + if (_flag && _countdown1 == 0 && getGlobalVar(V_NOTES_PUZZLE_SOLVED) == 0) { setMessageList(0x004B2FA8); } else { setMessageList(0x004B2FC8); @@ -542,7 +542,7 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sender == _ssButton) { _pipeStatus = 0; _countdown1 = 8; - } else if (sender == _ssFloorButton && getGlobalVar(0x4E0BE910)) { + } else if (sender == _ssFloorButton && getGlobalVar(V_WATER_RUNNING)) { _countdown2 = 144; sendMessage(_asFlowingWater, 0x2002, 0); playSound(0, 0xE1130324); @@ -643,7 +643,7 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) _y = 210; setDoDeltaX(1); - if (!getGlobalVar(0x92603A79)) { + if (!getGlobalVar(V_TV_JOKE_TOLD)) { loadSound(0, 0x58208810); _countdown1 = 48; startAnimation(0x4919397A, 0, -1); @@ -697,7 +697,7 @@ void AsScene2402TV::upFocusKlayman() { } void AsScene2402TV::stJokeFinished() { - setGlobalVar(0x92603A79, 1); + setGlobalVar(V_TV_JOKE_TOLD, 1); startAnimation(0x050A0103, 0, -1); _newStickFrameIndex = 0; SetUpdateHandler(&AsScene2402TV::upFocusKlayman); @@ -743,7 +743,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AF7D8); } else if (which == 2) { insertKlayman(409, 404); - _klayman->setDoDeltaX(getGlobalVar(0xC0418A02) ? 1 : 0); + _klayman->setDoDeltaX(getGlobalVar(V_KLAYMAN_IS_DELTA_X) ? 1 : 0); setMessageList(0x004AF888); } else { insertKlayman(0, 404); @@ -760,7 +760,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2402::~Scene2402() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } void Scene2402::update() { @@ -921,8 +921,8 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite1, *tempSprite2; - if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) - setGlobalVar(0x13382860, 2); + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 2); _surfaceFlag = true; SetMessageHandler(&Scene2406::handleMessage); @@ -930,7 +930,7 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B78C8); insertMouse433(0xB03001A8); - if (getGlobalVar(0x13382860) == 2) { + if (getGlobalVar(V_KEY3_LOCATION) == 2) { _asKey = insertSprite(this, 2, 1100, 560, 409); _vm->_collisionMan->addSprite(_asKey); } @@ -944,7 +944,7 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[0].x2 = tempSprite2->getDrawRect().x2(); _clipRects[0].y2 = 480; - if (getGlobalVar(0x18890C91)) { + if (getGlobalVar(V_SPIKES_RETRACTED)) { setBackground(0x1A0B0304); setPalette(0x1A0B0304); tempSprite1 = insertStaticSprite(0x32923922, 1100); @@ -998,7 +998,7 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x41062804) { - if (getGlobalVar(0x18890C91)) { + if (getGlobalVar(V_SPIKES_RETRACTED)) { setMessageList(0x004B7758); } else { setMessageList(0x004B7738); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index b4d39d9e1d..d6840a3f65 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -92,9 +92,9 @@ void Module2500::createScene(int sceneNum, int which) { createScene2704(which, 0x004B01B8, 220); break; case 2: - setGlobalVar(0x98109F12, 1);// TODO DEBUG! Join the tracks. + setGlobalVar(V_WORLDS_JOINED, 1);// TODO DEBUG! Join the tracks. _vm->gameState().which = which; - if (getGlobalVar(0x98109F12)) + if (getGlobalVar(V_WORLDS_JOINED)) createScene2704(which, 0x004B01E0, 150); else createScene2704(which, 0x004B0208, 150); @@ -107,7 +107,7 @@ void Module2500::createScene(int sceneNum, int which) { createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect); break; case 5: - setGlobalVar(0x21E60190, 1); + setGlobalVar(V_CAR_DELTA_X, 1); _vm->gameState().which = which; createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect); break; @@ -117,7 +117,7 @@ void Module2500::createScene(int sceneNum, int which) { break; case 7: _vm->gameState().which = which; - if (getGlobalVar(0xD0A14D10)) + if (getGlobalVar(V_ENTRANCE_OPEN)) createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1); else createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2); @@ -126,7 +126,7 @@ void Module2500::createScene(int sceneNum, int which) { _childObject = new Scene1608(_vm, this, which); break; case 9: - if (getGlobalVar(0xD0A14D10)) + if (getGlobalVar(V_ENTRANCE_OPEN)) createStaticScene(0xC62A0645, 0xA0641C6A); else createStaticScene(0x7A343546, 0x435427AB); @@ -224,7 +224,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C); _sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670); - setGlobalVar(0x21E60190, 1); + setGlobalVar(V_CAR_DELTA_X, 1); SetUpdateHandler(&Scene2501::update); _surfaceFlag = true; setBackground(0x1B8E8115); diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 435c38c079..6eebd403f8 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -68,7 +68,7 @@ void Module2600::createScene(int sceneNum, int which) { createNavigationScene(0x004B86C8, which); break; case 3: - if (getGlobalVar(0x0A310817)) { + if (getGlobalVar(V_CREATURE_ANGRY)) { createNavigationScene(0x004B8758, which); } else { createNavigationScene(0x004B86F8, which); @@ -88,31 +88,31 @@ void Module2600::createScene(int sceneNum, int which) { _childObject = new Scene2609(_vm, this, which); break; case 1002: - if (getGlobalVar(0x40040831) == 1) { + if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) { createSmackerScene(0x018C0404, true, true, false); - } else if (getGlobalVar(0x40040831) == 2) { + } else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) { createSmackerScene(0x018C0407, true, true, false); } else { createSmackerScene(0x818C0405, true, true, false); } - if (getGlobalVar(0x40040831) >= 2) { - setGlobalVar(0x40040831, 0); + if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) { + setGlobalVar(V_FRUIT_COUNTING_INDEX, 0); } else { - incGlobalVar(0x40040831, +1); + incGlobalVar(V_FRUIT_COUNTING_INDEX, +1); } break; case 1003: createSmackerScene(0x001C0007, true, true, false); break; case 1006: - if (getGlobalVar(0x4E0BE910)) { + if (getGlobalVar(V_WATER_RUNNING)) { createSmackerScene(0x049A1181, true, true, false); } else { createSmackerScene(0x04981181, true, true, false); } break; case 1008: - if (getGlobalVar(0x4E0BE910)) { + if (getGlobalVar(V_WATER_RUNNING)) { createSmackerScene(0x42B80941, true, true, false); } else { createSmackerScene(0x42980941, true, true, false); @@ -153,7 +153,7 @@ void Module2600::updateScene() { break; case 3: if (_moduleResult == 0) { - if (getGlobalVar(0x0A310817)) { + if (getGlobalVar(V_CREATURE_ANGRY)) { createScene(4, 0); } else { createScene(1003, -1); @@ -161,10 +161,10 @@ void Module2600::updateScene() { } else if (_moduleResult == 2) { createScene(1, 1); } else if (_moduleResult == 3) { - if (getGlobalVar(0x0A310817)) { + if (getGlobalVar(V_CREATURE_ANGRY)) { createScene(4, 0); } else { - setGlobalVar(0x0A310817, 1); + setGlobalVar(V_CREATURE_ANGRY, 1); createScene(7, -1); } } @@ -210,7 +210,7 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) _spriteResource.load2(0x825A6923); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - if (!getGlobalVar(0x4E0BE910)) + if (!getGlobalVar(V_WATER_RUNNING)) setVisible(false); _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); @@ -233,11 +233,11 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) void SsScene2609Button::update() { StaticSprite::update(); if (_countdown != 0 && (--_countdown == 0)) { - if (getGlobalVar(0x4E0BE910)) { - setGlobalVar(0x4E0BE910, 0); + if (getGlobalVar(V_WATER_RUNNING)) { + setGlobalVar(V_WATER_RUNNING, 0); sendMessage(_parentScene, 0x2001, 0); } else { - setGlobalVar(0x4E0BE910, 1); + setGlobalVar(V_WATER_RUNNING, 1); sendMessage(_parentScene, 0x2002, 0); } } @@ -249,7 +249,7 @@ uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam ¶ case 0x1011: if (_countdown == 0) { sendMessage(_parentScene, 0x2000, 0); - if (getGlobalVar(0x4E0BE910)) { + if (getGlobalVar(V_WATER_RUNNING)) { setVisible(false); playSound(3); playSound(1); @@ -278,7 +278,7 @@ AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) _vm->_soundMan->addSound(0x08526C36, 0xDC2769B0); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2609Water::handleMessage); - if (getGlobalVar(0x4E0BE910)) + if (getGlobalVar(V_WATER_RUNNING)) sendMessage(this, 0x2002, 0); } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 983e265125..9603f7027d 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -459,7 +459,7 @@ void Module2700::updateScene() { if (!_flag1) { _vm->_soundMan->stopMusic(0x04020210, 0, 1); // TODO _vm->gameModule()->initScene2801Vars(); - _musicFileHash = getGlobalVar(0x89A82A15); + _musicFileHash = getGlobalVar(V_MUSIC_NAME); // TODO? GameState_sub_469C50(&field_52, 0); // TODO MusicMan_create(); // Why? _vm->_soundMan->addMusic(0x42212411, _musicFileHash); @@ -594,7 +594,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) NRect clipRect; SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240); - setGlobalVar(0x21E60190, 1); + setGlobalVar(V_CAR_DELTA_X, 1); _surfaceFlag = true; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 1ec23e0153..e664eb3a83 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -76,8 +76,8 @@ void Module2800::createScene(int sceneNum, int which) { break; case 2: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - //setGlobalVar(0x1860C990,1);//DEBUG - if (getGlobalVar(0x1860C990)) + //setGlobalVar(V_KLAYMAN_SMALL,1);//DEBUG + if (getGlobalVar(V_KLAYMAN_SMALL)) _childObject = new Scene2803Small(_vm, this, which); else _childObject = new Scene2803(_vm, this, which); @@ -171,7 +171,7 @@ void Module2800::createScene(int sceneNum, int which) { break; case 25: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - if (getGlobalVar(0x190A1D18)) + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) createStaticScene(0x01600204, 0x0020001E); else createStaticScene(0x08611204, 0x1120008E); @@ -378,7 +378,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2801::handleMessage); SetUpdateHandler(&Scene::update); - if (getGlobalVar(0x4DE80AC0) == 0) { + if (getGlobalVar(V_RING5_PULLED) == 0) { insertStaticSprite(0x0001264C, 100); } @@ -389,7 +389,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(443, 398); setMessageList(0x004B6BC0); } else if (which == 2) { - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(312, 432); _klayman->setDoDeltaX(1); } else { @@ -450,7 +450,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2801::~Scene2801() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -640,7 +640,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) 0x28680AD4 }; - setGlobalVar(0x1C1B8A9A, 1); + setGlobalVar(V_BEEN_SHRINKING_ROOM, 1); _vm->gameModule()->initScene2808Vars1(); SetMessageHandler(&Scene2803::handleMessage); @@ -815,13 +815,13 @@ void Scene2803::klaymanFloor() { } void Scene2803::toggleBackground() { - setGlobalVar(0x190A1D18, getGlobalVar(0x190A1D18) ? 0 : 1); + setGlobalVar(V_SHRINK_LIGHTS_ON, getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0 : 1); changeBackground(); } void Scene2803::changeBackground() { // TODO? g_screen->resetDirtyRects(); - if (getGlobalVar(0x190A1D18)) { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { _asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D); _background->load(0x412A423E); _palette->addPalette(0x412A423E, 0, 256, 0); @@ -911,7 +911,7 @@ void Scene2803::setPaletteArea1() { void Scene2803::updatePaletteArea() { uint32 fadePaletteHash; - if (getGlobalVar(0x190A1D18)) + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) fadePaletteHash = (_paletteArea == 1) ? 0xB103B604 : 0x412A423E; else fadePaletteHash = (_paletteArea == 1) ? 0x0263D144 : 0x29800A01; @@ -938,7 +938,7 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); - if (getGlobalVar(0x190A1D18)) { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { setBackground(0x412A423E); setPalette(0x412A423E); _palette->addBasePalette(0x412A423E, 0, 256, 0); @@ -1148,7 +1148,7 @@ void Scene2803Small::setPaletteArea3() { } void Scene2803Small::updatePaletteArea(bool instantly) { - if (getGlobalVar(0x190A1D18)) { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { switch (_paletteArea) { case 1: _palette->addBasePalette(0x0A938204, 0, 64, 0); @@ -1182,7 +1182,7 @@ void Scene2803Small::updatePaletteArea(bool instantly) { SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) { - if (getGlobalVar(0x190A1D18)) + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) _spriteResource.load2(0x51A10202); else _spriteResource.load2(0x11814A21); @@ -1387,7 +1387,7 @@ AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWa }; _colorNum = (int16)getSubVar(0xE11A1929, crystalIndex); - _isLightOn = getGlobalVar(0x190A1D18) != 0; + _isLightOn = getGlobalVar(V_SHRINK_LIGHTS_ON) != 0; if (_isLightOn) { _x = kAsScene2804CrystalPoints[crystalIndex].x; _y = kAsScene2804CrystalPoints[crystalIndex].y; @@ -1464,7 +1464,7 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280 0x5008292B }; - if (getGlobalVar(0x190A1D18)) + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) _spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]); else _spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]); @@ -1626,9 +1626,9 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2804::handleMessage); SetUpdateHandler(&Scene2804::update); - //setGlobalVar(0x190A1D18, 1); // DEBUG Set lights on + //setGlobalVar(V_SHRINK_LIGHTS_ON, 1); // DEBUG Set lights on - if (getGlobalVar(0x190A1D18)) { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { setBackground(0xA1D03005); setPalette(0xA1D03005); addEntity(_palette); @@ -1652,7 +1652,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) { AsScene2804CrystalWaves *asCrystalWaves = NULL; - if (crystalIndex < 4 && getGlobalVar(0x190A1D18) == 0) + if (crystalIndex < 4 && getGlobalVar(V_SHRINK_LIGHTS_ON) == 0) asCrystalWaves = insertSprite(crystalIndex); _asCrystals[crystalIndex] = insertSprite(asCrystalWaves, crystalIndex); _ssCrystalButtons[crystalIndex] = insertSprite(this, _asCrystals[crystalIndex], crystalIndex); @@ -1676,7 +1676,7 @@ uint32 Scene2804::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: _isWorking = true; sendMessage(_asCoil, 0x2002, 0); - if (getGlobalVar(0x190A1D18)) { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { sendMessage(_asTarget, 0x2004, 0); _countdown2 = 48; } @@ -1716,7 +1716,7 @@ void Scene2804::update() { if (_isSolved) { _palette->fillBaseWhite(0, 256); _palette->startFadeToPalette(18); - setGlobalVar(0x1860C990, 1); + setGlobalVar(V_KLAYMAN_SMALL, 1); _countdown1 = 48; } } else if (_beamStatus == 6) { @@ -1736,7 +1736,7 @@ void Scene2804::update() { void Scene2804::initCrystalColors() { // TODO Maybe move this into the GameModule so all puzzle init code is together - if (getGlobalVar(0xDE2EC914) == 0) { + if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) { TextResource textResource(_vm); const char *textStart, *textEnd; textResource.load(0x46691611); @@ -1770,7 +1770,7 @@ void Scene2804::initCrystalColors() { setSubVar(0xD4B2089C, index, correctColorNum); setSubVar(0xE11A1929, index, misalignedColorNum); } - setGlobalVar(0xDE2EC914, 1); + setGlobalVar(V_CRYSTAL_COLORS_INIT, 1); } } @@ -1927,7 +1927,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 3) { insertKlayman(378, 423, true, _clipRects, 4); setMessageList(0x004AF0A0, false); - setGlobalVar(0x1860C990, 0); + setGlobalVar(V_KLAYMAN_SMALL, 0); } else { insertKlayman(670, 423, false, _clipRects, 4); setMessageList(0x004AF090); @@ -2562,7 +2562,7 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) } else if (which == 3) { insertKlayman(262, 423, true, _clipRects, 4); setMessageList(0x004B5BA8, false); - setGlobalVar(0x1860C990, 0); + setGlobalVar(V_KLAYMAN_SMALL, 0); } else { insertKlayman(-30, 423, false, _clipRects, 4); setMessageList(0x004B5B88); @@ -2670,7 +2670,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[1].x2 = _sprite6->getDrawRect().x2(); _clipRects[1].y2 = 480; - if (getGlobalVar(0x1860C990)) { + if (getGlobalVar(V_KLAYMAN_SMALL)) { _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); } else { @@ -2680,9 +2680,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x430001C4, 1200); - if (getGlobalVar(0x0018CA22)) { - setGlobalVar(0xCB45DE03, 1); - if (getGlobalVar(0x1860C990)) { + if (getGlobalVar(V_LADDER_DOWN)) { + setGlobalVar(V_BEEN_STATUE_ROOM, 1); + if (getGlobalVar(V_KLAYMAN_SMALL)) { _sprite4 = insertStaticSprite(0x82653808, 100); } else { _sprite4 = insertStaticSprite(0x82653808, 1100); @@ -2691,7 +2691,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } if (which < 0) { - if (getGlobalVar(0x1860C990)) { + if (getGlobalVar(V_KLAYMAN_SMALL)) { insertKlayman(240, 448); _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE438); @@ -2701,7 +2701,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } else { insertKlayman(300, 424, _clipRects, 2); setMessageList(0x004AE438); - if (getGlobalVar(0x0018CA22)) + if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); @@ -2733,9 +2733,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->setSoundVolume(0xC874EE6C, 50); _isRopingDown = false; } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { - if (getGlobalVar(0x1860C990)) { - insertKlayman((int16)getGlobalVar(0x00D30138), 448); - if (getGlobalVar(0xC0418A02)) + if (getGlobalVar(V_KLAYMAN_SMALL)) { + insertKlayman((int16)getGlobalVar(V_KLAYMAN_SAVED_X), 448); + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE6D8); @@ -2744,9 +2744,9 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->removeSprite(_asTape); } else { insertKlaymanLadder(); - if (getGlobalVar(0x00188211)) { + if (getGlobalVar(V_LADDER_DOWN_ACTION)) { setMessageList(0x004AE6E8); - setGlobalVar(0x00188211, 0); + setGlobalVar(V_LADDER_DOWN_ACTION, 0); _isRopingDown = false; } else { setMessageList(0x004AE6D8); @@ -2758,7 +2758,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE6E0); _isRopingDown = false; } else if (which == 4) { - if (getGlobalVar(0x1860C990)) { + if (getGlobalVar(V_KLAYMAN_SMALL)) { insertKlayman(473, 448); _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE428); @@ -2768,7 +2768,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } else { insertKlayman(450, 424, _clipRects, 2); setMessageList(0x004AE418); - if (getGlobalVar(0x0018CA22)) + if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); @@ -2789,23 +2789,23 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2810::~Scene2810() { - setGlobalVar(0xC0418A02, _klayman->isDoDeltaX() ? 1 : 0); - setGlobalVar(0x00D30138, _klayman->getX()); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMAN_SAVED_X, _klayman->getX()); _vm->_soundMan->deleteSoundGroup(0x84400112); } void Scene2810::insertKlaymanLadder() { Sprite *tempSprite; - if (getGlobalVar(0x00188211)) { + if (getGlobalVar(V_LADDER_DOWN_ACTION)) { insertKlayman(430, 424, _clipRects, 2); _klayman->setDoDeltaX(1); } else { - insertKlayman((int16)getGlobalVar(0x00D30138), 424, _clipRects, 2); - if (getGlobalVar(0xC0418A02)) + insertKlayman((int16)getGlobalVar(V_KLAYMAN_SAVED_X), 424, _clipRects, 2); + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); } - if (getGlobalVar(0x0018CA22)) + if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); @@ -2848,20 +2848,18 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004AE688); break; case 0x2000: - debug("0x2000"); setRectList(0x004AE800); _isRopingDown = true; break; case 0x2001: - debug("0x2001"); - if (getGlobalVar(0x0018CA22)) + if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); _isRopingDown = false; break; case 0x4826: - if (sender == _asTape && getGlobalVar(0x1860C990) == 0 && !_isRopingDown) { + if (sender == _asTape && getGlobalVar(V_KLAYMAN_SMALL) == 0 && !_isRopingDown) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004AE750); } @@ -2968,8 +2966,8 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _paletteArea(0) { - if (getGlobalVar(0xC0780812) && getGlobalVar(0x13382860) == 0) - setGlobalVar(0x13382860, 3); + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 3); _surfaceFlag = true; SetMessageHandler(&Scene2812::handleMessage); @@ -2985,7 +2983,7 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x0C06C860, 1100); insertMouse433(0x0060203E); - if (getGlobalVar(0x13382860) == 3) { + if (getGlobalVar(V_KEY3_LOCATION) == 3) { _asKey = insertSprite(this, 2, 1100, 474, 437); _vm->_collisionMan->addSprite(_asKey); } @@ -3015,7 +3013,7 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); } else if (which == 2) { _isRopingDown = false; - if (getGlobalVar(0xC0418A02)) { + if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(554, 432); _klayman->setDoDeltaX(1); } else { @@ -3153,10 +3151,10 @@ void Scene2822::update() { playSound(0, 0x1384CB60); _countdownStatus = 2; _countdown = 12; - } else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) { + } else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) { leaveScene(0); } - } else if (_countdownStatus == 2 && getGlobalVar(0x00188211)) { + } else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) { if (_scrollIndex < 9) { _background->getSurface()->getDrawRect().y = kScene2822BackgroundYPositions[_scrollIndex]; _scrollIndex++; @@ -3180,9 +3178,9 @@ uint32 Scene2822::handleMessage(int messageNum, const MessageParam ¶m, Entit _countdownStatus = 0; _countdown = 12; playSound(1, 0x44061000); - if (getGlobalVar(0x0018CA22) == 0) { - setGlobalVar(0x0018CA22, 1); - setGlobalVar(0x00188211, 1); + if (getGlobalVar(V_LADDER_DOWN) == 0) { + setGlobalVar(V_LADDER_DOWN, 1); + setGlobalVar(V_LADDER_DOWN_ACTION, 1); SetMessageHandler(NULL); playSound(2); _mouseCursor->setVisible(false); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 88caff944a..7312da7a1c 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -47,7 +47,7 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - _flag = getGlobalVar(0x10938830) != 0; + _flag = getGlobalVar(V_WALL_BROKEN) != 0; if (_flag) { _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); @@ -79,9 +79,9 @@ void Module3000::createScene(int sceneNum, int which) { _vm->gameState().sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 1: - if (!getGlobalVar(0x01BA1A52)) { + if (!getGlobalVar(V_BOLT_DOOR_OPEN)) { createNavigationScene(0x004B7C80, which); - } else if (getGlobalVar(0x10938830)) { + } else if (getGlobalVar(V_WALL_BROKEN)) { createNavigationScene(0x004B7CE0, which); } else { createNavigationScene(0x004B7CB0, which); @@ -93,22 +93,22 @@ void Module3000::createScene(int sceneNum, int which) { _soundVolume = 90; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 90); } - if (getGlobalVar(0x10938830)) { + if (getGlobalVar(V_WALL_BROKEN)) { createNavigationScene(0x004B7D58, which); } else { createNavigationScene(0x004B7D10, which); } break; case 3: - if (getGlobalVar(0x09221A62)) + if (getGlobalVar(V_STAIRS_DOWN)) createNavigationScene(0x004B7E60, which); - else if (getGlobalVar(0x10938830)) + else if (getGlobalVar(V_WALL_BROKEN)) createNavigationScene(0x004B7DA0, which); else createNavigationScene(0x004B7E00, which); break; case 4: - if (getGlobalVar(0x09221A62)) + if (getGlobalVar(V_STAIRS_DOWN)) createNavigationScene(0x004B7F20, which); else createNavigationScene(0x004B7EC0, which); @@ -149,23 +149,23 @@ void Module3000::createScene(int sceneNum, int which) { break; // NOTE: Newly introduced sceneNums case 1001: - if (!getGlobalVar(0x01BA1A52)) - if (getGlobalVar(0x10938830)) + if (!getGlobalVar(V_BOLT_DOOR_OPEN)) + if (getGlobalVar(V_WALL_BROKEN)) createSmackerScene(0x00940021, true, true, false); else createSmackerScene(0x01140021, true, true, false); else - if (getGlobalVar(0x10938830)) + if (getGlobalVar(V_WALL_BROKEN)) createSmackerScene(0x001011B1, true, true, false); else createSmackerScene(0x001021B1, true, true, false); - setGlobalVar(0x01BA1A52, getGlobalVar(0x01BA1A52) ? 0 : 1); + setGlobalVar(V_BOLT_DOOR_OPEN, getGlobalVar(V_BOLT_DOOR_OPEN) ? 0 : 1); break; case 1006: createSmackerScene(0x080810C5, true, true, false); break; case 1008: - createSmackerScene(getGlobalVar(0xF0402B0A), true, true, false); + createSmackerScene(getGlobalVar(V_CANNON_SMACKER_NAME), true, true, false); break; } SetUpdateHandler(&Module3000::updateScene); @@ -176,7 +176,7 @@ void Module3000::updateScene() { if (!updateChild()) { switch (_vm->gameState().sceneNum) { case 1: - if (!getGlobalVar(0x01BA1A52)) { + if (!getGlobalVar(V_BOLT_DOOR_OPEN)) { if (_moduleResult == 0) createScene(9, -1); else if (_moduleResult == 1) @@ -200,7 +200,7 @@ void Module3000::updateScene() { if (_moduleResult == 0) { createScene(3, 0); } else if (_moduleResult == 1) { - setGlobalVar(0x01BA1A52, 0); + setGlobalVar(V_BOLT_DOOR_OPEN, 0); createScene(1, 1); } break; @@ -209,7 +209,7 @@ void Module3000::updateScene() { createScene(4, 0); else if (_moduleResult == 3) createScene(10, -1); - else if (getGlobalVar(0x09221A62)) + else if (getGlobalVar(V_STAIRS_DOWN)) createScene(5, 0); else createScene(2, 1); @@ -238,11 +238,11 @@ void Module3000::updateScene() { createScene(8, -1); break; case 8: - _flag = getGlobalVar(0x10938830); // CHECKME + _flag = getGlobalVar(V_WALL_BROKEN); // CHECKME if (_moduleResult != 1) { _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); createScene(4, 1); - } else if (getGlobalVar(0xF0402B0A)) { + } else if (getGlobalVar(V_CANNON_SMACKER_NAME)) { createScene(1008, -1); } else { _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); @@ -265,7 +265,7 @@ void Module3000::updateScene() { createScene(1, 0); break; case 1001: - if (getGlobalVar(0x01BA1A52)) + if (getGlobalVar(V_BOLT_DOOR_OPEN)) createScene(1, 0); else createScene(12, -1); @@ -526,7 +526,7 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) _drawRect.width = _spriteResource.getDimensions().width; _drawRect.height = _spriteResource.getDimensions().height; _needRefresh = true; - if (getGlobalVar(0x0C0288F4)) { + if (getGlobalVar(V_ROBOT_HIT)) { hide(); } else { startBlinking(); @@ -649,7 +649,7 @@ AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { _x = 300; - _y = getGlobalVar(0x000809C2) ? 52 : 266; + _y = getGlobalVar(V_CANNON_RAISED) ? 52 : 266; createSurface1(0xC2463913, 1200); _needRefresh = true; updatePosition(); @@ -681,7 +681,7 @@ uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const Message AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus) : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { - _x = getGlobalVar(0x9040018A) ? 533 : 92; + _x = getGlobalVar(V_CANNON_TURNED) ? 533 : 92; _y = 150; createSurface1(0xC0C12954, 1200); _needRefresh = true; @@ -799,12 +799,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _keepVideo(false), _moveCannonLeftFirst(false), _isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { - _cannonTargetStatus = getGlobalVar(0x20580A86); + _cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS); debug("_cannonTargetStatus = %d", _cannonTargetStatus); _vm->gameModule()->initScene3009Vars(); - setGlobalVar(0xF0402B0A, 0); + setGlobalVar(V_CANNON_SMACKER_NAME, 0); _surfaceFlag = true; _vm->_screen->clear(); @@ -858,7 +858,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) for (int i = 0; i < 6; i++) setSubVar(0x00000914, i, _correctSymbols[i]); sendMessage(this, 0x2003, 0); - //setGlobalVar(0x610210B7, 1); + //setGlobalVar(V_ROBOT_TARGET, 1); } @@ -914,7 +914,7 @@ void Scene3009::update() { if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) { for (int i = 0; i < 3; i++) _asSymbols[i]->hide(); - if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) { + if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) { _ssSymbolEdges[0]->show(); _ssTargetLines[0]->show(); _asVerticalIndicator->show(); @@ -924,7 +924,7 @@ void Scene3009::update() { if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) { for (int i = 3; i < 6; i++) _asSymbols[i]->hide(); - if (!getGlobalVar(0x0C0288F4) || getGlobalVar(0x000809C2) || getGlobalVar(0x9040018A)) { + if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) { _ssSymbolEdges[1]->show(); _ssTargetLines[1]->show(); _asHorizontalIndicator->show(); @@ -938,8 +938,8 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: // TODO: Debug stuff - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(0x000809C2)) { - setGlobalVar(0x20580A86, 0); + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) { + setGlobalVar(V_CANNON_TARGET_STATUS, 0); leaveScene(0); } break; @@ -947,19 +947,19 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO: Debug stuff break; case 0x2000: - if (!getGlobalVar(0x000809C2)) { - if (!getGlobalVar(0x10938830)) { + if (!getGlobalVar(V_CANNON_RAISED)) { + if (!getGlobalVar(V_WALL_BROKEN)) { _cannonTargetStatus = kCTSBreakWall; - setGlobalVar(0x10938830, 1); + setGlobalVar(V_WALL_BROKEN, 1); } else { _cannonTargetStatus = kCTSWall; } - } else if (!getGlobalVar(0x9040018A)) { + } else if (!getGlobalVar(V_CANNON_TURNED)) { _cannonTargetStatus = kCTSEmptyness; - } else if (!getGlobalVar(0x610210B7)) { + } else if (!getGlobalVar(V_ROBOT_TARGET)) { _cannonTargetStatus = kCTSFireRobotNoTarget; - } else if (!getGlobalVar(0x0C0288F4)) { - setGlobalVar(0x0C0288F4, 1); + } else if (!getGlobalVar(V_ROBOT_HIT)) { + setGlobalVar(V_ROBOT_HIT, 1); _cannonTargetStatus = kCTSFireRobotIsTarget; } else { _cannonTargetStatus = kCTSFireNoRobot; @@ -971,13 +971,13 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2002: // Raise/lower the cannon - if (!getGlobalVar(0x9040018A) && !_isTurning) { - if (getGlobalVar(0x000809C2)) { + if (!getGlobalVar(V_CANNON_TURNED) && !_isTurning) { + if (getGlobalVar(V_CANNON_RAISED)) { _cannonTargetStatus = kCTSLowerCannon; - setGlobalVar(0x000809C2, 0); + setGlobalVar(V_CANNON_RAISED, 0); } else { _cannonTargetStatus = kCTSRaiseCannon; - setGlobalVar(0x000809C2, 1); + setGlobalVar(V_CANNON_RAISED, 1); } playActionVideo(); } @@ -987,25 +987,25 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2004: // Turn the cannon if it's raised - if (getGlobalVar(0x000809C2)) { - if (!getGlobalVar(0x9040018A)) { + if (getGlobalVar(V_CANNON_RAISED)) { + if (!getGlobalVar(V_CANNON_TURNED)) { // Cannon is at the left position - if (!getGlobalVar(0x610210B7)) { + if (!getGlobalVar(V_ROBOT_TARGET)) { _cannonTargetStatus = kCTSRightRobotNoTarget; - } else if (!getGlobalVar(0x0C0288F4)) { + } else if (!getGlobalVar(V_ROBOT_HIT)) { _cannonTargetStatus = kCTSRightRobotIsTarget; } else { _cannonTargetStatus = kCTSRightNoRobot; } - setGlobalVar(0x9040018A, 1); + setGlobalVar(V_CANNON_TURNED, 1); _isTurning = true; playActionVideo(); } else { // Cannon is at the right position - if (!getGlobalVar(0x610210B7)) { + if (!getGlobalVar(V_ROBOT_TARGET)) { _cannonTargetStatus = kCTSLeftRobotNoTarget; _smackerPlayer->open(0x108A000F, false); - } else if (!getGlobalVar(0x0C0288F4)) { + } else if (!getGlobalVar(V_ROBOT_HIT)) { _cannonTargetStatus = kCTSLeftRobotIsTarget; _smackerPlayer->open(0x500B002F, false); } else { @@ -1016,7 +1016,7 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit _moveCannonLeftFirst = true; _isTurning = true; _keepVideo = false; - setGlobalVar(0x9040018A, 0); + setGlobalVar(V_CANNON_TURNED, 0); } } break; @@ -1025,8 +1025,8 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene3009::playActionVideo() { - setGlobalVar(0x20580A86, _cannonTargetStatus); - setGlobalVar(0xF0402B0A, kScene3009CannonActionVideos[_cannonTargetStatus]); + setGlobalVar(V_CANNON_TARGET_STATUS, _cannonTargetStatus); + setGlobalVar(V_CANNON_SMACKER_NAME, kScene3009CannonActionVideos[_cannonTargetStatus]); leaveScene(1); } @@ -1378,8 +1378,8 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entit _boltUnlocked[param.asInteger()] = true; _boltUnlocking[param.asInteger()] = false; if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) { - if (!getGlobalVar(0x00040153)) { - setGlobalVar(0x00040153, 1); + if (!getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { + setGlobalVar(V_BOLT_DOOR_UNLOCKED, 1); playSound(0); _countdown = 60; } else { @@ -1539,7 +1539,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) { // TODO _vm->gameModule()->initScene3011Vars(); - _noisySymbolIndex = getGlobalVar(0x2414C2F2); + _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); _surfaceFlag = true; SetMessageHandler(&Scene3011::handleMessage); diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 5594cce8da..5dc80c9322 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -39,11 +39,11 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint //DEBUG<<< if (_navigationIndex < 0) { - _navigationIndex = (int)getGlobalVar(0x4200189E); + _navigationIndex = (int)getGlobalVar(V_NAVIGATION_INDEX); if (_navigationIndex >= (int)_navigationList->size()) _navigationIndex = 0; } - setGlobalVar(0x4200189E, _navigationIndex); + setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); SetUpdateHandler(&NavigationScene::update); SetMessageHandler(&NavigationScene::handleMessage); @@ -173,7 +173,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { if (_navigationIndex < 0) _navigationIndex = _navigationList->size() - 1; } while (!(*_navigationList)[_navigationIndex].interactive); - setGlobalVar(0x4200189E, _navigationIndex); + setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); } else { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); @@ -190,7 +190,7 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { if (_navigationIndex >= (int)_navigationList->size()) _navigationIndex = 0; } while (!(*_navigationList)[_navigationIndex].interactive); - setGlobalVar(0x4200189E, _navigationIndex); + setGlobalVar(V_NAVIGATION_INDEX, _navigationIndex); } else { _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, _navigationIndex); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 9bf6549ffe..e009ff286e 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -397,6 +397,17 @@ void TextResource::load(uint32 fileHash) { if (_vm->_res->getResourceType(_resourceHandle) == 6) { _textData = _vm->_res->loadResource(_resourceHandle, true); _count = READ_LE_UINT32(_textData); + + debug("TEXT RESOURCE %08X, count = %d:", fileHash, _count); + for (uint i = 0; i < _count-1; i++) { + const char *textEnd, *text = getString(i, textEnd); + while (text < textEnd) { + debug("[%04d] [%s]", i, text); + text += strlen(text) + 1; + } + debug("------------------"); + } + } else { _vm->_res->unuseResource(_resourceHandle); _resourceHandle = -1; diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 375f7f3aa8..e96fe8ad3d 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -32,7 +32,7 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) - if (getGlobalVar(0x06C02850)) { + if (getGlobalVar(V_SMACKER_CAN_ABORT)) { _flag1 = true; _canAbort = true; } -- cgit v1.2.3 From 2e7d100a6f2834b68e4d5d18cf72f63871ddfdf9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 11 Oct 2012 15:34:11 +0000 Subject: NEVERHOOD: Replace most of the literal digits in get/setSubVar with constants --- engines/neverhood/diskplayerscene.cpp | 4 +- engines/neverhood/gamemodule.cpp | 68 ++++++------ engines/neverhood/gamevars.h | 188 +++++++++++++++++++--------------- engines/neverhood/klayman.cpp | 18 ++-- engines/neverhood/module1000.cpp | 10 +- engines/neverhood/module1100.cpp | 44 ++++---- engines/neverhood/module1200.cpp | 46 ++++----- engines/neverhood/module1300.cpp | 52 +++++----- engines/neverhood/module1400.cpp | 30 +++--- engines/neverhood/module1600.cpp | 6 +- engines/neverhood/module1700.cpp | 10 +- engines/neverhood/module2200.cpp | 56 +++++----- engines/neverhood/module2400.cpp | 30 +++--- engines/neverhood/module2500.cpp | 8 +- engines/neverhood/module2700.cpp | 6 +- engines/neverhood/module2800.cpp | 82 +++++++-------- engines/neverhood/module3000.cpp | 42 ++++---- engines/neverhood/smackerscene.cpp | 4 +- 18 files changed, 361 insertions(+), 343 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 54c33ddcae..65bbc0ddb5 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -346,13 +346,13 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int // DEBUG>>>: Give all disks for (int i = 0; i < 20; i++) { - setSubVar(0x02720344, i, 1); + setSubVar(VA_IS_TAPE_INSERTED, i, 1); } // DEBUG<<< for (int i = 0; i < 20; i++) { _diskAvailable[i] = 0; - if (getSubVar(0x02720344, i)) + if (getSubVar(VA_IS_TAPE_INSERTED, i)) availableDisksCount++; } diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index ac20138a5e..1b9c9f361d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -88,17 +88,17 @@ void GameModule::handleMouseDown(int16 x, int16 y) { void GameModule::initScene1307Vars() { // Exit if it's already initialized - if (getSubVar(0x40050052, 0x25400B10)) + if (getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) return; for (uint i = 0; i < 3; i++) { bool more; do { more = false; - setSubVar(0x0C10A000, i, _vm->_rnd->getRandomNumber(16 - 1)); + setSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); if (i > 0) { for (uint j = 0; j < i && !more; j++) { - more = getSubVar(0x0C10A000, j) == getSubVar(0x0C10A000, i); + more = getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, j) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i); } } } while (more); @@ -108,18 +108,18 @@ void GameModule::initScene1307Vars() { bool more; do { more = false; - setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1)); + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); if (i > 0) { for (uint j = 0; j < i && !more; j++) { - more = getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i); + more = getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i); } } - if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i)) + if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i)) more = true; } while (more); } - setSubVar(0x40050052, 0x25400B10, 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x25400B10, 1); } @@ -136,11 +136,11 @@ void GameModule::initScene1405Vars() { uint32 rndIndex; // Exit if it's already initialized - if (getSubVar(0x40050052, 0xC8606803)) + if (getSubVar(VA_IS_PUZZLE_INIT, 0xC8606803)) return; for (uint32 i = 0; i < 3; i++) - setSubVar(0x61084036, i, 1); + setSubVar(VA_CURR_DICE_NUMBERS, i, 1); for (byte i = 0; i < 3; i++) array44[i] = i; @@ -153,7 +153,7 @@ void GameModule::initScene1405Vars() { rndIndex = _vm->_rnd->getRandomNumber(3 - 1); - setSubVar(0x13100631, array44[rndIndex], 5); + setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex], 5); for (byte i = 5; i < 9; i++) array3C[i] = array3C[i + 1]; @@ -166,7 +166,7 @@ void GameModule::initScene1405Vars() { for (int i = 0; i < 2; i++) { uint32 rndIndex1 = _vm->_rnd->getRandomNumber(index2 - 1); // si uint32 rndIndex2 = _vm->_rnd->getRandomNumber(index1 - 1); // di - setSubVar(0x13100631, array44[rndIndex2], array3C[rndIndex1]); + setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex2], array3C[rndIndex1]); index2--; while (rndIndex1 < index2) { array3C[rndIndex1] = array3C[rndIndex1 + 1]; @@ -182,10 +182,10 @@ void GameModule::initScene1405Vars() { for (uint32 i = 0; i < 3; i++) { uint32 rndValue = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2; uint32 index4 = 0; - setSubVar(0x7500993A, i, rndValue); + setSubVar(VA_GOOD_DICE_NUMBERS, i, rndValue); while (index4 < rndValue) { uint32 rndIndex3 = _vm->_rnd->getRandomNumber(index3 - 1); - setSubVar(0x0C65F80B, array30[rndIndex3], getSubVar(0x13100631, i)); + setSubVar(VA_TILE_SYMBOLS, array30[rndIndex3], getSubVar(VA_DICE_MEMORY_SYMBOLS, i)); index3--; while (rndIndex3 < index3) { array30[rndIndex3] = array30[rndIndex3 + 1]; @@ -199,14 +199,14 @@ void GameModule::initScene1405Vars() { while (index3 != 0) { uint32 rndIndex4 = _vm->_rnd->getRandomNumber(index3 - 1); index1 = array3C[index5]; - setSubVar(0x0C65F80B, array30[rndIndex4], index1); + setSubVar(VA_TILE_SYMBOLS, array30[rndIndex4], index1); index3--; while (rndIndex4 < index3) { array30[rndIndex4] = array30[rndIndex4 + 1]; rndIndex4++; } uint32 rndIndex5 = _vm->_rnd->getRandomNumber(index3 - 1); - setSubVar(0x0C65F80B, array30[rndIndex5], index1); + setSubVar(VA_TILE_SYMBOLS, array30[rndIndex5], index1); index3--; while (rndIndex5 < index3) { array30[rndIndex5] = array30[rndIndex5 + 1]; @@ -218,57 +218,57 @@ void GameModule::initScene1405Vars() { } - setSubVar(0x40050052, 0xC8606803, 1); + setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1); } void GameModule::initScene2401Vars() { - if (getSubVar(0x40050052, 0x40520234)) + if (getSubVar(VA_IS_PUZZLE_INIT, 0x40520234)) return; - setSubVar(0x90405038, 0, 3); - setSubVar(0x90405038, 1, 1); - setSubVar(0x90405038, 2, 2); - setSubVar(0x90405038, 3, 0); - setSubVar(0x90405038, 4, 4); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 0, 3); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 1, 1); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 2, 2); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 3, 0); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 4, 4); - setSubVar(0x40050052, 0x40520234, 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x40520234, 1); } void GameModule::initScene2808Vars1() { // Exit if it's already initialized - if (getSubVar(0x40050052, 0x20479010)) + if (getSubVar(VA_IS_PUZZLE_INIT, 0x20479010)) return; for (uint i = 0; i < 3; i++) - setSubVar(0x0C601058, i, _vm->_rnd->getRandomNumber(3 - 1) + 1); + setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1); - setSubVar(0x40050052, 0x20479010, 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x20479010, 1); } void GameModule::initScene2808Vars2() { // Exit if it's already initialized - if (getSubVar(0x40050052, 0x66059818)) + if (getSubVar(VA_IS_PUZZLE_INIT, 0x66059818)) return; for (uint i = 0; i < 3; i++) - setSubVar(0x40005834, i, _vm->_rnd->getRandomNumber(6 - 1) + 1); + setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1); - setSubVar(0x40050052, 0x66059818, 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x66059818, 1); } void GameModule::initScene3009Vars() { - if (!getSubVar(0x40050052, 0x8C9819C2)) { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x8C9819C2)) { for (int i = 0; i < 3; i++) { - setSubVar(0x00504B86, i, _vm->_rnd->getRandomNumber(12 - 1)); - setSubVar(0x0A4C0A9A, i, _vm->_rnd->getRandomNumber(12 - 1)); + setSubVar(VA_GOOD_CANNON_SYMBOLS_1, i, _vm->_rnd->getRandomNumber(12 - 1)); + setSubVar(VA_GOOD_CANNON_SYMBOLS_2, i, _vm->_rnd->getRandomNumber(12 - 1)); } - setSubVar(0x40050052, 0x8C9819C2, 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x8C9819C2, 1); } } @@ -313,7 +313,7 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 5; + _vm->gameState().sceneNum = 1; createModule(2200, -1); #endif #if 0 diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index a99459fb6a..52740dca56 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -30,97 +30,119 @@ namespace Neverhood { enum { // Misc - V_MODULE_NAME = 0x91080831, // Currently active module name hash - V_DEBUG = 0xA4014072, // Original debug-flag, can probably be removed - V_SMACKER_CAN_ABORT = 0x06C02850, // Not set anywhere (yet), seems like a debug flag - V_KEY3_LOCATION = 0x13382860, // Location of the third key - V_TEXT_FLAG1 = 0x8440001F, - V_TEXT_INDEX = 0x01830201, - V_TEXT_COUNTING_INDEX1 = 0x29408F00, - V_TEXT_COUNTING_INDEX2 = 0x8A140C21, - V_TALK_COUNTING_INDEX = 0xA0808898, - V_FRUIT_COUNTING_INDEX = 0x40040831, - V_NOISY_SYMBOL_INDEX = 0x2414C2F2, - V_COLUMN_BACK_NAME = 0x4CE79018, - V_COLUMN_TEXT_NAME = 0xC8C28808, - V_CLICKED_COLUMN_INDEX = 0x48A68852, - V_CLICKED_COLUMN_ROW = 0x49C40058, - V_MUSIC_NAME = 0x89A82A15, + V_MODULE_NAME = 0x91080831, // Currently active module name hash + V_DEBUG = 0xA4014072, // Original debug-flag, can probably be removed + V_SMACKER_CAN_ABORT = 0x06C02850, // Not set anywhere (yet), seems like a debug flag + V_KEY3_LOCATION = 0x13382860, // Location of the third key + V_TEXT_FLAG1 = 0x8440001F, + V_TEXT_INDEX = 0x01830201, + V_TEXT_COUNTING_INDEX1 = 0x29408F00, + V_TEXT_COUNTING_INDEX2 = 0x8A140C21, + V_TALK_COUNTING_INDEX = 0xA0808898, + V_FRUIT_COUNTING_INDEX = 0x40040831, + V_NOISY_SYMBOL_INDEX = 0x2414C2F2, + V_COLUMN_BACK_NAME = 0x4CE79018, + V_COLUMN_TEXT_NAME = 0xC8C28808, + V_CLICKED_COLUMN_INDEX = 0x48A68852, + V_CLICKED_COLUMN_ROW = 0x49C40058, + V_MUSIC_NAME = 0x89A82A15, // Klayman - V_KLAYMAN_SMALL = 0x1860C990, // Is Klayman small? - V_KLAYMAN_FRAMEINDEX = 0x18288913, - V_KLAYMAN_IS_DELTA_X = 0xC0418A02, - V_KLAYMAN_SAVED_X = 0x00D30138, - V_CAR_DELTA_X = 0x21E60190, + V_KLAYMAN_SMALL = 0x1860C990, // Is Klayman small? + V_KLAYMAN_FRAMEINDEX = 0x18288913, + V_KLAYMAN_IS_DELTA_X = 0xC0418A02, + V_KLAYMAN_SAVED_X = 0x00D30138, + V_CAR_DELTA_X = 0x21E60190, // Flags - V_CRYSTAL_COLORS_INIT = 0xDE2EC914, - V_TV_JOKE_TOLD = 0x92603A79, - V_NOTES_DOOR_UNLOCKED = 0x0045D021, - V_WATER_RUNNING = 0x4E0BE910, - V_CREATURE_ANGRY = 0x0A310817, // After having played with the music box - V_BEEN_SHRINKING_ROOM = 0x1C1B8A9A, - V_BEEN_STATUE_ROOM = 0xCB45DE03, - V_MOUSE_PUZZLE_SOLVED = 0x70A1189C, - V_NOTES_PUZZLE_SOLVED = 0x86615030, - V_TILE_PUZZLE_SOLVED = 0x404290D5, - V_STAIRS_PUZZLE_SOLVED = 0xA9035F60, - V_SPIKES_RETRACTED = 0x18890C91, - V_LARGE_DOOR_NUMBER = 0x9A500914, // Number of the currently "large" door - V_LIGHTS_ON = 0x4D080E54, - V_SHRINK_LIGHTS_ON = 0x190A1D18, // Lights on in the room with the shrinking device - V_STAIRS_DOWN = 0x09221A62, - V_LADDER_DOWN = 0x0018CA22, // Is the ladder in the statue room down? - V_LADDER_DOWN_ACTION = 0x00188211, - V_WALL_BROKEN = 0x10938830, - V_BOLT_DOOR_OPEN = 0x01BA1A52, - V_BOLT_DOOR_UNLOCKED = 0x00040153, - V_SEEN_SYMBOLS_NO_LIGHT = 0x81890D14, - V_FELL_DOWN_HOLE = 0xE7498218, - V_DOOR_PASSED = 0x2090590C, // Auto-closing door was passed - V_ENTRANCE_OPEN = 0xD0A14D10, // Is the entrance to Module1300 open (after the robot got his teddy) - V_WINDOW_OPEN = 0x03C698DA, - V_DOOR_STATUS = 0x52371C95, - V_DOOR_BUSTED = 0xD217189D, - V_WORLDS_JOINED = 0x98109F12, // Are the worlds joined? - V_KEYDOOR_UNLOCKED = 0x80455A41, // Is the keyboard-door unlocked? - V_MOUSE_SUCKED_IN = 0x01023818, // Are mouse/cheese in Scene1308? - V_BALLOON_POPPED = 0xAC00C0D0, // Has the balloon with the key been popped? - V_TNT_DUMMY_BUILT = 0x000CF819, // Are all TNT parts on the dummy? - V_TNT_DUMMY_FUSE_LIT = 0x20A0C516, - V_RING5_PULLED = 0x4DE80AC0, - V_CREATURE_EXPLODED = 0x2A02C07B, + V_CRYSTAL_COLORS_INIT = 0xDE2EC914, + V_TV_JOKE_TOLD = 0x92603A79, + V_NOTES_DOOR_UNLOCKED = 0x0045D021, + V_WATER_RUNNING = 0x4E0BE910, + V_CREATURE_ANGRY = 0x0A310817, // After having played with the music box + V_BEEN_SHRINKING_ROOM = 0x1C1B8A9A, + V_BEEN_STATUE_ROOM = 0xCB45DE03, + V_MOUSE_PUZZLE_SOLVED = 0x70A1189C, + V_NOTES_PUZZLE_SOLVED = 0x86615030, + V_TILE_PUZZLE_SOLVED = 0x404290D5, + V_STAIRS_PUZZLE_SOLVED = 0xA9035F60, + V_SPIKES_RETRACTED = 0x18890C91, + V_LARGE_DOOR_NUMBER = 0x9A500914, // Number of the currently "large" door + V_LIGHTS_ON = 0x4D080E54, + V_SHRINK_LIGHTS_ON = 0x190A1D18, // Lights on in the room with the shrinking device + V_STAIRS_DOWN = 0x09221A62, + V_LADDER_DOWN = 0x0018CA22, // Is the ladder in the statue room down? + V_LADDER_DOWN_ACTION = 0x00188211, + V_WALL_BROKEN = 0x10938830, + V_BOLT_DOOR_OPEN = 0x01BA1A52, + V_BOLT_DOOR_UNLOCKED = 0x00040153, + V_SEEN_SYMBOLS_NO_LIGHT = 0x81890D14, + V_FELL_DOWN_HOLE = 0xE7498218, + V_DOOR_PASSED = 0x2090590C, // Auto-closing door was passed + V_ENTRANCE_OPEN = 0xD0A14D10, // Is the entrance to Module1300 open (after the robot got his teddy) + V_WINDOW_OPEN = 0x03C698DA, + V_DOOR_STATUS = 0x52371C95, + V_DOOR_BUSTED = 0xD217189D, + V_WORLDS_JOINED = 0x98109F12, // Are the worlds joined? + V_KEYDOOR_UNLOCKED = 0x80455A41, // Is the keyboard-door unlocked? + V_MOUSE_SUCKED_IN = 0x01023818, // Are mouse/cheese in Scene1308? + V_BALLOON_POPPED = 0xAC00C0D0, // Has the balloon with the key been popped? + V_TNT_DUMMY_BUILT = 0x000CF819, // Are all TNT parts on the dummy? + V_TNT_DUMMY_FUSE_LIT = 0x20A0C516, + V_RING5_PULLED = 0x4DE80AC0, + V_CREATURE_EXPLODED = 0x2A02C07B, // Match - V_MATCH_STATUS = 0x0112090A, + V_MATCH_STATUS = 0x0112090A, // Venus fly trap - V_FLYTRAP_RING_EATEN = 0x2B514304, - V_FLYTRAP_RING_DOOR = 0x8306F218, - V_FLYTRAP_RING_FENCE = 0x80101B1E, - V_FLYTRAP_RING_BRIDGE = 0x13206309, - V_FLYTRAP_POSITION_1 = 0x1B144052, - V_FLYTRAP_POSITION_2 = 0x86341E88, + V_FLYTRAP_RING_EATEN = 0x2B514304, + V_FLYTRAP_RING_DOOR = 0x8306F218, + V_FLYTRAP_RING_FENCE = 0x80101B1E, + V_FLYTRAP_RING_BRIDGE = 0x13206309, + V_FLYTRAP_POSITION_1 = 0x1B144052, + V_FLYTRAP_POSITION_2 = 0x86341E88, // Navigation - V_NAVIGATION_INDEX = 0x4200189E, // Navigation scene: Current navigation index + V_NAVIGATION_INDEX = 0x4200189E, // Navigation scene: Current navigation index // Cannon - V_CANNON_RAISED = 0x000809C2, // Is the cannon raised? - V_CANNON_TURNED = 0x9040018A, // Is the cannon turned? - V_ROBOT_HIT = 0x0C0288F4, // Was the robot hit by the cannon? - V_ROBOT_TARGET = 0x610210B7, // Is the robot at the cannon target position? (teddy) - V_CANNON_SMACKER_NAME = 0xF0402B0A, - V_CANNON_TARGET_STATUS = 0x20580A86, + V_CANNON_RAISED = 0x000809C2, // Is the cannon raised? + V_CANNON_TURNED = 0x9040018A, // Is the cannon turned? + V_ROBOT_HIT = 0x0C0288F4, // Was the robot hit by the cannon? + V_ROBOT_TARGET = 0x610210B7, // Is the robot at the cannon target position? (teddy) + V_CANNON_SMACKER_NAME = 0xF0402B0A, + V_CANNON_TARGET_STATUS = 0x20580A86, // Projector - V_PROJECTOR_SLOT = 0x04A10F33, // Projector x slot index - V_PROJECTOR_LOCATION = 0x04A105B3, // Projector scene location - V_PROJECTOR_ACTIVE = 0x12A10DB3, // Is the projecor projecting? + V_PROJECTOR_SLOT = 0x04A10F33, // Projector x slot index + V_PROJECTOR_LOCATION = 0x04A105B3, // Projector scene location + V_PROJECTOR_ACTIVE = 0x12A10DB3, // Is the projecor projecting? // Inventory - V_HAS_NEEDLE = 0x31C63C51, // Has Klayman the needle? - V_HAS_FINAL_KEY = 0xC0780812, // Has Klayman the key from the diskplayer? - V_HAS_TEST_TUBE = 0x45080C38, -#if 0 -Arrays: -0x0800547C Water pipes water level (index equals pipe number; 0 to 4) -0x0090EA95 Has Klayman the key (index equals the key number; 0 to 2) -0x08D0AB11 Has Klayman inserted the key (index equals the key number; 0 to 2) -#endif + V_HAS_NEEDLE = 0x31C63C51, // Has Klayman the needle? + V_HAS_FINAL_KEY = 0xC0780812, // Has Klayman the key from the diskplayer? + V_HAS_TEST_TUBE = 0x45080C38, + // Arrays + // NOTE "GOOD" means the solution, "CURR" is the current setup of the puzzle variables + VA_IS_PUZZLE_INIT = 0x40050052, + VA_SMACKER_PLAYED = 0x00800410, + VA_CURR_CRYSTAL_COLORS = 0xE11A1929, + VA_GOOD_CRYSTAL_COLORS = 0xD4B2089C, + VA_GOOD_TEST_TUBES_LEVEL_1 = 0x0C601058, + VA_GOOD_TEST_TUBES_LEVEL_2 = 0x40005834, + VA_CURR_CANNON_SYMBOLS = 0x00000914, + VA_GOOD_CANNON_SYMBOLS_1 = 0x00504B86, + VA_GOOD_CANNON_SYMBOLS_2 = 0x0A4C0A9A, + VA_CURR_WATER_PIPES_LEVEL = 0x0800547C, + VA_GOOD_WATER_PIPES_LEVEL = 0x90405038, + VA_CURR_DICE_NUMBERS = 0x61084036, + VA_GOOD_DICE_NUMBERS = 0x7500993A, + VA_CURR_KEY_SLOT_NUMBERS = 0xA010B810, + VA_GOOD_KEY_SLOT_NUMBERS = 0x0C10A000, + VA_CUBE_POSITIONS = 0x484498D0, + VA_CODE_SYMBOLS = 0x04909A50, + VA_TILE_SYMBOLS = 0x0C65F80B, + VA_IS_TILE_MATCH = 0xCCE0280F, + VA_TNT_POSITIONS = 0x10055D14, + VA_DICE_MEMORY_SYMBOLS = 0x13100631, + VA_HAS_TAPE = 0x02038314, + VA_IS_TAPE_INSERTED = 0x02720344, + VA_HAS_KEY = 0x0090EA95, + VA_IS_KEY_INSERTED = 0x08D0AB11, + VA_LOCKS_DISABLED = 0x14800353, V_END_ }; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 0342b02f3c..8f0a94e52d 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2090,9 +2090,9 @@ void Klayman::stInsertDisk() { _status2 = 2; _tapesToInsert = 0; for (uint32 i = 0; i < 20; i++) { - if (getSubVar(0x02038314, i)) { - setSubVar(0x02720344, i, 1); - setSubVar(0x02038314, i, 0); + if (getSubVar(VA_HAS_TAPE, i)) { + setSubVar(VA_IS_TAPE_INSERTED, i, 1); + setSubVar(VA_HAS_TAPE, i, 0); _tapesToInsert++; } } @@ -2496,18 +2496,18 @@ void Klayman::stInsertKey() { _status2 = 2; _keysToInsert = 0; for (uint32 i = 0; i < 3; i++) { - if (getSubVar(0x0090EA95, i)) { + if (getSubVar(VA_HAS_KEY, i)) { bool more; - setSubVar(0x08D0AB11, i, 1); - setSubVar(0x0090EA95, i, 0); + setSubVar(VA_IS_KEY_INSERTED, i, 1); + setSubVar(VA_HAS_KEY, i, 0); do { more = false; - setSubVar(0xA010B810, i, _vm->_rnd->getRandomNumber(16 - 1)); + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); for (uint j = 0; j < i && !more; j++) { - if (getSubVar(0x08D0AB11, j) && getSubVar(0xA010B810, j) == getSubVar(0xA010B810, i)) + if (getSubVar(VA_IS_KEY_INSERTED, j) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i)) more = true; } - if (getSubVar(0xA010B810, i) == getSubVar(0x0C10A000, i)) + if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i)) more = true; } while (more); _keysToInsert++; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 2c528429ea..6cae11a1f4 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1779,11 +1779,11 @@ uint32 Scene1005::getTextIndex1() { else if (getGlobalVar(V_ROBOT_HIT)) { if (!getGlobalVar(V_ENTRANCE_OPEN)) textIndex = 23; - else if (!getSubVar(0x0090EA95, 0) && !getSubVar(0x08D0AB11, 0)) + else if (!getSubVar(VA_HAS_KEY, 0) && !getSubVar(VA_IS_KEY_INSERTED, 0)) textIndex = 24; else if (!getGlobalVar(V_HAS_FINAL_KEY)) textIndex = 26; - else if (!getSubVar(0x0090EA95, 1) && !getSubVar(0x08D0AB11, 1)) + else if (!getSubVar(VA_HAS_KEY, 1) && !getSubVar(VA_IS_KEY_INSERTED, 1)) textIndex = 27; else if (!getGlobalVar(V_HAS_FINAL_KEY)) textIndex = 28; @@ -1817,15 +1817,15 @@ uint32 Scene1005::getTextIndex1() { textIndex = 4; else if (!getGlobalVar(V_HAS_TEST_TUBE)) textIndex = 5; - else if (!getSubVar(0x14800353, 0x40119852)) + else if (!getSubVar(VA_LOCKS_DISABLED, 0x40119852)) textIndex = 6; else if (!getGlobalVar(V_WATER_RUNNING)) textIndex = 7; else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED)) textIndex = 8; - else if (!getSubVar(0x14800353, 0x304008D2)) + else if (!getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) textIndex = 9; - else if (!getSubVar(0x14800353, 0x01180951)) + else if (!getSubVar(VA_LOCKS_DISABLED, 0x01180951)) textIndex = 10; else textIndex = 11; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 44fe70eb88..a3e092ba46 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -338,7 +338,7 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p } void SsScene1105SymbolDie::loadSymbolSprite() { - load(kSsScene1105SymbolDieFileHashes[getSubVar(0x61084036, _index)], true, false); + load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false); _drawRect.x = -(_spriteResource.getDimensions().width / 2); _drawRect.y = -(_spriteResource.getDimensions().height / 2); StaticSprite::update(); @@ -502,9 +502,9 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4807: if (sender == _ssActionButton) { - if (getSubVar(0x7500993A, 0) == getSubVar(0x61084036, 0) && - getSubVar(0x7500993A, 1) == getSubVar(0x61084036, 1) && - getSubVar(0x7500993A, 2) == getSubVar(0x61084036, 2)) { + if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) && + getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) && + getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) { setGlobalVar(V_ROBOT_TARGET, 1); playSound(2); _flag3 = true; @@ -522,38 +522,38 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit _flag1 = false; } else if (!getGlobalVar(V_ROBOT_TARGET)) { if (sender == _ssSymbol1UpButton) { - if (getSubVar(0x61084036, 0) < 9) { - incSubVar(0x61084036, 0, +1); + if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) { + incSubVar(VA_CURR_DICE_NUMBERS, 0, +1); sendMessage(_ssSymbol1UpButton, 0x480B, 0); sendMessage(_ssSymbolDice[0], 0x2000, 0); } } else if (sender == _ssSymbol1DownButton) { - if (getSubVar(0x61084036, 0) > 1) { - incSubVar(0x61084036, 0, -1); + if (getSubVar(VA_CURR_DICE_NUMBERS, 0) > 1) { + incSubVar(VA_CURR_DICE_NUMBERS, 0, -1); sendMessage(_ssSymbol1DownButton, 0x480B, 0); sendMessage(_ssSymbolDice[0], 0x2000, 0); } } else if (sender == _ssSymbol2UpButton) { - if (getSubVar(0x61084036, 1) < 9) { - incSubVar(0x61084036, 1, +1); + if (getSubVar(VA_CURR_DICE_NUMBERS, 1) < 9) { + incSubVar(VA_CURR_DICE_NUMBERS, 1, +1); sendMessage(_ssSymbol2UpButton, 0x480B, 0); sendMessage(_ssSymbolDice[1], 0x2000, 0); } } else if (sender == _ssSymbol2DownButton) { - if (getSubVar(0x61084036, 1) > 1) { - incSubVar(0x61084036, 1, -1); + if (getSubVar(VA_CURR_DICE_NUMBERS, 1) > 1) { + incSubVar(VA_CURR_DICE_NUMBERS, 1, -1); sendMessage(_ssSymbol2DownButton, 0x480B, 0); sendMessage(_ssSymbolDice[1], 0x2000, 0); } } else if (sender == _ssSymbol3UpButton) { - if (getSubVar(0x61084036, 2) < 9) { - incSubVar(0x61084036, 2, +1); + if (getSubVar(VA_CURR_DICE_NUMBERS, 2) < 9) { + incSubVar(VA_CURR_DICE_NUMBERS, 2, +1); sendMessage(_ssSymbol3UpButton, 0x480B, 0); sendMessage(_ssSymbolDice[2], 0x2000, 0); } } else if (sender == _ssSymbol3DownButton) { - if (getSubVar(0x61084036, 2) > 1) { - incSubVar(0x61084036, 2, -1); + if (getSubVar(VA_CURR_DICE_NUMBERS, 2) > 1) { + incSubVar(VA_CURR_DICE_NUMBERS, 2, -1); sendMessage(_ssSymbol3DownButton, 0x480B, 0); sendMessage(_ssSymbolDice[2], 0x2000, 0); } @@ -566,9 +566,9 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene1105::createObjects() { - _ssSymbols[0] = insertSprite(kScene1105FileHashes[getSubVar(0x13100631, 0)], 161, 304); - _ssSymbols[1] = insertSprite(kScene1105FileHashes[getSubVar(0x13100631, 1)], 294, 304); - _ssSymbols[2] = insertSprite(kScene1105FileHashes[getSubVar(0x13100631, 2)], 440, 304); + _ssSymbols[0] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 0)], 161, 304); + _ssSymbols[1] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 1)], 294, 304); + _ssSymbols[2] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 2)], 440, 304); _ssSymbolDice[0] = insertSprite(0, 206, 304); _ssSymbolDice[1] = insertSprite(1, 339, 304); @@ -651,9 +651,9 @@ void Scene1105::update() { // DEBUG: Show the correct code debug("(%d, %d) (%d, %d) (%d, %d)", - getSubVar(0x7500993A, 0), getSubVar(0x61084036, 0), - getSubVar(0x7500993A, 1), getSubVar(0x61084036, 1), - getSubVar(0x7500993A, 2), getSubVar(0x61084036, 2)); + getSubVar(VA_GOOD_DICE_NUMBERS, 0), getSubVar(VA_CURR_DICE_NUMBERS, 0), + getSubVar(VA_GOOD_DICE_NUMBERS, 1), getSubVar(VA_CURR_DICE_NUMBERS, 1), + getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2)); Scene::update(); if (_countdown != 0 && (--_countdown == 0)) { diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 041be6f8bd..99d15b970f 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -195,7 +195,7 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash) : AnimatedSprite(vm, fileHash, surfacePriority, x, y), _parentScene(parentScene), _nameHash(nameHash) { - if (!getSubVar(0x02038314, _nameHash) && !getSubVar(0x02720344, _nameHash)) { + if (!getSubVar(VA_HAS_TAPE, _nameHash) && !getSubVar(VA_IS_TAPE_INSERTED, _nameHash)) { SetMessageHandler(&AsScene1201Tape::handleMessage); } else { setVisible(false); @@ -211,7 +211,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, messageResult = 1; break; case 0x4806: - setSubVar(0x02038314, _nameHash, 1); + setSubVar(VA_HAS_TAPE, _nameHash, 1); setVisible(false); SetMessageHandler(NULL); break; @@ -728,10 +728,10 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - if (!getSubVar(0x40050052, 0xE8058B52)) { - setSubVar(0x40050052, 0xE8058B52, 1); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) { + setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1); for (uint32 index = 0; index < 18; index++) { - setSubVar(0x10055D14, index, kScene1201InitArray[index]); + setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]); } } @@ -818,7 +818,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) uint32 tntIndex = 1; while (tntIndex < 18) { - uint32 elemIndex = getSubVar(0x10055D14, tntIndex); + uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); int16 clipY2; if (kScene1201PointArray[elemIndex].y < 175) clipY2 = topY1; @@ -826,15 +826,15 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) clipY2 = topY2; else clipY2 = topY3; - insertSprite(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2); - elemIndex = getSubVar(0x10055D14, tntIndex + 1); + insertSprite(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); + elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex + 1); if (kScene1201PointArray[elemIndex].y < 175) clipY2 = topY1; else if (kScene1201PointArray[elemIndex].y < 230) clipY2 = topY2; else clipY2 = topY3; - insertSprite(tntIndex + 1, getSubVar(0x10055D14, tntIndex + 1), clipY2); + insertSprite(tntIndex + 1, getSubVar(VA_TNT_POSITIONS, tntIndex + 1), clipY2); tntIndex += 3; } @@ -850,7 +850,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) uint32 tntIndex = 0; while (tntIndex < 18) { - uint32 elemIndex = getSubVar(0x10055D14, tntIndex); + uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); int16 clipY2; if (kScene1201PointArray[elemIndex].x < 300) { clipY2 = 480; @@ -862,7 +862,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) else clipY2 = topY3; } - insertSprite(tntIndex, getSubVar(0x10055D14, tntIndex), clipY2); + insertSprite(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); tntIndex++; } @@ -1023,7 +1023,7 @@ AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1202TntItem::hmShowIdle); - positionIndex = getSubVar(0x10055D14, _itemIndex); + positionIndex = getSubVar(VA_TNT_POSITIONS, _itemIndex); createSurface(900, 37, 67); _x = kScene1202Points[positionIndex].x; _y = kScene1202Points[positionIndex].y; @@ -1139,11 +1139,11 @@ void Scene1202::update() { _soundFlag = true; } else if (_clickedIndex >= 0 && _counter == 0) { int destIndex = kScene1202Table[_clickedIndex]; - sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(0x10055D14, destIndex)); - sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(0x10055D14, _clickedIndex)); - int temp = getSubVar(0x10055D14, destIndex); - setSubVar(0x10055D14, destIndex, getSubVar(0x10055D14, _clickedIndex)); - setSubVar(0x10055D14, _clickedIndex, temp); + sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex)); + sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); + int temp = getSubVar(VA_TNT_POSITIONS, destIndex); + setSubVar(VA_TNT_POSITIONS, destIndex, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); + setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp); _counter = 2; _clickedIndex = -1; if (_flag) { @@ -1196,14 +1196,14 @@ uint32 Scene1202::hmSolved(int messageNum, const MessageParam ¶m, Entity *se bool Scene1202::isSolved() { debug("isSolved() %d %d %d %d %d %d", - getSubVar(0x10055D14, 0), getSubVar(0x10055D14, 3), - getSubVar(0x10055D14, 6), getSubVar(0x10055D14, 9), - getSubVar(0x10055D14, 12), getSubVar(0x10055D14, 15)); + getSubVar(VA_TNT_POSITIONS, 0), getSubVar(VA_TNT_POSITIONS, 3), + getSubVar(VA_TNT_POSITIONS, 6), getSubVar(VA_TNT_POSITIONS, 9), + getSubVar(VA_TNT_POSITIONS, 12), getSubVar(VA_TNT_POSITIONS, 15)); return - getSubVar(0x10055D14, 0) == 0 && getSubVar(0x10055D14, 3) == 3 && - getSubVar(0x10055D14, 6) == 6 && getSubVar(0x10055D14, 9) == 9 && - getSubVar(0x10055D14, 12) == 12 && getSubVar(0x10055D14, 15) == 15; + getSubVar(VA_TNT_POSITIONS, 0) == 0 && getSubVar(VA_TNT_POSITIONS, 3) == 3 && + getSubVar(VA_TNT_POSITIONS, 6) == 6 && getSubVar(VA_TNT_POSITIONS, 9) == 9 && + getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15; } void Scene1202::doPaletteEffect() { diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index e8cc843b78..978eb03cc8 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1115,12 +1115,12 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind _dataResource.load(0x22102142); _pointList = _dataResource.getPointArray(0xAC849240); - pt = (*_pointList)[getSubVar(0xA010B810, _index)]; + pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; _x = pt.x; _y = pt.y; - // TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], fileHashes); - createSurface(kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4], 640, 480); //TODO: Remeove once the line above is done + // TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], fileHashes); + createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 640, 480); //TODO: Remeove once the line above is done SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1307Key::handleMessage); @@ -1148,7 +1148,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, _isClickable = param.asInteger() != 0; break; case 0x2001: - setSubVar(0xA010B810, _index, param.asInteger()); + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index, param.asInteger()); stMoveKey(); break; case 0x2003: @@ -1196,7 +1196,7 @@ void AsScene1307Key::suMoveKey() { processDelta(); _pointIndex++; } else { - NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)]; + NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; _x = pt.x + kAsScene1307KeyXDelta; _y = pt.y + kAsScene1307KeyYDelta; stInsertKey(); @@ -1213,14 +1213,14 @@ void AsScene1307Key::stRemoveKey() { void AsScene1307Key::stInsertKey() { _pointIndex = 0; - sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(0xA010B810, _index) % 4]); - setClipRect(_clipRects[getSubVar(0xA010B810, _index) % 4]); + sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]); + setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]); SetSpriteUpdate(&AsScene1307Key::suInsertKey); _newStickFrameIndex = -2; } void AsScene1307Key::stMoveKey() { - NPoint pt = (*_pointList)[getSubVar(0xA010B810, _index)]; + NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; int16 newX = pt.x + kAsScene1307KeyXDelta; int16 newY = pt.y + kAsScene1307KeyYDelta; sendMessage(_parentScene, 0x1022, 1000); @@ -1257,9 +1257,9 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { //DEBUG>>> - setSubVar(0x08D0AB11, 0, 1); - setSubVar(0x08D0AB11, 1, 1); - setSubVar(0x08D0AB11, 2, 1); + setSubVar(VA_IS_KEY_INSERTED, 0, 1); + setSubVar(VA_IS_KEY_INSERTED, 1, 1); + setSubVar(VA_IS_KEY_INSERTED, 2, 1); //DEBUG<<< Sprite *tempSprite; @@ -1299,7 +1299,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480); for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { - if (getSubVar(0x08D0AB11, keyIndex)) { + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) { _asKeys[keyIndex] = insertSprite(this, keyIndex, _clipRects); _vm->_collisionMan->addSprite(_asKeys[keyIndex]); } else { @@ -1345,8 +1345,8 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit // Check if the clicked keyhole is already occupied with a key bool occupied = false; for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) { - if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex] != _asCurrKey) { - if (getSubVar(0xA010B810, keyIndex) == clickedKeyHoleIndex) + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex] != _asCurrKey) { + if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, keyIndex) == clickedKeyHoleIndex) occupied = true; } } @@ -1366,9 +1366,9 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit // TODO Debug stuff case 0x2002: // Check if all keys are in the correct keyholes - if (getSubVar(0x08D0AB11, 0) && getSubVar(0xA010B810, 0) == getSubVar(0x0C10A000, 0) && - getSubVar(0x08D0AB11, 1) && getSubVar(0xA010B810, 1) == getSubVar(0x0C10A000, 1) && - getSubVar(0x08D0AB11, 2) && getSubVar(0xA010B810, 2) == getSubVar(0x0C10A000, 2)) { + if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) && + getSubVar(VA_IS_KEY_INSERTED, 1) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 1) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1) && + getSubVar(VA_IS_KEY_INSERTED, 2) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 2) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)) { // Play unlock animations for all keys for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (_asKeys[keyIndex]) @@ -1378,11 +1378,9 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit _isPuzzleSolved = true; _countdown = 47; } else { - for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { - if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) { + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex]) sendMessage(_asKeys[keyIndex], 0x2000, 1); - } - } sendMessage(_asCurrKey, 0x2004, 1); } _asCurrKey = NULL; @@ -1390,11 +1388,9 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: _asCurrKey = (Sprite*)sender; - for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { - if (getSubVar(0x08D0AB11, keyIndex) && _asKeys[keyIndex]) { + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex]) sendMessage(_asKeys[keyIndex], 0x2000, 0); - } - } break; } return messageResult; @@ -1602,9 +1598,9 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _asJaggyDoor = insertSprite(this); _asLightWallSymbols = insertSprite(this); - _ssNumber1 = insertSprite(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 1)], 0); - _ssNumber2 = insertSprite(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 0)], 1); - _ssNumber3 = insertSprite(kScene1308NumberFileHashes[getSubVar(0x0C10A000, 2)], 2); + _ssNumber1 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0); + _ssNumber2 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1); + _ssNumber3 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2); _sprite2 = insertStaticSprite(0x40043120, 995); _sprite3 = insertStaticSprite(0x43003100, 995); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index d207428d80..eb8f4fed87 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1547,15 +1547,15 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui _y = kAsScene1405TileItemPositions[_tileIndex].y; createSurface1(0x844B805C, 1100); setVisible(false); - if (getSubVar(0xCCE0280F, _tileIndex)) + if (getSubVar(VA_IS_TILE_MATCH, _tileIndex)) _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; SetUpdateHandler(&AsScene1405Tile::update); SetMessageHandler(&AsScene1405Tile::handleMessage); - debug("getSubVar(0x0C65F80B, _tileIndex) = %d", getSubVar(0x0C65F80B, _tileIndex)); + debug("getSubVar(VA_TILE_SYMBOLS, _tileIndex) = %d", getSubVar(VA_TILE_SYMBOLS, _tileIndex)); - startAnimation(0x844B805C, getSubVar(0x0C65F80B, _tileIndex), -1); - _newStickFrameIndex = (int16)getSubVar(0x0C65F80B, _tileIndex); + startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1); + _newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex); } void AsScene1405Tile::update() { @@ -1570,7 +1570,7 @@ uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (getSubVar(0xCCE0280F, _tileIndex) == 0 && _parentScene->getCountdown() == 0) { + if (getSubVar(VA_IS_TILE_MATCH, _tileIndex) == 0 && _parentScene->getCountdown() == 0) { show(); sendMessage(_parentScene, 0x2000, _tileIndex); } @@ -1609,12 +1609,12 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) // DEBUG>>> // TODO: Some debug code: Leave two matching tiles open for (int i = 0; i < 48; i++) - setSubVar(0xCCE0280F, i, 1); + setSubVar(VA_IS_TILE_MATCH, i, 1); int debugIndex = 0; - setSubVar(0xCCE0280F, debugIndex, 0); + setSubVar(VA_IS_TILE_MATCH, debugIndex, 0); for (int i = 0; i < 48; i++) { - if (i != debugIndex && getSubVar(0x0C65F80B, i) == getSubVar(0x0C65F80B, debugIndex)) { - setSubVar(0xCCE0280F, i, 0); + if (i != debugIndex && getSubVar(VA_TILE_SYMBOLS, i) == getSubVar(VA_TILE_SYMBOLS, debugIndex)) { + setSubVar(VA_IS_TILE_MATCH, i, 0); break; } } @@ -1623,7 +1623,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) { _tiles[tileIndex] = insertSprite(this, tileIndex); _vm->_collisionMan->addSprite(_tiles[tileIndex]); - if (getSubVar(0xCCE0280F, tileIndex)) + if (getSubVar(VA_IS_TILE_MATCH, tileIndex)) _tilesLeft--; } @@ -1641,9 +1641,9 @@ void Scene1405::update() { _tiles[_firstTileIndex]->hide(); _tiles[_secondTileIndex]->hide(); for (uint32 i = 0; i < 48; i++) { - if (getSubVar(0xCCE0280F, i)) { + if (getSubVar(VA_IS_TILE_MATCH, i)) { _tiles[i]->hide(); - setSubVar(0xCCE0280F, i, 0); + setSubVar(VA_IS_TILE_MATCH, i, 0); } } } @@ -1669,9 +1669,9 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit _secondTileIndex = param.asInteger(); if (_firstTileIndex != _secondTileIndex) { _selectFirstTile = true; - if (getSubVar(0x0C65F80B, _secondTileIndex) == getSubVar(0x0C65F80B, _firstTileIndex)) { - setSubVar(0xCCE0280F, _firstTileIndex, 1); - setSubVar(0xCCE0280F, _secondTileIndex, 1); + if (getSubVar(VA_TILE_SYMBOLS, _secondTileIndex) == getSubVar(VA_TILE_SYMBOLS, _firstTileIndex)) { + setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1); + setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1); _tilesLeft -= 2; if (_tilesLeft == 0) { playSound(0); diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index f45f87faca..22ffaf64ff 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1415,7 +1415,7 @@ void Scene1609::update() { _currentSymbolIndex++; if (_currentSymbolIndex >= 12) _currentSymbolIndex = 0; - _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(0x04909A50, _noisySymbolIndex)); + _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(VA_CODE_SYMBOLS, _noisySymbolIndex)); _changeCurrentSymbol = false; _countdown1 = 36; } else { @@ -1468,12 +1468,12 @@ bool Scene1609::testVars() { int cmpSymbolIndex = 0; // Find the position of the first symbol - while ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex()) + while ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex()) cmpSymbolIndex++; // Check if the entered symbols match for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) { - if ((int)getSubVar(0x04909A50, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex()) + if ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex()) return false; cmpSymbolIndex++; if (cmpSymbolIndex >= 12) diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index f6d140b904..adbd853664 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -151,7 +151,7 @@ SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHas SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash) : StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _tapeIndex(tapeIndex) { - if (!getSubVar(0x02038314, _tapeIndex) && !getSubVar(0x02720344, _tapeIndex)) { + if (!getSubVar(VA_HAS_TAPE, _tapeIndex) && !getSubVar(VA_IS_TAPE_INSERTED, _tapeIndex)) { SetMessageHandler(&SsScene1705Tape::handleMessage); } else { setVisible(false); @@ -173,7 +173,7 @@ uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam ¶m, messageResult = 1; break; case 0x4806: - setSubVar(0x02038314, _tapeIndex, 1); + setSubVar(VA_HAS_TAPE, _tapeIndex, 1); setVisible(false); SetMessageHandler(NULL); break; @@ -205,9 +205,9 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x18222039); - insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 0)], 0); - insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 1)], 1); - insertSprite(kScene1705FileHashes[getSubVar(0x0A4C0A9A, 2)], 2); + insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0); + insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1); + insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2); _sprite = insertStaticSprite(0x31313A22, 1100); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 503a1d37c0..20a8559aae 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -504,7 +504,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - if (!getSubVar(0x40050052, 0x60400854)) { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x60400854)) { // TODO _vm->gameModule()->initScene2201Vars(); } @@ -525,8 +525,8 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) - if ((int16)getSubVar(0x484498D0, cubeIndex) >= 0) - insertSprite(cubeIndex, (int16)getSubVar(0x484498D0, cubeIndex)); + if ((int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex) >= 0) + insertSprite(cubeIndex, (int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex)); _clipRects[0].y1 = 0; _clipRects[0].x2 = 640; @@ -799,8 +799,8 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { _drawRect.height = _spriteResource.getDimensions().height; _needRefresh = true; - setSubVar(0x484498D0, _tileIndex, (uint32)-1); - setSubVar(0x484498D0, newTileIndex, (uint32)_value); + setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1); + setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value); _tileIndex = newTileIndex; @@ -901,11 +901,11 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) //DEBUG>>> for (uint32 index = 0; index < 9; index++) - setSubVar(0x484498D0, index, 7 - index); + setSubVar(VA_CUBE_POSITIONS, index, 7 - index); //DEBUG<<< for (uint32 index = 0; index < 9; index++) { - int16 value = (int16)getSubVar(0x484498D0, index); + int16 value = (int16)getSubVar(VA_CUBE_POSITIONS, index); if (value >= 0) { Sprite *puzzleTileSprite = insertSprite(this, index, value); _vm->_collisionMan->addSprite(puzzleTileSprite); @@ -995,13 +995,13 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit } int16 Scene2202::getFreeTileIndex(int16 index) { - if (index >= 3 && (int16)getSubVar(0x484498D0, index - 3) == -1) { + if (index >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 3) == -1) { return index - 3; - } else if (index <= 5 && (int16)getSubVar(0x484498D0, index + 3) == -1) { + } else if (index <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 3) == -1) { return index + 3; - } else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(0x484498D0, index - 1) == -1) { + } else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 1) == -1) { return index - 1; - } else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(0x484498D0, index + 1) == -1) { + } else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 1) == -1) { return index + 1; } else return -1; @@ -1009,13 +1009,13 @@ int16 Scene2202::getFreeTileIndex(int16 index) { bool Scene2202::testIsSolved() { return - getSubVar(0x484498D0, 0) == 0 && - getSubVar(0x484498D0, 2) == 2 && - getSubVar(0x484498D0, 3) == 3 && - getSubVar(0x484498D0, 4) == 4 && - getSubVar(0x484498D0, 5) == 5 && - getSubVar(0x484498D0, 6) == 6 && - getSubVar(0x484498D0, 8) == 7; + getSubVar(VA_CUBE_POSITIONS, 0) == 0 && + getSubVar(VA_CUBE_POSITIONS, 2) == 2 && + getSubVar(VA_CUBE_POSITIONS, 3) == 3 && + getSubVar(VA_CUBE_POSITIONS, 4) == 4 && + getSubVar(VA_CUBE_POSITIONS, 5) == 5 && + getSubVar(VA_CUBE_POSITIONS, 6) == 6 && + getSubVar(VA_CUBE_POSITIONS, 8) == 7; } static const uint32 kAsCommonKeyFileHashes[] = { @@ -1025,7 +1025,7 @@ static const uint32 kAsCommonKeyFileHashes[] = { AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y) : AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) { - if (!getSubVar(0x0090EA95, _keyIndex) && !getSubVar(0x08D0AB11, _keyIndex)) { + if (!getSubVar(VA_HAS_KEY, _keyIndex) && !getSubVar(VA_IS_KEY_INSERTED, _keyIndex)) { SetMessageHandler(&AsCommonKey::handleMessage); } else { // If Klayman already has the key or it's already inserted then don't show it @@ -1042,7 +1042,7 @@ uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam ¶m, Ent messageResult = 1; break; case 0x4806: - setSubVar(0x0090EA95, _keyIndex, 1); + setSubVar(VA_HAS_KEY, _keyIndex, 1); setVisible(false); SetMessageHandler(NULL); } @@ -2017,8 +2017,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene3009Vars(); - if (!getSubVar(0x40050052, 0x88460852)) - setSubVar(0x40050052, 0x88460852, 1); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852)) + setSubVar(VA_IS_PUZZLE_INIT, 0x88460852, 1); SetMessageHandler(&Scene2207::handleMessage); SetUpdateHandler(&Scene2207::update); @@ -2069,9 +2069,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); - insertSprite(kScene2207FileHashes[getSubVar(0x00504B86, 0)], 0); - insertSprite(kScene2207FileHashes[getSubVar(0x00504B86, 1)], 1); - insertSprite(kScene2207FileHashes[getSubVar(0x00504B86, 2)], 2); + insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0); + insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1); + insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 2)], 2); _asTape = NULL; _asLever = NULL; @@ -2162,11 +2162,11 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (sender == _ssButton) { - if (getSubVar(0x14800353, 0x40119852)) { - setSubVar(0x14800353, 0x40119852, 0); + if (getSubVar(VA_LOCKS_DISABLED, 0x40119852)) { + setSubVar(VA_LOCKS_DISABLED, 0x40119852, 0); playSound(0, calcHash("fx3LocksDisable")); } else { - setSubVar(0x14800353, 0x40119852, 1); + setSubVar(VA_LOCKS_DISABLED, 0x40119852, 1); playSound(1); } } diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 4e8d26d3a7..d29330f9ca 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -222,7 +222,7 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p case 0x2000: _x = 240; _y = 447; - _soundIndex = getSubVar(0x0800547C, param.asInteger()); + _soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()); playSound(0, 0x48640244); startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1); setVisible(true); @@ -448,9 +448,9 @@ void Scene2401::update() { if (_pipeStatus >= 10) { bool puzzleSolved = true, waterInside = false; for (uint i = 0; i < 5; i++) { - if (getSubVar(0x0800547C, i) != getSubVar(0x90405038, i)) + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, i)) puzzleSolved = false; - if (getSubVar(0x0800547C, i) != 0) + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != 0) waterInside = true; } if (puzzleSolved) { @@ -460,18 +460,18 @@ void Scene2401::update() { } else if (waterInside) { playPipeSound(0xD0431020); for (uint i = 0; i < 5; i++) { - sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(0x0800547C, i)); - setSubVar(0x0800547C, i, 0); + sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(VA_CURR_WATER_PIPES_LEVEL, i)); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, i, 0); } } } else if (_pipeStatus >= 5) { _ssWaterPipes[_pipeStatus]->setVisible(true); _countdown1 = 8; - playPipeSound(kScene2401FileHashes3[getSubVar(0x0800547C, _pipeStatus - 5)]); + playPipeSound(kScene2401FileHashes3[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); } else { _ssWaterPipes[_pipeStatus]->setVisible(true); _countdown1 = _pipeStatus == 4 ? 16 : 8; - playPipeSound(kScene2401FileHashes3[getSubVar(0x90405038, _pipeStatus)]); + playPipeSound(kScene2401FileHashes3[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]); } _pipeStatus++; } @@ -534,9 +534,9 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2001: sendMessage(_asWaterSpit[_asWaterSpitIndex], 0x2000, param.asInteger()); _asWaterSpitIndex = (_asWaterSpitIndex + 1) & 1; - incSubVar(0x0800547C, param.asInteger(), 1); - if (getSubVar(0x0800547C, param.asInteger()) >= 5) - setSubVar(0x0800547C, param.asInteger(), 4); + incSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 1); + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()) >= 5) + setSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 4); break; case 0x480B: if (sender == _ssButton) { @@ -771,10 +771,10 @@ void Scene2402::update() { _ssDoorFrame->update(); } else if (_pipeStatus >= 5) { _countdown = 8; - playPipeSound(kScene2402FileHashes[getSubVar(0x0800547C, _pipeStatus - 5)]); + playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); } else { _countdown = _pipeStatus == 4 ? 16 : 8; - playPipeSound(kScene2402FileHashes[getSubVar(0x90405038, _pipeStatus)]); + playPipeSound(kScene2402FileHashes[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]); } _pipeStatus++; } @@ -892,11 +892,11 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x480B: if (sender == _ssButton) { - if (getSubVar(0x14800353, 0x304008D2)) { - setSubVar(0x14800353, 0x304008D2, 0); + if (getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) { + setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 0); playSound(0, calcHash("fx3LocksDisable")); } else { - setSubVar(0x14800353, 0x304008D2, 1); + setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 1); playSound(1); } } diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index d6840a3f65..0a14fb65a3 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -516,7 +516,7 @@ void SsScene2504Button::update() { _isSoundPlaying = false; } if (_countdown != 0 && (--_countdown) == 0) { - if (getSubVar(0x14800353, 0x01180951)) { + if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) { playSound(0); } else { playSound(1); @@ -532,10 +532,10 @@ uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam ¶ if (_countdown == 0 && !_isSoundPlaying) { setVisible(true); _countdown = 2; - if (getSubVar(0x14800353, 0x01180951)) { - setSubVar(0x14800353, 0x01180951, 0); + if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) { + setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0); } else { - setSubVar(0x14800353, 0x01180951, 1); + setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1); } playSound(2); } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 9603f7027d..080f8151b2 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -168,9 +168,9 @@ void Module2700::createScene(int sceneNum, int which) { break; case 10: // TODO _vm->gameModule()->initScene2808Vars2(); - _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(0x40005834, 2)]; - _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(0x40005834, 1)]; - _scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(0x40005834, 0)]; + _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)]; + _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)]; + _scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0)]; _scene2711StaticSprites[3] = 0x0261282E; _scene2711StaticSprites[4] = 0x9608E5A0; _scene2711StaticSprites[5] = 0; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index e664eb3a83..4232b794df 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -658,18 +658,18 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xA423A41A); - if (getSubVar(0x0C601058, 0) == 0) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { _asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100); } else { _asTestTubeOne = (StaticSprite*)insertSprite( - kScene2803FileHashes1[getSubVar(0x0C601058, 0)], - kScene2803FileHashes2[getSubVar(0x0C601058, 0)]); + kScene2803FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], + kScene2803FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)]); } - if (getSubVar(0x0C601058, 1) == 3) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) _asTestTubeTwo = (StaticSprite*)insertStaticSprite(0x64330236, 100); - if (getSubVar(0x0C601058, 2) == 3) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) _asTestTubeThree = (StaticSprite*)insertStaticSprite(0x2E4A22A2, 100); _asLightCord = insertSprite(this, 0x8FAD5932, 0x276E1A3D, 578, 200); @@ -842,16 +842,16 @@ void Scene2803::changeBackground() { _sprite8->update(); _sprite9->load(0x341A0237, false, false); _sprite9->update(); - if (getSubVar(0x0C601058, 0) == 0) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { _asTestTubeOne->load(0x66121222, false, false); _asTestTubeOne->update(); } else sendMessage(_asTestTubeOne, 0x2000, 0); - if (getSubVar(0x0C601058, 1) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { _asTestTubeTwo->load(0x64330236, false, false); _asTestTubeTwo->update(); } - if (getSubVar(0x0C601058, 2) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { _asTestTubeThree->load(0x2E4A22A2, false, false); _asTestTubeThree->update(); } @@ -877,16 +877,16 @@ void Scene2803::changeBackground() { _sprite8->update(); _sprite9->load(0x708072E0, false, false); _sprite9->update(); - if (getSubVar(0x0C601058, 0) == 0) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { _asTestTubeOne->load(0x50C027A8, false, false); _asTestTubeOne->update(); } else sendMessage(_asTestTubeOne, 0x2000, 1); - if (getSubVar(0x0C601058, 1) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { _asTestTubeTwo->load(0xD48077A0, false, false); _asTestTubeTwo->update(); } - if (getSubVar(0x0C601058, 2) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { _asTestTubeThree->load(0x30022689, false, false); _asTestTubeThree->update(); } @@ -951,15 +951,15 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh _sprite6 = insertStaticSprite(0x3C42022F, 1100); _sprite7 = insertStaticSprite(0x341A0237, 1100); - if (getSubVar(0x0C601058, 0) == 0) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) insertStaticSprite(0x66121222, 100); else - insertSprite(kScene2803SmallFileHashes1[getSubVar(0x0C601058, 0)], 100, 529, 326); + insertSprite(kScene2803SmallFileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); - if (getSubVar(0x0C601058, 1) == 3) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) insertStaticSprite(0x64330236, 100); - if (getSubVar(0x0C601058, 2) == 3) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) insertStaticSprite(0x2E4A22A2, 100); } else { @@ -976,16 +976,16 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh _sprite7 = insertStaticSprite(0x708072E0, 1100); insertStaticSprite(0x90582EA4, 100); - setSubVar(0x0C601058, 0, 1);//DEBUG, FIXME crashes when not done?! - if (getSubVar(0x0C601058, 0) == 0) + setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0, 1);//DEBUG, FIXME crashes when not done?! + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) insertStaticSprite(0x50C027A8, 100); else - insertSprite(kScene2803SmallFileHashes2[getSubVar(0x0C601058, 0)], 100, 529, 326); + insertSprite(kScene2803SmallFileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); - if (getSubVar(0x0C601058, 1) == 3) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) insertStaticSprite(0xD48077A0, 100); - if (getSubVar(0x0C601058, 2) == 3) + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) insertStaticSprite(0x30022689, 100); } @@ -1386,7 +1386,7 @@ AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWa {470, 180} }; - _colorNum = (int16)getSubVar(0xE11A1929, crystalIndex); + _colorNum = (int16)getSubVar(VA_CURR_CRYSTAL_COLORS, crystalIndex); _isLightOn = getGlobalVar(V_SHRINK_LIGHTS_ON) != 0; if (_isLightOn) { _x = kAsScene2804CrystalPoints[crystalIndex].x; @@ -1441,7 +1441,7 @@ void AsScene2804Crystal::activate() { startAnimation(kAsScene2804CrystalFileHashes[_crystalIndex], _colorNum, -1); _newStickFrameIndex = _colorNum; } - setSubVar(0xE11A1929, _crystalIndex, _colorNum); + setSubVar(VA_CURR_CRYSTAL_COLORS, _crystalIndex, _colorNum); } } @@ -1686,7 +1686,7 @@ uint32 Scene2804::handleMessage(int messageNum, const MessageParam ¶m, Entit _isSolved = true; _beamStatus = 0; for (uint index = 0; index < 5; index++) - if (_asCrystals[index]->getColorNum() != (int16)getSubVar(0xD4B2089C, index)) + if (_asCrystals[index]->getColorNum() != (int16)getSubVar(VA_GOOD_CRYSTAL_COLORS, index)) _isSolved = false; _countdown2 = 48; break; @@ -1767,8 +1767,8 @@ void Scene2804::initCrystalColors() { do { misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1); } while (misalignedColorNum == correctColorNum); - setSubVar(0xD4B2089C, index, correctColorNum); - setSubVar(0xE11A1929, index, misalignedColorNum); + setSubVar(VA_GOOD_CRYSTAL_COLORS, index, correctColorNum); + setSubVar(VA_CURR_CRYSTAL_COLORS, index, misalignedColorNum); } setGlobalVar(V_CRYSTAL_COLORS_INIT, 1); } @@ -1989,27 +1989,27 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; SetMessageHandler(&Scene2807::handleMessage); - if (getSubVar(0x0C601058, 0) == 1) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 1) { insertStaticSprite(0x103021E2, 300); - } else if (getSubVar(0x0C601058, 0) == 2) { + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 2) { insertStaticSprite(0x103022E2, 300); - } else if (getSubVar(0x0C601058, 0) == 3) { + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 3) { insertStaticSprite(0x103024E2, 300); } - if (getSubVar(0x0C601058, 1) == 1) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 1) { insertStaticSprite(0x4800A52A, 200); - } else if (getSubVar(0x0C601058, 1) == 2) { + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 2) { insertStaticSprite(0x4800A62A, 200); - } else if (getSubVar(0x0C601058, 1) == 3) { + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { insertStaticSprite(0x4800A02A, 200); } - if (getSubVar(0x0C601058, 2) == 1) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 1) { insertStaticSprite(0x31203430, 100); - } else if (getSubVar(0x0C601058, 2) == 2) { + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 2) { insertStaticSprite(0x31203400, 100); - } else if (getSubVar(0x0C601058, 2) == 3) { + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { insertStaticSprite(0x31203460, 100); } @@ -2439,7 +2439,7 @@ void Scene2808::update() { // DEBUG>>>: Show correct values debug("---------------"); - debug("%03d %03d %03d", getSubVar(0x0C601058, 0), getSubVar(0x0C601058, 1), getSubVar(0x0C601058, 2)); + debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2)); debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); // DEBUG<<< @@ -2452,14 +2452,14 @@ void Scene2808::update() { bool Scene2808::isMixtureGood() { if (_testTubeSetNum == 0) { return - _asTestTubes[0]->getFillLevel() == getSubVar(0x0C601058, 0) && - _asTestTubes[1]->getFillLevel() == getSubVar(0x0C601058, 1) && - _asTestTubes[2]->getFillLevel() == getSubVar(0x0C601058, 2); + _asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) && + _asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) && + _asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2); } else { return - _asTestTubes[0]->getFillLevel() == getSubVar(0x40005834, 0) && - _asTestTubes[1]->getFillLevel() == getSubVar(0x40005834, 1) && - _asTestTubes[2]->getFillLevel() == getSubVar(0x40005834, 2); + _asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0) && + _asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1) && + _asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2); } } diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 7312da7a1c..242a00e012 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -121,8 +121,8 @@ void Module3000::createScene(int sceneNum, int which) { break; case 7: _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); - if (!getSubVar(0x40050052, 0x089809C2)) { - setSubVar(0x40050052, 0x089809C2, 1); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x089809C2)) { + setSubVar(VA_IS_PUZZLE_INIT, 0x089809C2, 1); createSmackerScene(0x90022001, true, true, false); } else createSmackerScene(0x98022001, true, true, false); @@ -138,8 +138,8 @@ void Module3000::createScene(int sceneNum, int which) { break; case 11: _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); - if (!getSubVar(0x40050052, 0x10130993)) { - setSubVar(0x40050052, 0x10130993, 1); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x10130993)) { + setSubVar(VA_IS_PUZZLE_INIT, 0x10130993, 1); createSmackerScene(0x31093019, true, true, false); } else createSmackerScene(0x20093019, true, true, false); @@ -744,7 +744,7 @@ void AsScene3009HorizontalIndicator::stMoveRight() { AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _symbolPosition(symbolPosition) { - _symbolIndex = getSubVar(0x00000914, _symbolPosition); + _symbolIndex = getSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition); _x = kAsScene3009SymbolPoints[_symbolPosition].x; _y = kAsScene3009SymbolPoints[_symbolPosition].y; @@ -778,7 +778,7 @@ uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶ } startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); _newStickFrameIndex = _symbolIndex; - setSubVar(0x00000914, _symbolPosition, _symbolIndex); + setSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition, _symbolIndex); if (_symbolPosition / 3 == 0) { sendMessage(_parentScene, 0x2001, 0); } else { @@ -846,9 +846,9 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) for (int symbolPosition = 0; symbolPosition < 6; symbolPosition++) { _asSymbols[symbolPosition] = insertSprite(this, symbolPosition); if (symbolPosition < 3) - _correctSymbols[symbolPosition] = getSubVar(0x00504B86, symbolPosition); + _correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_1, symbolPosition); else - _correctSymbols[symbolPosition] = getSubVar(0x0A4C0A9A, symbolPosition - 3); + _correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_2, symbolPosition - 3); } SetMessageHandler(&Scene3009::handleMessage); @@ -856,7 +856,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) // DEBUG: Set the correct code for (int i = 0; i < 6; i++) - setSubVar(0x00000914, i, _correctSymbols[i]); + setSubVar(VA_CURR_CANNON_SYMBOLS, i, _correctSymbols[i]); sendMessage(this, 0x2003, 0); //setGlobalVar(V_ROBOT_TARGET, 1); @@ -1032,14 +1032,14 @@ void Scene3009::playActionVideo() { bool Scene3009::isSymbolsPart1Solved() { for (int i = 0; i < 3; i++) - if (_correctSymbols[i] != getSubVar(0x00000914, i)) + if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i)) return false; return true; } bool Scene3009::isSymbolsPart2Solved() { for (int i = 3; i < 6; i++) - if (_correctSymbols[i] != getSubVar(0x00000914, i)) + if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i)) return false; return true; } @@ -1091,7 +1091,7 @@ SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene NDimensions dimensions1, dimensions2; - _buttonEnabled = getSubVar(0x14800353, kScene3010ButtonNameHashes[_buttonIndex]) != 0; + _buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0; _spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); dimensions1 = _spriteResource.getDimensions(); _spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); @@ -1181,7 +1181,7 @@ AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene _x = kAsScene3010DeadBoltPoints[_boltIndex].x; _y = kAsScene3010DeadBoltPoints[_boltIndex].y; - if (getSubVar(0x14800353, kScene3010ButtonNameHashes[_boltIndex])) { + if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_boltIndex])) { createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); loadSound(0, 0x46005BC4); @@ -1293,9 +1293,9 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) int initCountdown = 0; // DEBUG: Enable all buttons - setSubVar(0x14800353, kScene3010ButtonNameHashes[0], 1); - setSubVar(0x14800353, kScene3010ButtonNameHashes[1], 1); - setSubVar(0x14800353, kScene3010ButtonNameHashes[2], 1); + setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[0], 1); + setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1); + setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1); _surfaceFlag = true; @@ -1306,7 +1306,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) _asDeadBolts[i] = insertSprite(this, i, which == 1);//CHECKME _ssDeadBoltButtons[i] = insertSprite(this, i, initCountdown, which == 1);//CHECKME _vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]); - if (getSubVar(0x14800353, kScene3010ButtonNameHashes[i])) + if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i])) initCountdown++; _boltUnlocking[i] = false; _boltUnlocked[i] = false; @@ -1570,9 +1570,9 @@ void Scene3011::update() { do { _noisyRandomSymbolIndex = _vm->_rnd->getRandomNumber(12 - 1); } while (_noisySymbolIndex == _noisyRandomSymbolIndex); - _asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->show(true); + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->show(true); } else { - _asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->show(false); + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->show(false); } _updateStatus = 1; _countdown = 24; @@ -1593,9 +1593,9 @@ void Scene3011::update() { _updateStatus = 0; _countdown = 1; if (_noisySymbolIndex == _currentSymbolIndex) { - _asSymbols[getSubVar(0x04909A50, _noisyRandomSymbolIndex)]->hide(); + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->hide(); } else { - _asSymbols[getSubVar(0x04909A50, _currentSymbolIndex)]->hide(); + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->hide(); } _currentSymbolIndex++; if (_currentSymbolIndex >= 12) diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index e96fe8ad3d..e2cb7cdfa3 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -77,9 +77,9 @@ void SmackerScene::nextVideo() { sendMessage(_parentModule, 0x1009, 0); return; } - _fieldDF = getSubVar(0x00800410, smackerFileHash); + _fieldDF = getSubVar(VA_SMACKER_PLAYED, smackerFileHash); if (!_fieldDF) { - setSubVar(0x00800410, smackerFileHash, 1); + setSubVar(VA_SMACKER_PLAYED, smackerFileHash, 1); } if (_fileHashListIndex == 0) _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false)); -- cgit v1.2.3 From 111b6d32c6c8e6aaafdb6e5efaeea0a0ae4aa998 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 11 Oct 2012 21:23:55 +0000 Subject: NEVERHOOD: Fix Smacker framerate bug after the video decoder changes - React to the space key which can skip some videos and navigation transitions - Minor renaming in SmackerScene --- engines/neverhood/gamemodule.cpp | 9 ++++++++- engines/neverhood/gamemodule.h | 1 + engines/neverhood/neverhood.cpp | 7 +++++++ engines/neverhood/smackerplayer.cpp | 4 ++++ engines/neverhood/smackerscene.cpp | 9 ++++----- engines/neverhood/smackerscene.h | 2 +- 6 files changed, 25 insertions(+), 7 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 1b9c9f361d..0c2e0907a7 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -85,6 +85,13 @@ void GameModule::handleMouseDown(int16 x, int16 y) { } } +void GameModule::handleSpaceKey() { + if (_childObject) { + debug(2, "GameModule::handleSpaceKey()"); + sendMessage(_childObject, 9, 0); + } +} + void GameModule::initScene1307Vars() { // Exit if it's already initialized @@ -314,7 +321,7 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; _vm->gameState().sceneNum = 1; - createModule(2200, -1); + createModule(3000, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index af72d53fc9..7031bbbe16 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -37,6 +37,7 @@ public: void startup(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); + void handleSpaceKey(); void initScene1307Vars(); void initScene1405Vars(); void initScene2401Vars(); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index e5c07b5b8d..4b75f68c3e 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -116,6 +116,13 @@ Common::Error NeverhoodEngine::run() { switch (event.type) { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; + switch (_keyState) { + case Common::KEYCODE_SPACE: + _gameModule->handleSpaceKey(); + break; + default: + break; + } break; case Common::EVENT_KEYUP: _keyState = Common::KEYCODE_INVALID; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 799f04f09a..0ed6748e45 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -103,10 +103,14 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { _palette = new Palette(_vm); _palette->usePalette(); + + _smackerDecoder->start(); } void SmackerPlayer::close() { + if (_smackerDecoder) + _smackerDecoder->stop(); delete _smackerDecoder; delete _palette; // NOTE: The SmackerDecoder deletes the _stream diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index e2cb7cdfa3..d4f65b3652 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -25,7 +25,7 @@ namespace Neverhood { SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort) - : Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _fieldDF(false), + : Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false), _fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) { debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort); @@ -77,10 +77,9 @@ void SmackerScene::nextVideo() { sendMessage(_parentModule, 0x1009, 0); return; } - _fieldDF = getSubVar(VA_SMACKER_PLAYED, smackerFileHash); - if (!_fieldDF) { + _videoPlayedBefore = getSubVar(VA_SMACKER_PLAYED, smackerFileHash); + if (!_videoPlayedBefore) setSubVar(VA_SMACKER_PLAYED, smackerFileHash, 1); - } if (_fileHashListIndex == 0) _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, smackerFileHash, _doubleSurface, false)); else @@ -105,7 +104,7 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam ¶m, En uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0009: - if ((_fieldDF && _flag1) || (_canAbort && _flag1)) + if ((_videoPlayedBefore && _flag1) || (_canAbort && _flag1)) _playNextVideoFlag = true; break; case 0x000C: diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h index 05237664c3..54de28a720 100644 --- a/engines/neverhood/smackerscene.h +++ b/engines/neverhood/smackerscene.h @@ -40,7 +40,7 @@ protected: bool _doubleSurface; bool _flag1; bool _canAbort; - bool _fieldDF; + bool _videoPlayedBefore; bool _playNextVideoFlag; int _fileHashListIndex; const uint32 *_fileHashList; -- cgit v1.2.3 From b8d939a94b364a8d992a5053b527a822babccd37 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 12 Oct 2012 19:19:24 +0000 Subject: NEVERHOOD: Implement Scene2802 (radio tuning scene) - Handle mouse button up events - Use the SmackerDecoder's rewind - Implement SmackerPlayer::gotoFrame (slow but better than nothing) --- engines/neverhood/gamemodule.cpp | 39 ++++++- engines/neverhood/gamemodule.h | 2 + engines/neverhood/module2800.cpp | 215 ++++++++++++++++++++++++++++++++++-- engines/neverhood/module2800.h | 22 +++- engines/neverhood/neverhood.cpp | 4 + engines/neverhood/smackerplayer.cpp | 60 +++++----- engines/neverhood/smackerplayer.h | 5 +- 7 files changed, 304 insertions(+), 43 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 0c2e0907a7..a85d8a90e5 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -46,6 +46,27 @@ namespace Neverhood { +static const uint32 kScene2801MusicFileHashes[] = { + 0x82B22000, + 0x02B22004, + 0x42B22000, + 0x03322008, + 0x02B22001, + 0x02B22008, + 0x02B22020, + 0x03322001, + 0x03322002, + 0x03322004, + 0x03322040, + 0x02B22002, + 0x02B22010, + 0x03322010, + 0x02B22040, + 0x43322000, + 0x83322000, + 0x03322020 +}; + GameModule::GameModule(NeverhoodEngine *vm) : Module(vm, NULL), _moduleNum(-1) { @@ -85,6 +106,16 @@ void GameModule::handleMouseDown(int16 x, int16 y) { } } +void GameModule::handleMouseUp(int16 x, int16 y) { + if (_childObject) { + NPoint mousePos; + mousePos.x = x; + mousePos.y = y; + debug(2, "GameModule::handleMouseUp(%d, %d)", x, y); + sendPointMessage(_childObject, 2, mousePos); + } +} + void GameModule::handleSpaceKey() { if (_childObject) { debug(2, "GameModule::handleSpaceKey()"); @@ -279,6 +310,12 @@ void GameModule::initScene3009Vars() { } } +uint32 GameModule::getScene2802MusicFileHash() { + uint musicNum = getGlobalVar(0x08CC0828); + return (musicNum % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP(musicNum / 5, 0, 17)]; +} + + uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -321,7 +358,7 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; _vm->gameState().sceneNum = 1; - createModule(3000, -1); + createModule(2800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 7031bbbe16..82e6fa57c8 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -37,6 +37,7 @@ public: void startup(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); + void handleMouseUp(int16 x, int16 y); void handleSpaceKey(); void initScene1307Vars(); void initScene1405Vars(); @@ -44,6 +45,7 @@ public: void initScene2808Vars1(); void initScene2808Vars2(); void initScene3009Vars(); + uint32 getScene2802MusicFileHash(); protected: Entity *_prevChildObject; bool _someFlag1; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 4232b794df..1a51571fa3 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -31,9 +31,9 @@ namespace Neverhood { Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { + : Module(vm, parentModule), _musicResource(NULL) { - _fileHash = 0; + _currentMusicFileHash = 0; // TODO music stuff _vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14); setGlobalVar(0x28D8C940, 1); @@ -51,7 +51,10 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) } Module2800::~Module2800() { - // TODO music stuff + if (_musicResource) { + _musicResource->unload(); + delete _musicResource; + } _vm->_soundMan->deleteGroup(0x64210814); } @@ -65,6 +68,11 @@ void Module2800::createScene(int sceneNum, int which) { break; case 1: _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); + + // TODO!! + + _childObject = new Scene2802(_vm, this, which); + #if 0 _flag = true; // DEBUG! if (_flag) { @@ -180,10 +188,10 @@ void Module2800::createScene(int sceneNum, int which) { _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new DiskplayerScene(_vm, this, 4); break; - // case 1001: + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); + createSmackerScene(0x00800801, true, true, false); break; - // TODO ... } SetUpdateHandler(&Module2800::updateScene); _childObject->handleUpdate(); @@ -351,22 +359,51 @@ void Module2800::updateScene() { case 26: createScene(11, 2); break; - // case 1001: + createScene(1, -1); break; } } else { switch (_vm->gameState().sceneNum) { case 0: - // TODO Module2800_updateMusic(true); + updateMusic(true); break; case 1: - // TODO Module2800_updateMusic(false); + updateMusic(false); break; } } } +void Module2800::updateMusic(bool halfVolume) { + + uint32 newMusicFileHash = _vm->_gameModule->getScene2802MusicFileHash(); + + if (!_musicResource) + _musicResource = new MusicResource(_vm); + + if (newMusicFileHash != _currentMusicFileHash) { + _currentMusicFileHash = newMusicFileHash; + if (_currentMusicFileHash != 0) { + _musicResource->load(_currentMusicFileHash); + _musicResource->setVolume(halfVolume ? 60 : 100); + _musicResource->play(0); + } else { + _musicResource->stop(0); + } + } else if (_currentMusicFileHash != 0) { + if (!_musicResource->isPlaying()) { + _musicResource->setVolume(halfVolume ? 60 : 100); + _musicResource->play(0); + } else { + _musicResource->setVolume(halfVolume ? 60 : 100); + } + } else { + _musicResource->stop(0); + } + +} + Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { @@ -475,6 +512,168 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } +Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _countdownType(0), _countdown1(0), _countdown2(0) { + + //DEBUG>>> Disable video + setGlobalVar(0x28D8C940, 0); + //DEBUG<<< + + _surfaceFlag = true; + SetMessageHandler(&Scene2802::handleMessage); + SetUpdateHandler(&Scene2802::update); + insertMouse435(0x008810A8, 20, 620); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true)); + _smackerFrameNumber = getGlobalVar(0x08CC0828); + _smackerPlayer->gotoFrame(_smackerFrameNumber); + _vm->_soundMan->addSound(0x04360A18, 0x422630C2); + _vm->_soundMan->addSound(0x04360A18, 0x00632252); + _vm->_soundMan->addSound(0x04360A18, 0x00372241); + _vm->_soundMan->setSoundVolume(0x00372241, 60); + changeCountdownType(0, 0); + _vm->_soundMan->playSoundLooping(0x00372241); +} + +Scene2802::~Scene2802() { + _vm->_soundMan->deleteSoundGroup(0x04360A18); + if (_smackerFrameNumber == 0) { + setGlobalVar(0x09880D40, 1); + setGlobalVar(0x08180ABC, 0); + } else if (_smackerFrameNumber == getGlobalVar(0x88880915)) { + setGlobalVar(0x09880D40, 0); + setGlobalVar(0x08180ABC, 1); + } else { + setGlobalVar(0x09880D40, 0); + setGlobalVar(0x08180ABC, 0); + } + setGlobalVar(0x08CC0828, _smackerFrameNumber); +} + +void Scene2802::update() { + int prevCountdownType = _countdownType; + uint prevSmackerFrameNumber = _smackerFrameNumber; + + Scene::update(); + if (_countdown1 > 0) + --_countdown1; + else if (_countdownType == 1) + _countdownType = 3; + else if (_countdownType == 4) + _countdownType = 6; + + switch (_countdownType) { + case 2: + if (_smackerFrameNumber < 90) + incSmackerFrameNumber(+1); + _countdownType = 0; + break; + case 3: + if (_countdown2 > 0) + --_countdown2; + else if (_smackerFrameNumber < 90) { + incSmackerFrameNumber(+1); + _countdown2 = 1; + } else + _countdownType = 0; + break; + case 5: + if (_smackerFrameNumber > 0) + incSmackerFrameNumber(-1); + _countdownType = 0; + break; + case 6: + if (_countdown2 > 0) + --_countdown2; + else if (_smackerFrameNumber > 0) { + incSmackerFrameNumber(-1); + _countdown2 = 1; + } else + _countdownType = 0; + break; + + } + + if (prevSmackerFrameNumber != _smackerFrameNumber) + _smackerPlayer->gotoFrame(_smackerFrameNumber); + + if (prevCountdownType != _countdownType) + changeCountdownType(prevCountdownType, _countdownType); + + if (getGlobalVar(0x28D8C940) && prevCountdownType != _countdownType && _smackerFrameNumber != 0) { + setGlobalVar(0x28D8C940, 0); + leaveScene(1); + } + +} + +uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + int prevCountdownType = _countdownType; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } else if (_countdownType == 0) { + if (param.asPoint().x > 180 && param.asPoint().x < 300 && + param.asPoint().y > 130 && param.asPoint().y < 310) { + _countdownType = 4; + } else if (param.asPoint().x > 300 && param.asPoint().x < 400 && + param.asPoint().y > 130 && param.asPoint().y < 310) { + _countdownType = 1; + } + if (_countdownType == 1 || _countdownType == 4) { + _countdown1 = 8; + changeCountdownType(0, _countdownType); + } + } + break; + case 0x0002: // TODO Implement button up event + if (_countdown1 == 0) + _countdownType = 0; + else { + if (_countdownType == 1) + _countdownType = 2; + else if (_countdownType == 4) + _countdownType = 5; + else + _countdownType = 0; + _countdown1 = 0; + } + if (prevCountdownType != _countdownType) + changeCountdownType(prevCountdownType, _countdownType); + break; + case 0x000D: + // DEBUG message + break; + } + return 0; +} + +void Scene2802::incSmackerFrameNumber(int delta) { + _smackerFrameNumber += delta; + setGlobalVar(0x08CC0828, _smackerFrameNumber); +} + +void Scene2802::changeCountdownType(int prevCountdownType, int newCountdownType) { + + if (prevCountdownType == 3 || prevCountdownType == 6) { + _vm->_soundMan->stopSound(0x422630C2); + _vm->_soundMan->stopSound(0x00632252); + } + + if (newCountdownType == 0) { + if (_vm->_gameModule->getScene2802MusicFileHash() != 0) { + _vm->_soundMan->stopSound(0x00632252); + } + else + _vm->_soundMan->playSoundLooping(0x00632252); + } else if (newCountdownType == 3 || newCountdownType == 6) { + _vm->_soundMan->playSoundLooping(0x422630C2); + _vm->_soundMan->playSoundLooping(0x00632252); + } + +} + AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), _isPulled(false), _isBusy(false) { diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index f0403f4990..ca8b058ca1 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -37,15 +37,17 @@ public: virtual ~Module2800(); protected: bool _flag; - uint32 _fileHash; + uint32 _currentMusicFileHash; + MusicResource *_musicResource; void createScene(int sceneNum, int which); void updateScene(); + void updateMusic(bool halfVolume); }; class Scene2801 : public Scene { public: Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2801(); + virtual ~Scene2801(); protected: Sprite *_sprite1; Sprite *_sprite2; @@ -54,6 +56,22 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Scene2802 : public Scene { +public: + Scene2802(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2802(); +protected: + SmackerPlayer *_smackerPlayer; + uint _smackerFrameNumber; + int _countdownType; + int _countdown1; + int _countdown2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void incSmackerFrameNumber(int delta); + void changeCountdownType(int prevCountdownType, int newCountdownType); +}; + class AsScene2803LightCord : public AnimatedSprite { public: AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 4b75f68c3e..cfeaf927d3 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -136,6 +136,10 @@ Common::Error NeverhoodEngine::run() { case Common::EVENT_RBUTTONDOWN: _gameModule->handleMouseDown(event.mouse.x, event.mouse.y); break; + case Common::EVENT_LBUTTONUP: + case Common::EVENT_RBUTTONUP: + _gameModule->handleMouseUp(event.mouse.x, event.mouse.y); + break; case Common::EVENT_QUIT: _system->quit(); break; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 0ed6748e45..b491bc5789 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -65,8 +65,8 @@ void SmackerDoubleSurface::draw() { // SmackerPlayer -SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag) - : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false), +SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused) + : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false), _paused(paused), _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true), _drawX(-1), _drawY(-1) { @@ -104,7 +104,8 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { _palette = new Palette(_vm); _palette->usePalette(); - _smackerDecoder->start(); + if (!_paused) + _smackerDecoder->start(); } @@ -121,8 +122,14 @@ void SmackerPlayer::close() { _smackerSurface = NULL; } -void SmackerPlayer::gotoFrame(uint frameNumber) { - // TODO? +void SmackerPlayer::gotoFrame(int frameNumber) { + // NOTE Slow as hell but only used in Scene2802 + if (frameNumber != _smackerDecoder->getCurFrame()) { + if (frameNumber < _smackerDecoder->getCurFrame()) + rewind(); + while (_smackerDecoder->getCurFrame() != frameNumber) + updateFrame(); + } } uint32 SmackerPlayer::getFrameCount() { @@ -147,20 +154,8 @@ void SmackerPlayer::setDrawPos(int16 x, int16 y) { } void SmackerPlayer::rewind() { - - // TODO Quite dirty, try to implement this in the decoder - - delete _smackerDecoder; - _smackerDecoder = NULL; - _stream = NULL; - - _smackerFirst = true; - - _stream = _vm->_res->createStream(_fileHash); - - _smackerDecoder = new Video::SmackerDecoder(); - _smackerDecoder->loadStream(_stream); - + if (_smackerDecoder) + _smackerDecoder->rewind(); } void SmackerPlayer::update() { @@ -174,17 +169,22 @@ void SmackerPlayer::update() { _dirtyFlag = false; } - if (!_smackerDecoder->endOfVideo()) { - updateFrame(); - } else if (!_keepLastFrame) { - // Inform the scene about the end of the video playback - if (_scene) - sendMessage(_scene, 0x3002, 0); - _videoDone = true; + if (_paused) { + if (_smackerFirst) + updateFrame(); } else { - rewind(); - updateFrame(); - _videoDone = false; + if (!_smackerDecoder->endOfVideo()) { + updateFrame(); + } else if (!_keepLastFrame) { + // Inform the scene about the end of the video playback + if (_scene) + sendMessage(_scene, 0x3002, 0); + _videoDone = true; + } else { + rewind(); + updateFrame(); + _videoDone = false; + } } } @@ -214,7 +214,7 @@ void SmackerPlayer::updateFrame() { // TODO _vm->_screen->_skipUpdate = true; _dirtyFlag = true; - + if (_smackerDecoder->hasDirtyPalette()) updatePalette(); diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index c480c2d8d8..63c9ebb774 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -49,12 +49,12 @@ public: class SmackerPlayer : public Entity { public: - SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag); + SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused = false); ~SmackerPlayer(); BaseSurface *getSurface() { return _smackerSurface; } void open(uint32 fileHash, bool keepLastFrame); void close(); - void gotoFrame(uint frameNumber); + void gotoFrame(int frameNumber); uint32 getFrameCount(); uint32 getFrameNumber(); uint getStatus(); @@ -74,6 +74,7 @@ protected: bool _keepLastFrame; bool _videoDone; bool _dirtyFlag; + bool _paused; int _drawX, _drawY; void update(); void updateFrame(); -- cgit v1.2.3 From a80ec8c89c4cb102a92cf5e0fa2b2871d763486a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 13 Oct 2012 16:18:02 +0000 Subject: NEVERHOOD: Implement Module2900, the teleporter - Also fix a related bug in Module2000 (teleporter appearing animation didn't play) --- engines/neverhood/gamemodule.cpp | 58 ++++- engines/neverhood/module.mk | 1 + engines/neverhood/module1100.cpp | 4 +- engines/neverhood/module2000.cpp | 4 +- engines/neverhood/module2100.h | 1 - engines/neverhood/module2900.cpp | 484 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/module2900.h | 102 +++++++++ 7 files changed, 648 insertions(+), 6 deletions(-) create mode 100644 engines/neverhood/module2900.cpp create mode 100644 engines/neverhood/module2900.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index a85d8a90e5..afd01f7c0a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -42,6 +42,7 @@ #include "neverhood/module2600.h" #include "neverhood/module2700.h" #include "neverhood/module2800.h" +#include "neverhood/module2900.h" #include "neverhood/module3000.h" namespace Neverhood { @@ -358,7 +359,7 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; _vm->gameState().sceneNum = 1; - createModule(2800, -1); + createModule(2900, 1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -499,6 +500,12 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(V_MODULE_NAME, 0x64210814); _childObject = new Module2800(_vm, this, which); break; + case 2900: + setGlobalVar(V_MODULE_NAME, 0x81100020); + if (which >= 0) + setGlobalVar(0x0152899A, which); + _childObject = new Module2900(_vm, this, which); + break; case 3000: setGlobalVar(V_MODULE_NAME, 0x81293110); _childObject = new Module3000(_vm, this, which); @@ -629,6 +636,55 @@ void GameModule::updateModule() { createModule(1800, 0); } break; + case 2900: + if (_moduleResult != 0xFFFFFFFF) { + switch (_moduleResult) { + case 0: + createModule(1300, 5); + break; + case 1: + createModule(2100, 1); + break; + case 2: + createModule(1100, 1); + break; + case 3: + setSubVar(0x2C145A98, 2, 1); + createModule(1700, 1); + break; + case 4: + createModule(2000, 0); + break; + case 5: + default: + createModule(2800, 1); + break; + } + } else { + switch (getGlobalVar(0x0152899A)) { + case 0: + createModule(1300, 6); + break; + case 1: + createModule(2100, 2); + break; + case 2: + createModule(1100, 2); + break; + case 3: + createModule(1700, 2); + break; + case 4: + createModule(2000, 1); + break; + case 5: + default: + createModule(2800, 2); + break; + } + } + setGlobalVar(0x0152899A, 0); + break; case 3000: if (_moduleResult == 1) { createModule(1900, 0); diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 2ee28d2440..5cd41c87fe 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -31,6 +31,7 @@ MODULE_OBJS = \ module2600.o \ module2700.o \ module2800.o \ + module2900.o \ module3000.o \ mouse.o \ navigationscene.o \ diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index a3e092ba46..333515538a 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -44,9 +44,9 @@ Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { createScene(_vm->gameState().sceneNum, -1); } else if (which == 1) { - createScene(9, 1); + createScene(8, 1); } else { - createScene(9, 3); + createScene(8, 3); } _vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index befcc3414a..75a6ebe899 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -32,9 +32,9 @@ Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { createScene(_vm->gameState().sceneNum, -1); } else if (which == 0) { - createScene(0, 3); - } else if (which == 1) { createScene(0, 1); + } else if (which == 1) { + createScene(0, 3); } } diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h index 4690913cb3..cf7a613cbf 100644 --- a/engines/neverhood/module2100.h +++ b/engines/neverhood/module2100.h @@ -71,7 +71,6 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; - class Scene2101 : public Scene { public: Scene2101(NeverhoodEngine *vm, Module *parentModule, int which); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp new file mode 100644 index 0000000000..2ebdb094a3 --- /dev/null +++ b/engines/neverhood/module2900.cpp @@ -0,0 +1,484 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/module2900.h" +#include "neverhood/gamemodule.h" +#include "neverhood/module1100.h" +#include "neverhood/module1300.h" +#include "neverhood/module1700.h" +#include "neverhood/module2000.h" +#include "neverhood/module2100.h" +#include "neverhood/module2800.h" + +namespace Neverhood { + +Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which >= 0) + setGlobalVar(0x60826830, which); + + createScene(0, 0); + +} + +void Module2900::createScene(int sceneNum, int which) { + debug("Module2900::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2901(_vm, this, getGlobalVar(0x60826830)); + break; + case 1: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2805(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2101(_vm, this, which); + break; + case 3: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1306(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1705(_vm, this, which); + break; + case 5: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1109(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2001(_vm, this, which); + break; + } + SetUpdateHandler(&Module2900::updateScene); + _childObject->handleUpdate(); +} + +void Module2900::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 0xFFFFFFFF) { + leaveModule(0xFFFFFFFF); + } else { + _field2C = _moduleResult; + switch (getGlobalVar(0x60826830)) { + case 0: + createScene(3, 4); + break; + case 1: + createScene(2, 2); + break; + case 2: + createScene(5, 2); + break; + case 3: + createScene(4, 2); + break; + case 4: + createScene(6, 2); + break; + case 5: + createScene(1, 2); + break; + default: + leaveModule(_moduleResult); + break; + } + } + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + leaveModule(_field2C); + break; + } + } +} + +static const uint32 kScene2901FileHashes1[] = { + 0x023023B4, + 0x36204507, + 0x046CF08E, + 0x9313A237, + 0xA651F246, + 0x02108034 +}; + +static const uint32 kScene2901FileHashes2[] = { + 0x023B002B, + 0x0450336A, + 0xCF08A04E, + 0x3A233939, + 0x1F242A6D, + 0x08030029 +}; + +static const uint32 kSsScene2901LocationButtonFileHashes[] = { + 0x2311326A, + 0x212323AC, + 0x10098138, + 0x25213167, + 0x1119A363, + 0x94452612, + 0x39464212, + 0x01860450, + 0x53002104, + 0x58E68412, + 0x18600300, + 0xB650A890, + 0x2452A7C4, + 0xA0232748, + 0x08862B02, + 0x2491E648, + 0x0010EB46, + 0x214C8A11, + 0x16A31921, + 0x0AC33A00, + 0x238028AA, + 0x26737A21, + 0x063039A8, + 0x51286C60, + 0x464006B4, + 0x42242538, + 0x20716010, + 0x4A2000AE, + 0x225124A6, + 0x28E82E45, + 0x58652C04, + 0xC82210A4, + 0x62A84060, + 0xC0693CB4, + 0x22212C64, + 0x5034EA71 +}; + +static const NPoint kSsScene2901LocationButtonPoints[] = { + {525, 120}, {576, 149}, {587, 205}, + {538, 232}, {484, 205}, {479, 153} +}; + +static const uint32 kSsScene2901LocationButtonLightFileHashes1[] = { + 0x03136246, + 0x2106216E, + 0x4025A13A, + 0x21816927, + 0x110B2202, + 0xCC0522B2, + 0x3CC24258, + 0x59C600F0, + 0x534A2480, + 0x50E61019, + 0x34400150, + 0x225BA090, + 0xB059AFC4, + 0xE093A741, + 0x0086BF09, + 0x3281E760, + 0xA048AB42, + 0x20649C01, + 0x14611904, + 0x26E33850, + 0x23A52A68, + 0xA2733024, + 0x10203880, + 0x1B2DE860, + 0x0644A6EC, + 0x426E20BC, + 0x80292014, + 0x4360B02E, + 0x22742664, + 0x98682705, + 0x0925B82C, + 0x5C2918A4, + 0xD2284920, + 0x41083CA6, + 0x6824A864, + 0x50266B10 +}; + +static const uint32 kSsScene2901LocationButtonLightFileHashes2[] = { + 0x43C46D4C, + 0x43C4AD4C, + 0x43C52D4C, + 0x43C62D4C, + 0x43C02D4C, + 0x43CC2D4C +}; + +static const uint32 kSsScene2901BrokenButtonFileHashes[] = { + 0x3081BD3A, + 0xD3443003, + 0x0786A320, + 0xE3A22029, + 0x61611814, + 0x425848E2 +}; + +static const uint32 kSsScene2901BigButtonFileHashes[] = { + 0x010D7748, + 0x9D02019A, + 0x351A2F43, + 0x448138E5, + 0x02788CF0, + 0x71718024 +}; + +SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index) + : StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) { + + _spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]); + createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _rect.x1 = kSsScene2901LocationButtonPoints[_index].x - 25; + _rect.y1 = kSsScene2901LocationButtonPoints[_index].y - 25; + _rect.x2 = kSsScene2901LocationButtonPoints[_index].x + 25; + _rect.y2 = kSsScene2901LocationButtonPoints[_index].y + 25; + setVisible(false); + _needRefresh = true; + loadSound(0, 0x440430C0); + SetUpdateHandler(&SsScene2901LocationButton::update); + SetMessageHandler(&SsScene2901LocationButton::handleMessage); +} + +void SsScene2901LocationButton::update() { + StaticSprite::update(); + if (_countdown1 != 0 && (--_countdown1) == 0) { + setVisible(false); + } +} + +uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown1 == 0) { + playSound(0); + setVisible(true); + _countdown1 = 4; + sendMessage(_parentScene, 0x2001, _index); + } + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index) + : StaticSprite(vm, 900), _index(index) { + + _spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]); + createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + setVisible(false); + _needRefresh = true; + loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]); +} + +void SsScene2901LocationButtonLight::show() { + playSound(0); + setVisible(true); + StaticSprite::update(); +} + +void SsScene2901LocationButtonLight::hide() { + setVisible(false); + StaticSprite::update(); +} + +SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which) + : StaticSprite(vm, 900) { + + _spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]); + createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _needRefresh = true; + StaticSprite::update(); +} + +SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which) + : StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) { + + _spriteResource.load2(kSsScene2901BigButtonFileHashes[which]); + createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + _rect.x1 = 62; + _rect.y1 = 94; + _rect.x2 = 322; + _rect.y2 = 350; + setVisible(false); + _needRefresh = true; + loadSound(0, 0xF3D420C8); + SetUpdateHandler(&SsScene2901BigButton::update); + SetMessageHandler(&SsScene2901BigButton::handleMessage); +} + +void SsScene2901BigButton::update() { + StaticSprite::update(); + if (_countdown1 != 0 && (--_countdown1) == 0) { + setVisible(false); + sendMessage(_parentScene, 0x2000, 0); + } +} + +uint32 SsScene2901BigButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown1 == 0) { + playSound(0); + setVisible(true); + _countdown1 = 4; + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule, true), _currLocationButtonNum(which), _selectedButtonNum(which), + _currWhirlButtonNum(0), _prevWhirlButtonNum(0), _countdown1(1), _skipCountdown(0), _blinkOn(0) { + + _isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0; + + //DEBUG>>> Enable all locations + for (int i = 0; i < 6; i++) + setSubVar(0x2C145A98, i, 1); + //DEBUG<<< + + setSubVar(0x2C145A98, which, 1); + setSubVar(0x2C145A98, 5, 1); + setSubVar(0x2C145A98, 4, 1); + + if (_currLocationButtonNum == 3) + setSubVar(0x2C145A98, 2, 1); + + _surfaceFlag = true; + setBackground(kScene2901FileHashes1[_currLocationButtonNum]); + setPalette(kScene2901FileHashes1[_currLocationButtonNum]); + + for (uint i = 0; i < 6; ++i) { + if (i != 2 || !_isButton2Broken) { + _ssLocationButtons[i] = insertSprite(this, _currLocationButtonNum, i); + _vm->_collisionMan->addSprite(_ssLocationButtons[i]); + _ssLocationButtonLights[i] = insertSprite(_currLocationButtonNum, i); + } + } + + if (_isButton2Broken) + insertSprite(_currLocationButtonNum); + + _ssBigButton = insertSprite(this, _currLocationButtonNum); + _vm->_collisionMan->addSprite(_ssBigButton); + + insertMouse435(kScene2901FileHashes2[_currLocationButtonNum], 20, 620); + + SetUpdateHandler(&Scene2901::update); + SetMessageHandler(&Scene2901::handleMessage); + +} + +void Scene2901::update() { + Scene::update(); + if (_countdown1 != 0 && (--_countdown1) == 0) { + if (_currLocationButtonNum == _selectedButtonNum) { + _ssLocationButtonLights[_currWhirlButtonNum]->hide(); + ++_currWhirlButtonNum; + while (!getSubVar(0x2C145A98, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) { + ++_currWhirlButtonNum; + if (_currWhirlButtonNum >= 6) + _currWhirlButtonNum = 0; + } + if (_currWhirlButtonNum != _prevWhirlButtonNum || _skipCountdown == 0) { + _ssLocationButtonLights[_currWhirlButtonNum]->show(); + _skipCountdown = 4; + } + _countdown1 = 2; + --_skipCountdown; + _prevWhirlButtonNum = _currWhirlButtonNum; + } else if (_blinkOn) { + _blinkOn = false; + _ssLocationButtonLights[_selectedButtonNum]->hide(); + _countdown1 = 16; + } else { + _blinkOn = true; + _ssLocationButtonLights[_selectedButtonNum]->show(); + _countdown1 = 4; + } + } +} + +uint32 Scene2901::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0xFFFFFFFF); + } + break; + case 0x2000: + if (_currLocationButtonNum != _selectedButtonNum) { + leaveScene(_selectedButtonNum); + } + break; + case 0x2001: + if (_currLocationButtonNum == _selectedButtonNum) + _selectedButtonNum = _currWhirlButtonNum; + _ssLocationButtonLights[_selectedButtonNum]->hide(); + _selectedButtonNum = param.asInteger(); + if (!getSubVar(0x2C145A98, _selectedButtonNum)) + _selectedButtonNum = _currLocationButtonNum; + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/module2900.h b/engines/neverhood/module2900.h new file mode 100644 index 0000000000..7d4e1e4d9f --- /dev/null +++ b/engines/neverhood/module2900.h @@ -0,0 +1,102 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULE2900_H +#define NEVERHOOD_MODULE2900_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2900 + +class Module2900 : public Module { +public: + Module2900(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _sceneNum; + int _field2C; + void createScene(int sceneNum, int which); + void updateScene(); + void updateMusic(bool halfVolume); +}; + +class SsScene2901LocationButton : public StaticSprite { +public: + SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index); +protected: + Scene *_parentScene; + uint _index; + int _countdown1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2901LocationButtonLight : public StaticSprite { +public: + SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index); + void show(); + void hide(); +protected: + uint _index; +}; + +class SsScene2901BrokenButton : public StaticSprite { +public: + SsScene2901BrokenButton(NeverhoodEngine *vm, int which); +}; + +class SsScene2901BigButton : public StaticSprite { +public: + SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which); +protected: + Scene *_parentScene; + int _which; + int _countdown1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2901 : public Scene { +public: + Scene2901(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssLocationButtons[6]; + SsScene2901LocationButtonLight *_ssLocationButtonLights[6]; + Sprite *_ssBigButton; + int _currWhirlButtonNum; + int _prevWhirlButtonNum; + int _countdown1; + int _currLocationButtonNum; + int _selectedButtonNum; + int _skipCountdown; + int _blinkOn; + bool _isButton2Broken; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULE2900_H */ -- cgit v1.2.3 From fa53c0cf8350a873a3278c5debaee1562f51e15b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 14 Oct 2012 09:37:44 +0000 Subject: NEVERHOOD: Work on the resource system: - Remove unused stuff - Shuffle some stuff around --- engines/neverhood/blbarchive.cpp | 54 +++++++++++++------- engines/neverhood/blbarchive.h | 5 +- engines/neverhood/navigationscene.cpp | 4 ++ engines/neverhood/neverhood.cpp | 10 ++-- engines/neverhood/resourceman.cpp | 93 ++++++++++++----------------------- engines/neverhood/resourceman.h | 45 +++++++++++------ 6 files changed, 111 insertions(+), 100 deletions(-) diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index cb422a10e6..5551ff07f1 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -56,7 +56,8 @@ BlbArchive::~BlbArchive() { } void BlbArchive::open(const Common::String &filename) { - BlbHeader header; + BlbHeader header; + uint16 *extDataOffsets; _entries.clear(); @@ -72,7 +73,7 @@ void BlbArchive::open(const Common::String &filename) { if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size()) error("BlbArchive::open() %s seems to be corrupt", filename.c_str()); - debug(2, "fileCount = %d", header.fileCount); + debug(2, "%s: fileCount = %d", filename.c_str(), header.fileCount); _entries.reserve(header.fileCount); @@ -83,63 +84,80 @@ void BlbArchive::open(const Common::String &filename) { _entries.push_back(entry); } + extDataOffsets = new uint16[header.fileCount]; + // Load file records for (uint i = 0; i < header.fileCount; i++) { BlbArchiveEntry &entry = _entries[i]; entry.type = _fd.readByte(); entry.comprType = _fd.readByte(); - entry.extDataOfs = _fd.readUint16LE(); + //entry.extDataOfs = _fd.readUint16LE(); + entry.extData = NULL; + extDataOffsets[i] = _fd.readUint16LE(); entry.timeStamp = _fd.readUint32LE(); entry.offset = _fd.readUint32LE(); entry.diskSize = _fd.readUint32LE(); entry.size = _fd.readUint32LE(); debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X", - entry.fileHash, entry.type, entry.comprType, entry.extDataOfs, entry.timeStamp, + entry.fileHash, entry.type, entry.comprType, extDataOffsets[i], entry.timeStamp, entry.offset, entry.diskSize, entry.size); } - + // Load ext data if (header.extDataSize > 0) { _extData = new byte[header.extDataSize]; _fd.read(_extData, header.extDataSize); + for (uint i = 0; i < header.fileCount; i++) + _entries[i].extData = extDataOffsets[i] > 0 ? _extData + extDataOffsets[i] - 1 : NULL; } + delete[] extDataOffsets; + } void BlbArchive::load(uint index, byte *buffer, uint32 size) { + load(&_entries[index], buffer, size); +} + +void BlbArchive::load(BlbArchiveEntry *entry, byte *buffer, uint32 size) { Common::StackLock lock(_mutex); - BlbArchiveEntry &entry = _entries[index]; + _fd.seek(entry->offset); - _fd.seek(entry.offset); - - switch (entry.comprType) { + switch (entry->comprType) { case 1: // Uncompressed if (size == 0) - size = entry.diskSize; + size = entry->diskSize; _fd.read(buffer, size); break; case 3: // DCL-compressed - if (!Common::decompressDCL(&_fd, buffer, entry.diskSize, entry.size)) { - debug("decompressDCL(diskSize: %d; size: %d)", entry.diskSize, entry.size); - debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry.fileHash, entry.type, entry.offset, entry.offset + entry.diskSize); + if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size)) { + debug("decompressDCL(diskSize: %d; size: %d)", entry->diskSize, entry->size); + debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry->fileHash, entry->type, entry->offset, entry->offset + entry->diskSize); debug("-> fd.pos() = %08X", _fd.pos()); } break; default: - error("BlbArchive::load() Unknown compression type %d", entry.comprType); + error("BlbArchive::load() Unknown compression type %d", entry->comprType); } } byte *BlbArchive::getEntryExtData(uint index) { - BlbArchiveEntry &entry = _entries[index]; - return (_extData && entry.extDataOfs != 0) ? &_extData[entry.extDataOfs - 1] : NULL; + return getEntryExtData(&_entries[index]); +} + +byte *BlbArchive::getEntryExtData(BlbArchiveEntry *entry) { + //return (_extData && entry->extDataOfs != 0) ? &_extData[entry->extDataOfs - 1] : NULL; + return entry->extData; } Common::SeekableReadStream *BlbArchive::createStream(uint index) { - const BlbArchiveEntry &entry = _entries[index]; - return new SafeMutexedSeekableSubReadStream(&_fd, entry.offset, entry.offset + entry.diskSize, + return createStream(&_entries[index]); +} + +Common::SeekableReadStream *BlbArchive::createStream(BlbArchiveEntry *entry) { + return new SafeMutexedSeekableSubReadStream(&_fd, entry->offset, entry->offset + entry->diskSize, DisposeAfterUse::NO,_mutex); } diff --git a/engines/neverhood/blbarchive.h b/engines/neverhood/blbarchive.h index cd2fd117b7..620b12b8ac 100644 --- a/engines/neverhood/blbarchive.h +++ b/engines/neverhood/blbarchive.h @@ -44,7 +44,7 @@ struct BlbArchiveEntry { uint32 fileHash; byte type; byte comprType; - uint16 extDataOfs; + byte *extData; uint32 timeStamp; uint32 offset; uint32 diskSize; @@ -57,11 +57,14 @@ public: ~BlbArchive(); void open(const Common::String &filename); void load(uint index, byte *buffer, uint32 size); + void load(BlbArchiveEntry *entry, byte *buffer, uint32 size); byte *getEntryExtData(uint index); + byte *getEntryExtData(BlbArchiveEntry *entry); uint32 getSize(uint index) { return _entries[index].size; } BlbArchiveEntry *getEntry(uint index) { return &_entries[index]; } uint getCount() { return _entries.size(); } Common::SeekableReadStream *createStream(uint index); + Common::SeekableReadStream *createStream(BlbArchiveEntry *entry); private: Common::File _fd; Common::Mutex _mutex; diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 5dc80c9322..bf3de5d812 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -80,6 +80,10 @@ void NavigationScene::update() { _vm->_screen->clear(); _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); _smackerDone = false; + /* + if (!_interactive) + _smackerDone = true; + */ _smackerFileHash = 0; } else if (_smackerDone) { if (_leaveSceneAfter) { diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index cfeaf927d3..72fa3601ed 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -238,11 +238,11 @@ void NeverhoodEngine::dumpAllResources() { for (uint i = 0; i < entriesCount; i++) { const ResourceFileEntry &entry = _res->getEntry(i); - int type = _res->getResourceTypeByHash(entry.fileHash); - debug("hash: %08X; type: %d", entry.fileHash, type); + int type = _res->getResourceTypeByHash(entry.archiveEntry->fileHash); + debug("hash: %08X; type: %d", entry.archiveEntry->fileHash, type); if (type == 4) { AnimResource anim(this); - anim.load(entry.fileHash); + anim.load(entry.archiveEntry->fileHash); for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) { const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex); int16 width = (frameInfo.rect.width + 3) & 0xFFFC; @@ -251,8 +251,8 @@ void NeverhoodEngine::dumpAllResources() { anim.draw(frameIndex, pixels, width, false, false); Common::String filename = frameInfo.frameHash != 0 - ? Common::String::format("%08X_%03d_%08X.tga", entry.fileHash, frameIndex, frameInfo.frameHash) - : Common::String::format("%08X_%03d.tga", entry.fileHash, frameIndex); + ? Common::String::format("%08X_%03d_%08X.tga", entry.archiveEntry->fileHash, frameIndex, frameInfo.frameHash) + : Common::String::format("%08X_%03d.tga", entry.archiveEntry->fileHash, frameIndex); writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height); delete[] pixels; } diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 28cef366e1..eb6aa01533 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -32,49 +32,40 @@ ResourceMan::~ResourceMan() { void ResourceMan::addArchive(const Common::String &filename) { BlbArchive *archive = new BlbArchive(); - uint archiveIndex = _archives.size(); archive->open(filename); _archives.push_back(archive); debug(3, "ResourceMan::addArchive(%s) %d files", filename.c_str(), archive->getCount()); - _entries.reserve(_entries.size() + archive->getCount()); for (uint archiveEntryIndex = 0; archiveEntryIndex < archive->getCount(); archiveEntryIndex++) { BlbArchiveEntry *archiveEntry = archive->getEntry(archiveEntryIndex); ResourceFileEntry *entry = findEntrySimple(archiveEntry->fileHash); if (entry) { - if (archiveEntry->timeStamp > _archives[entry->archiveIndex]->getEntry(entry->entryIndex)->timeStamp) { - entry->archiveIndex = archiveIndex; - entry->entryIndex = archiveEntryIndex; + if (archiveEntry->timeStamp > entry->archiveEntry->timeStamp) { + entry->archive = archive; + entry->archiveEntry = archiveEntry; } } else { ResourceFileEntry newEntry; - newEntry.fileHash = archiveEntry->fileHash; newEntry.resourceHandle = -1; - newEntry.archiveIndex = archiveIndex; - newEntry.entryIndex = archiveEntryIndex; - _entries.push_back(newEntry); + newEntry.archive = archive; + newEntry.archiveEntry = archiveEntry; + _entries[archiveEntry->fileHash] = newEntry; } } + debug("_entries.size() = %d", _entries.size()); } ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) { - for (uint i = 0; i < _entries.size(); i++) { - if (_entries[i].fileHash == fileHash) - return &_entries[i]; - } - return NULL; + EntriesMap::iterator p = _entries.find(fileHash); + return p != _entries.end() ? &(*p)._value : NULL; } ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) { ResourceFileEntry *entry = findEntrySimple(fileHash); - for (; entry && getArchiveEntry(entry)->comprType == 0x65; fileHash = getArchiveEntry(entry)->diskSize) + for (; entry && entry->archiveEntry->comprType == 0x65; fileHash = entry->archiveEntry->diskSize) entry = findEntrySimple(fileHash); return entry; } -BlbArchiveEntry *ResourceMan::getArchiveEntry(ResourceFileEntry *entry) const { - return _archives[entry->archiveIndex]->getEntry(entry->entryIndex); -} - int ResourceMan::useResource(uint32 fileHash) { ResourceFileEntry *entry = findEntry(fileHash); if (!entry) @@ -83,11 +74,7 @@ int ResourceMan::useResource(uint32 fileHash) { _resources[entry->resourceHandle]->useRefCount++; } else { Resource *resource = new Resource(); - resource->fileHash = entry->fileHash; - resource->archiveIndex = entry->archiveIndex; - resource->entryIndex = entry->entryIndex; - resource->data = NULL; - resource->dataRefCount = 0; + resource->entry = entry; resource->useRefCount = 1; entry->resourceHandle = (int)_resources.size(); _resources.push_back(resource); @@ -103,86 +90,68 @@ void ResourceMan::unuseResource(int resourceHandle) { resource->useRefCount--; } -void ResourceMan::unuseResourceByHash(uint32 fileHash) { - ResourceFileEntry *entry = findEntry(fileHash); - if (entry->resourceHandle != -1) - unuseResource(entry->resourceHandle); -} - -int ResourceMan::getResourceHandleByHash(uint32 fileHash) { - ResourceFileEntry *entry = findEntry(fileHash); - return entry->resourceHandle; -} - -bool ResourceMan::isResourceDataValid(int resourceHandle) const { - if (resourceHandle < 0) - return false; - return _resources[resourceHandle]->data != NULL; -} - uint32 ResourceMan::getResourceSize(int resourceHandle) const { if (resourceHandle < 0) return 0; Resource *resource = _resources[resourceHandle]; - return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->size; + return resource->entry->archiveEntry->size; } byte ResourceMan::getResourceType(int resourceHandle) { if (resourceHandle < 0) return 0; Resource *resource = _resources[resourceHandle]; - return _archives[resource->archiveIndex]->getEntry(resource->entryIndex)->type; + return resource->entry->archiveEntry->type; } byte ResourceMan::getResourceTypeByHash(uint32 fileHash) { ResourceFileEntry *entry = findEntry(fileHash); - return getArchiveEntry(entry)->type; + return entry->archiveEntry->type; } byte *ResourceMan::getResourceExtData(int resourceHandle) { if (resourceHandle < 0) return NULL; Resource *resource = _resources[resourceHandle]; - return _archives[resource->archiveIndex]->getEntryExtData(resource->entryIndex); + return resource->entry->archive->getEntryExtData(resource->entry->archiveEntry); } byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) { ResourceFileEntry *entry = findEntrySimple(fileHash); - return entry ? _archives[entry->archiveIndex]->getEntryExtData(entry->entryIndex) : NULL; + return entry ? entry->archive->getEntryExtData(entry->archiveEntry) : NULL; } byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) { if (resourceHandle < 0) return NULL; Resource *resource = _resources[resourceHandle]; - if (resource->data != NULL) { - resource->dataRefCount++; + ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash]; + if (!resourceData) { + resourceData = new ResourceData(); + _data[resource->entry->archiveEntry->fileHash] = resourceData; + } + if (resourceData->data != NULL) { + resourceData->dataRefCount++; } else { - BlbArchive *archive = _archives[resource->archiveIndex]; - BlbArchiveEntry *archiveEntry = archive->getEntry(resource->entryIndex); - resource->data = new byte[archiveEntry->size]; - archive->load(resource->entryIndex, resource->data, 0); - resource->dataRefCount = 1; + resourceData->data = new byte[resource->entry->archiveEntry->size]; + resource->entry->archive->load(resource->entry->archiveEntry, resourceData->data, 0); + resourceData->dataRefCount = 1; } - return resource->data; + return resourceData->data; } void ResourceMan::unloadResource(int resourceHandle) { if (resourceHandle < 0) return; Resource *resource = _resources[resourceHandle]; - if (resource->dataRefCount > 0) - resource->dataRefCount--; -} - -void ResourceMan::freeResource(Resource *resource) { - delete[] resource->data; - resource->data = NULL; + ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash]; + if (resourceData && resourceData->dataRefCount > 0) + resourceData->dataRefCount--; } Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) { ResourceFileEntry *entry = findEntry(fileHash); - return _archives[entry->archiveIndex]->createStream(entry->entryIndex); + return entry->archive->createStream(entry->archiveEntry); } } // End of namespace Neverhood diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index ed5bffaf9b..5ca8fa2b04 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -25,26 +25,43 @@ #include "common/array.h" #include "common/file.h" +#include "common/hashmap.h" #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" namespace Neverhood { struct ResourceFileEntry { - uint32 fileHash; int resourceHandle; - uint archiveIndex; - uint entryIndex; + BlbArchive *archive; + BlbArchiveEntry *archiveEntry; }; struct Resource { - uint32 fileHash; - uint archiveIndex; - uint entryIndex; + ResourceFileEntry *entry; + int useRefCount; +}; + +struct ResourceData { byte *data; int dataRefCount; - int useRefCount; + ResourceData() : data(NULL), dataRefCount() {} +}; + +#if 0 +class ResourceMan; + +struct ResourceHandle { +public: + ResourceHandle(); + ~ResourceHandle(); + const byte *data(); + uint32 size() const { return _archiveEntry ? _archiveEntry->size : 0 }; +protected: + ResourceMan *_res; + ResourceFileEntry *_resourceFileEntry; }; +#endif class ResourceMan { public: @@ -53,12 +70,8 @@ public: void addArchive(const Common::String &filename); ResourceFileEntry *findEntrySimple(uint32 fileHash); ResourceFileEntry *findEntry(uint32 fileHash); - BlbArchiveEntry *getArchiveEntry(ResourceFileEntry *entry) const; int useResource(uint32 fileHash); void unuseResource(int resourceHandle); - void unuseResourceByHash(uint32 fileHash); - int getResourceHandleByHash(uint32 fileHash); - bool isResourceDataValid(int resourceHandle) const; uint32 getResourceSize(int resourceHandle) const; byte getResourceType(int resourceHandle); byte getResourceTypeByHash(uint32 fileHash); @@ -66,13 +79,17 @@ public: byte *getResourceExtDataByHash(uint32 fileHash); byte *loadResource(int resourceHandle, bool moveToFront = false); void unloadResource(int resourceHandle); - void freeResource(Resource *resource); Common::SeekableReadStream *createStream(uint32 fileHash); const ResourceFileEntry& getEntry(uint index) { return _entries[index]; } uint getEntryCount() { return _entries.size(); } -private: +#if 0 + ResourceHandle getResource(uint32 fileHash); +#endif +protected: + typedef Common::HashMap EntriesMap; Common::Array _archives; - Common::Array _entries; + EntriesMap _entries; + Common::HashMap _data; Common::Array _resources; }; -- cgit v1.2.3 From a724e603dace28b1fc4d1f9036849c119712c93a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 14 Oct 2012 10:28:44 +0000 Subject: NEVERHOOD: Use CursorMan - Only update entities according to the current frame rate but run the actual game loop at a faster rate so the mouse cursor movement doesn't get choppy --- engines/neverhood/mouse.cpp | 111 +++++++++++++++++++--------------------- engines/neverhood/neverhood.cpp | 13 +++-- engines/neverhood/resource.h | 2 +- engines/neverhood/scene.cpp | 6 +-- engines/neverhood/screen.cpp | 7 ++- engines/neverhood/screen.h | 2 +- 6 files changed, 71 insertions(+), 70 deletions(-) diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 03b1478c55..a1c4a9a5a8 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -21,11 +21,10 @@ */ #include "neverhood/mouse.h" +#include "graphics/cursorman.h" namespace Neverhood { -// TODO: Use CursorMan - Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect) : StaticSprite(vm, 2000), _mouseType(kMouseType433), _mouseCursorResource(vm), _frameNum(0) { @@ -95,64 +94,59 @@ void Mouse::update() { uint32 Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { debug(7, "Mouse::handleMessage(%04X)", messageNum); - uint32 messageResult = 0; - if (messageNum != 5) { - messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2064: - _x = param.asPoint().x; - _y = param.asPoint().y; - switch (_type) { - case 1: - if (_x >= 320) - messageResult = 1; - else - messageResult = 0; - break; - case 2: - default: - if (_x < 100) - messageResult = 0; - else if (_x > 540) - messageResult = 1; - else - messageResult = 2; - break; - case 3: - if (_x < 100) - messageResult = 0; - else if (_x > 540) - messageResult = 1; - else - messageResult = 4; - break; - case 4: - if (_x < 100) - messageResult = 0; - else if (_x > 540) - messageResult = 1; - else if (_y >= 150) - messageResult = 2; - else - messageResult = 3; - break; - case 5: - if (_y >= 240) - messageResult = 4; - else - messageResult = 3; - break; - } + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2064: + _x = param.asPoint().x; + _y = param.asPoint().y; + switch (_type) { + case 1: + if (_x >= 320) + messageResult = 1; + else + messageResult = 0; + break; + case 2: + default: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else + messageResult = 2; + break; + case 3: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else + messageResult = 4; + break; + case 4: + if (_x < 100) + messageResult = 0; + else if (_x > 540) + messageResult = 1; + else if (_y >= 150) + messageResult = 2; + else + messageResult = 3; break; - case 0x4002: - _x = param.asPoint().x; - _y = param.asPoint().y; - updateCursorNum(); - processDelta(); + case 5: + if (_y >= 240) + messageResult = 4; + else + messageResult = 3; break; } - } else { - // TODO: Debug stuff + break; + case 0x4002: + _x = param.asPoint().x; + _y = param.asPoint().y; + updateCursorNum(); + processDelta(); + break; } return messageResult; } @@ -178,6 +172,9 @@ void Mouse::updateCursor() { _needRefresh = false; _drawRect = _mouseCursorResource.getRect(); _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); + Graphics::Surface *cursorSurface = _surface->getSurface(); + CursorMan.replaceCursor((const byte*)cursorSurface->pixels, + cursorSurface->w, cursorSurface->h, -_drawRect.x, -_drawRect.y, 0); } } diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 72fa3601ed..5152def96a 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -106,6 +106,8 @@ Common::Error NeverhoodEngine::run() { _gameModule = new GameModule(this); _gameModule->startup(); + + uint32 nextFrameTime = 0; // Preliminary main loop, needs some more work but works for testing while (!shouldQuit()) { @@ -148,13 +150,16 @@ Common::Error NeverhoodEngine::run() { } } - //debug("millis %d", _system->getMillis()); - _gameModule->handleUpdate(); - _gameModule->draw(); + if (_system->getMillis() >= nextFrameTime) { + _gameModule->handleUpdate(); + _gameModule->draw(); + nextFrameTime = _screen->getNextFrameTime(); + }; + _soundMan->update(); _audioResourceMan->update(); - _screen->wait(); _screen->update(); + _system->delayMillis(10); debug(0, "---------------------------------------"); diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 16782968f8..b49ee883b7 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -114,7 +114,7 @@ public: NDrawRect& getRect(); void draw(int frameNum, byte *dest, int destPitch); int getCursorNum() const { return _cursorNum; } - void setCursorNum(int value) { _cursorNum = value; } + void setCursorNum(int cursorNum) { _cursorNum = cursorNum; } protected: int _cursorNum; SpriteResource _cursorSprite; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 318a0df10a..bec399af3d 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -209,17 +209,17 @@ void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) { if (mouseRect) rect = *mouseRect; _mouseCursor = new Mouse(_vm, 0x0820C408, rect); - addSprite(_mouseCursor); + addEntity(_mouseCursor); } void Scene::insertMouse435(uint32 fileHash, int16 x1, int16 x2) { _mouseCursor = new Mouse(_vm, fileHash, x1, x2); - addSprite(_mouseCursor); + addEntity(_mouseCursor); } void Scene::insertNavigationMouse(uint32 fileHash, int type) { _mouseCursor = new Mouse(_vm, fileHash, type); - addSprite(_mouseCursor); + addEntity(_mouseCursor); } void Scene::showMouse(bool visible) { diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 4689d3ba2d..f9e8d49743 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -41,20 +41,19 @@ Screen::~Screen() { } void Screen::update() { + _ticks = _vm->_system->getMillis(); updatePalette(); // TODO: Implement actual code _vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480); _vm->_system->updateScreen(); } -void Screen::wait() { +uint32 Screen::getNextFrameTime() { int32 frameDelay = _frameDelay; if (_smackerDecoder && _smackerDecoder->isVideoLoaded() && !_smackerDecoder->endOfVideo()) frameDelay = _smackerDecoder->getTimeToNextFrame(); int32 waitTicks = frameDelay - (_vm->_system->getMillis() - _ticks); - if (waitTicks > 0) - _vm->_system->delayMillis(waitTicks); - _ticks = _vm->_system->getMillis(); + return _vm->_system->getMillis() + waitTicks; } void Screen::setFps(int fps) { diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 56a256757c..e3a2bfbef7 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -35,7 +35,7 @@ public: Screen(NeverhoodEngine *vm); ~Screen(); void update(); - void wait(); + uint32 getNextFrameTime(); void setFps(int fps); int getFps(); void setPaletteData(byte *paletteData); -- cgit v1.2.3 From 676c7569f67c8205b701f1b71202e226899ef036 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 14 Oct 2012 18:45:39 +0000 Subject: NEVERHOOD: Fix a very stupid bug in Scene::insertMouse433 --- engines/neverhood/scene.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index bec399af3d..b75515f325 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -208,7 +208,7 @@ void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) { NRect rect(-1, -1, -1, -1); if (mouseRect) rect = *mouseRect; - _mouseCursor = new Mouse(_vm, 0x0820C408, rect); + _mouseCursor = new Mouse(_vm, fileHash, rect); addEntity(_mouseCursor); } -- cgit v1.2.3 From 9858705772f88af82a811979831aa46b107330cd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 15 Oct 2012 15:06:37 +0000 Subject: NEVERHOOD: Graphics related changes/fixes: - Add BitmapFlags enum - Merge unpackSpriteRle and unpackSpriteRleRepl - Implement Y flipping in unpackSpriteRle - Fix Y flipping in AsScene2804CrystalWaves --- engines/neverhood/gamemodule.cpp | 4 +-- engines/neverhood/graphics.cpp | 76 +++++++++++++--------------------------- engines/neverhood/graphics.h | 3 +- engines/neverhood/module2800.cpp | 5 +-- engines/neverhood/resource.cpp | 7 ++-- 5 files changed, 34 insertions(+), 61 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index afd01f7c0a..ca22c01eca 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -358,8 +358,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 1; - createModule(2900, 1); + _vm->gameState().sceneNum = 2; + createModule(2800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 84aa3d67da..c5b136f039 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -207,6 +207,14 @@ int16 TextSurface::getStringWidth(const byte *string, int stringLen) { // Misc +enum BitmapFlags { + BF_RLE = 1, + BF_HAS_DIMENSIONS = 2, + BF_HAS_POSITION = 4, + BF_HAS_PALETTE = 8, + BF_HAS_IMAGE = 16 +}; + void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { uint16 flags; @@ -215,9 +223,9 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin sprite += 2; if (rle) - *rle = flags & 1; + *rle = flags & BF_RLE; - if (flags & 2) { + if (flags & BF_HAS_DIMENSIONS) { if (dimensions) { dimensions->width = READ_LE_UINT16(sprite); dimensions->height = READ_LE_UINT16(sprite + 2); @@ -228,7 +236,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin dimensions->height = 1; } - if (flags & 4) { + if (flags & BF_HAS_POSITION) { if (position) { position->x = READ_LE_UINT16(sprite); position->y = READ_LE_UINT16(sprite + 2); @@ -239,14 +247,14 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin position->y = 0; } - if (flags & 8) { + if (flags & BF_HAS_PALETTE) { if (palette) *palette = sprite; sprite += 1024; } else if (palette) *palette = NULL; - if (flags & 0x10) { + if (flags & BF_HAS_IMAGE) { if (pixels) *pixels = sprite; } else if (pixels) @@ -254,17 +262,22 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin } -void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { +void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor, byte newColor) { - // TODO: Flip Y + const bool replaceColors = oldColor != newColor; int16 rows, chunks; int16 skip, copy; + if (flipY) { + dest += destPitch * (height - 1); + destPitch = -destPitch; + } + rows = READ_LE_UINT16(source); chunks = READ_LE_UINT16(source + 2); source += 4; - + do { if (chunks == 0) { dest += rows * destPitch; @@ -286,49 +299,10 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi source += copy; } dest += destPitch; - } - } - rows = READ_LE_UINT16(source); - chunks = READ_LE_UINT16(source + 2); - source += 4; - } while (rows > 0); - -} - -void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY) { - - // TODO: Flip Y - - int16 rows, chunks; - int16 skip, copy; - - rows = READ_LE_UINT16(source); - chunks = READ_LE_UINT16(source + 2); - source += 4; - - do { - if (chunks == 0) { - dest += rows * destPitch; - } else { - while (rows-- > 0) { - uint16 rowChunks = chunks; - while (rowChunks-- > 0) { - skip = READ_LE_UINT16(source); - copy = READ_LE_UINT16(source + 2); - source += 4; - if (!flipX) { - for (int xc = 0; xc < copy; xc++) { - dest[skip + xc] = source[xc] == oldColor ? newColor : source[xc]; - } - } else { - byte *flipDest = dest + width - skip - 1; - for (int xc = 0; xc < copy; xc++) { - *flipDest-- = source[xc] == oldColor ? newColor : source[xc]; - } - } - source += copy; - } - dest += destPitch; + if (replaceColors) + for (int xc = 0; xc < width; xc++) + if (dest[xc] == oldColor) + dest[xc] = newColor; } } rows = READ_LE_UINT16(source); diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 57c22509f8..08357ea8ca 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -160,8 +160,7 @@ protected: // Misc void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels); -void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); -void unpackSpriteRleRepl(byte *source, int width, int height, byte *dest, int destPitch, byte oldColor, byte newColor, bool flipX, bool flipY); +void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor = 0, byte newColor = 0); void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 1a51571fa3..28a0eb814a 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -416,6 +416,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene::update); if (getGlobalVar(V_RING5_PULLED) == 0) { + // Display the disabled radio; only possible when the left door is open insertStaticSprite(0x0001264C, 100); } @@ -627,7 +628,7 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entit } } break; - case 0x0002: // TODO Implement button up event + case 0x0002: if (_countdown1 == 0) _countdownType = 0; else { @@ -1545,7 +1546,7 @@ AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint cryst _y = kAsScene2804CrystalWavesPoints[crystalIndex].y; createSurface1(0x840C41F0, 1200); if (crystalIndex & 1) - setDoDeltaX(1); + setDoDeltaY(1); setVisible(false); _needRefresh = true; SetUpdateHandler(&AnimatedSprite::update); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index e009ff286e..aff3528b45 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -42,11 +42,10 @@ SpriteResource::~SpriteResource() { void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) { if (_pixels) { - if (_rle) { + if (_rle) unpackSpriteRle(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY); - } else { + else unpackSpriteNormal(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY); - } } } @@ -164,7 +163,7 @@ void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, _width = frameInfo.rect.width; _height = frameInfo.rect.height; if (_replEnabled && _replOldColor != _replNewColor) - unpackSpriteRleRepl(_currSpriteData, _width, _height, dest, destPitch, _replOldColor, _replNewColor, flipX, flipY); + unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY, _replOldColor, _replNewColor); else unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY); } -- cgit v1.2.3 From 6df8fccf6b90399490543b142bb88976565aae2f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 15 Oct 2012 15:50:43 +0000 Subject: NEVERHOOD: Implement GameModule::createModuleByHash This is used later when restoring savegames - Rename V_RING5_PULLED to V_RADIO_ENABLED - Implement Palette::fillBaseBlack and use it in Scene2803Small - Fix Scene2802 (show disabled radio if it's not enabled) --- engines/neverhood/gamemodule.cpp | 70 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/gamemodule.h | 1 + engines/neverhood/gamevars.h | 2 +- engines/neverhood/module1000.cpp | 14 ++++---- engines/neverhood/module2800.cpp | 29 +++++++---------- engines/neverhood/palette.cpp | 11 +++++++ engines/neverhood/palette.h | 1 + 7 files changed, 102 insertions(+), 26 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index ca22c01eca..da432c5dbb 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -517,6 +517,76 @@ void GameModule::createModule(int moduleNum, int which) { _childObject->handleUpdate(); } +void GameModule::createModuleByHash(uint32 nameHash) { + switch (nameHash) { + case 0x03294419: + createModule(1000, -1); + break; + case 0x0002C818: + createModule(1100, -1); + break; + case 0x00478311: + createModule(1200, -1); + break; + case 0x0061C090: + createModule(1300, -1); + break; + case 0x00AD0012: + createModule(1400, -1); + break; + case 0x00F10114: + createModule(1500, -1); + break; + case 0x01A008D8: + createModule(1600, -1); + break; + case 0x04212331: + createModule(1700, -1); + break; + case 0x04A14718: + createModule(1800, -1); + break; + case 0x04E1C09C: + createModule(1900, -1); + break; + case 0x08250000: + createModule(2000, -1); + break; + case 0x10A10C14: + createModule(2100, -1); + break; + case 0x11391412: + createModule(2200, -1); + break; + case 0x1A214010: + createModule(2300, -1); + break; + case 0x202D1010: + createModule(2400, -1); + break; + case 0x29220120: + createModule(2500, -1); + break; + case 0x40271018: + createModule(2600, -1); + break; + case 0x42212411: + createModule(2700, -1); + break; + case 0x64210814: + createModule(2800, -1); + break; + case 0x81100020: + createModule(2900, -1); + break; + case 0x81293110: + createModule(3000, -1); + break; + default: + error("GameModule::createModuleByHash() Unknown module name %08X", nameHash); + } +} + void GameModule::updateModule() { if (!updateChild()) { switch (_moduleNum) { diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 82e6fa57c8..94fafc8796 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -54,6 +54,7 @@ protected: int _moduleNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createModule(int moduleNum, int which); + void createModuleByHash(uint32 nameHash); void updateModule(); }; diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 52740dca56..19a8a8586a 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -87,7 +87,7 @@ enum { V_BALLOON_POPPED = 0xAC00C0D0, // Has the balloon with the key been popped? V_TNT_DUMMY_BUILT = 0x000CF819, // Are all TNT parts on the dummy? V_TNT_DUMMY_FUSE_LIT = 0x20A0C516, - V_RING5_PULLED = 0x4DE80AC0, + V_RADIO_ENABLED = 0x4DE80AC0, V_CREATURE_EXPLODED = 0x2A02C07B, // Match V_MATCH_STATUS = 0x0112090A, diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 6cae11a1f4..e718904cb3 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1475,21 +1475,21 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_parentModule, 0x1024, 2); _flag1BE = true; if (sender == _asRing1) { - setGlobalVar(V_RING5_PULLED, 0); + setGlobalVar(V_RADIO_ENABLED, 0); playSound(0, 0x665198C0); } else if (sender == _asRing2) { - setGlobalVar(V_RING5_PULLED, 0); + setGlobalVar(V_RADIO_ENABLED, 0); playSound(0, 0xE2D389C0); } else if (sender == _asRing3) { - setGlobalVar(V_RING5_PULLED, 0); + setGlobalVar(V_RADIO_ENABLED, 0); playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); } else if (sender == _asRing4) { - setGlobalVar(V_RING5_PULLED, 0); + setGlobalVar(V_RADIO_ENABLED, 0); playSound(0, 0xE0558848); } else if (sender == _asRing5) { - setGlobalVar(V_RING5_PULLED, 1); + setGlobalVar(V_RADIO_ENABLED, 1); playSound(0, 0x44014282); } break; @@ -1508,7 +1508,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendEntityMessage(_klayman, 0x1014, _asDoorSpy); break; case 0x480F: - setGlobalVar(V_RING5_PULLED, 0); + setGlobalVar(V_RADIO_ENABLED, 0); playSound(1); sendMessage(_asDoor, 0x4808, 0); sendMessage(_asOutsideDoorBackground, 0x4808, 0); @@ -1800,7 +1800,7 @@ uint32 Scene1005::getTextIndex1() { textIndex = 12; else if (!getGlobalVar(0x2050861A)) textIndex = 13; - else if (!getGlobalVar(V_RING5_PULLED)) + else if (!getGlobalVar(V_RADIO_ENABLED)) textIndex = 50; else if (!getGlobalVar(0x89C669AA)) textIndex = 14; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 28a0eb814a..a47d9cb355 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -34,7 +34,6 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule), _musicResource(NULL) { _currentMusicFileHash = 0; - // TODO music stuff _vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14); setGlobalVar(0x28D8C940, 1); @@ -68,19 +67,10 @@ void Module2800::createScene(int sceneNum, int which) { break; case 1: _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); - - // TODO!! - - _childObject = new Scene2802(_vm, this, which); - -#if 0 - _flag = true; // DEBUG! - if (_flag) { + if (getGlobalVar(V_RADIO_ENABLED)) _childObject = new Scene2802(_vm, this, which); - } else { + else createStaticScene(0x000C6444, 0xC6440008); - } -#endif break; case 2: _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); @@ -202,7 +192,12 @@ void Module2800::updateScene() { switch (_vm->gameState().sceneNum) { case 0: if (_moduleResult != 2) { - // TODO music stuff + if (_musicResource) { + _musicResource->unload(); + delete _musicResource; + _musicResource = NULL; + } + _currentMusicFileHash = 0; } if (_moduleResult == 1) { createScene(2, 0); @@ -407,15 +402,13 @@ void Module2800::updateMusic(bool halfVolume) { Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - // TODO Weird palette glitches in the mouse cursor and sprite, check this later - // TODO _vm->gameModule()->initScene2801Vars(); _surfaceFlag = true; SetMessageHandler(&Scene2801::handleMessage); SetUpdateHandler(&Scene::update); - if (getGlobalVar(V_RING5_PULLED) == 0) { + if (getGlobalVar(V_RADIO_ENABLED) == 0) { // Display the disabled radio; only possible when the left door is open insertStaticSprite(0x0001264C, 100); } @@ -1357,7 +1350,7 @@ void Scene2803Small::updatePaletteArea(bool instantly) { _palette->addBasePalette(0xB103B604, 0, 64, 0); break; case 3: - // TODO _palette->sub_47BFB0(0, 64); + _palette->fillBaseBlack(0, 64); break; default: _palette->addBasePalette(0x412A423E, 0, 64, 0); @@ -1369,7 +1362,7 @@ void Scene2803Small::updatePaletteArea(bool instantly) { _palette->addBasePalette(0x0263D144, 0, 64, 0); break; case 3: - // TODO _palette->sub_47BFB0(0, 64); + _palette->fillBaseBlack(0, 64); break; default: _palette->addBasePalette(0x29800A01, 0, 64, 0); diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index c27bd867bc..16ef31d569 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -150,6 +150,17 @@ void Palette::fillBaseWhite(int index, int count) { } } +void Palette::fillBaseBlack(int index, int count) { + if (index + count > 256) + count = 256 - index; + for (int i = 0; i < count; i++) { + _basePalette[(i + index) * 4 + 0] = 0; + _basePalette[(i + index) * 4 + 1] = 0; + _basePalette[(i + index) * 4 + 2] = 0; + _basePalette[(i + index) * 4 + 3] = 0; + } +} + void Palette::update() { debug(2, "Palette::update() _status = %d", _status); if (_status == 1) { diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 27f4816bb0..4b0747bd73 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -50,6 +50,7 @@ public: void startFadeToWhite(int counter); void startFadeToPalette(int counter); void fillBaseWhite(int index, int count); + void fillBaseBlack(int index, int count); protected: int _status; byte *_palette; -- cgit v1.2.3 From 682d15fce443223b306366ef9b1ad71f94b6cfed Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 15 Oct 2012 21:32:54 +0000 Subject: NEVERHOOD: Cleanup and fixes - Implement GameModule::initScene2801Vars() - Fix Scene1201::~Scene1201() which does some game logic stuff - Rename some stuff - Add more game variable constants --- engines/neverhood/gamemodule.cpp | 64 ++++++++++--------- engines/neverhood/gamemodule.h | 1 + engines/neverhood/gamevars.h | 18 +++++- engines/neverhood/module1000.cpp | 6 +- engines/neverhood/module1200.cpp | 23 ++++--- engines/neverhood/module1200.h | 2 +- engines/neverhood/module1400.cpp | 6 +- engines/neverhood/module1600.cpp | 2 +- engines/neverhood/module1900.cpp | 2 +- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2700.cpp | 4 +- engines/neverhood/module2800.cpp | 132 ++++++++++++++++++++------------------- engines/neverhood/module2800.h | 8 +-- engines/neverhood/module2900.cpp | 24 +++---- engines/neverhood/module2900.h | 2 +- 15 files changed, 161 insertions(+), 135 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index da432c5dbb..1c8a2d9a6d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -276,29 +276,31 @@ void GameModule::initScene2401Vars() { } -void GameModule::initScene2808Vars1() { - - // Exit if it's already initialized - if (getSubVar(VA_IS_PUZZLE_INIT, 0x20479010)) - return; - - for (uint i = 0; i < 3; i++) - setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1); - - setSubVar(VA_IS_PUZZLE_INIT, 0x20479010, 1); +void GameModule::initScene2801Vars() { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x08C80800)) { + int currMusicIndex = _vm->_rnd->getRandomNumber(5 - 1) + 3; + setGlobalVar(V_GOOD_RADIO_MUSIC_INDEX, 5 * currMusicIndex); + setGlobalVar(V_GOOD_RADIO_MUSIC_NAME, kScene2801MusicFileHashes[currMusicIndex]); + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); + setSubVar(VA_IS_PUZZLE_INIT, 0x08C80800, 1); + } +} +void GameModule::initScene2808Vars1() { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x20479010)) { + for (uint i = 0; i < 3; i++) + setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x20479010, 1); + } } void GameModule::initScene2808Vars2() { - - // Exit if it's already initialized - if (getSubVar(VA_IS_PUZZLE_INIT, 0x66059818)) - return; - - for (uint i = 0; i < 3; i++) - setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1); - - setSubVar(VA_IS_PUZZLE_INIT, 0x66059818, 1); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x66059818)) { + for (uint i = 0; i < 3; i++) + setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x66059818, 1); + } } void GameModule::initScene3009Vars() { @@ -312,8 +314,8 @@ void GameModule::initScene3009Vars() { } uint32 GameModule::getScene2802MusicFileHash() { - uint musicNum = getGlobalVar(0x08CC0828); - return (musicNum % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP(musicNum / 5, 0, 17)]; + uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); + return (musicIndex % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP(musicIndex / 5, 0, 17)]; } @@ -347,19 +349,21 @@ void GameModule::startup() { // DEBUG>>> /* setGlobalVar(V_SEEN_MUSIC_BOX, 1); - setGlobalVar(0x0A18CA33, 0); - setGlobalVar(0x0112090A, 0); - //setGlobalVar(0x000CF819, 1); + setGlobalVar(V_CREATURE_EXPLODED, 0); + setGlobalVar(V_MATCH_STATUS, 0); setGlobalVar(V_PROJECTOR_LOCATION, 2); */ //setGlobalVar(V_ENTRANCE_OPEN, 0); //setGlobalVar(V_DOOR_SPIKES_OPEN, 1); + setGlobalVar(V_CREATURE_ANGRY, 1); + setGlobalVar(V_RADIO_ENABLED, 1); + setGlobalVar(V_TNT_DUMMY_BUILT, 1); // <<gameState().which = 0; - _vm->gameState().sceneNum = 2; - createModule(2800, -1); + _vm->gameState().sceneNum = 0; + createModule(1200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -503,7 +507,7 @@ void GameModule::createModule(int moduleNum, int which) { case 2900: setGlobalVar(V_MODULE_NAME, 0x81100020); if (which >= 0) - setGlobalVar(0x0152899A, which); + setGlobalVar(V_TELEPORTER_CURR_LOCATION, which); _childObject = new Module2900(_vm, this, which); break; case 3000: @@ -719,7 +723,7 @@ void GameModule::updateModule() { createModule(1100, 1); break; case 3: - setSubVar(0x2C145A98, 2, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1); createModule(1700, 1); break; case 4: @@ -731,7 +735,7 @@ void GameModule::updateModule() { break; } } else { - switch (getGlobalVar(0x0152899A)) { + switch (getGlobalVar(V_TELEPORTER_CURR_LOCATION)) { case 0: createModule(1300, 6); break; @@ -753,7 +757,7 @@ void GameModule::updateModule() { break; } } - setGlobalVar(0x0152899A, 0); + setGlobalVar(V_TELEPORTER_CURR_LOCATION, 0); break; case 3000: if (_moduleResult == 1) { diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 94fafc8796..275e8d3895 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -42,6 +42,7 @@ public: void initScene1307Vars(); void initScene1405Vars(); void initScene2401Vars(); + void initScene2801Vars(); void initScene2808Vars1(); void initScene2808Vars2(); void initScene3009Vars(); diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 19a8a8586a..3e32803acc 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -45,7 +45,6 @@ enum { V_COLUMN_TEXT_NAME = 0xC8C28808, V_CLICKED_COLUMN_INDEX = 0x48A68852, V_CLICKED_COLUMN_ROW = 0x49C40058, - V_MUSIC_NAME = 0x89A82A15, // Klayman V_KLAYMAN_SMALL = 0x1860C990, // Is Klayman small? V_KLAYMAN_FRAMEINDEX = 0x18288913, @@ -64,10 +63,12 @@ enum { V_NOTES_PUZZLE_SOLVED = 0x86615030, V_TILE_PUZZLE_SOLVED = 0x404290D5, V_STAIRS_PUZZLE_SOLVED = 0xA9035F60, + V_CODE_SYMBOLS_SOLVED = 0x2C531AF8, V_SPIKES_RETRACTED = 0x18890C91, V_LARGE_DOOR_NUMBER = 0x9A500914, // Number of the currently "large" door V_LIGHTS_ON = 0x4D080E54, V_SHRINK_LIGHTS_ON = 0x190A1D18, // Lights on in the room with the shrinking device + V_STAIRS_DOWN_ONCE = 0x2050861A, // Stairs have been down once before V_STAIRS_DOWN = 0x09221A62, V_LADDER_DOWN = 0x0018CA22, // Is the ladder in the statue room down? V_LADDER_DOWN_ACTION = 0x00188211, @@ -88,7 +89,16 @@ enum { V_TNT_DUMMY_BUILT = 0x000CF819, // Are all TNT parts on the dummy? V_TNT_DUMMY_FUSE_LIT = 0x20A0C516, V_RADIO_ENABLED = 0x4DE80AC0, - V_CREATURE_EXPLODED = 0x2A02C07B, + V_SEEN_CREATURE_EXPLODE_VID = 0x2A02C07B, + V_CREATURE_EXPLODED = 0x0A18CA33, + V_UNUSED = 0x89C669AA, // Seems to be unused, confirmed by checking the exe for this constant value (still left in atm) + // Radio + V_RADIO_ROOM_LEFT_DOOR = 0x09880D40, + V_RADIO_ROOM_RIGHT_DOOR = 0x08180ABC, + V_CURR_RADIO_MUSIC_INDEX = 0x08CC0828, + V_GOOD_RADIO_MUSIC_INDEX = 0x88880915, + V_GOOD_RADIO_MUSIC_NAME = 0x89A82A15, + V_RADIO_MOVE_DISH_VIDEO = 0x28D8C940, // Match V_MATCH_STATUS = 0x0112090A, // Venus fly trap @@ -111,6 +121,10 @@ enum { V_PROJECTOR_SLOT = 0x04A10F33, // Projector x slot index V_PROJECTOR_LOCATION = 0x04A105B3, // Projector scene location V_PROJECTOR_ACTIVE = 0x12A10DB3, // Is the projecor projecting? + // Teleporter + V_TELEPORTER_CURR_LOCATION = 0x0152899A, + V_TELEPORTER_WHICH = 0x60826830, + V_TELEPORTER_DEST_AVAILABLE = 0x2C145A98, // Inventory V_HAS_NEEDLE = 0x31C63C51, // Has Klayman the needle? V_HAS_FINAL_KEY = 0xC0780812, // Has Klayman the key from the diskplayer? diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index e718904cb3..461f8738d4 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1798,11 +1798,11 @@ uint32 Scene1005::getTextIndex1() { } else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { if (!getGlobalVar(V_WALL_BROKEN)) textIndex = 12; - else if (!getGlobalVar(0x2050861A)) + else if (!getGlobalVar(V_STAIRS_DOWN_ONCE)) textIndex = 13; else if (!getGlobalVar(V_RADIO_ENABLED)) textIndex = 50; - else if (!getGlobalVar(0x89C669AA)) + else if (!getGlobalVar(V_UNUSED)) textIndex = 14; else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM)) textIndex = 15; @@ -1812,7 +1812,7 @@ uint32 Scene1005::getTextIndex1() { textIndex = 17; } else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) { textIndex = 0; - } else if (getGlobalVar(0x0A18CA33)) { + } else if (getGlobalVar(V_CREATURE_EXPLODED)) { if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) textIndex = 4; else if (!getGlobalVar(V_HAS_TEST_TUBE)) diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 99d15b970f..d106a85aea 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -60,7 +60,7 @@ void Module1200::createScene(int sceneNum, int which) { case 2: _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); createSmackerScene(0x31890001, true, true, false); - setGlobalVar(V_CREATURE_EXPLODED, 1); + setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1); break; } SetUpdateHandler(&Module1200::updateScene); @@ -74,7 +74,7 @@ void Module1200::updateScene() { if (_moduleResult == 1) { createScene(1, 0); } else if (_moduleResult == 2) { - if (getGlobalVar(0x0A18CA33) && !getGlobalVar(V_CREATURE_EXPLODED)) { + if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) { createScene(2, -1); } else { leaveModule(1); @@ -714,7 +714,7 @@ void AsScene1201LeftDoor::stCloseDoor() { } Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag(false), _asMatch(NULL), _asTntMan(NULL), + : Scene(vm, parentModule, true), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL), _asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { int16 topY1, topY2, topY3, topY4; @@ -772,7 +772,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(400, 329); setMessageList(0x004AEC08); } else if (which == 2) { - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { insertKlayman(374, 333); setMessageList(0x004AEC08); } else { @@ -795,7 +795,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(x1, 0, x2, 480); _klayman->setRepl(64, 0); - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { setBackground(0x4019A2C4); setPalette(0x4019A2C4); _asRightDoor = NULL; @@ -807,7 +807,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_TNT_DUMMY_BUILT)) { insertStaticSprite(0x10002ED8, 500); - if (!getGlobalVar(0x0A18CA33)) { + if (!getGlobalVar(V_CREATURE_EXPLODED)) { _asTntMan = insertSprite(this, _asTntManRope, which == 1); _asTntMan->setClipRect(x1, 0, x2, 480); _asTntMan->setRepl(64, 0); @@ -838,7 +838,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tntIndex += 3; } - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { setRectList(0x004AEE58); } else { setRectList(0x004AEDC8); @@ -866,7 +866,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tntIndex++; } - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(0x0A18CA33)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { setRectList(0x004AEE18); } else { setRectList(0x004AED88); @@ -890,7 +890,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asMatch); } - if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(0x0A18CA33) == 0) { + if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { _asCreature = insertSprite(this, _klayman); _asCreature->setClipRect(x1, 0, x2, 480); } @@ -898,6 +898,9 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1201::~Scene1201() { + if (_creatureExploded) + setGlobalVar(V_CREATURE_EXPLODED, 1); + setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); } void Scene1201::update() { @@ -911,7 +914,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x07053000) { - _flag = true; + _creatureExploded = true; sendMessage(_asCreature, 0x2004, 0); } else if (param.asInteger() == 0x140E5744) { sendMessage(_asCreature, 0x2005, 0); diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index bc3281c233..7d4e224a38 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -172,7 +172,7 @@ protected: Sprite *_asRightDoor; Sprite *_asTape; Sprite *_asKlaymanHead; - bool _flag; + bool _creatureExploded; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index eb8f4fed87..b5489a39f9 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -917,15 +917,15 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (_asPuzzleBox) _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); - if (getGlobalVar(0x4A105B3) == 1) { + if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_asProjector); - if (getGlobalVar(0x4A10F33) == 4) { + if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); _klayman->processDelta(); setMessageList(0x004B0BD0); - } else if (getGlobalVar(0x4A10F33) == 0) { + } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); _klayman->processDelta(); diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 22ffaf64ff..b6df7061c2 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1448,7 +1448,7 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_symbolPosition >= 12) { if (testVars()) { playSound(0); - setGlobalVar(0x2C531AF8, 1); + setGlobalVar(V_CODE_SYMBOLS_SOLVED, 1); _isSolved = true; } else { _symbolPosition = 0; diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 7925c46b9a..d90074c2cf 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -105,7 +105,7 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x40A40168, 100); } else if (getGlobalVar(V_STAIRS_DOWN)) { insertStaticSprite(0x124404C4, 100); - setGlobalVar(0x2050861A, 1); + setGlobalVar(V_STAIRS_DOWN_ONCE, 1); } else { insertStaticSprite(0x02840064, 100); } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 75a6ebe899..bd5597dbf8 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -55,7 +55,7 @@ void Module2000::createScene(int sceneNum, int which) { break; case 2: setGlobalVar(V_WORLDS_JOINED, 1); - setSubVar(0x2C145A98, 1, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1); createSmackerScene(0x204B2031, true, true, false); break; } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 080f8151b2..19bf9be6cb 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -458,8 +458,8 @@ void Module2700::updateScene() { case 21: if (!_flag1) { _vm->_soundMan->stopMusic(0x04020210, 0, 1); - // TODO _vm->gameModule()->initScene2801Vars(); - _musicFileHash = getGlobalVar(V_MUSIC_NAME); + _vm->gameModule()->initScene2801Vars(); + _musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME); // TODO? GameState_sub_469C50(&field_52, 0); // TODO MusicMan_create(); // Why? _vm->_soundMan->addMusic(0x42212411, _musicFileHash); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index a47d9cb355..b6f56945a0 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -35,7 +35,7 @@ Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) _currentMusicFileHash = 0; _vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14); - setGlobalVar(0x28D8C940, 1); + setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 1); if (which < 0) { createScene(_vm->gameState().sceneNum, which); @@ -402,7 +402,7 @@ void Module2800::updateMusic(bool halfVolume) { Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - // TODO _vm->gameModule()->initScene2801Vars(); + _vm->gameModule()->initScene2801Vars(); _surfaceFlag = true; SetMessageHandler(&Scene2801::handleMessage); @@ -432,7 +432,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004B6BB0); } - if (getGlobalVar(0x09880D40)) { + if (getGlobalVar(V_RADIO_ROOM_LEFT_DOOR)) { setRectList(0x004B6CE0); setBackground(0x01400666); setPalette(0x01400666); @@ -444,7 +444,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x0066201C); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - } else if (getGlobalVar(0x08180ABC)) { + } else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) { setRectList(0x004B6CD0); setBackground(0x11E00684); setPalette(0x11E00684); @@ -507,10 +507,10 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit } Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdownType(0), _countdown1(0), _countdown2(0) { + : Scene(vm, parentModule, true), _currTuneStatus(0), _countdown1(0), _countdown2(0) { //DEBUG>>> Disable video - setGlobalVar(0x28D8C940, 0); + setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0); //DEBUG<<< _surfaceFlag = true; @@ -518,123 +518,127 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2802::update); insertMouse435(0x008810A8, 20, 620); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true)); - _smackerFrameNumber = getGlobalVar(0x08CC0828); - _smackerPlayer->gotoFrame(_smackerFrameNumber); + _currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); + _smackerPlayer->gotoFrame(_currRadioMusicIndex); _vm->_soundMan->addSound(0x04360A18, 0x422630C2); _vm->_soundMan->addSound(0x04360A18, 0x00632252); _vm->_soundMan->addSound(0x04360A18, 0x00372241); _vm->_soundMan->setSoundVolume(0x00372241, 60); - changeCountdownType(0, 0); + changeTuneStatus(0, 0); _vm->_soundMan->playSoundLooping(0x00372241); } Scene2802::~Scene2802() { _vm->_soundMan->deleteSoundGroup(0x04360A18); - if (_smackerFrameNumber == 0) { - setGlobalVar(0x09880D40, 1); - setGlobalVar(0x08180ABC, 0); - } else if (_smackerFrameNumber == getGlobalVar(0x88880915)) { - setGlobalVar(0x09880D40, 0); - setGlobalVar(0x08180ABC, 1); + if (_currRadioMusicIndex == 0) { + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); + } else if (_currRadioMusicIndex == getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)) { + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 1); } else { - setGlobalVar(0x09880D40, 0); - setGlobalVar(0x08180ABC, 0); + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); } - setGlobalVar(0x08CC0828, _smackerFrameNumber); + setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex); } void Scene2802::update() { - int prevCountdownType = _countdownType; - uint prevSmackerFrameNumber = _smackerFrameNumber; + int prevTuneStatus = _currTuneStatus; + uint prevRadioMusicIndex = _currRadioMusicIndex; Scene::update(); if (_countdown1 > 0) --_countdown1; - else if (_countdownType == 1) - _countdownType = 3; - else if (_countdownType == 4) - _countdownType = 6; + else if (_currTuneStatus == 1) + _currTuneStatus = 3; + else if (_currTuneStatus == 4) + _currTuneStatus = 6; - switch (_countdownType) { + switch (_currTuneStatus) { case 2: - if (_smackerFrameNumber < 90) - incSmackerFrameNumber(+1); - _countdownType = 0; + if (_currRadioMusicIndex < 90) + incRadioMusicIndex(+1); + _currTuneStatus = 0; break; case 3: if (_countdown2 > 0) --_countdown2; - else if (_smackerFrameNumber < 90) { - incSmackerFrameNumber(+1); + else if (_currRadioMusicIndex < 90) { + incRadioMusicIndex(+1); _countdown2 = 1; } else - _countdownType = 0; + _currTuneStatus = 0; break; case 5: - if (_smackerFrameNumber > 0) - incSmackerFrameNumber(-1); - _countdownType = 0; + if (_currRadioMusicIndex > 0) + incRadioMusicIndex(-1); + _currTuneStatus = 0; break; case 6: if (_countdown2 > 0) --_countdown2; - else if (_smackerFrameNumber > 0) { - incSmackerFrameNumber(-1); + else if (_currRadioMusicIndex > 0) { + incRadioMusicIndex(-1); _countdown2 = 1; } else - _countdownType = 0; + _currTuneStatus = 0; break; } - if (prevSmackerFrameNumber != _smackerFrameNumber) - _smackerPlayer->gotoFrame(_smackerFrameNumber); + if (prevRadioMusicIndex != _currRadioMusicIndex) + _smackerPlayer->gotoFrame(_currRadioMusicIndex); - if (prevCountdownType != _countdownType) - changeCountdownType(prevCountdownType, _countdownType); + if (prevTuneStatus != _currTuneStatus) + changeTuneStatus(prevTuneStatus, _currTuneStatus); + + //DEBUG>>> + debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)); + //DEBUG<<< - if (getGlobalVar(0x28D8C940) && prevCountdownType != _countdownType && _smackerFrameNumber != 0) { - setGlobalVar(0x28D8C940, 0); + if (getGlobalVar(V_RADIO_MOVE_DISH_VIDEO) && prevTuneStatus != _currTuneStatus && _currRadioMusicIndex != 0) { + setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0); leaveScene(1); } } uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - int prevCountdownType = _countdownType; + int prevTuneStatus = _currTuneStatus; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { leaveScene(0); - } else if (_countdownType == 0) { + } else if (_currTuneStatus == 0) { if (param.asPoint().x > 180 && param.asPoint().x < 300 && param.asPoint().y > 130 && param.asPoint().y < 310) { - _countdownType = 4; + _currTuneStatus = 4; } else if (param.asPoint().x > 300 && param.asPoint().x < 400 && param.asPoint().y > 130 && param.asPoint().y < 310) { - _countdownType = 1; + _currTuneStatus = 1; } - if (_countdownType == 1 || _countdownType == 4) { + if (_currTuneStatus == 1 || _currTuneStatus == 4) { _countdown1 = 8; - changeCountdownType(0, _countdownType); + changeTuneStatus(0, _currTuneStatus); } } break; case 0x0002: if (_countdown1 == 0) - _countdownType = 0; + _currTuneStatus = 0; else { - if (_countdownType == 1) - _countdownType = 2; - else if (_countdownType == 4) - _countdownType = 5; + if (_currTuneStatus == 1) + _currTuneStatus = 2; + else if (_currTuneStatus == 4) + _currTuneStatus = 5; else - _countdownType = 0; + _currTuneStatus = 0; _countdown1 = 0; } - if (prevCountdownType != _countdownType) - changeCountdownType(prevCountdownType, _countdownType); + if (prevTuneStatus != _currTuneStatus) + changeTuneStatus(prevTuneStatus, _currTuneStatus); break; case 0x000D: // DEBUG message @@ -643,25 +647,25 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -void Scene2802::incSmackerFrameNumber(int delta) { - _smackerFrameNumber += delta; - setGlobalVar(0x08CC0828, _smackerFrameNumber); +void Scene2802::incRadioMusicIndex(int delta) { + _currRadioMusicIndex += delta; + setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex); } -void Scene2802::changeCountdownType(int prevCountdownType, int newCountdownType) { +void Scene2802::changeTuneStatus(int prevTuneStatus, int newTuneStatus) { - if (prevCountdownType == 3 || prevCountdownType == 6) { + if (prevTuneStatus == 3 || prevTuneStatus == 6) { _vm->_soundMan->stopSound(0x422630C2); _vm->_soundMan->stopSound(0x00632252); } - if (newCountdownType == 0) { + if (newTuneStatus == 0) { if (_vm->_gameModule->getScene2802MusicFileHash() != 0) { _vm->_soundMan->stopSound(0x00632252); } else _vm->_soundMan->playSoundLooping(0x00632252); - } else if (newCountdownType == 3 || newCountdownType == 6) { + } else if (newTuneStatus == 3 || newTuneStatus == 6) { _vm->_soundMan->playSoundLooping(0x422630C2); _vm->_soundMan->playSoundLooping(0x00632252); } diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index ca8b058ca1..bdcb1ee080 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -62,14 +62,14 @@ public: virtual ~Scene2802(); protected: SmackerPlayer *_smackerPlayer; - uint _smackerFrameNumber; - int _countdownType; + uint _currRadioMusicIndex; + int _currTuneStatus; int _countdown1; int _countdown2; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void incSmackerFrameNumber(int delta); - void changeCountdownType(int prevCountdownType, int newCountdownType); + void incRadioMusicIndex(int delta); + void changeTuneStatus(int prevTuneStatus, int newTuneStatus); }; class AsScene2803LightCord : public AnimatedSprite { diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 2ebdb094a3..0a033a8120 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -35,7 +35,7 @@ Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { if (which >= 0) - setGlobalVar(0x60826830, which); + setGlobalVar(V_TELEPORTER_WHICH, which); createScene(0, 0); @@ -47,7 +47,7 @@ void Module2900::createScene(int sceneNum, int which) { switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; - _childObject = new Scene2901(_vm, this, getGlobalVar(0x60826830)); + _childObject = new Scene2901(_vm, this, getGlobalVar(V_TELEPORTER_WHICH)); break; case 1: _vm->gameState().sceneNum = 0; @@ -85,8 +85,8 @@ void Module2900::updateScene() { if (_moduleResult == 0xFFFFFFFF) { leaveModule(0xFFFFFFFF); } else { - _field2C = _moduleResult; - switch (getGlobalVar(0x60826830)) { + _teleporterModuleResult = _moduleResult; + switch (getGlobalVar(V_TELEPORTER_WHICH)) { case 0: createScene(3, 4); break; @@ -117,7 +117,7 @@ void Module2900::updateScene() { case 4: case 5: case 6: - leaveModule(_field2C); + leaveModule(_teleporterModuleResult); break; } } @@ -391,15 +391,15 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) //DEBUG>>> Enable all locations for (int i = 0; i < 6; i++) - setSubVar(0x2C145A98, i, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1); //DEBUG<<< - setSubVar(0x2C145A98, which, 1); - setSubVar(0x2C145A98, 5, 1); - setSubVar(0x2C145A98, 4, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, which, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 5, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 4, 1); if (_currLocationButtonNum == 3) - setSubVar(0x2C145A98, 2, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1); _surfaceFlag = true; setBackground(kScene2901FileHashes1[_currLocationButtonNum]); @@ -432,7 +432,7 @@ void Scene2901::update() { if (_currLocationButtonNum == _selectedButtonNum) { _ssLocationButtonLights[_currWhirlButtonNum]->hide(); ++_currWhirlButtonNum; - while (!getSubVar(0x2C145A98, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) { + while (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) { ++_currWhirlButtonNum; if (_currWhirlButtonNum >= 6) _currWhirlButtonNum = 0; @@ -474,7 +474,7 @@ uint32 Scene2901::handleMessage(int messageNum, const MessageParam ¶m, Entit _selectedButtonNum = _currWhirlButtonNum; _ssLocationButtonLights[_selectedButtonNum]->hide(); _selectedButtonNum = param.asInteger(); - if (!getSubVar(0x2C145A98, _selectedButtonNum)) + if (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _selectedButtonNum)) _selectedButtonNum = _currLocationButtonNum; break; } diff --git a/engines/neverhood/module2900.h b/engines/neverhood/module2900.h index 7d4e1e4d9f..19514399e5 100644 --- a/engines/neverhood/module2900.h +++ b/engines/neverhood/module2900.h @@ -36,7 +36,7 @@ public: Module2900(NeverhoodEngine *vm, Module *parentModule, int which); protected: int _sceneNum; - int _field2C; + int _teleporterModuleResult; void createScene(int sceneNum, int which); void updateScene(); void updateMusic(bool halfVolume); -- cgit v1.2.3 From f5c7070ace26b95a52303ceb51893d2032ad8241 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 16 Oct 2012 11:15:13 +0000 Subject: NEVERHOOD: Add mouse cursor hiding/showing --- engines/neverhood/mouse.cpp | 9 ++++++++- engines/neverhood/mouse.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index a1c4a9a5a8..bce66467de 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -42,7 +42,7 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect) Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) : StaticSprite(vm, 2000), _mouseType(kMouseType435), - _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) { + _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(true) { init(fileHash); if (_x <= _x1) { @@ -85,6 +85,13 @@ void Mouse::load(uint32 fileHash) { } void Mouse::update() { + if (_visible && !_surface->getVisible()) { + CursorMan.showMouse(false); + _visible = false; + } else if (!_visible && _surface->getVisible()) { + CursorMan.showMouse(true); + _visible = true; + } updateCursor(); _frameNum++; if (_frameNum >= 6) diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index 0b4f6b81db..a163a7a01c 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -51,6 +51,7 @@ protected: int16 _x1; int16 _x2; int _type; + bool _visible; void init(uint32 fileHash); void update(); void updateCursorNum(); -- cgit v1.2.3 From 2c4f0b70fe4103891f8ffd99e0ea3f8788a90b31 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 16 Oct 2012 13:12:53 +0000 Subject: NEVERHOOD: Add Entity::setSoundPan and use it in the DiskplayerScene --- engines/neverhood/diskplayerscene.cpp | 2 +- engines/neverhood/entity.cpp | 4 ++++ engines/neverhood/entity.h | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 65bbc0ddb5..ac51ea1550 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -265,7 +265,7 @@ DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerS _appearSlot->setVisible(false); _activeSlot->setVisible(false); loadSound(0, 0x46210074); - // TODO sound panning stuff + setSoundPan(0, elementIndex * 100 / 19); } else if (elementIndex != 20) { _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100)); _activeSlot->setVisible(false); diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index f66d129e26..36137a6fb5 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -150,6 +150,10 @@ void Entity::setSoundVolume(uint index, int volume) { getSoundResource(index)->setVolume(volume); } +void Entity::setSoundPan(uint index, int pan) { + getSoundResource(index)->setPan(pan); +} + void Entity::deleteSoundResources() { if (_soundResources) { for (uint i = 0; i < kMaxSoundResources; ++i) diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 4bcd0c4e33..0b3e32c5e8 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -111,6 +111,7 @@ protected: void stopSound(uint index); bool isSoundPlaying(uint index); void setSoundVolume(uint index, int volume); + void setSoundPan(uint index, int pan); void deleteSoundResources(); }; -- cgit v1.2.3 From 963b76007650eb3e9d55333120ca6a824759ff98 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 16 Oct 2012 14:38:43 +0000 Subject: NEVERHOOD: Remove TODOs concerning the original engine's debug code - Add Scene1202 palette effect - Add AsScene1405Tile sound panning - Clean up some old comments --- engines/neverhood/diskplayerscene.cpp | 3 --- engines/neverhood/module1100.cpp | 2 -- engines/neverhood/module1200.cpp | 14 ++--------- engines/neverhood/module1200.h | 1 - engines/neverhood/module1300.cpp | 2 -- engines/neverhood/module1400.cpp | 10 +------- engines/neverhood/module1500.cpp | 3 --- engines/neverhood/module1600.cpp | 6 ----- engines/neverhood/module1900.cpp | 3 --- engines/neverhood/module2200.cpp | 8 ------ engines/neverhood/module2400.cpp | 2 -- engines/neverhood/module2500.cpp | 5 ++-- engines/neverhood/module2700.cpp | 4 --- engines/neverhood/module2800.cpp | 47 +++-------------------------------- engines/neverhood/module3000.cpp | 8 ------ engines/neverhood/navigationscene.cpp | 1 - engines/neverhood/palette.cpp | 4 +++ engines/neverhood/palette.h | 1 + 18 files changed, 15 insertions(+), 109 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index ac51ea1550..d69182b57e 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -379,7 +379,6 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int addEntity(_diskSmackerPlayer); addSurface(_diskSmackerPlayer->getSurface()); _diskSmackerPlayer->setDrawPos(154, 86); - // TODO _diskSmackerPlayer->gotoFrame(0); _vm->_screen->setSmackerDecoder(_diskSmackerPlayer->getSmackerDecoder()); _palette->usePalette(); @@ -469,7 +468,6 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, if (!_inputDisabled) { switch (messageNum) { case 0x0001: - // TODO: Debug/Cheat if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { sendMessage(_parentModule, 0x1009, 0); } else if (!_dropKey && @@ -488,7 +486,6 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, } } break; - // case 0x000D: TODO: Debug/Cheat case 0x2000: tuneIn(); break; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 333515538a..e46ed262ec 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -476,7 +476,6 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO Debug stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { if (!_flag2 && _backgroundIndex == 0) { if (_flag1) { @@ -489,7 +488,6 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit } } break; - // TODO Debug stuff case 0x2001: showMouse(false); _backgroundIndex = 24; diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index d106a85aea..fecb66a3b6 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -1137,7 +1137,8 @@ void Scene1202::update() { _clickedIndex = 0; SetMessageHandler(&Scene1202::hmSolved); setGlobalVar(V_TNT_DUMMY_BUILT, 1); - doPaletteEffect(); + _palette->copyToBasePalette(_paletteData); + _palette->startFadeToPalette(24); playSound(3); _soundFlag = true; } else if (_clickedIndex >= 0 && _counter == 0) { @@ -1163,17 +1164,10 @@ uint32 Scene1202::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO: Debug/Cheat stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) { leaveScene(0); } break; - case 0x000D: - if (param.asInteger() == 0x14210006) { - // TODO: Debug/Cheat stuff - messageResult = 1; - } - break; case 0x2000: _clickedIndex = (int)param.asInteger(); break; @@ -1209,8 +1203,4 @@ bool Scene1202::isSolved() { getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15; } -void Scene1202::doPaletteEffect() { - // TODO -} - } // End of namespace Neverhood diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index 7d4e224a38..a0e9c9f902 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -209,7 +209,6 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmSolved(int messageNum, const MessageParam ¶m, Entity *sender); bool isSolved(); - void doPaletteEffect(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 978eb03cc8..c81cbaa144 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1329,7 +1329,6 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO Debug stuff if (!_isPuzzleSolved) { if (param.asPoint().x > 20 && param.asPoint().x < 620) { if (_asCurrKey && !_isInsertingKey) { @@ -1363,7 +1362,6 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit } } break; - // TODO Debug stuff case 0x2002: // Check if all keys are in the correct keyholes if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) && diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index b5489a39f9..82ac01d783 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1278,7 +1278,6 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (_puzzleSolvedCountdown == 0) { - // TODO: Debug/Cheat stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { // Exit scene leaveScene(0); @@ -1295,9 +1294,6 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit } } break; - case 0x000D: - // TODO: Debug/Cheat stuff - break; case 0x2000: // The mouse got the cheese (nomnom) setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1); @@ -1542,7 +1538,7 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui : AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) { loadSound(0, 0x05308101); - // TODO _soundResource.setPan + setSoundPan(0, (tileIndex % 8 * 4 + 4) * 25 / 8); _x = kAsScene1405TileItemPositions[_tileIndex].x; _y = kAsScene1405TileItemPositions[_tileIndex].y; createSurface1(0x844B805C, 1100); @@ -1653,14 +1649,10 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO: Debug/Cheat stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { leaveScene(0); } break; - case 0x000D: - // TODO: Debug/Cheat stuff - break; case 0x2000: if (_selectFirstTile) { _firstTileIndex = param.asInteger(); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index a46b8fc716..b62ff01494 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -106,9 +106,6 @@ void Scene1501::update() { Scene::update(); - // TODO: Since these countdowns are used a lot, maybe these can be wrapped in a class/struct - // so the code gets a little cleaner. - if (_countdown1 != 0) { _countdown1--; if (_countdown1 == 0) { diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index b6df7061c2..568f957943 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1064,10 +1064,6 @@ void AsCommonCarConnector::update() { Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _asCar(NULL), _countdown1(0) { - /* TODO: Find out which of the message/update handlers are used for - the upper/lower floors and rename them accordingly. - */ - setGlobalVar(V_CAR_DELTA_X, 1); _surfaceFlag = true; @@ -1434,11 +1430,9 @@ uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO: Debug stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); break; - // TODO: Debug stuff case 0x2000: if (!_isSolved) { if (_changeCurrentSymbol) diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index d90074c2cf..9db150338a 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -390,7 +390,6 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { void AsScene1907Symbol::stFallOffHitGround() { playSound(1); sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); - // TODO: Meh... Entity::_priority = 1000 - _newPositionIndex; _vm->_collisionMan->removeSprite(this); _vm->_collisionMan->addSprite(this); @@ -632,13 +631,11 @@ uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO DEBUG stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) { leaveScene(0); } break; - // TODO Debug stuff case 0x2000: if (getGlobalVar(V_STAIRS_DOWN)) { playSound(0); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 20a8559aae..1b07890156 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -967,14 +967,10 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO Debug stuff if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { leaveScene(0); } break; - case 0x000D: - // TODO Debug stuff - break; case 0x2000: _movingTileIndex = (int16)param.asInteger(); _ssMovingTile = (Sprite*)sender; @@ -1127,8 +1123,6 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B8320); - //DEBUG setGlobalVar(V_KEY3_LOCATION, 1);//###//TODO CHECK IF Below... - if (getGlobalVar(V_KEY3_LOCATION) == 1) { _asKey = insertSprite(this, 2, 1100, 282, 432); _vm->_collisionMan->addSprite(_asKey); @@ -2391,7 +2385,6 @@ void Scene2208::drawRow(int16 rowIndex) { _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true); if (rowIndex < (int)_strings.size()) { const char *text = _strings[rowIndex]; - // TODO/CHECKME: Use temporary string up to '{' character (see above) _fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text); } } @@ -2667,7 +2660,6 @@ Scene2247::~Scene2247() { uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { - // TODO: Debug stuff case 0x100D: if (param.asInteger() == 0x800C6694) { readClickedColumn(); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index d29330f9ca..c75e85b2bf 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -487,8 +487,6 @@ void Scene2401::update() { uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { - // case 0x0001: TODO DEBUG - // case 0x000D: TODO DEBUG case 0x100D: if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssButton); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 0a14fb65a3..c9bffe527e 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -92,7 +92,9 @@ void Module2500::createScene(int sceneNum, int which) { createScene2704(which, 0x004B01B8, 220); break; case 2: - setGlobalVar(V_WORLDS_JOINED, 1);// TODO DEBUG! Join the tracks. + //DEBUG>>>Join the tracks. + setGlobalVar(V_WORLDS_JOINED, 1); + //DEBUG<<< _vm->gameState().which = which; if (getGlobalVar(V_WORLDS_JOINED)) createScene2704(which, 0x004B01E0, 150); @@ -213,7 +215,6 @@ uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Enti } void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { - // TODO Move to module class? _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 19bf9be6cb..9bac035a38 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -411,8 +411,6 @@ void Module2700::updateScene() { createScene(19, 3); break; case 21: - // TODO? GameState_sub_469C50(&field_52, 0); - // TODO MusicMan_stopAll (if field_52 above = 1) _vm->_soundMan->deleteMusic(_musicFileHash); _vm->_soundMan->startMusic(0x04020210, 0, 2); _vm->_soundMan->deleteSoundGroup(0x42212411); @@ -460,8 +458,6 @@ void Module2700::updateScene() { _vm->_soundMan->stopMusic(0x04020210, 0, 1); _vm->gameModule()->initScene2801Vars(); _musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME); - // TODO? GameState_sub_469C50(&field_52, 0); - // TODO MusicMan_create(); // Why? _vm->_soundMan->addMusic(0x42212411, _musicFileHash); _vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */); _vm->_soundMan->addSound(0x42212411, 0x44014282); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index b6f56945a0..a1a93bd1de 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -487,7 +487,6 @@ Scene2801::~Scene2801() { uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { - // TODO: case 0x000D: case 0x4826: if (sender == _asTape) { sendEntityMessage(_klayman, 0x1014, _asTape); @@ -1862,14 +1861,10 @@ uint32 Scene2804::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO DEBUG if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { leaveScene(0); } break; - case 0x000D: - // TODO DEBUG - break; case 0x2000: _isWorking = true; sendMessage(_asCoil, 0x2002, 0); @@ -2377,53 +2372,23 @@ uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam &pa void AsScene2808TestTube::fill() { - if ((int)_fillLevel >= _testTubeSetNum * 3 + 3) + if ((int)_fillLevel < _testTubeSetNum * 3 + 3) return; - // TODO Remove the two switches - if (_testTubeSetNum == 0) { - switch (_fillLevel) { - case 0: - playSound(0); - break; - case 1: - playSound(1); - break; - case 2: - playSound(2); - break; - } + playSound(_fillLevel); setVisible(true); startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]); _newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1]; } else { - switch (_fillLevel) { - case 0: - playSound(3); - break; - case 1: - playSound(4); - break; - case 2: - playSound(5); - break; - case 3: - playSound(6); - break; - case 4: - playSound(7); - break; - case 5: - playSound(8); - break; - } + playSound(3 + _fillLevel); setVisible(true); startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; } _ssDispenser->startCountdown(_fillLevel); _fillLevel++; + } void AsScene2808TestTube::flush() { @@ -2599,14 +2564,10 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO DEBUG Stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) { leaveScene(1); } break; - case 0x000D: - // TODO DEBUG Stuff - break; case 0x2000: if (!_isFlowing) _asTestTubes[param.asInteger()]->fill(); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 242a00e012..6d394a859f 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -937,15 +937,11 @@ uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO: Debug stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) { setGlobalVar(V_CANNON_TARGET_STATUS, 0); leaveScene(0); } break; - case 0x000D: - // TODO: Debug stuff - break; case 0x2000: if (!getGlobalVar(V_CANNON_RAISED)) { if (!getGlobalVar(V_WALL_BROKEN)) { @@ -1347,7 +1343,6 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - // TODO: Debug stuff if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) { if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) { showMouse(false); @@ -1365,9 +1360,6 @@ uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entit } } break; - case 0x000D: - // TODO: Debug stuff - break; case 0x2000: if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) { _asDeadBolts[param.asInteger()]->unlock(false); diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index bf3de5d812..96d33c0ffd 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -140,7 +140,6 @@ void NavigationScene::createMouseCursor() { } mouseCursorFileHash = navigationItem.mouseCursorFileHash; - // TODO: Check the resource... if (mouseCursorFileHash == 0) mouseCursorFileHash = 0x63A40028; diff --git a/engines/neverhood/palette.cpp b/engines/neverhood/palette.cpp index 16ef31d569..d4b9b67f53 100644 --- a/engines/neverhood/palette.cpp +++ b/engines/neverhood/palette.cpp @@ -161,6 +161,10 @@ void Palette::fillBaseBlack(int index, int count) { } } +void Palette::copyToBasePalette(byte *palette) { + memcpy(_basePalette, palette, 256 * 4); +} + void Palette::update() { debug(2, "Palette::update() _status = %d", _status); if (_status == 1) { diff --git a/engines/neverhood/palette.h b/engines/neverhood/palette.h index 4b0747bd73..c83207caae 100644 --- a/engines/neverhood/palette.h +++ b/engines/neverhood/palette.h @@ -51,6 +51,7 @@ public: void startFadeToPalette(int counter); void fillBaseWhite(int index, int count); void fillBaseBlack(int index, int count); + void copyToBasePalette(byte *palette); protected: int _status; byte *_palette; -- cgit v1.2.3 From 692edf40c737e88fdfb1b3d5a9515a85207dbafd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 17 Oct 2012 13:07:52 +0000 Subject: NEVERHOOD: Try to give the AsCommonCar identifiers better names - Implement AsCommonCar::updateSound() - Fix a bug in Scene1608 (the Klaymen animation got stuck when trying to get back into the car) --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/module1600.cpp | 445 ++++++++++++++++++++------------------- engines/neverhood/module1600.h | 76 +++---- 3 files changed, 268 insertions(+), 257 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 1c8a2d9a6d..3d19a59d21 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -361,9 +361,9 @@ void GameModule::startup() { // <<gameState().which = 0; + _vm->gameState().which = 1; _vm->gameState().sceneNum = 0; - createModule(1200, -1); + createModule(2500, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 568f957943..ae8fd7fabc 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -191,23 +191,23 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 _x = x; _y = y; - _field100 = 0; + _inMainArea = false; _exitDirection = 0; _currPointIndex = 0; - _againDestPtFlag = 0; + _hasAgainDestPoint = false; _stepError = 0; - _againDestPointFlag = 0; + _hasAgainDestPointIndex = false; _steps = 0; - _flag10E = 0; - _moreY = 0; - _flag10F = 0; - _flag113 = 0; - _flag114 = 1; - _flag11A = 0; + _isBraking = false; + _yMoveTotalSteps = 0; + _isBusy = false; + _isIdle = false; + _isMoving = true; + _rectFlag = false; _newDeltaXType = -1; - _field11E = 0; + _soundCounter = 0; _pathPoints = NULL; - _rectList = NULL; + _rectList = NULL; // TODO Check if this is used startAnimation(0xD4220027, 0, -1); setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); @@ -215,7 +215,7 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 } AsCommonCar::~AsCommonCar() { - if (_finalizeStateCb == AnimationCallback(&AsCommonCar::sub45D620)) { + if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) { setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X)); } } @@ -230,23 +230,23 @@ void AsCommonCar::update() { _newDeltaXType = -1; } AnimatedSprite::update(); - if (_againDestPtFlag && _moreY == 0 && !_flag10F) { - _againDestPtFlag = 0; - _againDestPointFlag = 0; - sendPointMessage(this, 0x2004, _againDestPt); - } else if (_againDestPointFlag && _moreY == 0 && !_flag10F) { - _againDestPointFlag = 0; + if (_hasAgainDestPoint && _yMoveTotalSteps == 0 && !_isBusy) { + _hasAgainDestPoint = false; + _hasAgainDestPointIndex = false; + sendPointMessage(this, 0x2004, _againDestPoint); + } else if (_hasAgainDestPointIndex && _yMoveTotalSteps == 0 && !_isBusy) { + _hasAgainDestPointIndex = false; sendMessage(this, 0x2003, _againDestPointIndex); } - sub45CE10(); - sub45E0A0(); + updateMovement(); + updateSound(); } -void AsCommonCar::update45C790() { - AsCommonCar::update(); +void AsCommonCar::upIdle() { + update(); if (++_idleCounter >= _idleCounterMax) - sub45D050(); - sub45E0A0(); + stIdleBlink(); + updateSound(); } uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -255,10 +255,6 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Ent case 0x1019: SetSpriteUpdate(NULL); break; - /* NOTE: Implemented in setPathPoints - case 0x2000: - case 0x2001: - */ case 0x2002: // Set the current position without moving _currPointIndex = param.asInteger(); @@ -270,24 +266,24 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Ent // Move to a point by its index { int newPointIndex = param.asInteger(); - if (_moreY <= 0 && !_flag10F) { - _someX = pathPoint(newPointIndex).x; - _someY = pathPoint(newPointIndex).y; + if (_yMoveTotalSteps <= 0 && !_isBusy) { + _destX = pathPoint(newPointIndex).x; + _destY = pathPoint(newPointIndex).y; if (_currPointIndex < newPointIndex) { moveToNextPoint(); } else if (_currPointIndex == newPointIndex && _stepError == 0) { if (_currPointIndex == 0) { - _moreY = 0; + _yMoveTotalSteps = 0; sendMessage(_parentScene, 0x2005, 0); } else if (_currPointIndex == (int)_pathPoints->size()) { - _moreY = 0; + _yMoveTotalSteps = 0; sendMessage(_parentScene, 0x2006, 0); } } else { moveToPrevPoint(); } } else { - _againDestPointFlag = 1; + _hasAgainDestPointIndex = true; _againDestPointIndex = newPointIndex; } } @@ -298,25 +294,25 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Ent int minMatchIndex = -1; int minMatchDistance, distance; NPoint pt = param.asPoint(); - if (_moreY <= 0 && !_flag10F) { + if (_yMoveTotalSteps <= 0 && !_isBusy) { // Check if we're already exiting (or something) if ((pt.x <= 20 && _exitDirection == 1) || (pt.x >= 620 && _exitDirection == 3) || (pt.y <= 20 && _exitDirection == 2) || (pt.y >= 460 && _exitDirection == 4)) break; - _someX = pt.x; - _someY = pt.y; - minMatchDistance = calcDistance(_someX, _someY, _x, _y) + 1; + _destX = pt.x; + _destY = pt.y; + minMatchDistance = calcDistance(_destX, _destY, _x, _y) + 1; for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) { - distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y); + distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y); if (distance >= minMatchDistance) break; minMatchDistance = distance; minMatchIndex = i; } for (int i = _currPointIndex; i >= 0; i--) { - distance = calcDistance(_someX, _someY, pathPoint(i).x, pathPoint(i).y); + distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y); if (distance >= minMatchDistance) break; minMatchDistance = distance; @@ -336,53 +332,48 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Ent } } } else { - _againDestPtFlag = 1; - _againDestPt = pt; + _hasAgainDestPoint = true; + _againDestPoint = pt; } } break; case 0x2007: - _moreY = param.asInteger(); + _yMoveTotalSteps = param.asInteger(); _steps = 0; - _flag10E = 0; + _isBraking = false; SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); _lastDistance = 640; break; case 0x2008: - _moreY = param.asInteger(); + _yMoveTotalSteps = param.asInteger(); _steps = 0; - _flag10E = 0; + _isBraking = false; SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); _lastDistance = 640; break; case 0x2009: - sub45CF80(); + stEnterCar(); break; case 0x200A: - sub45CFB0(); + stLeaveCar(); break; - /* NOTE: Implemented in setRectList - case 0x200B: - case 0x200C: - */ case 0x200E: - sub45D180(); + stTurnCar(); break; case 0x200F: - sub45CD00(); + stCarAtHome(); _newDeltaXType = param.asInteger(); break; } return messageResult; } -uint32 AsCommonCar::handleMessage45CC30(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (_flag10F && param.asInteger() == 0x025424A2) { + if (_isBusy && param.asInteger() == 0x025424A2) gotoNextState(); - } break; case 0x3002: gotoNextState(); @@ -391,10 +382,10 @@ uint32 AsCommonCar::handleMessage45CC30(int messageNum, const MessageParam ¶ return messageResult; } -uint32 AsCommonCar::handleMessage45CCA0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsCommonCar::hmLeaveCar(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x2009: - sub45CF80(); + stEnterCar(); break; case 0x3002: sendMessage(_parentScene, 0x200A, 0); @@ -404,23 +395,22 @@ uint32 AsCommonCar::handleMessage45CCA0(int messageNum, const MessageParam ¶ return 0; } -void AsCommonCar::sub45CD00() { +void AsCommonCar::stCarAtHome() { bool doDeltaX = _doDeltaX; SetSpriteUpdate(NULL); - _againDestPtFlag = 0; - _againDestPointFlag = 0; - _flag10E = 0; - _flag10F = 0; - _flag113 = 0; - _flag114 = 0; - _flag11A = 0; + _hasAgainDestPoint = false; + _hasAgainDestPointIndex = false; + _isBraking = false; + _isBusy = false; + _isIdle = false; + _isMoving = false; + _rectFlag = false; _rectList = NULL; - SetMessageHandler(&AsCommonCar::handleMessage45CC30); - NextState(&AsCommonCar::sub45CFE0); + NextState(&AsCommonCar::stLeanForwardIdle); startAnimation(0x35698F78, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); - SetUpdateHandler(&AsCommonCar::update45C790); - FinalizeState(&AsCommonCar::sub45D040); + SetMessageHandler(&AsCommonCar::handleMessage); + SetUpdateHandler(&AsCommonCar::upIdle); + FinalizeState(&AsCommonCar::evIdleDone); setDoDeltaX(doDeltaX ? 1 : 0); _currMoveDirection = 0; _newMoveDirection = 0; @@ -429,36 +419,36 @@ void AsCommonCar::sub45CD00() { _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void AsCommonCar::sub45CDC0() { - if (_value112 == 1) { +void AsCommonCar::updateTurnMovement() { + if (_turnMoveStatus == 1) { _lastDistance = 640; - _flag113 = 0; - _flag10E = 0; + _isIdle = false; + _isBraking = false; SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); - } else if (_value112 == 2) { + } else if (_turnMoveStatus == 2) { _lastDistance = 640; - _flag113 = 0; - _flag10E = 0; + _isIdle = false; + _isBraking = false; SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); } } -void AsCommonCar::sub45CE10() { - if (_flag10E && !_flag113 && !_flag10F) { +void AsCommonCar::updateMovement() { + if (_isBraking && !_isIdle && !_isBusy) { gotoNextState(); - _flag114 = 0; - _flag113 = 1; + _isMoving = false; + _isIdle = true; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45CFE0); - } else if (!_flag10E && _steps && _flag113) { + NextState(&AsCommonCar::stLeanForwardIdle); + } else if (!_isBraking && _steps && _isIdle) { gotoNextState(); - _flag113 = 0; + _isIdle = false; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45D100); + NextState(&AsCommonCar::stUpdateMoveDirection); } else { bool flag = false; uint index = 0; @@ -468,103 +458,92 @@ void AsCommonCar::sub45CE10() { if (_x >= r.x1 && _x <= r.x2 && _y >= r.y1 && _y <= r.y2) break; } - if (index < _rectList->size() && !_flag11A) + if (index < _rectList->size() && !_rectFlag) flag = true; - _flag11A = index < _rectList->size(); + _rectFlag = index < _rectList->size(); } if (flag) { gotoNextState(); - sub45D0A0(); - } else if (_newMoveDirection != _currMoveDirection && _flag114 && !_flag10F) { + stHandleRect(); + } else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) { gotoNextState(); _currMoveDirection = _newMoveDirection; - sub45D100(); + stUpdateMoveDirection(); } } } -void AsCommonCar::sub45CF80() { +void AsCommonCar::stEnterCar() { startAnimation(0xA86A9538, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45CFE0); + NextState(&AsCommonCar::stLeanForwardIdle); } -void AsCommonCar::sub45CFB0() { +void AsCommonCar::stLeaveCar() { startAnimation(0xA86A9538, -1, -1); _playBackwards = true; - SetMessageHandler(&AsCommonCar::handleMessage45CCA0); + SetMessageHandler(&AsCommonCar::hmLeaveCar); SetUpdateHandler(&AsCommonCar::update); } -void AsCommonCar::sub45CFE0() { +void AsCommonCar::stLeanForwardIdle() { startAnimation(0x35698F78, 0, -1); SetMessageHandler(&AsCommonCar::handleMessage); - SetUpdateHandler(&AsCommonCar::update45C790); - FinalizeState(&AsCommonCar::sub45D040); - _idleCounter = 0; + SetUpdateHandler(&AsCommonCar::upIdle); + FinalizeState(&AsCommonCar::evIdleDone); _currMoveDirection = 0; _newMoveDirection = 0; _steps = 0; + _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void AsCommonCar::sub45D040() { +void AsCommonCar::evIdleDone() { SetUpdateHandler(&AsCommonCar::update); } -void AsCommonCar::sub45D050() { +void AsCommonCar::stIdleBlink() { startAnimation(0xB579A77C, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45CFE0); + NextState(&AsCommonCar::stLeanForwardIdle); _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -void AsCommonCar::sub45D0A0() { - _flag10F = 1; +void AsCommonCar::stHandleRect() { + _isBusy = true; gotoNextState(); startAnimation(0x9C220DA4, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - FinalizeState(&AsCommonCar::sub45D0E0); + FinalizeState(&AsCommonCar::evHandleRectDone); } -void AsCommonCar::sub45D0E0() { - _flag10F = 0; +void AsCommonCar::evHandleRectDone() { + _isBusy = false; _newMoveDirection = 0; - sub45D100(); + stUpdateMoveDirection(); } -void AsCommonCar::sub45D100() { - _flag114 = 1; +void AsCommonCar::stUpdateMoveDirection() { + _isMoving = true; if (_currMoveDirection == 1) { startAnimation(0xD4AA03A4, 0, -1); } else if (_currMoveDirection == 3) { startAnimation(0xD00A1364, 0, -1); } else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) { - sub45D180(); + stTurnCar(); } else { startAnimation(0xD4220027, 0, -1); } setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0); } -void AsCommonCar::sub45D180() { - _flag10F = 1; - gotoNextState(); - startAnimation(0xF46A0324, 0, -1); - _value112 = 0; - SetMessageHandler(&AsCommonCar::handleMessage45CC30); - SetUpdateHandler(&AsCommonCar::update); - FinalizeState(&AsCommonCar::sub45D620); - sub45CDC0(); -} - void AsCommonCar::moveToNextPoint() { if (_currPointIndex >= (int)_pathPoints->size() - 1) { - _moreY = 0; + _yMoveTotalSteps = 0; sendMessage(this, 0x1019, 0); sendMessage(_parentScene, 0x2006, 0); } else { @@ -576,50 +555,75 @@ void AsCommonCar::moveToNextPoint() { _currMoveDirection = 2; else if (_currMoveDirection == 2) _currMoveDirection = 4; - if (_flag113) - sub45D390(); + if (_isIdle) + stTurnCarMoveToNextPoint(); else - sub45D350(); + stBrakeMoveToNextPoint(); } else { if (_steps == 0) { gotoNextState(); - _flag113 = 0; + _isIdle = false; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45D100); + NextState(&AsCommonCar::stUpdateMoveDirection); } - _flag10E = 0; + _isBraking = false; SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); _lastDistance = 640; } } } -void AsCommonCar::sub45D350() { +void AsCommonCar::stBrakeMoveToNextPoint() { gotoNextState(); - _flag10F = 1; - _flag10E = 1; + _isBusy = true; + _isBraking = true; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::stTurnCarMoveToNextPoint); +} + +void AsCommonCar::stTurnCar() { + // Turn to left/right #1 + gotoNextState(); + _isBusy = true; + startAnimation(0xF46A0324, 0, -1); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45D390); + FinalizeState(&AsCommonCar::evTurnCarDone); + _turnMoveStatus = 0; + updateTurnMovement(); } -void AsCommonCar::sub45D390() { +void AsCommonCar::stTurnCarMoveToNextPoint() { + // Turn to left/right #2 gotoNextState(); - _flag10F = 1; + _isBusy = true; startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - FinalizeState(&AsCommonCar::sub45D620); - _value112 = 1; - sub45CDC0(); + FinalizeState(&AsCommonCar::evTurnCarDone); + _turnMoveStatus = 1; + updateTurnMovement(); +} + +void AsCommonCar::stTurnCarMoveToPrevPoint() { + // Turn to left/right #3 + FinalizeState(NULL); + _isBusy = true; + startAnimation(0xF46A0324, 0, -1); + SetMessageHandler(&AsCommonCar::hmAnimation); + SetUpdateHandler(&AsCommonCar::update); + FinalizeState(&AsCommonCar::evTurnCarDone); + _turnMoveStatus = 2; + updateTurnMovement(); } void AsCommonCar::moveToPrevPoint() { if (_currPointIndex == 0 && _stepError == 0) { - _moreY = 0; + _yMoveTotalSteps = 0; sendMessage(this, 0x1019, 0); sendMessage(_parentScene, 0x2005, 0); } else { @@ -638,65 +642,54 @@ void AsCommonCar::moveToPrevPoint() { _currMoveDirection = 4; else if (_currMoveDirection == 4) _currMoveDirection = 2; - if (_flag113) - sub45D5D0(); + if (_isIdle) + stTurnCarMoveToPrevPoint(); else - sub45D580(); + stBrakeMoveToPrevPoint(); } else { if (_steps == 0) { gotoNextState(); - _flag113 = 0; + _isIdle = false; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45D100); + NextState(&AsCommonCar::stUpdateMoveDirection); } - _flag10E = 0; + _isBraking = false; SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); _lastDistance = 640; } } } -void AsCommonCar::sub45D580() { - _flag10F = 1; - _flag10E = 1; +void AsCommonCar::stBrakeMoveToPrevPoint() { FinalizeState(NULL); + _isBusy = true; + _isBraking = true; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); - SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::sub45D5D0); -} - -void AsCommonCar::sub45D5D0() { - _flag10F = 1; - FinalizeState(NULL); - startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage45CC30); + SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); - FinalizeState(&AsCommonCar::sub45D620); - _value112 = 2; - sub45CDC0(); + NextState(&AsCommonCar::stTurnCarMoveToPrevPoint); } -void AsCommonCar::sub45D620() { - _flag10F = 0; +void AsCommonCar::evTurnCarDone() { + _isBusy = false; _newMoveDirection = 0; setDoDeltaX(2); - sub45D100(); + stUpdateMoveDirection(); } void AsCommonCar::suMoveToNextPoint() { int16 newX = _x, newY = _y; if (_currPointIndex >= (int)_pathPoints->size()) { - _moreY = 0; + _yMoveTotalSteps = 0; sendMessage(this, 0x1019, 0); sendMessage(_parentScene, 0x2006, 0); return; } - if (_flag10E) { + if (_isBraking) { if (_steps <= 0) { sendMessage(this, 0x1019, 0); return; @@ -708,7 +701,7 @@ void AsCommonCar::suMoveToNextPoint() { } bool firstTime = true; - _anotherY = _steps; + _ySteps = _steps; int stepsCtr = _steps; while (stepsCtr > 0) { @@ -757,7 +750,7 @@ void AsCommonCar::suMoveToNextPoint() { if (stepsCtr < 0) stepsCtr = 0; } - _anotherY = stepsCtr; + _ySteps = stepsCtr; } if (stepsCtr + _stepError >= deltaY) { stepsCtr -= deltaY; @@ -784,25 +777,25 @@ void AsCommonCar::suMoveToNextPoint() { firstTime = false; } - if (_moreY != 0) { + if (_yMoveTotalSteps != 0) { _x = newX; _y = newY; - _moreY -= _anotherY; - if (_moreY <= 0) { - _flag10E = 1; - _moreY = 0; + _yMoveTotalSteps -= _ySteps; + if (_yMoveTotalSteps <= 0) { + _isBraking = true; + _yMoveTotalSteps = 0; } } else { - int distance = calcDistance(_someX, _someY, _x, _y); + int distance = calcDistance(_destX, _destY, _x, _y); _x = newX; _y = newY; if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { _exitDirection = 0; - _field100 = 1; - } else if (_field100) { - _someX = pathPoint(_pathPoints->size() - 1).x; - _someY = pathPoint(_pathPoints->size() - 1).y; - _field100 = 0; + _inMainArea = true; + } else if (_inMainArea) { + _destX = pathPoint(_pathPoints->size() - 1).x; + _destY = pathPoint(_pathPoints->size() - 1).y; + _inMainArea = false; if (_x <= 20) _exitDirection = 1; else if (_x >= 620) @@ -811,19 +804,19 @@ void AsCommonCar::suMoveToNextPoint() { _exitDirection = 2; else if (_y >= 460) _exitDirection = 4; - if (_exitDirection != 0 && _flag10E) { - _flag10E = 0; + if (_exitDirection != 0 && _isBraking) { + _isBraking = false; _steps = 11; } } if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || (_exitDirection == 0 && _lastDistance + 20 < distance)) - _flag10E = 1; + _isBraking = true; if (distance < _lastDistance) _lastDistance = distance; if (_currPointIndex == (int)_pathPoints->size() - 1) { - _flag10E = 1; - _moreY = 0; + _isBraking = true; + _yMoveTotalSteps = 0; sendMessage(this, 0x1019, 0); sendMessage(_parentScene, 0x2006, 0); } @@ -835,13 +828,13 @@ void AsCommonCar::suMoveToPrevPoint() { int16 newX = _x, newY = _y; if (_currPointIndex == 0 && _stepError == 0) { - _moreY = 0; + _yMoveTotalSteps = 0; sendMessage(this, 0x1019, 0); sendMessage(_parentScene, 0x2005, 0); return; } - if (_flag10E) { + if (_isBraking) { if (_steps <= 0) { sendMessage(this, 0x1019, 0); return; @@ -853,7 +846,7 @@ void AsCommonCar::suMoveToPrevPoint() { } bool firstTime = true; - _anotherY = _steps; + _ySteps = _steps; int stepsCtr = _steps; while (stepsCtr > 0) { @@ -904,7 +897,7 @@ void AsCommonCar::suMoveToPrevPoint() { } else { stepsCtr += 7; } - _anotherY = stepsCtr; + _ySteps = stepsCtr; } if (_stepError == 0) _stepError = deltaY; @@ -931,25 +924,25 @@ void AsCommonCar::suMoveToPrevPoint() { firstTime = false; } - if (_moreY != 0) { + if (_yMoveTotalSteps != 0) { _x = newX; _y = newY; - _moreY -= _anotherY; - if (_moreY <= 0) { - _flag10E = 1; - _moreY = 0; + _yMoveTotalSteps -= _ySteps; + if (_yMoveTotalSteps <= 0) { + _isBraking = true; + _yMoveTotalSteps = 0; } } else { - int distance = calcDistance(_someX, _someY, _x, _y); + int distance = calcDistance(_destX, _destY, _x, _y); _x = newX; _y = newY; if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { _exitDirection = 0; - _field100 = 1; - } else if (_field100) { - _someX = pathPoint(0).x; - _someY = pathPoint(0).y; - _field100 = 0; + _inMainArea = true; + } else if (_inMainArea) { + _destX = pathPoint(0).x; + _destY = pathPoint(0).y; + _inMainArea = false; if (_x <= 20) _exitDirection = 1; else if (_x >= 620) @@ -958,19 +951,19 @@ void AsCommonCar::suMoveToPrevPoint() { _exitDirection = 2; else if (_y >= 460) _exitDirection = 4; - if (_exitDirection != 0 && _flag10E) { - _flag10E = 0; + if (_exitDirection != 0 && _isBraking) { + _isBraking = false; _steps = 11; } } if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || (_exitDirection == 0 && _lastDistance + 20 < distance)) - _flag10E = 1; + _isBraking = true; if (distance < _lastDistance) _lastDistance = distance; if (_currPointIndex == 0 && _stepError == 0) { - _flag10E = 1; - _moreY = 0; + _isBraking = true; + _yMoveTotalSteps = 0; sendMessage(this, 0x1019, 0); sendMessage(_parentScene, 0x2005, 0); } @@ -978,8 +971,26 @@ void AsCommonCar::suMoveToPrevPoint() { } -void AsCommonCar::sub45E0A0() { - // TODO +void AsCommonCar::updateSound() { + int maxSoundCounter = 0; + _soundCounter++; + if (_steps != 0 && !_isIdle) { + if (_currMoveDirection == 1) + maxSoundCounter = 18 - _steps; + else if (_currMoveDirection == 3) { + maxSoundCounter = 5 - _steps; + if (maxSoundCounter < 1) + maxSoundCounter = 1; + } else { + maxSoundCounter = 14 - _steps; + } + } else { + maxSoundCounter = 21; + } + if (_soundCounter >= maxSoundCounter) { + sendMessage(_parentScene, 0x200D, 0); + _soundCounter = 0; + } } AsScene1608Door::AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene) @@ -1261,7 +1272,7 @@ void Scene1608::upGettingOutOfCar() { addSprite(_klayman); _klaymanInCar = false; SetMessageHandler(&Scene1608::hmUpperFloor); - SetUpdateHandler(&Scene1608::update); + SetUpdateHandler(&Scene1608::upUpperFloor); setRectList(0x004B4810); _asIdleCarLower->setVisible(true); _asIdleCarFull->setVisible(true); diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 8c794e07a1..a2d5464f18 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -54,55 +54,55 @@ protected: int _currMoveDirection; int _exitDirection; int _currPointIndex; - NPoint _againDestPt; - int _againDestPtFlag; - int _steps; - int _stepError; + bool _hasAgainDestPoint; + NPoint _againDestPoint; + bool _hasAgainDestPointIndex; + int _againDestPointIndex; + bool _inMainArea; + bool _isBraking; + bool _isBusy; + bool _isIdle; + bool _isMoving; + bool _rectFlag; int _idleCounter; int _idleCounterMax; + int _steps; + int _stepError; int _lastDistance; - int _field100; - int _againDestPointFlag; - int _flag10E; - int _moreY; - int _flag10F; - int _flag113; - int _flag114; - int _flag11A; + int _yMoveTotalSteps; + int _ySteps; int _newDeltaXType; - int _field11E; - int _againDestPointIndex; - int _value112; - int _anotherY; - int16 _someX, _someY; + int _soundCounter; + int _turnMoveStatus; + int16 _destX, _destY; NPoint pathPoint(uint index) { return (*_pathPoints)[index]; } void update(); - void update45C790(); + void upIdle(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage45CC30(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage45CCA0(int messageNum, const MessageParam ¶m, Entity *sender); - void sub45CD00(); - void sub45CDC0(); - void sub45CE10(); - void sub45CF80(); - void sub45CFB0(); - void sub45CFE0(); - void sub45D040(); - void sub45D050(); - void sub45D0A0(); - void sub45D0E0(); - void sub45D100(); - void sub45D180(); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLeaveCar(int messageNum, const MessageParam ¶m, Entity *sender); + void stCarAtHome(); + void updateTurnMovement(); + void updateMovement(); + void stEnterCar(); + void stLeaveCar(); + void stLeanForwardIdle(); + void evIdleDone(); + void stIdleBlink(); + void stHandleRect(); + void evHandleRectDone(); + void stUpdateMoveDirection(); + void stTurnCar(); void moveToNextPoint(); - void sub45D350(); - void sub45D390(); + void stBrakeMoveToNextPoint(); + void stTurnCarMoveToNextPoint(); void moveToPrevPoint(); - void sub45D580(); - void sub45D5D0(); - void sub45D620(); + void stBrakeMoveToPrevPoint(); + void stTurnCarMoveToPrevPoint(); + void evTurnCarDone(); void suMoveToNextPoint(); void suMoveToPrevPoint(); - void sub45E0A0(); + void updateSound(); }; class AsScene1608Door : public AnimatedSprite { -- cgit v1.2.3 From c09c0b899820d7b0c3fdb5a26b4b6d9d894f68f4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 17 Oct 2012 20:49:43 +0000 Subject: NEVERHOOD: Implement an experimental "render queue" to only draw and update what's actually changed; it works surprisingly well so far and only needs a few more changes here and there --- engines/neverhood/gamemodule.cpp | 7 +- engines/neverhood/graphics.cpp | 16 ++-- engines/neverhood/graphics.h | 1 + engines/neverhood/neverhood.cpp | 4 +- engines/neverhood/screen.cpp | 162 ++++++++++++++++++++++++++++++++---- engines/neverhood/screen.h | 40 ++++++++- engines/neverhood/smackerplayer.cpp | 2 +- 7 files changed, 203 insertions(+), 29 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 3d19a59d21..a3c88c2bf4 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -358,12 +358,13 @@ void GameModule::startup() { setGlobalVar(V_CREATURE_ANGRY, 1); setGlobalVar(V_RADIO_ENABLED, 1); setGlobalVar(V_TNT_DUMMY_BUILT, 1); + setGlobalVar(V_FLYTRAP_RING_DOOR, 1); // <<gameState().which = 1; - _vm->gameState().sceneNum = 0; - createModule(2500, -1); + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 3; + createModule(1300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index c5b136f039..cd2234dd81 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -28,7 +28,7 @@ namespace Neverhood { BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height) : _vm(vm), _priority(priority), _visible(true), _transparent(true), - _clipRects(NULL), _clipRectsCount(0) { + _clipRects(NULL), _clipRectsCount(0), _version(0) { _drawRect.x = 0; _drawRect.y = 0; @@ -54,11 +54,11 @@ BaseSurface::~BaseSurface() { void BaseSurface::draw() { if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { if (_clipRects && _clipRectsCount) { - _vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent); + _vm->_screen->drawSurfaceClipRects(_surface, _drawRect, _clipRects, _clipRectsCount, _transparent, _version); } else if (_sysRect.x == 0 && _sysRect.y == 0) { - _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent); + _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _version); } else { - _vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent); + _vm->_screen->drawUnk(_surface, _drawRect, _sysRect, _clipRect, _transparent, _version); } } } @@ -69,6 +69,7 @@ void BaseSurface::addDirtyRect() { void BaseSurface::clear() { _surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), 0); + ++_version; } void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { @@ -76,6 +77,7 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { spriteResource.getDimensions().height <= _drawRect.height) { clear(); spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false); + ++_version; } } @@ -89,6 +91,7 @@ void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flip if (_surface) { clear(); spriteResource.draw((byte*)_surface->pixels, _surface->pitch, flipX, flipY); + ++_version; } } } @@ -102,6 +105,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, clear(); if (frameIndex < animResource.getFrameCount()) { animResource.draw(frameIndex, (byte*)_surface->pixels, _surface->pitch, flipX, flipY); + ++_version; } } } @@ -109,6 +113,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum) { if (frameNum < 3) { mouseCursorResource.draw(frameNum, (byte*)_surface->pixels, _surface->pitch); + ++_version; } } @@ -132,6 +137,7 @@ void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, N dest += _surface->pitch; } } + ++_version; } // ShadowSurface @@ -143,7 +149,7 @@ ShadowSurface::ShadowSurface(NeverhoodEngine *vm, int priority, int16 width, int void ShadowSurface::draw() { if (_surface && _visible && _drawRect.width > 0 && _drawRect.height > 0) { - _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _shadowSurface->getSurface()); + _vm->_screen->drawSurface2(_surface, _drawRect, _clipRect, _transparent, _version, _shadowSurface->getSurface()); } } diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 08357ea8ca..f27ee6295e 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -118,6 +118,7 @@ protected: NRect *_clipRects; uint _clipRectsCount; bool _transparent; + byte _version; }; class ShadowSurface : public BaseSurface { diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 5152def96a..6a06ad66f6 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -153,12 +153,14 @@ Common::Error NeverhoodEngine::run() { if (_system->getMillis() >= nextFrameTime) { _gameModule->handleUpdate(); _gameModule->draw(); + _screen->update(); nextFrameTime = _screen->getNextFrameTime(); }; _soundMan->update(); _audioResourceMan->update(); - _screen->update(); + //_screen->update(); + _system->updateScreen(); _system->delayMillis(10); debug(0, "---------------------------------------"); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index f9e8d49743..a5f7b4dac7 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -33,9 +33,14 @@ Screen::Screen(NeverhoodEngine *vm) _backScreen = new Graphics::Surface(); _backScreen->create(640, 480, Graphics::PixelFormat::createFormatCLUT8()); + _renderQueue = new RenderQueue(); + _prevRenderQueue = new RenderQueue(); + } Screen::~Screen() { + delete _renderQueue; + delete _prevRenderQueue; _backScreen->free(); delete _backScreen; } @@ -43,9 +48,65 @@ Screen::~Screen() { void Screen::update() { _ticks = _vm->_system->getMillis(); updatePalette(); - // TODO: Implement actual code - _vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480); - _vm->_system->updateScreen(); + + if (_fullRefresh) { + // NOTE When playing a fullscreen/doubled Smacker video usually a full screen refresh is needed + _vm->_system->copyRectToScreen((const byte*)_backScreen->pixels, _backScreen->pitch, 0, 0, 640, 480); + _fullRefresh = false; + return; + } + + // NOTE This is more or less experimental code for a smart "render queue". + // It works well so far but needs some optimizing, e.g. reducing overdraw. + // Maybe I'll use my microtiles code from the Toltecs engine. + // Also better move this to a separate method or even class. + + Common::Array updateRects; + + for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) + (*jt)._refresh = true; + + for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { + RenderItem &renderItem = (*it); + renderItem._refresh = true; + for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) { + RenderItem &prevRenderItem = (*jt); + if (prevRenderItem == renderItem) { + prevRenderItem._refresh = false; + renderItem._refresh = false; + } + } + } + + for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) { + RenderItem &prevRenderItem = (*jt); + if (prevRenderItem._refresh) + updateRects.push_back(Common::Rect(prevRenderItem._destX, prevRenderItem._destY, prevRenderItem._destX + prevRenderItem._width, prevRenderItem._destY + prevRenderItem._height)); + } + + for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { + RenderItem &renderItem = (*it); + if (renderItem._refresh) + updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height)); + } + + /* + for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) + debug("## (%d, %d, %d, %d)", (*ri).left, (*ri).top, (*ri).right, (*ri).bottom); + */ + + for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { + RenderItem &renderItem = (*it); + for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) + blitRenderItem(renderItem, *ri); + } + + SWAP(_renderQueue, _prevRenderQueue); + _renderQueue->clear(); + + for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) + _vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr((*ri).left, (*ri).top), _backScreen->pitch, (*ri).left, (*ri).top, (*ri).width(), (*ri).height()); + } uint32 Screen::getNextFrameTime() { @@ -99,7 +160,7 @@ void Screen::clear() { memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); } -void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, +void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version, const Graphics::Surface *shadowSurface) { int16 destX, destY; @@ -133,7 +194,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, //debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); - blit(surface, destX, destY, ddRect, transparent, shadowSurface); + queueBlit(surface, destX, destY, ddRect, transparent, version, shadowSurface); // Useful for debugging //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); @@ -142,7 +203,7 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, } -void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent) { +void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version) { int16 destX, destY; NRect ddRect; @@ -173,7 +234,7 @@ void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, ND ddRect.y1 = drawRect.y; } - blit(surface, destX, destY, ddRect, transparent); + queueBlit(surface, destX, destY, ddRect, transparent, version); } @@ -220,7 +281,7 @@ void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &dra const byte *source = (const byte*)surface->getBasePtr(0, 0); byte *dest = (byte*)_backScreen->getBasePtr(drawRect.x, drawRect.y); - + for (int16 yc = 0; yc < surface->h; yc++) { byte *row = dest; for (int16 xc = 0; xc < surface->w; xc++) { @@ -231,10 +292,12 @@ void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &dra dest += _backScreen->pitch; dest += _backScreen->pitch; } + + _fullRefresh = true; // See Screen::update } -void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent) { +void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version) { int16 x, y; bool xflag, yflag; @@ -271,7 +334,7 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra newDrawRect.height = drawRect.height; } - drawSurface3(surface, drawRect.x, drawRect.y, newDrawRect, clipRect, transparent); + drawSurface3(surface, drawRect.x, drawRect.y, newDrawRect, clipRect, transparent, version); if (!xflag) { newDrawRect.x = 0; @@ -280,7 +343,7 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra newDrawRect.height = sysRect.height - y; if (drawRect.height < newDrawRect.height) newDrawRect.height = drawRect.height; - drawSurface3(surface, sysRect.width + drawRect.x - x, drawRect.y, newDrawRect, clipRect, transparent); + drawSurface3(surface, sysRect.width + drawRect.x - x, drawRect.y, newDrawRect, clipRect, transparent, version); } if (!yflag) { @@ -290,7 +353,7 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra newDrawRect.height = y + drawRect.height - sysRect.height; if (drawRect.width < newDrawRect.width) newDrawRect.width = drawRect.width; - drawSurface3(surface, drawRect.x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent); + drawSurface3(surface, drawRect.x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent, version); } if (!xflag && !yflag) { @@ -298,15 +361,84 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra newDrawRect.y = 0; newDrawRect.width = x + drawRect.width - sysRect.width; newDrawRect.height = y + drawRect.height - sysRect.height; - drawSurface3(surface, sysRect.width + drawRect.x - x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent); + drawSurface3(surface, sysRect.width + drawRect.x - x, sysRect.height + drawRect.y - y, newDrawRect, clipRect, transparent, version); } } -void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent) { +void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version) { NDrawRect clipDrawRect(0, 0, drawRect.width, drawRect.height); for (uint i = 0; i < clipRectsCount; i++) - drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent); + drawSurface3(surface, drawRect.x, drawRect.y, clipDrawRect, clipRects[i], transparent, version); +} + +void Screen::queueBlit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, byte version, + const Graphics::Surface *shadowSurface) { + + int width = ddRect.x2 - ddRect.x1; + int height = ddRect.y2 - ddRect.y1; + + if (width <= 0 || height <= 0) + return; + + RenderItem renderItem; + renderItem._surface = surface; + renderItem._shadowSurface = shadowSurface; + renderItem._destX = destX; + renderItem._destY = destY; + renderItem._srcX = ddRect.x1; + renderItem._srcY = ddRect.y1; + renderItem._width = width; + renderItem._height = height; + renderItem._transparent = transparent; + renderItem._version = version; + _renderQueue->push_back(renderItem); + +} + +void Screen::blitRenderItem(const RenderItem &renderItem, const Common::Rect &clipRect) { + + const Graphics::Surface *surface = renderItem._surface; + const Graphics::Surface *shadowSurface = renderItem._shadowSurface; + const int16 x0 = MAX(clipRect.left, renderItem._destX); + const int16 y0 = MAX(clipRect.top, renderItem._destY); + const int16 x1 = MIN(clipRect.right, renderItem._destX + renderItem._width); + const int16 y1 = MIN(clipRect.bottom, renderItem._destY + renderItem._height); + int16 width = x1 - x0; + int16 height = y1 - y0; + + if (width < 0 || height < 0) + return; + + const byte *source = (const byte*)surface->getBasePtr(renderItem._srcX + x0 - renderItem._destX, renderItem._srcY + y0 - renderItem._destY); + byte *dest = (byte*)_backScreen->getBasePtr(x0, y0); + + if (shadowSurface) { + const byte *shadowSource = (const byte*)shadowSurface->getBasePtr(x0, y0); + while (height--) { + for (int xc = 0; xc < width; xc++) + if (source[xc] != 0) + dest[xc] = shadowSource[xc]; + source += surface->pitch; + shadowSource += shadowSurface->pitch; + dest += _backScreen->pitch; + } + } else if (!renderItem._transparent) { + while (height--) { + memcpy(dest, source, width); + source += surface->pitch; + dest += _backScreen->pitch; + } + } else { + while (height--) { + for (int xc = 0; xc < width; xc++) + if (source[xc] != 0) + dest[xc] = source[xc]; + source += surface->pitch; + dest += _backScreen->pitch; + } + } + } } // End of namespace Neverhood diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index e3a2bfbef7..bbf4f5fe73 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -23,6 +23,7 @@ #ifndef NEVERHOOD_SCREEN_H #define NEVERHOOD_SCREEN_H +#include "common/array.h" #include "graphics/surface.h" #include "video/smk_decoder.h" #include "neverhood/neverhood.h" @@ -30,6 +31,31 @@ namespace Neverhood { +struct RenderItem { + const Graphics::Surface *_surface; + const Graphics::Surface *_shadowSurface; + int16 _destX, _destY; + int16 _srcX, _srcY, _width, _height; + bool _transparent; + byte _version; + bool _refresh; + bool operator==(const RenderItem &second) const { + return + _surface == second._surface && + _shadowSurface == second._shadowSurface && + _destX == second._destX && + _destY == second._destY && + _srcX == second._srcX && + _srcY == second._srcY && + _width == second._width && + _height == second._height && + _transparent == second._transparent && + _version == second._version; + } +}; + +typedef Common::Array RenderQueue; + class Screen { public: Screen(NeverhoodEngine *vm); @@ -43,16 +69,19 @@ public: void testPalette(byte *paletteData); void updatePalette(); void clear(); - void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, + void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version, const Graphics::Surface *shadowSurface = NULL); - void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent); + void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version); void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect); void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, const Graphics::Surface *shadowSurface = NULL); void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); - void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent); - void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent); + void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version); + void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version); void setSmackerDecoder(Video::SmackerDecoder *smackerDecoder) { _smackerDecoder = smackerDecoder; } + void queueBlit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, byte version, + const Graphics::Surface *shadowSurface = NULL); + void blitRenderItem(const RenderItem &renderItem, const Common::Rect &clipRect); protected: NeverhoodEngine *_vm; Graphics::Surface *_backScreen; @@ -61,6 +90,9 @@ protected: int32 _frameDelay; byte *_paletteData; bool _paletteChanged; + // + bool _fullRefresh; + RenderQueue *_renderQueue, *_prevRenderQueue; }; } // End of namespace Neverhood diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index b491bc5789..d7a244ba94 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -36,7 +36,7 @@ SmackerSurface::SmackerSurface(NeverhoodEngine *vm) void SmackerSurface::draw() { if (_smackerFrame && _visible && _drawRect.width > 0 && _drawRect.height > 0) - _vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false); + _vm->_screen->drawSurface2(_smackerFrame, _drawRect, _clipRect, false, ++_version); } void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) { -- cgit v1.2.3 From 4295991d194404b6e2bbbddb1de2f82eae685739 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 11:14:36 +0000 Subject: NEVERHOOD: Use hardcoded values as width/height of several sprites (in the original the values were loaded from the entry's extData but since all values are constant anyway it shouldn't matter) --- engines/neverhood/module1100.cpp | 3 +-- engines/neverhood/module1300.cpp | 6 ++---- engines/neverhood/module1400.cpp | 18 ++++++------------ engines/neverhood/module1600.cpp | 3 +-- engines/neverhood/module2100.cpp | 3 +-- engines/neverhood/module2400.cpp | 2 +- engines/neverhood/module2700.cpp | 2 +- engines/neverhood/module2800.cpp | 2 +- 8 files changed, 14 insertions(+), 25 deletions(-) diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index e46ed262ec..b825ced051 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -353,8 +353,7 @@ void SsScene1105SymbolDie::hide() { AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - // TODO createSurface3(100, dword_4AF4C0); - createSurface(100, 640, 480); //TODO: Remeove once the line above is done + createSurface(100, 556, 328); _x = 320; _y = 240; SetUpdateHandler(&AnimatedSprite::update); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index c81cbaa144..3f606e7e4b 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -581,8 +581,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - // TODO createSurface3(200, dword_4AF9F8); - createSurface(200, 640, 480); //TODO: Remeove once the line above is done + createSurface(200, 128, 315); _x = 289; _y = 390; SetUpdateHandler(&AnimatedSprite::update); @@ -1119,8 +1118,7 @@ AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint ind _x = pt.x; _y = pt.y; - // TODO createSurface3(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], fileHashes); - createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 640, 480); //TODO: Remeove once the line above is done + createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 190, 148); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1307Key::handleMessage); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 82ac01d783..e4e2550967 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -137,8 +137,7 @@ void Module1400::updateScene() { AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) { - // TODO createSurface3(900, dword_4B6768); - createSurface(900, 640, 480); //TODO: Remeove once the line above is done + createSurface(900, 152, 147); _x = 454; _y = 217; SetMessageHandler(&AsScene1401Pipe::handleMessage); @@ -224,8 +223,7 @@ void AsScene1401Pipe::stSuckInProjector() { AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100) { - // TODO createSurface3(100, dword_4B6778); - createSurface(100, 640, 480); //TODO: Remeove once the line above is done + createSurface(100, 71, 41); _x = 478; _y = 433; SetUpdateHandler(&AnimatedSprite::update); @@ -271,8 +269,7 @@ void AsScene1401Mouse::stSuckedIn() { AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100) { - // TODO createSurface3(200, dword_4B6768); - createSurface(200, 640, 480); //TODO: Remeove once the line above is done + createSurface(200, 152, 147); _x = 427; _y = 433; SetUpdateHandler(&AnimatedSprite::update); @@ -388,8 +385,7 @@ AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sp : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) { _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)]; - // TODO createSurface3(990, dword_4B26D8); - createSurface(990, 640, 480); //TODO: Remeove once the line above is done + createSurface(990, 101, 182); startAnimation(0x10E3042B, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsCommonProjector::handleMessage); @@ -803,8 +799,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - // TODO createSurface3(900, dword_4B6768); - createSurface(900, 640, 480); //TODO: Remeove once the line above is done + createSurface(900, 152, 147); SetFilterY(&Sprite::defFilterY); SetUpdateHandler(&AnimatedSprite::update); @@ -1105,8 +1100,7 @@ static const struct { AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) { - // TODO createSurface3(100, dword_4B05B0); - createSurface(100, 640, 480); //TODO: Remeove once the line above is done + createSurface(100, 117, 45); SetUpdateHandler(&AnimatedSprite::update); _x = 108; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index ae8fd7fabc..a69b8d0140 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -186,8 +186,7 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 SetMessageHandler(&AsCommonCar::handleMessage); SetSpriteUpdate(NULL); - // TODO createSurface2(200, dword_4AF4C0); - createSurface(200, 640, 480); //TODO: Remove once the line above is done + createSurface(200, 556, 328); _x = x; _y = y; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 700f0cdbd8..950b64d229 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -80,8 +80,7 @@ void Module2100::updateScene() { AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag) : AnimatedSprite(vm, 1100) { - // TODO createSurface3(100, dword_4B9018); - createSurface(100, 640, 480); //TODO: Remove once the line above is done + createSurface(100, 328, 347); _x = 320; _y = 240; SetUpdateHandler(&AnimatedSprite::update); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index c75e85b2bf..f791c8ea13 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -635,7 +635,7 @@ void AsScene2402Door::stDoorClosingFinished() { AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) { - createSurface(100, 640, 480); // TODO Use correct size from the two hashes + createSurface(100, 127, 90); SetMessageHandler(&Sprite::handleMessage); _x = 260; _y = 210; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 9bac035a38..9ff0da1424 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -523,7 +523,7 @@ AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) { SetUpdateHandler(&AsCommonCarShadow::update); - createShadowSurface(shadowSurface, 320, 240, 100); // TODO Use actual dimensions from resource + createShadowSurface(shadowSurface, 211, 147, 100); updateShadow(); } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index a1a93bd1de..1b039685c6 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -675,7 +675,7 @@ AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentSce : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), _isPulled(false), _isBusy(false) { - createSurface(1010, 640, 480); // TODO Use correct size from the two hashes + createSurface(1010, 28, 379); SetUpdateHandler(&AnimatedSprite::update); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); _x = x; -- cgit v1.2.3 From a238f57805880b63a753d68abe726d2a6dfad21b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 11:19:14 +0000 Subject: NEVERHOOD: Remove DirtyBackground which became obsolete after the renderqueue stuff --- engines/neverhood/background.cpp | 33 --------------------------------- engines/neverhood/background.h | 9 --------- engines/neverhood/module2800.cpp | 2 +- engines/neverhood/scene.cpp | 4 ++-- engines/neverhood/scene.h | 2 +- 5 files changed, 4 insertions(+), 46 deletions(-) diff --git a/engines/neverhood/background.cpp b/engines/neverhood/background.cpp index 03c531f40a..0a80bd8390 100644 --- a/engines/neverhood/background.cpp +++ b/engines/neverhood/background.cpp @@ -57,37 +57,4 @@ void Background::load(uint32 fileHash) { _surface->drawSpriteResource(_spriteResource); } -// DirtyBackground - -DirtyBackground::DirtyBackground(NeverhoodEngine *vm, int objectPriority) - : Background(vm, objectPriority) { - // Empty -} - -DirtyBackground::DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority) - : Background(vm, objectPriority) { - - _spriteResource.load(calcHash(fileName)); - createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _surface->drawSpriteResource(_spriteResource); -} - -DirtyBackground::DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority) - : Background(vm, objectPriority) { - - _spriteResource.load(fileHash); - createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _surface->drawSpriteResource(_spriteResource); -} - -void DirtyBackground::createSurface(int surfacePriority, int16 width, int16 height) { - - // TODO: Later use a DirtySurface once it is implemented - _surface = new BaseSurface(_vm, surfacePriority, width, height); - _surface->setTransparent(false); - _spriteResource.getPosition().x = width; - _spriteResource.getPosition().y = height; - -} - } // End of namespace Neverhood diff --git a/engines/neverhood/background.h b/engines/neverhood/background.h index d8f624b73d..ef88be21c0 100644 --- a/engines/neverhood/background.h +++ b/engines/neverhood/background.h @@ -44,15 +44,6 @@ protected: SpriteResource _spriteResource; }; -class DirtyBackground : public Background { -public: - DirtyBackground(NeverhoodEngine *vm, int objectPriority); - DirtyBackground(NeverhoodEngine *vm, const char *fileName, int objectPriority, int surfacePriority); - DirtyBackground(NeverhoodEngine *vm, uint32 fileHash, int objectPriority, int surfacePriority); - void createSurface(int surfacePriority, int16 width, int16 height); - -}; - } // End of namespace Neverhood #endif /* NEVERHOOD_BACKGROUND_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 1b039685c6..140e1125c2 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -845,7 +845,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) _surfaceFlag = true; - _background = new DirtyBackground(_vm, 0); + _background = new Background(_vm, 0); _background->createSurface(0, 640, 480); addBackground(_background); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index b75515f325..c706ecc5dc 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -183,8 +183,8 @@ Background *Scene::addBackground(Background *background) { return background; } -void Scene::setBackground(uint32 fileHash, bool dirtyBackground) { - _background = addBackground(new DirtyBackground(_vm, fileHash, 0, 0)); +void Scene::setBackground(uint32 fileHash) { + _background = addBackground(new Background(_vm, fileHash, 0, 0)); } void Scene::changeBackground(uint32 fileHash) { diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index a0f7dafd25..11c00d9e3c 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -52,7 +52,7 @@ public: void setSpriteSurfacePriority(Sprite *sprite, int priority); void deleteSprite(Sprite **sprite); Background *addBackground(Background *background); - void setBackground(uint32 fileHash, bool dirtyBackground = true); + void setBackground(uint32 fileHash); void changeBackground(uint32 fileHash); void setBackgroundY(int16 y) { _background->getSurface()->getDrawRect().y = y; } int16 getBackgroundY() { return _background->getSurface()->getDrawRect().y; } -- cgit v1.2.3 From a6e9475a3fd49bab9ff463f87734d27782297cdb Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 11:23:34 +0000 Subject: NEVERHOOD: Remove Scene::_surfaceFlag which also is obsolete now --- engines/neverhood/diskplayerscene.cpp | 2 -- engines/neverhood/module1000.cpp | 9 --------- engines/neverhood/module1100.cpp | 2 -- engines/neverhood/module1200.cpp | 4 ---- engines/neverhood/module1300.cpp | 6 ------ engines/neverhood/module1400.cpp | 6 ------ engines/neverhood/module1500.cpp | 2 -- engines/neverhood/module1600.cpp | 2 -- engines/neverhood/module1700.cpp | 2 -- engines/neverhood/module1900.cpp | 3 --- engines/neverhood/module2000.cpp | 1 - engines/neverhood/module2100.cpp | 1 - engines/neverhood/module2200.cpp | 10 ---------- engines/neverhood/module2400.cpp | 4 ---- engines/neverhood/module2500.cpp | 2 -- engines/neverhood/module2600.cpp | 1 - engines/neverhood/module2700.cpp | 5 ----- engines/neverhood/module2800.cpp | 14 -------------- engines/neverhood/module2900.cpp | 1 - engines/neverhood/module3000.cpp | 4 ---- engines/neverhood/scene.cpp | 17 +---------------- engines/neverhood/scene.h | 2 -- 22 files changed, 1 insertion(+), 99 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index d69182b57e..0371903e31 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -334,8 +334,6 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int int availableDisksCount = 0; - _surfaceFlag = true; - setBackground(0x8A000044); setPalette(kDiskplayerPaletteFileHashes[paletteIndex]); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 461f8738d4..8e6b56b9f0 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -339,7 +339,6 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1001::handleMessage); setHitRects(0x004B4860); - _surfaceFlag = false; setBackground(0x4086520E); setPalette(0x4086520E); insertMouse433(0x6520A400); @@ -1279,8 +1278,6 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B4138); - _surfaceFlag = true; - setBackground(0x12C23307); setPalette(0x12C23307); @@ -1530,8 +1527,6 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) : Scene(vm, parentModule, true) { - _surfaceFlag = false; - SetMessageHandler(&StaticScene::handleMessage); setBackground(backgroundFileHash); @@ -1588,8 +1583,6 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; - SetUpdateHandler(&Scene1004::update); SetMessageHandler(&Scene1004::handleMessage); @@ -1687,8 +1680,6 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1005::handleMessage); - _surfaceFlag = true; - if (getGlobalVar(V_ENTRANCE_OPEN)) { setBackground(0x2800E011); setPalette(0x2800E011); diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index b825ced051..9bd7b8887a 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -452,7 +452,6 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene1405Vars(); - _surfaceFlag = true; SetUpdateHandler(&Scene1105::update); SetMessageHandler(&Scene1105::handleMessage); @@ -668,7 +667,6 @@ void Scene1105::update() { Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, which) { - _surfaceFlag = true; SetMessageHandler(&Scene1109::handleMessage); setBackground(0x8449E02F); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index fecb66a3b6..c0bab71f52 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -726,8 +726,6 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004AEBD0); - _surfaceFlag = true; - if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) { setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1); for (uint32 index = 0; index < 18; index++) { @@ -1091,8 +1089,6 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1202::handleMessage); SetUpdateHandler(&Scene1202::update); - _surfaceFlag = true; - setBackground(0x60210ED5); setPalette(0x60210ED5); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 3f606e7e4b..f718d1efe9 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -630,7 +630,6 @@ void AsScene1303Balloon::stPopBalloon() { Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _surfaceFlag = true; SetMessageHandler(&Scene1303::handleMessage); setRectList(0x004AF9E8); @@ -694,7 +693,6 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _surfaceFlag = true; SetMessageHandler(&Scene1304::handleMessage); setRectList(0x004B91A8); @@ -761,7 +759,6 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _surfaceFlag = true; SetMessageHandler(&Scene1305::handleMessage); setRectList(0x004B6E98); @@ -876,7 +873,6 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 4); - _surfaceFlag = true; SetMessageHandler(&Scene1306::handleMessage); setBackground(0x05303114); @@ -1275,7 +1271,6 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) _keyHoleRects[i].y2 = pt.y + 15; } - _surfaceFlag = true; SetMessageHandler(&Scene1307::handleMessage); SetUpdateHandler(&Scene1307::update); @@ -1575,7 +1570,6 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene1307Vars(); - _surfaceFlag = true; SetMessageHandler(&Scene1308::handleMessage); setBackground(0x41024202); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index e4e2550967..1bb0548fd4 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -647,7 +647,6 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1401::handleMessage); SetUpdateHandler(&Scene1401::update); setRectList(0x004B6758); - _surfaceFlag = true; setBackground(0x08221FA5); setPalette(0x08221FA5); @@ -1243,8 +1242,6 @@ void AsScene1407Mouse::stArriveAtHole() { Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { - _surfaceFlag = true; - SetMessageHandler(&Scene1407::handleMessage); SetUpdateHandler(&Scene1407::update); @@ -1307,7 +1304,6 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1403::handleMessage); setRectList(0x004B1FF8); - _surfaceFlag = true; setBackground(0x2110A234); setPalette(0x2110A234); @@ -1418,7 +1414,6 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_KEY3_LOCATION, 5); SetMessageHandler(&Scene1404::handleMessage); - _surfaceFlag = true; setRectList(0x004B8D80); @@ -1590,7 +1585,6 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { _vm->gameModule()->initScene1405Vars(); - _surfaceFlag = true; setBackground(0x0C0C007D); setPalette(0x0C0C007D); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index b62ff01494..0b55209b9f 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -88,8 +88,6 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); - _surfaceFlag = true; - setBackground(backgroundFileHash); setPalette(); diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index a69b8d0140..382aedde38 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1076,7 +1076,6 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_CAR_DELTA_X, 1); - _surfaceFlag = true; SetMessageHandler(&Scene1608::hmLowerFloor); _asKey = insertSprite(this, 1, 1100, 198, 220); @@ -1396,7 +1395,6 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) // TODO _vm->gameModule()->initScene3011Vars(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); - _surfaceFlag = true; SetMessageHandler(&Scene1609::handleMessage); SetUpdateHandler(&Scene1609::update); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index adbd853664..ae97c151f7 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -194,8 +194,6 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B69D8); - _surfaceFlag = true; - setBackground(0x03118226); setPalette(0x03118226); diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 9db150338a..c4a0904232 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -91,8 +91,6 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; - setRectList(0x004B34C8); setBackground(0x01303227); @@ -559,7 +557,6 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { - _surfaceFlag = true; setBackground(0x20628E05); setPalette(0x20628E05); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index bd5597dbf8..a97cbaa1ae 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -100,7 +100,6 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; SetMessageHandler(&Scene2001::handleMessage); setBackground(0xA6417244); diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 950b64d229..58f87d9afb 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -203,7 +203,6 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; SetMessageHandler(&Scene2101::handleMessage); SetUpdateHandler(&Scene2101::update); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 1b07890156..1159c0b1da 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -508,7 +508,6 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) // TODO _vm->gameModule()->initScene2201Vars(); } - _surfaceFlag = true; SetMessageHandler(&Scene2201::handleMessage); SetUpdateHandler(&Scene2201::update); @@ -892,8 +891,6 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2202::handleMessage); SetUpdateHandler(&Scene2202::update); - _surfaceFlag = true; - setBackground(0x08100A0C); setPalette(0x08100A0C); addEntity(_palette); @@ -1115,7 +1112,6 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_KEY3_LOCATION, 1); SetMessageHandler(&Scene2203::handleMessage); - _surfaceFlag = true; setBackground(0x82C80334); setPalette(0x82C80334); @@ -1268,7 +1264,6 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2205::update); setHitRects(0x004B0620); - _surfaceFlag = true; if (getGlobalVar(V_LIGHTS_ON)) { _isLightOn = true; @@ -1520,7 +1515,6 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene::update); SetMessageHandler(&Scene2206::handleMessage); - _surfaceFlag = true; if (getGlobalVar(V_LIGHTS_ON)) { fileHash = 0x41983216; @@ -2016,7 +2010,6 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2207::handleMessage); SetUpdateHandler(&Scene2207::update); - _surfaceFlag = true; insertKlayman(0, 0); _klayman->setRepl(64, 0); @@ -2405,7 +2398,6 @@ static const uint32 kScene2242MessageListIds1[] = { Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _isKlaymanInLight(false) { - _surfaceFlag = true; SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); @@ -2525,7 +2517,6 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule _sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id); - _surfaceFlag = true; SetMessageHandler(&HallOfRecordsScene::handleMessage); SetUpdateHandler(&Scene::update); @@ -2617,7 +2608,6 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) //DEBUG setGlobalVar(V_LIGHTS_ON, 1); - _surfaceFlag = true; SetMessageHandler(&Scene2247::handleMessage); SetUpdateHandler(&Scene::update); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index f791c8ea13..94937bf874 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -392,7 +392,6 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube - _surfaceFlag = true; SetMessageHandler(&Scene2401::handleMessage); SetUpdateHandler(&Scene2401::update); @@ -721,7 +720,6 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; SetMessageHandler(&Scene2402::handleMessage); SetUpdateHandler(&Scene2402::update); @@ -825,7 +823,6 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite1, *tempSprite2, *tempSprite3; - _surfaceFlag = true; SetMessageHandler(&Scene2403::handleMessage); setBackground(0x0C05060C); setPalette(0x0C05060C); @@ -922,7 +919,6 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 2); - _surfaceFlag = true; SetMessageHandler(&Scene2406::handleMessage); setRectList(0x004B78C8); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index c9bffe527e..19779c3234 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -227,7 +227,6 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_CAR_DELTA_X, 1); SetUpdateHandler(&Scene2501::update); - _surfaceFlag = true; setBackground(0x1B8E8115); setPalette(0x1B8E8115); _palette->addPalette(0x00128842, 65, 31, 65); @@ -551,7 +550,6 @@ Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *ssButton; - _surfaceFlag = true; setBackground(0x90791B80); setPalette(0x90791B80); ssButton = insertSprite(); diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 6eebd403f8..37e4406205 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -306,7 +306,6 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _isBusy(false) { - _surfaceFlag = true; setBackground(0x51409A16); setPalette(0x51409A16); _asWater = insertSprite(); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 9ff0da1424..870c14ced4 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -592,8 +592,6 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240); setGlobalVar(V_CAR_DELTA_X, 1); - _surfaceFlag = true; - setBackground(sceneInfo->bgFilename); setPalette(sceneInfo->bgFilename); @@ -705,7 +703,6 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) for (int j = 0; j < 3; j++) _sceneInfos[i][j] = _vm->_staticData->getSceneInfo2700(kScene2702Infos[i][j]); - _surfaceFlag = true; SetMessageHandler(&Scene2702::handleMessage); SetUpdateHandler(&Scene2702::update); @@ -875,7 +872,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); - _surfaceFlag = true; SetMessageHandler(&Scene2704::handleMessage); SetUpdateHandler(&Scene2704::update); @@ -988,7 +984,6 @@ static const struct { const char *pointListName; int which1, which2; } kSceneInf Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _newTrackIndex(-1) { - _surfaceFlag = true; SetMessageHandler(&Scene2706::handleMessage); setBackground(0x18808B88); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 140e1125c2..c1e1790040 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -404,7 +404,6 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene2801Vars(); - _surfaceFlag = true; SetMessageHandler(&Scene2801::handleMessage); SetUpdateHandler(&Scene::update); @@ -512,7 +511,6 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0); //DEBUG<<< - _surfaceFlag = true; SetMessageHandler(&Scene2802::handleMessage); SetUpdateHandler(&Scene2802::update); insertMouse435(0x008810A8, 20, 620); @@ -843,8 +841,6 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x00900849); - _surfaceFlag = true; - _background = new Background(_vm, 0); _background->createSurface(0, 640, 480); addBackground(_background); @@ -1126,7 +1122,6 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh 0, 0x286800D4, 0x286806D4, 0x28680AD4 }; - _surfaceFlag = true; SetMessageHandler(&Scene2803Small::handleMessage); loadDataResource(0x81120132); @@ -1818,7 +1813,6 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) initCrystalColors(); - _surfaceFlag = true; SetMessageHandler(&Scene2804::handleMessage); SetUpdateHandler(&Scene2804::update); @@ -1969,7 +1963,6 @@ void Scene2804::initCrystalColors() { Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _surfaceFlag = true; SetMessageHandler(&Scene2805::handleMessage); setBackground(0x08021E04); @@ -2058,7 +2051,6 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; SetMessageHandler(&Scene2806::handleMessage); SetUpdateHandler(&Scene2806::update); @@ -2178,7 +2170,6 @@ void Scene2806::findClosestPoint() { Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _surfaceFlag = true; SetMessageHandler(&Scene2807::handleMessage); if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 1) { @@ -2205,7 +2196,6 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x31203460, 100); } - _surfaceFlag = true; setBackground(0x3E049A95); setPalette(0x3E049A95); insertMouse435(0x49A913E8, 20, 620); @@ -2536,7 +2526,6 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene2808Vars2(); } - _surfaceFlag = true; SetMessageHandler(&Scene2808::handleMessage); SetUpdateHandler(&Scene2808::update); @@ -2661,7 +2650,6 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; SetMessageHandler(&Scene2809::handleMessage); SetUpdateHandler(&Scene2809::update); @@ -2809,7 +2797,6 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _surfaceFlag = true; SetMessageHandler(&Scene2810::handleMessage); setBackground(0x26508804); @@ -3127,7 +3114,6 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 3); - _surfaceFlag = true; SetMessageHandler(&Scene2812::handleMessage); SetUpdateHandler(&Scene2812::update); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 0a033a8120..976cf5d9f6 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -401,7 +401,6 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) if (_currLocationButtonNum == 3) setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1); - _surfaceFlag = true; setBackground(kScene2901FileHashes1[_currLocationButtonNum]); setPalette(kScene2901FileHashes1[_currLocationButtonNum]); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 6d394a859f..c3eb9e458d 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -805,7 +805,6 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _vm->gameModule()->initScene3009Vars(); setGlobalVar(V_CANNON_SMACKER_NAME, 0); - _surfaceFlag = true; _vm->_screen->clear(); @@ -1293,8 +1292,6 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1); setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1); - _surfaceFlag = true; - setBackground(0x80802626); setPalette(0x80802626); @@ -1533,7 +1530,6 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) // TODO _vm->gameModule()->initScene3011Vars(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); - _surfaceFlag = true; SetMessageHandler(&Scene3011::handleMessage); SetUpdateHandler(&Scene3011::update); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index c706ecc5dc..ac08c1483f 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -48,7 +48,6 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _vm->_screen->setSmackerDecoder(NULL); // TODO g_screen->resetDirtyRects(); _canAcceptInput = true; - _surfaceFlag = false; _messageList2 = NULL; _smackerPlayer = NULL; _isMessageListBusy = false; @@ -75,25 +74,11 @@ Scene::~Scene() { void Scene::draw() { if (_smackerPlayer) { - if (_surfaceFlag) { - // TODO g_screen->resetDirtyRects(); - // TODO g_screen->copyDirtyRects(); - // TODO g_screen->addDirtyRects(); - } if (_smackerPlayer->getSurface()) _smackerPlayer->getSurface()->draw(); } else { -#if 0 - if (_surfaceFlag) { - // TODO g_screen->copyDirtyRects(); - for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) - (*iter)->addDirtyRect(); - // TODO g_screen->addDirtyRects(); - } -#endif - for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { + for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) (*iter)->draw(); - } } } diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 11c00d9e3c..c9e27f7bb4 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -160,8 +160,6 @@ protected: Common::Array _entities; Common::Array _surfaces; - bool _surfaceFlag; - Klayman *_klayman; Background *_background; Palette *_palette; -- cgit v1.2.3 From c7ad09c6856cc5e3be805866623d94258360fd60 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 12:44:00 +0000 Subject: NEVERHOOD: Remove BaseSurface::addDirtyRect() which is obsolete as well --- engines/neverhood/graphics.cpp | 4 ---- engines/neverhood/graphics.h | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index cd2234dd81..b87c447b31 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -63,10 +63,6 @@ void BaseSurface::draw() { } } -void BaseSurface::addDirtyRect() { - // TODO -} - void BaseSurface::clear() { _surface->fillRect(Common::Rect(0, 0, _surface->w, _surface->h), 0); ++_version; diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index f27ee6295e..3ca3339585 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -88,7 +88,6 @@ public: BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height); virtual ~BaseSurface(); virtual void draw(); - virtual void addDirtyRect(); void clear(); void drawSpriteResource(SpriteResource &spriteResource); void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height); @@ -118,6 +117,7 @@ protected: NRect *_clipRects; uint _clipRectsCount; bool _transparent; + // Version changes each time the pixels are touched in any way byte _version; }; -- cgit v1.2.3 From 9b7354dacb343a1618f8329c660fcba170f86ede Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 16:50:18 +0000 Subject: NEVERHOOD: Fix mouse cursor visibility by starting out invisible when the Mouse object is created and hiding the cursor when it's destroyed --- engines/neverhood/mouse.cpp | 6 +++++- engines/neverhood/mouse.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index bce66467de..8cd5e602fb 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -42,7 +42,7 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect) Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) : StaticSprite(vm, 2000), _mouseType(kMouseType435), - _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(true) { + _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(false) { init(fileHash); if (_x <= _x1) { @@ -63,6 +63,10 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int type) _mouseCursorResource.setCursorNum(0); } +Mouse::~Mouse() { + CursorMan.showMouse(false); +} + void Mouse::init(uint32 fileHash) { _mouseCursorResource.load(fileHash); _x = _vm->getMouseX(); diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index a163a7a01c..2b0e8b720e 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -41,6 +41,7 @@ public: Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect); Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2); Mouse(NeverhoodEngine *vm, uint32 fileHash, int _type); + virtual ~Mouse(); void load(uint32 fileHash); void updateCursor(); protected: -- cgit v1.2.3 From 533eb5d61d6d3f0b7f229648cf186ba1b54e5388 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 17:15:20 +0000 Subject: NEVERHOOD: Rename puzzle initialization methods and give them better names --- engines/neverhood/gamemodule.cpp | 56 ++++++++++++++++++---------------------- engines/neverhood/gamemodule.h | 16 ++++++------ engines/neverhood/module1100.cpp | 2 +- engines/neverhood/module1300.cpp | 4 +-- engines/neverhood/module1400.cpp | 2 +- engines/neverhood/module1700.cpp | 2 +- engines/neverhood/module2200.cpp | 2 +- engines/neverhood/module2400.cpp | 2 +- engines/neverhood/module2700.cpp | 8 +++--- engines/neverhood/module2700.h | 2 +- engines/neverhood/module2800.cpp | 13 +++++----- engines/neverhood/module3000.cpp | 2 +- 12 files changed, 52 insertions(+), 59 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index a3c88c2bf4..80e6fbeaad 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -47,7 +47,7 @@ namespace Neverhood { -static const uint32 kScene2801MusicFileHashes[] = { +static const uint32 kRadioMusicFileHashes[] = { 0x82B22000, 0x02B22004, 0x42B22000, @@ -124,7 +124,7 @@ void GameModule::handleSpaceKey() { } } -void GameModule::initScene1307Vars() { +void GameModule::initKeySlotsPuzzle() { // Exit if it's already initialized if (getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) @@ -162,7 +162,7 @@ void GameModule::initScene1307Vars() { } -void GameModule::initScene1405Vars() { +void GameModule::initMemoryPuzzle() { // TODO: Give better names @@ -261,33 +261,29 @@ void GameModule::initScene1405Vars() { } -void GameModule::initScene2401Vars() { - - if (getSubVar(VA_IS_PUZZLE_INIT, 0x40520234)) - return; - - setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 0, 3); - setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 1, 1); - setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 2, 2); - setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 3, 0); - setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 4, 4); - - setSubVar(VA_IS_PUZZLE_INIT, 0x40520234, 1); - +void GameModule::initWaterPipesPuzzle() { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x40520234)) { + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 0, 3); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 1, 1); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 2, 2); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 3, 0); + setSubVar(VA_GOOD_WATER_PIPES_LEVEL, 4, 4); + setSubVar(VA_IS_PUZZLE_INIT, 0x40520234, 1); + } } -void GameModule::initScene2801Vars() { +void GameModule::initRadioPuzzle() { if (!getSubVar(VA_IS_PUZZLE_INIT, 0x08C80800)) { int currMusicIndex = _vm->_rnd->getRandomNumber(5 - 1) + 3; setGlobalVar(V_GOOD_RADIO_MUSIC_INDEX, 5 * currMusicIndex); - setGlobalVar(V_GOOD_RADIO_MUSIC_NAME, kScene2801MusicFileHashes[currMusicIndex]); + setGlobalVar(V_GOOD_RADIO_MUSIC_NAME, kRadioMusicFileHashes[currMusicIndex]); setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1); setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); setSubVar(VA_IS_PUZZLE_INIT, 0x08C80800, 1); } } -void GameModule::initScene2808Vars1() { +void GameModule::initTestTubes1Puzzle() { if (!getSubVar(VA_IS_PUZZLE_INIT, 0x20479010)) { for (uint i = 0; i < 3; i++) setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, i, _vm->_rnd->getRandomNumber(3 - 1) + 1); @@ -295,7 +291,7 @@ void GameModule::initScene2808Vars1() { } } -void GameModule::initScene2808Vars2() { +void GameModule::initTestTubes2Puzzle() { if (!getSubVar(VA_IS_PUZZLE_INIT, 0x66059818)) { for (uint i = 0; i < 3; i++) setSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, i, _vm->_rnd->getRandomNumber(6 - 1) + 1); @@ -303,7 +299,7 @@ void GameModule::initScene2808Vars2() { } } -void GameModule::initScene3009Vars() { +void GameModule::initCannonSymbolsPuzzle() { if (!getSubVar(VA_IS_PUZZLE_INIT, 0x8C9819C2)) { for (int i = 0; i < 3; i++) { setSubVar(VA_GOOD_CANNON_SYMBOLS_1, i, _vm->_rnd->getRandomNumber(12 - 1)); @@ -313,9 +309,9 @@ void GameModule::initScene3009Vars() { } } -uint32 GameModule::getScene2802MusicFileHash() { +uint32 GameModule::getCurrRadioMusicFileHash() { uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); - return (musicIndex % 5 != 0) ? 0 : kScene2801MusicFileHashes[CLIP(musicIndex / 5, 0, 17)]; + return (musicIndex % 5 != 0) ? 0 : kRadioMusicFileHashes[CLIP(musicIndex / 5, 0, 17)]; } @@ -324,20 +320,18 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti switch (messageNum) { case 0x0800: _someFlag1 = true; - return messageResult; + break; case 0x1009: _moduleResult = param.asInteger(); _done = true; - return messageResult; + break; case 0x100A: - // Unused resource preloading message - return messageResult; + case 0x1023: + // Unused resource preloading messages + break; case 0x101F: _field2C = true; - return messageResult; - case 0x1023: - // Unused resource preloading message - return messageResult; + break; } return messageResult; } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 275e8d3895..eb043cb646 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -39,14 +39,14 @@ public: void handleMouseDown(int16 x, int16 y); void handleMouseUp(int16 x, int16 y); void handleSpaceKey(); - void initScene1307Vars(); - void initScene1405Vars(); - void initScene2401Vars(); - void initScene2801Vars(); - void initScene2808Vars1(); - void initScene2808Vars2(); - void initScene3009Vars(); - uint32 getScene2802MusicFileHash(); + void initKeySlotsPuzzle(); + void initMemoryPuzzle(); + void initWaterPipesPuzzle(); + void initRadioPuzzle(); + void initTestTubes1Puzzle(); + void initTestTubes2Puzzle(); + void initCannonSymbolsPuzzle(); + uint32 getCurrRadioMusicFileHash(); protected: Entity *_prevChildObject; bool _someFlag1; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 9bd7b8887a..6bf61408b7 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -450,7 +450,7 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *ssOpenButton; - _vm->gameModule()->initScene1405Vars(); + _vm->gameModule()->initMemoryPuzzle(); SetUpdateHandler(&Scene1105::update); SetMessageHandler(&Scene1105::handleMessage); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index f718d1efe9..d92cd66bc6 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1258,7 +1258,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - _vm->gameModule()->initScene1307Vars(); + _vm->gameModule()->initKeySlotsPuzzle(); _dataResource.load(0x22102142); _keyHolePoints = _dataResource.getPointArray(0xAC849240); @@ -1568,7 +1568,7 @@ uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam ¶m Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _flag1(false) { - _vm->gameModule()->initScene1307Vars(); + _vm->gameModule()->initKeySlotsPuzzle(); SetMessageHandler(&Scene1308::handleMessage); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 1bb0548fd4..f25efe2027 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1584,7 +1584,7 @@ void AsScene1405Tile::hide() { Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { - _vm->gameModule()->initScene1405Vars(); + _vm->gameModule()->initMemoryPuzzle(); setBackground(0x0C0C007D); setPalette(0x0C0C007D); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index ae97c151f7..7df162c15e 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -187,7 +187,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; setGlobalVar(V_FELL_DOWN_HOLE, 1); - _vm->gameModule()->initScene3009Vars(); + _vm->gameModule()->initCannonSymbolsPuzzle(); SetMessageHandler(&Scene1705::handleMessage); SetUpdateHandler(&Scene1705::update); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 1159c0b1da..028c88359c 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2003,7 +2003,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) //setGlobalVar(V_LIGHTS_ON, 1); //DEBUG<<< - _vm->gameModule()->initScene3009Vars(); + _vm->gameModule()->initCannonSymbolsPuzzle(); if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852)) setSubVar(VA_IS_PUZZLE_INIT, 0x88460852, 1); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 94937bf874..770a5c3301 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -387,7 +387,7 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false), _soundToggle(false), _asWaterSpitIndex(0) { - _vm->gameModule()->initScene2401Vars(); + _vm->gameModule()->initWaterPipesPuzzle(); setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 870c14ced4..60cc581066 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -83,7 +83,7 @@ static const uint32 kScene2725StaticSprites[] = { }; Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundIndex(0), _flag1(false) { + : Module(vm, parentModule), _soundIndex(0), _raidoMusicInitialized(false) { _vm->_soundMan->addMusic(0x42212411, 0x04020210); _vm->_soundMan->startMusic(0x04020210, 24, 2); @@ -454,15 +454,15 @@ void Module2700::updateScene() { } else { switch (_vm->gameState().sceneNum) { case 21: - if (!_flag1) { + if (!_raidoMusicInitialized) { _vm->_soundMan->stopMusic(0x04020210, 0, 1); - _vm->gameModule()->initScene2801Vars(); + _vm->gameModule()->initRadioPuzzle(); _musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME); _vm->_soundMan->addMusic(0x42212411, _musicFileHash); _vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */); _vm->_soundMan->addSound(0x42212411, 0x44014282); _vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0); - _flag1 = true; + _raidoMusicInitialized = true; } break; } diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index d11586ea3e..4973211075 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -38,7 +38,7 @@ public: virtual ~Module2700(); protected: int _soundIndex; - bool _flag1; + bool _raidoMusicInitialized; uint32 _scene2711StaticSprites[6]; uint32 _musicFileHash; void createScene(int sceneNum, int which); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index c1e1790040..174e5e041d 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -372,7 +372,7 @@ void Module2800::updateScene() { void Module2800::updateMusic(bool halfVolume) { - uint32 newMusicFileHash = _vm->_gameModule->getScene2802MusicFileHash(); + uint32 newMusicFileHash = _vm->_gameModule->getCurrRadioMusicFileHash(); if (!_musicResource) _musicResource = new MusicResource(_vm); @@ -402,7 +402,7 @@ void Module2800::updateMusic(bool halfVolume) { Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _vm->gameModule()->initScene2801Vars(); + _vm->gameModule()->initRadioPuzzle(); SetMessageHandler(&Scene2801::handleMessage); SetUpdateHandler(&Scene::update); @@ -657,9 +657,8 @@ void Scene2802::changeTuneStatus(int prevTuneStatus, int newTuneStatus) { } if (newTuneStatus == 0) { - if (_vm->_gameModule->getScene2802MusicFileHash() != 0) { + if (_vm->_gameModule->getCurrRadioMusicFileHash() != 0) _vm->_soundMan->stopSound(0x00632252); - } else _vm->_soundMan->playSoundLooping(0x00632252); } else if (newTuneStatus == 3 || newTuneStatus == 6) { @@ -835,7 +834,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) }; setGlobalVar(V_BEEN_SHRINKING_ROOM, 1); - _vm->gameModule()->initScene2808Vars1(); + _vm->gameModule()->initTestTubes1Puzzle(); SetMessageHandler(&Scene2803::handleMessage); @@ -2521,9 +2520,9 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; if (which == 0) { - _vm->gameModule()->initScene2808Vars1(); + _vm->gameModule()->initTestTubes1Puzzle(); } else { - _vm->gameModule()->initScene2808Vars2(); + _vm->gameModule()->initTestTubes2Puzzle(); } SetMessageHandler(&Scene2808::handleMessage); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index c3eb9e458d..a6bc6eb6fe 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -802,7 +802,7 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS); debug("_cannonTargetStatus = %d", _cannonTargetStatus); - _vm->gameModule()->initScene3009Vars(); + _vm->gameModule()->initCannonSymbolsPuzzle(); setGlobalVar(V_CANNON_SMACKER_NAME, 0); -- cgit v1.2.3 From 126a306c899924cf774dfc0db1111728f9ac366b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 18 Oct 2012 17:36:40 +0000 Subject: NEVERHOOD: Some cleanup: - Remove _name field from Entity (wasn't really maintained by me and became useless) - Remove obsolete TODOs - Add STICK_LAST_FRAME constant for better readability - Remove commented out callbackList TODOs (these were so far never used with over 90% of the game implemented) --- engines/neverhood/entity.cpp | 4 +--- engines/neverhood/entity.h | 4 ---- engines/neverhood/klayman.cpp | 26 +++++++++++++------------- engines/neverhood/module1000.cpp | 10 ++++------ engines/neverhood/module1200.cpp | 16 ++++++++-------- engines/neverhood/module1300.cpp | 12 ++++++------ engines/neverhood/module1400.cpp | 6 +++--- engines/neverhood/module1600.cpp | 2 +- engines/neverhood/module1900.cpp | 4 ++-- engines/neverhood/module2100.cpp | 6 +++--- engines/neverhood/module2200.cpp | 6 +++--- engines/neverhood/module2400.cpp | 6 +++--- engines/neverhood/module2700.cpp | 2 +- engines/neverhood/module2800.cpp | 2 +- engines/neverhood/module3000.cpp | 2 +- engines/neverhood/sprite.cpp | 21 ++++----------------- engines/neverhood/sprite.h | 7 ++----- 17 files changed, 56 insertions(+), 80 deletions(-) diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index 36137a6fb5..29524f8639 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -52,8 +52,7 @@ Entity *MessageParam::asEntity() const { #define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler Entity::Entity(NeverhoodEngine *vm, int priority) - : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL), - _name("Entity") { + : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL) { } Entity::~Entity() { @@ -64,7 +63,6 @@ void Entity::draw() { } void Entity::handleUpdate() { - //debug("Entity(%s).handleUpdate", _name.c_str()); debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str()); if (_updateHandlerCb) (this->*_updateHandlerCb)(); diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 0b3e32c5e8..89a1a42eb4 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -53,10 +53,8 @@ protected: uint32 _integer; NPoint _point; Entity *_entity; - // TODO: Other types... }; MessageParamType _type; - // TODO: Constructors for the param types... }; // TODO: Disable heavy debug stuff in release mode @@ -75,7 +73,6 @@ const uint kMaxSoundResources = 16; class Entity { public: - Common::String _name; // Entity name for debugging purposes Common::String _updateHandlerCbName; Common::String _messageHandlerCbName; Entity(NeverhoodEngine *vm, int priority); @@ -105,7 +102,6 @@ protected: int _priority; SoundResource **_soundResources; SoundResource *getSoundResource(uint index); - // TODO Add other sound stuff void loadSound(uint index, uint32 fileHash); void playSound(uint index, uint32 fileHash = 0); void stopSound(uint index); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 8f0a94e52d..f06ce40c68 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -62,7 +62,6 @@ Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) { - // TODO DirtySurface createSurface(surfacePriority, 320, 200); _x = x; _y = y; @@ -475,10 +474,6 @@ void Klayman::gotoNextStateExt() { AnimationCb cb = _nextStateCb; _nextStateCb = NULL; (this->*cb)(); -#if 0 // TODO (So far, with almost all Klayman subclasses implemented, _callbackList and related code seems unused) - } else if (_callbackList) { - removeCallbackList(); -#endif } else { // Inform the scene that the current Klayman animation sequence has finished sendMessage(_parentScene, 0x1006, 0); @@ -2927,7 +2922,6 @@ void Klayman::stFalling() { SetMessageHandler(&Klayman::hmLowLevelAnimation); NextState(&Klayman::stFallTouchdown); sendMessage(_parentScene, 0x2002, 0); - // TODO _callbackList = NULL; (See comment above) _attachedSprite = NULL; sendMessage(_parentScene, 0x8001, 0); } @@ -3338,7 +3332,6 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - // TODO: It's not really a point but an x1/x2 pair if (param.asPoint().y != 0) { sub41CC40(param.asPoint().y, param.asPoint().x); } else { @@ -3575,9 +3568,11 @@ KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; switch (messageNum) { case 0x2000: _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; break; case 0x4001: case 0x4800: @@ -3629,7 +3624,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { teleporterDisappear(0x3C2E4245); break; } - return 0; + return messageResult; } // KmScene1201 @@ -3816,6 +3811,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { switch (messageNum) { case 0x2000: _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; break; case 0x4001: case 0x4800: @@ -4270,9 +4266,11 @@ KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; switch (messageNum) { case 0x2032: _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; break; case 0x4001: case 0x4800: @@ -4349,7 +4347,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { startSpecialWalkLeft(param.asInteger()); break; } - return 0; + return messageResult; } // KmScene1705 @@ -4493,9 +4491,11 @@ KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; switch (messageNum) { case 0x2000: _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; break; case 0x4001: case 0x4800: @@ -4547,7 +4547,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { teleporterDisappear(0x18AB4ED4); break; } - return 0; + return messageResult; } KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) @@ -5758,9 +5758,11 @@ KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; switch (messageNum) { case 0x2000: _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; break; case 0x4001: case 0x4800: @@ -5804,7 +5806,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { teleporterDisappear(0xD82A4094); break; } - return 0; + return messageResult; } KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, @@ -5815,7 +5817,6 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 _surface->setClipRects(clipRects, clipRectsCount); if (flag) { - // TODO Maybe? Don't know. Set Klayman clip rects loadSound(3, 0x58E0C341); loadSound(4, 0x40A00342); loadSound(5, 0xD0A1C348); @@ -5875,7 +5876,6 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 _surface->setClipRects(clipRects, clipRectsCount); if (flag) { - // TODO Maybe? Don't know. Set Klayman clip rects loadSound(3, 0x58E0C341); loadSound(4, 0x40A00342); loadSound(5, 0xD0A1C348); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 8e6b56b9f0..4f8f584313 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -200,7 +200,7 @@ AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) _y = 206; createSurface(900, 177, 192); startAnimation(0x022C90D4, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1001Hammer::handleMessage); } @@ -218,7 +218,7 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ case 0x2000: startAnimation(0x022C90D4, 1, -1); playSound(0, 0xE741020A); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; break; } return 0; @@ -332,8 +332,6 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - _name = "Scene1001"; - Sprite *tempSprite; SetMessageHandler(&Scene1001::handleMessage); @@ -1130,7 +1128,7 @@ AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngi _y = 240; if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { startAnimation(0x004A4495, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { setVisible(false); } @@ -1177,7 +1175,7 @@ uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const Messa void AsScene1002OutsideDoorBackground::stOpenDoor() { startAnimation(0x004A4495, 0, -1); SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; setVisible(true); } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index c0bab71f52..768e7819b0 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -229,7 +229,7 @@ AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag) _y = -32; if (flag) { startAnimation(0x928F0C10, 15, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { startAnimation(0x928F0C10, 0, -1); _newStickFrameIndex = 0; @@ -246,7 +246,7 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam & break; case 0x2006: startAnimation(0x928F0C10, 1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; break; } return messageResult; @@ -260,10 +260,10 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, _y = 240; SetUpdateHandler(&AsScene1201RightDoor::update); SetMessageHandler(&AsScene1201RightDoor::handleMessage); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; if (flag) { startAnimation(0xD088AC30, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; _countdown = 25; } else { stopAnimation(); @@ -293,7 +293,7 @@ uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam &p void AsScene1201RightDoor::stOpenDoor() { startAnimation(0xD088AC30, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; setVisible(true); playSound(0, calcHash("fxDoorOpen20")); } @@ -419,7 +419,7 @@ void AsScene1201TntMan::stMoving() { startAnimation(0x85084190, 0, -1); SetMessageHandler(&AsScene1201TntMan::handleMessage); SetSpriteUpdate(&AsScene1201TntMan::suMoving); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan) @@ -687,11 +687,11 @@ AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) createSurface(800, 55, 199); if (_klayman->getX() < 100) { startAnimation(0x508A111B, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; playSound(0, calcHash("fxDoorOpen03")); } else { startAnimation(0x508A111B, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1201LeftDoor::handleMessage); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index d92cd66bc6..945d7a9218 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -310,7 +310,7 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) _newStickFrameIndex = 0; } else { startAnimation(0x88148150, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } loadSound(0, 0x68895082); loadSound(1, 0x689BD0C1); @@ -348,7 +348,7 @@ void AsScene1302Bridge::stRaiseBridge() { void AsScene1302Bridge::cbLowerBridgeEvent() { sendMessage(_parentScene, 0x2032, 0); startAnimation(0x88148150, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) @@ -1210,7 +1210,7 @@ void AsScene1307Key::stInsertKey() { sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]); setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]); SetSpriteUpdate(&AsScene1307Key::suInsertKey); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } void AsScene1307Key::stMoveKey() { @@ -1237,13 +1237,13 @@ void AsScene1307Key::stMoveKey() { void AsScene1307Key::stUnlock() { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; startAnimation(fileHashes[1], 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } void AsScene1307Key::stInsert() { const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; startAnimation(fileHashes[2], 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) @@ -1515,7 +1515,7 @@ uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageP void AsScene1308LightWallSymbols::stFadeIn() { startAnimation(0x80180A10, 0, -1); setVisible(true); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } void AsScene1308LightWallSymbols::stFadeOut() { diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index f25efe2027..cfa1614602 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -311,7 +311,7 @@ AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, b createSurface1(0x04551900, 100); SetUpdateHandler(&AsScene1401BackDoor::update); SetMessageHandler(&AsScene1401BackDoor::handleMessage); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; if (isOpen) { _isOpen = true; startAnimation(0x04551900, -1,- 1); @@ -355,7 +355,7 @@ void AsScene1401BackDoor::stOpenDoor() { _isOpen = true; setVisible(true); startAnimation(0x04551900, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; playSound(0, calcHash("fxDoorOpen24")); } @@ -820,7 +820,7 @@ AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentSce // Puzzle box is here startAnimation(0x20060259, 0, -1); loadSound(1, 0x61901C29); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } } diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 382aedde38..09bb375a4e 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1062,7 +1062,7 @@ AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asC SetUpdateHandler(&AsCommonCarConnector::update); createSurface1(0x60281C10, 150); startAnimation(0x60281C10, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } void AsCommonCarConnector::update() { diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index c4a0904232..0a02d85876 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -205,7 +205,7 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene } createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { _isPluggedIn = false; _currPositionIndex = positionIndex; @@ -377,7 +377,7 @@ void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { _someY = _y; startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0); _playBackwards = true; - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; _currStep = 0; _yAccel = 1; SetUpdateHandler(&AsScene1907Symbol::update); diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 58f87d9afb..879250a624 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -87,7 +87,7 @@ AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag) SetMessageHandler(&AsScene2101Door::handleMessage); if (flag) { startAnimation(0x0C202B9C, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { setVisible(false); } @@ -111,14 +111,14 @@ uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam ¶m, void AsScene2101Door::stOpenDoor() { startAnimation(0x0C202B9C, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; setVisible(true); playSound(0, calcHash("fxDoorOpen32")); } void AsScene2101Door::stCloseDoor() { startAnimation(0xC222A8D4, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; setVisible(true); NextState(&AsScene2101Door::stCloseDoorDone); playSound(0, calcHash("fxDoorClose32")); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 028c88359c..d82bf8c1d9 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -426,7 +426,7 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite * if (_doorOpen) { startAnimation(0xE2CB0412, -1, -1); _countdown = 48; - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { startAnimation(0xE2CB0412, 0, -1); _newStickFrameIndex = 0; @@ -473,7 +473,7 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, void AsScene2201Door::stOpenDoor() { _doorOpen = true; startAnimation(0xE2CB0412, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; playSound(0, calcHash("fxDoorOpen33")); } @@ -1056,7 +1056,7 @@ AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint d createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900); if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) { startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1); _newStickFrameIndex = 0; diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 770a5c3301..7cc97f7d48 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -328,7 +328,7 @@ AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) createSurface1(0x44687810, 100); _x = 320; _y = 240; - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; SetUpdateHandler(&AsScene2401Door::update); SetMessageHandler(&AsScene2401Door::handleMessage); if (_isOpen) { @@ -581,7 +581,7 @@ AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool i createSurface1(0x80495831, 100); _x = 320; _y = 240; - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; if (_isOpen) { startAnimation(0x80495831, -1, -1); _countdown = 48; @@ -619,7 +619,7 @@ uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam ¶m, _isOpen = true; setVisible(true); startAnimation(0x80495831, 0, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; playSound(0, calcHash("fxDoorOpen38")); break; } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 60cc581066..b0983dee98 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -559,7 +559,7 @@ AsCommonCarConnectorShadow::AsCommonCarConnectorShadow(NeverhoodEngine *vm, Spri SetUpdateHandler(&AsCommonCarConnectorShadow::update); createShadowSurface1(shadowSurface, 0x60281C10, 150); startAnimation(0x60281C10, -1, -1); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } void AsCommonCarConnectorShadow::update() { diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 174e5e041d..268b2c67a9 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -3101,7 +3101,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa case 0x2000: startAnimation(0x805D0029, 0, -1); playSound(0, 0xEA005F40); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; break; } return messageResult; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index a6bc6eb6fe..7695248c4b 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1227,7 +1227,7 @@ void AsScene3010DeadBolt::unlock(bool skipAnim) { setVisible(true); if (skipAnim) { startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); - _newStickFrameIndex = -2; + _newStickFrameIndex = STICK_LAST_FRAME; } else { startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 66f1178a52..f81be07dff 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -30,7 +30,6 @@ Sprite::Sprite(NeverhoodEngine *vm, int objectPriority) : Entity(vm, objectPriority), _x(0), _y(0), _spriteUpdateCb(NULL), _filterXCb(NULL), _filterYCb(NULL), _dataResource(vm), _doDeltaX(false), _doDeltaY(false), _needRefresh(false), _flags(0), _surface(NULL) { - _name = "Sprite"; SetMessageHandler(&Sprite::handleMessage); } @@ -119,21 +118,17 @@ void Sprite::setClipRect(NDrawRect& drawRect) { StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) : Sprite(vm, objectPriority), _spriteResource(vm) { - _name = "StaticSprite"; - } StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height) : Sprite(vm, 0), _spriteResource(vm) { - _name = "StaticSprite"; init(calcHash(filename), surfacePriority, x, y, width, height); - } StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) : Sprite(vm, 0), _spriteResource(vm) { - _name = "StaticSprite"; + init(fileHash, surfacePriority, x, y, width, height); } @@ -227,13 +222,11 @@ AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, uint32 fileHash, int surface } void AnimatedSprite::init() { - _name = "AnimatedSprite"; _currFrameTicks = 0; _newAnimFileHash = 0; _deltaX = 0; _deltaY = 0; _nextAnimFileHash = 0; - // TODO _callbackList = 0; _plFirstFrameIndex = 0; _currFrameIndex = 0; _currStickFrameIndex = -1; @@ -289,7 +282,7 @@ void AnimatedSprite::updateAnim() { if (_newAnimFileHash == 0) { if (_newStickFrameIndex != -1) { - _currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex; + _currStickFrameIndex = _newStickFrameIndex == STICK_LAST_FRAME ? _animResource.getFrameCount() - 1 : _newStickFrameIndex; _newStickFrameIndex = -1; } else if (_newStickFrameHash != 0) { _currStickFrameIndex = MAX(0, _animResource.getFrameIndex(_newStickFrameHash)); @@ -360,7 +353,7 @@ void AnimatedSprite::updateAnim() { } if (_newStickFrameIndex != -1) { - _currStickFrameIndex = _newStickFrameIndex == -2 ? _animResource.getFrameCount() - 1 : _newStickFrameIndex; + _currStickFrameIndex = _newStickFrameIndex == STICK_LAST_FRAME ? _animResource.getFrameCount() - 1 : _newStickFrameIndex; _newStickFrameIndex = -1; } else if (_newStickFrameHash != 0) { _currStickFrameIndex = MAX(0, _animResource.getFrameIndex(_newStickFrameHash)); @@ -428,9 +421,8 @@ void AnimatedSprite::updateFrameInfo() { _currFrameTicks = frameInfo.counter; processDelta(); _needRefresh = true; - if (frameInfo.frameHash != 0) { + if (frameInfo.frameHash != 0) sendMessage(this, 0x100D, frameInfo.frameHash); - } } void AnimatedSprite::createSurface1(uint32 fileHash, int surfacePriority) { @@ -499,7 +491,6 @@ void AnimatedSprite::gotoState(AnimationCb currStateCb) { _finalizeStateCb = NULL; (this->*cb)(); } - // TODO _callbackList = NULL; _nextStateCb = NULL; _currStateCb = currStateCb; if (_currStateCb) @@ -517,10 +508,6 @@ void AnimatedSprite::gotoNextState() { _nextStateCb = NULL; //debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str()); (this->*_currStateCb)(); -#if 0 // TODO - } else if (_callbackList) { - removeCallbackList(); -#endif } else { _currStateCb = NULL; } diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index d34704d7bf..358a37bc57 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -113,6 +113,8 @@ protected: #define NextState(callback) _nextStateCb = static_cast (callback); debug(2, "NextState(" #callback ")"); _nextStateCbName = #callback #define FinalizeState(callback) setFinalizeState(static_cast (callback)); +const int STICK_LAST_FRAME = -2; + class AnimatedSprite : public Sprite { public: AnimatedSprite(NeverhoodEngine *vm, int objectPriority); @@ -140,11 +142,6 @@ protected: int16 _deltaX, _deltaY; byte _replOldColor, _replNewColor; bool _playBackwards, _frameChanged; - /* TODO - callbackListIndex dw ? - callbackListCount dw ? - callbackList dd ? - */ AnimationCb _finalizeStateCb; AnimationCb _currStateCb; AnimationCb _nextStateCb; -- cgit v1.2.3 From ef8f0215cfa6287c5d45fef54f040276d95de9b2 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 19 Oct 2012 10:51:15 +0000 Subject: NEVERHOOD: Add GameVars::dumpVars() for debugging --- engines/neverhood/gamemodule.h | 2 -- engines/neverhood/gamevars.cpp | 28 ++++++++++------------------ engines/neverhood/gamevars.h | 1 + engines/neverhood/neverhood.cpp | 1 + 4 files changed, 12 insertions(+), 20 deletions(-) diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index eb043cb646..40834ce5cd 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -20,8 +20,6 @@ * */ -// TODO: I couldn't come up with a better name than 'Module' so far - #ifndef NEVERHOOD_GAMEMODULE_H #define NEVERHOOD_GAMEMODULE_H diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index 3e4e60438a..e56ec1ec7d 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -32,41 +32,32 @@ GameVars::~GameVars() { } uint32 GameVars::getGlobalVar(uint32 nameHash) { - //debug("GameVars::getGlobalVar(%08X)", nameHash); int16 varIndex = findSubVarIndex(0, nameHash); return varIndex != -1 ? _vars[varIndex].value : 0; } void GameVars::setGlobalVar(uint32 nameHash, uint32 value) { - //debug("GameVars::setGlobalVar(%08X, %d)", nameHash, value); _vars[getSubVarIndex(0, nameHash)].value = value; } uint32 GameVars::getSubVar(uint32 nameHash, uint32 subNameHash) { - //debug("GameVars::getSubVar(%08X, %08X)", nameHash, subNameHash); uint32 value = 0; int16 varIndex = findSubVarIndex(0, nameHash); if (varIndex != -1) { int16 subVarIndex = findSubVarIndex(varIndex, subNameHash); - if (subVarIndex != -1) { + if (subVarIndex != -1) value = _vars[subVarIndex].value; - } } return value; } void GameVars::setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value) { - //debug("GameVars::setSubVar(%08X, %08X, %d)", nameHash, subNameHash, value); int16 varIndex = getSubVarIndex(0, nameHash); - //debug(" varIndex = %d", varIndex); int16 subVarIndex = getSubVarIndex(varIndex, subNameHash); - //debug(" subVarIndex = %d", subVarIndex); _vars[subVarIndex].value = value; - //_vars[getSubVarIndex(getSubVarIndex(0, nameHash), subNameHash)].value = value; } int16 GameVars::addVar(uint32 nameHash, uint32 value) { - //debug("GameVars::addVar(%08X, %d)", nameHash, value); GameVar gameVar; gameVar.nameHash = nameHash; gameVar.value = value; @@ -77,16 +68,13 @@ int16 GameVars::addVar(uint32 nameHash, uint32 value) { } int16 GameVars::findSubVarIndex(int16 varIndex, uint32 subNameHash) { - //debug("GameVars::findSubVarIndex(%d, %08X)", varIndex, subNameHash); - for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) { + for (int16 nextIndex = _vars[varIndex].firstIndex; nextIndex != -1; nextIndex = _vars[nextIndex].nextIndex) if (_vars[nextIndex].nameHash == subNameHash) return nextIndex; - } return -1; } int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) { - //debug("GameVars::addSubVar(%d, %08X, %d)", varIndex, subNameHash, value); int16 nextIndex = _vars[varIndex].firstIndex; int16 subVarIndex; if (nextIndex == -1) { @@ -102,13 +90,17 @@ int16 GameVars::addSubVar(int16 varIndex, uint32 subNameHash, uint32 value) { } int16 GameVars::getSubVarIndex(int16 varIndex, uint32 subNameHash) { - //debug("GameVars::getSubVarIndex(%d, %08X)", varIndex, subNameHash); int16 subVarIndex = findSubVarIndex(varIndex, subNameHash); - if (subVarIndex == -1) { + if (subVarIndex == -1) subVarIndex = addSubVar(varIndex, subNameHash, 0); - debug("need to create: subVarIndex = %d", subVarIndex); - } return subVarIndex; } +void GameVars::dumpVars() { + for (Common::Array::iterator it = _vars.begin(); it != _vars.end(); ++it) { + GameVar gameVar = *it; + debug("%08X %08X %3d %3d", gameVar.nameHash, gameVar.value, gameVar.firstIndex, gameVar.nextIndex); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 3e32803acc..623e5b5c6f 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -176,6 +176,7 @@ public: void setGlobalVar(uint32 nameHash, uint32 value); uint32 getSubVar(uint32 nameHash, uint32 subNameHash); void setSubVar(uint32 nameHash, uint32 subNameHash, uint32 value); + void dumpVars(); protected: Common::Array _vars; int16 addVar(uint32 nameHash, uint32 value); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 6a06ad66f6..76c2bc09eb 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -155,6 +155,7 @@ Common::Error NeverhoodEngine::run() { _gameModule->draw(); _screen->update(); nextFrameTime = _screen->getNextFrameTime(); + //_gameVars->dumpVars(); }; _soundMan->update(); -- cgit v1.2.3 From 2e32b32808304a172844d835934e7aae6b8cd76f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 19 Oct 2012 13:55:37 +0000 Subject: NEVERHOOD: Start with the MenuModule --- engines/neverhood/gamemodule.cpp | 65 ++++++++++- engines/neverhood/gamemodule.h | 8 ++ engines/neverhood/menumodule.cpp | 242 +++++++++++++++++++++++++++++++++++++++ engines/neverhood/menumodule.h | 71 ++++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/neverhood.cpp | 10 +- engines/neverhood/screen.cpp | 5 - engines/neverhood/screen.h | 1 + 8 files changed, 391 insertions(+), 12 deletions(-) create mode 100644 engines/neverhood/menumodule.cpp create mode 100644 engines/neverhood/menumodule.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 80e6fbeaad..d87096df2d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -23,6 +23,7 @@ #include "neverhood/gamemodule.h" #include "neverhood/graphics.h" +#include "neverhood/menumodule.h" #include "neverhood/module1000.h" #include "neverhood/module1100.h" #include "neverhood/module1200.h" @@ -68,8 +69,13 @@ static const uint32 kRadioMusicFileHashes[] = { 0x03322020 }; +enum { + MENU_MODULE = 9999 +}; + GameModule::GameModule(NeverhoodEngine *vm) - : Module(vm, NULL), _moduleNum(-1) { + : Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1), + _mainMenuRequested(false), _gameWasLoaded(false) { // Other initializations moved to actual engine class // TODO @@ -117,6 +123,13 @@ void GameModule::handleMouseUp(int16 x, int16 y) { } } +void GameModule::handleEscapeKey() { + if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) + _mainMenuRequested = true; + else + sendMessage(_childObject, 0x000C, 0); +} + void GameModule::handleSpaceKey() { if (_childObject) { debug(2, "GameModule::handleSpaceKey()"); @@ -418,6 +431,11 @@ void GameModule::startup() { #endif } +void GameModule::checkMainMenu() { + if (_mainMenuRequested) + openMainMenu(); +} + void GameModule::createModule(int moduleNum, int which) { debug("GameModule::createModule(%d, %d)", moduleNum, which); _moduleNum = moduleNum; @@ -771,4 +789,49 @@ void GameModule::updateModule() { } } +void GameModule::openMainMenu() { + if (_childObject) { + sendMessage(_childObject, 0x101D, 0); + _childObject->draw(); + } else { + // If there's no module, create one so there's something to return to + createModule(1000, 0); + } + // TODO Save FPS, Smacker handle, screen offsets, collisition sprites + _mainMenuRequested = false; + createMenuModule(); +} + +void GameModule::createMenuModule() { + if (!_prevChildObject) { + _prevChildObject = _childObject; + _prevModuleNum = _moduleNum; + _childObject = new MenuModule(_vm, this, 0); + _childObject->handleUpdate(); + SetUpdateHandler(&GameModule::updateMenuModule); + } +} + +void GameModule::updateMenuModule() { + if (!updateChild()) { + // TODO Restore FPS? + _childObject = _prevChildObject; + // TODO Restore Smacker handle, screen offsets, collision sprites + sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed? + _prevChildObject = NULL; + _moduleNum = _prevModuleNum; + SetUpdateHandler(&GameModule::updateModule); + } else if (_gameWasLoaded) { + debug("_gameWasLoaded!"); + _gameWasLoaded = false; + delete _childObject; + delete _prevChildObject; + _childObject = NULL; + _prevChildObject = NULL; + _prevModuleNum = 0; + // TODO Create module from savegame values... + // TODO createModuleByHash(...); + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 40834ce5cd..3f661388ca 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -33,9 +33,11 @@ public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); void startup(); + void checkMainMenu(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); void handleMouseUp(int16 x, int16 y); + void handleEscapeKey(); void handleSpaceKey(); void initKeySlotsPuzzle(); void initMemoryPuzzle(); @@ -47,6 +49,9 @@ public: uint32 getCurrRadioMusicFileHash(); protected: Entity *_prevChildObject; + int _prevModuleNum; + bool _gameWasLoaded; + bool _mainMenuRequested; bool _someFlag1; bool _field2C; uint32 _counter; @@ -55,6 +60,9 @@ protected: void createModule(int moduleNum, int which); void createModuleByHash(uint32 nameHash); void updateModule(); + void openMainMenu(); + void createMenuModule(); + void updateMenuModule(); }; } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp new file mode 100644 index 0000000000..372dac1d89 --- /dev/null +++ b/engines/neverhood/menumodule.cpp @@ -0,0 +1,242 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/menumodule.h" + +namespace Neverhood { + +enum { + MAIN_MENU = 0 +}; + +MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + SetMessageHandler(&MenuModule::handleMessage); + + // TODO Check if the background actually needs to be saved + _savedBackground = new Background(_vm, 0); + _savedBackground->createSurface(0, 640, 480); + // TODO Save current palette + // TODO Stop all sounds and music + + _savedPaletteData = _vm->_screen->getPaletteData(); + + createScene(MAIN_MENU, -1); +} + +MenuModule::~MenuModule() { + _vm->_screen->setPaletteData(_savedPaletteData); +} + +void MenuModule::createScene(int sceneNum, int which) { + _sceneNum = sceneNum; + switch (_sceneNum) { + case MAIN_MENU: + _childObject = new MainMenu(_vm, this); + break; + } + SetUpdateHandler(&MenuModule::updateScene); + _childObject->handleUpdate(); +} + +void MenuModule::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case MAIN_MENU: + // TODO + switch (_moduleResult) { + case 0: + // 0048A2A5 + debug("RESTART GAME"); + break; + case 1: + debug("LOAD GAME"); + // TODO createLoadGameMenu(); + break; + case 2: + debug("SAVE GAME"); + // TODO createSaveGameMenu(); + break; + case 3: + debug("RESUME GAME"); + leaveModule(0); + break; + case 4: + debug("QUIT GAME"); + leaveModule(0); + // TODO _gameState->quitGame = true; + break; + case 5: + debug("CREDITS"); + // TODO createCreditsScene(); + break; + case 6: + debug("MAKING OF"); + // TODO playMakingOf(); + break; + case 7: + debug("TOGGLE MUSIC"); + // TODO Toggle music 0048A367 + createScene(MAIN_MENU, -1); + break; + case 8: + debug("DELETE GAME"); + // TODO createDeleteGameMenu(); + break; + default: + createScene(MAIN_MENU, -1); + break; + } + break; + default: + break; + } + } +} + +uint32 MenuModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + // TODO CHECKME Handles 0x101F, possibly just a debug/cache message which can be ignored? + return Module::handleMessage(messageNum, param, sender);; +} + +static const uint32 kMainMenuButtonFileHashes[] = { + 0x36C62120, + 0x56C62120, + 0x96C62120, + 0x16C62121, + 0x16C62122, + 0x16C62124, + 0x16C62128, + 0x16C62130, + 0x16C62100 +}; + +MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex) + : StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) { + + _spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]); + createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + + // TODO Move to const array + switch (_buttonIndex) { + case 0: + _rect.set(52, 121, 110, 156); + break; + case 1: + _rect.set(52, 192, 109, 222); + break; + case 2: + _rect.set(60, 257, 119, 286); + break; + case 3: + _rect.set(67, 326, 120, 354); + break; + case 4: + _rect.set(70, 389, 128, 416); + break; + case 5: + _rect.set(523, 113, 580, 144); + break; + case 6: + _rect.set(525, 176, 577, 206); + break; + case 7: + _rect.set(527, 384, 580, 412); + break; + case 8: + _rect.set(522, 255, 580, 289); + break; + } + + setVisible(false); + _needRefresh = true; + + SetUpdateHandler(&MainMenuButton::update); + SetMessageHandler(&MainMenuButton::handleMessage); + +} + +void MainMenuButton::update() { + StaticSprite::update(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + sendMessage(_parentScene, 0x2000, _buttonIndex); + } +} + +uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + setVisible(true); + _countdown = 4; + } + messageResult = 1; + break; + } + return messageResult; +} + +MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule, true) { + + setBackground(0x08C0020C); + setPalette(0x08C0020C); + insertMouse433(0x00208084); + + insertStaticSprite(0x41137051, 100); + insertStaticSprite(0xC10B2015, 100); + + // TODO Only is music is disabled + _musicOnButton = insertStaticSprite(0x0C24C0EE, 100); + + for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) { + Sprite *mainMenuButton = insertSprite(this, buttonIndex); + _vm->_collisionMan->addSprite(mainMenuButton); + } + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&MainMenu::handleMessage); + +} + +uint32 MainMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + leaveScene(param.asInteger()); + break; + } + return 0; +} + + +} // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h new file mode 100644 index 0000000000..c60698c1ef --- /dev/null +++ b/engines/neverhood/menumodule.h @@ -0,0 +1,71 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// TODO: I couldn't come up with a better name than 'Module' so far + +#ifndef NEVERHOOD_MENUMODULE_H +#define NEVERHOOD_MENUMODULE_H + +#include "common/str.h" +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class MenuModule : public Module { +public: + MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~MenuModule(); +protected: + int _sceneNum; + Common::String _savegameName; + Background *_savedBackground; + byte *_savedPaletteData; + // TODO _savegameList (list of strings?) + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class MainMenuButton : public StaticSprite { +public: + MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex); +protected: + Scene *_parentScene; + int _countdown; + uint _buttonIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class MainMenu : public Scene { +public: + MainMenu(NeverhoodEngine *vm, Module *parentModule); +protected: + Sprite *_musicOnButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MENUMODULE_H */ diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 5cd41c87fe..224dfb579f 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -11,6 +11,7 @@ MODULE_OBJS = \ gamevars.o \ graphics.o \ klayman.o \ + menumodule.o \ module.o \ module1000.o \ module1100.o \ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 76c2bc09eb..631b0506b1 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -85,12 +85,6 @@ Common::Error NeverhoodEngine::run() { _res->addArchive("t.blb"); CursorMan.showMouse(true); - { - // DEBUG: Dummy cursor - byte buffer[2*2]; - memset(buffer, 255, 4); - CursorMan.replaceCursor(buffer, 2, 2, 0, 0, 0); - } #if 0 // TODO: This should probably be implemented as debug command later @@ -119,6 +113,9 @@ Common::Error NeverhoodEngine::run() { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; switch (_keyState) { + case Common::KEYCODE_ESCAPE: + _gameModule->handleEscapeKey(); + break; case Common::KEYCODE_SPACE: _gameModule->handleSpaceKey(); break; @@ -151,6 +148,7 @@ Common::Error NeverhoodEngine::run() { } if (_system->getMillis() >= nextFrameTime) { + _gameModule->checkMainMenu(); _gameModule->handleUpdate(); _gameModule->draw(); _screen->update(); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index a5f7b4dac7..a2437ba010 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -90,11 +90,6 @@ void Screen::update() { updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height)); } - /* - for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) - debug("## (%d, %d, %d, %d)", (*ri).left, (*ri).top, (*ri).right, (*ri).bottom); - */ - for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { RenderItem &renderItem = (*it); for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index bbf4f5fe73..69329fd59a 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -66,6 +66,7 @@ public: int getFps(); void setPaletteData(byte *paletteData); void unsetPaletteData(byte *paletteData); + byte *getPaletteData() { return _paletteData; } void testPalette(byte *paletteData); void updatePalette(); void clear(); -- cgit v1.2.3 From c43253bd6a0a4bdf7e7cecb872bfad86f400e7b5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 19 Oct 2012 18:31:30 +0000 Subject: NEVERHOOD: Implement CreditsScene --- engines/neverhood/menumodule.cpp | 108 ++++++++++++++++++++++++++++++++++++++- engines/neverhood/menumodule.h | 15 ++++++ 2 files changed, 121 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 372dac1d89..4ba6d324d0 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -25,7 +25,8 @@ namespace Neverhood { enum { - MAIN_MENU = 0 + MAIN_MENU = 0, + CREDITS_SCENE = 1 }; MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which) @@ -54,6 +55,9 @@ void MenuModule::createScene(int sceneNum, int which) { case MAIN_MENU: _childObject = new MainMenu(_vm, this); break; + case CREDITS_SCENE: + _childObject = new CreditsScene(_vm, this, true); + break; } SetUpdateHandler(&MenuModule::updateScene); _childObject->handleUpdate(); @@ -88,7 +92,7 @@ void MenuModule::updateScene() { break; case 5: debug("CREDITS"); - // TODO createCreditsScene(); + createScene(CREDITS_SCENE, -1); break; case 6: debug("MAKING OF"); @@ -108,6 +112,9 @@ void MenuModule::updateScene() { break; } break; + case CREDITS_SCENE: + createScene(MAIN_MENU, -1); + break; default: break; } @@ -238,5 +245,102 @@ uint32 MainMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity return 0; } +static const uint32 kCreditsSceneFileHashes[] = { + 0x6081128C, + 0x608112BC, + 0x608112DC, + 0x6081121C, + 0x6081139C, + 0x6081109C, + 0x6081169C, + 0x60811A9C, + 0x6081029C, + 0x0081128C, + 0x008112BC, + 0x008012BC, + 0x008112DC, + 0x0081121C, + 0x0081139C, + 0x0081109C, + 0x0081169C, + 0x00811A9C, + 0x0081029C, + 0x0081329C, + 0xC08112BC, + 0xC08112DC, + 0xC081121C, + 0xC081139C, + 0 +}; + +CreditsScene::CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAbort) + : Scene(vm, parentModule, true), _canAbort(canAbort), _screenIndex(0), _ticksDuration(0), + _countdown(216) { + + SetUpdateHandler(&CreditsScene::update); + SetMessageHandler(&CreditsScene::handleMessage); + + setBackground(0x6081128C); + setPalette(0x6081128C); + + _ticksTime = _vm->_system->getMillis() + 202100; + + _musicResource = new MusicResource(_vm); + _musicResource->load(0x30812225); + _musicResource->play(0); + +} + +CreditsScene::~CreditsScene() { + _musicResource->unload(); + delete _musicResource; +} + +void CreditsScene::update() { + Scene::update(); + if (_countdown != 0) { + if (_screenIndex == 23 && _vm->_system->getMillis() > _ticksTime) + leaveScene(0); + else if ((--_countdown) == 0) { + ++_screenIndex; + if (kCreditsSceneFileHashes[_screenIndex] == 0) + leaveScene(0); + else { + _background->load(kCreditsSceneFileHashes[_screenIndex]); + _palette->addPalette(kCreditsSceneFileHashes[_screenIndex], 0, 256, 0); + if (_screenIndex < 5) + _countdown = 192; + else if (_screenIndex < 15) + _countdown = 144; + else if (_screenIndex < 16) + _countdown = 216; + else if (_screenIndex < 23) + _countdown = 144; + else + _countdown = 1224; + } + } + } +} + +uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0009: + leaveScene(0); + break; + case 0x000B://TODO Implement this message + if (param.asInteger() == 27 && _canAbort) + leaveScene(0); + break; + case 0x101D: + _ticksDuration = _ticksTime - _vm->_system->getMillis(); + break; + case 0x101E: + _ticksTime = _ticksDuration + _vm->_system->getMillis(); + break; + } + return 0; +} } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index c60698c1ef..4805f67245 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -66,6 +66,21 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class CreditsScene : public Scene { +public: + CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAbort); + virtual ~CreditsScene(); +protected: + int _screenIndex; + int _countdown; + MusicResource *_musicResource; + uint32 _ticksTime; + uint32 _ticksDuration; + bool _canAbort; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MENUMODULE_H */ -- cgit v1.2.3 From 5ba8f2e9c8f94f7f72dd32755975258007cbfca6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 19 Oct 2012 21:17:10 +0000 Subject: NEVERHOOD: Add making of video to the main menu - Clear render queue at each scene initiailization - Fix mouse cursor visibility (again :) - Fix SmackerScene screen clearing --- engines/neverhood/gamemodule.cpp | 6 +++--- engines/neverhood/menumodule.cpp | 28 +++++++++++++++++++++++++--- engines/neverhood/menumodule.h | 2 -- engines/neverhood/mouse.cpp | 9 ++++----- engines/neverhood/mouse.h | 1 - engines/neverhood/scene.cpp | 2 ++ engines/neverhood/screen.cpp | 7 +++++++ engines/neverhood/screen.h | 1 + engines/neverhood/smackerscene.cpp | 3 +-- 9 files changed, 43 insertions(+), 16 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d87096df2d..a574fa52f9 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -109,7 +109,7 @@ void GameModule::handleMouseDown(int16 x, int16 y) { mousePos.x = x; mousePos.y = y; debug(2, "GameModule::handleMouseDown(%d, %d)", x, y); - sendPointMessage(_childObject, 1, mousePos); + sendPointMessage(_childObject, 0x0001, mousePos); } } @@ -119,7 +119,7 @@ void GameModule::handleMouseUp(int16 x, int16 y) { mousePos.x = x; mousePos.y = y; debug(2, "GameModule::handleMouseUp(%d, %d)", x, y); - sendPointMessage(_childObject, 2, mousePos); + sendPointMessage(_childObject, 0x0002, mousePos); } } @@ -133,7 +133,7 @@ void GameModule::handleEscapeKey() { void GameModule::handleSpaceKey() { if (_childObject) { debug(2, "GameModule::handleSpaceKey()"); - sendMessage(_childObject, 9, 0); + sendMessage(_childObject, 0x0009, 0); } } diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 4ba6d324d0..97489194ac 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -26,7 +26,25 @@ namespace Neverhood { enum { MAIN_MENU = 0, - CREDITS_SCENE = 1 + CREDITS_SCENE = 1, + MAKING_OF = 2 +}; + +static const uint32 kMakingOfSmackerFileHashList[] = { + 0x21082409, + 0x21082809, + 0x21083009, + 0x21080009, + 0x21086009, + 0x2108A009, + 0x21092009, + 0x210A2009, + 0x210C2009, + 0x21082411, + 0x21082811, + 0x21083011, + 0x21080011, + 0 }; MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which) @@ -58,6 +76,9 @@ void MenuModule::createScene(int sceneNum, int which) { case CREDITS_SCENE: _childObject = new CreditsScene(_vm, this, true); break; + case MAKING_OF: + createSmackerScene(kMakingOfSmackerFileHashList, false, true, true); + break; } SetUpdateHandler(&MenuModule::updateScene); _childObject->handleUpdate(); @@ -88,7 +109,7 @@ void MenuModule::updateScene() { case 4: debug("QUIT GAME"); leaveModule(0); - // TODO _gameState->quitGame = true; + _vm->quitGame(); break; case 5: debug("CREDITS"); @@ -96,7 +117,7 @@ void MenuModule::updateScene() { break; case 6: debug("MAKING OF"); - // TODO playMakingOf(); + createScene(MAKING_OF, -1); break; case 7: debug("TOGGLE MUSIC"); @@ -113,6 +134,7 @@ void MenuModule::updateScene() { } break; case CREDITS_SCENE: + case MAKING_OF: createScene(MAIN_MENU, -1); break; default: diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 4805f67245..77cef449d1 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -20,8 +20,6 @@ * */ -// TODO: I couldn't come up with a better name than 'Module' so far - #ifndef NEVERHOOD_MENUMODULE_H #define NEVERHOOD_MENUMODULE_H diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 8cd5e602fb..105d170fce 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -42,7 +42,7 @@ Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, const NRect &mouseRect) Mouse::Mouse(NeverhoodEngine *vm, uint32 fileHash, int16 x1, int16 x2) : StaticSprite(vm, 2000), _mouseType(kMouseType435), - _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2), _visible(false) { + _mouseCursorResource(vm), _frameNum(0), _x1(x1), _x2(x2) { init(fileHash); if (_x <= _x1) { @@ -81,6 +81,7 @@ void Mouse::init(uint32 fileHash) { _deltaRect = _drawRect; processDelta(); _needRefresh = true; + CursorMan.showMouse(false); } void Mouse::load(uint32 fileHash) { @@ -89,12 +90,10 @@ void Mouse::load(uint32 fileHash) { } void Mouse::update() { - if (_visible && !_surface->getVisible()) { + if (CursorMan.isVisible() && !_surface->getVisible()) { CursorMan.showMouse(false); - _visible = false; - } else if (!_visible && _surface->getVisible()) { + } else if (!CursorMan.isVisible() && _surface->getVisible()) { CursorMan.showMouse(true); - _visible = true; } updateCursor(); _frameNum++; diff --git a/engines/neverhood/mouse.h b/engines/neverhood/mouse.h index 2b0e8b720e..0b927de4df 100644 --- a/engines/neverhood/mouse.h +++ b/engines/neverhood/mouse.h @@ -52,7 +52,6 @@ protected: int16 _x1; int16 _x2; int _type; - bool _visible; void init(uint32 fileHash); void update(); void updateCursorNum(); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index ac08c1483f..9e49c6b137 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -55,6 +55,8 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) SetUpdateHandler(&Scene::update); SetMessageHandler(&Scene::handleMessage); + + _vm->_screen->clearRenderQueue(); } Scene::~Scene() { diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index a2437ba010..7321ddb233 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -153,6 +153,13 @@ void Screen::updatePalette() { void Screen::clear() { memset(_backScreen->pixels, 0, _backScreen->pitch * _backScreen->h); + _fullRefresh = true; + clearRenderQueue(); +} + +void Screen::clearRenderQueue() { + _renderQueue->clear(); + _prevRenderQueue->clear(); } void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version, diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 69329fd59a..4e7618b7b2 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -70,6 +70,7 @@ public: void testPalette(byte *paletteData); void updatePalette(); void clear(); + void clearRenderQueue(); void drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version, const Graphics::Surface *shadowSurface = NULL); void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version); diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index d4f65b3652..0ed689031a 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -37,9 +37,8 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl _canAbort = true; } - if (_doubleSurface) { + if (!_doubleSurface) _vm->_screen->clear(); - } _fileHash[0] = 0; _fileHash[1] = 0; -- cgit v1.2.3 From f8ff1cc12f06592890a2c0c791ef4de94b4603e8 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 19 Oct 2012 21:36:22 +0000 Subject: NEVERHOOD: Add CreditsScene to Module1300 and Module1800 (played after the game end and after jumping into the hole...) --- engines/neverhood/module1300.cpp | 40 ++++++++++++++++++++++------------------ engines/neverhood/module1800.cpp | 3 ++- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 945d7a9218..79eda7f1b9 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -27,6 +27,7 @@ #include "neverhood/module2200.h" #include "neverhood/gamemodule.h" #include "neverhood/diskplayerscene.h" +#include "neverhood/menumodule.h" #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" @@ -45,7 +46,7 @@ static const uint32 kModule1300SoundList[] = { Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - _vm->_soundMan->addMusic(0x61C090, 0x203197); + _vm->_soundMan->addMusic(0x61C090, 0x00203197); _vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList); _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150); _vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); @@ -113,86 +114,89 @@ void Module1300::createScene(int sceneNum, int which) { switch (_vm->gameState().sceneNum) { case 1: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x203197, 0, 2); + _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1302(_vm, this, which); break; case 2: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new Scene1303(_vm, this, which); break; case 3: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new Scene1304(_vm, this, which); break; case 4: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x203197, 0, 2); + _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1305(_vm, this, which); break; case 5: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x203197, 0, 2); + _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1306(_vm, this, which); break; case 6: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x203197, 0, 2); + _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1307(_vm, this, which); break; case 7: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x203197, 0, 2); + _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1308(_vm, this, which); break; case 8: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new DiskplayerScene(_vm, this, 1); break; case 9: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createSmackerScene(0x20082818, true, true, false); break; case 10: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createSmackerScene(0x20082828, true, true, false); break; case 11: _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B27A8, which); break; case 12: _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B2718, which); break; case 13: _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B27D8, which); break; case 14: _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B2808, which); break; case 15: _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B2838, which); break; case 16: _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x203197, 0, 2); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new Scene1317(_vm, this, which); break; case 17: // TODO: Credits scene + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + _childObject = new CreditsScene(_vm, this, false); break; } SetUpdateHandler(&Module1300::updateScene); @@ -291,7 +295,7 @@ void Module1300::updateScene() { createScene(17, -1); break; case 17: - // TODO + leaveModule(1); break; } } diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index ea6182d746..e4b189b056 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -22,6 +22,7 @@ #include "neverhood/module1800.h" #include "neverhood/navigationscene.h" +#include "neverhood/menumodule.h" namespace Neverhood { @@ -91,7 +92,7 @@ void Module1800::createScene(int sceneNum, int which) { createSmackerScene(0x0168B121, true, true, false); break; case 8: - // TODO _childObject = new CreditsScene(_vm, this, 0); + _childObject = new CreditsScene(_vm, this, false); break; case 9: // NOTE: Newly introduced sceneNum 9 (was duplicate 3 with own update handler) -- cgit v1.2.3 From 8d97f26cef90f5db41c4153b68eff48700f7501d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 20 Oct 2012 18:35:37 +0000 Subject: NEVERHOOD: Fix AsScene2402Door animation --- engines/neverhood/gamemodule.cpp | 5 +++-- engines/neverhood/module2400.cpp | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index a574fa52f9..2a7de46bcf 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -366,12 +366,13 @@ void GameModule::startup() { setGlobalVar(V_RADIO_ENABLED, 1); setGlobalVar(V_TNT_DUMMY_BUILT, 1); setGlobalVar(V_FLYTRAP_RING_DOOR, 1); + setGlobalVar(V_TV_JOKE_TOLD, 1); // <<gameState().which = 0; - _vm->gameState().sceneNum = 3; - createModule(1300, -1); + _vm->gameState().sceneNum = 1; + createModule(2400, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 7cc97f7d48..a017c117a8 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -574,16 +574,16 @@ static const uint32 kScene2402FileHashes[] = { }; AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen) { + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) { SetUpdateHandler(&AsScene2402Door::update); SetMessageHandler(&AsScene2402Door::handleMessage); createSurface1(0x80495831, 100); _x = 320; _y = 240; - _newStickFrameIndex = STICK_LAST_FRAME; if (_isOpen) { startAnimation(0x80495831, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; _countdown = 48; } else { stopAnimation(); @@ -749,7 +749,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x081A60A8, 1100); _ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100); _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2()); - _asDoor = insertSprite(this, which == 1/*CHECKME or != ?*/); + _asDoor = insertSprite(this, which == 0); insertSprite(_klayman); insertStaticSprite(0x3A01A020, 200); -- cgit v1.2.3 From 54c83924ce072c2d472b4c5c1c5f1748df579257 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 20 Oct 2012 20:10:23 +0000 Subject: NEVERHOOD: Add class NonRepeatingRandomNumbers - Simplify GameModule::initKeySlotsPuzzle() --- engines/neverhood/gamemodule.cpp | 62 +++++++++++++++++----------------------- engines/neverhood/gamemodule.h | 10 +++++++ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 2a7de46bcf..f5f7e4c15f 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -138,41 +138,14 @@ void GameModule::handleSpaceKey() { } void GameModule::initKeySlotsPuzzle() { - - // Exit if it's already initialized - if (getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) - return; - - for (uint i = 0; i < 3; i++) { - bool more; - do { - more = false; - setSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); - if (i > 0) { - for (uint j = 0; j < i && !more; j++) { - more = getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, j) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i); - } - } - } while (more); - } - - for (uint i = 0; i < 3; i++) { - bool more; - do { - more = false; - setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); - if (i > 0) { - for (uint j = 0; j < i && !more; j++) { - more = getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i); - } - } - if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i)) - more = true; - } while (more); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) { + NonRepeatingRandomNumbers keySlots(_vm->_rnd, 16); + for (uint i = 0; i < 3; i++) { + setSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i, keySlots.getNumber()); + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, keySlots.getNumber()); + } + setSubVar(VA_IS_PUZZLE_INIT, 0x25400B10, 1); } - - setSubVar(VA_IS_PUZZLE_INIT, 0x25400B10, 1); - } void GameModule::initMemoryPuzzle() { @@ -371,8 +344,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 1; - createModule(2400, -1); + _vm->gameState().sceneNum = 6; + createModule(1300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -835,4 +808,21 @@ void GameModule::updateMenuModule() { } } +NonRepeatingRandomNumbers::NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count) + : _rnd(rnd) { + for (int i = 0; i < count; i++) + _numbers.push_back(i); +} + +int NonRepeatingRandomNumbers::getNumber() { + int number; + if (!empty()) { + uint index = _rnd->getRandomNumber(_numbers.size() - 1); + number = _numbers[index]; + _numbers.remove_at(index); + } else + number = 0; + return number; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 3f661388ca..6aa711d96b 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -65,6 +65,16 @@ protected: void updateMenuModule(); }; +class NonRepeatingRandomNumbers { +public: + NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count); + int getNumber(); + bool empty() const { return _numbers.empty(); } +protected: + Common::RandomSource *_rnd; + Common::Array _numbers; +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE_H */ -- cgit v1.2.3 From 5af2de503ecf4e621370bf51a16472e162e543ac Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 20 Oct 2012 20:57:46 +0000 Subject: NEVERHOOD: Rewrite GameModule::initMemoryPuzzle() to use NonRepeatingRandomNumbers - Change NonRepeatingRandomNumbers --- engines/neverhood/gamemodule.cpp | 140 ++++++++++++--------------------------- engines/neverhood/gamemodule.h | 5 +- 2 files changed, 43 insertions(+), 102 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index f5f7e4c15f..ddbd4d9152 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -149,102 +149,36 @@ void GameModule::initKeySlotsPuzzle() { } void GameModule::initMemoryPuzzle() { - - // TODO: Give better names - - byte array44[3]; - byte array3C[10]; - byte array30[48]; - uint32 index3 = 48; - uint32 index2 = 9; - uint32 index1 = 2; - uint32 rndIndex; - - // Exit if it's already initialized - if (getSubVar(VA_IS_PUZZLE_INIT, 0xC8606803)) - return; - - for (uint32 i = 0; i < 3; i++) - setSubVar(VA_CURR_DICE_NUMBERS, i, 1); - - for (byte i = 0; i < 3; i++) - array44[i] = i; - - for (byte i = 0; i < 10; i++) - array3C[i] = i; - - for (byte i = 0; i < 48; i++) - array30[i] = i; - - rndIndex = _vm->_rnd->getRandomNumber(3 - 1); - - setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex], 5); - - for (byte i = 5; i < 9; i++) - array3C[i] = array3C[i + 1]; - - while (rndIndex < 2) { - array44[rndIndex] = array44[rndIndex + 1]; - rndIndex++; - } - - for (int i = 0; i < 2; i++) { - uint32 rndIndex1 = _vm->_rnd->getRandomNumber(index2 - 1); // si - uint32 rndIndex2 = _vm->_rnd->getRandomNumber(index1 - 1); // di - setSubVar(VA_DICE_MEMORY_SYMBOLS, array44[rndIndex2], array3C[rndIndex1]); - index2--; - while (rndIndex1 < index2) { - array3C[rndIndex1] = array3C[rndIndex1 + 1]; - rndIndex1++; + if (!getSubVar(VA_IS_PUZZLE_INIT, 0xC8606803)) { + NonRepeatingRandomNumbers diceIndices(_vm->_rnd, 3); + NonRepeatingRandomNumbers availableTiles(_vm->_rnd, 48); + NonRepeatingRandomNumbers tileSymbols(_vm->_rnd, 10); + for (uint32 i = 0; i < 3; i++) + setSubVar(VA_CURR_DICE_NUMBERS, i, 1); + // Set special symbols + // Symbol 5 is always one the three special symbols + setSubVar(VA_DICE_MEMORY_SYMBOLS, diceIndices.getNumber(), 5); + tileSymbols.removeNumber(5); + for (int i = 0; i < 2; i++) + setSubVar(VA_DICE_MEMORY_SYMBOLS, diceIndices.getNumber(), tileSymbols.getNumber()); + // Insert special symbols tiles + for (uint32 i = 0; i < 3; ++i) { + int tileSymbolOccurence = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2; + setSubVar(VA_GOOD_DICE_NUMBERS, i, tileSymbolOccurence); + while (tileSymbolOccurence--) + setSubVar(VA_TILE_SYMBOLS, availableTiles.getNumber(), getSubVar(VA_DICE_MEMORY_SYMBOLS, i)); } - index1--; - while (rndIndex2 < index1) { - array44[rndIndex2] = array44[rndIndex2 + 1]; - rndIndex2++; + // Fill the remaining tiles + uint32 tileSymbolIndex = 0; + while (!availableTiles.empty()) { + setSubVar(VA_TILE_SYMBOLS, availableTiles.getNumber(), tileSymbols[tileSymbolIndex]); + setSubVar(VA_TILE_SYMBOLS, availableTiles.getNumber(), tileSymbols[tileSymbolIndex]); + tileSymbolIndex++; + if (tileSymbolIndex >= tileSymbols.size()) + tileSymbolIndex = 0; } + setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1); } - - for (uint32 i = 0; i < 3; i++) { - uint32 rndValue = _vm->_rnd->getRandomNumber(4 - 1) * 2 + 2; - uint32 index4 = 0; - setSubVar(VA_GOOD_DICE_NUMBERS, i, rndValue); - while (index4 < rndValue) { - uint32 rndIndex3 = _vm->_rnd->getRandomNumber(index3 - 1); - setSubVar(VA_TILE_SYMBOLS, array30[rndIndex3], getSubVar(VA_DICE_MEMORY_SYMBOLS, i)); - index3--; - while (rndIndex3 < index3) { - array30[rndIndex3] = array30[rndIndex3 + 1]; - rndIndex3++; - } - index4++; - } - } - - uint32 index5 = 0; - while (index3 != 0) { - uint32 rndIndex4 = _vm->_rnd->getRandomNumber(index3 - 1); - index1 = array3C[index5]; - setSubVar(VA_TILE_SYMBOLS, array30[rndIndex4], index1); - index3--; - while (rndIndex4 < index3) { - array30[rndIndex4] = array30[rndIndex4 + 1]; - rndIndex4++; - } - uint32 rndIndex5 = _vm->_rnd->getRandomNumber(index3 - 1); - setSubVar(VA_TILE_SYMBOLS, array30[rndIndex5], index1); - index3--; - while (rndIndex5 < index3) { - array30[rndIndex5] = array30[rndIndex5 + 1]; - rndIndex5++; - } - index5++; - if (index5 >= index2) - index5 = 0; - - } - - setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1); - } void GameModule::initWaterPipesPuzzle() { @@ -344,8 +278,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 6; - createModule(1300, -1); + _vm->gameState().sceneNum = 4; + createModule(1100, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -811,18 +745,26 @@ void GameModule::updateMenuModule() { NonRepeatingRandomNumbers::NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count) : _rnd(rnd) { for (int i = 0; i < count; i++) - _numbers.push_back(i); + push_back(i); } int NonRepeatingRandomNumbers::getNumber() { int number; if (!empty()) { - uint index = _rnd->getRandomNumber(_numbers.size() - 1); - number = _numbers[index]; - _numbers.remove_at(index); + uint index = _rnd->getRandomNumber(size() - 1); + number = (*this)[index]; + remove_at(index); } else number = 0; return number; } +void NonRepeatingRandomNumbers::removeNumber(int number) { + for (uint i = 0; i < size(); ++i) + if ((*this)[i] == number) { + remove_at(i); + break; + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 6aa711d96b..8fafe2ba9e 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -65,14 +65,13 @@ protected: void updateMenuModule(); }; -class NonRepeatingRandomNumbers { +class NonRepeatingRandomNumbers : public Common::Array { public: NonRepeatingRandomNumbers(Common::RandomSource *rnd, int count); int getNumber(); - bool empty() const { return _numbers.empty(); } + void removeNumber(int number); protected: Common::RandomSource *_rnd; - Common::Array _numbers; }; } // End of namespace Neverhood -- cgit v1.2.3 From 47994441cd5432df0c75953ea7d998c4b87c5443 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 20 Oct 2012 21:06:39 +0000 Subject: NEVERHOOD: Move setting of debug variables to the GameModule --- engines/neverhood/diskplayerscene.cpp | 6 ------ engines/neverhood/gamemodule.cpp | 29 +++++++++++++++++++++++++++++ engines/neverhood/module1300.cpp | 6 ------ engines/neverhood/module1400.cpp | 14 -------------- engines/neverhood/module2200.cpp | 9 --------- engines/neverhood/module2300.cpp | 4 ---- engines/neverhood/module2500.cpp | 3 --- engines/neverhood/module2800.cpp | 6 +----- engines/neverhood/module2900.cpp | 5 ----- engines/neverhood/navigationscene.cpp | 7 ------- 10 files changed, 30 insertions(+), 59 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 0371903e31..0ffb0b0acd 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -342,12 +342,6 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _asKey = insertSprite(); - // DEBUG>>>: Give all disks - for (int i = 0; i < 20; i++) { - setSubVar(VA_IS_TAPE_INSERTED, i, 1); - } - // DEBUG<<< - for (int i = 0; i < 20; i++) { _diskAvailable[i] = 0; if (getSubVar(VA_IS_TAPE_INSERTED, i)) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index ddbd4d9152..38d8b99c70 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -178,6 +178,21 @@ void GameModule::initMemoryPuzzle() { tileSymbolIndex = 0; } setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1); + + // DEBUG>>> + // TODO: Some debug code: Leave two matching tiles open + for (int i = 0; i < 48; i++) + setSubVar(VA_IS_TILE_MATCH, i, 1); + int debugIndex = 0; + setSubVar(VA_IS_TILE_MATCH, debugIndex, 0); + for (int i = 0; i < 48; i++) { + if (i != debugIndex && getSubVar(VA_TILE_SYMBOLS, i) == getSubVar(VA_TILE_SYMBOLS, debugIndex)) { + setSubVar(VA_IS_TILE_MATCH, i, 0); + break; + } + } + // <<>> - setSubVar(VA_IS_KEY_INSERTED, 0, 1); - setSubVar(VA_IS_KEY_INSERTED, 1, 1); - setSubVar(VA_IS_KEY_INSERTED, 2, 1); - //DEBUG<<< - Sprite *tempSprite; _vm->gameModule()->initKeySlotsPuzzle(); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index cfa1614602..7373172083 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1590,20 +1590,6 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x0C0C007D); insertMouse435(0xC00790C8, 20, 620); - // DEBUG>>> - // TODO: Some debug code: Leave two matching tiles open - for (int i = 0; i < 48; i++) - setSubVar(VA_IS_TILE_MATCH, i, 1); - int debugIndex = 0; - setSubVar(VA_IS_TILE_MATCH, debugIndex, 0); - for (int i = 0; i < 48; i++) { - if (i != debugIndex && getSubVar(VA_TILE_SYMBOLS, i) == getSubVar(VA_TILE_SYMBOLS, debugIndex)) { - setSubVar(VA_IS_TILE_MATCH, i, 0); - break; - } - } - // <<(this, tileIndex); _vm->_collisionMan->addSprite(_tiles[tileIndex]); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index d82bf8c1d9..b3798d2db9 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -896,11 +896,6 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); insertMouse435(0x00A08089, 20, 620); - //DEBUG>>> - for (uint32 index = 0; index < 9; index++) - setSubVar(VA_CUBE_POSITIONS, index, 7 - index); - //DEBUG<<< - for (uint32 index = 0; index < 9; index++) { int16 value = (int16)getSubVar(VA_CUBE_POSITIONS, index); if (value >= 0) { @@ -1999,10 +1994,6 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { - //DEBUG>>> - //setGlobalVar(V_LIGHTS_ON, 1); - //DEBUG<<< - _vm->gameModule()->initCannonSymbolsPuzzle(); if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852)) diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index c2cf0df133..9b1945a6e6 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -36,10 +36,6 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList); _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); - //DEBUG>>> - setGlobalVar(V_WALL_BROKEN, 0); - //DEBUG<<< - _flag = getGlobalVar(V_WALL_BROKEN) == 0; if (_flag) { diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 19779c3234..f67d1a6910 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -92,9 +92,6 @@ void Module2500::createScene(int sceneNum, int which) { createScene2704(which, 0x004B01B8, 220); break; case 2: - //DEBUG>>>Join the tracks. - setGlobalVar(V_WORLDS_JOINED, 1); - //DEBUG<<< _vm->gameState().which = which; if (getGlobalVar(V_WORLDS_JOINED)) createScene2704(which, 0x004B01E0, 150); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 268b2c67a9..8712cc3f26 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -507,10 +507,6 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _currTuneStatus(0), _countdown1(0), _countdown2(0) { - //DEBUG>>> Disable video - setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0); - //DEBUG<<< - SetMessageHandler(&Scene2802::handleMessage); SetUpdateHandler(&Scene2802::update); insertMouse435(0x008810A8, 20, 620); @@ -2583,7 +2579,7 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2808::update() { - // DEBUG>>>: Show correct values + // DEBUG>>> Show correct values debug("---------------"); debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2)); debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 976cf5d9f6..7dc8a9cb95 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -389,11 +389,6 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) _isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0; - //DEBUG>>> Enable all locations - for (int i = 0; i < 6; i++) - setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1); - //DEBUG<<< - setSubVar(V_TELEPORTER_DEST_AVAILABLE, which, 1); setSubVar(V_TELEPORTER_DEST_AVAILABLE, 5, 1); setSubVar(V_TELEPORTER_DEST_AVAILABLE, 4, 1); diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 96d33c0ffd..8e167dd4d6 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -31,13 +31,6 @@ NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint _navigationList = _vm->_staticData->getNavigationList(navigationListId); - //DEBUG>>> - for (NavigationList::iterator it = _navigationList->begin(); it != _navigationList->end(); it++) { - debug("%08X %08X %08X %08X %d %d %08X", (*it).fileHash, (*it).leftSmackerFileHash, (*it).rightSmackerFileHash, - (*it).middleSmackerFileHash, (*it).interactive, (*it).middleFlag, (*it).mouseCursorFileHash); - } - //DEBUG<<< - if (_navigationIndex < 0) { _navigationIndex = (int)getGlobalVar(V_NAVIGATION_INDEX); if (_navigationIndex >= (int)_navigationList->size()) -- cgit v1.2.3 From eb054471e0814768571c550a4d268e73e1ea6b65 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 22 Oct 2012 11:15:10 +0000 Subject: NEVERHOOD: Fix _drawRects in AsScene1002Door and SsCommonPressButton --- engines/neverhood/module1000.cpp | 48 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 4f8f584313..6a819181e1 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -618,10 +618,10 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) _y = 239; } - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _needRefresh = true; @@ -771,10 +771,10 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene _spriteResource.load2(fileHash1); createSurface(surfacePriority, 40, 40); - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; @@ -791,20 +791,20 @@ void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHashes[1] = fileHash2; if (_status == 2) { _spriteResource.load2(fileHash2); - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; StaticSprite::update(); } else { _spriteResource.load2(fileHash1); - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -817,10 +817,10 @@ void SsCommonPressButton::update() { if (_status == 1) { _status = 2; _spriteResource.load2(_fileHashes[1]); - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -829,10 +829,10 @@ void SsCommonPressButton::update() { } else if (_status == 2) { _status = 3; _spriteResource.load2(_fileHashes[0]); - _surface->getDrawRect().x = 0; - _surface->getDrawRect().y = 0; - _surface->getDrawRect().width = _spriteResource.getDimensions().width; - _surface->getDrawRect().height = _spriteResource.getDimensions().height; + _drawRect.x = 0; + _drawRect.y = 0; + _drawRect.width = _spriteResource.getDimensions().width; + _drawRect.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; -- cgit v1.2.3 From 9ba7a7f1a143e20eefdc47555840d4175103986b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 22 Oct 2012 12:26:53 +0000 Subject: NEVERHOOD: Rename stuff in Sprite: - processDelta() to updateBounds() - getRect() to getCollisionBounds() - _drawRect to _drawOffset - _rect to _collisionBounds - _deltaRect to _collisionBoundsOffset --- engines/neverhood/collisionman.cpp | 2 +- engines/neverhood/diskplayerscene.cpp | 12 ++--- engines/neverhood/klayman.cpp | 16 +++---- engines/neverhood/menumodule.cpp | 26 +++++------ engines/neverhood/module1000.cpp | 48 +++++++++---------- engines/neverhood/module1100.cpp | 24 +++++----- engines/neverhood/module1100.h | 2 +- engines/neverhood/module1200.cpp | 16 +++---- engines/neverhood/module1300.cpp | 6 +-- engines/neverhood/module1400.cpp | 22 ++++----- engines/neverhood/module1700.cpp | 12 ++--- engines/neverhood/module1900.cpp | 16 +++---- engines/neverhood/module2200.cpp | 62 ++++++++++++------------- engines/neverhood/module2500.cpp | 12 ++--- engines/neverhood/module2600.cpp | 6 +-- engines/neverhood/module2700.cpp | 2 +- engines/neverhood/module2800.cpp | 72 ++++++++++++++--------------- engines/neverhood/module2900.cpp | 48 +++++++++---------- engines/neverhood/module3000.cpp | 86 +++++++++++++++++------------------ engines/neverhood/mouse.cpp | 26 +++++------ engines/neverhood/sprite.cpp | 66 +++++++++++++-------------- engines/neverhood/sprite.h | 13 ++---- 22 files changed, 296 insertions(+), 299 deletions(-) diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index bacf18bd30..973c0fe853 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -94,7 +94,7 @@ void CollisionMan::clearSprites() { void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) { for (Common::Array::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) { Sprite *collSprite = *iter; - if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getRect())) { + if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) { sprite->sendMessage(collSprite, messageNum, messageParam); } } diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 0ffb0b0acd..e9813e61a3 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -198,14 +198,14 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene _spriteResource.load2(0x24A4A664); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect = _drawRect; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; + _collisionBoundsOffset = _drawOffset; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - processDelta(); + updateBounds(); _needRefresh = true; StaticSprite::update(); _surface->setVisible(false); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index f06ce40c68..9e9f136739 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -707,7 +707,7 @@ void Klayman::suAction() { _x = _destX; } - processDelta(); + updateBounds(); } @@ -753,7 +753,7 @@ void Klayman::suSneaking() { } } } - processDelta(); + updateBounds(); } } @@ -932,7 +932,7 @@ void Klayman::suWalkingTestExit() { } } } - processDelta(); + updateBounds(); } } @@ -1409,7 +1409,7 @@ void Klayman::suLargeStep() { _y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; } } - processDelta(); + updateBounds(); } } @@ -2175,7 +2175,7 @@ void Klayman::suJumpToGrab() { updateDeltaXY(); if (_y >= _destY) { _y = _destY; - processDelta(); + updateBounds(); gotoNextStateExt(); } } @@ -2856,7 +2856,7 @@ void Klayman::suFallDown() { HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; - processDelta(); + updateBounds(); sendMessage(this, 0x1019, 0); } _vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0); @@ -3016,7 +3016,7 @@ void Klayman::suFallSkipJump() { HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; - processDelta(); + updateBounds(); sendMessage(this, 0x1019, 0); } } @@ -3222,7 +3222,7 @@ void Klayman::stContSpitIntoPipe() { void Klayman::suRidePlatform() { _x = _attachedSprite->getX() - 20; _y = _attachedSprite->getY() + 46; - processDelta(); + updateBounds(); } void Klayman::stRidePlatform() { diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 97489194ac..e22a668912 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -166,41 +166,41 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but _spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]); createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; // TODO Move to const array switch (_buttonIndex) { case 0: - _rect.set(52, 121, 110, 156); + _collisionBounds.set(52, 121, 110, 156); break; case 1: - _rect.set(52, 192, 109, 222); + _collisionBounds.set(52, 192, 109, 222); break; case 2: - _rect.set(60, 257, 119, 286); + _collisionBounds.set(60, 257, 119, 286); break; case 3: - _rect.set(67, 326, 120, 354); + _collisionBounds.set(67, 326, 120, 354); break; case 4: - _rect.set(70, 389, 128, 416); + _collisionBounds.set(70, 389, 128, 416); break; case 5: - _rect.set(523, 113, 580, 144); + _collisionBounds.set(523, 113, 580, 144); break; case 6: - _rect.set(525, 176, 577, 206); + _collisionBounds.set(525, 176, 577, 206); break; case 7: - _rect.set(527, 384, 580, 412); + _collisionBounds.set(527, 384, 580, 412); break; case 8: - _rect.set(522, 255, 580, 289); + _collisionBounds.set(522, 255, 580, 289); break; } diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 6a819181e1..72cf0ede77 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -618,10 +618,10 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) _y = 239; } - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _needRefresh = true; @@ -771,10 +771,10 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene _spriteResource.load2(fileHash1); createSurface(surfacePriority, 40, 40); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; @@ -791,20 +791,20 @@ void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHashes[1] = fileHash2; if (_status == 2) { _spriteResource.load2(fileHash2); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; StaticSprite::update(); } else { _spriteResource.load2(fileHash1); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -817,10 +817,10 @@ void SsCommonPressButton::update() { if (_status == 1) { _status = 2; _spriteResource.load2(_fileHashes[1]); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -829,10 +829,10 @@ void SsCommonPressButton::update() { } else if (_status == 2) { _status = 3; _spriteResource.load2(_fileHashes[0]); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 6bf61408b7..e746be7184 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -267,10 +267,10 @@ static const uint32 kSsScene1105SymbolDieFileHashes[] = { 0x10098414 }; -SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect) +SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds) : StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) { - _rect = rect; + _collisionBounds = collisionBounds; SetMessageHandler(&SsScene1105Button::handleMessage); SetUpdateHandler(&SsScene1105Button::update); setVisible(false); @@ -306,8 +306,8 @@ SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 _x = x; _y = y; - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -(_spriteResource.getDimensions().height / 2); StaticSprite::update(); } @@ -339,8 +339,8 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p void SsScene1105SymbolDie::loadSymbolSprite() { load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false); - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -(_spriteResource.getDimensions().height / 2); StaticSprite::update(); } @@ -406,13 +406,13 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect = _drawRect; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; + _collisionBoundsOffset = _drawOffset; _needRefresh = true; - processDelta(); + updateBounds(); setVisible(false); loadSound(0, 0x44045140); SetUpdateHandler(&SsScene1105OpenButton::update); diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h index 98d1ae6311..126d14996d 100644 --- a/engines/neverhood/module1100.h +++ b/engines/neverhood/module1100.h @@ -43,7 +43,7 @@ protected: class SsScene1105Button : public StaticSprite { public: - SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &rect); + SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds); protected: Scene *_parentScene; int _countdown; diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 768e7819b0..bf4f1dff41 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -172,18 +172,18 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi _spriteResource.load2(kScene1201TntFileHashList1[elemIndex]); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; } else { _spriteResource.load2(kScene1201TntFileHashList2[elemIndex]); _x = x; _y = y; - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -_spriteResource.getDimensions().height; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -_spriteResource.getDimensions().height; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; } createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index ab63c2961f..b623af0791 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1165,7 +1165,7 @@ void AsScene1307Key::suRemoveKey() { if (_pointIndex < kAsScene1307KeyPointsCount) { _x += kAsScene1307KeyPoints[_pointIndex].x; _y += kAsScene1307KeyPoints[_pointIndex].y; - processDelta(); + updateBounds(); _pointIndex++; } else { SetSpriteUpdate(NULL); @@ -1176,7 +1176,7 @@ void AsScene1307Key::suInsertKey() { if (_pointIndex < kAsScene1307KeyPointsCount) { _x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x; _y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y; - processDelta(); + updateBounds(); _pointIndex++; if (_pointIndex == 7) playSound(0); @@ -1191,7 +1191,7 @@ void AsScene1307Key::suMoveKey() { _frameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; _x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue; _y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue; - processDelta(); + updateBounds(); _pointIndex++; } else { NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 7373172083..cedb283e0b 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -252,7 +252,7 @@ uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam ¶m void AsScene1401Mouse::suSuckedIn() { AnimatedSprite::updateDeltaXY(); - if (_rect.y1 <= 150) { + if (_collisionBounds.y1 <= 150) { playSound(0, 0x0E32247F); stopAnimation(); SetSpriteUpdate(NULL); @@ -289,7 +289,7 @@ uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam ¶ void AsScene1401Cheese::suSuckedIn() { AnimatedSprite::updateDeltaXY(); - if (_rect.y1 <= 150) { + if (_collisionBounds.y1 <= 150) { playSound(0, 0x18020439); stopAnimation(); SetSpriteUpdate(NULL); @@ -522,7 +522,7 @@ void AsCommonProjector::suMoving() { setGlobalVar(V_PROJECTOR_SLOT, 0); } } - Sprite::processDelta(); + Sprite::updateBounds(); } void AsCommonProjector::moveProjector() { @@ -558,7 +558,7 @@ void AsCommonProjector::moveProjector() { void AsCommonProjector::stSuckedIn() { AnimatedSprite::updateDeltaXY(); - if (_rect.y1 <= 150) { + if (_collisionBounds.y1 <= 150) { sendMessage(_asPipe, 0x483A, 0); stopAnimation(); SetMessageHandler(&Sprite::handleMessage); @@ -691,12 +691,12 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); - _klayman->processDelta(); + _klayman->updateBounds(); setMessageList(0x004B6670); } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); - _klayman->processDelta(); + _klayman->updateBounds(); setMessageList(0x004B6670); } _asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); @@ -917,12 +917,12 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); - _klayman->processDelta(); + _klayman->updateBounds(); setMessageList(0x004B0BD0); } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); - _klayman->processDelta(); + _klayman->updateBounds(); setMessageList(0x004B0BD0); } _asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2()); @@ -1118,7 +1118,7 @@ void AsScene1407Mouse::suWalkTo() { sendMessage(this, 0x1019, 0); } else { _x += xdelta; - processDelta(); + updateBounds(); } } @@ -1339,7 +1339,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); - _klayman->processDelta(); + _klayman->updateBounds(); setMessageList(0x004B1F70); } _asProjector->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2()); @@ -1457,7 +1457,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); - _klayman->processDelta(); + _klayman->updateBounds(); setMessageList(0x004B8CB8); } _asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 7df162c15e..f6dea96161 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -157,12 +157,12 @@ SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 setVisible(false); SetMessageHandler(NULL); } - _deltaRect = _drawRect; - _deltaRect.x -= 4; - _deltaRect.y -= 8; - _deltaRect.width += 8; - _deltaRect.height += 16; - Sprite::processDelta(); + _collisionBoundsOffset = _drawOffset; + _collisionBoundsOffset.x -= 4; + _collisionBoundsOffset.y -= 8; + _collisionBoundsOffset.width += 8; + _collisionBoundsOffset.height += 16; + Sprite::updateBounds(); } uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 0a02d85876..fb98c2e29a 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -219,8 +219,8 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); _newStickFrameIndex = 0; } - _deltaRect.set(0, 0, 80, 80); - Sprite::processDelta(); + _collisionBoundsOffset.set(0, 0, 80, 80); + Sprite::updateBounds(); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1907Symbol::handleMessage); @@ -413,7 +413,7 @@ void AsScene1907Symbol::cbFallOffHitGroundEvent() { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteUpdate(NULL); - processDelta(); + updateBounds(); playSound(2); } @@ -458,11 +458,11 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 _spriteResource.load2(0x64516424); createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); setVisible(false); - _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _deltaRect = _drawRect; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _collisionBoundsOffset = _drawOffset; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - processDelta(); + updateBounds(); _needRefresh = true; loadSound(0, 0x44061000); SetUpdateHandler(&SsScene1907UpDownButton::update); @@ -500,13 +500,13 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam void SsScene1907UpDownButton::setToUpPosition() { _y = _spriteResource.getPosition().y; - Sprite::processDelta(); + Sprite::updateBounds(); StaticSprite::update(); } void SsScene1907UpDownButton::setToDownPosition() { _y = _spriteResource.getPosition().y + 174; - Sprite::processDelta(); + Sprite::updateBounds(); StaticSprite::update(); } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index b3798d2db9..b746d51cb3 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -490,10 +490,10 @@ SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positio _spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]); createSurface(100, 16, 16); - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -(_spriteResource.getDimensions().height / 2); - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = kSsScene2201PuzzleCubePoints[positionIndex].x; _y = kSsScene2201PuzzleCubePoints[positionIndex].y; _needRefresh = true; @@ -683,14 +683,14 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS } else { createSurface(500, 128, 128); } - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -(_spriteResource.getDimensions().height / 2); - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect = _drawRect; + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; + _collisionBoundsOffset = _drawOffset; _x = kSsScene2202PuzzleTilePoints[_tileIndex].x; _y = kSsScene2202PuzzleTilePoints[_tileIndex].y; - processDelta(); + updateBounds(); _needRefresh = true; StaticSprite::update(); loadSound(0, 0x40958621); @@ -750,7 +750,7 @@ void SsScene2202PuzzleTile::suMoveTileX() { stopMoving(); } - processDelta(); + updateBounds(); } @@ -785,17 +785,17 @@ void SsScene2202PuzzleTile::suMoveTileY() { stopMoving(); } - processDelta(); + updateBounds(); } void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { _spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]); - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -(_spriteResource.getDimensions().height / 2); - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _needRefresh = true; setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1); @@ -873,10 +873,10 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { void SsScene2202PuzzleTile::stopMoving() { _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); - _drawRect.x = -(_spriteResource.getDimensions().width / 2); - _drawRect.y = -(_spriteResource.getDimensions().height / 2); - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = -(_spriteResource.getDimensions().width / 2); + _drawOffset.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _needRefresh = true; SetSpriteUpdate(NULL); _isMoving = false; @@ -1225,10 +1225,10 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) SetMessageHandler(&SsScene2205DoorFrame::handleMessage); _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); createSurface(1100, 45, 206); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -1240,10 +1240,10 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x2000: _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -1483,8 +1483,8 @@ SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene } else { SetMessageHandler(&SsScene2206TestTube::handleMessage); } - _deltaRect = _drawRect; - processDelta(); + _collisionBoundsOffset = _drawOffset; + updateBounds(); } uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1749,7 +1749,7 @@ void AsScene2207Elevator::update() { void AsScene2207Elevator::suSetPosition() { _x = (*_pointArray)[_pointIndex].x; _y = (*_pointArray)[_pointIndex].y - 60; - processDelta(); + updateBounds(); } uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index f67d1a6910..bb9e10be5f 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -487,14 +487,14 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) _spriteResource.load2(0x070220D9); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _deltaRect = _drawRect; - processDelta(); + _collisionBoundsOffset = _drawOffset; + updateBounds(); _needRefresh = true; setVisible(false); loadSound(0, 0x4600204C); diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 37e4406205..7008a905f4 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -213,11 +213,11 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) if (!getGlobalVar(V_WATER_RUNNING)) setVisible(false); - _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _deltaRect = _drawRect; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _collisionBoundsOffset = _drawOffset; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - processDelta(); + updateBounds(); _needRefresh = true; loadSound(0, 0x10267160); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index b0983dee98..c5524fa75a 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -514,7 +514,7 @@ SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _needRefresh = true; StaticSprite::update(); } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 8712cc3f26..7c895e970b 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -1226,7 +1226,7 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, NPoint pt = _dataResource.getPoint(0x0D84A1AD); _klayman->setX(pt.x); _klayman->setY(pt.y); - _klayman->processDelta(); + _klayman->updateBounds(); klaymanFloor(); _klayman->setClipRect(517, 401, 536, 480); setMessageList(0x004B6198); @@ -1240,7 +1240,7 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, _klayman->setClipRect(0, 0, 560, 315); _klayman->setX(560); _klayman->setY(315); - _klayman->processDelta(); + _klayman->updateBounds(); klaymanSlope(); setMessageList(0x004B61A0); } else if (param.asInteger() == 0x002CAA68) { @@ -1373,14 +1373,14 @@ SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *paren else _spriteResource.load2(0x11814A21); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _deltaRect = _drawRect; - processDelta(); + _collisionBoundsOffset = _drawOffset; + updateBounds(); setVisible(false); _needRefresh = true; SetUpdateHandler(&SsScene2804RedButton::update); @@ -1416,10 +1416,10 @@ SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm) _spriteResource.load2(0x8889B008); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1450,10 +1450,10 @@ SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm) _spriteResource.load2(0x06092132); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1484,10 +1484,10 @@ SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) _spriteResource.load2(0x211003A0); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1507,10 +1507,10 @@ SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) _spriteResource.load2(0x9A816000); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1656,14 +1656,14 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280 _spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _deltaRect = _drawRect; - processDelta(); + _collisionBoundsOffset = _drawOffset; + updateBounds(); setVisible(false); loadSound(0, 0x44045140); _needRefresh = true; @@ -2262,14 +2262,14 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce _spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]); createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _deltaRect = _drawRect; - processDelta(); + _collisionBoundsOffset = _drawOffset; + updateBounds(); SetUpdateHandler(&SsScene2808Dispenser::update); SetMessageHandler(&SsScene2808Dispenser::handleMessage); setVisible(false); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 7dc8a9cb95..7abab125d8 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -256,16 +256,16 @@ SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene _spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]); createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _rect.x1 = kSsScene2901LocationButtonPoints[_index].x - 25; - _rect.y1 = kSsScene2901LocationButtonPoints[_index].y - 25; - _rect.x2 = kSsScene2901LocationButtonPoints[_index].x + 25; - _rect.y2 = kSsScene2901LocationButtonPoints[_index].y + 25; + _collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25; + _collisionBounds.y1 = kSsScene2901LocationButtonPoints[_index].y - 25; + _collisionBounds.x2 = kSsScene2901LocationButtonPoints[_index].x + 25; + _collisionBounds.y2 = kSsScene2901LocationButtonPoints[_index].y + 25; setVisible(false); _needRefresh = true; loadSound(0, 0x440430C0); @@ -301,10 +301,10 @@ SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine * _spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]); createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -328,10 +328,10 @@ SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which) _spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]); createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -343,16 +343,16 @@ SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentSce _spriteResource.load2(kSsScene2901BigButtonFileHashes[which]); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _rect.x1 = 62; - _rect.y1 = 94; - _rect.x2 = 322; - _rect.y2 = 350; + _collisionBounds.x1 = 62; + _collisionBounds.y1 = 94; + _collisionBounds.x2 = 322; + _collisionBounds.y2 = 350; setVisible(false); _needRefresh = true; loadSound(0, 0xF3D420C8); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 7695248c4b..8005c625f0 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -475,16 +475,16 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect.x = 0; - _deltaRect.y = 0; - _deltaRect.width = _spriteResource.getDimensions().width; - _deltaRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; + _collisionBoundsOffset.x = 0; + _collisionBoundsOffset.y = 0; + _collisionBoundsOffset.width = _spriteResource.getDimensions().width; + _collisionBoundsOffset.height = _spriteResource.getDimensions().height; setVisible(false); - processDelta(); + updateBounds(); _needRefresh = true; SetUpdateHandler(&SsScene3009FireCannonButton::update); SetMessageHandler(&SsScene3009FireCannonButton::handleMessage); @@ -521,10 +521,10 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; _needRefresh = true; if (getGlobalVar(V_ROBOT_HIT)) { hide(); @@ -573,10 +573,10 @@ SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; setVisible(false); _needRefresh = true; } @@ -595,12 +595,12 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy createSurface(1200, 33, 31); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = 33; - _drawRect.height = 31; - _deltaRect = _drawRect; - processDelta(); + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = 33; + _drawOffset.height = 31; + _collisionBoundsOffset = _drawOffset; + updateBounds(); _needRefresh = true; SetUpdateHandler(&SsScene3009SymbolArrow::update); SetMessageHandler(&SsScene3009SymbolArrow::handleMessage); @@ -617,10 +617,10 @@ void SsScene3009SymbolArrow::update() { if (_countdown != 0 && (--_countdown == 0)) { _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]); _needRefresh = true; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; } } @@ -632,10 +632,10 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam _countdown = 2; _spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]); _needRefresh = true; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; playSound(0); sendMessage(_asSymbol, 0x2005, _incrDecr); } @@ -1155,12 +1155,12 @@ void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { _spriteResource.load(fileHash); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect = _drawRect; - processDelta(); + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; + _collisionBoundsOffset = _drawOffset; + updateBounds(); _needRefresh = true; StaticSprite::update(); } @@ -1430,13 +1430,13 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; - _deltaRect = _drawRect; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; + _collisionBoundsOffset = _drawOffset; setVisible(false); - processDelta(); + updateBounds(); _needRefresh = true; SetUpdateHandler(&SsScene3011Button::update); SetMessageHandler(&SsScene3011Button::handleMessage); diff --git a/engines/neverhood/mouse.cpp b/engines/neverhood/mouse.cpp index 105d170fce..632f56fb74 100644 --- a/engines/neverhood/mouse.cpp +++ b/engines/neverhood/mouse.cpp @@ -74,12 +74,12 @@ void Mouse::init(uint32 fileHash) { createSurface(2000, 32, 32); SetUpdateHandler(&Mouse::update); SetMessageHandler(&Mouse::handleMessage); - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = 32; - _drawRect.height = 32; - _deltaRect = _drawRect; - processDelta(); + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = 32; + _drawOffset.height = 32; + _collisionBoundsOffset = _drawOffset; + updateBounds(); _needRefresh = true; CursorMan.showMouse(false); } @@ -155,7 +155,7 @@ uint32 Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *s _x = param.asPoint().x; _y = param.asPoint().y; updateCursorNum(); - processDelta(); + updateBounds(); break; } return messageResult; @@ -167,24 +167,24 @@ void Mouse::updateCursor() { return; if (_doDeltaX) { - _surface->getDrawRect().x = filterX(_x - _drawRect.width - _drawRect.x + 1); + _surface->getDrawRect().x = filterX(_x - _drawOffset.width - _drawOffset.x + 1); } else { - _surface->getDrawRect().x = filterX(_x + _drawRect.x); + _surface->getDrawRect().x = filterX(_x + _drawOffset.x); } if (_doDeltaY) { - _surface->getDrawRect().y = filterY(_y - _drawRect.height - _drawRect.y + 1); + _surface->getDrawRect().y = filterY(_y - _drawOffset.height - _drawOffset.y + 1); } else { - _surface->getDrawRect().y = filterY(_y + _drawRect.y); + _surface->getDrawRect().y = filterY(_y + _drawOffset.y); } if (_needRefresh) { _needRefresh = false; - _drawRect = _mouseCursorResource.getRect(); + _drawOffset = _mouseCursorResource.getRect(); _surface->drawMouseCursorResource(_mouseCursorResource, _frameNum / 2); Graphics::Surface *cursorSurface = _surface->getSurface(); CursorMan.replaceCursor((const byte*)cursorSurface->pixels, - cursorSurface->w, cursorSurface->h, -_drawRect.x, -_drawRect.y, 0); + cursorSurface->w, cursorSurface->h, -_drawOffset.x, -_drawOffset.y, 0); } } diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index f81be07dff..fb45b8a7be 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -38,20 +38,20 @@ Sprite::~Sprite() { delete _surface; } -void Sprite::processDelta() { +void Sprite::updateBounds() { if (_doDeltaX) { - _rect.x1 = _x - _deltaRect.x - _deltaRect.width + 1; - _rect.x2 = _x - _deltaRect.x; + _collisionBounds.x1 = _x - _collisionBoundsOffset.x - _collisionBoundsOffset.width + 1; + _collisionBounds.x2 = _x - _collisionBoundsOffset.x; } else { - _rect.x1 = _x + _deltaRect.x; - _rect.x2 = _x + _deltaRect.x + _deltaRect.width - 1; + _collisionBounds.x1 = _x + _collisionBoundsOffset.x; + _collisionBounds.x2 = _x + _collisionBoundsOffset.x + _collisionBoundsOffset.width - 1; } if (_doDeltaY) { - _rect.y1 = _y - _deltaRect.y - _deltaRect.height + 1; - _rect.y2 = _y - _deltaRect.y; + _collisionBounds.y1 = _y - _collisionBoundsOffset.y - _collisionBoundsOffset.height + 1; + _collisionBounds.y2 = _y - _collisionBoundsOffset.y; } else { - _rect.y1 = _y + _deltaRect.y; - _rect.y2 = _y + _deltaRect.y + _deltaRect.height - 1; + _collisionBounds.y1 = _y + _collisionBoundsOffset.y; + _collisionBounds.y2 = _y + _collisionBoundsOffset.y + _collisionBoundsOffset.height - 1; } } @@ -66,11 +66,11 @@ void Sprite::setDoDeltaY(int type) { } bool Sprite::isPointInside(int16 x, int16 y) { - return x >= _rect.x1 && x <= _rect.x2 && y >= _rect.y1 && y <= _rect.y2; + return x >= _collisionBounds.x1 && x <= _collisionBounds.x2 && y >= _collisionBounds.y1 && y <= _collisionBounds.y2; } bool Sprite::checkCollision(NRect &rect) { - return (_rect.x1 < rect.x2) && (rect.x1 < _rect.x2) && (_rect.y1 < rect.y2) && (rect.y1 < _rect.y2); + return (_collisionBounds.x1 < rect.x2) && (rect.x1 < _collisionBounds.x2) && (_collisionBounds.y1 < rect.y2) && (rect.y1 < _collisionBounds.y2); } uint32 Sprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -147,10 +147,10 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, _x = x == kDefPosition ? _spriteResource.getPosition().x : x; _y = y == kDefPosition ? _spriteResource.getPosition().y : y; - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = width; - _drawRect.height = height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = width; + _drawOffset.height = height; _needRefresh = true; @@ -164,19 +164,19 @@ void StaticSprite::update() { return; if (_doDeltaX) { - _surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1); + _surface->getDrawRect().x = filterX(_x - _drawOffset.x - _drawOffset.width + 1); } else { - _surface->getDrawRect().x = filterX(_x + _drawRect.x); + _surface->getDrawRect().x = filterX(_x + _drawOffset.x); } if (_doDeltaY) { - _surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1); + _surface->getDrawRect().y = filterY(_y - _drawOffset.y - _drawOffset.height + 1); } else { - _surface->getDrawRect().y = filterY(_y + _drawRect.y); + _surface->getDrawRect().y = filterY(_y + _drawOffset.y); } if (_needRefresh) { - _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); + _surface->drawSpriteResourceEx(_spriteResource, _doDeltaX, _doDeltaY, _drawOffset.width, _drawOffset.height); _needRefresh = false; } @@ -187,10 +187,10 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { _spriteResource.load2(fileHash); if (dimensions) { - _drawRect.x = 0; - _drawRect.y = 0; - _drawRect.width = _spriteResource.getDimensions().width; - _drawRect.height = _spriteResource.getDimensions().height; + _drawOffset.x = 0; + _drawOffset.y = 0; + _drawOffset.width = _spriteResource.getDimensions().width; + _drawOffset.height = _spriteResource.getDimensions().height; } if (position) { @@ -261,7 +261,7 @@ void AnimatedSprite::updateDeltaXY() { } _deltaX = 0; _deltaY = 0; - processDelta(); + updateBounds(); } void AnimatedSprite::setRepl(byte oldColor, byte newColor) { @@ -370,19 +370,19 @@ void AnimatedSprite::updatePosition() { return; if (_doDeltaX) { - _surface->getDrawRect().x = filterX(_x - _drawRect.x - _drawRect.width + 1); + _surface->getDrawRect().x = filterX(_x - _drawOffset.x - _drawOffset.width + 1); } else { - _surface->getDrawRect().x = filterX(_x + _drawRect.x); + _surface->getDrawRect().x = filterX(_x + _drawOffset.x); } if (_doDeltaY) { - _surface->getDrawRect().y = filterY(_y - _drawRect.y - _drawRect.height + 1); + _surface->getDrawRect().y = filterY(_y - _drawOffset.y - _drawOffset.height + 1); } else { - _surface->getDrawRect().y = filterY(_y + _drawRect.y); + _surface->getDrawRect().y = filterY(_y + _drawOffset.y); } if (_needRefresh) { - _surface->drawAnimResource(_animResource, _currFrameIndex, _doDeltaX, _doDeltaY, _drawRect.width, _drawRect.height); + _surface->drawAnimResource(_animResource, _currFrameIndex, _doDeltaX, _doDeltaY, _drawOffset.width, _drawOffset.height); _needRefresh = false; } @@ -414,12 +414,12 @@ void AnimatedSprite::updateFrameInfo() { debug(8, "AnimatedSprite::updateFrameInfo()"); const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_currFrameIndex); _frameChanged = true; - _drawRect = frameInfo.rect; + _drawOffset = frameInfo.rect; _deltaX = frameInfo.deltaX; _deltaY = frameInfo.deltaY; - _deltaRect = frameInfo.deltaRect; + _collisionBoundsOffset = frameInfo.deltaRect; _currFrameTicks = frameInfo.counter; - processDelta(); + updateBounds(); _needRefresh = true; if (frameInfo.frameHash != 0) sendMessage(this, 0x100D, frameInfo.frameHash); diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 358a37bc57..7e07f3a412 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -42,7 +42,7 @@ public: ~Sprite(); void init() {} BaseSurface *getSurface() { return _surface; } - void processDelta(); + void updateBounds(); void setDoDeltaX(int type); void setDoDeltaY(int type); bool isPointInside(int16 x, int16 y); @@ -54,7 +54,7 @@ public: uint16 getFlags() const { return _flags; } bool isDoDeltaX() const { return _doDeltaX; } bool isDoDeltaY() const { return _doDeltaY; } - NRect& getRect() { return _rect; } + NRect& getCollisionBounds() { return _collisionBounds; } uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void loadDataResource(uint32 fileHash); int16 defFilterY(int16 y); @@ -75,13 +75,10 @@ protected: int16 _x, _y; bool _doDeltaX, _doDeltaY; bool _needRefresh; - //0000002B field_2B db ? - //0000002C field2C dd ? // unused - NDrawRect _drawRect; - NDrawRect _deltaRect; - NRect _rect; + NDrawRect _drawOffset; + NRect _collisionBounds; + NDrawRect _collisionBoundsOffset; uint16 _flags; - //0000004A field4A dw ? // seems to be unused except in ctor DataResource _dataResource; void createSurface(int surfacePriority, int16 width, int16 height); void handleSpriteUpdate() { -- cgit v1.2.3 From f24a6769c2bf376def72274d6ed94c786ca03766 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 22 Oct 2012 13:00:41 +0000 Subject: NEVERHOOD: Make use of NDrawRect::set --- engines/neverhood/diskplayerscene.cpp | 5 +--- engines/neverhood/menumodule.cpp | 5 +--- engines/neverhood/module1000.cpp | 30 +++++------------------ engines/neverhood/module1100.cpp | 9 +++---- engines/neverhood/module1200.cpp | 11 +++------ engines/neverhood/module2200.cpp | 34 ++++++++------------------ engines/neverhood/module2500.cpp | 5 +--- engines/neverhood/module2800.cpp | 35 ++++++--------------------- engines/neverhood/module2900.cpp | 25 ++++--------------- engines/neverhood/module3000.cpp | 45 +++++++---------------------------- engines/neverhood/sprite.cpp | 10 ++------ 11 files changed, 48 insertions(+), 166 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index e9813e61a3..75755ddeee 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -198,10 +198,7 @@ DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene _spriteResource.load2(0x24A4A664); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _collisionBoundsOffset = _drawOffset; _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index e22a668912..2e7f85d98c 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -166,10 +166,7 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but _spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]); createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 72cf0ede77..ff26d17467 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -618,10 +618,7 @@ AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) _y = 239; } - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _needRefresh = true; @@ -771,10 +768,7 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene _spriteResource.load2(fileHash1); createSurface(surfacePriority, 40, 40); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; @@ -791,20 +785,14 @@ void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHashes[1] = fileHash2; if (_status == 2) { _spriteResource.load2(fileHash2); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; StaticSprite::update(); } else { _spriteResource.load2(fileHash1); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -817,10 +805,7 @@ void SsCommonPressButton::update() { if (_status == 1) { _status = 2; _spriteResource.load2(_fileHashes[1]); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -829,10 +814,7 @@ void SsCommonPressButton::update() { } else if (_status == 2) { _status = 3; _spriteResource.load2(_fileHashes[0]); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index e746be7184..d21e3af2da 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -306,8 +306,8 @@ SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 _x = x; _y = y; - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -(_spriteResource.getDimensions().height / 2); + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); StaticSprite::update(); } @@ -406,10 +406,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _collisionBoundsOffset = _drawOffset; _needRefresh = true; updateBounds(); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index bf4f1dff41..52375881bc 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -172,18 +172,13 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi _spriteResource.load2(kScene1201TntFileHashList1[elemIndex]); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); } else { _spriteResource.load2(kScene1201TntFileHashList2[elemIndex]); _x = x; _y = y; - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -_spriteResource.getDimensions().height; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -_spriteResource.getDimensions().height, + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); } createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index b746d51cb3..06cdc1009b 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -490,10 +490,8 @@ SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positio _spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]); createSurface(100, 16, 16); - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -(_spriteResource.getDimensions().height / 2); - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = kSsScene2201PuzzleCubePoints[positionIndex].x; _y = kSsScene2201PuzzleCubePoints[positionIndex].y; _needRefresh = true; @@ -683,10 +681,8 @@ SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentS } else { createSurface(500, 128, 128); } - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -(_spriteResource.getDimensions().height / 2); - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _collisionBoundsOffset = _drawOffset; _x = kSsScene2202PuzzleTilePoints[_tileIndex].x; _y = kSsScene2202PuzzleTilePoints[_tileIndex].y; @@ -792,10 +788,8 @@ void SsScene2202PuzzleTile::suMoveTileY() { void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { _spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]); - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -(_spriteResource.getDimensions().height / 2); - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _needRefresh = true; setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1); @@ -873,10 +867,8 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { void SsScene2202PuzzleTile::stopMoving() { _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -(_spriteResource.getDimensions().height / 2); - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _needRefresh = true; SetSpriteUpdate(NULL); _isMoving = false; @@ -1225,10 +1217,7 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) SetMessageHandler(&SsScene2205DoorFrame::handleMessage); _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); createSurface(1100, 45, 206); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -1240,10 +1229,7 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x2000: _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index bb9e10be5f..8345a8c3a3 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -487,10 +487,7 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) _spriteResource.load2(0x070220D9); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _collisionBoundsOffset = _drawOffset; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 7c895e970b..53ae40c0ea 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -1373,10 +1373,7 @@ SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *paren else _spriteResource.load2(0x11814A21); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _collisionBoundsOffset = _drawOffset; @@ -1416,10 +1413,7 @@ SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm) _spriteResource.load2(0x8889B008); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1450,10 +1444,7 @@ SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm) _spriteResource.load2(0x06092132); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1484,10 +1475,7 @@ SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) _spriteResource.load2(0x211003A0); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1507,10 +1495,7 @@ SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) _spriteResource.load2(0x9A816000); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -1656,10 +1641,7 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280 _spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _collisionBoundsOffset = _drawOffset; @@ -2262,10 +2244,7 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce _spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]); createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _collisionBoundsOffset = _drawOffset; diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 7abab125d8..ae74b14814 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -256,10 +256,7 @@ SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene _spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]); createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25; @@ -301,10 +298,7 @@ SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine * _spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]); createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; setVisible(false); @@ -328,10 +322,7 @@ SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which) _spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]); createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; _needRefresh = true; @@ -343,16 +334,10 @@ SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentSce _spriteResource.load2(kSsScene2901BigButtonFileHashes[which]); createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _collisionBounds.x1 = 62; - _collisionBounds.y1 = 94; - _collisionBounds.x2 = 322; - _collisionBounds.y2 = 350; + _collisionBounds.set(62, 94, 322, 350); setVisible(false); _needRefresh = true; loadSound(0, 0xF3D420C8); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 8005c625f0..cb4faafbed 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -475,14 +475,8 @@ SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Sc createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; - _collisionBoundsOffset.x = 0; - _collisionBoundsOffset.y = 0; - _collisionBoundsOffset.width = _spriteResource.getDimensions().width; - _collisionBoundsOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + _collisionBoundsOffset = _drawOffset; setVisible(false); updateBounds(); _needRefresh = true; @@ -521,10 +515,7 @@ SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _needRefresh = true; if (getGlobalVar(V_ROBOT_HIT)) { hide(); @@ -573,10 +564,7 @@ SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); setVisible(false); _needRefresh = true; } @@ -595,10 +583,7 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy createSurface(1200, 33, 31); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = 33; - _drawOffset.height = 31; + _drawOffset.set(0, 0, 33, 31); _collisionBoundsOffset = _drawOffset; updateBounds(); _needRefresh = true; @@ -617,10 +602,7 @@ void SsScene3009SymbolArrow::update() { if (_countdown != 0 && (--_countdown == 0)) { _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]); _needRefresh = true; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); } } @@ -632,10 +614,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam _countdown = 2; _spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]); _needRefresh = true; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); playSound(0); sendMessage(_asSymbol, 0x2005, _incrDecr); } @@ -1155,10 +1134,7 @@ void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { _spriteResource.load(fileHash); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _collisionBoundsOffset = _drawOffset; updateBounds(); _needRefresh = true; @@ -1430,10 +1406,7 @@ SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bo createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = _spriteResource.getPosition().x; _y = _spriteResource.getPosition().y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _collisionBoundsOffset = _drawOffset; setVisible(false); updateBounds(); diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index fb45b8a7be..0696aa6714 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -147,10 +147,7 @@ void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, _x = x == kDefPosition ? _spriteResource.getPosition().x : x; _y = y == kDefPosition ? _spriteResource.getPosition().y : y; - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = width; - _drawOffset.height = height; + _drawOffset.set(0, 0, width, height); _needRefresh = true; @@ -187,10 +184,7 @@ void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { _spriteResource.load2(fileHash); if (dimensions) { - _drawOffset.x = 0; - _drawOffset.y = 0; - _drawOffset.width = _spriteResource.getDimensions().width; - _drawOffset.height = _spriteResource.getDimensions().height; + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); } if (position) { -- cgit v1.2.3 From bf1371c9d49845d3aadab2b235208bf601ab3987 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 22 Oct 2012 14:05:16 +0000 Subject: NEVERHOOD: Rename and clean up fields in AnimFrameInfo --- engines/neverhood/neverhood.cpp | 8 ++++---- engines/neverhood/resource.cpp | 29 ++++++++++++++--------------- engines/neverhood/resource.h | 5 ++--- engines/neverhood/sprite.cpp | 4 ++-- 4 files changed, 22 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 631b0506b1..1a738c1ba9 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -251,15 +251,15 @@ void NeverhoodEngine::dumpAllResources() { anim.load(entry.archiveEntry->fileHash); for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) { const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex); - int16 width = (frameInfo.rect.width + 3) & 0xFFFC; - byte *pixels = new byte[width * frameInfo.rect.height]; - memset(pixels, 0, width * frameInfo.rect.height); + int16 width = (frameInfo.drawOffset.width + 3) & 0xFFFC; + byte *pixels = new byte[width * frameInfo.drawOffset.height]; + memset(pixels, 0, width * frameInfo.drawOffset.height); anim.draw(frameIndex, pixels, width, false, false); Common::String filename = frameInfo.frameHash != 0 ? Common::String::format("%08X_%03d_%08X.tga", entry.archiveEntry->fileHash, frameIndex, frameInfo.frameHash) : Common::String::format("%08X_%03d.tga", entry.archiveEntry->fileHash, frameIndex); - writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.rect.height); + writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.drawOffset.height); delete[] pixels; } } diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index aff3528b45..1246472926 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -160,8 +160,8 @@ AnimResource::~AnimResource() { void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) { const AnimFrameInfo frameInfo = _frames[frameIndex]; _currSpriteData = _spriteData + frameInfo.spriteDataOffs; - _width = frameInfo.rect.width; - _height = frameInfo.rect.height; + _width = frameInfo.drawOffset.width; + _height = frameInfo.drawOffset.height; if (_replEnabled && _replOldColor != _replNewColor) unpackSpriteRle(_currSpriteData, _width, _height, dest, destPitch, flipX, flipY, _replOldColor, _replNewColor); else @@ -235,24 +235,23 @@ bool AnimResource::load(uint32 fileHash) { AnimFrameInfo frameInfo; frameInfo.frameHash = READ_LE_UINT32(frameList); frameInfo.counter = READ_LE_UINT16(frameList + 4); - frameInfo.rect.x = READ_LE_UINT16(frameList + 6); - frameInfo.rect.y = READ_LE_UINT16(frameList + 8); - frameInfo.rect.width = READ_LE_UINT16(frameList + 10); - frameInfo.rect.height = READ_LE_UINT16(frameList + 12); + frameInfo.drawOffset.x = READ_LE_UINT16(frameList + 6); + frameInfo.drawOffset.y = READ_LE_UINT16(frameList + 8); + frameInfo.drawOffset.width = READ_LE_UINT16(frameList + 10); + frameInfo.drawOffset.height = READ_LE_UINT16(frameList + 12); frameInfo.deltaX = READ_LE_UINT16(frameList + 14); frameInfo.deltaY = READ_LE_UINT16(frameList + 16); - frameInfo.deltaRect.x = READ_LE_UINT16(frameList + 18); - frameInfo.deltaRect.y = READ_LE_UINT16(frameList + 20); - frameInfo.deltaRect.width = READ_LE_UINT16(frameList + 22); - frameInfo.deltaRect.height = READ_LE_UINT16(frameList + 24); - frameInfo.field_1A = READ_LE_UINT16(frameList + 26); + frameInfo.collisionBoundsOffset.x = READ_LE_UINT16(frameList + 18); + frameInfo.collisionBoundsOffset.y = READ_LE_UINT16(frameList + 20); + frameInfo.collisionBoundsOffset.width = READ_LE_UINT16(frameList + 22); + frameInfo.collisionBoundsOffset.height = READ_LE_UINT16(frameList + 24); frameInfo.spriteDataOffs = READ_LE_UINT32(frameList + 28); - debug(8, "frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; deltaRect = (%d,%d,%d,%d); field_1A = %04X; spriteDataOffs = %08X", + debug(8, "frameHash = %08X; counter = %d; rect = (%d,%d,%d,%d); deltaX = %d; deltaY = %d; collisionBoundsOffset = (%d,%d,%d,%d); spriteDataOffs = %08X", frameInfo.frameHash, frameInfo.counter, - frameInfo.rect.x, frameInfo.rect.y, frameInfo.rect.width, frameInfo.rect.height, + frameInfo.drawOffset.x, frameInfo.drawOffset.y, frameInfo.drawOffset.width, frameInfo.drawOffset.height, frameInfo.deltaX, frameInfo.deltaY, - frameInfo.deltaRect.x, frameInfo.deltaRect.y, frameInfo.deltaRect.width, frameInfo.deltaRect.height, - frameInfo.field_1A, frameInfo.spriteDataOffs); + frameInfo.collisionBoundsOffset.x, frameInfo.collisionBoundsOffset.y, frameInfo.collisionBoundsOffset.width, frameInfo.collisionBoundsOffset.height, + frameInfo.spriteDataOffs); frameList += 32; _frames.push_back(frameInfo); } diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index b49ee883b7..50a49e3bdc 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -68,10 +68,9 @@ protected: struct AnimFrameInfo { uint32 frameHash; int16 counter; - NDrawRect rect; + NDrawRect drawOffset; int16 deltaX, deltaY; - NDrawRect deltaRect; - uint16 field_1A; + NDrawRect collisionBoundsOffset; uint32 spriteDataOffs; }; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 0696aa6714..40b651e53b 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -408,10 +408,10 @@ void AnimatedSprite::updateFrameInfo() { debug(8, "AnimatedSprite::updateFrameInfo()"); const AnimFrameInfo &frameInfo = _animResource.getFrameInfo(_currFrameIndex); _frameChanged = true; - _drawOffset = frameInfo.rect; + _drawOffset = frameInfo.drawOffset; _deltaX = frameInfo.deltaX; _deltaY = frameInfo.deltaY; - _collisionBoundsOffset = frameInfo.deltaRect; + _collisionBoundsOffset = frameInfo.collisionBoundsOffset; _currFrameTicks = frameInfo.counter; updateBounds(); _needRefresh = true; -- cgit v1.2.3 From 1589e4fe7d01e668ee5d5d02684e073df1242ad4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 22 Oct 2012 18:09:27 +0000 Subject: NEVERHOOD: Add new method StaticSprite::loadSprite and use it instead of setting stuff "manually" --- engines/neverhood/diskplayerscene.cpp | 28 +++--- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/menumodule.cpp | 12 +-- engines/neverhood/module1000.cpp | 60 ++----------- engines/neverhood/module1100.cpp | 28 ++---- engines/neverhood/module1200.cpp | 15 +--- engines/neverhood/module1300.cpp | 4 +- engines/neverhood/module1400.cpp | 2 +- engines/neverhood/module1700.cpp | 2 +- engines/neverhood/module1900.cpp | 21 ++--- engines/neverhood/module2100.cpp | 9 +- engines/neverhood/module2200.cpp | 69 +++++---------- engines/neverhood/module2400.cpp | 6 +- engines/neverhood/module2500.cpp | 11 +-- engines/neverhood/module2600.cpp | 15 +--- engines/neverhood/module2700.cpp | 8 +- engines/neverhood/module2800.cpp | 157 +++++++++------------------------- engines/neverhood/module2900.cpp | 46 +++------- engines/neverhood/module3000.cpp | 98 ++++++--------------- engines/neverhood/sprite.cpp | 72 ++++++---------- engines/neverhood/sprite.h | 16 ++-- 21 files changed, 190 insertions(+), 493 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 75755ddeee..572074bd18 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -165,7 +165,7 @@ AsDiskplayerSceneKey::AsDiskplayerSceneKey(NeverhoodEngine *vm) _newStickFrameIndex = 0; _needRefresh = true; updatePosition(); - _surface->setVisible(false); + setVisible(false); } uint32 AsDiskplayerSceneKey::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -183,29 +183,21 @@ void AsDiskplayerSceneKey::stDropKey() { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsDiskplayerSceneKey::handleMessage); NextState(&AsDiskplayerSceneKey::stDropKeyDone); - _surface->setVisible(true); + setVisible(true); } void AsDiskplayerSceneKey::stDropKeyDone() { stopAnimation(); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&Sprite::handleMessage); - _surface->setVisible(false); + setVisible(false); } DiskplayerPlayButton::DiskplayerPlayButton(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene) : StaticSprite(vm, 1400), _diskplayerScene(diskplayerScene), _isPlaying(false) { - _spriteResource.load2(0x24A4A664); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - updateBounds(); - _needRefresh = true; - StaticSprite::update(); - _surface->setVisible(false); + loadSprite(0x24A4A664, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); loadSound(0, 0x44043000); loadSound(1, 0x44045000); SetMessageHandler(&DiskplayerPlayButton::handleMessage); @@ -225,7 +217,7 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p press(); } } - StaticSprite::update(); + updatePosition(); messageResult = 1; break; } @@ -234,8 +226,8 @@ uint32 DiskplayerPlayButton::handleMessage(int messageNum, const MessageParam &p void DiskplayerPlayButton::press() { if (!_isPlaying) { - _surface->setVisible(true); - StaticSprite::update(); + setVisible(true); + updatePosition(); playSound(0); _isPlaying = true; } @@ -243,8 +235,8 @@ void DiskplayerPlayButton::press() { void DiskplayerPlayButton::release() { if (_isPlaying) { - _surface->setVisible(false); - StaticSprite::update(); + setVisible(false); + updatePosition(); playSound(1); _isPlaying = false; } diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 38d8b99c70..f9e734dd8d 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -307,8 +307,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 4; - createModule(1100, -1); + _vm->gameState().sceneNum = 2; + createModule(2800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 2e7f85d98c..fdde1a23e0 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -163,12 +163,7 @@ static const uint32 kMainMenuButtonFileHashes[] = { MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex) : StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) { - _spriteResource.load2(kMainMenuButtonFileHashes[_buttonIndex]); - createSurface(100, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(kMainMenuButtonFileHashes[_buttonIndex], kSLFDefDrawOffset | kSLFDefPosition, 100); // TODO Move to const array switch (_buttonIndex) { @@ -202,15 +197,12 @@ MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint but } setVisible(false); - _needRefresh = true; - SetUpdateHandler(&MainMenuButton::update); SetMessageHandler(&MainMenuButton::handleMessage); - } void MainMenuButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown) == 0) { setVisible(false); sendMessage(_parentScene, 0x2000, _buttonIndex); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index ff26d17467..ac6830edc0 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -606,32 +606,16 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam ¶m AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) : StaticSprite(vm, 1200) { - _spriteResource.load2(0x1052370F); - createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(0x1052370F, kSLFDefDrawOffset | kSLFSetPosition, 800, 526, getGlobalVar(V_FLYTRAP_RING_DOOR) ? 49 : 239); setClipRect(clipRect); - - _x = 526; - - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { - _y = 49; - } else { - _y = 239; - } - - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - - _needRefresh = true; - SetUpdateHandler(&AsScene1002Door::update); SetMessageHandler(&AsScene1002Door::handleMessage); SetSpriteUpdate(NULL); - StaticSprite::update(); - } void AsScene1002Door::update() { handleSpriteUpdate(); - StaticSprite::update(); + updatePosition(); } uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -761,42 +745,22 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene : StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) { _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; - _fileHashes[0] = fileHash1; _fileHashes[1] = fileHash2; - - _spriteResource.load2(fileHash1); createSurface(surfacePriority, 40, 40); - - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - + loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition); setVisible(false); - _needRefresh = true; - SetUpdateHandler(&SsCommonPressButton::update); SetMessageHandler(&SsCommonPressButton::handleMessage); - } void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHashes[0] = fileHash1; _fileHashes[1] = fileHash2; if (_status == 2) { - _spriteResource.load2(fileHash2); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(fileHash2, kSLFDefDrawOffset | kSLFDefPosition); } else { - _spriteResource.load2(fileHash1); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition); } } @@ -804,21 +768,11 @@ void SsCommonPressButton::update() { if (_countdown != 0 && (--_countdown) == 0) { if (_status == 1) { _status = 2; - _spriteResource.load2(_fileHashes[1]); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(_fileHashes[1], kSLFDefDrawOffset | kSLFDefPosition); _countdown = 4; } else if (_status == 2) { _status = 3; - _spriteResource.load2(_fileHashes[0]); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(_fileHashes[0], kSLFDefDrawOffset | kSLFDefPosition); _countdown = 4; } else if (_status == 3) { _status = 0; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index d21e3af2da..afcd698f86 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -302,19 +302,15 @@ uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam ¶ } SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y) - : StaticSprite(vm, fileHash, 200) { + : StaticSprite(vm, 0) { - _x = x; - _y = y; - _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), - _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - StaticSprite::update(); + loadSprite(fileHash, kSLFCenteredDrawOffset | kSLFSetPosition, 200, x, y); } void SsScene1105Symbol::hide() { setVisible(false); _needRefresh = true; - StaticSprite::update(); + updatePosition(); } SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y) @@ -338,16 +334,13 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p } void SsScene1105SymbolDie::loadSymbolSprite() { - load(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], true, false); - _drawOffset.x = -(_spriteResource.getDimensions().width / 2); - _drawOffset.y = -(_spriteResource.getDimensions().height / 2); - StaticSprite::update(); + loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], kSLFCenteredDrawOffset); } void SsScene1105SymbolDie::hide() { setVisible(false); _needRefresh = true; - StaticSprite::update(); + updatePosition(); } AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene) @@ -402,14 +395,7 @@ void AsScene1105TeddyBear::hide() { SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene) : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) { - _spriteResource.load2(0x8228A46C); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; - _needRefresh = true; - updateBounds(); + loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); loadSound(0, 0x44045140); SetUpdateHandler(&SsScene1105OpenButton::update); @@ -417,7 +403,7 @@ SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentS } void SsScene1105OpenButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown == 0)) { setVisible(false); sendMessage(_parentScene, 0x2001, 0); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 52375881bc..e6442a0585 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -169,22 +169,11 @@ SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 poi int16 x = kScene1201PointArray[pointIndex].x; int16 y = kScene1201PointArray[pointIndex].y; if (x < 300) { - _spriteResource.load2(kScene1201TntFileHashList1[elemIndex]); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50); } else { - _spriteResource.load2(kScene1201TntFileHashList2[elemIndex]); - _x = x; - _y = y; - _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -_spriteResource.getDimensions().height, - _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - + loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y); } - createSurface(50, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); setClipRect(0, 0, 640, clipY2); - _needRefresh = true; - StaticSprite::update(); } AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash) diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index b623af0791..409e554b2b 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -370,7 +370,7 @@ SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) void SsScene1302Fence::update() { handleSpriteUpdate(); - StaticSprite::update(); + updatePosition(); } uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1533,7 +1533,7 @@ SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int i setVisible(false); _x = _spriteResource.getPosition().x + index * 20; - StaticSprite::update(); + updatePosition(); } AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm) diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index cedb283e0b..0693417f22 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -791,7 +791,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas : StaticSprite(vm, fileHash, surfacePriority) { SetFilterY(&Sprite::defFilterY); - SetUpdateHandler(&StaticSprite::update); + SetUpdateHandler(&StaticSprite::updatePosition); } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index f6dea96161..df64e1976a 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -145,7 +145,7 @@ SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHas _x = _spriteResource.getPosition().x + symbolIndex * 30; _y = _spriteResource.getPosition().y + 160; - StaticSprite::update(); + updatePosition(); } SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash) diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index fb98c2e29a..da02243579 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -455,15 +455,8 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 : StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol), _countdown1(0) { - _spriteResource.load2(0x64516424); - createSurface(1400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(0x64516424, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1400); setVisible(false); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - updateBounds(); - _needRefresh = true; loadSound(0, 0x44061000); SetUpdateHandler(&SsScene1907UpDownButton::update); SetMessageHandler(&SsScene1907UpDownButton::handleMessage); @@ -476,7 +469,7 @@ SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 } void SsScene1907UpDownButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown1 != 0 && (--_countdown1 == 0)) { setVisible(false); sendMessage(_parentScene, 0x2000, 0); @@ -490,7 +483,7 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { setVisible(true); _countdown1 = 4; - StaticSprite::update(); + updatePosition(); playSound(0); } messageResult = 1; @@ -500,14 +493,14 @@ uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam void SsScene1907UpDownButton::setToUpPosition() { _y = _spriteResource.getPosition().y; - Sprite::updateBounds(); - StaticSprite::update(); + updateBounds(); + updatePosition(); } void SsScene1907UpDownButton::setToDownPosition() { _y = _spriteResource.getPosition().y + 174; - Sprite::updateBounds(); - StaticSprite::update(); + updateBounds(); + updatePosition(); } AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 879250a624..cbd11b6b4c 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -165,8 +165,7 @@ SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene _soundFileHash = 0x44141000; createSurface(1010, 61, 30); if (_fileHash1) { - load(_fileHash1, true, true); - StaticSprite::update(); + loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); } else setVisible(false); } @@ -175,8 +174,7 @@ void SsCommonFloorButton::update() { if (_countdown != 0 && (--_countdown == 0)) { sendMessage(_parentScene, 0x1022, 1010); if (_fileHash1) { - load(_fileHash1, true, true); - StaticSprite::update(); + loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); } else setVisible(false); } @@ -189,8 +187,7 @@ uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &pa sendMessage(_parentScene, 0x480B, 0); setVisible(true); sendMessage(_parentScene, 0x1022, 990); - load(_fileHash2, true, true); - StaticSprite::update(); + loadSprite(_fileHash2, kSLFDefDrawOffset | kSLFDefPosition); _countdown = 16; playSound(0, _soundFileHash); break; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 06cdc1009b..102704af2c 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -488,13 +488,9 @@ void AsScene2201Door::stCloseDoor() { SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex) : StaticSprite(vm, 900) { - _spriteResource.load2(kSsScene2201PuzzleCubeFileHashes[cubeIndex]); createSurface(100, 16, 16); - _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), - _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = kSsScene2201PuzzleCubePoints[positionIndex].x; - _y = kSsScene2201PuzzleCubePoints[positionIndex].y; - _needRefresh = true; + loadSprite(kSsScene2201PuzzleCubeFileHashes[cubeIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 0, + kSsScene2201PuzzleCubePoints[positionIndex].x, kSsScene2201PuzzleCubePoints[positionIndex].y); } Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) @@ -670,32 +666,26 @@ static const uint32 kSsScene2202PuzzleTileFileHashes2[] = { SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value) : StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) { - + + int surfacePriority; + SetUpdateHandler(&SsScene2202PuzzleTile::update); SetMessageHandler(&SsScene2202PuzzleTile::handleMessage); - _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); - if (_tileIndex >= 0 && _tileIndex <= 2) { - createSurface(100, 128, 128); - } else if (_tileIndex >= 3 && _tileIndex <= 5) { - createSurface(300, 128, 128); - } else { - createSurface(500, 128, 128); - } - _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), - _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; - _x = kSsScene2202PuzzleTilePoints[_tileIndex].x; - _y = kSsScene2202PuzzleTilePoints[_tileIndex].y; - updateBounds(); - _needRefresh = true; - StaticSprite::update(); + if (_tileIndex >= 0 && _tileIndex <= 2) + surfacePriority = 100; + else if (_tileIndex >= 3 && _tileIndex <= 5) + surfacePriority = 300; + else + surfacePriority = 500; + loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0, + kSsScene2202PuzzleTilePoints[_tileIndex].x, kSsScene2202PuzzleTilePoints[_tileIndex].y); loadSound(0, 0x40958621); loadSound(1, 0x51108241); } void SsScene2202PuzzleTile::update() { handleSpriteUpdate(); - StaticSprite::update(); + updatePosition(); } uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -787,10 +777,7 @@ void SsScene2202PuzzleTile::suMoveTileY() { void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { - _spriteResource.load2(kSsScene2202PuzzleTileFileHashes1[_value]); - _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), - _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _needRefresh = true; + loadSprite(kSsScene2202PuzzleTileFileHashes1[_value], kSLFCenteredDrawOffset); setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1); setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value); @@ -866,10 +853,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { } void SsScene2202PuzzleTile::stopMoving() { - _spriteResource.load2(kSsScene2202PuzzleTileFileHashes2[_value]); - _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), - _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _needRefresh = true; + loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset); SetSpriteUpdate(NULL); _isMoving = false; sendMessage(_parentScene, 0x2002, _tileIndex); @@ -1215,25 +1199,16 @@ SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) : StaticSprite(vm, 900) { SetMessageHandler(&SsScene2205DoorFrame::handleMessage); - _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); createSurface(1100, 45, 206); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); } uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2000: - _spriteResource.load2(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); + break; } return messageResult; } @@ -1388,7 +1363,7 @@ AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHas void AsScene2206DoorSpikes::update() { handleSpriteUpdate(); - StaticSprite::update(); + updatePosition(); } uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1440,7 +1415,7 @@ AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash) void AsScene2206Platform::update() { handleSpriteUpdate(); - StaticSprite::update(); + updatePosition(); } uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1974,7 +1949,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i _x = 330; _y = 246 + index * 50; - StaticSprite::update(); + updatePosition(); } Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index a017c117a8..ccc47d009f 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -763,8 +763,7 @@ void Scene2402::update() { if (_countdown != 0 && (--_countdown) == 0) { if (_pipeStatus >= 10) { sendMessage(_asDoor, 0x4808, 0); - _ssDoorFrame->load(0x00B415E0, true, true); - _ssDoorFrame->update(); + _ssDoorFrame->loadSprite(0x00B415E0, kSLFDefDrawOffset | kSLFDefPosition); } else if (_pipeStatus >= 5) { _countdown = 8; playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); @@ -791,8 +790,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2001: - _ssDoorFrame->load(0x406C0AE0, true, true); - _ssDoorFrame->update(); + _ssDoorFrame->loadSprite(0x406C0AE0, kSLFDefDrawOffset | kSLFDefPosition); break; case 0x480B: if (sender == _ssButton) { diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 8345a8c3a3..de6e19e48c 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -485,14 +485,7 @@ void Scene2501::updateKlaymanCliprect() { SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) : StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) { - _spriteResource.load2(0x070220D9); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _collisionBoundsOffset = _drawOffset; - updateBounds(); - _needRefresh = true; + loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); loadSound(0, 0x4600204C); loadSound(1, 0x408C0034); @@ -503,7 +496,7 @@ SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) } void SsScene2504Button::update() { - StaticSprite::update(); + updatePosition(); if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) { playSound(3); setVisible(false); diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 7008a905f4..d1b95be6bb 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -208,30 +208,19 @@ void Module2600::updateScene() { SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { - _spriteResource.load2(0x825A6923); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); if (!getGlobalVar(V_WATER_RUNNING)) setVisible(false); - - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - updateBounds(); - _needRefresh = true; - loadSound(0, 0x10267160); loadSound(1, 0x7027FD64); loadSound(2, 0x44043000); loadSound(3, 0x44045000); - SetUpdateHandler(&SsScene2609Button::update); SetMessageHandler(&SsScene2609Button::handleMessage); - } void SsScene2609Button::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown == 0)) { if (getGlobalVar(V_WATER_RUNNING)) { setGlobalVar(V_WATER_RUNNING, 0); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index c5524fa75a..1e02e64411 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -510,13 +510,7 @@ static const NPoint kCarShadowOffsets[] = { SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash) : StaticSprite(vm, 0) { - _spriteResource.load2(fileHash); - createSurface(0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _needRefresh = true; - StaticSprite::update(); + loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 0); } AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index) diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 53ae40c0ea..c42e0331ac 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -407,10 +407,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2801::handleMessage); SetUpdateHandler(&Scene::update); - if (getGlobalVar(V_RADIO_ENABLED) == 0) { - // Display the disabled radio; only possible when the left door is open + // Display the disabled radio; only possible when the left door is open + if (!getGlobalVar(V_RADIO_ENABLED)) insertStaticSprite(0x0001264C, 100); - } if (which < 0) { insertKlayman(194, 430); @@ -1013,34 +1012,24 @@ void Scene2803::changeBackground() { _background->load(0x412A423E); _palette->addPalette(0x412A423E, 0, 256, 0); _palette->addBasePalette(0x412A423E, 0, 256, 0); - _sprite3->load(0xA40EF2FB, false, false); - _sprite3->update(); - _sprite4->load(0x0C03AA23, false, false); - _sprite4->update(); - _sprite5->load(0x2A822E2E, false, false); - _sprite5->update(); - _sprite6->load(0x2603A202, false, false); - _sprite6->update(); - _sprite7->load(0x24320220, false, false); - _sprite7->update(); + _sprite3->loadSprite(0xA40EF2FB); + _sprite4->loadSprite(0x0C03AA23); + _sprite5->loadSprite(0x2A822E2E); + _sprite6->loadSprite(0x2603A202); + _sprite7->loadSprite(0x24320220); _mouseCursor->load(0xA423A41A); _mouseCursor->updateCursor(); - _sprite8->load(0x3C42022F, false, false); - _sprite8->update(); - _sprite9->load(0x341A0237, false, false); - _sprite9->update(); + _sprite8->loadSprite(0x3C42022F); + _sprite9->loadSprite(0x341A0237); if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { - _asTestTubeOne->load(0x66121222, false, false); - _asTestTubeOne->update(); + _asTestTubeOne->loadSprite(0x66121222); } else sendMessage(_asTestTubeOne, 0x2000, 0); if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { - _asTestTubeTwo->load(0x64330236, false, false); - _asTestTubeTwo->update(); + _asTestTubeTwo->loadSprite(0x64330236); } if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { - _asTestTubeThree->load(0x2E4A22A2, false, false); - _asTestTubeThree->update(); + _asTestTubeThree->loadSprite(0x2E4A22A2); } _sprite10->setVisible(true); } else { @@ -1048,34 +1037,24 @@ void Scene2803::changeBackground() { _background->load(0x29800A01); _palette->addPalette(0x29800A01, 0, 256, 0); _palette->addBasePalette(0x29800A01, 0, 256, 0); - _sprite3->load(0x234340A0, false, false); - _sprite3->update(); - _sprite4->load(0x16202200, false, false); - _sprite4->update(); - _sprite5->load(0x1030169A, false, false); - _sprite5->update(); - _sprite6->load(0x1600A6A8, false, false); - _sprite6->update(); - _sprite7->load(0xD0802EA0, false, false); - _sprite7->update(); + _sprite3->loadSprite(0x234340A0); + _sprite4->loadSprite(0x16202200); + _sprite5->loadSprite(0x1030169A); + _sprite6->loadSprite(0x1600A6A8); + _sprite7->loadSprite(0xD0802EA0); _mouseCursor->load(0x00A05290); _mouseCursor->updateCursor(); - _sprite8->load(0x108012C1, false, false); - _sprite8->update(); - _sprite9->load(0x708072E0, false, false); - _sprite9->update(); + _sprite8->loadSprite(0x108012C1); + _sprite9->loadSprite(0x708072E0); if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { - _asTestTubeOne->load(0x50C027A8, false, false); - _asTestTubeOne->update(); + _asTestTubeOne->loadSprite(0x50C027A8); } else sendMessage(_asTestTubeOne, 0x2000, 1); if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { - _asTestTubeTwo->load(0xD48077A0, false, false); - _asTestTubeTwo->update(); + _asTestTubeTwo->loadSprite(0xD48077A0); } if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { - _asTestTubeThree->load(0x30022689, false, false); - _asTestTubeThree->update(); + _asTestTubeThree->loadSprite(0x30022689); } _sprite10->setVisible(false); } @@ -1368,25 +1347,15 @@ void Scene2803Small::updatePaletteArea(bool instantly) { SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) { - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) - _spriteResource.load2(0x51A10202); - else - _spriteResource.load2(0x11814A21); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _collisionBoundsOffset = _drawOffset; - updateBounds(); + loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0x51A10202 : 0x11814A21, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); - _needRefresh = true; SetUpdateHandler(&SsScene2804RedButton::update); SetMessageHandler(&SsScene2804RedButton::handleMessage); loadSound(0, 0x44241240); } void SsScene2804RedButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown) == 0) { setVisible(false); } @@ -1411,14 +1380,8 @@ uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam &p SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm) : StaticSprite(vm, 900) { - _spriteResource.load2(0x8889B008); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(0x8889B008, kSLFDefDrawOffset | kSLFDefPosition, 400); setVisible(false); - _needRefresh = true; - StaticSprite::update(); SetMessageHandler(&SsScene2804LightCoil::handleMessage); } @@ -1427,12 +1390,12 @@ uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &p switch (messageNum) { case 0x2002: setVisible(true); - StaticSprite::update(); + updatePosition(); messageResult = 1; break; case 0x2003: setVisible(false); - StaticSprite::update(); + updatePosition(); messageResult = 1; break; } @@ -1442,14 +1405,8 @@ uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam &p SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm) : StaticSprite(vm, 900) { - _spriteResource.load2(0x06092132); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(0x06092132, kSLFDefDrawOffset | kSLFDefPosition, 400); setVisible(false); - _needRefresh = true; - StaticSprite::update(); SetMessageHandler(&SsScene2804LightTarget::handleMessage); } @@ -1458,12 +1415,12 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam switch (messageNum) { case 0x2004: setVisible(true); - StaticSprite::update(); + updatePosition(); messageResult = 1; break; case 0x2005: setVisible(false); - StaticSprite::update(); + updatePosition(); messageResult = 1; break; } @@ -1473,34 +1430,22 @@ uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) : StaticSprite(vm, 900) { - _spriteResource.load2(0x211003A0); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(0x211003A0, kSLFDefDrawOffset | kSLFDefPosition, 400); setVisible(false); - _needRefresh = true; - StaticSprite::update(); loadSound(0, 0xCB36BA54); } void SsScene2804Flash::show() { setVisible(true); - StaticSprite::update(); + updatePosition(); playSound(0); } SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) : StaticSprite(vm, 900) { - _spriteResource.load2(0x9A816000); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(0x9A816000, kSLFDefDrawOffset | kSLFDefPosition, 400); setVisible(false); - _needRefresh = true; - StaticSprite::update(); } AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex) @@ -1635,26 +1580,16 @@ SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene280 0x5008292B }; - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) - _spriteResource.load2(kSsScene2804CrystalButtonFileHashes1[crystalIndex]); - else - _spriteResource.load2(kSsScene2804CrystalButtonFileHashes2[crystalIndex]); - - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _collisionBoundsOffset = _drawOffset; - updateBounds(); + loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? kSsScene2804CrystalButtonFileHashes1[crystalIndex] : kSsScene2804CrystalButtonFileHashes2[crystalIndex], + kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); loadSound(0, 0x44045140); - _needRefresh = true; SetUpdateHandler(&SsScene2804CrystalButton::update); SetMessageHandler(&SsScene2804CrystalButton::handleMessage); } void SsScene2804CrystalButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown) == 0) { setVisible(false); } @@ -1721,7 +1656,7 @@ uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &pa void AsScene2804BeamCoil::show() { _ssBeamCoilBody->setVisible(true); - // TODO _ssBeamCoilBody->update(); -> show() + // TODO _ssBeamCoilBody->updatePosition(); -> show() setVisible(true); startAnimation(0x00494891, 0, -1); playSound(0); @@ -1734,7 +1669,7 @@ void AsScene2804BeamCoil::hide() { SetMessageHandler(&AsScene2804BeamCoil::handleMessage); setVisible(false); _ssBeamCoilBody->setVisible(false); - // TODO _ssBeamCoilBody->update(); -> hide() + // TODO _ssBeamCoilBody->updatePosition(); -> hide() _vm->_soundMan->stopSound(0xEF56B094); } @@ -2242,22 +2177,14 @@ SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentSce : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex) { - _spriteResource.load2(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex]); - createSurface(1500, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _collisionBoundsOffset = _drawOffset; - updateBounds(); + loadSprite(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex], kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1500); + setVisible(false); SetUpdateHandler(&SsScene2808Dispenser::update); SetMessageHandler(&SsScene2808Dispenser::handleMessage); - setVisible(false); - _needRefresh = true; - StaticSprite::update(); } void SsScene2808Dispenser::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown) == 0) { setVisible(false); } @@ -2276,7 +2203,7 @@ uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam &p void SsScene2808Dispenser::startCountdown(int index) { setVisible(true); - StaticSprite::update(); + updatePosition(); if (_testTubeSetNum == 0) { _countdown = kClass428Countdowns1[index]; } else { diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index ae74b14814..4b8f28ea7e 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -254,24 +254,18 @@ static const uint32 kSsScene2901BigButtonFileHashes[] = { SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index) : StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) { - _spriteResource.load2(kSsScene2901LocationButtonFileHashes[which * 6 + index]); - createSurface(800, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _collisionBounds.x1 = kSsScene2901LocationButtonPoints[_index].x - 25; - _collisionBounds.y1 = kSsScene2901LocationButtonPoints[_index].y - 25; - _collisionBounds.x2 = kSsScene2901LocationButtonPoints[_index].x + 25; - _collisionBounds.y2 = kSsScene2901LocationButtonPoints[_index].y + 25; + const NPoint &pt = kSsScene2901LocationButtonPoints[_index]; + + loadSprite(kSsScene2901LocationButtonFileHashes[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 800); + _collisionBounds.set(pt.x - 25, pt.y - 25, pt.x + 25, pt.y + 25); setVisible(false); - _needRefresh = true; loadSound(0, 0x440430C0); SetUpdateHandler(&SsScene2901LocationButton::update); SetMessageHandler(&SsScene2901LocationButton::handleMessage); } void SsScene2901LocationButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown1 != 0 && (--_countdown1) == 0) { setVisible(false); } @@ -296,57 +290,41 @@ uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessagePar SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index) : StaticSprite(vm, 900), _index(index) { - _spriteResource.load2(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index]); - createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 900); setVisible(false); - _needRefresh = true; loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]); } void SsScene2901LocationButtonLight::show() { playSound(0); setVisible(true); - StaticSprite::update(); + updatePosition(); } void SsScene2901LocationButtonLight::hide() { setVisible(false); - StaticSprite::update(); + updatePosition(); } SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which) : StaticSprite(vm, 900) { - _spriteResource.load2(kSsScene2901BrokenButtonFileHashes[which]); - createSurface(900, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _needRefresh = true; - StaticSprite::update(); + loadSprite(kSsScene2901BrokenButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 900); } SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which) : StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) { - - _spriteResource.load2(kSsScene2901BigButtonFileHashes[which]); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + + loadSprite(kSsScene2901BigButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 400); _collisionBounds.set(62, 94, 322, 350); setVisible(false); - _needRefresh = true; loadSound(0, 0xF3D420C8); SetUpdateHandler(&SsScene2901BigButton::update); SetMessageHandler(&SsScene2901BigButton::handleMessage); } void SsScene2901BigButton::update() { - StaticSprite::update(); + updatePosition(); if (_countdown1 != 0 && (--_countdown1) == 0) { setVisible(false); sendMessage(_parentScene, 0x2000, 0); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index cb4faafbed..713d72de3f 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -471,22 +471,15 @@ static const uint32 kSsScene3009SymbolArrowFileHashes2[] = { SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene) : StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) { - _spriteResource.load2(0x120B24B0); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; + loadSprite(0x120B24B0, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); - updateBounds(); - _needRefresh = true; SetUpdateHandler(&SsScene3009FireCannonButton::update); SetMessageHandler(&SsScene3009FireCannonButton::handleMessage); loadSound(0, 0x3901B44F); } void SsScene3009FireCannonButton::update() { - StaticSprite::update(); + updatePosition(); if (_isClicked && !isSoundPlaying(0)) { sendMessage(_parentScene, 0x2000, 0); setVisible(false); @@ -511,17 +504,11 @@ uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageP SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) : StaticSprite(vm, 1400), _blinkCountdown(0) { - _spriteResource.load2(kSsScene3009SymbolEdgesFileHashes[index]); - createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _needRefresh = true; - if (getGlobalVar(V_ROBOT_HIT)) { + loadSprite(kSsScene3009SymbolEdgesFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600); + if (getGlobalVar(V_ROBOT_HIT)) hide(); - } else { + else startBlinking(); - } SetUpdateHandler(&SsScene3009SymbolEdges::update); } @@ -532,7 +519,7 @@ void SsScene3009SymbolEdges::update() { } else { setVisible(false); } - StaticSprite::update(); + updatePosition(); _blinkCountdown = 3; _blinkToggle = !_blinkToggle; } @@ -540,19 +527,19 @@ void SsScene3009SymbolEdges::update() { void SsScene3009SymbolEdges::show() { setVisible(true); - StaticSprite::update(); + updatePosition(); _blinkCountdown = 0; } void SsScene3009SymbolEdges::hide() { setVisible(false); - StaticSprite::update(); + updatePosition(); _blinkCountdown = 0; } void SsScene3009SymbolEdges::startBlinking() { setVisible(true); - StaticSprite::update(); + updatePosition(); _blinkCountdown = 3; _blinkToggle = true; } @@ -560,18 +547,13 @@ void SsScene3009SymbolEdges::startBlinking() { SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) : StaticSprite(vm, 1400) { - _spriteResource.load2(kSsScene3009TargetLineFileHashes[index]); - createSurface(600, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(kSsScene3009TargetLineFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600); setVisible(false); - _needRefresh = true; } void SsScene3009TargetLine::show() { setVisible(true); - StaticSprite::update(); + updatePosition(); } SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index) @@ -579,14 +561,13 @@ SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSy _incrDecr = _index % 2; - _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]); createSurface(1200, 33, 31); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; + loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefPosition); _drawOffset.set(0, 0, 33, 31); _collisionBoundsOffset = _drawOffset; updateBounds(); _needRefresh = true; + SetUpdateHandler(&SsScene3009SymbolArrow::update); SetMessageHandler(&SsScene3009SymbolArrow::handleMessage); loadSound(0, 0x2C852206); @@ -598,11 +579,9 @@ void SsScene3009SymbolArrow::hide() { } void SsScene3009SymbolArrow::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown == 0)) { - _spriteResource.load2(kSsScene3009SymbolArrowFileHashes2[_index]); - _needRefresh = true; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefDrawOffset); } } @@ -612,9 +591,7 @@ uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam case 0x1011: if (_enabled && _countdown == 0) { _countdown = 2; - _spriteResource.load2(kSsScene3009SymbolArrowFileHashes1[_index]); - _needRefresh = true; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + loadSprite(kSsScene3009SymbolArrowFileHashes1[_index], kSLFDefDrawOffset); playSound(0); sendMessage(_asSymbol, 0x2005, _incrDecr); } @@ -1063,22 +1040,13 @@ static const uint32 kAsScene3010DeadBoltFileHashes1[] = { SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled) : StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) { - NDimensions dimensions1, dimensions2; - _buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0; - _spriteResource.load2(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); - dimensions1 = _spriteResource.getDimensions(); - _spriteResource.load2(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); - dimensions2 = _spriteResource.getDimensions(); - createSurface(400, - MAX(dimensions1.width, dimensions2.width), - MAX(dimensions1.height, dimensions2.height)); + createSurface(400, 88, 95); setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); - if (initDisabled) { + if (initDisabled) disableButton(); - } else if (_buttonEnabled) { + else if (_buttonEnabled) _countdown1 = initCountdown * 12 + 1; - } loadSound(0, 0xF4217243); loadSound(1, 0x44049000); loadSound(2, 0x6408107E); @@ -1116,7 +1084,7 @@ uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessagePar sendMessage(_parentScene, 0x2002, _buttonIndex); } _needRefresh = true; - StaticSprite::update(); + updatePosition(); } messageResult = 1; break; @@ -1131,14 +1099,7 @@ void SsScene3010DeadBoltButton::disableButton() { } void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { - _spriteResource.load(fileHash); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; - updateBounds(); - _needRefresh = true; - StaticSprite::update(); + loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset); } void SsScene3010DeadBoltButton::setCountdown(int count) { @@ -1397,26 +1358,15 @@ static const uint32 kAsScene3011SymbolFileHashes[] = { SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag) : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { - if (flag) { - _spriteResource.load2(0x11282020); - } else { - _spriteResource.load2(0x994D0433); - } - loadSound(0, 0x44061000); - createSurface(400, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - _collisionBoundsOffset = _drawOffset; + loadSprite(flag ? 0x11282020 : 0x994D0433, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); - updateBounds(); - _needRefresh = true; + loadSound(0, 0x44061000); SetUpdateHandler(&SsScene3011Button::update); SetMessageHandler(&SsScene3011Button::handleMessage); } void SsScene3011Button::update() { - StaticSprite::update(); + updatePosition(); if (_countdown != 0 && (--_countdown == 0)) { setVisible(false); } diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 40b651e53b..d034783b03 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -120,42 +120,43 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) } -StaticSprite::StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x, int16 y, int16 width, int16 height) +StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y) : Sprite(vm, 0), _spriteResource(vm) { - init(calcHash(filename), surfacePriority, x, y, width, height); -} - -StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) - : Sprite(vm, 0), _spriteResource(vm) { - - init(fileHash, surfacePriority, x, y, width, height); -} - -void StaticSprite::init(uint32 fileHash, int surfacePriority, int16 x, int16 y, int16 width, int16 height) { - _spriteResource.load2(fileHash); - - if (width == 0) - width = _spriteResource.getDimensions().width; - - if (height == 0) - height = _spriteResource.getDimensions().height; - - createSurface(surfacePriority, width, height); - + createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = x == kDefPosition ? _spriteResource.getPosition().x : x; _y = y == kDefPosition ? _spriteResource.getPosition().y : y; - - _drawOffset.set(0, 0, width, height); - + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _needRefresh = true; + updatePosition(); +} - update(); - +void StaticSprite::loadSprite(uint32 fileHash, uint flags, int surfacePriority, int16 x, int16 y) { + _spriteResource.load2(fileHash); + if (!_surface) + createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + if (flags & kSLFDefDrawOffset) + _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + else if (flags & kSLFCenteredDrawOffset) + _drawOffset.set(-(_spriteResource.getDimensions().width / 2), -(_spriteResource.getDimensions().height / 2), + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + if (flags & kSLFDefPosition) { + _x = _spriteResource.getPosition().x; + _y = _spriteResource.getPosition().y; + } else if (flags & kSLFSetPosition) { + _x = x; + _y = y; + } + if (flags & kSLFDefCollisionBoundsOffset) { + _collisionBoundsOffset = _drawOffset; + updateBounds(); + } + _needRefresh = true; + updatePosition(); } -void StaticSprite::update() { +void StaticSprite::updatePosition() { if (!_surface) return; @@ -179,23 +180,6 @@ void StaticSprite::update() { } -void StaticSprite::load(uint32 fileHash, bool dimensions, bool position) { - - _spriteResource.load2(fileHash); - - if (dimensions) { - _drawOffset.set(0, 0, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); - } - - if (position) { - _x = _spriteResource.getPosition().x; - _y = _spriteResource.getPosition().y; - } - - _needRefresh = true; - -} - // AnimatedSprite AnimatedSprite::AnimatedSprite(NeverhoodEngine *vm, int objectPriority) diff --git a/engines/neverhood/sprite.h b/engines/neverhood/sprite.h index 7e07f3a412..80da1768bd 100644 --- a/engines/neverhood/sprite.h +++ b/engines/neverhood/sprite.h @@ -93,16 +93,22 @@ protected: } }; +enum { + kSLFDefDrawOffset = 1 << 0, + kSLFCenteredDrawOffset = 1 << 1, + kSLFDefPosition = 1 << 2, + kSLFSetPosition = 1 << 3, + kSLFDefCollisionBoundsOffset = 1 << 4 +}; + class StaticSprite : public Sprite { public: StaticSprite(NeverhoodEngine *vm, int objectPriority); - StaticSprite(NeverhoodEngine *vm, const char *filename, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); - StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); - void load(uint32 fileHash, bool dimensions, bool position); - void update(); + StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition); + void loadSprite(uint32 fileHash, uint flags = 0, int surfacePriority = 0, int16 x = kDefPosition, int16 y = kDefPosition); + void updatePosition(); protected: SpriteResource _spriteResource; - void init(uint32 fileHash, int surfacePriority, int16 x = kDefPosition, int16 y = kDefPosition, int16 width = 0, int16 height = 0); }; #define AnimationCallback(callback) static_cast (callback) -- cgit v1.2.3 From 4d7610f69d3395e319c56b822197ea6f6c87be96 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 08:15:01 +0000 Subject: NEVERHOOD: Clean up Module1000: - Rename stuff - Remove superfluous braces - Add a comment to the "which" code in each scene - Use a seperate _sceneNum instead of _vm->gameState().sceneNum - Remove code related to unused resource preloading and debug messages --- engines/neverhood/gamemodule.cpp | 15 +- engines/neverhood/module1000.cpp | 296 +++++++++++++++------------------------ engines/neverhood/module1000.h | 18 +-- engines/neverhood/module3000.cpp | 16 +-- engines/neverhood/module3000.h | 2 +- engines/neverhood/neverhood.cpp | 2 +- engines/neverhood/neverhood.h | 1 - 7 files changed, 143 insertions(+), 207 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index f9e734dd8d..350dd769da 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -289,9 +289,11 @@ void GameModule::startup() { setGlobalVar(V_TNT_DUMMY_BUILT, 1); setGlobalVar(V_FLYTRAP_RING_DOOR, 1); setGlobalVar(V_TV_JOKE_TOLD, 1); + /* // Give all disks for (int i = 0; i < 20; i++) setSubVar(VA_IS_TAPE_INSERTED, i, 1); + */ setSubVar(VA_IS_KEY_INSERTED, 0, 1); setSubVar(VA_IS_KEY_INSERTED, 1, 1); setSubVar(VA_IS_KEY_INSERTED, 2, 1); @@ -306,9 +308,16 @@ void GameModule::startup() { // <<gameState().which = 0; - _vm->gameState().sceneNum = 2; - createModule(2800, -1); + /* + //DEBUG>>> + createScene(_vm->gameState().sceneNum, _vm->gameState().which); + return; + //DEBUG<<< + */ + + _vm->gameState().which = 1; + _vm->gameState().sceneNum = 3; + createModule(1000, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index ac6830edc0..c7c3fb227e 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -50,25 +50,30 @@ Module1000::~Module1000() { void Module1000::createScene(int sceneNum, int which) { debug("Module1000::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _vm->_soundMan->startMusic(0x061880C6, 0, 0); _childObject = new Scene1001(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; _vm->_soundMan->startMusic(0x061880C6, 0, 0); _childObject = new Scene1002(_vm, this, which); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->startMusic(0x061880C6, 0, 0); createStaticScene(0xC084110C, 0x41108C00); break; case 3: + _vm->gameState().sceneNum = 3; _vm->_soundMan->stopMusic(0x061880C6, 0, 2); _childObject = new Scene1004(_vm, this, which); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->stopMusic(0x061880C6, 0, 0); _vm->_soundMan->startMusic(_musicFileHash, 0, 0); _childObject = new Scene1005(_vm, this, which); @@ -80,7 +85,7 @@ void Module1000::createScene(int sceneNum, int which) { void Module1000::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (_moduleResult == 2) createScene(2, 0); @@ -209,11 +214,10 @@ uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶ Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x00352100) { + if (param.asInteger() == 0x00352100) sendMessage(_asDoor, 0x2000, 0); - } else if (param.asInteger() == 0x0A1A0109) { + else if (param.asInteger() == 0x0A1A0109) playSound(0, 0x66410886); - } break; case 0x2000: startAnimation(0x022C90D4, 1, -1); @@ -240,9 +244,8 @@ uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶ Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x0E0A1410) { + if (param.asInteger() == 0x0E0A1410) playSound(0, 0x60803F10); - } break; case 0x2001: startAnimation(0xC68C2299, 0, -1); @@ -273,11 +276,10 @@ uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x00C0C444) { + if (param.asInteger() == 0x00C0C444) sendMessage(_parentScene, 0x480F, 0); - } else if (param.asInteger() == 0xC41A02C0) { + else if (param.asInteger() == 0xC41A02C0) playSound(0, 0x40581882); - } break; case 0x1011: sendMessage(_parentScene, 0x4826, 0); @@ -311,9 +313,8 @@ SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentSce } void SsCommonButtonSprite::update() { - if (_countdown != 0 && (--_countdown) == 0) { + if (_countdown != 0 && (--_countdown) == 0) setVisible(false); - } } uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -330,7 +331,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p } Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule, true), _asDoor(NULL), _asWindow(NULL) { Sprite *tempSprite; @@ -342,14 +343,17 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x6520A400); if (which < 0) { + // Restoring game setRectList(0x004B49F0); insertKlayman(200, 433); setMessageList(0x004B4888); } else if (which == 1) { + // Klaymen entering from the right setRectList(0x004B49F0); insertKlayman(640, 433); setMessageList(0x004B4898); } else if (which == 2) { + // Klaymen returning from looking through the window setRectList(0x004B49F0); if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(390, 433); @@ -359,6 +363,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } setMessageList(0x004B4970); } else { + // Klaymen sleeping setRectList(0x004B4A00); insertKlayman(200, 433); setMessageList(0x004B4890); @@ -368,11 +373,9 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); - if (getGlobalVar(V_DOOR_BUSTED) == 0) { + if (!getGlobalVar(V_DOOR_BUSTED)) { _asDoor = insertSprite(); _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); - } else { - _asDoor = NULL; } _asLever = insertSprite(this, 150, 433, 1); @@ -382,12 +385,10 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = insertSprite(this, 0x15288120, 100, 0); - if (getGlobalVar(V_WINDOW_OPEN) == 0) { + if (!getGlobalVar(V_WINDOW_OPEN)) { tempSprite = insertStaticSprite(0x8C066150, 200); _asWindow = insertSprite(); _asWindow->setClipRect(tempSprite->getDrawRect()); - } else { - _asWindow = NULL; } _asHammer = insertSprite(_asDoor); @@ -399,21 +400,9 @@ Scene1001::~Scene1001() { } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug("Scene1001::handleMessage(%04X)", messageNum); uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { - case 0x0001: - if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) { - leaveScene(0); - } - break; - case 0x000D: - if (param.asInteger() == 0x188B2105) { - leaveScene(0); - messageResult = 1; - } - break; case 0x100D: if (param.asInteger() == 0x00342624) { sendEntityMessage(_klayman, 0x1014, _asLever); @@ -440,14 +429,10 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B49F0); break; case 0x480B: - if (_asWindow) { - sendMessage(_asWindow, 0x2001, 0); - } + sendMessage(_asWindow, 0x2001, 0); break; case 0x480F: - if (_asHammer) { - sendMessage(_asHammer, 0x2000, 0); - } + sendMessage(_asHammer, 0x2000, 0); break; } return messageResult; @@ -455,14 +440,14 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1002 -AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _flag1(flag1) { +AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isSpecial(isSpecial) { SetUpdateHandler(&AsScene1002Ring::update); - if (flag1) { + if (_isSpecial) { createSurface(990, 68, 314); - if (flag2) { + if (isRingLow) { startAnimation(0x04103090, 0, -1); SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); } else { @@ -485,8 +470,8 @@ AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool f } void AsScene1002Ring::update() { - AnimatedSprite::updateAnim(); - AnimatedSprite::updatePosition(); + updateAnim(); + updatePosition(); } uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -496,11 +481,7 @@ uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam ¶m, En setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); sendMessage(_parentScene, 0x4806, 0); SetMessageHandler(&AsScene1002Ring::hmRingPulled1); - if (_flag1) { - startAnimation(0x87502558, 0, -1); - } else { - startAnimation(0x80DD4010, 0, -1); - } + startAnimation(_isSpecial ? 0x87502558 : 0x80DD4010, 0, -1); break; case 0x480F: setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); @@ -522,13 +503,8 @@ uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - if (_flag1) { - startAnimation(0x78D0A812, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); - } else { - startAnimation(0xB85D2A10, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); - } + startAnimation(_isSpecial ? 0x78D0A812 : 0xB85D2A10, 0, -1); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); break; case 0x4807: sendMessage(_parentScene, 0x4807, 0); @@ -586,9 +562,8 @@ uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam ¶m uint32 messageResult = hmRingIdle(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x05410F72) { + if (param.asInteger() == 0x05410F72) playSound(0, 0x21EE40A9); - } break; case 0x3002: startAnimation(0xA85C4011, 0, -1); @@ -684,25 +659,24 @@ uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const Mess AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect) : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) { - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1002DoorSpy::handleMessage); - SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy); createSurface(800, 136, 147); setClipRect(clipRect); suDoorSpy(); loadSound(0, 0xC0C40298); startAnimation(0x586C1D48, 0, 0); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage); + SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy); } uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0xA61CA1C2) { + if (param.asInteger() == 0xA61CA1C2) sendMessage(_asBoxingGloveHitEffect, 0x2004, 0); - } else if (param.asInteger() == 0x14CE0620) { + else if (param.asInteger() == 0x14CE0620) playSound(0); - } break; case 0x2003: stDoorSpyBoxingGlove(); @@ -757,11 +731,7 @@ SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { _fileHashes[0] = fileHash1; _fileHashes[1] = fileHash2; - if (_status == 2) { - loadSprite(fileHash2, kSLFDefDrawOffset | kSLFDefPosition); - } else { - loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition); - } + loadSprite(_status == 2 ? fileHash2 : fileHash1, kSLFDefDrawOffset | kSLFDefPosition); } void SsCommonPressButton::update() { @@ -795,16 +765,11 @@ uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam &pa return messageResult; } -AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _flag(flag), _countdown(0) { +AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool isSecond) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _isSecond(isSecond), _countdown(0) { createSurface(995, 175, 195); - - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - - if (!_flag) { + if (!_isSecond) { if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { setDoDeltaX(1); _x = 366; @@ -824,23 +789,23 @@ AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *par stIdle(); } } - _flags = 4; + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } void AsScene1002VenusFlyTrap::update() { - if (_countdown != 0 && (--_countdown == 0)) { + if (_countdown != 0 && (--_countdown == 0)) gotoNextState(); - } AnimatedSprite::update(); } void AsScene1002VenusFlyTrap::upIdle() { - if (_countdown == 0 && _klayman->getX() - 20 > _x) { + if (_countdown == 0 && _klayman->getX() - 20 > _x) setDoDeltaX(1); - } else if (_klayman->getX() + 20 < _x) { + else if (_klayman->getX() + 20 < _x) setDoDeltaX(0); - } update(); } @@ -848,14 +813,13 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x000890C4) { + if (param.asInteger() == 0x000890C4) playSound(0, 0xC21190D8); - } else if (param.asInteger() == 0x522200A0) { + else if (param.asInteger() == 0x522200A0) playSound(0, 0x931080C8); - } break; case 0x1011: - if (_flag) { + if (_isSecond) { if (_x >= 154 && _x <= 346) { sendMessage(_parentScene, 0x2000, 0); messageResult = 1; @@ -869,22 +833,20 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam break; case 0x480B: setDoDeltaX(param.asInteger() != 0 ? 1 : 0); - if (!_flag) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { + if (!_isSecond) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) stRelease(); - } else { + else stWalk(); - } } else { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) stRelease(); - } else { + else stWalk(); - } } break; case 0x480C: - if (_flag) { + if (_isSecond) { if (_x >= 154 && _x <= 346) messageResult = 1; else @@ -897,9 +859,8 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam } break; case 0x480E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) stGrabRing(); - } break; case 0x4810: swallowKlayman(); @@ -928,25 +889,19 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x000890C4) { + if (param.asInteger() == 0x000890C4) playSound(0, 0xC21190D8); - } else if (param.asInteger() == 0x41881801) { - if (_flag) { - if (_x > 330) { + else if (param.asInteger() == 0x41881801) { + if (_isSecond) { + if (_x > 330) sendMessage(_klayman, 0x4811, 2); - } else if (_x > 265) { - // FIXME: This check is the same as the one below. - // Perhaps the third parameter should be 1 here? + else sendMessage(_klayman, 0x4811, 0); - } else { - sendMessage(_klayman, 0x4811, 0); - } } else { sendMessage(_klayman, 0x4811, 0); } - } else if (param.asInteger() == 0x522200A0) { + } else if (param.asInteger() == 0x522200A0) playSound(0, 0x931080C8); - } break; case 0x3002: gotoNextState(); @@ -1010,17 +965,17 @@ void AsScene1002VenusFlyTrap::stIdle() { startAnimation(0xC8204250, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle); SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); - if (_flag) { - if (_x >= 154 && _x <= 346) { + if (_isSecond) { + if (_x >= 154 && _x <= 346) setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32); - } else { + else { NextState(&AsScene1002VenusFlyTrap::stWalkBack); _countdown = 12; } } else { - if (_x >= 174 && _x <= 430) { + if (_x >= 174 && _x <= 430) setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32); - } else { + else { NextState(&AsScene1002VenusFlyTrap::stWalkBack); _countdown = 12; } @@ -1043,11 +998,10 @@ void AsScene1002VenusFlyTrap::stSpitOutKlayman() { void AsScene1002VenusFlyTrap::swallowKlayman() { if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) { - if (_flag) { + if (_isSecond) setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); - } else { + else setDoDeltaX(_x > 320 ? 1 : 0); - } sendMessage(_klayman, 0x2001, 0); startAnimation(0x8C2C80D4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); @@ -1065,20 +1019,18 @@ AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngi if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { startAnimation(0x004A4495, -1, -1); _newStickFrameIndex = STICK_LAST_FRAME; - } else { + } else setVisible(false); - } SetUpdateHandler(&AsScene1002OutsideDoorBackground::update); SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); } void AsScene1002OutsideDoorBackground::update() { if (_countdown != 0 && (--_countdown == 0)) { - if (_isDoorClosed) { + if (_isDoorClosed) stCloseDoor(); - } else { + else stOpenDoor(); - } } AnimatedSprite::update(); } @@ -1110,17 +1062,17 @@ uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const Messa void AsScene1002OutsideDoorBackground::stOpenDoor() { startAnimation(0x004A4495, 0, -1); - SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); _newStickFrameIndex = STICK_LAST_FRAME; setVisible(true); + SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); } void AsScene1002OutsideDoorBackground::stCloseDoor() { startAnimation(0x004A4495, -1, -1); _playBackwards = true; + setVisible(true); SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation); NextState(&AsScene1002OutsideDoorBackground::stDoorClosed); - setVisible(true); } void AsScene1002OutsideDoorBackground::stDoorClosed() { @@ -1132,9 +1084,9 @@ AsScene1002KlaymanLadderHands::AsScene1002KlaymanLadderHands(NeverhoodEngine *vm : AnimatedSprite(vm, 1200), _klayman(klayman) { createSurface(1200, 40, 163); + setVisible(false); SetUpdateHandler(&AsScene1002KlaymanLadderHands::update); SetMessageHandler(&Sprite::handleMessage); - setVisible(false); } void AsScene1002KlaymanLadderHands::update() { @@ -1152,9 +1104,8 @@ void AsScene1002KlaymanLadderHands::update() { _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); - } else { + } else setVisible(false); - } AnimatedSprite::update(); } @@ -1162,10 +1113,10 @@ AsScene1002KlaymanPeekHand::AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scen : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman), _isClipRectSaved(false) { - SetUpdateHandler(&AsScene1002KlaymanPeekHand::update); - SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage); createSurface(1000, 33, 41); setVisible(false); + SetUpdateHandler(&AsScene1002KlaymanPeekHand::update); + SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage); } void AsScene1002KlaymanPeekHand::update() { @@ -1176,9 +1127,8 @@ void AsScene1002KlaymanPeekHand::update() { _x = _klayman->getX(); _y = _klayman->getY(); setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); - } else { + } else setVisible(false); - } AnimatedSprite::update(); } @@ -1202,7 +1152,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa } Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag1B4(false), _flag1BE(false) { + : Scene(vm, parentModule, true), _isKlaymanFloor(false), _isClimbingLadder(false) { NRect tempClipRect; Sprite *tempSprite; @@ -1211,12 +1161,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1002::handleMessage); setHitRects(0x004B4138); - setBackground(0x12C23307); setPalette(0x12C23307); - _flag = false; - insertStaticSprite(0x06149428, 1100); insertStaticSprite(0x312C8774, 1100); @@ -1228,7 +1175,9 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _class599 = insertStaticSprite(0x316C4BB4, 1015); if (which < 0) { - if (_vm->_gameState.field2 == 0) { + // Restoring game + if (_vm->_gameState.which == 0) { + // Klaymen on top insertKlayman(90, 226); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4270); @@ -1236,6 +1185,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); _klayman->setRepl(64, 0); } else { + // Klaymen on the floor insertKlayman(379, 435); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4270); @@ -1243,21 +1193,24 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); } } else if (which == 1) { + // Klaymen entering from the right insertKlayman(650, 435); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4478); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); - _vm->_gameState.field2 = 1; + _vm->_gameState.which = 1; } else if (which == 2) { + // Klaymen coming up the ladder insertKlayman(68, 645); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4298); _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); - _vm->_gameState.field2 = 1; + _vm->_gameState.which = 1; sendMessage(_klayman, 0x4820, 0); } else { + // Klaymen entering from the left, peeking insertKlayman(90, 226); _asKlaymanLadderHands = insertSprite(_klayman); setMessageList(0x004B4470); @@ -1266,7 +1219,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asKlaymanPeekHand = insertSprite(this, _klayman); _asKlaymanPeekHand->setClipRect(_klayman->getClipRect()); _klayman->setRepl(64, 0); - _vm->_gameState.field2 = 0; + _vm->_gameState.which = 0; } insertMouse433(0x23303124); @@ -1277,7 +1230,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asRing1 = insertSprite(this, false, 258, 191, _class599->getDrawRect().y, false); _asRing2 = insertSprite(this, false, 297, 189, _class599->getDrawRect().y, false); - _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR) != 0); + _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR)); _asRing4 = insertSprite(this, false, 334, 191, _class599->getDrawRect().y, false); _asRing5 = insertSprite(this, false, 425, 184, _class599->getDrawRect().y, false); @@ -1304,56 +1257,32 @@ Scene1002::~Scene1002() { void Scene1002::update() { Scene::update(); - if (!_flag1B4 && _klayman->getY() > 230) { + if (!_isKlaymanFloor && _klayman->getY() > 230) { _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); deleteSprite(&_ssLadderArchPart3); _klayman->clearRepl(); - _flag1B4 = true; - _vm->_gameState.field2 = 1; - } - - if (_flag1BE && _klayman->getY() > 422) { - sendMessage(_parentModule, 0x1024, 1); - _flag1BE = false; + _isKlaymanFloor = true; + _vm->_gameState.which = 1; } - } uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); switch (messageNum) { - case 0x0001: - // Debug stuff (original) - if (param.asPoint().x == 0 && getGlobalVar(V_DEBUG)) { - setGlobalVar(V_FLYTRAP_RING_DOOR, 1); - setGlobalVar(V_FLYTRAP_POSITION_1, 3); - leaveScene(1); - } - break; - case 0x000D: - // Debug stuff (original) - if (param.asInteger() == 0x48848178) { - setGlobalVar(V_FLYTRAP_RING_DOOR, 1); - setGlobalVar(V_FLYTRAP_POSITION_1, 3); - leaveScene(1); - } - messageResult = 1; - break; case 0x100D: if (param.asInteger() == 0xE6EE60E1) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) setMessageList(0x004B4428); - } else { + else setMessageList(0x004B4448); - } messageResult = 1; - } else if (param.asInteger() == 0x4A845A00) { + } else if (param.asInteger() == 0x4A845A00) sendEntityMessage(_klayman, 0x1014, _asRing1); - } else if (param.asInteger() == 0x43807801) { + else if (param.asInteger() == 0x43807801) sendEntityMessage(_klayman, 0x1014, _asRing2); - } else if (param.asInteger() == 0x46C26A01) { + else if (param.asInteger() == 0x46C26A01) { if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { setMessageList(0x004B44B8); } else { @@ -1366,19 +1295,18 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } } messageResult = 1; - } else if (param.asInteger() == 0x468C7B11) { + } else if (param.asInteger() == 0x468C7B11) sendEntityMessage(_klayman, 0x1014, _asRing4); - } else if (param.asInteger() == 0x42845B19) { + else if (param.asInteger() == 0x42845B19) sendEntityMessage(_klayman, 0x1014, _asRing5); - } else if (param.asInteger() == 0xC0A07458) { + else if (param.asInteger() == 0xC0A07458) sendEntityMessage(_klayman, 0x1014, _ssPressButton); - } break; case 0x1024: sendMessage(_parentModule, 0x1024, param.asInteger()); break; case 0x2000: - if (_flag) { + if (_isClimbingLadder) { setMessageList2(0x004B43D0); } else { if (_klayman->getY() > 420) { @@ -1395,16 +1323,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit _messageList = NULL; break; case 0x2005: - _flag = true; + _isClimbingLadder = true; setRectList(0x004B4418); break; case 0x2006: - _flag = false; + _isClimbingLadder = false; setRectList(0x004B43A0); break; case 0x4806: - sendMessage(_parentModule, 0x1024, 2); - _flag1BE = true; if (sender == _asRing1) { setGlobalVar(V_RADIO_ENABLED, 0); playSound(0, 0x665198C0); @@ -1487,18 +1413,17 @@ AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm) _x = 330; _y = 327; createSurface(800, 56, 50); + setVisible(false); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1004TrashCan::handleMessage); - setVisible(false); } uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x225A8587) { + if (param.asInteger() == 0x225A8587) playSound(0, 0x109AFC4C); - } break; case 0x2002: startAnimation(0xEB312C11, 0, -1); @@ -1534,14 +1459,17 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0x03001504); if (which < 0) { + // Restoring game setRectList(0x004B7C70); insertKlayman(330, 327); setMessageList(0x004B7C18); } else if (which == 1) { + // Klaymen returning from reading a note setRectList(0x004B7C70); insertKlayman(330, 327); setMessageList(0x004B7C08); } else { + // Klaymen coming down the ladder loadDataResource(0x01900A04); insertKlayman(_dataResource.getPoint(0x80052A29).x, 27); setMessageList(0x004B7BF0); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index f63d1f0b21..6f73326c61 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -36,6 +36,7 @@ public: Module1000(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1000(); protected: + int _sceneNum; uint32 _musicFileHash; void createScene(int sceneNum, int which); void updateScene(); @@ -114,10 +115,10 @@ protected: class AsScene1002Ring : public AnimatedSprite { public: - AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool flag1, int16 x, int16 y, int16 clipY1, bool flag2); + AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow); protected: Scene *_parentScene; - bool _flag1; + bool _isSpecial; void update(); uint32 hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender); @@ -164,22 +165,22 @@ public: void setFileHashes(uint32 fileHash1, uint32 fileHash2); protected: Scene *_parentScene; - int _countdown; + uint32 _soundFileHash; uint32 _fileHashes[2]; int _status; - uint32 _soundFileHash; + int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene1002VenusFlyTrap : public AnimatedSprite { public: - AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool flag); + AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool isSecond); protected: Scene *_parentScene; Sprite *_klayman; int _countdown; - bool _flag; + bool _isSecond; void update(); void upIdle(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -253,9 +254,8 @@ protected: Sprite *_asKlaymanPeekHand; Sprite *_asOutsideDoorBackground; Sprite *_ssPressButton; - bool _flag1B4; - bool _flag1BE; - bool _flag; + bool _isKlaymanFloor; + bool _isClimbingLadder; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 713d72de3f..9c2d896802 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -47,9 +47,9 @@ Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - _flag = getGlobalVar(V_WALL_BROKEN) != 0; + _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; - if (_flag) { + if (_isWallBroken) { _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); _vm->_soundMan->playSoundLooping(0x90F0D1C3); } @@ -89,7 +89,7 @@ void Module3000::createScene(int sceneNum, int which) { break; case 2: _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); - if (_flag) { + if (_isWallBroken) { _soundVolume = 90; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 90); } @@ -193,7 +193,7 @@ void Module3000::updateScene() { break; case 2: _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - if (_flag) { + if (_isWallBroken) { _soundVolume = 0; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); } @@ -238,7 +238,7 @@ void Module3000::updateScene() { createScene(8, -1); break; case 8: - _flag = getGlobalVar(V_WALL_BROKEN); // CHECKME + _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; if (_moduleResult != 1) { _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); createScene(4, 1); @@ -299,7 +299,7 @@ void Module3000::updateScene() { } else if (frameNumber == 10) { _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); } - if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) { if (frameNumber == 0) _soundVolume = 40; else @@ -313,7 +313,7 @@ void Module3000::updateScene() { if (navigationScene()->isWalkingForward()) { uint32 frameNumber = navigationScene()->getFrameNumber(); int navigationIndex = navigationScene()->getNavigationIndex(); - if (_flag && _soundVolume > 1 && frameNumber % 2) { + if (_isWallBroken && _soundVolume > 1 && frameNumber % 2) { _soundVolume--; _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } @@ -338,7 +338,7 @@ void Module3000::updateScene() { if (frameNumber == 40) { _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); } - if (_flag && _soundVolume < 90 && frameNumber % 2) { + if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) { if (frameNumber == 0) _soundVolume = 40; else diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h index 945ca7ec79..0fd1a1ed70 100644 --- a/engines/neverhood/module3000.h +++ b/engines/neverhood/module3000.h @@ -36,7 +36,7 @@ public: virtual ~Module3000(); protected: int _soundVolume; - bool _flag; + bool _isWallBroken; void createScene(int sceneNum, int which); void updateScene(); }; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 1a738c1ba9..9141de078a 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -66,7 +66,7 @@ Common::Error NeverhoodEngine::run() { _mouseY = 0; _gameState.sceneNum = 0; - _gameState.field2 = 0; + _gameState.which = 0; _staticData = new StaticData(); _staticData->load("neverhood.dat"); diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 2aa84e5cb7..ba6b9f7450 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -53,7 +53,6 @@ struct NPoint; struct GameState { int sceneNum; int which; - int field2; }; class NeverhoodEngine : public ::Engine { -- cgit v1.2.3 From f744e60e0ef6bb959f9adb9f7a1d1dcc1eba2b09 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 08:59:40 +0000 Subject: NEVERHOOD: Clean up Module1100: - Rename stuff - Remove superfluous braces - Add a comment to the "which" code in each scene - Use a seperate _sceneNum instead of _vm->gameState().sceneNum --- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/module1100.cpp | 125 ++++++++++++++++++++------------------- engines/neverhood/module1100.h | 19 +++--- 3 files changed, 77 insertions(+), 73 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 350dd769da..fe732580a8 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -315,9 +315,9 @@ void GameModule::startup() { //DEBUG<<< */ - _vm->gameState().which = 1; - _vm->gameState().sceneNum = 3; - createModule(1000, -1); + _vm->gameState().which = 3; + _vm->gameState().sceneNum = 8; + createModule(1100, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index afcd698f86..6dcc5f9235 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -65,17 +65,20 @@ void Module1100::createScene(int sceneNum, int which) { static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0}; static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0}; debug("Module1100::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; + _sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _countdown = 65; createNavigationScene(0x004B8430, which); break; case 1: + _vm->gameState().sceneNum = 1; _countdown = 50; createNavigationScene(0x004B8460, which); break; case 2: + _vm->gameState().sceneNum = 2; if (getGlobalVar(V_ROBOT_TARGET)) { createNavigationScene(0x004B84F0, which); } else { @@ -83,6 +86,7 @@ void Module1100::createScene(int sceneNum, int which) { } break; case 3: + _vm->gameState().sceneNum = 3; if (getGlobalVar(V_ROBOT_TARGET)) { createNavigationScene(0x004B8580, which); } else { @@ -90,26 +94,32 @@ void Module1100::createScene(int sceneNum, int which) { } break; case 4: - _childObject = new Scene1105(_vm, this, which); + _vm->gameState().sceneNum = 4; + _childObject = new Scene1105(_vm, this); break; case 5: + _vm->gameState().sceneNum = 5; if (getGlobalVar(V_ROBOT_TARGET)) createSmackerScene(0x04180001, true, false, false); else createSmackerScene(0x04180007, true, false, false); break; case 6: + _vm->gameState().sceneNum = 6; _vm->_soundMan->deleteSoundGroup(0x0002C818); createSmackerScene(kSmackerFileHashList06, true, true, false); break; case 7: + _vm->gameState().sceneNum = 7; _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); createSmackerScene(kSmackerFileHashList07, true, true, false); break; case 8: + _vm->gameState().sceneNum = 8; _childObject = new Scene1109(_vm, this, which); break; case 1002: + _vm->gameState().sceneNum = 2; _countdown = 40; _vm->_soundMan->setTwoSoundsPlayFlag(true); createSmackerScene(0x00012211, true, true, false); @@ -121,65 +131,58 @@ void Module1100::createScene(int sceneNum, int which) { void Module1100::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: _countdown = 0; _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); _vm->_soundMan->setSoundVolume(0x48498E46, 65); _vm->_soundMan->setSoundVolume(0x50399F64, 65); - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(1, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(8, 0); - } break; case 1: _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); if (getGlobalVar(V_ROBOT_HIT)) { - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(6, -1); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(0, 1); - } } else { - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(2, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(0, 1); - } } break; case 2: _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); - if (_navigationAreaType == 3) { + if (_navigationAreaType == 3) createScene(7, -1); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(3, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(1002, -1); - } break; case 3: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(4, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(2, 3); - } break; case 4: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(3, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(5, -1); - } break; case 5: _vm->_soundMan->setTwoSoundsPlayFlag(false); - if (getGlobalVar(V_ROBOT_TARGET)) { + if (getGlobalVar(V_ROBOT_TARGET)) createScene(3, 0); - } else { + else createScene(4, 0); - } break; case 6: _vm->_soundMan->setTwoSoundsPlayFlag(false); @@ -190,11 +193,10 @@ void Module1100::updateScene() { createScene(2, 2); break; case 8: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(0, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) leaveModule(0); - } break; case 1002: _vm->_soundMan->setTwoSoundsPlayFlag(false); @@ -213,9 +215,8 @@ void Module1100::updateScene() { } break; case 1: - if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) { + if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); - } break; case 2: _vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0); @@ -313,14 +314,14 @@ void SsScene1105Symbol::hide() { updatePosition(); } -SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y) - : StaticSprite(vm, 1100), _index(index) { +SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y) + : StaticSprite(vm, 1100), _dieIndex(dieIndex) { - SetMessageHandler(&SsScene1105SymbolDie::handleMessage); _x = x; _y = y; createSurface(200, 50, 50); loadSymbolSprite(); + SetMessageHandler(&SsScene1105SymbolDie::handleMessage); } uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -334,7 +335,7 @@ uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam &p } void SsScene1105SymbolDie::loadSymbolSprite() { - loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _index)], kSLFCenteredDrawOffset); + loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _dieIndex)], kSLFCenteredDrawOffset); } void SsScene1105SymbolDie::hide() { @@ -393,7 +394,7 @@ void AsScene1105TeddyBear::hide() { } SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _flag1(false) { + : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _isClicked(false) { loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); setVisible(false); @@ -415,10 +416,10 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam & Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (_countdown == 0 && !_flag1) { + if (_countdown == 0 && !_isClicked) { playSound(0); setVisible(true); - _flag1 = true; + _isClicked = true; _countdown = 4; } messageResult = 1; @@ -427,9 +428,9 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam & return messageResult; } -Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _flag1(false), _flag2(false), _flag3(false), - _flag4(false), _flag5(false), _backgroundIndex(0) { +Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule, true), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false), + _isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) { Sprite *ssOpenButton; @@ -458,14 +459,14 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x0001: if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - if (!_flag2 && _backgroundIndex == 0) { - if (_flag1) { - _flag1 = false; + if (!_isActionButtonClicked && _backgroundIndex == 0) { + if (_isPanelOpen) { + _isPanelOpen = false; _backgroundIndex = 15; SetUpdateHandler(&Scene1105::upClosePanel); } else - _flag1 = true; - _flag5 = false; + _isPanelOpen = true; + _leaveResult = 0; } } break; @@ -476,7 +477,7 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x2003: _backgroundIndex = 24; - _flag5 = true; + _leaveResult = 1; SetUpdateHandler(&Scene1105::upClosePanel); break; case 0x4807: @@ -486,19 +487,19 @@ uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entit getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) { setGlobalVar(V_ROBOT_TARGET, 1); playSound(2); - _flag3 = true; + _doMoveTeddy = true; } else { sendMessage(_asTeddyBear, 0x2002, 0); } showMouse(false); - _flag2 = true; + _isActionButtonClicked = true; } break; case 0x4826: - if (_flag1) { + if (_isPanelOpen) { if (sender == _ssActionButton) { sendMessage(_ssActionButton, 0x480B, 0); - _flag1 = false; + _isPanelOpen = false; } else if (!getGlobalVar(V_ROBOT_TARGET)) { if (sender == _ssSymbol1UpButton) { if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) { @@ -568,7 +569,7 @@ void Scene1105::createObjects() { _ssActionButton = insertSprite(this, 0x8248AD35, NRect(280, 170, 354, 245)); _vm->_collisionMan->addSprite(_ssActionButton); - _flag1 = true; + _isPanelOpen = true; _asTeddyBear->show(); @@ -587,9 +588,8 @@ void Scene1105::upOpenPanel() { changeBackground(backgroundFileHash); _palette->addPalette(backgroundFileHash, 0, 256, 0); } - if (_backgroundIndex == 10) { + if (_backgroundIndex == 10) playSound(0); - } if (_backgroundIndex == 0) { SetUpdateHandler(&Scene1105::update); _countdown = 2; @@ -621,7 +621,7 @@ void Scene1105::upClosePanel() { } if (_backgroundIndex == 0) { SetUpdateHandler(&Scene1105::update); - _flag4 = true; + _isClosePanelDone = true; } } } @@ -635,15 +635,13 @@ void Scene1105::update() { getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2)); Scene::update(); - if (_countdown != 0 && (--_countdown == 0)) { + if (_countdown != 0 && (--_countdown == 0)) createObjects(); - } - if (_flag4 && !isSoundPlaying(1)) { - leaveScene(_flag5); - } - if (_flag3 && !isSoundPlaying(2)) { + if (_isClosePanelDone && !isSoundPlaying(1)) + leaveScene(_leaveResult); + if (_doMoveTeddy && !isSoundPlaying(2)) { sendMessage(_asTeddyBear, 0x2002, 0); - _flag3 = false; + _doMoveTeddy = false; } } @@ -659,25 +657,30 @@ Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x600CEF01, 1100); if (which < 0) { + // Restoring game insertKlayman(140, 436); setMessageList(0x004B6260); sendMessage(this, 0x2000, 0); } else if (which == 1) { + // Klaymen teleporting in insertKlayman(450, 436); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6268, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { + // Klaymen teleporting out insertKlayman(450, 436); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6318, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { + // Klaymen returning from teleporter console insertKlayman(450, 436); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6278, false); sendMessage(this, 0x2000, 1); } else { + // Klaymen entering from the left insertKlayman(0, 436); setMessageList(0x004B6258); sendMessage(this, 0x2000, 0); diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h index 126d14996d..e3fb7cba10 100644 --- a/engines/neverhood/module1100.h +++ b/engines/neverhood/module1100.h @@ -36,6 +36,7 @@ public: Module1100(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1100(); protected: + int _sceneNum; int _countdown; void createScene(int sceneNum, int which); void updateScene(); @@ -59,10 +60,10 @@ public: class SsScene1105SymbolDie : public StaticSprite { public: - SsScene1105SymbolDie(NeverhoodEngine *vm, uint index, int16 x, int16 y); + SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y); void hide(); protected: - uint _index; + uint _dieIndex; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void loadSymbolSprite(); }; @@ -83,22 +84,22 @@ public: protected: Scene *_parentScene; int _countdown; - bool _flag1; + bool _isClicked; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class Scene1105 : public Scene { public: - Scene1105(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1105(NeverhoodEngine *vm, Module *parentModule); protected: int _countdown; int _backgroundIndex; - bool _flag1; - bool _flag2; - bool _flag3; - bool _flag4; - bool _flag5; + bool _isPanelOpen; + bool _isActionButtonClicked; + bool _doMoveTeddy; + bool _isClosePanelDone; + int _leaveResult; AsScene1105TeddyBear *_asTeddyBear; SsScene1105Symbol *_ssSymbols[3]; SsScene1105SymbolDie *_ssSymbolDice[3]; -- cgit v1.2.3 From 097f1f27bbb5c00f0cad7216161b2064a73ebd2b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 09:39:18 +0000 Subject: NEVERHOOD: Clean up Module1200 (like the ones before) --- engines/neverhood/gamemodule.cpp | 8 +- engines/neverhood/module1200.cpp | 277 ++++++++++++++------------------------- engines/neverhood/module1200.h | 14 +- 3 files changed, 107 insertions(+), 192 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index fe732580a8..d6da2af3d3 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -284,9 +284,9 @@ void GameModule::startup() { */ //setGlobalVar(V_ENTRANCE_OPEN, 0); //setGlobalVar(V_DOOR_SPIKES_OPEN, 1); - setGlobalVar(V_CREATURE_ANGRY, 1); + //setGlobalVar(V_CREATURE_ANGRY, 1); setGlobalVar(V_RADIO_ENABLED, 1); - setGlobalVar(V_TNT_DUMMY_BUILT, 1); + //setGlobalVar(V_TNT_DUMMY_BUILT, 1); setGlobalVar(V_FLYTRAP_RING_DOOR, 1); setGlobalVar(V_TV_JOKE_TOLD, 1); /* @@ -316,8 +316,8 @@ void GameModule::startup() { */ _vm->gameState().which = 3; - _vm->gameState().sceneNum = 8; - createModule(1100, -1); + _vm->gameState().sceneNum = 0; + createModule(1200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index e6442a0585..98ec012fb5 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -29,15 +29,12 @@ Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Module1200::handleMessage); - debug("Module1200: which = %d", which); - - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 1) { + else if (which == 1) createScene(0, 2); - } else { + else createScene(0, 0); - } _vm->_soundMan->addMusic(0x00478311, 0x62222CAE); _vm->_soundMan->startMusic(0x62222CAE, 0, 0); @@ -49,15 +46,18 @@ Module1200::~Module1200() { void Module1200::createScene(int sceneNum, int which) { debug("Module1200::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _childObject = new Scene1201(_vm, this, which); break; case 1: - _childObject = new Scene1202(_vm, this, which); + _vm->gameState().sceneNum = 1; + _childObject = new Scene1202(_vm, this); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); createSmackerScene(0x31890001, true, true, false); setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1); @@ -69,19 +69,17 @@ void Module1200::createScene(int sceneNum, int which) { void Module1200::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(1, 0); - } else if (_moduleResult == 2) { - if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) { + else if (_moduleResult == 2) { + if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) createScene(2, -1); - } else { + else leaveModule(1); - } - } else { + } else leaveModule(0); - } break; case 1: createScene(0, 1); @@ -101,78 +99,41 @@ static const uint32 kScene1201InitArray[] = { }; static const NPoint kScene1201PointArray[] = { - {218, 193}, - {410, 225}, - {368, 277}, - {194, 227}, - {366, 174}, - {458, 224}, - {242, 228}, - {512, 228}, - {458, 277}, - {217, 233}, - {458, 173}, - {410, 276}, - {203, 280}, - {371, 226}, - {508, 279}, - {230, 273}, - {410, 171}, - {493, 174} + {218, 193}, {410, 225}, {368, 277}, + {194, 227}, {366, 174}, {458, 224}, + {242, 228}, {512, 228}, {458, 277}, + {217, 233}, {458, 173}, {410, 276}, + {203, 280}, {371, 226}, {508, 279}, + {230, 273}, {410, 171}, {493, 174} }; static const uint32 kScene1201TntFileHashList1[] = { - 0x2098212D, - 0x1600437E, - 0x1600437E, - 0x00A840E3, - 0x1A1830F6, - 0x1A1830F6, - 0x00212062, - 0x384010B6, - 0x384010B6, - 0x07A01080, - 0xD80C2837, - 0xD80C2837, - 0x03A22092, - 0xD8802CB6, - 0xD8802CB6, - 0x03A93831, - 0xDA460476, - 0xDA460476 + 0x2098212D, 0x1600437E, 0x1600437E, + 0x00A840E3, 0x1A1830F6, 0x1A1830F6, + 0x00212062, 0x384010B6, 0x384010B6, + 0x07A01080, 0xD80C2837, 0xD80C2837, + 0x03A22092, 0xD8802CB6, 0xD8802CB6, + 0x03A93831, 0xDA460476, 0xDA460476 }; static const uint32 kScene1201TntFileHashList2[] = { - 0x3040C676, - 0x10914448, - 0x10914448, - 0x3448A066, - 0x1288C049, - 0x1288C049, - 0x78C0E026, - 0x3098D05A, - 0x3098D05A, - 0x304890E6, - 0x1284E048, - 0x1284E048, - 0xB140A1E6, - 0x5088A068, - 0x5088A068, - 0x74C4C866, - 0x3192C059, - 0x3192C059 + 0x3040C676, 0x10914448, 0x10914448, + 0x3448A066, 0x1288C049, 0x1288C049, + 0x78C0E026, 0x3098D05A, 0x3098D05A, + 0x304890E6, 0x1284E048, 0x1284E048, + 0xB140A1E6, 0x5088A068, 0x5088A068, + 0x74C4C866, 0x3192C059, 0x3192C059 }; SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2) - : StaticSprite(vm, 900), _field7A(-1) { + : StaticSprite(vm, 900) { int16 x = kScene1201PointArray[pointIndex].x; int16 y = kScene1201PointArray[pointIndex].y; - if (x < 300) { + if (x < 300) loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50); - } else { + else loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y); - } setClipRect(0, 0, 640, clipY2); } @@ -203,7 +164,7 @@ uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, return messageResult; } -AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag) +AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging) : AnimatedSprite(vm, 1200) { SetUpdateHandler(&AnimatedSprite::update); @@ -211,7 +172,7 @@ AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool flag) createSurface(10, 34, 149); _x = 202; _y = -32; - if (flag) { + if (isDummyHanging) { startAnimation(0x928F0C10, 15, -1); _newStickFrameIndex = STICK_LAST_FRAME; } else { @@ -224,9 +185,8 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam & uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x02060018) { + if (param.asInteger() == 0x02060018) playSound(0, 0x47900E06); - } break; case 0x2006: startAnimation(0x928F0C10, 1, -1); @@ -236,7 +196,7 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam & return messageResult; } -AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag) +AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen) : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { createSurface1(0xD088AC30, 100); @@ -245,7 +205,7 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, SetUpdateHandler(&AsScene1201RightDoor::update); SetMessageHandler(&AsScene1201RightDoor::handleMessage); _newStickFrameIndex = STICK_LAST_FRAME; - if (flag) { + if (isOpen) { startAnimation(0xD088AC30, -1, -1); _newStickFrameIndex = STICK_LAST_FRAME; _countdown = 25; @@ -256,9 +216,8 @@ AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, } void AsScene1201RightDoor::update() { - if (_countdown != 0 && (--_countdown == 0)) { + if (_countdown != 0 && (--_countdown == 0)) stCloseDoor(); - } AnimatedSprite::update(); } @@ -348,11 +307,10 @@ uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶ uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x092870C0) { + if (param.asInteger() == 0x092870C0) sendMessage(_asTntManRope, 0x2006, 0); - } else if (param.asInteger() == 0x11CA0144) { + else if (param.asInteger() == 0x11CA0144) playSound(0, 0x51800A04); - } break; case 0x1011: sendMessage(_parentScene, 0x2002, 0); @@ -479,9 +437,8 @@ uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageP uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x86668011) { + if (param.asInteger() == 0x86668011) playSound(0); - } break; } return messageResult; @@ -571,13 +528,12 @@ AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene } void AsScene1201Creature::update() { - bool oldFlag = _klaymanTooClose; + bool oldKlaymanTooClose = _klaymanTooClose; _klaymanTooClose = _klayman->getX() >= 385; - if (_klaymanTooClose != oldFlag) + if (_klaymanTooClose != oldKlaymanTooClose) stWaiting(); - if (_countdown1 != 0 && (--_countdown1 == 0)) { + if (_countdown != 0 && (--_countdown == 0)) gotoNextState(); - } updateAnim(); handleSpriteUpdate(); updatePosition(); @@ -587,9 +543,8 @@ uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam ¶m, uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x02060018) { + if (param.asInteger() == 0x02060018) playSound(0, 0xCD298116); - } break; case 0x2004: GotoState(&AsScene1201Creature::stStartReachForTntDummy); @@ -632,7 +587,7 @@ void AsScene1201Creature::stWaiting() { startAnimation(0x08081513, 0, -1); SetMessageHandler(&AsScene1201Creature::hmWaiting); NextState(&AsScene1201Creature::stPincerSnap); - _countdown1 = 36; + _countdown = 36; } void AsScene1201Creature::stPincerSnap() { @@ -647,20 +602,20 @@ void AsScene1201Creature::stStartReachForTntDummy() { startAnimation(0x08081513, 0, -1); SetMessageHandler(&AsScene1201Creature::hmWaiting); NextState(&AsScene1201Creature::stReachForTntDummy); - _countdown1 = 48; + _countdown = 48; } void AsScene1201Creature::stReachForTntDummy() { startAnimation(0x5A201453, 0, -1); SetMessageHandler(&AsScene1201Creature::hmWaiting); - _countdown1 = 0; + _countdown = 0; } void AsScene1201Creature::stPincerSnapKlayman() { startAnimation(0xCA287133, 0, -1); SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlayman); NextState(&AsScene1201Creature::stWaiting); - _countdown1 = 0; + _countdown = 0; } AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) @@ -712,9 +667,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) { setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1); - for (uint32 index = 0; index < 18; index++) { + for (uint32 index = 0; index < 18; index++) setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]); - } } insertMouse433(0x9A2C0409); @@ -748,12 +702,15 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asKlaymanHead = insertSprite(); if (which < 0) { + // Restoring game insertKlayman(364, 333); setMessageList(0x004AEC08); } else if (which == 3) { + // Klaymen standing after the weasel exploded insertKlayman(400, 329); setMessageList(0x004AEC08); } else if (which == 2) { + // Klaymen entering from the right if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { insertKlayman(374, 333); setMessageList(0x004AEC08); @@ -762,6 +719,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AEC20); } } else if (which == 1) { + // Klaymen returning from the TNT console if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(364, 333); _klayman->setDoDeltaX(1); @@ -770,6 +728,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } setMessageList(0x004AEC30); } else { + // Klaymen entering from the left insertKlayman(0, 336); setMessageList(0x004AEC10); } @@ -848,11 +807,10 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tntIndex++; } - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) setRectList(0x004AEE18); - } else { + else setRectList(0x004AED88); - } } @@ -861,9 +819,8 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asLeftDoor = insertSprite(_klayman); _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); - if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) { + if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) setGlobalVar(V_MATCH_STATUS, 1); - } _asMatch = NULL; @@ -898,23 +855,22 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asInteger() == 0x07053000) { _creatureExploded = true; sendMessage(_asCreature, 0x2004, 0); - } else if (param.asInteger() == 0x140E5744) { + } else if (param.asInteger() == 0x140E5744) sendMessage(_asCreature, 0x2005, 0); - } else if (param.asInteger() == 0x40253C40) { + else if (param.asInteger() == 0x40253C40) { _canAcceptInput = false; sendMessage(_asCreature, 0x2006, 0); } else if (param.asInteger() == 0x090EB048) { - if (_klayman->getX() < 572) { + if (_klayman->getX() < 572) setMessageList2(0x004AEC90); - } else { + else setMessageList2(0x004AEC20); - } } break; case 0x2001: - if (getGlobalVar(V_MATCH_STATUS) == 0) { + if (getGlobalVar(V_MATCH_STATUS) == 0) setMessageList2(0x004AECB0); - } else { + else { sendEntityMessage(_klayman, 0x1014, _asMatch); setMessageList2(0x004AECC0); } @@ -927,11 +883,10 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit } else if (getGlobalVar(V_MATCH_STATUS) == 3) { // Light the TNT dummy if we have the match sendEntityMessage(_klayman, 0x1014, _asTntMan); - if (_klayman->getX() > _asTntMan->getX()) { + if (_klayman->getX() > _asTntMan->getX()) setMessageList(0x004AECD0); - } else { + else setMessageList(0x004AECE0); - } } break; case 0x4814: @@ -960,45 +915,21 @@ static const uint32 kScene1202Table[] = { }; static const NPoint kScene1202Points[] = { - {203, 140}, - {316, 212}, - {277, 264}, - {176, 196}, - {275, 159}, - {366, 212}, - {230, 195}, - {412, 212}, - {368, 263}, - {204, 192}, - {365, 164}, - {316, 262}, - {191, 255}, - {280, 213}, - {406, 266}, - {214, 254}, - {316, 158}, - {402, 161} + {203, 140}, {316, 212}, {277, 264}, + {176, 196}, {275, 159}, {366, 212}, + {230, 195}, {412, 212}, {368, 263}, + {204, 192}, {365, 164}, {316, 262}, + {191, 255}, {280, 213}, {406, 266}, + {214, 254}, {316, 158}, {402, 161} }; static const uint32 kScene1202FileHashes[] = { - 0x1AC00B8, - 0x1AC14B8, - 0x1AC14B8, - 0x1AC30B8, - 0x1AC14B8, - 0x1AC14B8, - 0x1AC00B8, - 0x1AC14B8, - 0x1AC14B8, - 0x1AC90B8, - 0x1AC18B8, - 0x1AC18B8, - 0x1AC30B8, - 0x1AC14B8, - 0x1AC14B8, - 0x1AC50B8, - 0x1AC14B8, - 0x1AC14B8 + 0x1AC00B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC30B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC00B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC90B8, 0x1AC18B8, 0x1AC18B8, + 0x1AC30B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC50B8, 0x1AC14B8, 0x1AC14B8 }; AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex) @@ -1056,9 +987,9 @@ void AsScene1202TntItem::stChangePositionFadeIn() { _x = kScene1202Points[_newPosition].x; _y = kScene1202Points[_newPosition].y; startAnimation(kScene1202FileHashes[_itemIndex], 6, -1); + _playBackwards = true; SetMessageHandler(&AsScene1202TntItem::hmChangePosition); NextState(&AsScene1202TntItem::stChangePositionDone); - _playBackwards = true; } void AsScene1202TntItem::stChangePositionDone() { @@ -1066,15 +997,14 @@ void AsScene1202TntItem::stChangePositionDone() { stShowIdle(); } -Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _paletteResource(vm), - _flag(true), _soundFlag(false), _counter(0), _clickedIndex(-1) { + _soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) { SetMessageHandler(&Scene1202::handleMessage); SetUpdateHandler(&Scene1202::update); setBackground(0x60210ED5); - setPalette(0x60210ED5); addEntity(_palette); @@ -1083,16 +1013,15 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x10ED160A, 20, 620); - for (int i = 0; i < 18; i++) { - _asTntItems[i] = insertSprite(this, i); - _vm->_collisionMan->addSprite(_asTntItems[i]); + for (int tntIndex = 0; tntIndex < 18; tntIndex++) { + _asTntItems[tntIndex] = insertSprite(this, tntIndex); + _vm->_collisionMan->addSprite(_asTntItems[tntIndex]); } insertStaticSprite(0x8E8419C1, 1100); - if (getGlobalVar(V_TNT_DUMMY_BUILT)) { + if (getGlobalVar(V_TNT_DUMMY_BUILT)) SetMessageHandler(&Scene1202::hmSolved); - } playSound(0, 0x40106542); loadSound(1, 0x40005446); @@ -1102,15 +1031,13 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1202::~Scene1202() { - if (isSolved()) { + if (isSolved()) setGlobalVar(V_TNT_DUMMY_BUILT, 1); - } } void Scene1202::update() { Scene::update(); - if (_soundFlag) { - debug("CHECK SOLVED"); + if (_isPuzzleSolved) { if (!isSoundPlaying(3)) leaveScene(0); } else if (_counter == 0 && isSolved()) { @@ -1120,7 +1047,7 @@ void Scene1202::update() { _palette->copyToBasePalette(_paletteData); _palette->startFadeToPalette(24); playSound(3); - _soundFlag = true; + _isPuzzleSolved = true; } else if (_clickedIndex >= 0 && _counter == 0) { int destIndex = kScene1202Table[_clickedIndex]; sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex)); @@ -1130,12 +1057,8 @@ void Scene1202::update() { setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp); _counter = 2; _clickedIndex = -1; - if (_flag) { - playSound(1); - } else { - playSound(2); - } - _flag = !_flag; + playSound(_soundToggle ? 1 : 2); + _soundToggle = !_soundToggle; } } @@ -1144,9 +1067,8 @@ uint32 Scene1202::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_soundFlag) { + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isPuzzleSolved) leaveScene(0); - } break; case 0x2000: _clickedIndex = (int)param.asInteger(); @@ -1162,21 +1084,14 @@ uint32 Scene1202::hmSolved(int messageNum, const MessageParam ¶m, Entity *se Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); - } break; } return 0; } bool Scene1202::isSolved() { - - debug("isSolved() %d %d %d %d %d %d", - getSubVar(VA_TNT_POSITIONS, 0), getSubVar(VA_TNT_POSITIONS, 3), - getSubVar(VA_TNT_POSITIONS, 6), getSubVar(VA_TNT_POSITIONS, 9), - getSubVar(VA_TNT_POSITIONS, 12), getSubVar(VA_TNT_POSITIONS, 15)); - return getSubVar(VA_TNT_POSITIONS, 0) == 0 && getSubVar(VA_TNT_POSITIONS, 3) == 3 && getSubVar(VA_TNT_POSITIONS, 6) == 6 && getSubVar(VA_TNT_POSITIONS, 9) == 9 && diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index a0e9c9f902..1fe607d308 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -36,6 +36,7 @@ public: Module1200(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1200(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; @@ -53,14 +54,14 @@ protected: class AsScene1201TntManRope : public AnimatedSprite { public: - AsScene1201TntManRope(NeverhoodEngine *vm, bool flag); + AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class AsScene1201RightDoor : public AnimatedSprite { public: - AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool flag); + AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen); protected: Sprite *_klayman; int _countdown; @@ -129,7 +130,7 @@ public: protected: Scene *_parentScene; Sprite *_klayman; - int _countdown1; + int _countdown; bool _klaymanTooClose; void update(); uint32 hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender); @@ -156,7 +157,6 @@ public: SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2); protected: uint32 _elemIndex; - int16 _field7A; }; class Scene1201 : public Scene { @@ -195,7 +195,7 @@ protected: class Scene1202 : public Scene { public: - Scene1202(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1202(NeverhoodEngine *vm, Module *parentModule); virtual ~Scene1202(); protected: PaletteResource _paletteResource; @@ -203,8 +203,8 @@ protected: int _counter; int _clickedIndex; byte _paletteData[1024]; - bool _soundFlag; - bool _flag; + bool _isPuzzleSolved; + bool _soundToggle; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmSolved(int messageNum, const MessageParam ¶m, Entity *sender); -- cgit v1.2.3 From ee7d47cb187cbfcc4374acc6161fe6ab0d46598d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 10:56:12 +0000 Subject: NEVERHOOD: Clean up Module1300 (like the ones before) --- engines/neverhood/gamemodule.cpp | 8 +- engines/neverhood/module1300.cpp | 443 +++++++++++++++++---------------------- engines/neverhood/module1300.h | 15 +- 3 files changed, 199 insertions(+), 267 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d6da2af3d3..0eeee2ee03 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -305,6 +305,8 @@ void GameModule::startup() { // Enable all locations for (int i = 0; i < 6; i++) setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1); + //setGlobalVar(V_PROJECTOR_LOCATION, 4); + setGlobalVar(V_KEYDOOR_UNLOCKED, 1); // <<gameState().which = 3; - _vm->gameState().sceneNum = 0; - createModule(1200, -1); + _vm->gameState().which = 5; + _vm->gameState().sceneNum = 6; + createModule(1300, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 409e554b2b..feebd78485 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -110,90 +110,106 @@ Module1300::~Module1300() { void Module1300::createScene(int sceneNum, int which) { debug("Module1300::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; + _sceneNum = sceneNum; switch (_vm->gameState().sceneNum) { case 1: + _vm->gameState().sceneNum = 1; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1302(_vm, this, which); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new Scene1303(_vm, this, which); + _childObject = new Scene1303(_vm, this); break; case 3: + _vm->gameState().sceneNum = 3; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new Scene1304(_vm, this, which); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1305(_vm, this, which); break; case 5: + _vm->gameState().sceneNum = 5; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1306(_vm, this, which); break; case 6: + _vm->gameState().sceneNum = 6; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x00203197, 0, 2); - _childObject = new Scene1307(_vm, this, which); + _childObject = new Scene1307(_vm, this); break; case 7: + _vm->gameState().sceneNum = 7; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x00203197, 0, 2); _childObject = new Scene1308(_vm, this, which); break; case 8: + _vm->gameState().sceneNum = 8; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new DiskplayerScene(_vm, this, 1); break; case 9: + _vm->gameState().sceneNum = 9; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createSmackerScene(0x20082818, true, true, false); break; case 10: + _vm->gameState().sceneNum = 10; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createSmackerScene(0x20082828, true, true, false); break; case 11: + _vm->gameState().sceneNum = 11; _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B27A8, which); break; case 12: + _vm->gameState().sceneNum = 12; _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B2718, which); break; case 13: + _vm->gameState().sceneNum = 13; _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B27D8, which); break; case 14: + _vm->gameState().sceneNum = 14; _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B2808, which); break; case 15: + _vm->gameState().sceneNum = 15; _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); createNavigationScene(0x004B2838, which); break; case 16: + _vm->gameState().sceneNum = 16; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new Scene1317(_vm, this, which); + _childObject = new Scene1317(_vm, this); break; case 17: - // TODO: Credits scene + _vm->gameState().sceneNum = 17; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); _vm->_soundMan->stopMusic(0x00203197, 0, 2); _childObject = new CreditsScene(_vm, this, false); @@ -205,13 +221,12 @@ void Module1300::createScene(int sceneNum, int which) { void Module1300::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 1: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(4, 0); - } else { + else createScene(7, 1); - } break; case 2: createScene(5, 3); @@ -223,27 +238,25 @@ void Module1300::updateScene() { createScene(16, -1); break; case 5: - if (_moduleResult == 2) { + if (_moduleResult == 2) createScene(8, 0); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createScene(2, 0); - } else if (_moduleResult == 0) { + else if (_moduleResult == 0) leaveModule(0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(10, -1); - } break; case 6: createScene(7, 2); break; case 7: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(13, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(1, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(6, 0); - } break; case 8: createScene(5, 2); @@ -271,25 +284,22 @@ void Module1300::updateScene() { createScene(13, 1); break; case 13: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(12, 2); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(7, 0); - } break; case 14: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(12, 3); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(9, -1); - } break; case 15: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(12, 4); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(3, 0); - } break; case 16: createScene(17, -1); @@ -307,8 +317,6 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) _x = 320; _y = 240; createSurface1(0x88148150, 500); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1302Bridge::handleMessage); if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { startAnimation(0x88148150, 0, -1); _newStickFrameIndex = 0; @@ -318,6 +326,8 @@ AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) } loadSound(0, 0x68895082); loadSound(1, 0x689BD0C1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1302Bridge::handleMessage); } uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -338,8 +348,8 @@ uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶ void AsScene1302Bridge::stLowerBridge() { startAnimation(0x88148150, 0, -1); - NextState(&AsScene1302Bridge::cbLowerBridgeEvent); playSound(1); + NextState(&AsScene1302Bridge::cbLowerBridgeEvent); } void AsScene1302Bridge::stRaiseBridge() { @@ -358,14 +368,14 @@ void AsScene1302Bridge::cbLowerBridgeEvent() { SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) : StaticSprite(vm, 0x11122122, 200) { - SetUpdateHandler(&SsScene1302Fence::update); - SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteUpdate(NULL); _firstY = _y; if (getGlobalVar(V_FLYTRAP_RING_FENCE)) _y += 152; loadSound(0, 0x7A00400C); loadSound(1, 0x78184098); + SetUpdateHandler(&SsScene1302Fence::update); + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteUpdate(NULL); } void SsScene1302Fence::update() { @@ -378,13 +388,13 @@ uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m switch (messageNum) { case 0x4808: playSound(0); - SetSpriteUpdate(&SsScene1302Fence::suMoveDown); SetMessageHandler(NULL); + SetSpriteUpdate(&SsScene1302Fence::suMoveDown); break; case 0x4809: playSound(1); - SetSpriteUpdate(&SsScene1302Fence::suMoveUp); SetMessageHandler(NULL); + SetSpriteUpdate(&SsScene1302Fence::suMoveUp); break; } return messageResult; @@ -412,9 +422,9 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { SetMessageHandler(&Scene1302::handleMessage); + setHitRects(0x004B0858); setRectList(0x004B0A38); - setBackground(0x420643C4); setPalette(0x420643C4); insertMouse433(0x643C0428); @@ -424,21 +434,21 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x70430830, 1200); _sprite2->setVisible(false); _sprite3 = insertStaticSprite(0x16E01E20, 1100); - _asRing1 = insertSprite(this, false, 218, 122, _class595->getDrawRect().y, false); _asRing2 = insertSprite(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE)); _asRing3 = insertSprite(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false); _asRing4 = insertSprite(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE)); _asRing5 = insertSprite(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false); - _asBridge = insertSprite(this); _ssFence = insertSprite(); _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); if (which < 0) { + // Restoring game insertKlayman(380, 364); setMessageList(0x004B0868); } else { + // Klaymen entering from back insertKlayman(293, 330); setMessageList(0x004B0870); } @@ -457,87 +467,77 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x4A845A00) { + if (param.asInteger() == 0x4A845A00) sendEntityMessage(_klayman, 0x1014, _asRing1); - } else if (param.asInteger() == 0x43807801) { + else if (param.asInteger() == 0x43807801) { if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { sendEntityMessage(_klayman, 0x1014, _asRing2); - if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) { + if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) setMessageList(0x004B0940); - } else { + else setMessageList(0x004B0938); - } - } else { + } else setMessageList(0x004B0950); - } messageResult = 1; - } else if (param.asInteger() == 0x46C26A01) { + } else if (param.asInteger() == 0x46C26A01) sendEntityMessage(_klayman, 0x1014, _asRing3); - } else if (param.asInteger() == 0x468C7B11) { + else if (param.asInteger() == 0x468C7B11) { if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) { sendEntityMessage(_klayman, 0x1014, _asRing4); - if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) { + if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) setMessageList(0x004B0940); - } else { + else setMessageList(0x004B0938); - } - } else { + } else setMessageList(0x004B0950); - } messageResult = 1; - } else if (param.asInteger() == 0x42845B19) { + } else if (param.asInteger() == 0x42845B19) sendEntityMessage(_klayman, 0x1014, _asRing5); - } else if (param.asInteger() == 0x430A6060) { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { + else if (param.asInteger() == 0x430A6060) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) setMessageList2(0x004B0910); - } else { + else cancelMessageList(); - } } else if (param.asInteger() == 0x012E2070) { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) setMessageList2(0x004B0968); - } else { + else cancelMessageList(); - } } else if (param.asInteger() == 0x11C40840) { - if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) { + if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) setMessageList(0x004B0878); - } else { + else setMessageList(0x004B0978); - } } break; case 0x2000: if (_klayman->getY() > 360) { sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap); setMessageList2(0x004B08F0); - } else { + } else setMessageList2(0x004B0920); - } break; case 0x2002: - if (_klayman->getX() > 545) { + if (_klayman->getX() > 545) leaveScene(1); - } break; case 0x2032: _sprite2->setVisible(true); break; case 0x4806: sendMessage(_parentModule, 0x1024, 2); - if (sender == _asRing1) { + if (sender == _asRing1) playSound(0, 0x665198C0); - } else if (sender == _asRing2) { + else if (sender == _asRing2) { sendMessage(_asBridge, 0x4808, 0); setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); - } else if (sender == _asRing3) { + } else if (sender == _asRing3) playSound(0, 0xE2D389C0); - } else if (sender == _asRing4) { + else if (sender == _asRing4) { sendMessage(_ssFence, 0x4808, 0); setGlobalVar(V_FLYTRAP_RING_FENCE, 1); - } else if (sender == _asRing5) { + } else if (sender == _asRing5) playSound(0, 0x40428A09); - } break; case 0x4807: if (sender == _asRing2) { @@ -548,11 +548,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_ssFence, 0x4809, 0); setGlobalVar(V_FLYTRAP_RING_FENCE, 0); } else if (sender == _asVenusFlyTrap) { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) sendMessage(_asRing2, 0x4807, 0); - } else { + else sendMessage(_asRing4, 0x4807, 0); - } } break; case 0x480F: @@ -588,10 +587,10 @@ AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) createSurface(200, 128, 315); _x = 289; _y = 390; + startAnimation(0x800278D2, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1303Balloon::handleMessage); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - startAnimation(0x800278D2, 0, -1); } uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -612,15 +611,14 @@ uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam &p uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x020B0003) { + if (param.asInteger() == 0x020B0003) playSound(0, 0x742B0055); - } break; case 0x3002: playSound(0, 0x470007EE); stopAnimation(); - SetMessageHandler(NULL); setVisible(false); + SetMessageHandler(NULL); break; } return messageResult; @@ -631,12 +629,12 @@ void AsScene1303Balloon::stPopBalloon() { SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped); } -Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true) { SetMessageHandler(&Scene1303::handleMessage); + setRectList(0x004AF9E8); - setBackground(0x01581A9C); setPalette(0x01581A9C); insertMouse433(0x81A9801D); @@ -663,9 +661,8 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asBalloon, 0x2000, 0); break; case 0x4826: - if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) { + if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) setMessageList(0x004AF9B8); - } break; } return 0; @@ -695,11 +692,11 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶ } Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule, true), _asNeedle(NULL) { SetMessageHandler(&Scene1304::handleMessage); - setRectList(0x004B91A8); + setRectList(0x004B91A8); setBackground(0x062C0214); setPalette(0x062C0214); insertMouse433(0xC021006A); @@ -709,14 +706,11 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asKey); } else { _asKey = insertSprite(0x80106018, 100, 279, 48); - // TODO _asKey->setUpdateDeltaXY(); } if (!getGlobalVar(V_HAS_NEEDLE)) { _asNeedle = insertSprite(this, 1100, 278, 347); _vm->_collisionMan->addSprite(_asNeedle); - } else { - _asNeedle = NULL; } _sprite1 = insertStaticSprite(0x0562E621, 1100); @@ -724,9 +718,11 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x090AF033, 1100); if (which < 0) { + // Restoring game insertKlayman(217, 347); setMessageList(0x004B90E8); } else { + // Klaymen entering from the left insertKlayman(100, 347); setMessageList(0x004B90F0); } @@ -740,11 +736,10 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x415634A4) { - if (getGlobalVar(V_BALLOON_POPPED)) { + if (getGlobalVar(V_BALLOON_POPPED)) cancelMessageList(); - } else { + else setMessageList(0x004B9158); - } } break; case 0x4826: @@ -764,16 +759,18 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { SetMessageHandler(&Scene1305::handleMessage); - setRectList(0x004B6E98); + setRectList(0x004B6E98); setBackground(0x28801B64); setPalette(0x28801B64); insertMouse433(0x01B60280); if (which < 0) { + // Restoring game insertKlayman(212, 441); setMessageList(0x004B6E40); } else { + // Klaymen enters falling insertKlayman(212, 441); setMessageList(0x004B6E48); } @@ -793,16 +790,15 @@ AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene createSurface1(0x043B0270, 100); startAnimation(0x043B0270, 0, -1); _newStickFrameIndex = 0; - SetMessageHandler(&AsScene1306Elevator::handleMessage); loadSound(0, 0x1C100E83); loadSound(1, 0x1C08CEC5); loadSound(2, 0x5D011E87); + SetMessageHandler(&AsScene1306Elevator::handleMessage); } void AsScene1306Elevator::update() { - if (_isUp && _countdown != 0 && (--_countdown == 0)) { + if (_isUp && _countdown != 0 && (--_countdown == 0)) stGoingDown(); - } AnimatedSprite::update(); if (_currFrameIndex == 7) { playSound(1); @@ -812,9 +808,8 @@ void AsScene1306Elevator::update() { void AsScene1306Elevator::upGoingDown() { AnimatedSprite::update(); - if (_currFrameIndex == 5) { + if (_currFrameIndex == 5) _asElevatorDoor->setVisible(true); - } } uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -839,36 +834,36 @@ uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam &pa void AsScene1306Elevator::stGoingUp() { setVisible(true); _isDown = false; - SetUpdateHandler(&AsScene1306Elevator::update); startAnimation(0x043B0270, 0, -1); - NextState(&AsScene1306Elevator::cbGoingUpEvent); playSound(0); + SetUpdateHandler(&AsScene1306Elevator::update); + NextState(&AsScene1306Elevator::cbGoingUpEvent); } void AsScene1306Elevator::cbGoingUpEvent() { - SetUpdateHandler(&AsScene1306Elevator::update); sendMessage(_parentScene, 0x4808, 0); _isUp = true; _countdown = 144; stopAnimation(); setVisible(false); + SetUpdateHandler(&AsScene1306Elevator::update); } void AsScene1306Elevator::stGoingDown() { - SetUpdateHandler(&AsScene1306Elevator::upGoingDown); _isUp = false; setVisible(true); startAnimation(0x043B0270, -1, -1); _playBackwards = true; - NextState(&AsScene1306Elevator::cbGoingDownEvent); playSound(1); + SetUpdateHandler(&AsScene1306Elevator::upGoingDown); + NextState(&AsScene1306Elevator::cbGoingDownEvent); } void AsScene1306Elevator::cbGoingDownEvent() { _isDown = true; sendMessage(_parentScene, 0x4809, 0); - SetUpdateHandler(&AsScene1306Elevator::update); stopAnimation(); + SetUpdateHandler(&AsScene1306Elevator::update); } Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) @@ -889,31 +884,29 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) } _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); - _asTape = insertSprite(this, 19, 1100, 359, 445, 0x9148A011); - _asElevatorDoor = insertSprite(0x043B0270, 90, 320, 240); _asElevatorDoor->startAnimation(0x043B0270, 6, -1); _asElevatorDoor->setNewHashListIndex(6); - _asElevator = insertSprite(this, _asElevatorDoor); - _sprite1 = insertStaticSprite(0x036A1EE0, 80); - insertStaticSprite(0x00042313, 1100); if (which < 0) { + // Resoring game insertKlayman(380, 440); setMessageList(0x004AFAD0); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 1) { + // Klaymen teleporting in insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFAF0); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 2) { + // Klaymen returning from diskplayer if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(515, 440); _klayman->setDoDeltaX(1); @@ -924,23 +917,27 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 3) { + // Klaymen returning from window insertKlayman(534, 440); setMessageList(0x004AFC30); sendMessage(this, 0x2000, 0); _vm->_collisionMan->addSprite(_asTape); } else if (which == 4) { + // Klaymen teleporting out insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFC38); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else if (which == 5) { + // Klaymen returning from teleporter insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFB00); sendMessage(this, 0x2000, 1); _vm->_collisionMan->addSprite(_asTape); } else { + // Klaymen coming up in elevator insertKlayman(286, 408); setSurfacePriority(_asElevator->getSurface(), 1100); setSurfacePriority(_asElevatorDoor->getSurface(), 1090); @@ -961,14 +958,13 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x402064D8) { + if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssButton); - } else if (param.asInteger() == 0x01C66840) { - if (sendMessage(_asElevator, 0x2001, 0) != 0) { + else if (param.asInteger() == 0x01C66840) { + if (sendMessage(_asElevator, 0x2001, 0) != 0) setMessageList(0x004AFBD8); - } else { + else setMessageList(0x004AFAE0); - } } else if (param.asInteger() == 0x8E646E00) { setMessageList(0x004AFAD8); clearRectList(); @@ -985,9 +981,8 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480B: - if (sender == _ssButton) { + if (sender == _ssButton) sendMessage(_asElevator, 0x4808, 0); - } break; case 0x4826: if (sender == _asKey) { @@ -1045,21 +1040,15 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, } static const uint32 kAsScene1307KeyResourceList1[] = { - 0x0438069C, - 0x45B0023C, - 0x05700217 + 0x0438069C, 0x45B0023C, 0x05700217 }; static const uint32 kAsScene1307KeyResourceList2[] = { - 0x04441334, - 0x061433F0, - 0x06019390 + 0x04441334, 0x061433F0, 0x06019390 }; static const uint32 kAsScene1307KeyResourceList3[] = { - 0x11A80030, - 0x178812B1, - 0x1488121C + 0x11A80030, 0x178812B1, 0x1488121C }; static const uint32 *kAsScene1307KeyResourceLists[] = { @@ -1069,27 +1058,16 @@ static const uint32 *kAsScene1307KeyResourceLists[] = { }; static const int kAsScene1307KeySurfacePriorities[] = { - 700, - 500, - 300, - 100 + 700, 500, 300, 100 }; const uint kAsScene1307KeyPointsCount = 12; static const NPoint kAsScene1307KeyPoints[] = { - {-2, 0}, - {-5, 0}, - { 5, 0}, - {12, 0}, - {17, 0}, - {25, 0}, - {16, -2}, - {10, -6}, - { 0, -7}, - {-7, -3}, - {-3, 4}, - { 2, 2} + {-2, 0}, {-5, 0}, { 5, 0}, + {12, 0}, {17, 0}, {25, 0}, + {16, -2}, {10, -6}, { 0, -7}, + {-7, -3}, {-3, 4}, { 2, 2} }; const uint kAsScene1307KeyFrameIndicesCount = 20; @@ -1100,36 +1078,29 @@ static const int16 kAsScene1307KeyFrameIndices[] = { }; const int kAsScene1307KeyDivValue = 200; - const int16 kAsScene1307KeyXDelta = 70; const int16 kAsScene1307KeyYDelta = -12; -AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _index(index), _clipRects(clipRects), +AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _keyIndex(keyIndex), _clipRects(clipRects), _isClickable(true) { NPoint pt; - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; _dataResource.load(0x22102142); _pointList = _dataResource.getPointArray(0xAC849240); - - pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; + pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; _x = pt.x; _y = pt.y; - - createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4], 190, 148); - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1307Key::handleMessage); - + createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4], 190, 148); startAnimation(fileHashes[0], 0, -1); - loadSound(0, 0xDC4A1280); loadSound(1, 0xCC021233); loadSound(2, 0xC4C23844); loadSound(3, 0xC4523208); - + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1307Key::handleMessage); } uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1146,7 +1117,7 @@ uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, _isClickable = param.asInteger() != 0; break; case 0x2001: - setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index, param.asInteger()); + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex, param.asInteger()); stMoveKey(); break; case 0x2003: @@ -1194,7 +1165,7 @@ void AsScene1307Key::suMoveKey() { updateBounds(); _pointIndex++; } else { - NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; + NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; _x = pt.x + kAsScene1307KeyXDelta; _y = pt.y + kAsScene1307KeyYDelta; stInsertKey(); @@ -1202,23 +1173,23 @@ void AsScene1307Key::suMoveKey() { } void AsScene1307Key::stRemoveKey() { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; _pointIndex = 0; - SetSpriteUpdate(&AsScene1307Key::suRemoveKey); startAnimation(fileHashes[0], 0, -1); playSound(1); + SetSpriteUpdate(&AsScene1307Key::suRemoveKey); } void AsScene1307Key::stInsertKey() { _pointIndex = 0; - sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]); - setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index) % 4]); - SetSpriteUpdate(&AsScene1307Key::suInsertKey); + sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]); + setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]); _newStickFrameIndex = STICK_LAST_FRAME; + SetSpriteUpdate(&AsScene1307Key::suInsertKey); } void AsScene1307Key::stMoveKey() { - NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _index)]; + NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; int16 newX = pt.x + kAsScene1307KeyXDelta; int16 newY = pt.y + kAsScene1307KeyYDelta; sendMessage(_parentScene, 0x1022, 1000); @@ -1228,29 +1199,29 @@ void AsScene1307Key::stMoveKey() { if (newX == _x && newY == _y) { stInsertKey(); } else { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; _pointIndex = 0; _frameIndex = 0; _deltaX = newX - _x; _deltaY = newY - _y; - SetSpriteUpdate(&AsScene1307Key::suMoveKey); startAnimation(fileHashes[0], 0, -1); + SetSpriteUpdate(&AsScene1307Key::suMoveKey); } } void AsScene1307Key::stUnlock() { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; startAnimation(fileHashes[1], 0, -1); _newStickFrameIndex = STICK_LAST_FRAME; } void AsScene1307Key::stInsert() { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_index]; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; startAnimation(fileHashes[2], 0, -1); _newStickFrameIndex = STICK_LAST_FRAME; } -Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { @@ -1279,13 +1250,10 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x00A3621C, 800); _clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480); - tempSprite = insertStaticSprite(0x00A3641C, 600); _clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480); - tempSprite = insertStaticSprite(0x00A3681C, 400); _clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480); - tempSprite = insertStaticSprite(0x00A3701C, 200); _clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480); @@ -1304,11 +1272,10 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1307::update() { Scene::update(); - if (_countdown && (--_countdown == 0)) { + if (_countdown && (--_countdown == 0)) _doLeaveScene = true; - } else if (_countdown == 20) { + else if (_countdown == 20) _palette->startFadeToWhite(40); - } if (_doLeaveScene && !isSoundPlaying(0)) { leaveScene(1); setGlobalVar(V_KEYDOOR_UNLOCKED, 1); @@ -1348,9 +1315,8 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit } } } - } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) { + } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) leaveScene(0); - } } break; case 0x2002: @@ -1386,30 +1352,20 @@ uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entit } static const uint32 kScene1308NumberFileHashes[] = { - 0x08006320, - 0x10006320, - 0x20006320, - 0x40006320, - 0x80006320, - 0x00006321, - 0x00006322, - 0x00006324, - 0x00006328, - 0x08306320, - 0x10306320, - 0x20306320, - 0x40306320, - 0x80306320, - 0x00306321, + 0x08006320, 0x10006320, 0x20006320, + 0x40006320, 0x80006320, 0x00006321, + 0x00006322, 0x00006324, 0x00006328, + 0x08306320, 0x10306320, 0x20306320, + 0x40306320, 0x80306320, 0x00306321, 0x00306322 }; AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) { - SetMessageHandler(&AsScene1308JaggyDoor::handleMessage); setVisible(false); stopAnimation(); + SetMessageHandler(&AsScene1308JaggyDoor::handleMessage); } uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1431,8 +1387,8 @@ uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam &p void AsScene1308JaggyDoor::stOpenDoor() { startAnimation(0xBA0AE050, 0, -1); setVisible(true); - NextState(&AsScene1308JaggyDoor::stOpenDoorDone); playSound(0, calcHash("fxDoorOpen38")); + NextState(&AsScene1308JaggyDoor::stOpenDoorDone); } void AsScene1308JaggyDoor::stOpenDoorDone() { @@ -1445,8 +1401,8 @@ void AsScene1308JaggyDoor::stCloseDoor() { startAnimation(0xBA0AE050, -1, -1); _playBackwards = true; setVisible(true); - NextState(&AsScene1308JaggyDoor::stCloseDoorDone); playSound(0, calcHash("fxDoorClose38")); + NextState(&AsScene1308JaggyDoor::stCloseDoorDone); } void AsScene1308JaggyDoor::stCloseDoorDone() { @@ -1457,9 +1413,9 @@ void AsScene1308JaggyDoor::stCloseDoorDone() { AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) { + playSound(0, 0x51456049); SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage); NextState(&AsScene1308KeyboardDoor::stFallingKeys); - playSound(0, 0x51456049); } uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1474,9 +1430,9 @@ uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam void AsScene1308KeyboardDoor::stFallingKeys() { startAnimation(0x6238B191, 0, -1); - NextState(&AsScene1308KeyboardDoor::stFallingKeysDone); _x = 580; _y = 383; + NextState(&AsScene1308KeyboardDoor::stFallingKeysDone); } void AsScene1308KeyboardDoor::stFallingKeysDone() { @@ -1488,10 +1444,10 @@ void AsScene1308KeyboardDoor::stFallingKeysDone() { AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) { - SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage); setVisible(false); stopAnimation(); Entity::_priority = 1200; + SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage); } uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1539,32 +1495,31 @@ SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int i AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm) : AnimatedSprite(vm, 1100) { - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1308Mouse::handleMessage); _x = 286; _y = 429; createSurface1(0xA282C472, 100); startAnimation(0xA282C472, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1308Mouse::handleMessage); } uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x66382026) { + if (param.asInteger() == 0x66382026) playSound(0, 0x0CD84468); - } else if (param.asInteger() == 0x6E28061C) { + else if (param.asInteger() == 0x6E28061C) playSound(0, 0x78C8402C); - } else if (param.asInteger() == 0x462F0410) { + else if (param.asInteger() == 0x462F0410) playSound(0, 0x60984E28); - } break; } return messageResult; } Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag1(false) { + : Scene(vm, parentModule, true), _isProjecting(false), _asProjector(NULL) { _vm->gameModule()->initKeySlotsPuzzle(); @@ -1585,16 +1540,15 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x0A042060, 1100); _asJaggyDoor = insertSprite(this); _asLightWallSymbols = insertSprite(this); - _ssNumber1 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0); _ssNumber2 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1); _ssNumber3 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2); - _sprite2 = insertStaticSprite(0x40043120, 995); _sprite3 = insertStaticSprite(0x43003100, 995); _sprite4 = NULL; if (which < 0) { + // Restoring game insertKlayman(380, 440); setMessageList(0x004B57C0); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { @@ -1605,6 +1559,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 440); setMessageList(0x004B57C8); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { @@ -1615,6 +1570,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else if (which == 2) { + // Klaymen returning from keyslots panel insertKlayman(475, 440); setMessageList(0x004B58B0); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { @@ -1626,6 +1582,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5980); } } else { + // Klaymen entering from the left insertKlayman(41, 440); setMessageList(0x004B57D0); sendMessage(_asJaggyDoor, 0x4808, 0); @@ -1639,19 +1596,16 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } } - if (_sprite4) { + if (_sprite4) _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480); - } else { + else _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - } if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); _vm->_collisionMan->addSprite(_asProjector); _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _asProjector->setRepl(64, 0); - } else { - _asProjector = NULL; } } @@ -1662,15 +1616,14 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x88C11390) { setRectList(0x004B59A0); - _flag1 = true; + _isProjecting = true; } else if (param.asInteger() == 0x08821382) { sendEntityMessage(_klayman, 0x1014, _asProjector); - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) setRectList(0x004B5990); - } else { + else setRectList(0x004B5980); - } - _flag1 = false; + _isProjecting = false; } else if (param.asInteger() == 0x4AC68808) { clearRectList(); sendMessage(_asJaggyDoor, 0x4809, 0); @@ -1687,11 +1640,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) setRectList(0x004B5990); - } else { + else setRectList(0x004B5980); - } setMessageList(0x004B57E8, false); _sprite1->setVisible(true); _klayman->setVisible(true); @@ -1719,23 +1671,22 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asProjector) { - if (_flag1) { + if (_isProjecting) setMessageList2(0x004B5868); - } else { + else { if (param.asInteger() == 1) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B5848); } else if (sendMessage(_asProjector, 0x480C, _klayman->getX() <= _asProjector->getX() ? 0 : 1) != 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B5830); - } else { + } else setMessageList2(0x004B5800); - } } } else if (sender == _asTape) { - if (_flag1) { + if (_isProjecting) setMessageList2(0x004B5868); - } else if (_messageListStatus != 2) { + else if (_messageListStatus != 2) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList2(0x004B58E0); } @@ -1745,7 +1696,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true) { SetMessageHandler(&Scene1317::handleMessage); @@ -1817,16 +1768,6 @@ uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam ¶m, Entity return messageResult; } -uint32 Scene1317::hmNoDecisionYet(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - stChooseKing(); - break; - } - return messageResult; -} - uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -1837,16 +1778,6 @@ uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam ¶m, Enti return messageResult; } -uint32 Scene1317::hmKlaymanAsKing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - leaveScene(0); - break; - } - return messageResult; -} - uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -1859,45 +1790,45 @@ uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity * void Scene1317::stChooseKing() { showMouse(true); - SetMessageHandler(&Scene1317::hmChooseKing); - SetUpdateHandler(&Scene1317::upChooseKing); _smackerFileHash = 0x10982841; _keepLastSmackerFrame = true; _decisionCountdown = 450; _klaymanBlinks = false; _klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; + SetMessageHandler(&Scene1317::hmChooseKing); + SetUpdateHandler(&Scene1317::upChooseKing); } void Scene1317::stNoDecisionYet() { showMouse(false); - SetMessageHandler(&Scene1317::hmNoDecisionYet); - SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x20982841; _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::handleMessage); + SetUpdateHandler(&Scene1317::update); } void Scene1317::stHoborgAsKing() { showMouse(false); - SetMessageHandler(&Scene1317::hmHoborgAsKing); - SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x40982841; _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::hmHoborgAsKing); + SetUpdateHandler(&Scene1317::update); } void Scene1317::stKlaymanAsKing() { showMouse(false); - SetMessageHandler(&Scene1317::hmKlaymanAsKing); - SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x80982841; _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::hmEndMovie); + SetUpdateHandler(&Scene1317::update); } void Scene1317::stEndMovie() { showMouse(false); - SetMessageHandler(&Scene1317::hmEndMovie); - SetUpdateHandler(&Scene1317::update); _smackerFileHash = 0x40800711; _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::hmEndMovie); + SetUpdateHandler(&Scene1317::update); } } // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index e01daf1f15..ebbd03184e 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -37,6 +37,7 @@ public: Module1300(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1300(); protected: + int _sceneNum; uint32 _musicFileHash; void createScene(int sceneNum, int which); void updateScene(); @@ -95,7 +96,7 @@ protected: class Scene1303 : public Scene { public: - Scene1303(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1303(NeverhoodEngine *vm, Module *parentModule); protected: Sprite *_sprite1; Sprite *_asBalloon; @@ -162,13 +163,13 @@ protected: class AsScene1307Key : public AnimatedSprite { public: - AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint index, NRect *clipRects); + AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects); protected: Scene *_parentScene; NPointArray *_pointList; uint _pointIndex; int _frameIndex; - uint _index; + uint _keyIndex; NRect *_clipRects; bool _isClickable; int16 _prevX, _prevY; @@ -186,7 +187,7 @@ protected: class Scene1307 : public Scene { public: - Scene1307(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1307(NeverhoodEngine *vm, Module *parentModule); protected: NPointArray *_keyHolePoints; NRect _keyHoleRects[16]; @@ -262,13 +263,13 @@ protected: Sprite *_sprite3; Sprite *_sprite4; Sprite *_sprite5; - bool _flag1; + bool _isProjecting; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; class Scene1317 : public Scene { public: - Scene1317(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1317(NeverhoodEngine *vm, Module *parentModule); protected: SmackerPlayer *_smackerPlayer; bool _klaymanBlinks; @@ -280,9 +281,7 @@ protected: void upChooseKing(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmNoDecisionYet(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmKlaymanAsKing(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender); void stChooseKing(); void stNoDecisionYet(); -- cgit v1.2.3 From af37a2200e01e0ac40a7eb4646dbc8a1a82b6b1b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 11:38:49 +0000 Subject: NEVERHOOD: Clean up Module1400 (like the ones before) --- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/module1400.cpp | 384 ++++++++++++++++++--------------------- engines/neverhood/module1400.h | 15 +- 3 files changed, 185 insertions(+), 220 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 0eeee2ee03..732cff7d93 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -317,9 +317,9 @@ void GameModule::startup() { //DEBUG<<< */ - _vm->gameState().which = 5; - _vm->gameState().sceneNum = 6; - createModule(1300, -1); + _vm->gameState().which = 2; + _vm->gameState().sceneNum = 3; + createModule(1400, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 0693417f22..249494179e 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -35,11 +35,10 @@ Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addMusic(0x00AD0012, 0x06333232); _vm->_soundMan->addMusic(0x00AD0012, 0x624A220E); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else { + else createScene(0, 0); - } } @@ -49,37 +48,44 @@ Module1400::~Module1400() { void Module1400::createScene(int sceneNum, int which) { debug("Module1400::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _vm->_soundMan->startMusic(0x06333232, 0, 2); _childObject = new Scene1401(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; _vm->_soundMan->stopMusic(0x06333232, 0, 2); _vm->_soundMan->stopMusic(0x624A220E, 0, 2); _childObject = new Scene1402(_vm, this, which); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->stopMusic(0x06333232, 0, 2); _vm->_soundMan->startMusic(0x624A220E, 0, 2); _childObject = new Scene1403(_vm, this, which); break; case 3: + _vm->gameState().sceneNum = 3; _vm->_soundMan->startMusic(0x06333232, 0, 2); _childObject = new Scene1404(_vm, this, which); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->startMusic(0x06333232, 0, 2); - _childObject = new Scene1405(_vm, this, which); + _childObject = new Scene1405(_vm, this); break; case 5: + _vm->gameState().sceneNum = 5; _vm->_soundMan->stopMusic(0x06333232, 0, 2); _childObject = new DiskplayerScene(_vm, this, 2); break; case 6: + _vm->gameState().sceneNum = 6; _vm->_soundMan->stopMusic(0x06333232, 0, 2); - _childObject = new Scene1407(_vm, this, which); + _childObject = new Scene1407(_vm, this); break; } SetUpdateHandler(&Module1400::updateScene); @@ -88,36 +94,33 @@ void Module1400::createScene(int sceneNum, int which) { void Module1400::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(1, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(3, 0); - } else { + else leaveModule(0); - } break; case 1: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(2, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(6, -1); - } else { + else createScene(0, 1); - } break; case 2: createScene(1, 1); break; case 3: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(4, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(5, -1); - } else { + else createScene(0, 2); - } break; case 4: createScene(3, 1); @@ -140,9 +143,9 @@ AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm) createSurface(900, 152, 147); _x = 454; _y = 217; - SetMessageHandler(&AsScene1401Pipe::handleMessage); - SetUpdateHandler(&AsScene1401Pipe::update); startAnimation(0x4C210500, 0, -1); + SetUpdateHandler(&AsScene1401Pipe::update); + SetMessageHandler(&AsScene1401Pipe::handleMessage); } AsScene1401Pipe::~AsScene1401Pipe() { @@ -151,9 +154,8 @@ AsScene1401Pipe::~AsScene1401Pipe() { void AsScene1401Pipe::update() { AnimatedSprite::update(); - if (_countdown1 != 0 && (--_countdown1 == 0)) { + if (_countdown1 != 0 && (--_countdown1 == 0)) stDoneSucking(); - } if (_countdown2 != 0 && (--_countdown2 == 0)) { _vm->_soundMan->addSound(0x01104C08, 0x4A116437); _vm->_soundMan->playSoundLooping(0x4A116437); @@ -162,18 +164,16 @@ void AsScene1401Pipe::update() { void AsScene1401Pipe::upSuckInProjector() { AnimatedSprite::update(); - if (_countdown1 != 0) { + if (_countdown1 != 0) _countdown1--; - } } uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x0A8A1490) { + if (param.asInteger() == 0x0A8A1490) playSound(1, 0x6AB6666F); - } break; case 0x2000: _countdown1 = 70; @@ -191,11 +191,10 @@ uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam &pa uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x3002: - if (_countdown1 != 0) { + if (_countdown1 != 0) stStartSucking(); - } else { + else stDoneSucking(); - } SetMessageHandler(&AsScene1401Pipe::handleMessage); SetUpdateHandler(&AsScene1401Pipe::update); break; @@ -216,8 +215,8 @@ void AsScene1401Pipe::stDoneSucking() { void AsScene1401Pipe::stSuckInProjector() { startAnimation(0x6C210810, 0, -1); - SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector); SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector); + SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector); } AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) @@ -226,22 +225,21 @@ AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) createSurface(100, 71, 41); _x = 478; _y = 433; + startAnimation(0xA282C472, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1401Mouse::handleMessage); - startAnimation(0xA282C472, 0, -1); } uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x66382026) { + if (param.asInteger() == 0x66382026) playSound(0, 0x0CD84468); - } else if (param.asInteger() == 0x6E28061C) { + else if (param.asInteger() == 0x6E28061C) playSound(0, 0x78C8402C); - } else if (param.asInteger() == 0x462F0410) { + else if (param.asInteger() == 0x462F0410) playSound(0, 0x60984E28); - } break; case 0x4839: stSuckedIn(); @@ -255,9 +253,9 @@ void AsScene1401Mouse::suSuckedIn() { if (_collisionBounds.y1 <= 150) { playSound(0, 0x0E32247F); stopAnimation(); - SetSpriteUpdate(NULL); - SetMessageHandler(NULL); setVisible(false); + SetMessageHandler(NULL); + SetSpriteUpdate(NULL); } } @@ -272,9 +270,9 @@ AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm) createSurface(200, 152, 147); _x = 427; _y = 433; + startAnimation(0x461A1490, 0, -1); SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene1401Cheese::handleMessage); - startAnimation(0x461A1490, 0, -1); } uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -292,9 +290,9 @@ void AsScene1401Cheese::suSuckedIn() { if (_collisionBounds.y1 <= 150) { playSound(0, 0x18020439); stopAnimation(); - SetSpriteUpdate(NULL); - SetMessageHandler(NULL); setVisible(false); + SetMessageHandler(NULL); + SetSpriteUpdate(NULL); } } @@ -304,29 +302,26 @@ void AsScene1401Cheese::stSuckedIn() { } AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen) - : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { + : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0), _isOpen(isOpen) { _x = 320; _y = 240; createSurface1(0x04551900, 100); - SetUpdateHandler(&AsScene1401BackDoor::update); - SetMessageHandler(&AsScene1401BackDoor::handleMessage); - _newStickFrameIndex = STICK_LAST_FRAME; if (isOpen) { - _isOpen = true; - startAnimation(0x04551900, -1,- 1); + startAnimation(0x04551900, -1, -1); _countdown = 48; } else { - _isOpen = false; stopAnimation(); setVisible(false); } + _newStickFrameIndex = STICK_LAST_FRAME; + SetUpdateHandler(&AsScene1401BackDoor::update); + SetMessageHandler(&AsScene1401BackDoor::handleMessage); } void AsScene1401BackDoor::update() { - if (_countdown != 0 && (--_countdown == 0)) { + if (_countdown != 0 && (--_countdown == 0)) stCloseDoor(); - } AnimatedSprite::update(); } @@ -411,29 +406,25 @@ uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶ break; case 0x4807: setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108); - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) { + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) stStartLockedInSlot(); - } else { + else stIdle(); - } break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) { + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) incGlobalVar(V_PROJECTOR_SLOT, 1); - } - } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) { + } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) incGlobalVar(V_PROJECTOR_SLOT, -1); - } stMoving(); break; case 0x480C: // Check if the projector can be moved - if (param.asInteger() != 1) { + if (param.asInteger() != 1) messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; - } else { + else messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; - } break; case 0x482A: sendMessage(_parentScene, 0x1022, 990); @@ -455,9 +446,8 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 && param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) { sendMessage(_parentScene, 0x4826, 1); - } else { + } else sendMessage(_parentScene, 0x4826, 0); - } messageResult = 1; break; case 0x4807: @@ -466,21 +456,18 @@ uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam &par break; case 0x480B: if (param.asInteger() != 1) { - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) { + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) incGlobalVar(V_PROJECTOR_SLOT, 1); - } - } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) { + } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) incGlobalVar(V_PROJECTOR_SLOT, -1); - } stTurnToFront(); break; case 0x480C: // Check if the projector can be moved - if (param.asInteger() != 1) { + if (param.asInteger() != 1) messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; - } else { + else messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; - } break; case 0x480F: stStartProjecting(); @@ -547,9 +534,9 @@ void AsCommonProjector::moveProjector() { } } - if (_lockedInSlot && !nowLockedInSlot) { + if (_lockedInSlot && !nowLockedInSlot) _lockedInSlot = false; - } else if (!_lockedInSlot && nowLockedInSlot) { + else if (!_lockedInSlot && nowLockedInSlot) { playSound(1, 0x5440E474); _lockedInSlot = true; } @@ -561,82 +548,82 @@ void AsCommonProjector::stSuckedIn() { if (_collisionBounds.y1 <= 150) { sendMessage(_asPipe, 0x483A, 0); stopAnimation(); + setVisible(false); SetMessageHandler(&Sprite::handleMessage); SetSpriteUpdate(NULL); - setVisible(false); } } void AsCommonProjector::stIdle() { - SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::handleMessage); startAnimation(0x10E3042B, 0, -1); + SetMessageHandler(&AsCommonProjector::handleMessage); + SetSpriteUpdate(NULL); } void AsCommonProjector::stMoving() { _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; startAnimation(0x14A10137, 0, -1); - SetSpriteUpdate(&AsCommonProjector::suMoving); - SetMessageHandler(&AsCommonProjector::handleMessage); playSound(1, 0xEC008474); + SetMessageHandler(&AsCommonProjector::handleMessage); + SetSpriteUpdate(&AsCommonProjector::suMoving); } void AsCommonProjector::stStartLockedInSlot() { - SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::hmAnimation); startAnimation(0x80C32213, 0, -1); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(NULL); NextState(&AsCommonProjector::stStayLockedInSlot); } void AsCommonProjector::stStayLockedInSlot() { - SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::hmLockedInSlot); startAnimation(0xD23B207F, 0, -1); + SetMessageHandler(&AsCommonProjector::hmLockedInSlot); + SetSpriteUpdate(NULL); } void AsCommonProjector::stStartProjecting() { startAnimation(0x50A80517, 0, -1); - SetMessageHandler(&AsCommonProjector::hmAnimation); - SetSpriteUpdate(NULL); - NextState(&AsCommonProjector::stLockedInSlot); setGlobalVar(V_PROJECTOR_ACTIVE, 1); playSound(0, 0xCC4A8456); _vm->_soundMan->addSound(0x05331081, 0xCE428854); _vm->_soundMan->playSoundLooping(0xCE428854); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(NULL); + NextState(&AsCommonProjector::stLockedInSlot); } void AsCommonProjector::stLockedInSlot() { sendMessage(_parentScene, 0x480F, 0); startAnimation(0xD833207F, 0, -1); - SetSpriteUpdate(NULL); SetMessageHandler(&AsCommonProjector::hmLockedInSlot); + SetSpriteUpdate(NULL); } void AsCommonProjector::stStopProjecting() { startAnimation(0x50A94417, 0, -1); - SetSpriteUpdate(NULL); - SetMessageHandler(&AsCommonProjector::hmAnimation); - NextState(&AsCommonProjector::stStayLockedInSlot); setGlobalVar(V_PROJECTOR_ACTIVE, 0); playSound(0, 0xCC4A8456); _vm->_soundMan->deleteSound(0xCE428854); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(NULL); + NextState(&AsCommonProjector::stStayLockedInSlot); } void AsCommonProjector::stTurnToFront() { _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; startAnimation(0x22CB4A33, 0, -1); - SetSpriteUpdate(&AsCommonProjector::suMoving); SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(&AsCommonProjector::suMoving); NextState(&AsCommonProjector::stMoving); } void AsCommonProjector::stStartSuckedIn() { setGlobalVar(V_PROJECTOR_LOCATION, 4); setGlobalVar(V_PROJECTOR_SLOT, 0); - SetSpriteUpdate(&AsCommonProjector::stSuckedIn); - SetMessageHandler(&Sprite::handleMessage); startAnimation(0x708D4712, 0, -1); playSound(2); + SetMessageHandler(&Sprite::handleMessage); + SetSpriteUpdate(&AsCommonProjector::stSuckedIn); } Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) @@ -646,8 +633,8 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1401::handleMessage); SetUpdateHandler(&Scene1401::update); - setRectList(0x004B6758); + setRectList(0x004B6758); setBackground(0x08221FA5); setPalette(0x08221FA5); insertMouse433(0x21FA108A); @@ -668,18 +655,22 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2->setVisible(false); if (which < 0) { + // Restoring game insertKlayman(380, 447); setMessageList(0x004B65C8); _sprite1->setVisible(false); } else if (which == 1) { + // Klaymen entering from the left insertKlayman(0, 447); setMessageList(0x004B65D0); _sprite1->setVisible(false); } else if (which == 2) { + // Klaymen entering from the right insertKlayman(660, 447); setMessageList(0x004B65D8); _sprite1->setVisible(false); } else { + // Klaymen entering from the back insertKlayman(290, 413); setMessageList(0x004B65E8); _sprite1->setVisible(false); @@ -704,11 +695,10 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); - if (which == 0 && _asProjector) { + if (which == 0 && _asProjector) sendMessage(_asProjector, 0x482B, 0); - } - _asBackDoor = insertSprite(_klayman, which == 1); + _asBackDoor = insertSprite(_klayman, which == 0); } @@ -717,33 +707,30 @@ void Scene1401::update() { if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) { _sprite2->setVisible(true); _projectorBorderFlag = true; - } else { + } else _sprite2->setVisible(false); - } } uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x02144CB1) { + if (param.asInteger() == 0x02144CB1) sendEntityMessage(_klayman, 0x1014, _ssFloorButton); - } else if (param.asInteger() == 0x402064D8) { + else if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssButton); - } else if (param.asInteger() == 0x01C66840) { - if (sendMessage(_asBackDoor, 0x2001, 0) != 0) { + else if (param.asInteger() == 0x01C66840) { + if (sendMessage(_asBackDoor, 0x2001, 0) != 0) setMessageList(0x004B6690); - } else { + else setMessageList(0x004B66B0); - } } break; case 0x1019: - if (param.asInteger() != 0) { + if (param.asInteger() != 0) leaveScene(2); - } else { + else leaveScene(1); - } break; case 0x480B: if (sender == _ssFloorButton) { @@ -755,31 +742,27 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit } if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) sendMessage(_asProjector , 0x4839, 0); - } else if (sender == _ssButton) { + } else if (sender == _ssButton) sendMessage(_ssButton, 0x4808, 0); - } break; case 0x4826: if (sender == _asProjector) { if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B6658); - } else { + } else setMessageList2(0x004B65F0); - } } break; case 0x482A: _sprite1->setVisible(true); - if (_asProjector) { + if (_asProjector) sendMessage(_asProjector, 0x482B, 0); - } break; case 0x482B: _sprite1->setVisible(false); - if (_asProjector) { + if (_asProjector) sendMessage(_asProjector, 0x482A, 0); - } break; } return 0; @@ -792,10 +775,9 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas SetFilterY(&Sprite::defFilterY); SetUpdateHandler(&StaticSprite::updatePosition); - } -AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which) +AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { createSurface(900, 152, 147); @@ -805,20 +787,20 @@ AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentSce SetMessageHandler(&AsScene1402PuzzleBox::handleMessage); _x = 279; _y = 270; - if (which == 2) { + if (status == 2) { // Puzzle box after the puzzle was solved startAnimation(0x20060259, 0, -1); - NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone); playSound(0, 0x419014AC); loadSound(1, 0x61901C29); - } else if (which == 1) { + NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone); + } else if (status == 1) { // Puzzle box appears startAnimation(0x210A0213, 0, -1); - NextState(&AsScene1402PuzzleBox::stMoveUpDone); playSound(0, 0x41809C6C); + NextState(&AsScene1402PuzzleBox::stMoveUpDone); } else { // Puzzle box is here - startAnimation(0x20060259, 0, -1); + startAnimation(0x20060259, -1, -1); loadSound(1, 0x61901C29); _newStickFrameIndex = STICK_LAST_FRAME; } @@ -879,15 +861,17 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B0C98); if (which < 0) { + // Restoring game insertKlayman(377, 391); setMessageList(0x004B0B48); - if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { + if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) _asPuzzleBox = insertSprite(this, 0); - } } else if (which == 1) { + // Klaymen entering from the left insertKlayman(42, 391); setMessageList(0x004B0B50); } else if (which == 2) { + // Klaymen returning from the puzzle box insertKlayman(377, 391); setMessageList(0x004B0B60); _klayman->setDoDeltaX(1); @@ -896,10 +880,10 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) clearRectList(); showMouse(false); startShaking(); - } else { + } else _asPuzzleBox = insertSprite(this, 0); - } } else { + // Klaymen entering from the right insertKlayman(513, 391); setMessageList(0x004B0B58); if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { @@ -952,9 +936,9 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x00F43389) { - if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) leaveScene(0); - } else { + else { clearRectList(); _klayman->setVisible(false); showMouse(false); @@ -964,11 +948,10 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x1019: - if (param.asInteger()) { + if (param.asInteger()) leaveScene(0); - } else { + else leaveScene(1); - } break; case 0x2000: stopShaking(); @@ -987,9 +970,8 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sendMessage(_asProjector, 0x408C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B0BB8); - } else { + } else setMessageList2(0x004B0B68); - } } } return 0; @@ -1100,11 +1082,10 @@ AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) { createSurface(100, 117, 45); - - SetUpdateHandler(&AnimatedSprite::update); _x = 108; _y = 106; stIdleLookAtGoodHole(); + SetUpdateHandler(&AnimatedSprite::update); } void AsScene1407Mouse::suWalkTo() { @@ -1114,9 +1095,9 @@ void AsScene1407Mouse::suWalkTo() { else if (xdelta < -_deltaX) xdelta = -_deltaX; _deltaX = 0; - if (_walkDestX == _x) { + if (_walkDestX == _x) sendMessage(this, 0x1019, 0); - } else { + else { _x += xdelta; updateBounds(); } @@ -1149,13 +1130,12 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m _walkDestX = kScene1407MouseHoles[holeIndex].x; stWalkToHole(); } else { - if (mouseX < kScene1407MouseSections[_currSectionIndex].x1) { + if (mouseX < kScene1407MouseSections[_currSectionIndex].x1) _walkDestX = kScene1407MouseSections[_currSectionIndex].x1; - } else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2) { + else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2) _walkDestX = kScene1407MouseSections[_currSectionIndex].x2; - } else { + else _walkDestX = mouseX; - } stWalkToDest(); } } @@ -1169,14 +1149,12 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m // Find the nearest hole and go through it, and exit at the first hole int16 distance = 640; int matchIndex = 50; - for (int index = 0; index < 50; index++) { - if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex) { - if (ABS(kScene1407MouseHoles[index].x - _x) < distance) { - matchIndex = index; - distance = ABS(kScene1407MouseHoles[index].x - _x); - } + for (int index = 0; index < 50; index++) + if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex && + ABS(kScene1407MouseHoles[index].x - _x) < distance) { + matchIndex = index; + distance = ABS(kScene1407MouseHoles[index].x - _x); } - } if (matchIndex < 50) { _nextHoleIndex = 0; _walkDestX = kScene1407MouseHoles[matchIndex].x; @@ -1191,16 +1169,16 @@ uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m void AsScene1407Mouse::stIdleLookAtGoodHole() { setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0); startAnimation(0x72215194, 0, -1); - SetSpriteUpdate(NULL); SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetSpriteUpdate(NULL); } void AsScene1407Mouse::stWalkToDest() { if (_walkDestX != _x) { setDoDeltaX(_walkDestX < _x ? 1 : 0); startAnimation(0x22291510, 0, -1); - SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); NextState(&AsScene1407Mouse::stIdleLookAtGoodHole); } } @@ -1208,19 +1186,19 @@ void AsScene1407Mouse::stWalkToDest() { void AsScene1407Mouse::stWalkToHole() { setDoDeltaX(_walkDestX < _x ? 1 : 0); startAnimation(0x22291510, 0, -1); - SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); NextState(&AsScene1407Mouse::stGoThroughHole); } void AsScene1407Mouse::stGoThroughHole() { startAnimation(0x72215194, 0, -1); - SetSpriteUpdate(NULL); - SetMessageHandler(NULL); - SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); - NextState(&AsScene1407Mouse::stArriveAtHole); setVisible(false); _countdown = 12; + SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); + SetMessageHandler(NULL); + SetSpriteUpdate(NULL); + NextState(&AsScene1407Mouse::stArriveAtHole); } void AsScene1407Mouse::stArriveAtHole() { @@ -1239,7 +1217,7 @@ void AsScene1407Mouse::stArriveAtHole() { } } -Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { SetMessageHandler(&Scene1407::handleMessage); @@ -1257,11 +1235,10 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1407::update() { Scene::update(); - if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) { + if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) leaveScene(1); - } else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) { + else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) _ssResetButton->setVisible(false); - } } uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1299,35 +1276,32 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1403 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asProjector(NULL), _flag(false) { + : Scene(vm, parentModule, true), _asProjector(NULL), _isProjecting(false) { SetMessageHandler(&Scene1403::handleMessage); setRectList(0x004B1FF8); - setBackground(0x2110A234); setPalette(0x2110A234); insertMouse433(0x0A230219); - _class401_1 = insertStaticSprite(0x01102A33, 100); - _class401_1->setVisible(false); - - _class401_2 = insertStaticSprite(0x04442520, 995); - - _class401_3 = insertStaticSprite(0x08742271, 995); - + _sprite1 = insertStaticSprite(0x01102A33, 100); + _sprite1->setVisible(false); + _sprite2 = insertStaticSprite(0x04442520, 995); + _sprite3 = insertStaticSprite(0x08742271, 995); _asTape1 = insertSprite(this, 12, 1100, 201, 468, 0x9148A011); _vm->_collisionMan->addSprite(_asTape1); _asTape1->setRepl(64, 0); - _asTape2 = insertSprite(this, 16, 1100, 498, 468, 0x9048A093); _vm->_collisionMan->addSprite(_asTape2); _asTape2->setRepl(64, 0); if (which < 0) { + // Restoring game insertKlayman(380, 463); setMessageList(0x004B1F18); } else { + // Klaymen entering from the right insertKlayman(640, 463); setMessageList(0x004B1F20); } @@ -1342,7 +1316,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->updateBounds(); setMessageList(0x004B1F70); } - _asProjector->setClipRect(0, 0, 640, _class401_2->getDrawRect().y2()); + _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _asProjector->setRepl(64, 0); } @@ -1354,11 +1328,11 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x100D: if (param.asInteger() == 0x88C11390) { setRectList(0x004B2008); - _flag = true; + _isProjecting = true; } else if (param.asInteger() == 0x08821382) { sendEntityMessage(_klayman, 0x1014, _asProjector); setRectList(0x004B1FF8); - _flag = false; + _isProjecting = false; } break; case 0x1019: @@ -1366,36 +1340,34 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x1022: if (sender == _asProjector) { - if (param.asInteger() >= 1000) { - setSurfacePriority(_class401_3->getSurface(), 1100); - } else { - setSurfacePriority(_class401_3->getSurface(), 995); - } + if (param.asInteger() >= 1000) + setSurfacePriority(_sprite3->getSurface(), 1100); + else + setSurfacePriority(_sprite3->getSurface(), 995); } break; case 0x4807: - _class401_1->setVisible(false); + _sprite1->setVisible(false); break; case 0x480F: - _class401_1->setVisible(true); + _sprite1->setVisible(true); break; case 0x4826: if (sender == _asProjector) { - if (_flag) { + if (_isProjecting) setMessageList2(0x004B1FA8); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B1F88); } else if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B1F58); - } else { + } else setMessageList2(0x004B1F28); - } } else if (sender == _asTape1 || sender == _asTape2) { - if (_flag) { + if (_isProjecting) setMessageList2(0x004B1FA8); - } else if (_messageListStatus != 2) { + else if (_messageListStatus != 2) { sendEntityMessage(_klayman, 0x1014, sender); setMessageList2(0x004B1FB8); } @@ -1416,7 +1388,6 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1404::handleMessage); setRectList(0x004B8D80); - setBackground(0xAC0B006F); setPalette(0xAC0B006F); _palette->addPalette(0x00801510, 0, 65, 0); @@ -1428,17 +1399,19 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) } _sprite1 = insertStaticSprite(0x1900A1F8, 1100); - _asTape = insertSprite(this, 14, 1100, 281, 411, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); if (which < 0) { + // Restoring game insertKlayman(376, 406); setMessageList(0x004B8C28); } else if (which == 1) { + // Klaymen returning from the tiles puzzle insertKlayman(376, 406); setMessageList(0x004B8C30); } else if (which == 2) { + // Klaymen returning from the diskplayer if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(347, 406); _klayman->setDoDeltaX(1); @@ -1447,6 +1420,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) } setMessageList(0x004B8D28); } else { + // Klaymen entering from the left insertKlayman(30, 406); setMessageList(0x004B8C38); } @@ -1476,11 +1450,10 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x410650C2) { - if (_asProjector && _asProjector->getX() == 220) { + if (_asProjector && _asProjector->getX() == 220) setMessageList(0x004B8C40); - } else { + else setMessageList(0x004B8CE8); - } } break; case 0x1019: @@ -1491,9 +1464,8 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); setMessageList2(0x004B8CA0); - } else { + } else setMessageList2(0x004B8C40); - } } else if (sender == _asTape && _messageListStatus != 2) { sendEntityMessage(_klayman, 0x1014, _asTape); setMessageList(0x004B8CD0); @@ -1534,21 +1506,17 @@ AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, ui setVisible(false); if (getSubVar(VA_IS_TILE_MATCH, _tileIndex)) _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; - SetUpdateHandler(&AsScene1405Tile::update); - SetMessageHandler(&AsScene1405Tile::handleMessage); - - debug("getSubVar(VA_TILE_SYMBOLS, _tileIndex) = %d", getSubVar(VA_TILE_SYMBOLS, _tileIndex)); - startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1); _newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex); + SetUpdateHandler(&AsScene1405Tile::update); + SetMessageHandler(&AsScene1405Tile::handleMessage); } void AsScene1405Tile::update() { updateAnim(); updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) { + if (_countdown != 0 && (--_countdown == 0)) show(); - } } uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1581,11 +1549,14 @@ void AsScene1405Tile::hide() { } } -Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { _vm->gameModule()->initMemoryPuzzle(); + SetUpdateHandler(&Scene1405::update); + SetMessageHandler(&Scene1405::handleMessage); + setBackground(0x0C0C007D); setPalette(0x0C0C007D); insertMouse435(0xC00790C8, 20, 620); @@ -1596,12 +1567,8 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule, int which) if (getSubVar(VA_IS_TILE_MATCH, tileIndex)) _tilesLeft--; } - - loadSound(0, 0x68E25540); - - SetMessageHandler(&Scene1405::handleMessage); - SetUpdateHandler(&Scene1405::update); + loadSound(0, 0x68E25540); } void Scene1405::update() { @@ -1623,9 +1590,8 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); - } break; case 0x2000: if (_selectFirstTile) { @@ -1639,12 +1605,10 @@ uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entit setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1); setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1); _tilesLeft -= 2; - if (_tilesLeft == 0) { + if (_tilesLeft == 0) playSound(0); - } - } else { + } else _countdown = 10; - } } } break; diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index 8f5a4c9a63..ada3c66009 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -35,6 +35,7 @@ public: Module1400(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1400(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; @@ -154,7 +155,7 @@ public: class AsScene1402PuzzleBox : public AnimatedSprite { public: - AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int which); + AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status); protected: Scene *_parentScene; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -202,7 +203,7 @@ protected: class Scene1407 : public Scene { public: - Scene1407(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1407(NeverhoodEngine *vm, Module *parentModule); protected: Sprite *_asMouse; Sprite *_ssResetButton; @@ -218,13 +219,13 @@ class Scene1403 : public Scene { public: Scene1403(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_class401_1; - Sprite *_class401_2; - Sprite *_class401_3; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; AsScene1201Tape *_asTape1; AsScene1201Tape *_asTape2; AsCommonProjector *_asProjector; - bool _flag; + bool _isProjecting; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -262,7 +263,7 @@ protected: class Scene1405 : public Scene { public: - Scene1405(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1405(NeverhoodEngine *vm, Module *parentModule); int getCountdown() const { return _countdown; } protected: bool _selectFirstTile; -- cgit v1.2.3 From f51140490d971ffa4cbd2095489085573ae795e1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 11:52:12 +0000 Subject: NEVERHOOD: Clean up Module1500 (like the ones before) --- engines/neverhood/gamemodule.cpp | 4 ++-- engines/neverhood/module1500.cpp | 34 +++++++++++++++------------------- engines/neverhood/module1500.h | 6 +++--- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 732cff7d93..b9ad01ee57 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -319,7 +319,7 @@ void GameModule::startup() { _vm->gameState().which = 2; _vm->gameState().sceneNum = 3; - createModule(1400, -1); + createModule(1500, 0); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -411,7 +411,7 @@ void GameModule::createModule(int moduleNum, int which) { case 1500: _someFlag1 = false; setGlobalVar(V_MODULE_NAME, 0x00F10114); - _childObject = new Module1500(_vm, this, which, true); + _childObject = new Module1500(_vm, this, which); break; case 1600: setGlobalVar(V_MODULE_NAME, 0x01A008D8); diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 0b55209b9f..98c55bcc13 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -24,32 +24,35 @@ namespace Neverhood { -Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag) - : Module(vm, parentModule), _flag(flag) { +Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else { + else createScene(3, -1); - } } void Module1500::createScene(int sceneNum, int which) { debug("Module1500::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); break; case 1: + _vm->gameState().sceneNum = 1; _childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48); break; case 2: + _vm->gameState().sceneNum = 2; sendMessage(_parentModule, 0x0800, 0); createSmackerScene(0x001A0005, true, true, true); break; case 3: + _vm->gameState().sceneNum = 3; _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); break; } @@ -59,16 +62,12 @@ void Module1500::createScene(int sceneNum, int which) { void Module1500::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: createScene(1, -1); break; case 1: - if (_flag) { - createScene(2, -1); - } else { - leaveModule(0); - } + createScene(2, -1); break; case 3: createScene(0, -1); @@ -83,13 +82,12 @@ void Module1500::updateScene() { // Scene1501 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) - : Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _flag(false) { + : Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) { SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); setBackground(backgroundFileHash); - setPalette(); addEntity(_palette); _palette->addBasePalette(backgroundFileHash, 0, 256, 0); @@ -101,9 +99,7 @@ Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroun } void Scene1501::update() { - Scene::update(); - if (_countdown1 != 0) { _countdown1--; if (_countdown1 == 0) { @@ -118,7 +114,7 @@ void Scene1501::update() { if (_countdown3 != 0) _countdown3--; - if (_countdown3 == 0 && _flag && _countdown1 == 0) { + if (_countdown3 == 0 && _skip && _countdown1 == 0) { _countdown1 = 12; _palette->startFadeToBlack(11); } @@ -129,7 +125,7 @@ uint32 Scene1501::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0009: - _flag = true; + _skip = true; break; } return messageResult; diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h index c562a24615..c17cb4516c 100644 --- a/engines/neverhood/module1500.h +++ b/engines/neverhood/module1500.h @@ -34,9 +34,9 @@ namespace Neverhood { class Module1500 : public Module { public: - Module1500(NeverhoodEngine *vm, Module *parentModule, int which, bool flag); + Module1500(NeverhoodEngine *vm, Module *parentModule, int which); protected: - bool _flag; + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; @@ -48,7 +48,7 @@ protected: int _countdown1; int _countdown2; int _countdown3; - bool _flag; + bool _skip; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From e2b696b8918b50722a8804e2e3e9f16bfc3a643a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 12:46:41 +0000 Subject: NEVERHOOD: Clean up Module1600 (like the ones before) - Remove AsScene1608Door because the corresponding animation resource didn't exist! --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/module1600.cpp | 275 +++++++++++++++------------------------ engines/neverhood/module1600.h | 22 +--- 3 files changed, 115 insertions(+), 186 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index b9ad01ee57..77869fd729 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -318,8 +318,8 @@ void GameModule::startup() { */ _vm->gameState().which = 2; - _vm->gameState().sceneNum = 3; - createModule(1500, 0); + _vm->gameState().sceneNum = 7; + createModule(1600, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 09bb375a4e..c14e2b34ee 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -39,19 +39,18 @@ static const uint32 kModule1600SoundList[] = { Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 1) { + else if (which == 1) createScene(4, 1); - } else if (which == 2) { + else if (which == 2) createScene(5, 0); - } else if (which == 3) { + else if (which == 3) createScene(6, 1); - } else if (which == 4) { + else if (which == 4) createScene(1, 0); - } else { + else createScene(0, 0); - } _vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList); _vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150); @@ -65,43 +64,52 @@ Module1600::~Module1600() { void Module1600::createScene(int sceneNum, int which) { debug("Module1600::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; createNavigationScene(0x004B39D0, which); break; case 1: + _vm->gameState().sceneNum = 1; createNavigationScene(0x004B3A30, which); break; case 2: + _vm->gameState().sceneNum = 2; createNavigationScene(0x004B3A60, which); break; case 3: + _vm->gameState().sceneNum = 3; createNavigationScene(0x004B3A90, which); break; case 4: + _vm->gameState().sceneNum = 4; createNavigationScene(0x004B3B20, which); break; case 5: + _vm->gameState().sceneNum = 5; createNavigationScene(0x004B3B50, which); break; case 6: + _vm->gameState().sceneNum = 6; createNavigationScene(0x004B3B80, which); break; case 7: + _vm->gameState().sceneNum = 7; _childObject = new Scene1608(_vm, this, which); break; case 8: - _childObject = new Scene1609(_vm, this, which); + _vm->gameState().sceneNum = 8; + _childObject = new Scene1609(_vm, this); break; case 1001: - if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) { + _vm->gameState().sceneNum = 1; + if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) createSmackerScene(0x80050200, true, true, false); - } else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) { + else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) createSmackerScene(0x80090200, true, true, false); - } else { + else createSmackerScene(0x80000200, true, true, false); - } if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2) setGlobalVar(V_TALK_COUNTING_INDEX, 0); else @@ -114,7 +122,7 @@ void Module1600::createScene(int sceneNum, int which) { void Module1600::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (_moduleResult == 0) createScene(2, 0); @@ -182,10 +190,6 @@ void Module1600::updateScene() { AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : AnimatedSprite(vm, 1000), _parentScene(parentScene) { - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::handleMessage); - SetSpriteUpdate(NULL); - createSurface(200, 556, 328); _x = x; _y = y; @@ -211,12 +215,14 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 startAnimation(0xD4220027, 0, -1); setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::handleMessage); + SetSpriteUpdate(NULL); } AsCommonCar::~AsCommonCar() { - if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) { + if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X)); - } } void AsCommonCar::setPathPoints(NPointArray *pathPoints) { @@ -318,17 +324,15 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Ent minMatchIndex = i; } if (minMatchIndex == -1) { - if (_currPointIndex == 0) { + if (_currPointIndex == 0) moveToPrevPoint(); - } else { + else SetSpriteUpdate(NULL); - } } else { - if (minMatchIndex > _currPointIndex) { + if (minMatchIndex > _currPointIndex) moveToNextPoint(); - } else { + else moveToPrevPoint(); - } } } else { _hasAgainDestPoint = true; @@ -340,15 +344,15 @@ uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Ent _yMoveTotalSteps = param.asInteger(); _steps = 0; _isBraking = false; - SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); _lastDistance = 640; + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); break; case 0x2008: _yMoveTotalSteps = param.asInteger(); _steps = 0; _isBraking = false; - SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); _lastDistance = 640; + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); break; case 0x2009: stEnterCar(); @@ -407,15 +411,15 @@ void AsCommonCar::stCarAtHome() { _rectList = NULL; NextState(&AsCommonCar::stLeanForwardIdle); startAnimation(0x35698F78, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage); - SetUpdateHandler(&AsCommonCar::upIdle); - FinalizeState(&AsCommonCar::evIdleDone); setDoDeltaX(doDeltaX ? 1 : 0); _currMoveDirection = 0; _newMoveDirection = 0; _steps = 0; _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + SetUpdateHandler(&AsCommonCar::upIdle); + SetMessageHandler(&AsCommonCar::handleMessage); + FinalizeState(&AsCommonCar::evIdleDone); } void AsCommonCar::updateTurnMovement() { @@ -438,18 +442,18 @@ void AsCommonCar::updateMovement() { _isMoving = false; _isIdle = true; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); NextState(&AsCommonCar::stLeanForwardIdle); } else if (!_isBraking && _steps && _isIdle) { gotoNextState(); _isIdle = false; startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); NextState(&AsCommonCar::stUpdateMoveDirection); } else { - bool flag = false; + bool inRect = false; uint index = 0; if (_rectList && _rectList->size() > 0) { while (index < _rectList->size()) { @@ -458,10 +462,10 @@ void AsCommonCar::updateMovement() { break; } if (index < _rectList->size() && !_rectFlag) - flag = true; + inRect = true; _rectFlag = index < _rectList->size(); } - if (flag) { + if (inRect) { gotoNextState(); stHandleRect(); } else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) { @@ -474,28 +478,28 @@ void AsCommonCar::updateMovement() { void AsCommonCar::stEnterCar() { startAnimation(0xA86A9538, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); NextState(&AsCommonCar::stLeanForwardIdle); } void AsCommonCar::stLeaveCar() { startAnimation(0xA86A9538, -1, -1); _playBackwards = true; - SetMessageHandler(&AsCommonCar::hmLeaveCar); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmLeaveCar); } void AsCommonCar::stLeanForwardIdle() { startAnimation(0x35698F78, 0, -1); - SetMessageHandler(&AsCommonCar::handleMessage); - SetUpdateHandler(&AsCommonCar::upIdle); - FinalizeState(&AsCommonCar::evIdleDone); _currMoveDirection = 0; _newMoveDirection = 0; _steps = 0; _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + SetUpdateHandler(&AsCommonCar::upIdle); + SetMessageHandler(&AsCommonCar::handleMessage); + FinalizeState(&AsCommonCar::evIdleDone); } void AsCommonCar::evIdleDone() { @@ -504,19 +508,19 @@ void AsCommonCar::evIdleDone() { void AsCommonCar::stIdleBlink() { startAnimation(0xB579A77C, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); - SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::stLeanForwardIdle); _idleCounter = 0; _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stLeanForwardIdle); } void AsCommonCar::stHandleRect() { _isBusy = true; gotoNextState(); startAnimation(0x9C220DA4, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); FinalizeState(&AsCommonCar::evHandleRectDone); } @@ -528,15 +532,14 @@ void AsCommonCar::evHandleRectDone() { void AsCommonCar::stUpdateMoveDirection() { _isMoving = true; - if (_currMoveDirection == 1) { + if (_currMoveDirection == 1) startAnimation(0xD4AA03A4, 0, -1); - } else if (_currMoveDirection == 3) { + else if (_currMoveDirection == 3) startAnimation(0xD00A1364, 0, -1); - } else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) { + else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) stTurnCar(); - } else { + else startAnimation(0xD4220027, 0, -1); - } setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0); } @@ -579,8 +582,8 @@ void AsCommonCar::stBrakeMoveToNextPoint() { _isBusy = true; _isBraking = true; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); NextState(&AsCommonCar::stTurnCarMoveToNextPoint); } @@ -589,8 +592,8 @@ void AsCommonCar::stTurnCar() { gotoNextState(); _isBusy = true; startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); FinalizeState(&AsCommonCar::evTurnCarDone); _turnMoveStatus = 0; updateTurnMovement(); @@ -601,8 +604,8 @@ void AsCommonCar::stTurnCarMoveToNextPoint() { gotoNextState(); _isBusy = true; startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); FinalizeState(&AsCommonCar::evTurnCarDone); _turnMoveStatus = 1; updateTurnMovement(); @@ -613,8 +616,8 @@ void AsCommonCar::stTurnCarMoveToPrevPoint() { FinalizeState(NULL); _isBusy = true; startAnimation(0xF46A0324, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); FinalizeState(&AsCommonCar::evTurnCarDone); _turnMoveStatus = 2; updateTurnMovement(); @@ -666,8 +669,8 @@ void AsCommonCar::stBrakeMoveToPrevPoint() { _isBusy = true; _isBraking = true; startAnimation(0x192ADD30, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); NextState(&AsCommonCar::stTurnCarMoveToPrevPoint); } @@ -692,12 +695,10 @@ void AsCommonCar::suMoveToNextPoint() { if (_steps <= 0) { sendMessage(this, 0x1019, 0); return; - } else { + } else _steps--; - } - } else if (_steps < 11) { + } else if (_steps < 11) _steps++; - } bool firstTime = true; _ySteps = _steps; @@ -742,9 +743,9 @@ void AsCommonCar::suMoveToNextPoint() { if (pt1.y < pt2.y) _newMoveDirection = 1; if (firstTime) { - if (pt1.y >= pt2.y) { + if (pt1.y >= pt2.y) stepsCtr += 7; - } else { + else { stepsCtr -= 4; if (stepsCtr < 0) stepsCtr = 0; @@ -837,12 +838,10 @@ void AsCommonCar::suMoveToPrevPoint() { if (_steps <= 0) { sendMessage(this, 0x1019, 0); return; - } else { + } else _steps--; - } - } else if (_steps < 11) { + } else if (_steps < 11) _steps++; - } bool firstTime = true; _ySteps = _steps; @@ -980,67 +979,16 @@ void AsCommonCar::updateSound() { maxSoundCounter = 5 - _steps; if (maxSoundCounter < 1) maxSoundCounter = 1; - } else { + } else maxSoundCounter = 14 - _steps; - } - } else { + } else maxSoundCounter = 21; - } if (_soundCounter >= maxSoundCounter) { sendMessage(_parentScene, 0x200D, 0); _soundCounter = 0; } } -AsScene1608Door::AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0x08C80144, 900, 320, 240), _parentScene(parentScene) { - - setVisible(false); - SetMessageHandler(&AsScene1608Door::handleMessage); - stopAnimation(); -} - -uint32 AsScene1608Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - case 0x4808: - stOpenDoor(); - break; - case 0x4809: - stCloseDoor(); - break; - } - return messageResult; -} - -void AsScene1608Door::stOpenDoor() { - startAnimation(0x08C80144, 0, -1); - setVisible(true); - NextState(&AsScene1608Door::stOpenDoorDone); - playSound(0, calcHash("fxDoorOpen23")); -} - -void AsScene1608Door::stOpenDoorDone() { - sendMessage(_parentScene, 0x2033, 0); - stopAnimation(); - setVisible(false); -} - -void AsScene1608Door::stCloseDoor() { - startAnimation(0x08C80144, -1, -1); - setVisible(true); - NextState(&AsScene1608Door::stCloseDoorDone); - playSound(0, calcHash("fxDoorClose23")); -} - -void AsScene1608Door::stCloseDoorDone() { - sendMessage(_parentScene, 0x2034, 0); - stopAnimation(); -} - AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { @@ -1059,10 +1007,10 @@ AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y) AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar) : AnimatedSprite(vm, 1100), _asCar(asCar) { - SetUpdateHandler(&AsCommonCarConnector::update); createSurface1(0x60281C10, 150); startAnimation(0x60281C10, -1, -1); _newStickFrameIndex = STICK_LAST_FRAME; + SetUpdateHandler(&AsCommonCarConnector::update); } void AsCommonCarConnector::update() { @@ -1082,14 +1030,16 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asKey); if (which < 0) { + // Restoring game if (_vm->gameState().which == 1) + // Klaymen is in the car which = 1; else { + // Klaymen is standing around setRectList(0x004B47D0); insertKlayman(380, 438); _kmScene1608 = _klayman; _klaymanInCar = false; - _asDoor = insertSprite(this); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); setMessageList(0x004B46A8); setBackground(0x10080E01); @@ -1102,6 +1052,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x4B18F868, 1200); } } else if (which == 0) { + // Klaymen entering from the left _vm->gameState().which = 0; setRectList(0x004B47D0); insertKlayman(0, 438); @@ -1114,12 +1065,11 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); insertMouse433(0x80E05108); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); - _asDoor = insertSprite(this); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); - sendMessage(_asDoor, 0x4808, 0); insertStaticSprite(0x4B18F868, 1200); } else if (which == 2) { + // Klaymen returning from looking through the upper window _vm->gameState().which = 1; _dataResource.load(0x003C0492); _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); @@ -1135,28 +1085,26 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(373, 220); _klayman->setDoDeltaX(1); - } else { + } else insertKlayman(283, 220); - } _kmScene1608 = _klayman; setMessageList(0x004B47A8); SetMessageHandler(&Scene1608::hmUpperFloor); SetUpdateHandler(&Scene1608::upUpperFloor); - // NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original _asCar->setPathPoints(_roomPathPoints); sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1); _sprite3 = insertStaticSprite(0xB47026B0, 1100); - _rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _rect2 = _rect1; - _rect2.y2 = 215; - _klayman->setClipRect(_rect1); - _asCar->setClipRect(_rect1); - _asIdleCarLower->setClipRect(_rect1); - _asIdleCarFull->setClipRect(_rect1); + _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect2 = _clipRect1; + _clipRect2.y2 = 215; + _klayman->setClipRect(_clipRect1); + _asCar->setClipRect(_clipRect1); + _asIdleCarLower->setClipRect(_clipRect1); + _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - insertSprite(_asCar)->setClipRect(_rect1); + insertSprite(_asCar)->setClipRect(_clipRect1); _klaymanInCar = false; _carClipFlag = false; _carStatus = 0; @@ -1165,6 +1113,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) // NOTE: Not in the else because 'which' is set to 1 in the true branch if (which == 1) { + // Klaymen entering riding the car _vm->gameState().which = 1; _dataResource.load(0x003C0492); _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); @@ -1176,52 +1125,49 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower = insertSprite(375, 227); _asIdleCarFull = insertSprite(375, 227); _sprite2 = insertStaticSprite(0x491F38A8, 1100); - _kmScene1608 = createSprite(this, 439, 220); // Special Klayman handling... + _kmScene1608 = createSprite(this, 439, 220); sendMessage(_kmScene1608, 0x2032, 1); _kmScene1608->setDoDeltaX(1); SetMessageHandler(&Scene1608::hmRidingCar); SetUpdateHandler(&Scene1608::upRidingCar); _asIdleCarLower->setVisible(false); _asIdleCarFull->setVisible(false); - // NOTE: Setting the point array was handled by messages 0x2000 (array) and 0x2001 (count) in the original _asCar->setPathPoints(_roomPathPoints); sendMessage(_asCar, 0x2002, 0); sendMessage(_asCar, 0x2008, 90); _sprite3 = insertStaticSprite(0xB47026B0, 1100); - _rect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _rect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _rect2 = _rect1; - _rect2.y2 = 215; - _kmScene1608->setClipRect(_rect1); - _asCar->setClipRect(_rect1); - _asIdleCarLower->setClipRect(_rect1); - _asIdleCarFull->setClipRect(_rect1); + _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect2 = _clipRect1; + _clipRect2.y2 = 215; + _kmScene1608->setClipRect(_clipRect1); + _asCar->setClipRect(_clipRect1); + _asIdleCarLower->setClipRect(_clipRect1); + _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); // ... _vm->_collisionMan->addSprite(_asTape); - insertSprite(_asCar)->setClipRect(_rect1); + insertSprite(_asCar)->setClipRect(_clipRect1); _klaymanInCar = true; _carClipFlag = true; _carStatus = 0; } _palette->addPalette("paKlayRed", 0, 64, 0); - + } Scene1608::~Scene1608() { setGlobalVar(V_KLAYMAN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); - if (_klaymanInCar) { + if (_klaymanInCar) delete _kmScene1608; - } else { + else delete _asCar; - } } void Scene1608::upLowerFloor() { Scene::update(); - if (_countdown1 != 0 && (--_countdown1 == 0)) { + if (_countdown1 != 0 && (--_countdown1 == 0)) leaveScene(0); - } } void Scene1608::upUpperFloor() { @@ -1292,13 +1238,13 @@ void Scene1608::upRidingCar() { if (_asCar->getX() < 300) { if (_carClipFlag) { _carClipFlag = false; - _asCar->setClipRect(_rect1); + _asCar->setClipRect(_clipRect1); if (!_asCar->isDoDeltaX()) sendMessage(_asCar, 0x200E, 0); } } else if (!_carClipFlag) { _carClipFlag = true; - _asCar->setClipRect(_rect3); + _asCar->setClipRect(_clipRect3); } } @@ -1311,7 +1257,7 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity _klayman->setVisible(false); showMouse(false); _sprite1->setVisible(false); - sendMessage(_asDoor, 0x4809, 0); + //sendMessage(_asDoor, 0x4809, 0); // Play sound? _countdown1 = 28; } break; @@ -1322,9 +1268,8 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity if (sender == _asTape) { sendEntityMessage(_kmScene1608, 0x1014, _asTape); setMessageList(0x004B4770); - } else if (sender == _asKey) { + } else if (sender == _asKey) setMessageList(0x004B46C8); - } break; } return 0; @@ -1334,9 +1279,8 @@ uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam ¶m, Entity Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x60842040) { + if (param.asInteger() == 0x60842040) _carStatus = 1; - } break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -1384,12 +1328,12 @@ uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity void Scene1608::updateKlaymanCliprect() { if (_kmScene1608->getX() <= 375) - _kmScene1608->setClipRect(_rect1); + _kmScene1608->setClipRect(_clipRect1); else - _kmScene1608->setClipRect(_rect2); + _kmScene1608->setClipRect(_clipRect2); } -Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { // TODO _vm->gameModule()->initScene3011Vars(); @@ -1400,15 +1344,13 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x92124A14); setPalette(0x92124A14); + insertMouse435(0x24A10929, 20, 620); for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++) _asSymbols[symbolPosition] = insertSprite(symbolPosition, false); _ssButton = insertSprite(this, true); _vm->_collisionMan->addSprite(_ssButton); - - insertMouse435(0x24A10929, 20, 620); - loadSound(0, 0x68E25540); } @@ -1428,9 +1370,8 @@ void Scene1609::update() { _countdown1 = 12; } } - if (_isSolved && !isSoundPlaying(0)) { + if (_isSolved && !isSoundPlaying(0)) leaveScene(1); - } Scene::update(); } diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index a2d5464f18..28aad133d8 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -37,6 +37,7 @@ public: Module1600(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1600(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; @@ -105,18 +106,6 @@ protected: void updateSound(); }; -class AsScene1608Door : public AnimatedSprite { -public: - AsScene1608Door(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stOpenDoorDone(); - void stCloseDoor(); - void stCloseDoorDone(); -}; - class AsCommonIdleCarLower : public AnimatedSprite { public: AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y); @@ -142,7 +131,6 @@ public: protected: AsCommonCar *_asCar; Sprite *_asKey; - Sprite *_asDoor; Sprite *_asIdleCarLower; Sprite *_asIdleCarFull; Sprite *_sprite1; @@ -150,9 +138,9 @@ protected: Sprite *_sprite3; Sprite *_asTape; Klayman *_kmScene1608; - NRect _rect1; - NRect _rect2; - NRect _rect3; + NRect _clipRect1; + NRect _clipRect2; + NRect _clipRect3; int _carStatus; bool _carClipFlag; bool _klaymanInCar; @@ -172,7 +160,7 @@ protected: class Scene1609 : public Scene { public: - Scene1609(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1609(NeverhoodEngine *vm, Module *parentModule); protected: Sprite *_ssButton; AsScene3011Symbol *_asSymbols[12]; -- cgit v1.2.3 From 904d9430bf7084e0ca449d69da6e1197d36b3779 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 12:56:42 +0000 Subject: NEVERHOOD: Clean up Module1700 (like the ones before) --- engines/neverhood/gamemodule.cpp | 6 ++--- engines/neverhood/module1700.cpp | 57 ++++++++++++++++++---------------------- engines/neverhood/module1700.h | 1 + 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 77869fd729..46fc2b47f7 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -317,9 +317,9 @@ void GameModule::startup() { //DEBUG<<< */ - _vm->gameState().which = 2; - _vm->gameState().sceneNum = 7; - createModule(1600, -1); + _vm->gameState().which = 3; + _vm->gameState().sceneNum = 4; + createModule(1700, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index df64e1976a..aa145290eb 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -42,15 +42,14 @@ Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 50, 600, 5, 150); _vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 0) { + else if (which == 0) createScene(0, -1); - } else if (which == 1) { + else if (which == 1) createScene(4, 1); - } else { + else createScene(4, 3); - } } @@ -60,23 +59,28 @@ Module1700::~Module1700() { void Module1700::createScene(int sceneNum, int which) { debug("Module1700::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); createSmackerScene(0x3028A005, true, true, false); break; case 1: + _vm->gameState().sceneNum = 1; createNavigationScene(0x004AE8B8, which); break; case 2: + _vm->gameState().sceneNum = 2; createNavigationScene(0x004AE8E8, which); break; case 3: + _vm->gameState().sceneNum = 3; _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); createSmackerScene(0x01190041, true, true, false); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); _vm->_soundMan->startMusic(0x31114225, 0, 2); _childObject = new Scene1705(_vm, this, which); @@ -88,24 +92,23 @@ void Module1700::createScene(int sceneNum, int which) { void Module1700::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 0, 0, 0, 0); createScene(1, 0); break; case 1: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(2, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(1, 1); - } break; case 2: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(3, -1); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(1, 1); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) { if (!isSoundPlaying(0)) { setSoundVolume(0, 60); playSound(0, 0x58B45E58); @@ -126,18 +129,10 @@ void Module1700::updateScene() { // Scene1705 static const uint32 kScene1705FileHashes[] = { - 0x910EA801, - 0x920EA801, - 0x940EA801, - 0x980EA801, - 0x800EA801, - 0xB00EA801, - 0xD00EA801, - 0x100EA801, - 0x900EA800, - 0xD10EA801, - 0x110EA801, - 0x910EA800 + 0x910EA801, 0x920EA801, 0x940EA801, + 0x980EA801, 0x800EA801, 0xB00EA801, + 0xD00EA801, 0x100EA801, 0x900EA800, + 0xD10EA801, 0x110EA801, 0x910EA800 }; SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex) @@ -193,49 +188,49 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene1705::update); setHitRects(0x004B69D8); - setBackground(0x03118226); - setPalette(0x03118226); _palette->addBasePalette(0x91D3A391, 0, 64, 0); _palette->copyBasePalette(0, 256, 0); addEntity(_palette); - insertMouse433(0x18222039); insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0); insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1); insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2); - _sprite = insertStaticSprite(0x31313A22, 1100); - _ssTape = insertSprite(this, 15, 1100, 238, 439, 0x02363852); _vm->_collisionMan->addSprite(_ssTape); if (which < 0) { + // Restoring game insertKlayman(231, 434); setMessageList(0x004B69E8); sendMessage(this, 0x2000, 0); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 1) { + // Klaymen teleporting in insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A08, false); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 2) { + // Klaymen teleporting out insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6AA0, false); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 3) { + // Klaymen returning from teleporter console insertKlayman(431, 434); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B6A18, false); sendMessage(this, 0x2000, 1); _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else { + // Klaymen falling through the hole insertKlayman(231, 74); sendMessage(_klayman, 0x2000, 0); setMessageList(0x004B69F0); diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h index c0ec9e5123..26e1a5e0b0 100644 --- a/engines/neverhood/module1700.h +++ b/engines/neverhood/module1700.h @@ -35,6 +35,7 @@ public: Module1700(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1700(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; -- cgit v1.2.3 From dd26512c0db0eb5189c761cd7b1f7d779bda7617 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 13:03:16 +0000 Subject: NEVERHOOD: Clean up Module1800 (like the ones before) --- engines/neverhood/module1800.cpp | 67 +++++++++++++++++++++------------------- engines/neverhood/module1800.h | 1 + 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index e4b189b056..fbb9483219 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -43,15 +43,14 @@ Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->setSoundListParams(kModule1800SoundList, true, 50, 600, 10, 150); _vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 2) { + else if (which == 2) createScene(5, 0); - } else if (which == 3) { + else if (which == 3) createScene(0, 0); - } else { + else createScene(3, 1); - } } @@ -63,39 +62,49 @@ void Module1800::createScene(int sceneNum, int which) { static const byte kNavigationTypes00[] = {1, 0, 2, 0}; static const byte kNavigationTypes01[] = {5}; debug("Module1800::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; createNavigationScene(0x004AFD38, which, kNavigationTypes00); break; case 1: + _vm->gameState().sceneNum = 1; createNavigationScene(0x004AFD98, which, kNavigationTypes01); break; case 2: + _vm->gameState().sceneNum = 2; createSmackerScene(0x006C0085, true, true, false); break; case 3: + _vm->gameState().sceneNum = 3; createNavigationScene(0x004AFDB0, which); break; case 4: + _vm->gameState().sceneNum = 4; createNavigationScene(0x004AFDE0, which); break; case 5: + _vm->gameState().sceneNum = 5; createNavigationScene(0x004AFE40, which); break; case 6: + _vm->gameState().sceneNum = 6; _vm->_soundMan->deleteGroup(0x04A14718); createSmackerScene(0x08D84010, true, true, false); break; case 7: + _vm->gameState().sceneNum = 7; _vm->_soundMan->setSoundListParams(kModule1800SoundList, false, 0, 0, 0, 0); createSmackerScene(0x0168B121, true, true, false); break; case 8: + _vm->gameState().sceneNum = 8; _childObject = new CreditsScene(_vm, this, false); break; - case 9: - // NOTE: Newly introduced sceneNum 9 (was duplicate 3 with own update handler) + case 1009: + _vm->gameState().sceneNum = 3; + // NOTE: Newly introduced sceneNum 1009 (was duplicate 3 with own update handler) createSmackerScene(0x0A840C01, true, true, false); break; } @@ -105,50 +114,45 @@ void Module1800::createScene(int sceneNum, int which) { void Module1800::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(4, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(1, -1); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createScene(3, 0); - } break; case 1: - if (_navigationAreaType == 3) { + if (_navigationAreaType == 3) createScene(7, -1); - } else { + else createScene(2, -1); - } break; case 2: createScene(0, 2); break; case 3: - if (_moduleResult == 0) { - createScene(9, -1); - } else if (_moduleResult == 1) { + if (_moduleResult == 0) + createScene(1009, -1); + else if (_moduleResult == 1) createScene(0, 1); - } break; case 4: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(6, -1); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(5, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(0, 3); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createScene(4, 3); - } break; case 5: - if (_moduleResult == 0) { + if (_moduleResult == 0) leaveModule(2); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(4, 3); - } break; case 6: createScene(8, -1); @@ -161,16 +165,15 @@ void Module1800::updateScene() { leaveModule(1); // TODO GameState stuff // Restarts the game? break; - case 9: + case 1009: leaveModule(0); break; } } else { switch (_vm->gameState().sceneNum) { case 0: - if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) { + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) _vm->_soundMan->setTwoSoundsPlayFlag(false); - } break; } } diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h index 8ec8dfecea..3c1d02e09c 100644 --- a/engines/neverhood/module1800.h +++ b/engines/neverhood/module1800.h @@ -36,6 +36,7 @@ public: Module1800(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1800(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; -- cgit v1.2.3 From 2fbfd673ad4ca72652ff3d90656ced2020e31e6f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 13:21:03 +0000 Subject: NEVERHOOD: Clean up Module1900 (like the ones before) --- engines/neverhood/gamemodule.cpp | 6 +- engines/neverhood/module1900.cpp | 136 +++++++++++++++------------------------ engines/neverhood/module1900.h | 7 +- 3 files changed, 60 insertions(+), 89 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 46fc2b47f7..bb58eb4e28 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -317,9 +317,9 @@ void GameModule::startup() { //DEBUG<<< */ - _vm->gameState().which = 3; - _vm->gameState().sceneNum = 4; - createModule(1700, -1); + _vm->gameState().which = 1; + _vm->gameState().sceneNum = 0; + createModule(1900, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index da02243579..269fd840a9 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -37,11 +37,10 @@ Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) // NOTE: The original has a Scene1908 here as well but it's not used here but in another module... - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else { + else createScene(0, 0); - } _vm->_soundMan->addSoundList(0x04E1C09C, kModule1900SoundList); _vm->_soundMan->setSoundListParams(kModule1900SoundList, true, 50, 600, 5, 150); @@ -54,13 +53,15 @@ Module1900::~Module1900() { void Module1900::createScene(int sceneNum, int which) { debug("Module1900::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _childObject = new Scene1901(_vm, this, which); break; case 6: - _childObject = new Scene1907(_vm, this, which); + _vm->gameState().sceneNum = 6; + _childObject = new Scene1907(_vm, this); break; } SetUpdateHandler(&Module1900::updateScene); @@ -69,13 +70,12 @@ void Module1900::createScene(int sceneNum, int which) { void Module1900::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(6, 0); - } else { + else leaveModule(0); - } break; case 6: createScene(0, 1); @@ -96,25 +96,27 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x01303227); setPalette(0x01303227); insertMouse433(0x0322301B); - + insertStaticSprite(0x42213133, 1100); - if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { + if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) insertStaticSprite(0x40A40168, 100); - } else if (getGlobalVar(V_STAIRS_DOWN)) { + else if (getGlobalVar(V_STAIRS_DOWN)) { insertStaticSprite(0x124404C4, 100); setGlobalVar(V_STAIRS_DOWN_ONCE, 1); - } else { + } else insertStaticSprite(0x02840064, 100); - } if (which < 0) { + // Restoring game insertKlayman(120, 380); setMessageList(0x004B3408); } else if (which == 1) { + // Klaymen returning from the puzzle insertKlayman(372, 380); setMessageList(0x004B3410); } else { + // Klaymen entering from the left insertKlayman(0, 380); setMessageList(0x004B3400); } @@ -125,73 +127,43 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) } static const NPoint kAsScene1907SymbolGroundPositions[] = { - {160, 310}, - { 90, 340}, - {210, 335}, - {210, 380}, - {310, 340}, - {290, 400}, - {400, 375}, - {370, 435}, - {475, 415} + {160, 310}, { 90, 340}, {210, 335}, + {210, 380}, {310, 340}, {290, 400}, + {400, 375}, {370, 435}, {475, 415} }; static const NPoint kAsScene1907SymbolPluggedInPositions[] = { - {275, 125}, - {244, 125}, - {238, 131}, - {221, 135}, - {199, 136}, - {168, 149}, - {145, 152}, - {123, 154}, - {103, 157} + {275, 125}, {244, 125}, {238, 131}, + {221, 135}, {199, 136}, {168, 149}, + {145, 152}, {123, 154}, {103, 157} }; static const NPoint kAsScene1907SymbolGroundHitPositions[] = { - {275, 299}, - {244, 299}, - {238, 305}, - {221, 309}, - {199, 310}, - {168, 323}, - {145, 326}, - {123, 328}, - {103, 331} + {275, 299}, {244, 299}, {238, 305}, + {221, 309}, {199, 310}, {168, 323}, + {145, 326}, {123, 328}, {103, 331} }; static const NPoint kAsScene1907SymbolPluggedInDownPositions[] = { - {275, 136}, - {244, 156}, - {238, 183}, - {221, 207}, - {199, 228}, - {168, 262}, - {145, 285}, - {123, 307}, - {103, 331} + {275, 136}, {244, 156}, {238, 183}, + {221, 207}, {199, 228}, {168, 262}, + {145, 285}, {123, 307}, {103, 331} }; static const uint32 kAsScene1907SymbolFileHashes[] = { - 0x006A1034, - 0x006A1010, - 0x006A1814, - 0x006A1016, - 0x006A0014, - 0x002A1014, - 0x00EA1014, - 0x206A1014, - 0x046A1414 + 0x006A1034, 0x006A1010, 0x006A1814, + 0x006A1016, 0x006A0014, 0x002A1014, + 0x00EA1014, 0x206A1014, 0x046A1414 }; -int AsScene1907Symbol::_symbolFlag1 = 0; -int AsScene1907Symbol::_symbolFlag2 = 0; +bool AsScene1907Symbol::_plugInFailed = false; +int AsScene1907Symbol::_plugInTryCount = 0; AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex) : AnimatedSprite(vm, 1000 - positionIndex), _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) { - _symbolFlag1 = 0; - _symbolFlag2 = 0; + _plugInFailed = false; + _plugInTryCount = 0; if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { _isPluggedIn = true; @@ -230,20 +202,19 @@ void AsScene1907Symbol::update() { AnimatedSprite::updateAnim(); handleSpriteUpdate(); AnimatedSprite::updatePosition(); - if (_symbolFlag1 && !_symbolFlag2) - _symbolFlag1 = 0; + if (_plugInFailed && _plugInTryCount == 0) + _plugInFailed = false; } uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (!_isPluggedIn && !_symbolFlag1) { + if (!_isPluggedIn && !_plugInFailed) { tryToPlugIn(); messageResult = 1; - } else { + } else messageResult = 0; - } break; } return messageResult; @@ -324,14 +295,12 @@ void AsScene1907Symbol::suMoveDown() { void AsScene1907Symbol::suMoveUp() { _y -= _yIncr; if (getGlobalVar(V_WALL_BROKEN)) { - if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { + if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) _yIncr--; - } else { + else _yIncr++; - } - } else { + } else _yIncr = 2; - } if (_yIncr > 9) _yIncr = 9; else if (_yIncr < 1) @@ -345,7 +314,7 @@ void AsScene1907Symbol::suMoveUp() { void AsScene1907Symbol::tryToPlugIn() { _isPluggedIn = true; - _symbolFlag2++; + _plugInTryCount++; _newPositionIndex = _parentScene->getNextPosition(); _parentScene->setPositionFree(_currPositionIndex, true); sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex); @@ -361,7 +330,7 @@ void AsScene1907Symbol::tryToPlugIn() { if (_elementIndex == _newPositionIndex) { NextState(&AsScene1907Symbol::stPlugIn); } else { - _symbolFlag1 = 1; + _plugInFailed = true; NextState(&AsScene1907Symbol::stPlugInFail); } } @@ -406,8 +375,8 @@ void AsScene1907Symbol::stFallOffHitGround() { void AsScene1907Symbol::cbFallOffHitGroundEvent() { _currPositionIndex = _newPositionIndex; - if (_symbolFlag2) - _symbolFlag2--; + if (_plugInTryCount > 0) + _plugInTryCount--; startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); _newStickFrameIndex = 0; SetUpdateHandler(&AnimatedSprite::update); @@ -434,7 +403,7 @@ void AsScene1907Symbol::stPlugInFail() { } void AsScene1907Symbol::moveUp() { - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteUpdate(&AsScene1907Symbol::suMoveUp); @@ -443,7 +412,7 @@ void AsScene1907Symbol::moveUp() { } void AsScene1907Symbol::moveDown() { - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1);//???? + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); stopAnimation(); SetMessageHandler(&AsScene1907Symbol::handleMessage); SetSpriteUpdate(&AsScene1907Symbol::suMoveDown); @@ -546,7 +515,7 @@ void AsScene1907WaterHint::hide() { SetMessageHandler(&Sprite::handleMessage); } -Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule, int which) +Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { @@ -662,11 +631,12 @@ void Scene1907::plugInFailed() { int Scene1907::getRandomPositionIndex() { bool flag = false; int index = 0; - for (int i = 0; i < 9; i++) { + // Check if any position is free + for (int i = 0; i < 9; i++) if (_positionFree[i]) flag = true; - } if (flag) { + // Get a random free position flag = false; while (!flag) { index = _vm->_rnd->getRandomNumber(9 - 1); diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h index 5f26c9e7ae..72dbf63a51 100644 --- a/engines/neverhood/module1900.h +++ b/engines/neverhood/module1900.h @@ -35,6 +35,7 @@ public: Module1900(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module1900(); protected: + int _sceneNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createScene(int sceneNum, int which); void updateScene(); @@ -75,8 +76,8 @@ protected: int _deltaX, _smallDeltaX; int _deltaY, _smallDeltaY; // Dumb, change if possible - static int _symbolFlag1; - static int _symbolFlag2; + static bool _plugInFailed; + static int _plugInTryCount; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender); @@ -117,7 +118,7 @@ protected: class Scene1907 : public Scene { public: - Scene1907(NeverhoodEngine *vm, Module *parentModule, int which); + Scene1907(NeverhoodEngine *vm, Module *parentModule); void plugInFailed(); void setPositionFree(int index, bool value) { _positionFree[index] = value; } int getNextPosition() { return _pluggedInCount++; } -- cgit v1.2.3 From 9d987a97d3d7a6a740383889dc2a676684d06676 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 13:35:41 +0000 Subject: NEVERHOOD: Clean up Module2000 (like the ones before) --- engines/neverhood/gamemodule.cpp | 4 ++-- engines/neverhood/module2000.cpp | 36 ++++++++++++++++++++---------------- engines/neverhood/module2000.h | 1 + 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index bb58eb4e28..896c8cc193 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -317,9 +317,9 @@ void GameModule::startup() { //DEBUG<<< */ - _vm->gameState().which = 1; + _vm->gameState().which = 3; _vm->gameState().sceneNum = 0; - createModule(1900, -1); + createModule(2000, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index a97cbaa1ae..ce871de5e8 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -29,13 +29,12 @@ namespace Neverhood { Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 0) { + else if (which == 0) createScene(0, 1); - } else if (which == 1) { + else if (which == 1) createScene(0, 3); - } } @@ -45,15 +44,18 @@ Module2000::~Module2000() { void Module2000::createScene(int sceneNum, int which) { debug("Module2000::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _childObject = new Scene2001(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which); break; case 2: + _vm->gameState().sceneNum = 2; setGlobalVar(V_WORLDS_JOINED, 1); setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1); createSmackerScene(0x204B2031, true, true, false); @@ -65,26 +67,23 @@ void Module2000::createScene(int sceneNum, int which) { void Module2000::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) leaveModule(0); - } else { + else createScene(1, 0); - } break; case 1: if (_moduleResult == 0) { - if (getGlobalVar(V_WORLDS_JOINED)) { + if (getGlobalVar(V_WORLDS_JOINED)) createScene(1, 0); - } else { + else createScene(2, -1); - } - } else if (_moduleResult == 1) { + } else if (_moduleResult == 1) createScene(1, 1); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(0, 0); - } break; case 2: createScene(1, 0); @@ -109,25 +108,30 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x0D641724, 1100); if (which < 0) { + // Restoring game insertKlayman(300, 345); setMessageList(0x004B3538); sendMessage(this, 0x2000, 0); } else if (which == 1) { + // Klaymen teleporting in insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3540, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { + // Klaymen teleporting out insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B35F0, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { + // Klaymen returning from teleporter console insertKlayman(116, 345); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B3550, false); sendMessage(this, 0x2000, 1); } else { + // Klaymen standing around insertKlayman(390, 345); setMessageList(0x004B3530); sendMessage(this, 0x2000, 0); diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h index 8533092b2c..9859c73006 100644 --- a/engines/neverhood/module2000.h +++ b/engines/neverhood/module2000.h @@ -35,6 +35,7 @@ public: Module2000(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2000(); protected: + int _sceneNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createScene(int sceneNum, int which); void updateScene(); -- cgit v1.2.3 From 0dd4995af35aac2aabb5c535e6fef3668eedae93 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 13:47:18 +0000 Subject: NEVERHOOD: Clean up Module2100 (like the ones before) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module2100.cpp | 58 +++++++++++++++++++--------------------- engines/neverhood/module2100.h | 3 ++- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 896c8cc193..adf2c49b88 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -319,7 +319,7 @@ void GameModule::startup() { _vm->gameState().which = 3; _vm->gameState().sceneNum = 0; - createModule(2000, -1); + createModule(2100, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index cbd11b6b4c..7bbb9e8158 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -31,15 +31,14 @@ Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addMusic(0x10A10C14, 0x11482B95); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 1) { + else if (which == 1) createScene(0, 0); - } else if (which == 2) { + else if (which == 2) createScene(0, 3); - } else { + else createScene(0, 1); - } } @@ -49,9 +48,10 @@ Module2100::~Module2100() { void Module2100::createScene(int sceneNum, int which) { debug("Module2100::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _vm->_soundMan->startMusic(0x11482B95, 0, 1); _childObject = new Scene2101(_vm, this, which); break; @@ -62,14 +62,13 @@ void Module2100::createScene(int sceneNum, int which) { void Module2100::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (_moduleResult == 1) { setGlobalVar(V_DOOR_PASSED, 1); leaveModule(0); - } else { + } else leaveModule(1); - } break; } } @@ -77,7 +76,7 @@ void Module2100::updateScene() { // Scene2101 -AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag) +AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool isOpen) : AnimatedSprite(vm, 1100) { createSurface(100, 328, 347); @@ -85,12 +84,11 @@ AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool flag) _y = 240; SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2101Door::handleMessage); - if (flag) { + if (isOpen) { startAnimation(0x0C202B9C, -1, -1); _newStickFrameIndex = STICK_LAST_FRAME; - } else { + } else setVisible(false); - } } uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -120,8 +118,8 @@ void AsScene2101Door::stCloseDoor() { startAnimation(0xC222A8D4, 0, -1); _newStickFrameIndex = STICK_LAST_FRAME; setVisible(true); - NextState(&AsScene2101Door::stCloseDoorDone); playSound(0, calcHash("fxDoorClose32")); + NextState(&AsScene2101Door::stCloseDoorDone); } void AsScene2101Door::stCloseDoorDone() { @@ -164,18 +162,18 @@ SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene if (_soundFileHash == 0) _soundFileHash = 0x44141000; createSurface(1010, 61, 30); - if (_fileHash1) { + if (_fileHash1) loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); - } else + else setVisible(false); } void SsCommonFloorButton::update() { if (_countdown != 0 && (--_countdown == 0)) { sendMessage(_parentScene, 0x1022, 1010); - if (_fileHash1) { + if (_fileHash1) loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); - } else + else setVisible(false); } } @@ -223,6 +221,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _doorStatus = 1; _countdown1 = 0; } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 438); setMessageList(0x004B8E50); sendMessage(this, 0x2000, 0); @@ -230,6 +229,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _doorStatus = 2; _countdown1 = 48; } else if (which == 2) { + // Klaymen teleporting out insertKlayman(115, 438); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B8F58); @@ -238,6 +238,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _doorStatus = 1; _countdown1 = 0; } else if (which == 3) { + // Klaymen returning from the teleporter console insertKlayman(115, 438); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B8EB0); @@ -246,6 +247,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _doorStatus = 1; _countdown1 = 0; } else { + // Klaymen teleporting in insertKlayman(115, 438); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004B8EA0); @@ -283,9 +285,8 @@ void Scene2101::update() { } } } - } else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) { + } else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) setMessageList2(0x004B8F50); - } Scene::update(); } @@ -293,17 +294,15 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x02144CB1) { + if (param.asInteger() == 0x02144CB1) sendEntityMessage(_klayman, 0x1014, _ssFloorButton); - } else if (param.asInteger() == 0x21E64A00) { - if (_doorStatus == 0) { + else if (param.asInteger() == 0x21E64A00) { + if (_doorStatus == 0) setMessageList(0x004B8E80); - } else { + else setMessageList(0x004B8EC8); - } - } else if (param.asInteger() == 0x41442820) { + } else if (param.asInteger() == 0x41442820) cancelMessageList(); - } break; case 0x2000: if (param.asInteger() != 0) { @@ -326,9 +325,8 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_klayman->getX() >= 228 && _klayman->getX() <= 500) { sendEntityMessage(_klayman, 0x1014, sender); setMessageList(0x004B8F78); - } else if (_klayman->getX() < 228) { + } else if (_klayman->getX() < 228) setMessageList2(0x004B8F00); - } } break; } diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h index cf7a613cbf..8ec12f774f 100644 --- a/engines/neverhood/module2100.h +++ b/engines/neverhood/module2100.h @@ -34,6 +34,7 @@ public: Module2100(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2100(); protected: + int _sceneNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createScene(int sceneNum, int which); void updateScene(); @@ -43,7 +44,7 @@ protected: class AsScene2101Door : public AnimatedSprite { public: - AsScene2101Door(NeverhoodEngine *vm, bool flag); + AsScene2101Door(NeverhoodEngine *vm, bool isOpen); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stOpenDoor(); -- cgit v1.2.3 From 1993d4165a8d2e3d2b956113b903899e0de4c6fa Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 17:04:35 +0000 Subject: NEVERHOOD: Clean up Module2200 (like the ones before) - Rename SceneInfo140 to HallOfRecordsInfo --- engines/neverhood/gamemodule.cpp | 7 +- engines/neverhood/module2200.cpp | 645 ++++++++++++++++++--------------------- engines/neverhood/module2200.h | 39 +-- engines/neverhood/staticdata.cpp | 32 +- engines/neverhood/staticdata.h | 6 +- 5 files changed, 337 insertions(+), 392 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index adf2c49b88..5fec376464 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -307,6 +307,7 @@ void GameModule::startup() { setSubVar(V_TELEPORTER_DEST_AVAILABLE, i, 1); //setGlobalVar(V_PROJECTOR_LOCATION, 4); setGlobalVar(V_KEYDOOR_UNLOCKED, 1); + setGlobalVar(V_LIGHTS_ON, 1); // <<gameState().which = 3; - _vm->gameState().sceneNum = 0; - createModule(2100, -1); + _vm->gameState().which = 2; + _vm->gameState().sceneNum = 41; + createModule(2200, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 102704af2c..8616592c18 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -35,11 +35,10 @@ Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addMusic(0x11391412, 0x601C908C); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else { + else createScene(0, 0); - } } @@ -48,158 +47,205 @@ Module2200::~Module2200() { } void Module2200::createScene(int sceneNum, int which) { - // CHECKME if this can be used regardless of the new sceneNum - if (sceneNum == 7 && which >= 0) - _vm->gameState().which = _vm->gameState().sceneNum; - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _childObject = new Scene2201(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; _vm->_soundMan->startMusic(0x601C908C, 0, 2); _childObject = new Scene2202(_vm, this, which); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->startMusic(0x601C908C, 0, 2); _childObject = new Scene2203(_vm, this, which); break; case 3: + _vm->gameState().sceneNum = 3; _vm->_soundMan->stopMusic(0x601C908C, 0, 2); _childObject = new DiskplayerScene(_vm, this, 3); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->stopMusic(0x601C908C, 0, 2); _childObject = new Scene2205(_vm, this, which); break; case 5: + _vm->gameState().sceneNum = 5; _vm->_soundMan->stopMusic(0x601C908C, 0, 2); _childObject = new Scene2206(_vm, this, which); break; case 6: - _childObject = new Scene2207(_vm, this, which); + _vm->gameState().sceneNum = 6; + _childObject = new Scene2207(_vm, this); break; case 7: + if (which >= 0) + _vm->gameState().which = _vm->gameState().sceneNum; + _vm->gameState().sceneNum = 7; _childObject = new Scene2208(_vm, this, which); break; case 8: + _vm->gameState().sceneNum = 8; _childObject = new Scene2208(_vm, this, which); break; case 9: + _vm->gameState().sceneNum = 9; createHallOfRecordsScene(which, 0x004B7180); break; case 10: + _vm->gameState().sceneNum = 10; createHallOfRecordsScene(which, 0x004B7198); break; case 11: + _vm->gameState().sceneNum = 11; createHallOfRecordsScene(which, 0x004B71B0); break; case 12: + _vm->gameState().sceneNum = 12; createHallOfRecordsScene(which, 0x004B71C8); break; case 13: + _vm->gameState().sceneNum = 13; createHallOfRecordsScene(which, 0x004B71E0); break; case 14: + _vm->gameState().sceneNum = 14; createHallOfRecordsScene(which, 0x004B71F8); break; case 15: + _vm->gameState().sceneNum = 15; createHallOfRecordsScene(which, 0x004B7210); break; case 16: + _vm->gameState().sceneNum = 16; createHallOfRecordsScene(which, 0x004B7228); break; case 17: + _vm->gameState().sceneNum = 17; createHallOfRecordsScene(which, 0x004B7240); break; case 18: + _vm->gameState().sceneNum = 18; createHallOfRecordsScene(which, 0x004B7258); break; case 19: + _vm->gameState().sceneNum = 19; createHallOfRecordsScene(which, 0x004B7270); break; case 20: + _vm->gameState().sceneNum = 20; createHallOfRecordsScene(which, 0x004B7288); break; case 21: + _vm->gameState().sceneNum = 21; createHallOfRecordsScene(which, 0x004B72A0); break; case 22: + _vm->gameState().sceneNum = 22; createHallOfRecordsScene(which, 0x004B72B8); break; case 23: + _vm->gameState().sceneNum = 23; createHallOfRecordsScene(which, 0x004B72D0); break; case 24: + _vm->gameState().sceneNum = 24; createHallOfRecordsScene(which, 0x004B72E8); break; case 25: + _vm->gameState().sceneNum = 25; createHallOfRecordsScene(which, 0x004B7300); break; case 26: + _vm->gameState().sceneNum = 26; createHallOfRecordsScene(which, 0x004B7318); break; case 27: + _vm->gameState().sceneNum = 27; createHallOfRecordsScene(which, 0x004B7330); break; case 28: + _vm->gameState().sceneNum = 28; createHallOfRecordsScene(which, 0x004B7348); break; case 29: + _vm->gameState().sceneNum = 29; createHallOfRecordsScene(which, 0x004B7360); break; case 30: + _vm->gameState().sceneNum = 30; createHallOfRecordsScene(which, 0x004B7378); break; case 31: + _vm->gameState().sceneNum = 31; createHallOfRecordsScene(which, 0x004B7390); break; case 32: + _vm->gameState().sceneNum = 32; createHallOfRecordsScene(which, 0x004B73A8); break; case 33: + _vm->gameState().sceneNum = 33; createHallOfRecordsScene(which, 0x004B73C0); break; case 34: + _vm->gameState().sceneNum = 34; createHallOfRecordsScene(which, 0x004B73D8); break; case 35: + _vm->gameState().sceneNum = 35; createHallOfRecordsScene(which, 0x004B73F0); break; case 36: + _vm->gameState().sceneNum = 36; createHallOfRecordsScene(which, 0x004B7408); break; case 37: + _vm->gameState().sceneNum = 37; createHallOfRecordsScene(which, 0x004B7420); break; case 38: + _vm->gameState().sceneNum = 38; createHallOfRecordsScene(which, 0x004B7438); break; case 39: + _vm->gameState().sceneNum = 39; createHallOfRecordsScene(which, 0x004B7450); break; case 40: + _vm->gameState().sceneNum = 40; createHallOfRecordsScene(which, 0x004B7468); break; case 41: + _vm->gameState().sceneNum = 41; _childObject = new Scene2242(_vm, this, which); break; case 42: + _vm->gameState().sceneNum = 42; createHallOfRecordsScene(which, 0x004B7480); break; case 43: + _vm->gameState().sceneNum = 43; createHallOfRecordsScene(which, 0x004B7498); break; case 44: + _vm->gameState().sceneNum = 44; createHallOfRecordsScene(which, 0x004B74B0); break; case 45: + _vm->gameState().sceneNum = 45; createHallOfRecordsScene(which, 0x004B74C8); break; case 46: + _vm->gameState().sceneNum = 46; _childObject = new Scene2247(_vm, this, which); break; case 47: + _vm->gameState().sceneNum = 47; if (!getGlobalVar(V_WORLDS_JOINED)) { if (getGlobalVar(V_LIGHTS_ON)) createStaticScene(0x83110287, 0x10283839); @@ -222,50 +268,46 @@ void Module2200::createScene(int sceneNum, int which) { void Module2200::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(2, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(1, 0); - } else { + else leaveModule(0); - } break; case 1: createScene(0, 2); break; case 2: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(4, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(3, 0); - } else { + else createScene(0, 1); - } break; case 3: createScene(2, 2); break; case 4: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(5, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(4, 2); - } else { + else createScene(2, 1); - } break; case 5: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(46, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(6, 0); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createScene(8, 0); - } else { + else createScene(4, 1); - } break; case 6: createScene(5, 2); @@ -399,8 +441,8 @@ void Module2200::updateScene() { #undef HallOfRecordsSceneLink -void Module2200::createHallOfRecordsScene(int which, uint32 sceneInfo140Id) { - _childObject = new HallOfRecordsScene(_vm, this, which, sceneInfo140Id); +void Module2200::createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId) { + _childObject = new HallOfRecordsScene(_vm, this, which, hallOfRecordsInfoId); } // Scene2201 @@ -415,15 +457,15 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) SetUpdateHandler(&AnimatedSprite::update); } -AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1) - : AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _doorOpen(flag1) { +AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool isOpen) + : AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) { _x = 408; _y = 290; createSurface(900, 63, 266); SetUpdateHandler(&AsScene2201Door::update); SetMessageHandler(&AsScene2201Door::handleMessage); - if (_doorOpen) { + if (_isOpen) { startAnimation(0xE2CB0412, -1, -1); _countdown = 48; _newStickFrameIndex = STICK_LAST_FRAME; @@ -435,9 +477,8 @@ AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite * } void AsScene2201Door::update() { - if (_countdown != 0 && _doorOpen && (--_countdown == 0)) { + if (_countdown != 0 && _isOpen && (--_countdown == 0)) stCloseDoor(); - } AnimatedSprite::update(); } @@ -446,24 +487,24 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, switch (messageNum) { case 0x100D: if (param.asInteger() == 0x11001090) { - if (_doorOpen) + if (_isOpen) _ssDoorLight->setVisible(true); } else if (param.asInteger() == 0x11283090) { - if (!_doorOpen) + if (!_isOpen) _ssDoorLight->setVisible(false); } break; case 0x2000: - if (_doorOpen) + if (_isOpen) _countdown = 144; - messageResult = _doorOpen ? 1 : 0; + messageResult = _isOpen ? 1 : 0; break; case 0x3002: gotoNextState(); break; case 0x4808: _countdown = 144; - if (!_doorOpen) + if (!_isOpen) stOpenDoor(); break; } @@ -471,14 +512,14 @@ uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, } void AsScene2201Door::stOpenDoor() { - _doorOpen = true; + _isOpen = true; startAnimation(0xE2CB0412, 0, -1); _newStickFrameIndex = STICK_LAST_FRAME; playSound(0, calcHash("fxDoorOpen33")); } void AsScene2201Door::stCloseDoor() { - _doorOpen = false; + _isOpen = false; startAnimation(0xE2CB0412, -1, -1); _playBackwards = true; _newStickFrameIndex = 0; @@ -507,14 +548,12 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) loadDataResource(0x04104242); loadHitRectList(); - setBackground(0x40008208); setPalette(0x40008208); insertMouse433(0x0820C408); _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) @@ -526,42 +565,40 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[1].x2 = 640; _clipRects[1].y2 = 480; - if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) { + if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) insertStaticSprite(0x00026027, 900); - } tempSprite = insertStaticSprite(0x030326A0, 1100); _clipRects[0].x1 = tempSprite->getDrawRect().x; - insertStaticSprite(0x811DA061, 1100); - tempSprite = insertStaticSprite(0x11180022, 1100); _clipRects[1].x1 = tempSprite->getDrawRect().x; - tempSprite = insertStaticSprite(0x0D411130, 1100); _clipRects[0].y2 = tempSprite->getDrawRect().y2(); _clipRects[1].y1 = tempSprite->getDrawRect().y2(); - _ssDoorLight = insertStaticSprite(0xA4062212, 900); if (which < 0) { + // Restoring game insertKlayman(300, 427, _clipRects, 2); setMessageList(0x004B8118); _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else if (which == 1) { + // Klaymen entering from the back insertKlayman(412, 393, _clipRects, 2); setMessageList(0x004B8130); _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else if (which == 2) { + // Klaymen returning from the puzzle if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(379, 427, _clipRects, 2); _klayman->setDoDeltaX(1); - } else { + } else insertKlayman(261, 427, _clipRects, 2); - } setMessageList(0x004B8178); _asDoor = insertSprite(_klayman, _ssDoorLight, false); } else { + // Klaymen entering from the left NPoint pt = _dataResource.getPoint(0x0304D8DC); insertKlayman(pt.x, pt.y, _clipRects, 2); setMessageList(0x004B8120); @@ -591,34 +628,30 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x402064D8) { + if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssDoorButton); - } else if (param.asInteger() == 0x35803198) { - if (sendMessage(_asDoor, 0x2000, 0)) { + else if (param.asInteger() == 0x35803198) { + if (sendMessage(_asDoor, 0x2000, 0)) setMessageList(0x004B81A0); - } else { + else setMessageList(0x004B81B8); - } } else if (param.asInteger() == 0x51445010) { - if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) { + if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) setMessageList(0x004B8108); - } else { + else setMessageList(0x004B8150); - } - } else if (param.asInteger() == 0x1D203082) { + } else if (param.asInteger() == 0x1D203082) setMessageList(0x004B8180); - } else if (param.asInteger() == 0x00049091) { - if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) { + else if (param.asInteger() == 0x00049091) { + if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) setMessageList(0x004B8138); - } else { + else setMessageList(0x004B8108); - } } break; case 0x480B: - if (sender == _ssDoorButton) { + if (sender == _ssDoorButton) sendMessage(_asDoor, 0x4808, 0); - } break; case 0x4826: if (sender == _asTape) { @@ -630,82 +663,65 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -static const NPoint kSsScene2202PuzzleTilePoints[] = { - {196, 105}, - {323, 102}, - {445, 106}, - {192, 216}, - {319, 220}, - {446, 216}, - {188, 320}, - {319, 319}, - {443, 322} +static const NPoint kSsScene2202PuzzleCubePoints[] = { + {196, 105}, {323, 102}, {445, 106}, + {192, 216}, {319, 220}, {446, 216}, + {188, 320}, {319, 319}, {443, 322} }; -static const uint32 kSsScene2202PuzzleTileFileHashes1[] = { - 0xA500800C, - 0x2182910C, - 0x2323980C, - 0x23049084, - 0x21008080, - 0x2303900C, - 0x6120980C, - 0x2504D808 +static const uint32 kSsScene2202PuzzleCubeFileHashes1[] = { + 0xA500800C, 0x2182910C, 0x2323980C, + 0x23049084, 0x21008080, 0x2303900C, + 0x6120980C, 0x2504D808 }; -static const uint32 kSsScene2202PuzzleTileFileHashes2[] = { - 0x0AAD8080, - 0x0A290291, - 0x0A2BA398, - 0x822B8490, - 0x86298080, - 0x0A2B8390, - 0x0A69A098, - 0x0E2D84D8 +static const uint32 kSsScene2202PuzzleCubeFileHashes2[] = { + 0x0AAD8080, 0x0A290291, 0x0A2BA398, + 0x822B8490, 0x86298080, 0x0A2B8390, + 0x0A69A098, 0x0E2D84D8 }; -SsScene2202PuzzleTile::SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value) - : StaticSprite(vm, 900), _parentScene(parentScene), _value(value), _tileIndex(tileIndex), _isMoving(false) { +SsScene2202PuzzleCube::SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol) + : StaticSprite(vm, 900), _parentScene(parentScene), _cubeSymbol(cubeSymbol), _cubePosition(cubePosition), _isMoving(false) { int surfacePriority; - SetUpdateHandler(&SsScene2202PuzzleTile::update); - SetMessageHandler(&SsScene2202PuzzleTile::handleMessage); - if (_tileIndex >= 0 && _tileIndex <= 2) + SetUpdateHandler(&SsScene2202PuzzleCube::update); + SetMessageHandler(&SsScene2202PuzzleCube::handleMessage); + if (_cubePosition >= 0 && _cubePosition <= 2) surfacePriority = 100; - else if (_tileIndex >= 3 && _tileIndex <= 5) + else if (_cubePosition >= 3 && _cubePosition <= 5) surfacePriority = 300; else surfacePriority = 500; - loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0, - kSsScene2202PuzzleTilePoints[_tileIndex].x, kSsScene2202PuzzleTilePoints[_tileIndex].y); + loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0, + kSsScene2202PuzzleCubePoints[_cubePosition].x, kSsScene2202PuzzleCubePoints[_cubePosition].y); loadSound(0, 0x40958621); loadSound(1, 0x51108241); } -void SsScene2202PuzzleTile::update() { +void SsScene2202PuzzleCube::update() { handleSpriteUpdate(); updatePosition(); } -uint32 SsScene2202PuzzleTile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 SsScene2202PuzzleCube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: - if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) { - sendMessage(_parentScene, 0x2000, _tileIndex); - } + if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) + sendMessage(_parentScene, 0x2000, _cubePosition); messageResult = 1; break; case 0x2001: _isMoving = true; - moveTile(param.asInteger()); + moveCube(param.asInteger()); break; } return messageResult; } -void SsScene2202PuzzleTile::suMoveTileX() { +void SsScene2202PuzzleCube::suMoveCubeX() { bool done = false; @@ -732,15 +748,14 @@ void SsScene2202PuzzleTile::suMoveTileX() { _counterDirection = true; } - if (done) { + if (done) stopMoving(); - } updateBounds(); } -void SsScene2202PuzzleTile::suMoveTileY() { +void SsScene2202PuzzleCube::suMoveCubeY() { bool done = false; @@ -767,29 +782,26 @@ void SsScene2202PuzzleTile::suMoveTileY() { _counterDirection = true; } - if (done) { + if (done) stopMoving(); - } updateBounds(); } -void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { +void SsScene2202PuzzleCube::moveCube(int16 newCubePosition) { - loadSprite(kSsScene2202PuzzleTileFileHashes1[_value], kSLFCenteredDrawOffset); + loadSprite(kSsScene2202PuzzleCubeFileHashes1[_cubeSymbol], kSLFCenteredDrawOffset); - setSubVar(VA_CUBE_POSITIONS, _tileIndex, (uint32)-1); - setSubVar(VA_CUBE_POSITIONS, newTileIndex, (uint32)_value); - - _tileIndex = newTileIndex; + setSubVar(VA_CUBE_POSITIONS, _cubePosition, (uint32)-1); + setSubVar(VA_CUBE_POSITIONS, newCubePosition, (uint32)_cubeSymbol); + _cubePosition = newCubePosition; _errValue = 0; _counterDirection = false; _counter = 0; - - _newX = kSsScene2202PuzzleTilePoints[newTileIndex].x; - _newY = kSsScene2202PuzzleTilePoints[newTileIndex].y; + _newX = kSsScene2202PuzzleCubePoints[newCubePosition].x; + _newY = kSsScene2202PuzzleCubePoints[newCubePosition].y; if (_x == _newX && _y == _newY) return; @@ -821,7 +833,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { } if (_xDelta > _yDelta) { - SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileX); + SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeX); if (_xIncr > 0) { if (_newX - _x >= 180) _xFlagPos = _newX - 90; @@ -835,7 +847,7 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { } playSound(0); } else { - SetSpriteUpdate(&SsScene2202PuzzleTile::suMoveTileY); + SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeY); if (_yIncr > 0) { if (_newY - _y >= 180) _xFlagPos = _newY - 90; @@ -852,16 +864,16 @@ void SsScene2202PuzzleTile::moveTile(int16 newTileIndex) { } -void SsScene2202PuzzleTile::stopMoving() { - loadSprite(kSsScene2202PuzzleTileFileHashes2[_value], kSLFCenteredDrawOffset); +void SsScene2202PuzzleCube::stopMoving() { + loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset); SetSpriteUpdate(NULL); _isMoving = false; - sendMessage(_parentScene, 0x2002, _tileIndex); + sendMessage(_parentScene, 0x2002, _cubePosition); } Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isTileMoving(false), - _ssMovingTile(NULL), _ssDoneMovingTile(NULL) { + : Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isCubeMoving(false), + _ssMovingCube(NULL), _ssDoneMovingCube(NULL) { // TODO initScene2201Vars(); SetMessageHandler(&Scene2202::handleMessage); @@ -872,11 +884,11 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); insertMouse435(0x00A08089, 20, 620); - for (uint32 index = 0; index < 9; index++) { - int16 value = (int16)getSubVar(VA_CUBE_POSITIONS, index); - if (value >= 0) { - Sprite *puzzleTileSprite = insertSprite(this, index, value); - _vm->_collisionMan->addSprite(puzzleTileSprite); + for (uint32 cubePosition = 0; cubePosition < 9; cubePosition++) { + int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition); + if (cubeSymbol >= 0) { + Sprite *puzzleCubeSprite = insertSprite(this, cubePosition, cubeSymbol); + _vm->_collisionMan->addSprite(puzzleCubeSprite); } } @@ -899,9 +911,8 @@ Scene2202::~Scene2202() { void Scene2202::update() { Scene::update(); - if (_leaveScene && !isSoundPlaying(1)) { + if (_leaveScene && !isSoundPlaying(1)) leaveScene(0); - } if (_isSolved && !isSoundPlaying(0)) { playSound(1); @@ -909,19 +920,19 @@ void Scene2202::update() { _leaveScene = true; } - if (_ssMovingTile && !_isTileMoving) { - int16 freeTileIndex = getFreeTileIndex(_movingTileIndex); - if (freeTileIndex != -1) { - setSurfacePriority(_ssMovingTile->getSurface(), 700); - sendMessage(_ssMovingTile, 0x2001, freeTileIndex); - _ssMovingTile = NULL; - _isTileMoving = true; + if (_ssMovingCube && !_isCubeMoving) { + int16 freeCubePosition = getFreeCubePosition(_movingCubePosition); + if (freeCubePosition != -1) { + setSurfacePriority(_ssMovingCube->getSurface(), 700); + sendMessage(_ssMovingCube, 0x2001, freeCubePosition); + _ssMovingCube = NULL; + _isCubeMoving = true; } } - if (_ssDoneMovingTile) { - setSurfacePriority(_ssDoneMovingTile->getSurface(), _surfacePriority); - _ssDoneMovingTile = NULL; + if (_ssDoneMovingCube) { + setSurfacePriority(_ssDoneMovingCube->getSurface(), _surfacePriority); + _ssDoneMovingCube = NULL; if (testIsSolved()) { playSound(0); setGlobalVar(V_TILE_PUZZLE_SOLVED, 1); @@ -935,39 +946,37 @@ uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); - } break; case 0x2000: - _movingTileIndex = (int16)param.asInteger(); - _ssMovingTile = (Sprite*)sender; + _movingCubePosition = (int16)param.asInteger(); + _ssMovingCube = (Sprite*)sender; break; case 0x2002: - _isTileMoving = false; - _ssDoneMovingTile = (Sprite*)sender; - if (param.asInteger() <= 2) { + _isCubeMoving = false; + _ssDoneMovingCube = (Sprite*)sender; + if (param.asInteger() <= 2) _surfacePriority = 100; - } else if (param.asInteger() >= 3 && param.asInteger() <= 5) { + else if (param.asInteger() >= 3 && param.asInteger() <= 5) _surfacePriority = 300; - } else { + else _surfacePriority = 500; - } break; } return 0; } -int16 Scene2202::getFreeTileIndex(int16 index) { - if (index >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 3) == -1) { - return index - 3; - } else if (index <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 3) == -1) { - return index + 3; - } else if (index != 0 && index != 3 && index != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, index - 1) == -1) { - return index - 1; - } else if (index != 2 && index != 5 && index != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, index + 1) == -1) { - return index + 1; - } else +int16 Scene2202::getFreeCubePosition(int16 cubePosition) { + if (cubePosition >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 3) == -1) + return cubePosition - 3; + else if (cubePosition <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 3) == -1) + return cubePosition + 3; + else if (cubePosition != 0 && cubePosition != 3 && cubePosition != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 1) == -1) + return cubePosition - 1; + else if (cubePosition != 2 && cubePosition != 5 && cubePosition != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 1) == -1) + return cubePosition + 1; + else return -1; } @@ -1087,8 +1096,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x82C80334); setPalette(0x82C80334); insertMouse433(0x80330824); - setHitRects(0x004B8320); + setRectList(0x004B8420); if (getGlobalVar(V_KEY3_LOCATION) == 1) { _asKey = insertSprite(this, 2, 1100, 282, 432); @@ -1097,37 +1106,35 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _asLeftDoor = insertSprite(this, 0); _asRightDoor = insertSprite(this, 1); - _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); _ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100); - _leftDoorClipRect.set(_ssSmallLeftDoor->getDrawRect().x, 0, 640, 480); _rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480); - sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); - _vm->_collisionMan->addSprite(_asLeftDoor); _vm->_collisionMan->addSprite(_asRightDoor); if (which < 0) { + // Restoring game insertKlayman(200, 427); setMessageList(0x004B8340); } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 427); setMessageList(0x004B8350); } else if (which == 2) { + // Klaymen returning from the displayer if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { insertKlayman(362, 427); _klayman->setDoDeltaX(1); - } else { + } else insertKlayman(202, 427); - } setMessageList(0x004B8358); } else { + // Klaymen entering from the left insertKlayman(0, 427); setMessageList(0x004B8348); } @@ -1140,8 +1147,6 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_leftDoorClipRect); } - setRectList(0x004B8420); - } Scene2203::~Scene2203() { @@ -1153,25 +1158,22 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x2001: sendEntityMessage(_klayman, 0x1014, sender); - if (sender == _asLeftDoor) { + if (sender == _asLeftDoor) setMessageList2(0x004B83B0); - } else { + else setMessageList2(0x004B83C8); - } break; case 0x2002: - if (sender == _asLeftDoor) { + if (sender == _asLeftDoor) setMessageList2(0x004B8370); - } else { + else setMessageList2(0x004B8360); - } break; case 0x2003: - if (sender == _asLeftDoor) { + if (sender == _asLeftDoor) _ssSmallLeftDoor->setVisible(false); - } else { + else _ssSmallRightDoor->setVisible(false); - } break; case 0x4808: if (sender == _asLeftDoor) { @@ -1220,7 +1222,7 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2205::update); setHitRects(0x004B0620); - + loadDataResource(0x00144822); if (getGlobalVar(V_LIGHTS_ON)) { _isLightOn = true; setBackground(0x0008028D); @@ -1236,41 +1238,36 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse433(0xA0289D08); _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); } - _palette->addBasePalette(0xD00A028D, 0, 256, 0); - _ssDoorFrame = insertSprite(); if (which < 0) { + // Restoring game insertKlayman(320, 417); setMessageList(0x004B0658); - if (!getGlobalVar(V_LIGHTS_ON)) { + if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x68033B1C, 0, 65, 0); - } _isKlaymanInLight = false; } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 417); setMessageList(0x004B0648); - if (!getGlobalVar(V_LIGHTS_ON)) { + if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x68033B1C, 0, 65, 0); - } _isKlaymanInLight = false; } else { + // Klaymen entering from the left insertKlayman(0, 417); setMessageList(0x004B0640); _isKlaymanInLight = true; } _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); - - loadDataResource(0x00144822); _klayman->setSoundFlag(true); - } void Scene2205::update() { Scene::update(); - if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) { _palette->addPalette(0x0008028D, 0, 256, 0); changeBackground(0x0008028D); @@ -1291,7 +1288,6 @@ void Scene2205::update() { } _isLightOn = false; } - if (!getGlobalVar(V_LIGHTS_ON)) { if (_isKlaymanInLight && _klayman->getX() > 85) { _palette->addBasePalette(0x68033B1C, 0, 65, 0); @@ -1303,20 +1299,18 @@ void Scene2205::update() { _isKlaymanInLight = true; } } - } uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x6449569A) { + if (param.asInteger() == 0x6449569A) setMessageList(0x004B0690); - } else if (param.asInteger() == 0x2841369C) { + else if (param.asInteger() == 0x2841369C) setMessageList(0x004B0630); - } else if (param.asInteger() == 0x402064D8) { + else if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssLightSwitch); - } break; case 0x480B: setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1); @@ -1326,21 +1320,15 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entit } static const int16 kScene2206XPositions[] = { - 384, - 480, - 572 + 384, 480, 572 }; static const uint32 kScene2206MessageIds1[] = { - 0x004B8998, - 0x004B89B8, - 0x004B89D8 + 0x004B8998, 0x004B89B8, 0x004B89D8 }; static const uint32 kScene2206MessageIds2[] = { - 0x004B89F8, - 0x004B8A20, - 0x004B8A48 + 0x004B89F8, 0x004B8A20, 0x004B8A48 }; static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = { @@ -1371,15 +1359,15 @@ uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam & switch (messageNum) { case 0x4808: _deltaIndex = 0; + playSound(0, 0x032746E0); SetMessageHandler(NULL); SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen); - playSound(0, 0x032746E0); break; case 0x4809: _deltaIndex = 0; + playSound(0, 0x002642C0); SetMessageHandler(NULL); SetSpriteUpdate(&AsScene2206DoorSpikes::suClose); - playSound(0, 0x002642C0); break; } return messageResult; @@ -1422,9 +1410,9 @@ uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam &pa uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x4803: + _yDelta = 0; SetMessageHandler(NULL); SetSpriteUpdate(&AsScene2206Platform::suMoveDown); - _yDelta = 0; break; } return messageResult; @@ -1441,9 +1429,8 @@ SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene if (getGlobalVar(V_HAS_TEST_TUBE)) { setVisible(false); SetMessageHandler(NULL); - } else { + } else SetMessageHandler(&SsScene2206TestTube::handleMessage); - } _collisionBoundsOffset = _drawOffset; updateBounds(); } @@ -1499,38 +1486,37 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) } _asPlatform->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); - setBackground(fileHash); - setPalette(fileHash); addEntity(_palette); - _palette->addBasePalette(fileHash, 0, 256, 0); - - if (!getGlobalVar(V_LIGHTS_ON)) { + if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x0263D144, 0, 65, 0); - } - _vm->_collisionMan->addSprite(_ssTestTube); if (which < 0) { + // Restoring game insertKlayman(200, 430); setMessageList(0x004B88A8); } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 430); setMessageList(0x004B88B8); } else if (which == 2) { + // Klaymen entering from the back insertKlayman(205, 396); setMessageList(0x004B88C8); _palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0); klaymanBehindSpikes(); playSound(0, 0x53B8284A); } else if (which == 3) { + // Klaymen entering from reading a text column insertKlayman(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430); if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); setMessageList(0x004B8A70); } else { + // Klaymen entering from the left insertKlayman(0, 430); setMessageList(0x004B88B0); } @@ -1548,11 +1534,11 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x800C6694) { + if (param.asInteger() == 0x800C6694) readClickedColumn(); - } else if (param.asInteger() == 0x402064D8) { + else if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssButton); - } else if (param.asInteger() == 0x11C40840) { + else if (param.asInteger() == 0x11C40840) { if (getGlobalVar(V_SPIKES_RETRACTED)) setMessageList(0x004B8948); else @@ -1616,26 +1602,17 @@ void Scene2206::readClickedColumn() { setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7); setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); setGlobalVar(V_COLUMN_BACK_NAME, 0); - if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144) { + if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144) setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); - } else { + else setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); - } } static const uint32 kScene2207FileHashes[] = { - 0x33B1E12E, - 0x33D1E12E, - 0x3311E12E, - 0x3291E12E, - 0x3191E12E, - 0x3791E12E, - 0x3B91E12E, - 0x2391E12E, - 0x1391E12E, - 0x3BB1E12E, - 0x23B1E12E, - 0x13B1E12E + 0x33B1E12E, 0x33D1E12E, 0x3311E12E, + 0x3291E12E, 0x3191E12E, 0x3791E12E, + 0x3B91E12E, 0x2391E12E, 0x1391E12E, + 0x3BB1E12E, 0x23B1E12E, 0x13B1E12E }; AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene) @@ -1650,10 +1627,10 @@ AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene _y = pt.y; createSurface(1100, 129, 103); startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0); + _newStickFrameIndex = 0; SetUpdateHandler(&AsScene2207Elevator::update); - SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); SetMessageHandler(&AsScene2207Elevator::handleMessage); - _newStickFrameIndex = 0; + SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); } AsScene2207Elevator::~AsScene2207Elevator() { @@ -1667,9 +1644,9 @@ void AsScene2207Elevator::update() { startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); _newStickFrameIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { - if (_destPointIndexDelta != 0) { + if (_destPointIndexDelta != 0) _destPointIndexDelta = 0; - } else { + else { _vm->_soundMan->deleteSound(0xD3B02847); playSound(0, 0x53B8284A); } @@ -1683,20 +1660,19 @@ void AsScene2207Elevator::update() { startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); _newStickFrameIndex = _pointIndex; if (_destPointIndex + _destPointIndexDelta == _pointIndex) { - if (_destPointIndexDelta != 0) { + if (_destPointIndexDelta != 0) _destPointIndexDelta = 0; - } else { + else { _vm->_soundMan->deleteSound(0xD3B02847); playSound(0, 0x53B8284A); } } } - if (_pointIndex > 20 && _surface->getPriority() != 900) { + if (_pointIndex > 20 && _surface->getPriority() != 900) sendMessage(_parentScene, 0x2002, 900); - } else if (_pointIndex < 20 && _surface->getPriority() != 1100) { + else if (_pointIndex < 20 && _surface->getPriority() != 1100) sendMessage(_parentScene, 0x2002, 1100); - } AnimatedSprite::update(); @@ -1738,13 +1714,12 @@ void AsScene2207Elevator::moveToY(int16 y) { } if (_destPointIndex != _pointIndex) { - if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) { + if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) _destPointIndexDelta = 0; - } else if (_destPointIndex < _pointIndex) { + else if (_destPointIndex < _pointIndex) _destPointIndexDelta = -2; - } else { + else _destPointIndexDelta = 2; - } _vm->_soundMan->addSound(0x02700413, 0xD3B02847); _vm->_soundMan->playSoundLooping(0xD3B02847); } @@ -1756,14 +1731,14 @@ void AsScene2207Elevator::moveToY(int16 y) { AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207Lever::handleMessage); + _x = x; + _y = y; createSurface(1010, 71, 73); setDoDeltaX(doDeltaX); startAnimation(0x80880090, 0, -1); _newStickFrameIndex = 0; - _x = x; - _y = y; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207Lever::handleMessage); } uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1795,8 +1770,8 @@ uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m void AsScene2207Lever::stLeverDown() { startAnimation(0x80880090, 1, -1); - FinalizeState(&AsScene2207Lever::stLeverDownEvent); playSound(0, 0x40581882); + FinalizeState(&AsScene2207Lever::stLeverDownEvent); } void AsScene2207Lever::stLeverDownEvent() { @@ -1805,9 +1780,9 @@ void AsScene2207Lever::stLeverDownEvent() { void AsScene2207Lever::stLeverUp() { startAnimation(0x80880090, 6, -1); - FinalizeState(&AsScene2207Lever::stLeverUpEvent); _playBackwards = true; playSound(0, 0x40581882); + FinalizeState(&AsScene2207Lever::stLeverUpEvent); } void AsScene2207Lever::stLeverUpEvent() { @@ -1817,16 +1792,16 @@ void AsScene2207Lever::stLeverUpEvent() { AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) : AnimatedSprite(vm, 1200), _idle(true) { - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); - createSurface1(0xCCFD6090, 100); _x = 309; _y = 320; + createSurface1(0xCCFD6090, 100); startAnimation(0xCCFD6090, 0, -1); _newStickFrameIndex = 0; loadSound(1, 0x40330872); loadSound(2, 0x72A2914A); loadSound(3, 0xD4226080); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); } AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { @@ -1847,15 +1822,14 @@ uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const Messag stopSound(2); stopSound(3); _vm->_soundMan->deleteSound(0x12121943); - } else if (param.asInteger() == 0x3A980501) { + } else if (param.asInteger() == 0x3A980501) playSound(1); - } else if (param.asInteger() == 0x2A2AD498) { + else if (param.asInteger() == 0x2A2AD498) playSound(2); - } else if (param.asInteger() == 0xC4980008) { + else if (param.asInteger() == 0xC4980008) playSound(3); - } else if (param.asInteger() == 0x06B84228) { + else if (param.asInteger() == 0x06B84228) playSound(0, 0xE0702146); - } } break; case 0x2006: @@ -1899,13 +1873,13 @@ void AsScene2207WallRobotAnimation::cbStopAnimation() { AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200), _idle(true) { - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage); - createSurface1(0x8CAA0099, 100); _x = 309; _y = 320; + createSurface1(0x8CAA0099, 100); startAnimation(0x8CAA0099, 0, -1); _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage); } uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1952,7 +1926,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i updatePosition(); } -Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) +Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { _vm->gameModule()->initCannonSymbolsPuzzle(); @@ -1965,66 +1939,47 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(0, 0); _klayman->setRepl(64, 0); - setMessageList(0x004B38E8); - _asElevator = insertSprite(this); if (getGlobalVar(V_LIGHTS_ON)) { - setBackground(0x88C00241); setPalette(0x88C00241); insertMouse433(0x00245884); - _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); - _asTape = insertSprite(this, 4, 1100, 277, 428, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - _asLever = insertSprite(this, 527, 333, 0); _vm->_collisionMan->addSprite(_asLever); - _asWallRobotAnimation = insertSprite(this); _asWallCannonAnimation = insertSprite(); - _asWallRobotAnimation->setVisible(false); _asWallCannonAnimation->setVisible(false); - _ssButton = insertSprite(this, 0x2C4061C4, 100, 0); - _asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480); _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); - } else { - setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1); - setBackground(0x05C02A55); setPalette(0x05C02A55); insertMouse433(0x02A51054); - _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); - insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0); insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1); insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 2)], 2); - _asTape = NULL; _asLever = NULL; _asWallRobotAnimation = NULL; _asWallCannonAnimation = NULL; _ssButton = NULL; - _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); - } _dataResource.load(0x00524846); - setRectList(0x004B38B8); sendEntityMessage(_klayman, 0x1014, _asElevator); @@ -2041,9 +1996,8 @@ void Scene2207::update() { setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority); _elevatorSurfacePriority = 0; } - if (_klayman->getY() == 423) { + if (_klayman->getY() == 423) _klaymanAtElevator = _klayman->getX() > 459 && _klayman->getX() < 525; - } } uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2055,38 +2009,34 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asElevator, 0x2000, _mouseClickPos.y); sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); - } else { + } else cancelMessageList(); - } } else if (param.asInteger() == 0x34569073) { if (_klaymanAtElevator) { _isKlaymanBusy = true; sendMessage(_asElevator, 0x2000, 0); sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); - } else { + } else cancelMessageList(); - } } else if (param.asInteger() == 0x4054C877) { if (_klaymanAtElevator) { sendMessage(_asElevator, 0x2000, 480); sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); - } else { + } else cancelMessageList(); - } } else if (param.asInteger() == 0x0CBC6211) { sendEntityMessage(_klayman, 0x1014, _asElevator); sendMessage(_klayman, 0x2001, 0); setRectList(0x004B38B8); - } else if (param.asInteger() == 0x402064D8) { + } else if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssButton); - } else if (param.asInteger() == 0x231DA241) { - if (_ssButton) { + else if (param.asInteger() == 0x231DA241) { + if (_ssButton) setMessageList(0x004B38F0); - } else { + else setMessageList(0x004B37D8); - } } break; case 0x2002: @@ -2183,14 +2133,11 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _background->createSurface(0, 640, 528); _background->getSpriteResource().getPosition().y = 480; addBackground(_background); - setPalette(0x08100289); - addEntity(_palette); // Why? - + addEntity(_palette); insertMouse435(0x0028D089, 40, 600); createFontSurface(); - _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); spriteResource.load2(0x08100289); _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); @@ -2207,17 +2154,13 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2208::handleMessage); _visibleRowsCount = 10; - _newRowIndex = (int16)getGlobalVar(V_CLICKED_COLUMN_ROW); if (_newRowIndex + _visibleRowsCount > _maxRowIndex) _newRowIndex = _maxRowIndex - _visibleRowsCount; if (_newRowIndex < 6) _newRowIndex = 0; - _rowScrollY = 0; - _backgroundScrollY = 48 * _newRowIndex; - _currRowIndex = _newRowIndex; for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++) @@ -2253,9 +2196,8 @@ void Scene2208::update() { } if (_currRowIndex < _newRowIndex) { - if (_rowScrollY == 0) { + if (_rowScrollY == 0) drawRow(_currRowIndex + _visibleRowsCount); - } _backgroundScrollY += 4; _rowScrollY += 4; if (_rowScrollY == 48) { @@ -2284,9 +2226,8 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 40 || param.asPoint().x >= 600) { + if (param.asPoint().x <= 40 || param.asPoint().x >= 600) leaveScene(0); - } break; } return messageResult; @@ -2372,17 +2313,21 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_collisionMan->addSprite(_asTape); if (which < 0) { + // Restoring game insertKlayman(200, 430); setMessageList(0x004B3C18); } else if (which == 1) { + // Klaymen entering from looking through the window insertKlayman(530, 430); setMessageList(0x004B3D60); } else if (which == 2) { + // Klaymen returning from reading a text column insertKlayman(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430); setMessageList(0x004B3D48); if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); } else { + // Klaymen entering from the left insertKlayman(0, 430); setMessageList(0x004B3C20); } @@ -2414,9 +2359,8 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x800C6694) { + if (param.asInteger() == 0x800C6694) readClickedColumn(); - } break; case 0x4826: if (sender == _asTape) { @@ -2442,11 +2386,10 @@ void Scene2242::readClickedColumn() { index = 1; } setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) { + if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) setMessageList2(kScene2242MessageListIds1[index]); - } else { + else setMessageList2(kScene2242MessageListIds2[index]); - } } static const int16 kHallOfRecordsKlaymanXPos[] = { @@ -2464,38 +2407,42 @@ static const uint32 kHallOfRecordsSceneMessageListIds1[] = { 0x004B2AF8, 0x004B2B20, 0x004B2B48 }; -HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id) +HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId) : Scene(vm, parentModule, true) { - _sceneInfo140 = _vm->_staticData->getSceneInfo140Item(sceneInfo140Id); + _hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId); SetMessageHandler(&HallOfRecordsScene::handleMessage); SetUpdateHandler(&Scene::update); - if (!getGlobalVar(V_LIGHTS_ON) && _sceneInfo140->bgFilename2) { + if (!getGlobalVar(V_LIGHTS_ON) && _hallOfRecordsInfo->bgFilename2) { setRectList(0x004B2BF8); - setBackground(_sceneInfo140->bgFilename2); - setPalette(_sceneInfo140->bgFilename2); + setBackground(_hallOfRecordsInfo->bgFilename2); + setPalette(_hallOfRecordsInfo->bgFilename2); insertMouse433(0x14320138); } else { setRectList(0x004B2BB8); - setBackground(_sceneInfo140->bgFilename1); - setPalette(_sceneInfo140->bgFilename1); + setBackground(_hallOfRecordsInfo->bgFilename1); + setPalette(_hallOfRecordsInfo->bgFilename1); insertMouse433(0x63A40028); } if (which < 0) { + // Restoring game insertKlayman(200, 430); setMessageList(0x004B2900); } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 430); setMessageList(0x004B2910); } else if (which == 2) { - insertKlayman(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _sceneInfo140->xPosIndex], 430); + // Klaymen returning from reading a text column + insertKlayman(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _hallOfRecordsInfo->xPosIndex], 430); setMessageList(0x004B2B70); if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); } else { + // Klaymen entering from the left insertKlayman(0, 430); setMessageList(0x004B2908); } @@ -2513,9 +2460,8 @@ uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &par uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x800C6694) { + if (param.asInteger() == 0x800C6694) readClickedColumn(); - } break; } return messageResult; @@ -2523,22 +2469,20 @@ uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam &par void HallOfRecordsScene::readClickedColumn() { int16 index = (_mouseClickPos.x - 23) / 89; - if (index >= _sceneInfo140->count) { + if (index >= _hallOfRecordsInfo->count) setMessageList2(0x004B2920); - } else { - setGlobalVar(V_CLICKED_COLUMN_INDEX, _sceneInfo140->xPosIndex + index); + else { + setGlobalVar(V_CLICKED_COLUMN_INDEX, _hallOfRecordsInfo->xPosIndex + index); setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - setGlobalVar(V_COLUMN_TEXT_NAME, _sceneInfo140->txFilename); - if (index == 0 && _sceneInfo140->bgFilename3) { - setGlobalVar(V_COLUMN_BACK_NAME, _sceneInfo140->bgFilename3); - } else { + setGlobalVar(V_COLUMN_TEXT_NAME, _hallOfRecordsInfo->txFilename); + if (index == 0 && _hallOfRecordsInfo->bgFilename3) + setGlobalVar(V_COLUMN_BACK_NAME, _hallOfRecordsInfo->bgFilename3); + else setGlobalVar(V_COLUMN_BACK_NAME, 0); - } - if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) { + if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) setMessageList2(kHallOfRecordsSceneMessageListIds1[index]); - } else { + else setMessageList2(kHallOfRecordsSceneMessageListIds2[index]); - } } } @@ -2557,9 +2501,6 @@ static const uint32 kScene2247MessageListIds1[] = { Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { - //DEBUG - setGlobalVar(V_LIGHTS_ON, 1); - SetMessageHandler(&Scene2247::handleMessage); SetUpdateHandler(&Scene::update); @@ -2576,17 +2517,21 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) } if (which < 0) { + // Restoring game insertKlayman(200, 430); setMessageList(0x004B5428); } else if (which == 1) { + // Klaymen entering from the right insertKlayman(640, 430); setMessageList(0x004B5438); } else if (which == 2) { + // Klaymen returning from reading a text column insertKlayman(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430); if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) _klayman->setDoDeltaX(1); setMessageList(0x004B5530); } else { + // Klaymen entering from the left insertKlayman(0, 430); setMessageList(0x004B5430); } @@ -2603,9 +2548,8 @@ uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x800C6694) { + if (param.asInteger() == 0x800C6694) readClickedColumn(); - } break; } return messageResult; @@ -2624,11 +2568,10 @@ void Scene2247::readClickedColumn() { } setGlobalVar(V_CLICKED_COLUMN_INDEX, 0); setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) { + if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) setMessageList2(kScene2247MessageListIds1[index]); - } else { + else setMessageList2(kScene2247MessageListIds2[index]); - } } } // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 625990bfca..34be267645 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -38,9 +38,10 @@ public: Module2200(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2200(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); - void createHallOfRecordsScene(int which, uint32 sceneInfo140Id); + void createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId); }; // Scene2201 @@ -63,11 +64,11 @@ public: class AsScene2201Door : public AnimatedSprite { public: - AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool flag1); + AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool isOpen); protected: Klayman *_klayman; Sprite *_ssDoorLight; - bool _doorOpen; + bool _isOpen; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -95,13 +96,13 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -class SsScene2202PuzzleTile : public StaticSprite { +class SsScene2202PuzzleCube : public StaticSprite { public: - SsScene2202PuzzleTile(NeverhoodEngine *vm, Scene *parentScene, int16 tileIndex, int16 value); + SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol); protected: Scene *_parentScene; - int16 _value; - int16 _tileIndex; + int16 _cubeSymbol; + int16 _cubePosition; int16 _newX, _newY; int16 _xDelta, _yDelta; int16 _xIncr; @@ -113,9 +114,9 @@ protected: bool _isMoving; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoveTileX(); - void suMoveTileY(); - void moveTile(int16 newTileIndex); + void suMoveCubeX(); + void suMoveCubeY(); + void moveCube(int16 newCubePosition); void stopMoving(); }; @@ -124,16 +125,16 @@ public: Scene2202(NeverhoodEngine *vm, Module *parentModule, int which); ~Scene2202(); protected: - Sprite *_ssMovingTile; - Sprite *_ssDoneMovingTile; - bool _isTileMoving; - int16 _movingTileIndex; + Sprite *_ssMovingCube; + Sprite *_ssDoneMovingCube; + bool _isCubeMoving; + int16 _movingCubePosition; int _surfacePriority; bool _leaveScene; bool _isSolved; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - int16 getFreeTileIndex(int16 index); + int16 getFreeCubePosition(int16 index); bool testIsSolved(); }; @@ -298,7 +299,7 @@ public: class Scene2207 : public Scene { public: - Scene2207(NeverhoodEngine *vm, Module *parentModule, int which); + Scene2207(NeverhoodEngine *vm, Module *parentModule); protected: Sprite *_asElevator; Sprite *_ssMaskPart1; @@ -332,7 +333,7 @@ protected: int16 _rowScrollY; int16 _maxRowIndex; int16 _visibleRowsCount; - Common::Array _strings; // TODO: Move to TextResource + Common::Array _strings; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createFontSurface(); @@ -353,10 +354,10 @@ protected: class HallOfRecordsScene : public Scene { public: - HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfo140Id); + HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId); ~HallOfRecordsScene(); protected: - SceneInfo140 *_sceneInfo140; + HallOfRecordsInfo *_hallOfRecordsInfo; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void readClickedColumn(); }; diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 147a319d2e..1a633e289a 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -125,19 +125,19 @@ void StaticData::load(const char *filename) { _navigationLists[id] = navigationList; } - // Load SceneInfo140 items - uint32 sceneInfo140ItemsCount = fd.readUint32LE(); - debug("sceneInfo140ItemsCount: %d", sceneInfo140ItemsCount); - for (uint32 i = 0; i < sceneInfo140ItemsCount; i++) { - SceneInfo140 *sceneInfo140 = new SceneInfo140(); + // Load HallOfRecordsInfo items + uint32 hallOfRecordsInfoItemsCount = fd.readUint32LE(); + debug("hallOfRecordsInfoItemsCount: %d", hallOfRecordsInfoItemsCount); + for (uint32 i = 0; i < hallOfRecordsInfoItemsCount; i++) { + HallOfRecordsInfo *hallOfRecordsInfo = new HallOfRecordsInfo(); uint32 id = fd.readUint32LE(); - sceneInfo140->bgFilename1 = fd.readUint32LE(); - sceneInfo140->bgFilename2 = fd.readUint32LE(); - sceneInfo140->txFilename = fd.readUint32LE(); - sceneInfo140->bgFilename3 = fd.readUint32LE(); - sceneInfo140->xPosIndex = fd.readByte(); - sceneInfo140->count = fd.readByte(); - _sceneInfo140Items[id] = sceneInfo140; + hallOfRecordsInfo->bgFilename1 = fd.readUint32LE(); + hallOfRecordsInfo->bgFilename2 = fd.readUint32LE(); + hallOfRecordsInfo->txFilename = fd.readUint32LE(); + hallOfRecordsInfo->bgFilename3 = fd.readUint32LE(); + hallOfRecordsInfo->xPosIndex = fd.readByte(); + hallOfRecordsInfo->count = fd.readByte(); + _hallOfRecordsInfoItems[id] = hallOfRecordsInfo; } // Load SceneInfo2700 items @@ -185,10 +185,10 @@ NavigationList *StaticData::getNavigationList(uint32 id) { return _navigationLists[id]; } -SceneInfo140 *StaticData::getSceneInfo140Item(uint32 id) { - if (!_sceneInfo140Items[id]) - error("StaticData::getSceneInfo140Item() SceneInfo140 with id %08X not found", id); - return _sceneInfo140Items[id]; +HallOfRecordsInfo *StaticData::getHallOfRecordsInfoItem(uint32 id) { + if (!_hallOfRecordsInfoItems[id]) + error("StaticData::getHallOfRecordsInfoItem() HallOfRecordsInfo with id %08X not found", id); + return _hallOfRecordsInfoItems[id]; } SceneInfo2700 *StaticData::getSceneInfo2700(uint32 id) { diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index 2a2db556e0..69a407bdcb 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -68,7 +68,7 @@ struct NavigationItem { typedef Common::Array NavigationList; -struct SceneInfo140 { +struct HallOfRecordsInfo { uint32 bgFilename1; uint32 bgFilename2; uint32 txFilename; @@ -100,14 +100,14 @@ public: RectList *getRectList(uint32 id); MessageList *getMessageList(uint32 id); NavigationList *getNavigationList(uint32 id); - SceneInfo140 *getSceneInfo140Item(uint32 id); + HallOfRecordsInfo *getHallOfRecordsInfoItem(uint32 id); SceneInfo2700 *getSceneInfo2700(uint32 id); protected: Common::HashMap _hitRectLists; Common::HashMap _rectLists; Common::HashMap _messageLists; Common::HashMap _navigationLists; - Common::HashMap _sceneInfo140Items; + Common::HashMap _hallOfRecordsInfoItems; Common::HashMap _sceneInfo2700Items; }; -- cgit v1.2.3 From 61e2a6f81d570c52485f610e84316ce63c9bfcba Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 17:15:35 +0000 Subject: NEVERHOOD: Clean up Module2300 (like the ones before) - Also fix previous modules (oops) --- engines/neverhood/module1100.cpp | 4 +-- engines/neverhood/module1800.cpp | 2 +- engines/neverhood/module2300.cpp | 70 ++++++++++++++++++++-------------------- engines/neverhood/module2300.h | 3 +- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 6dcc5f9235..cc6284b0cc 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -66,7 +66,7 @@ void Module1100::createScene(int sceneNum, int which) { static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0}; debug("Module1100::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: _vm->gameState().sceneNum = 0; _countdown = 65; @@ -206,7 +206,7 @@ void Module1100::updateScene() { break; } } else { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) { _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index fbb9483219..30bffb9a79 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -170,7 +170,7 @@ void Module1800::updateScene() { break; } } else { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) _vm->_soundMan->setTwoSoundsPlayFlag(false); diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 9b1945a6e6..2c43afef38 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -36,9 +36,9 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList); _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); - _flag = getGlobalVar(V_WALL_BROKEN) == 0; + _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; - if (_flag) { + if (_isWallBroken) { _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); _vm->_soundMan->playSoundLooping(0x90F0D1C3); } else { @@ -48,19 +48,18 @@ Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); _vm->_soundMan->playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 1) { + else if (which == 1) createScene(2, 0); - } else if (which == 2) { + else if (which == 2) createScene(3, 0); - } else if (which == 3) { + else if (which == 3) createScene(4, -1); - } else if (which == 4) { + else if (which == 4) createScene(1, 3); - } else { + else createScene(0, 1); - } } @@ -70,34 +69,39 @@ Module2300::~Module2300() { void Module2300::createScene(int sceneNum, int which) { debug("Module2300::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; createNavigationScene(0x004B67B8, which); break; case 1: + _vm->gameState().sceneNum = 1; createNavigationScene(0x004B67E8, which); - if (_flag) { + if (_isWallBroken) { _soundVolume = 15; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 15); } break; case 2: + _vm->gameState().sceneNum = 2; createNavigationScene(0x004B6878, which); break; case 3: - if (getGlobalVar(V_WALL_BROKEN)) { + _vm->gameState().sceneNum = 3; + if (getGlobalVar(V_WALL_BROKEN)) createNavigationScene(0x004B68F0, which); - } else { + else { _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); createNavigationScene(0x004B68A8, which); - if (_flag) { + if (_isWallBroken) { _soundVolume = 87; _vm->_soundMan->setSoundVolume(0x90F0D1C3, 87); } } break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->setTwoSoundsPlayFlag(true); createSmackerScene(0x20080A0B, true, true, false); break; @@ -108,42 +112,38 @@ void Module2300::createScene(int sceneNum, int which) { void Module2300::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(1, 4); - } else { + else leaveModule(0); - } break; case 1: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(0, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(2, 1); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createScene(1, 3); - } else if (_moduleResult == 4) { + else if (_moduleResult == 4) createScene(3, 1); - } else if (_moduleResult == 5) { + else if (_moduleResult == 5) leaveModule(3); - } else { + else leaveModule(4); - } break; case 2: - if (_moduleResult == 1) { + if (_moduleResult == 1) leaveModule(3); - } else { + else createScene(1, 5); - } break; case 3: - if (_moduleResult == 1) { + if (_moduleResult == 1) leaveModule(2); - } else { + else createScene(1, 1); - } break; case 4: _vm->_soundMan->setTwoSoundsPlayFlag(false); @@ -151,9 +151,9 @@ void Module2300::updateScene() { break; } } else { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 1: - if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && + if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && navigationScene()->getFrameNumber() % 2) { _soundVolume++; _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); @@ -166,7 +166,7 @@ void Module2300::updateScene() { } break; case 3: - if (_flag && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) { + if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) { _soundVolume--; _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); } diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h index ed39a45b35..64f6c6d937 100644 --- a/engines/neverhood/module2300.h +++ b/engines/neverhood/module2300.h @@ -36,7 +36,8 @@ public: Module2300(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2300(); protected: - bool _flag; + int _sceneNum; + bool _isWallBroken; int _soundVolume; void createScene(int sceneNum, int which); void updateScene(); -- cgit v1.2.3 From 38df3c0d62624bd078b9b7bad7d51110053d6e01 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 17:58:59 +0000 Subject: NEVERHOOD: Clean up Module2400 (like the ones before) - Fix Klayman::stTurnToFront() --- engines/neverhood/gamemodule.cpp | 13 ++- engines/neverhood/klayman.cpp | 2 +- engines/neverhood/module2400.cpp | 213 +++++++++++++++++---------------------- engines/neverhood/module2400.h | 3 +- 4 files changed, 105 insertions(+), 126 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 5fec376464..cd6c88efbd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -308,6 +308,13 @@ void GameModule::startup() { //setGlobalVar(V_PROJECTOR_LOCATION, 4); setGlobalVar(V_KEYDOOR_UNLOCKED, 1); setGlobalVar(V_LIGHTS_ON, 1); + setGlobalVar(V_WATER_RUNNING, 1); + setGlobalVar(V_HAS_TEST_TUBE, 1); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, 0, 3); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, 1, 1); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, 2, 2); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, 3, 0); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4); // <<gameState().which = 2; - _vm->gameState().sceneNum = 41; - createModule(2200, -1); + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 0; + createModule(2400, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 9e9f136739..88a878c326 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -1825,7 +1825,7 @@ void Klayman::stTurnToFront() { if (!stStartAction(AnimationCallback(&Klayman::stTurnToFront))) { _status2 = 0; _acceptInput = false; - startAnimationByHash(0xCA221107, 0x8520108C, 0); + startAnimationByHash(0xCA221107, 0, 0x8520108C); SetUpdateHandler(&Klayman::update); SetMessageHandler(&Klayman::hmWalkToFront); SetSpriteUpdate(&Klayman::suUpdateDestX); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index ccc47d009f..3acb8b4a1f 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -29,11 +29,10 @@ Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addMusic(0x202D1010, 0xB110382D); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, _vm->gameState().which); - } else { + else createScene(0, 0); - } } @@ -43,39 +42,48 @@ Module2400::~Module2400() { void Module2400::createScene(int sceneNum, int which) { debug("Module2400::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _vm->_soundMan->stopMusic(0xB110382D, 0, 0); _childObject = new Scene2401(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; _vm->_soundMan->startMusic(0xB110382D, 0, 2); _childObject = new Scene2402(_vm, this, which); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->startMusic(0xB110382D, 0, 0); _childObject = new Scene2403(_vm, this, which); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->stopMusic(0xB110382D, 0, 2); _childObject = new DiskplayerScene(_vm, this, 0); break; case 5: + _vm->gameState().sceneNum = 5; _vm->_soundMan->startMusic(0xB110382D, 0, 2); _childObject = new Scene2406(_vm, this, which); break; case 6: + _vm->gameState().sceneNum = 6; _vm->_soundMan->stopMusic(0xB110382D, 0, 2); createSmackerScene(0x20D80001, true, true, false); break; case 7: + _vm->gameState().sceneNum = 7; createStaticScene(0x81523218, 0x2321C81D); break; case 8: + _vm->gameState().sceneNum = 8; createStaticScene(0x08100210, 0x00214089); break; case 9: + _vm->gameState().sceneNum = 9; createStaticScene(0x8C020505, 0x205018C8); break; } @@ -85,7 +93,7 @@ void Module2400::createScene(int sceneNum, int which) { void Module2400::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (_moduleResult == 1) createScene(1, 0); @@ -138,42 +146,25 @@ void Module2400::updateScene() { } static const NPoint kScene2401Points[] = { - {384, 389}, - {406, 389}, - {429, 389}, - {453, 389}, - {477, 389} + {384, 389}, {406, 389}, {429, 389}, + {453, 389}, {477, 389} }; static const uint32 kScene2401FileHashes1[] = { - 0x02842920, - 0x02882920, - 0x02902920, - 0x02A02920, - 0x02C02920, - 0x02002920, - 0x03802920, - 0x00802920, - 0x06802920, + 0x02842920, 0x02882920, 0x02902920, + 0x02A02920, 0x02C02920, 0x02002920, + 0x03802920, 0x00802920, 0x06802920, 0x03842920 }; static const uint32 kScene2401FileHashes2[] = { - 0xD0910020, - 0xD0910038, - 0xD0910008, - 0xD0910068, - 0xD09100A8, - 0 + 0xD0910020, 0xD0910038, 0xD0910008, + 0xD0910068, 0xD09100A8, 0 }; static const uint32 kScene2401FileHashes3[] = { - 0xD0910020, - 0xD0910038, - 0xD0910008, - 0xD0910068, - 0xD09100A8, - 0 + 0xD0910020, 0xD0910038, 0xD0910008, + 0xD0910068, 0xD09100A8, 0 }; static const NRect kScene2401Rects[] = { @@ -185,31 +176,25 @@ static const NRect kScene2401Rects[] = { }; static const uint32 kAsScene2401WaterSpitFileHashes2[] = { - 0x5C044690, - 0x5C644690, - 0x5CA44690, - 0x5D244690, - 0x5E244690 + 0x5C044690, 0x5C644690, 0x5CA44690, + 0x5D244690, 0x5E244690 }; static const uint32 kAsScene2401WaterSpitFileHashes1[] = { - 0xF4418408, - 0xF4418808, - 0xF4419008, - 0xF441A008, - 0xCD4F8411 + 0xF4418408, 0xF4418808, 0xF4419008, + 0xF441A008, 0xCD4F8411 }; AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200) { - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2401WaterSpit::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - createSurface(100, 146, 74); _x = 240; _y = 447; + createSurface(100, 146, 74); setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2401WaterSpit::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); } uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -223,9 +208,9 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p _x = 240; _y = 447; _soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()); - playSound(0, 0x48640244); startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1); setVisible(true); + playSound(0, 0x48640244); break; case 0x3002: stopAnimation(); @@ -238,12 +223,12 @@ uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam &p AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200), _isWaterFlowing(false) { - createSurface1(0x10203116, 100); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2401FlowingWater::handleMessage); _x = 88; _y = 421; + createSurface1(0x10203116, 100); setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2401FlowingWater::handleMessage); } AsScene2401FlowingWater::~AsScene2401FlowingWater() { @@ -254,9 +239,8 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (_isWaterFlowing && param.asInteger() == 0x02421405) { + if (_isWaterFlowing && param.asInteger() == 0x02421405) startAnimationByHash(0x10203116, 0x01084280, 0); - } break; case 0x2002: if (!_isWaterFlowing) { @@ -282,12 +266,12 @@ uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y) : AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) { - createSurface1(0xB8596884, 100); - SetUpdateHandler(&AsScene2401WaterFlushing::update); - SetMessageHandler(&AsScene2401WaterFlushing::handleMessage); _x = x; _y = y; + createSurface1(0xB8596884, 100); setVisible(false); + SetUpdateHandler(&AsScene2401WaterFlushing::update); + SetMessageHandler(&AsScene2401WaterFlushing::handleMessage); } void AsScene2401WaterFlushing::update() { @@ -325,12 +309,10 @@ uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessagePara AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) : AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) { - createSurface1(0x44687810, 100); _x = 320; _y = 240; + createSurface1(0x44687810, 100); _newStickFrameIndex = STICK_LAST_FRAME; - SetUpdateHandler(&AsScene2401Door::update); - SetMessageHandler(&AsScene2401Door::handleMessage); if (_isOpen) { stopAnimation(); setVisible(false); @@ -339,6 +321,8 @@ AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) startAnimation(0x44687810, 0, -1); _newStickFrameIndex = 0; } + SetUpdateHandler(&AsScene2401Door::update); + SetMessageHandler(&AsScene2401Door::handleMessage); } void AsScene2401Door::update() { @@ -384,14 +368,11 @@ void AsScene2401Door::stDoorOpenFinished() { } Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _flag(false), + : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _unkFlag(false), _soundToggle(false), _asWaterSpitIndex(0) { _vm->gameModule()->initWaterPipesPuzzle(); - setGlobalVar(V_WATER_RUNNING, 1); //DEBUG! Enables water - setGlobalVar(V_HAS_TEST_TUBE, 1); //DEBUG! Gives the test tube - SetMessageHandler(&Scene2401::handleMessage); SetUpdateHandler(&Scene2401::update); @@ -422,16 +403,19 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) _asWaterSpit[1] = insertSprite(); if (which < 0) { + // Restoring game insertKlayman(200, 447); setMessageList(0x004B2F70); _asDoor = insertSprite(false); } else if (which == 1) { + // Klaymen entering from the back insertKlayman(280, 413); setMessageList(0x004B2F80); _palette->addBasePalette(0xB103B604, 0, 65, 0); _palette->addPalette(0xB103B604, 0, 65, 0); _asDoor = insertSprite(true); } else { + // Klaymen entering from the left insertKlayman(-20, 447); setMessageList(0x004B2F78); _asDoor = insertSprite(false); @@ -446,10 +430,10 @@ void Scene2401::update() { _ssWaterPipes[_pipeStatus - 1]->setVisible(false); if (_pipeStatus >= 10) { bool puzzleSolved = true, waterInside = false; - for (uint i = 0; i < 5; i++) { - if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, i)) + for (uint pipeIndex = 0; pipeIndex < 5; pipeIndex++) { + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, pipeIndex)) puzzleSolved = false; - if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, i) != 0) + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != 0) waterInside = true; } if (puzzleSolved) { @@ -475,9 +459,8 @@ void Scene2401::update() { _pipeStatus++; } - if (_countdown2 != 0 && (--_countdown2) == 0) { + if (_countdown2 != 0 && (--_countdown2) == 0) sendMessage(_asFlowingWater, 0x2003, 0); - } Scene::update(); @@ -492,33 +475,29 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit else if (param.asInteger() == 0x02144CB1) sendEntityMessage(_klayman, 0x1014, _ssFloorButton); else if (param.asInteger() == 0x11C40840) { - if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) { + if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) setMessageList(0x004B3090); - } else { + else setMessageList(0x004B30B0); - } } else if (param.asInteger() == 0x412722C0) { if (_countdown2 > 0 && getGlobalVar(V_HAS_TEST_TUBE)) { _countdown2 = 144; setMessageList(0x004B3020); - } else { + } else setMessageList(0x004B3050); - } } else if (param.asInteger() == 0x21142050) { - if (_flag && _countdown1 == 0 && getGlobalVar(V_NOTES_PUZZLE_SOLVED) == 0) { + if (_unkFlag && _countdown1 == 0 && !getGlobalVar(V_NOTES_PUZZLE_SOLVED)) setMessageList(0x004B2FA8); - } else { + else setMessageList(0x004B2FC8); - } - } else if (param.asInteger() == 0x87441031) { + } else if (param.asInteger() == 0x87441031) setSurfacePriority(_sprite1->getSurface(), 1100); - } else if (param.asInteger() == 0x80C40322) { + else if (param.asInteger() == 0x80C40322) { setSurfacePriority(_sprite1->getSurface(), 200); cancelMessageList(); - _flag = true; - } else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) { + _unkFlag = true; + } else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) _countdown2 = 12; - } break; case 0x2000: messageResult = 0; @@ -558,29 +537,21 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene2401::playPipeSound(uint32 fileHash) { - if (_soundToggle) - playSound(0, fileHash); - else - playSound(1, fileHash); + playSound(_soundToggle ? 0 : 1, fileHash); _soundToggle = !_soundToggle; } static const uint32 kScene2402FileHashes[] = { - 0xD0910020, - 0xD0910038, - 0xD0910008, - 0xD0910068, - 0xD09100A8 + 0xD0910020, 0xD0910038, 0xD0910008, + 0xD0910068, 0xD09100A8 }; AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen) : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) { - SetUpdateHandler(&AsScene2402Door::update); - SetMessageHandler(&AsScene2402Door::handleMessage); - createSurface1(0x80495831, 100); _x = 320; _y = 240; + createSurface1(0x80495831, 100); if (_isOpen) { startAnimation(0x80495831, -1, -1); _newStickFrameIndex = STICK_LAST_FRAME; @@ -589,6 +560,8 @@ AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool i stopAnimation(); setVisible(false); } + SetUpdateHandler(&AsScene2402Door::update); + SetMessageHandler(&AsScene2402Door::handleMessage); } void AsScene2402Door::update() { @@ -634,12 +607,11 @@ void AsScene2402Door::stDoorClosingFinished() { AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) { - createSurface(100, 127, 90); - SetMessageHandler(&Sprite::handleMessage); _x = 260; _y = 210; + createSurface(100, 127, 90); setDoDeltaX(1); - + SetMessageHandler(&Sprite::handleMessage); if (!getGlobalVar(V_TV_JOKE_TOLD)) { loadSound(0, 0x58208810); _countdown1 = 48; @@ -656,7 +628,6 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) _countdown1 = 0; SetUpdateHandler(&AsScene2402TV::upFocusKlayman); } - } AsScene2402TV::~AsScene2402TV() { @@ -675,11 +646,10 @@ void AsScene2402TV::upWait() { void AsScene2402TV::upFocusKlayman() { int16 frameIndex = CLIP((_klayman->getX() - _x + 150) / 10, 0, 29); if (frameIndex != _currFrameIndex) { - if (frameIndex > _currFrameIndex) { + if (frameIndex > _currFrameIndex) _currFrameIndex++; - } else if (frameIndex < _currFrameIndex) { + else if (frameIndex < _currFrameIndex) _currFrameIndex--; - } startAnimation(0x050A0103, _currFrameIndex, -1); _newStickFrameIndex = _currFrameIndex; if (_countdown2 == 0) { @@ -687,9 +657,8 @@ void AsScene2402TV::upFocusKlayman() { _vm->_soundMan->playSoundLooping(0xC42D4528); } _countdown2 = 5; - } else if (_countdown2 != 0 && (--_countdown2 == 0)) { + } else if (_countdown2 != 0 && (--_countdown2 == 0)) _vm->_soundMan->deleteSound(0xC42D4528); - } AnimatedSprite::update(); } @@ -704,9 +673,8 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity * uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x431EA0B0) { + if (param.asInteger() == 0x431EA0B0) playSound(0); - } break; case 0x3002: gotoNextState(); @@ -732,16 +700,20 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = insertSprite(this, 0x15288120, 100, 0); if (which < 0) { + // Restoring game insertKlayman(198, 404); setMessageList(0x004AF7C8); } else if (which == 1) { + // Klaymen entering from the right insertKlayman(660, 404); setMessageList(0x004AF7D8); } else if (which == 2) { + // Klaymen returning from looking through the window insertKlayman(409, 404); _klayman->setDoDeltaX(getGlobalVar(V_KLAYMAN_IS_DELTA_X) ? 1 : 0); setMessageList(0x004AF888); } else { + // Klaymen entering from the left insertKlayman(0, 404); setMessageList(0x004AF7D0); } @@ -780,9 +752,9 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entit uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x402064D8) { + if (param.asInteger() == 0x402064D8) sendEntityMessage(_klayman, 0x1014, _ssButton); - } else if (param.asInteger() == 0x01C66840) { + else if (param.asInteger() == 0x01C66840) { if (sendMessage(_asDoor, 0x2000, 0)) setMessageList(0x004AF800); else @@ -809,10 +781,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene2402::playPipeSound(uint32 fileHash) { - if (_soundToggle) - playSound(0, fileHash); - else - playSound(1, fileHash); + playSound(_soundToggle ? 0 : 1, fileHash); _soundToggle = !_soundToggle; } @@ -832,22 +801,26 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) _asLightCord->setClipRect(0, 25, 640, 480); if (which < 0) { + // Restoring game _isClimbingLadder = false; insertKlayman(220, 449); setMessageList(0x004B5C98); setRectList(0x004B5E18); } else if (which == 1) { + // Klaymen returning from looking through the window _isClimbingLadder = false; insertKlayman(433, 449); setMessageList(0x004B5D70); setRectList(0x004B5E18); } else if (which == 2) { + // Klaymen standing around after the critter video _isClimbingLadder = false; insertKlayman(440, 449); _klayman->setDoDeltaX(1); setMessageList(0x004B5C98); setRectList(0x004B5E18); } else { + // Klaymen coming up from ladder _isClimbingLadder = true; insertKlayman(122, 599); setMessageList(0x004B5CA0); @@ -860,20 +833,17 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite3 = insertSprite(_klayman); tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); _klayman->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); - loadSound(1, calcHash("fxFogHornSoft")); - } uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: - if (param.asInteger() == 0x040424D0) { + if (param.asInteger() == 0x040424D0) sendEntityMessage(_klayman, 0x1014, _ssButton); - } else if (param.asInteger() == 0x180CE614) { + else if (param.asInteger() == 0x180CE614) sendEntityMessage(_klayman, 0x1014, _asLightCord); - } break; case 0x2000: _isClimbingLadder = true; @@ -895,9 +865,8 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480F: - if (sender == _asLightCord) { + if (sender == _asLightCord) leaveScene(2); - } break; case 0x4826: if (sender == _asTape && !_isClimbingLadder) { @@ -929,7 +898,6 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); _vm->_collisionMan->addSprite(_asTape); - tempSprite2 = insertStaticSprite(0x19625293, 1100); _clipRects[0].x1 = 0; _clipRects[0].y1 = 0; @@ -947,33 +915,37 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) } tempSprite2 = insertStaticSprite(0x22300924, 1300); - _clipRects[1].x1 = tempSprite1->getDrawRect().x; _clipRects[1].y1 = tempSprite2->getDrawRect().y; _clipRects[1].x2 = 640; _clipRects[1].y2 = 480; if (which < 0) { + // Restoring game _isClimbingLadder = false; insertKlayman(307, 404, _clipRects, 2); setMessageList(0x004B76C8); setRectList(0x004B78C8); } else if (which == 1) { + // Klaymen coming down the ladder _isClimbingLadder = true; insertKlayman(253, -16, _clipRects, 2); setMessageList(0x004B76D8); setRectList(0x004B78D8); } else if (which == 2) { + // Klaymen returning from the diskplayer _isClimbingLadder = false; insertKlayman(480, 404, _clipRects, 2); setMessageList(0x004B77C0); setRectList(0x004B78C8); } else if (which == 3) { + // Klaymen returning from looking through the window _isClimbingLadder = false; insertKlayman(387, 404, _clipRects, 2); setMessageList(0x004B7810); setRectList(0x004B78C8); } else { + // Klaymen entering from the left _isClimbingLadder = false; insertKlayman(0, 404, _clipRects, 2); setMessageList(0x004B76D0); @@ -990,11 +962,10 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x41062804) { - if (getGlobalVar(V_SPIKES_RETRACTED)) { + if (getGlobalVar(V_SPIKES_RETRACTED)) setMessageList(0x004B7758); - } else { + else setMessageList(0x004B7738); - } } break; case 0x2000: diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 8074c58dba..908c9d6bf5 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -44,6 +44,7 @@ public: Module2400(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2400(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -100,7 +101,7 @@ protected: Sprite *_asWaterFlushing[5]; Sprite *_asDoor; bool _soundToggle; - bool _flag; + bool _unkFlag; int _countdown1; int _countdown2; int _pipeStatus; -- cgit v1.2.3 From 28e613c68bf9d7fd12d151c9fb0f496b6c6cf0ee Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 23 Oct 2012 18:49:53 +0000 Subject: NEVERHOOD: Clean up Module2500 (like the ones before) --- engines/neverhood/gamemodule.cpp | 4 +-- engines/neverhood/module2500.cpp | 68 +++++++++++++++++++++------------------- engines/neverhood/module2500.h | 1 + 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index cd6c88efbd..e35ced3c93 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -326,8 +326,8 @@ void GameModule::startup() { */ _vm->gameState().which = 0; - _vm->gameState().sceneNum = 0; - createModule(2400, -1); + _vm->gameState().sceneNum = 3; + createModule(2500, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index de6e19e48c..34793877c6 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -28,30 +28,25 @@ namespace Neverhood { // TODO Maybe move these to the DAT static const uint32 kScene2505StaticSprites[] = { - 0x4000A226, - 0 + 0x4000A226, 0 }; static const NRect kScene2505ClipRect = NRect(0, 0, 564, 480); static const uint32 kScene2506StaticSprites[] = { - 0x4027AF02, - 0 + 0x4027AF02, 0 }; static const NRect kScene2506ClipRect = NRect(0, 0, 640, 441); static const uint32 kScene2508StaticSprites1[] = { - 0x2F08E610, - 0xD844E6A0, - 0 + 0x2F08E610, 0xD844E6A0, 0 }; static const NRect kScene2508ClipRect1 = NRect(0, 0, 594, 448); static const uint32 kScene2508StaticSprites2[] = { - 0x2F08E610, - 0 + 0x2F08E610, 0 }; static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448); @@ -63,11 +58,10 @@ Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->startMusic(0x05343184, 0, 0); SetMessageHandler(&Module2500::handleMessage); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, _vm->gameState().which); - } else { + else createScene(0, 0); - } loadSound(0, 0x00880CCC); loadSound(1, 0x00880CC0); @@ -82,16 +76,19 @@ Module2500::~Module2500() { void Module2500::createScene(int sceneNum, int which) { debug("Module2500::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _childObject = new Scene2501(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; _vm->gameState().which = which; createScene2704(which, 0x004B01B8, 220); break; case 2: + _vm->gameState().sceneNum = 2; _vm->gameState().which = which; if (getGlobalVar(V_WORLDS_JOINED)) createScene2704(which, 0x004B01E0, 150); @@ -99,22 +96,27 @@ void Module2500::createScene(int sceneNum, int which) { createScene2704(which, 0x004B0208, 150); break; case 3: + _vm->gameState().sceneNum = 3; _childObject = new Scene2504(_vm, this, which); break; case 4: + _vm->gameState().sceneNum = 4; _vm->gameState().which = which; createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect); break; case 5: setGlobalVar(V_CAR_DELTA_X, 1); + _vm->gameState().sceneNum = 5; _vm->gameState().which = which; createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect); break; case 6: + _vm->gameState().sceneNum = 6; _vm->gameState().which = which; createScene2704(which, 0x004B02A0, 150); break; case 7: + _vm->gameState().sceneNum = 7; _vm->gameState().which = which; if (getGlobalVar(V_ENTRANCE_OPEN)) createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1); @@ -122,9 +124,11 @@ void Module2500::createScene(int sceneNum, int which) { createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2); break; case 8: + _vm->gameState().sceneNum = 8; _childObject = new Scene1608(_vm, this, which); break; case 9: + _vm->gameState().sceneNum = 9; if (getGlobalVar(V_ENTRANCE_OPEN)) createStaticScene(0xC62A0645, 0xA0641C6A); else @@ -137,7 +141,7 @@ void Module2500::createScene(int sceneNum, int which) { void Module2500::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (_moduleResult == 1) createScene(2, 0); @@ -232,13 +236,13 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _ssTrackShadowBackground = createSprite(0x99BE9015); // Don't add this to the sprite list addEntity(_ssTrackShadowBackground); - _asCar = createSprite(this, 211, 400); // Create but don't add to the sprite list yet _asIdleCarLower = insertSprite(211, 400); _asIdleCarFull = insertSprite(211, 400); insertStaticSprite(0xC42AC521, 1500); if (which < 0) { + // Restoring game insertKlayman(162, 393); _kmScene2501 = _klayman; _klaymanInCar = false; @@ -250,6 +254,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _asCar->setVisible(false); _currTrackIndex = 0; } else if (which == 1 || which == 2) { + // 1: Klaymen entering riding the car on the left track + // 2: Klaymen entering riding the car on the bottom track addSprite(_asCar); _kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393); _klaymanInCar = true; @@ -261,6 +267,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarFull->setVisible(false); _currTrackIndex = which; } else { + // Klaymen entering the car insertKlayman(162, 393); _kmScene2501 = _klayman; _klaymanInCar = false; @@ -392,26 +399,24 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2005: - if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) { + if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) changeTrack(); - } else if (_sceneInfos[_currTrackIndex]->which1 == 0) { + else if (_sceneInfos[_currTrackIndex]->which1 == 0) { SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); sendMessage(_asCar, 0x200F, 1); - } else if (_sceneInfos[_currTrackIndex]->which1 > 0) { + } else if (_sceneInfos[_currTrackIndex]->which1 > 0) leaveScene(_sceneInfos[_currTrackIndex]->which1); - } break; case 0x2006: - if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) { + if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) changeTrack(); - } else if (_sceneInfos[_currTrackIndex]->which2 == 0) { + else if (_sceneInfos[_currTrackIndex]->which2 == 0) { SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); sendMessage(_asCar, 0x200F, 1); - } else if (_sceneInfos[_currTrackIndex]->which2 > 0) { + } else if (_sceneInfos[_currTrackIndex]->which2 > 0) leaveScene(_sceneInfos[_currTrackIndex]->which2); - } break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -437,11 +442,10 @@ void Scene2501::changeTrack() { _currTrackIndex = _newTrackIndex; _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); _asCar->setPathPoints(_trackPoints); - if (_currTrackIndex == 0) { + if (_currTrackIndex == 0) sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - } else { + else sendMessage(_asCar, 0x2002, 0); - } sendPointMessage(_asCar, 0x2004, _clickPoint); _newTrackIndex = -1; } @@ -503,11 +507,10 @@ void SsScene2504Button::update() { _isSoundPlaying = false; } if (_countdown != 0 && (--_countdown) == 0) { - if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) { + if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) playSound(0); - } else { + else playSound(1); - } _isSoundPlaying = true; } } @@ -519,11 +522,10 @@ uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam ¶ if (_countdown == 0 && !_isSoundPlaying) { setVisible(true); _countdown = 2; - if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) { + if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0); - } else { + else setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1); - } playSound(2); } messageResult = 1; diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index 3e018f950c..38a1a431fa 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -39,6 +39,7 @@ public: Module2500(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2500(); protected: + int _sceneNum; int _soundIndex; void createScene(int sceneNum, int which); void updateScene(); -- cgit v1.2.3 From 36204f573dd1903382de4c629d1e53242327ddcb Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 24 Oct 2012 07:25:02 +0000 Subject: NEVERHOOD: Clean up Module2600 (like the ones before) --- engines/neverhood/module2600.cpp | 104 ++++++++++++++++++++------------------- engines/neverhood/module2600.h | 1 + 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index d1b95be6bb..4ddcc38978 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -36,13 +36,12 @@ static const uint32 kModule2600SoundList[] = { Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) : Module(vm, parentModule) { - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 1) { + else if (which == 1) createScene(4, 1); - } else { + else createScene(0, 1); - } _vm->_soundMan->addSoundList(0x40271018, kModule2600SoundList); _vm->_soundMan->setSoundListParams(kModule2600SoundList, true, 50, 600, 5, 150); @@ -56,67 +55,74 @@ Module2600::~Module2600() { void Module2600::createScene(int sceneNum, int which) { debug("Module2600::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; createNavigationScene(0x004B8608, which); break; case 1: + _vm->gameState().sceneNum = 1; createNavigationScene(0x004B8638, which); break; case 2: + _vm->gameState().sceneNum = 2; createNavigationScene(0x004B86C8, which); break; case 3: - if (getGlobalVar(V_CREATURE_ANGRY)) { + _vm->gameState().sceneNum = 3; + if (getGlobalVar(V_CREATURE_ANGRY)) createNavigationScene(0x004B8758, which); - } else { + else createNavigationScene(0x004B86F8, which); - } break; case 4: + _vm->gameState().sceneNum = 4; createNavigationScene(0x004B87B8, which); break; case 6: + _vm->gameState().sceneNum = 6; createNavigationScene(0x004B8698, which); break; case 7: + _vm->gameState().sceneNum = 7; _vm->_soundMan->deleteGroup(0x40271018); createSmackerScene(0x30090001, true, true, false); break; case 8: + _vm->gameState().sceneNum = 8; _childObject = new Scene2609(_vm, this, which); break; case 1002: - if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) { + _vm->gameState().sceneNum = 2; + if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) createSmackerScene(0x018C0404, true, true, false); - } else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) { + else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) createSmackerScene(0x018C0407, true, true, false); - } else { + else createSmackerScene(0x818C0405, true, true, false); - } - if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) { + if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) setGlobalVar(V_FRUIT_COUNTING_INDEX, 0); - } else { + else incGlobalVar(V_FRUIT_COUNTING_INDEX, +1); - } break; case 1003: + _vm->gameState().sceneNum = 3; createSmackerScene(0x001C0007, true, true, false); break; case 1006: - if (getGlobalVar(V_WATER_RUNNING)) { + _vm->gameState().sceneNum = 6; + if (getGlobalVar(V_WATER_RUNNING)) createSmackerScene(0x049A1181, true, true, false); - } else { + else createSmackerScene(0x04981181, true, true, false); - } break; case 1008: - if (getGlobalVar(V_WATER_RUNNING)) { + _vm->gameState().sceneNum = 8; + if (getGlobalVar(V_WATER_RUNNING)) createSmackerScene(0x42B80941, true, true, false); - } else { + else createSmackerScene(0x42980941, true, true, false); - } break; } SetUpdateHandler(&Module2600::updateScene); @@ -125,63 +131,57 @@ void Module2600::createScene(int sceneNum, int which) { void Module2600::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: - if (_moduleResult == 1) { + if (_moduleResult == 1) createScene(1, 3); - } else { + else leaveModule(0); - } break; case 1: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(6, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(0, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createScene(2, 1); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createScene(3, 0); - } break; case 2: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(1, 0); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(1002, -1); - } break; case 3: if (_moduleResult == 0) { - if (getGlobalVar(V_CREATURE_ANGRY)) { + if (getGlobalVar(V_CREATURE_ANGRY)) createScene(4, 0); - } else { + else createScene(1003, -1); - } - } else if (_moduleResult == 2) { + } else if (_moduleResult == 2) createScene(1, 1); - } else if (_moduleResult == 3) { - if (getGlobalVar(V_CREATURE_ANGRY)) { + else if (_moduleResult == 3) { + if (getGlobalVar(V_CREATURE_ANGRY)) createScene(4, 0); - } else { + else { setGlobalVar(V_CREATURE_ANGRY, 1); createScene(7, -1); } } break; case 4: - if (_moduleResult == 0) { + if (_moduleResult == 0) leaveModule(1); - } else { + else createScene(3, 1); - } break; case 6: - if (_moduleResult == 0) { + if (_moduleResult == 0) createScene(1006, -1); - } else if (_moduleResult == 1) { + else if (_moduleResult == 1) createScene(1, 2); - } break; case 7: leaveModule(0); @@ -208,6 +208,9 @@ void Module2600::updateScene() { SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { + SetUpdateHandler(&SsScene2609Button::update); + SetMessageHandler(&SsScene2609Button::handleMessage); + loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); if (!getGlobalVar(V_WATER_RUNNING)) setVisible(false); @@ -215,8 +218,6 @@ SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) loadSound(1, 0x7027FD64); loadSound(2, 0x44043000); loadSound(3, 0x44045000); - SetUpdateHandler(&SsScene2609Button::update); - SetMessageHandler(&SsScene2609Button::handleMessage); } void SsScene2609Button::update() { @@ -295,6 +296,9 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _isBusy(false) { + SetUpdateHandler(&Scene::update); + SetMessageHandler(&Scene2609::handleMessage); + setBackground(0x51409A16); setPalette(0x51409A16); _asWater = insertSprite(); @@ -303,8 +307,6 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x09A1251C, 20, 620); insertStaticSprite(0x02138002, 1200); insertStaticSprite(0x825E2827, 1200); - SetMessageHandler(&Scene2609::handleMessage); - SetUpdateHandler(&Scene::update); } uint32 Scene2609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h index 107ee91788..8f2f3779fe 100644 --- a/engines/neverhood/module2600.h +++ b/engines/neverhood/module2600.h @@ -36,6 +36,7 @@ public: Module2600(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2600(); protected: + int _sceneNum; void createScene(int sceneNum, int which); void updateScene(); }; -- cgit v1.2.3 From 8d5a4f736e1160463ee7bd85ed67e9b9f742509e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 24 Oct 2012 13:31:22 +0000 Subject: NEVERHOOD: Add tables for new scenes in Module2700 --- devtools/create_neverhood/create_neverhood.cpp | 5 ----- devtools/create_neverhood/tables.h | 4 ++++ dists/engine-data/neverhood.dat | Bin 25210 -> 25296 bytes 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/devtools/create_neverhood/create_neverhood.cpp b/devtools/create_neverhood/create_neverhood.cpp index dc77d71a39..323066d8b1 100644 --- a/devtools/create_neverhood/create_neverhood.cpp +++ b/devtools/create_neverhood/create_neverhood.cpp @@ -87,7 +87,6 @@ struct HitRect { uint16 messageNum; void load(uint32 offset) { - printf("Loading HitRect @ %08X...\n", offset); byte *item = getData(offset); x1 = READ_LE_UINT16(item + 0); y1 = READ_LE_UINT16(item + 2); @@ -117,7 +116,6 @@ struct MessageItem { MessageItem(uint16 msgNum, uint32 msgParam) : messageNum(msgNum), messageParam(msgParam) {} void load(uint32 offset) { - printf("Loading MessageItem @ %08X...\n", offset); byte *item = getData(offset); messageNum = READ_LE_UINT16(item + 0); messageParam = READ_LE_UINT32(item + 4); @@ -140,7 +138,6 @@ struct SubRectItem { uint32 messageListOffset; void load(uint32 offset) { - printf("Loading SubRectItem @ %08X...\n", offset); byte *item = getData(offset); x1 = READ_LE_UINT16(item + 0); y1 = READ_LE_UINT16(item + 2); @@ -173,7 +170,6 @@ struct RectItem { std::vector subRectItems; void load(uint32 offset) { - printf("Loading RectItem @ %08X...\n", offset); byte *item = getData(offset); uint32 subItemOffset; x1 = READ_LE_UINT16(item + 0); @@ -217,7 +213,6 @@ struct NavigationItem { uint32 mouseCursorFileHash; void load(uint32 offset) { - printf("Loading NavigationItem @ %08X...\n", offset); byte *item = getData(offset); fileHash = READ_LE_UINT32(item + 0); leftSmackerFileHash = READ_LE_UINT32(item + 4); diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index eb210f8daf..1218526463 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -124,6 +124,8 @@ static const uint32 rectListOffsets[] = { 1, 0x004B78D8, // Scene2501 1, 0x004B2608, + // Scene2732 + 1, 0x004AE360, // Scene2801 1, 0x004B6CE0, 1, 0x004B6CD0, @@ -438,6 +440,8 @@ static const uint32 messageListOffsets[] = { // Scene2501 7, 0x004B2538, 6, 0x004B2570, + // Scene2732 + 1, 0x004AE328, // Scene2801 1, 0x004B6BB8, 1, 0x004B6BC0, diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index 26a705e80d..e384ee11c5 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From c539060460b312a52ac1c0993b2d39c5f666c6fa Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 24 Oct 2012 13:33:00 +0000 Subject: NEVERHOOD: Clean up Module2700 (like the ones before) - Add Scene2703 and Scene2732 --- engines/neverhood/gamemodule.cpp | 4 +- engines/neverhood/klayman.cpp | 55 ++++++ engines/neverhood/klayman.h | 12 ++ engines/neverhood/module2700.cpp | 351 ++++++++++++++++++++++++++++----------- engines/neverhood/module2700.h | 29 +++- 5 files changed, 347 insertions(+), 104 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e35ced3c93..65164859c9 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -326,8 +326,8 @@ void GameModule::startup() { */ _vm->gameState().which = 0; - _vm->gameState().sceneNum = 3; - createModule(2500, -1); + _vm->gameState().sceneNum = 28; + createModule(2700, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 88a878c326..782c376bd4 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -3291,6 +3291,44 @@ void Klayman::stStartWalkingResume() { FinalizeState(&Klayman::evStartWalkingDone); } +void Klayman::upPeekInsideBlink() { + update(); + ++_blinkCounter; + if (_blinkCounter >= _blinkCounterMax) + stPeekInsideBlink(); +} + +void Klayman::stPeekInside() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xAC20C012, 8, 37); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klayman::stPeekInsideBlink); +} + +void Klayman::stPeekInsideReturn() { + _status2 = 1; + _acceptInput = false; + startAnimation(0xAC20C012, 43, 49); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klayman::stPeekInsideBlink() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xAC20C012, 38, 42); + _newStickFrameIndex = 42; + SetUpdateHandler(&Klayman::upPeekInsideBlink); + SetMessageHandler(&Klayman::hmLowLevel); + SetSpriteUpdate(NULL); + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; +} + //############################################################################## // KmScene1001 @@ -5563,6 +5601,23 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } +KmScene2732::KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) + : Klayman(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4804: + GotoState(&Klayman::stPeekInside); + break; + case 0x483C: + GotoState(&Klayman::stPeekInsideReturn); + break; + } + return 0; +} + KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 1ac4519fc4..ab2c5235d4 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -348,6 +348,11 @@ public: uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); void evMoveVenusFlyTrapDone(); + void stPeekInside(); + void stPeekInsideReturn(); + void stPeekInsideBlink(); + void upPeekInsideBlink(); + //////////////////////////////////////////////////////////////////////////// void stopWalking(); @@ -678,6 +683,13 @@ protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; +class KmScene2732 : public Klayman { +public: + KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + class KmScene2801 : public Klayman { public: KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 1e02e64411..a625f87033 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -91,12 +91,13 @@ Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { which = _vm->gameState().which; + // Scenes 0, 30 and 31 are "normal" scenes, whereas the other scenes are tracks. + // "gameState().which" indicates which track the car is at. if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31) which = -1; createScene(_vm->gameState().sceneNum, which); - } else { + } else createScene(0, 0); - } loadSound(0, 0x00880CCC); loadSound(1, 0x00880CC0); @@ -111,17 +112,21 @@ Module2700::~Module2700() { void Module2700::createScene(int sceneNum, int which) { debug("Module2700::createScene(%d, %d)", sceneNum, which); - if (sceneNum != 30 && sceneNum != 31) - _vm->gameState().which = which; - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; + _vm->gameState().which = which; _childObject = new Scene2701(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; + _vm->gameState().which = which; _childObject = new Scene2702(_vm, this, which); break; case 2: + _vm->gameState().sceneNum = 2; + _vm->gameState().which = which; if (which == 6 || which == 7) createScene2703(which, 0x004B1710); else if (which == 4 || which == 5) @@ -132,41 +137,54 @@ void Module2700::createScene(int sceneNum, int which) { createScene2703(which, 0x004B1788); break; case 3: + _vm->gameState().sceneNum = 3; + _vm->gameState().which = which; createScene2704(which, 0x004B17B0, 150); break; case 4: + _vm->gameState().sceneNum = 4; + _vm->gameState().which = which; createScene2704(which, 0x004B17D8, 150); break; case 5: - if (which >= 4) { + _vm->gameState().sceneNum = 5; + _vm->gameState().which = which; + if (which >= 4) _childObject = new Scene2706(_vm, this, which); - } else if (which == 2 || which == 3) { + else if (which == 2 || which == 3) createScene2704(which, 0x004B1828, 150); - } else { + else createScene2704(which, 0x004B1800, 150); - } break; case 6: + _vm->gameState().sceneNum = 6; + _vm->gameState().which = which; createScene2704(which, 0x004B1850, 150); break; case 7: - if (which == 2 || which == 3) { + _vm->gameState().sceneNum = 7; + _vm->gameState().which = which; + if (which == 2 || which == 3) createScene2704(which, 0x004B1878, 150); - } else { + else createScene2704(which, 0x004B18A0, 150); - } break; case 8: - if (which == 2 || which == 3) { + _vm->gameState().sceneNum = 8; + _vm->gameState().which = which; + if (which == 2 || which == 3) createScene2704(which, 0x004B18C8, 150); - } else { + else createScene2704(which, 0x004B18F0, 150); - } break; case 9: + _vm->gameState().sceneNum = 9; + _vm->gameState().which = which; createScene2704(which, 0x004B1918, 150, kScene2710StaticSprites, &kScene2710ClipRect); break; case 10: + _vm->gameState().sceneNum = 10; + _vm->gameState().which = which; // TODO _vm->gameModule()->initScene2808Vars2(); _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)]; _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)]; @@ -177,100 +195,131 @@ void Module2700::createScene(int sceneNum, int which) { createScene2704(which, 0x004B1950, 150, _scene2711StaticSprites, &kScene2711ClipRect); break; case 11: + _vm->gameState().sceneNum = 11; + _vm->gameState().which = which; createScene2704(which, 0x004B19E0, 150); break; case 12: + _vm->gameState().sceneNum = 12; + _vm->gameState().which = which; createScene2704(which, 0x004B1A08, 150); break; case 13: + _vm->gameState().sceneNum = 13; + _vm->gameState().which = which; createScene2704(which, 0x004B1A30, 150); break; case 14: - if (which == 4 || which == 5) { + _vm->gameState().sceneNum = 14; + _vm->gameState().which = which; + if (which == 4 || which == 5) createScene2704(which, 0x004B1A58, 150); - } else if (which == 2 || which == 3) { + else if (which == 2 || which == 3) createScene2704(which, 0x004B1A80, 150); - } else { + else createScene2704(which, 0x004B1AA8, 150); - } break; case 15: - if (which == 4 || which == 5) { + _vm->gameState().sceneNum = 15; + _vm->gameState().which = which; + if (which == 4 || which == 5) createScene2704(which, 0x004B1AD0, 150); - } else if (which == 2 || which == 3) { + else if (which == 2 || which == 3) createScene2704(which, 0x004B1AF8, 150); - } else { + else createScene2704(which, 0x004B1B20, 150); - } break; case 16: - if (which == 4 || which == 5) { + _vm->gameState().sceneNum = 16; + _vm->gameState().which = which; + if (which == 4 || which == 5) createScene2704(which, 0x004B1B48, 150); - } else if (which == 2 || which == 3) { + else if (which == 2 || which == 3) createScene2704(which, 0x004B1B70, 150); - } else { + else createScene2704(which, 0x004B1B98, 150); - } break; case 17: - if (which == 4 || which == 5) { + _vm->gameState().sceneNum = 17; + _vm->gameState().which = which; + if (which == 4 || which == 5) createScene2704(which, 0x004B1BC0, 150); - } else if (which == 2 || which == 3) { + else if (which == 2 || which == 3) createScene2704(which, 0x004B1BE8, 150); - } else { + else createScene2704(which, 0x004B1C10, 150); - } break; case 18: - if (which == 2 || which == 3) { + _vm->gameState().sceneNum = 18; + _vm->gameState().which = which; + if (which == 2 || which == 3) createScene2704(which, 0x004B1C38, 150); - } else { + else createScene2704(which, 0x004B1C60, 150); - } break; case 19: - if (which == 2 || which == 3) { + _vm->gameState().sceneNum = 19; + _vm->gameState().which = which; + if (which == 2 || which == 3) createScene2704(which, 0x004B1CB0, 150); - } else { + else createScene2704(which, 0x004B1C88, 150); - } break; case 20: - if (which == 2 || which == 3) { + _vm->gameState().sceneNum = 20; + _vm->gameState().which = which; + if (which == 2 || which == 3) createScene2704(which, 0x004B1CD8, 150); - } else { + else createScene2704(which, 0x004B1D00, 150); - } break; case 21: + _vm->gameState().sceneNum = 21; + _vm->gameState().which = which; createScene2704(which, 0x004B1D28, 150); break; case 22: + _vm->gameState().sceneNum = 22; + _vm->gameState().which = which; createScene2704(which, 0x004B1D50, 150); break; case 23: + _vm->gameState().sceneNum = 23; + _vm->gameState().which = which; createScene2704(which, 0x004B1D78, 150, kScene2724StaticSprites, &kScene2724ClipRect); break; case 24: + _vm->gameState().sceneNum = 24; + _vm->gameState().which = which; createScene2704(which, 0x004B1DB0, 150, kScene2725StaticSprites, &kScene2725ClipRect); break; case 25: + _vm->gameState().sceneNum = 25; + _vm->gameState().which = which; createScene2704(which, 0x004B1DE8, 150); break; case 26: + _vm->gameState().sceneNum = 26; + _vm->gameState().which = which; createScene2704(which, 0x004B1E10, 150); break; case 27: + _vm->gameState().sceneNum = 27; + _vm->gameState().which = which; createScene2704(which, 0x004B1E38, 150); break; case 28: + _vm->gameState().sceneNum = 28; + _vm->gameState().which = which; createScene2704(which, 0x004B1E60, 150); break; case 30: + _vm->gameState().sceneNum = 30; createStaticScene(0x09507248, 0x0724C09D); break; case 31: -//TODO _childObject = new Scene2732(_vm, this, which); + _vm->gameState().sceneNum = 31; + _childObject = new Scene2732(_vm, this); break; } SetUpdateHandler(&Module2700::updateScene); @@ -282,10 +331,7 @@ void Module2700::createScene(int sceneNum, int which) { void Module2700::updateScene() { if (!updateChild()) { - - debug("sceneNum = %d; _moduleResult = %d", _vm->gameState().sceneNum, _moduleResult); - - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: SceneLinkIf(1, 1, 0); leaveModule(0); @@ -444,15 +490,15 @@ void Module2700::updateScene() { SceneLinkIf(1, 31, 0); createScene(27, 1); break; - case 29: + case 30: createScene(13, 1); break; - case 30: + case 31: createScene(28, 1); break; } } else { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 21: if (!_raidoMusicInitialized) { _vm->_soundMan->stopMusic(0x04020210, 0, 1); @@ -469,10 +515,6 @@ void Module2700::updateScene() { } } -void Module2700::update() { - -} - uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { @@ -486,8 +528,8 @@ uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Enti return messageResult; } -void Module2700::createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites, const NRect *clipRect) { - // TODO +void Module2700::createScene2703(int which, uint32 sceneInfoId) { + _childObject = new Scene2703(_vm, this, which, sceneInfoId); } void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { @@ -495,15 +537,9 @@ void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, con } static const NPoint kCarShadowOffsets[] = { - {-63, 3}, - {-48, 40}, - {-33, 58}, - { 0, 65}, - { 40, 53}, - { 56, 27}, - { 63, 0}, - {-30, 26}, - { 0, 30}, + {-63, 3}, {-48, 40}, {-33, 58}, + { 0, 65}, { 40, 53}, { 56, 27}, + { 63, 0}, {-30, 26}, { 0, 30}, { 26, 25} }; @@ -588,21 +624,16 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(sceneInfo->bgFilename); setPalette(sceneInfo->bgFilename); - _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); - insertMouse433(0x08B08180); tempSprite = insertStaticSprite(0x1E086325, 1200); - clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); if (sceneInfo->class437Filename) { - _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -613,10 +644,8 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) } _asCarConnector = insertSprite(_asCar); - _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; - _dataResource.load(sceneInfo->dataResourceFilename); _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); _asCar->setPathPoints(_trackPoints); @@ -670,9 +699,9 @@ uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x >= 385) { + if (param.asPoint().x >= 385) leaveScene(0); - } else { + else { sendPointMessage(_asCar, 0x2004, param.asPoint()); SetMessageHandler(&Scene2701::hmRidingCar); } @@ -691,7 +720,7 @@ static const uint32 kScene2702Infos[2][3] = { Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _flag1(true), _newTrackIndex(-1), _count(3) { + : Scene(vm, parentModule, true), _isInLight(true), _newTrackIndex(-1), _count(3) { for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) @@ -702,22 +731,18 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x18808B00); setPalette(0x18808B00); - _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); addEntity(_palette); - insertMouse433(0x08B04180); _ssTrackShadowBackground = createSprite(0x12002035); addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); insertSprite(_asCar); _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _dataResource.load(0x04310014); if (which == 1) { @@ -728,7 +753,7 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) _currTrackIndex = 2; _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _flag1 = false; + _isInLight = false; } else if (which == 3) { _currSceneInfos = _sceneInfos[0]; _currTrackIndex = 0; @@ -737,13 +762,13 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) _currTrackIndex = 2; _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _flag1 = false; + _isInLight = false; } else if (which == 5) { _currSceneInfos = _sceneInfos[0]; _currTrackIndex = 1; _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _flag1 = false; + _isInLight = false; } else { _currSceneInfos = _sceneInfos[1]; _currTrackIndex = 0; @@ -766,18 +791,16 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) void Scene2702::update() { Scene::update(); - if (_flag1 && _asCar->getX() > 422) { - debug("fade #1"); + if (_isInLight && _asCar->getX() > 422) { _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); _palette->startFadeToPalette(12); - _flag1 = false; - } else if (!_flag1 && _asCar->getX() <= 422) { - debug("fade #2"); + _isInLight = false; + } else if (!_isInLight && _asCar->getX() <= 422) { _palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0); _palette->startFadeToPalette(12); - _flag1 = true; + _isInLight = true; } } @@ -831,11 +854,10 @@ void Scene2702::findClosestTrack(NPoint pt) { sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else sendMessage(_asCar, 0x2003, 0); - } else if (_currTrackIndex == 2) { + } else if (_currTrackIndex == 2) sendMessage(_asCar, 0x2003, 0); - } else { + else sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); - } } else { _newTrackIndex = -1; sendMessage(_asCar, 0x2004, pt.x); @@ -851,15 +873,132 @@ void Scene2702::changeTrack() { sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); else sendMessage(_asCar, 0x2002, 0); - } else if (_currTrackIndex == 2) { + } else if (_currTrackIndex == 2) sendMessage(_asCar, 0x2002, 0); - } else { + else sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - } sendMessage(_asCar, 0x2004, _newTrackDestX); _newTrackIndex = -1; } +Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId) + : Scene(vm, parentModule, true) { + + SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); + + SetMessageHandler(&Scene2703::handleMessage); + SetUpdateHandler(&Scene2703::update); + + setBackground(sceneInfo->bgFilename); + setPalette(sceneInfo->bgFilename); + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + addEntity(_palette); + insertMouse433(sceneInfo->mouseCursorFilename); + + _palStatus = 2; + + if (sceneInfo->class437Filename) { + _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); + addEntity(_ssTrackShadowBackground); + _asCar = insertSprite(this, 320, 240); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + } else { + _ssTrackShadowBackground = NULL; + _asCarShadow = NULL; + _asCar = insertSprite(this, 320, 240); + } + + _asCarConnector = insertSprite(_asCar); + _which1 = sceneInfo->which1; + _which2 = sceneInfo->which2; + _dataResource.load(sceneInfo->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); + _asCar->setPathPoints(_trackPoints); + + if (sceneInfo->rectListName) { + _rectList = _dataResource.getRectArray(sceneInfo->rectListName); + // TODO _asCar->setPathRects(_rectList); + } + + if (which == _which2) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_asCar, 0x2009, 0); + else + sendMessage(_asCar, 0x2007, 150); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_asCar, 0x2002, 0); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_asCar, 0x2009, 0); + else + sendMessage(_asCar, 0x2008, 150); + } + + if (which == 0) { + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _palStatus = 1; + } else if (which == 2 || which == 4 || which == 6) { + _palette->addPalette(calcHash("paPodBlack"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayBlack"), 0, 65, 0); + _palStatus = 0; + } + + _palette->copyBasePalette(0, 256, 0); + +} + +void Scene2703::update() { + Scene::update(); + if (_mouseClicked) { + sendPointMessage(_asCar, 0x2004, _mouseClickPos); + _mouseClicked = false; + } + if (_asCar->getX() > 469) { + if (_palStatus != 2) { + _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); + _palette->startFadeToPalette(12); + _palStatus = 2; + } + } else if (_asCar->getX() > 181) { + if (_palStatus != 1) { + _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); + _palette->startFadeToPalette(12); + _palStatus = 1; + } + } else if (_palStatus != 0) { + _palette->addBasePalette(calcHash("paPodBlack"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayBlack"), 0, 65, 0); + _palette->startFadeToPalette(12); + _palStatus = 0; + } +} + +uint32 Scene2703::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (_which1 >= 0) + leaveScene(_which1); + break; + case 0x2006: + if (_which2 >= 0) + leaveScene(_which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) : Scene(vm, parentModule, true) { @@ -871,10 +1010,10 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 setBackground(sceneInfo->bgFilename); setPalette(sceneInfo->bgFilename); - + if (sceneInfo->exPaletteFilename1) _palette->addPalette(sceneInfo->exPaletteFilename1, 0, 65, 0); - + if (sceneInfo->exPaletteFilename2) _palette->addPalette(sceneInfo->exPaletteFilename2, 65, 31, 65); @@ -884,10 +1023,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 insertMouse433(sceneInfo->mouseCursorFilename); if (sceneInfo->class437Filename) { - _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -899,10 +1036,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 } _asCarConnector = insertSprite(_asCar); - _which1 = sceneInfo->which1; _which2 = sceneInfo->which2; - _dataResource.load(sceneInfo->dataResourceFilename); _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); _asCar->setPathPoints(_trackPoints); @@ -1092,4 +1227,22 @@ void Scene2706::changeTrack() { _newTrackIndex = -1; } +Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule, true) { + + Sprite *tempSprite; + + setBackground(0x0220C041); + setPalette(0x0220C041); + insertMouse433(0x0C04502A); + setRectList(0x004AE360); + + insertKlayman(108, 331); + setMessageList(0x004AE328); + + tempSprite = insertStaticSprite(0x50C22C48, 1100); + _klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + +} + } // End of namespace Neverhood diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index 4973211075..d17d12cfc5 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -37,15 +37,15 @@ public: Module2700(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2700(); protected: + int _sceneNum; int _soundIndex; bool _raidoMusicInitialized; uint32 _scene2711StaticSprites[6]; uint32 _musicFileHash; void createScene(int sceneNum, int which); void updateScene(); - void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene2703(int which, uint32 sceneInfoId, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); + void createScene2703(int which, uint32 sceneInfoId); void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; @@ -110,7 +110,7 @@ protected: int16 _newTrackDestX; int _currTrackIndex, _newTrackIndex; int _count; - bool _flag1; + bool _isInLight; SceneInfo2700 *_sceneInfos[2][3]; SceneInfo2700 **_currSceneInfos; NPointArray *_trackPoints; @@ -120,6 +120,24 @@ protected: void changeTrack(); }; +class Scene2703 : public Scene { +public: + Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarConnector; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; + int _palStatus; + int _which1, _which2; + NPointArray *_trackPoints; + NRectArray *_rectList; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class Scene2704 : public Scene { public: Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, @@ -156,6 +174,11 @@ protected: void changeTrack(); }; +class Scene2732 : public Scene { +public: + Scene2732(NeverhoodEngine *vm, Module *parentModule); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MODULE2700_H */ -- cgit v1.2.3 From 4df22cf9795eb5612865e4a977f03986c4d4aeb1 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 24 Oct 2012 16:48:08 +0000 Subject: NEVERHOOD: Remove track rectList code because none of the tracks has a rectList --- engines/neverhood/module1600.cpp | 27 ++++----------------------- engines/neverhood/module1600.h | 1 - engines/neverhood/module2700.cpp | 10 ---------- engines/neverhood/module2700.h | 2 -- 4 files changed, 4 insertions(+), 36 deletions(-) diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index c14e2b34ee..db8eeab4ab 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -210,7 +210,6 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 _newDeltaXType = -1; _soundCounter = 0; _pathPoints = NULL; - _rectList = NULL; // TODO Check if this is used startAnimation(0xD4220027, 0, -1); setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); @@ -408,7 +407,6 @@ void AsCommonCar::stCarAtHome() { _isIdle = false; _isMoving = false; _rectFlag = false; - _rectList = NULL; NextState(&AsCommonCar::stLeanForwardIdle); startAnimation(0x35698F78, 0, -1); setDoDeltaX(doDeltaX ? 1 : 0); @@ -452,27 +450,10 @@ void AsCommonCar::updateMovement() { SetUpdateHandler(&AsCommonCar::update); SetMessageHandler(&AsCommonCar::hmAnimation); NextState(&AsCommonCar::stUpdateMoveDirection); - } else { - bool inRect = false; - uint index = 0; - if (_rectList && _rectList->size() > 0) { - while (index < _rectList->size()) { - NRect r = (*_rectList)[index]; - if (_x >= r.x1 && _x <= r.x2 && _y >= r.y1 && _y <= r.y2) - break; - } - if (index < _rectList->size() && !_rectFlag) - inRect = true; - _rectFlag = index < _rectList->size(); - } - if (inRect) { - gotoNextState(); - stHandleRect(); - } else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) { - gotoNextState(); - _currMoveDirection = _newMoveDirection; - stUpdateMoveDirection(); - } + } else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) { + gotoNextState(); + _currMoveDirection = _newMoveDirection; + stUpdateMoveDirection(); } } diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 28aad133d8..2a7d547551 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -50,7 +50,6 @@ public: protected: Scene *_parentScene; NPointArray *_pathPoints; - NRectArray *_rectList; int _newMoveDirection; int _currMoveDirection; int _exitDirection; diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index a625f87033..9a8a2f973d 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -918,11 +918,6 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); _asCar->setPathPoints(_trackPoints); - if (sceneInfo->rectListName) { - _rectList = _dataResource.getRectArray(sceneInfo->rectListName); - // TODO _asCar->setPathRects(_rectList); - } - if (which == _which2) { NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); @@ -1042,11 +1037,6 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); _asCar->setPathPoints(_trackPoints); - if (sceneInfo->rectListName) { - _rectList = _dataResource.getRectArray(sceneInfo->rectListName); - // TODO _asCar->setPathRects(_rectList); - } - if (which == _which2) { NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index d17d12cfc5..68c471c58d 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -133,7 +133,6 @@ protected: int _palStatus; int _which1, _which2; NPointArray *_trackPoints; - NRectArray *_rectList; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -151,7 +150,6 @@ protected: Sprite *_asCarConnectorShadow; int _which1, _which2; NPointArray *_trackPoints; - NRectArray *_rectList; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 228d9264c8e9f5e1930e8b69ce809783d303bbbc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 25 Oct 2012 12:35:14 +0000 Subject: NEVERHOOD: Start with menu widget stuff (doesn't do anything yet!) --- engines/neverhood/menumodule.cpp | 96 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/menumodule.h | 35 +++++++++++++++ 2 files changed, 131 insertions(+) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index fdde1a23e0..bec640e5d4 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -354,4 +354,100 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } +WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule, true), _currWidget(NULL) { +} + +void WidgetScene::getMousPos(NPoint &pt) { + pt.x = _mouseCursor->getX(); + pt.y = _mouseCursor->getY(); +} + +void WidgetScene::setCurrWidget(Widget *newWidget) { + if (newWidget && newWidget != _currWidget) { + if (_currWidget) + _currWidget->exitWidget(); + newWidget->enterWidget(); + _currWidget = newWidget; + } +} + +Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, bool visible) + : StaticSprite(vm, baseObjectPriority), _itemID(itemID), _parentScene(parentScene), + _baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority), _visible(visible) { + + SetUpdateHandler(&Widget::update); + SetMessageHandler(&Widget::handleMessage); + + setPosition(x, y); +} + +void Widget::show() { + if (_surface) + _surface->setVisible(true); + _visible = true; +} + +void Widget::hide() { + if (_surface) + _surface->setVisible(false); + _visible = false; +} + +void Widget::onClick() { + _parentScene->setCurrWidget(this); + // TODO Somehow _parentScene->onClick(_itemID, 0); +} + +void Widget::setPosition(int16 x, int16 y) { + _x = x; + _y = y; + updateBounds(); +} + +void Widget::refresh() { + _needRefresh = true; + StaticSprite::updatePosition(); + _collisionBoundsOffset.set(0, 0, + _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + updateBounds(); +} + +void Widget::addSprite() { + // Empty +} + +int16 Widget::getWidth() { + return _spriteResource.getDimensions().width; +} + +int16 Widget::getHeight() { + return _spriteResource.getDimensions().height; +} + +void Widget::enterWidget() { + // Empty +} + +void Widget::exitWidget() { + // Empty +} + +void Widget::update() { + handleSpriteUpdate(); + StaticSprite::updatePosition(); +} + +uint32 Widget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + onClick(); + messageResult = 1; + break; + } + return messageResult; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 77cef449d1..1b6ba8a9f7 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -79,6 +79,41 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class Widget; + +class WidgetScene : public Scene { +public: + WidgetScene(NeverhoodEngine *vm, Module *parentModule); + void getMousPos(NPoint &pt); + virtual void setCurrWidget(Widget *newWidget); +protected: + Widget *_currWidget; +}; + +class Widget : public StaticSprite { +public: + Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, bool visible); + virtual void show(); + virtual void hide(); + virtual void onClick(); + virtual void setPosition(int16 x, int16 y); + virtual void refresh(); + virtual void addSprite(); + virtual int16 getWidth(); + virtual int16 getHeight(); + virtual void enterWidget(); + virtual void exitWidget(); +protected: + int16 _itemID; + WidgetScene *_parentScene; + int _baseObjectPriority; + int _baseSurfacePriority; + bool _visible; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MENUMODULE_H */ -- cgit v1.2.3 From eecd9b8b2a2eda9641bf7bbd5bd5860123d102b4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 25 Oct 2012 13:14:26 +0000 Subject: NEVERHOOD: Add TextLabelWidget (still doesn't do anything) --- engines/neverhood/graphics.h | 1 + engines/neverhood/menumodule.cpp | 48 ++++++++++++++++++++++++++++++++++++++++ engines/neverhood/menumodule.h | 22 ++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 3ca3339585..d6808e37f5 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -149,6 +149,7 @@ public: void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen); int16 getStringWidth(const byte *string, int stringLen); + uint16 getCharHeight() const { return _charHeight; } protected: uint16 _numRows; byte _firstChar; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index bec640e5d4..01fcd41d75 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -450,4 +450,52 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam ¶m, Entity * return messageResult; } +TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, bool visible, + const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface) + : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority, visible), + _string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _textSurface(textSurface) { + +} + +void TextLabelWidget::addSprite() { + _parentScene->addSprite(this); + _vm->_collisionMan->addSprite(this); +} + +int16 TextLabelWidget::getWidth() { + return _textSurface->getStringWidth(_string, _stringLen); +} + +int16 TextLabelWidget::getHeight() { + return _textSurface->getCharHeight(); +} + +void TextLabelWidget::drawString(int maxStringLength) { + _textSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength)); + _visible = true; + _collisionBoundsOffset.set(_tx, _ty, getWidth(), getHeight()); + updateBounds(); +} + +void TextLabelWidget::clear() { + _visible = false; + _collisionBoundsOffset.set(0, 0, 0, 0); + updateBounds(); +} + +void TextLabelWidget::onClick() { + Widget::onClick(); + // TODO Click handler? +} + +void TextLabelWidget::setString(const byte *string, int stringLen) { + _string = string; + _stringLen = stringLen; +} + +void TextLabelWidget::setY(int16 y) { + _ty = y; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 1b6ba8a9f7..8381b4eb30 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -114,6 +114,28 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +class TextLabelWidget : public Widget { +public: + TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, bool visible, + const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface); + virtual void onClick(); + virtual void addSprite(); + virtual int16 getWidth(); + virtual int16 getHeight(); + void drawString(int maxStringLength); + void clear(); + void setString(const byte *string, int stringLen); + TextSurface *getTextSurface() const { return _textSurface; } + void setY(int16 y); +protected: + BaseSurface *_drawSurface; + int16 _tx, _ty; + TextSurface *_textSurface; + const byte *_string; + int _stringLen; +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MENUMODULE_H */ -- cgit v1.2.3 From 0022c57858f5cac3544692ad134a2446c4f3be3a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 26 Oct 2012 11:01:10 +0000 Subject: NEVERHOOD: Add SavegameListBox --- engines/neverhood/graphics.h | 1 + engines/neverhood/menumodule.cpp | 119 +++++++++++++++++++++++++++++++++++++-- engines/neverhood/menumodule.h | 36 +++++++++++- 3 files changed, 148 insertions(+), 8 deletions(-) diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index d6808e37f5..b5286906e9 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -149,6 +149,7 @@ public: void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen); int16 getStringWidth(const byte *string, int stringLen); + uint16 getCharWidth() const { return _charWidth; } uint16 getCharHeight() const { return _charHeight; } protected: uint16 _numRows; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 01fcd41d75..7e1198abd0 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -358,7 +358,7 @@ WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _currWidget(NULL) { } -void WidgetScene::getMousPos(NPoint &pt) { +void WidgetScene::getMousePos(NPoint &pt) { pt.x = _mouseCursor->getX(); pt.y = _mouseCursor->getY(); } @@ -397,7 +397,7 @@ void Widget::hide() { void Widget::onClick() { _parentScene->setCurrWidget(this); - // TODO Somehow _parentScene->onClick(_itemID, 0); + // TODO _parentScene->onClick(_itemID, 0); } void Widget::setPosition(int16 x, int16 y) { @@ -406,7 +406,7 @@ void Widget::setPosition(int16 x, int16 y) { updateBounds(); } -void Widget::refresh() { +void Widget::refreshPosition() { _needRefresh = true; StaticSprite::updatePosition(); _collisionBoundsOffset.set(0, 0, @@ -494,8 +494,117 @@ void TextLabelWidget::setString(const byte *string, int stringLen) { _stringLen = stringLen; } -void TextLabelWidget::setY(int16 y) { - _ty = y; +void TextLabelWidget::setTY(int16 ty) { + _ty = ty; +} + +SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, bool visible, + StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect) + : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority, visible), + _savegameList(savegameList), _textSurface1(textSurface1), _textSurface2(textSurface2), _fileHash1(fileHash1), _rect(rect), + _maxStringLength(0), _topIndex(0), _visibleItemsCount(0), _currIndex(0) { + + _maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface1->getCharHeight(); + _maxStringLength = (_rect.x2 - _rect.x1) / _textSurface1->getCharWidth(); +} + +void SavegameListBox::onClick() { + NPoint mousePos; + int16 w = _rect.x2 - _rect.x1, h = _rect.y2 - _rect.y1; + _parentScene->getMousePos(mousePos); + mousePos.x -= _x + _rect.x1; + mousePos.y -= _y + _rect.y1; + if (mousePos.x >= 0 && mousePos.x <= w && mousePos.y >= 0 && mousePos.y <= h) { + int newIndex = _topIndex + mousePos.y / _textSurface1->getCharHeight(); + if (newIndex <= _visibleItemsCount) { + _currIndex = newIndex; + refresh(); + _parentScene->setCurrWidget(this); + // TODO _parentScene->onClick(_itemID, 5); + } + } +} + +void SavegameListBox::addSprite() { + _spriteResource.load2(_fileHash1); + createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + refreshPosition(); + _parentScene->addSprite(this); + _vm->_collisionMan->addSprite(this); + if (_visible) + show(); + else + hide(); + buildItems(); + _topIndex = 0; + _visibleItemsCount = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size()); + refresh(); +} + +void SavegameListBox::buildItems() { + StringArray &savegameList = *_savegameList; + int16 itemX = _rect.x1, itemY = 0; + for (uint i = 0; i < savegameList.size(); ++i) { + const byte *string = (const byte*)savegameList[i].c_str(); + int stringLen = (int)savegameList[i].size(); + TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1, + _baseSurfacePriority + 1, _visible, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface1); + label->addSprite(); + _textLabelItems.push_back(label); + } +} + +void SavegameListBox::drawItems() { + for (int i = 0; i < (int)_textLabelItems.size(); ++i) { + TextLabelWidget *label = _textLabelItems[i]; + if (i >= _topIndex && i <= _visibleItemsCount) { + label->setY(_rect.y1 + (i - _topIndex) * _textSurface1->getCharHeight()); + label->updateBounds(); + label->drawString(_maxStringLength); + } else { + label->clear(); + } + } +} + +void SavegameListBox::refresh() { + refreshPosition(); + drawItems(); +} + +void SavegameListBox::scrollUp() { + if (_topIndex > 0) { + --_topIndex; + --_visibleItemsCount; + refresh(); + } +} + +void SavegameListBox::scrollDown() { + if (_visibleItemsCount < (int)_textLabelItems.size()) { + ++_topIndex; + ++_visibleItemsCount; + refresh(); + } +} + +void SavegameListBox::pageUp() { + int distance = MIN(_topIndex, _maxVisibleItemsCount); + if (distance > 0) { + _topIndex -= distance; + _visibleItemsCount = distance; + refresh(); + } +} + +void SavegameListBox::pageDown() { + int distance = MIN((int)_textLabelItems.size() - _visibleItemsCount - 1, _maxVisibleItemsCount); + if (distance > 0) { + _topIndex += distance; + _visibleItemsCount += distance; + refresh(); + } } } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 8381b4eb30..1d7678d4bf 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -79,12 +79,14 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; +typedef Common::Array StringArray; + class Widget; class WidgetScene : public Scene { public: WidgetScene(NeverhoodEngine *vm, Module *parentModule); - void getMousPos(NPoint &pt); + void getMousePos(NPoint &pt); virtual void setCurrWidget(Widget *newWidget); protected: Widget *_currWidget; @@ -98,7 +100,7 @@ public: virtual void hide(); virtual void onClick(); virtual void setPosition(int16 x, int16 y); - virtual void refresh(); + virtual void refreshPosition(); virtual void addSprite(); virtual int16 getWidth(); virtual int16 getHeight(); @@ -127,7 +129,7 @@ public: void clear(); void setString(const byte *string, int stringLen); TextSurface *getTextSurface() const { return _textSurface; } - void setY(int16 y); + void setTY(int16 ty); protected: BaseSurface *_drawSurface; int16 _tx, _ty; @@ -136,6 +138,34 @@ protected: int _stringLen; }; +class SavegameListBox : public Widget { +public: + SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, bool visible, + StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect); + virtual void onClick(); + virtual void addSprite(); + void buildItems(); + void drawItems(); + void refresh(); + void scrollUp(); + void scrollDown(); + void pageUp(); + void pageDown(); +protected: + NRect _rect; + uint32 _fileHash1; + int _maxStringLength; + Common::Array _textLabelItems; + int _topIndex; + int _visibleItemsCount; + StringArray *_savegameList; + TextSurface *_textSurface1; + TextSurface *_textSurface2; + int _currIndex; + int _maxVisibleItemsCount; +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MENUMODULE_H */ -- cgit v1.2.3 From 6be5c1171332764dacad9113250ede7e765bb361 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 27 Oct 2012 22:18:54 +0000 Subject: NEVERHOOD: More work on the menu system: - Add handling of ascii and system key input - Fix TextSurface::drawChar() - Pause audio when entering the menu, resume it again afterwards - Add TextEditWidget - Add SaveGameMenu (doesn't actually save anything yet and needs more work) --- engines/neverhood/gamemodule.cpp | 32 ++- engines/neverhood/gamemodule.h | 4 +- engines/neverhood/graphics.cpp | 6 +- engines/neverhood/menumodule.cpp | 522 ++++++++++++++++++++++++++++++--------- engines/neverhood/menumodule.h | 92 +++++-- engines/neverhood/neverhood.cpp | 12 +- engines/neverhood/scene.cpp | 27 +- engines/neverhood/scene.h | 2 +- 8 files changed, 520 insertions(+), 177 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 65164859c9..ce72a22835 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -123,13 +123,6 @@ void GameModule::handleMouseUp(int16 x, int16 y) { } } -void GameModule::handleEscapeKey() { - if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) - _mainMenuRequested = true; - else - sendMessage(_childObject, 0x000C, 0); -} - void GameModule::handleSpaceKey() { if (_childObject) { debug(2, "GameModule::handleSpaceKey()"); @@ -137,6 +130,31 @@ void GameModule::handleSpaceKey() { } } +void GameModule::handleAsciiKey(char key) { + if (_childObject) { + debug(2, "GameModule::handleAsciiKey()"); + sendMessage(_childObject, 0x000A, (uint32)key); + } +} + +void GameModule::handleKeyDown(Common::KeyCode keyCode) { + if (_childObject) { + if (keyCode == Common::KEYCODE_ESCAPE) + handleEscapeKey(); + else if (keyCode == Common::KEYCODE_SPACE) + handleSpaceKey(); + debug(2, "GameModule::handleKeyDown()"); + sendMessage(_childObject, 0x000B, keyCode); + } +} + +void GameModule::handleEscapeKey() { + if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) + _mainMenuRequested = true; + else if (_childObject) + sendMessage(_childObject, 0x000C, 0); +} + void GameModule::initKeySlotsPuzzle() { if (!getSubVar(VA_IS_PUZZLE_INIT, 0x25400B10)) { NonRepeatingRandomNumbers keySlots(_vm->_rnd, 16); diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 8fafe2ba9e..81ebfb85bb 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -37,8 +37,10 @@ public: void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); void handleMouseUp(int16 x, int16 y); - void handleEscapeKey(); void handleSpaceKey(); + void handleAsciiKey(char key); + void handleKeyDown(Common::KeyCode keyCode); + void handleEscapeKey(); void initKeySlotsPuzzle(); void initMemoryPuzzle(); void initWaterPipesPuzzle(); diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index b87c447b31..81cec9f46d 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -180,7 +180,7 @@ TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, u : BaseSurface(vm, 0, charWidth * charCount, charHeight * numRows), _numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _fileHash(fileHash), _charCount(charCount) { - + SpriteResource spriteResource(_vm); spriteResource.load2(_fileHash); drawSpriteResourceEx(spriteResource, false, false, 0, 0); @@ -189,8 +189,8 @@ TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, u void TextSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) { NDrawRect sourceRect; chr -= _firstChar; - sourceRect.x = (chr % 16) * _charWidth; - sourceRect.y = (chr / 16) * _charHeight; + sourceRect.x = (chr % _charCount) * _charWidth; + sourceRect.y = (chr / _charCount) * _charHeight; sourceRect.width = _charWidth; sourceRect.height = _charHeight; destSurface->copyFrom(_surface, x, y, sourceRect, true); diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 7e1198abd0..6a82c47e8e 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -27,7 +27,8 @@ namespace Neverhood { enum { MAIN_MENU = 0, CREDITS_SCENE = 1, - MAKING_OF = 2 + MAKING_OF = 2, + SAVE_GAME_MENU = 3 }; static const uint32 kMakingOfSmackerFileHashList[] = { @@ -48,22 +49,18 @@ static const uint32 kMakingOfSmackerFileHashList[] = { }; MenuModule::MenuModule(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { + : Module(vm, parentModule), _savegameList(NULL) { SetMessageHandler(&MenuModule::handleMessage); - // TODO Check if the background actually needs to be saved - _savedBackground = new Background(_vm, 0); - _savedBackground->createSurface(0, 640, 480); - // TODO Save current palette - // TODO Stop all sounds and music - _savedPaletteData = _vm->_screen->getPaletteData(); + _vm->_mixer->pauseAll(true); createScene(MAIN_MENU, -1); } MenuModule::~MenuModule() { + _vm->_mixer->pauseAll(false); _vm->_screen->setPaletteData(_savedPaletteData); } @@ -79,6 +76,9 @@ void MenuModule::createScene(int sceneNum, int which) { case MAKING_OF: createSmackerScene(kMakingOfSmackerFileHashList, false, true, true); break; + case SAVE_GAME_MENU: + createSaveGameMenu(); + break; } SetUpdateHandler(&MenuModule::updateScene); _childObject->handleUpdate(); @@ -100,7 +100,7 @@ void MenuModule::updateScene() { break; case 2: debug("SAVE GAME"); - // TODO createSaveGameMenu(); + createScene(SAVE_GAME_MENU, -1); break; case 3: debug("RESUME GAME"); @@ -137,6 +137,9 @@ void MenuModule::updateScene() { case MAKING_OF: createScene(MAIN_MENU, -1); break; + case SAVE_GAME_MENU: + handleSaveGameMenuAction(_moduleResult); + break; default: break; } @@ -148,60 +151,38 @@ uint32 MenuModule::handleMessage(int messageNum, const MessageParam ¶m, Enti return Module::handleMessage(messageNum, param, sender);; } -static const uint32 kMainMenuButtonFileHashes[] = { - 0x36C62120, - 0x56C62120, - 0x96C62120, - 0x16C62121, - 0x16C62122, - 0x16C62124, - 0x16C62128, - 0x16C62130, - 0x16C62100 -}; +void MenuModule::createSaveGameMenu() { + // TODO Load actual savegames list :) + _savegameList = new StringArray(); + _savegameList->push_back(Common::String("Annoying scene")); + _savegameList->push_back(Common::String("Stuff happens")); + for (uint i = 0; i < 33; ++i) + _savegameList->push_back(Common::String::format("Game %d", i)); + _childObject = new SaveGameMenu(_vm, this, _savegameList); +} -MainMenuButton::MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex) - : StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) { +void MenuModule::handleSaveGameMenuAction(int action) { + if (action != 0) { + createScene(MAIN_MENU, -1); + } else { + // TODO Actual saving later 0048A62E + createScene(MAIN_MENU, -1); + } + delete _savegameList; + _savegameList = NULL; +} - loadSprite(kMainMenuButtonFileHashes[_buttonIndex], kSLFDefDrawOffset | kSLFDefPosition, 100); +MenuButton::MenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex, uint32 fileHash, const NRect &collisionBounds) + : StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) { - // TODO Move to const array - switch (_buttonIndex) { - case 0: - _collisionBounds.set(52, 121, 110, 156); - break; - case 1: - _collisionBounds.set(52, 192, 109, 222); - break; - case 2: - _collisionBounds.set(60, 257, 119, 286); - break; - case 3: - _collisionBounds.set(67, 326, 120, 354); - break; - case 4: - _collisionBounds.set(70, 389, 128, 416); - break; - case 5: - _collisionBounds.set(523, 113, 580, 144); - break; - case 6: - _collisionBounds.set(525, 176, 577, 206); - break; - case 7: - _collisionBounds.set(527, 384, 580, 412); - break; - case 8: - _collisionBounds.set(522, 255, 580, 289); - break; - } - + loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 100); + _collisionBounds = collisionBounds; setVisible(false); - SetUpdateHandler(&MainMenuButton::update); - SetMessageHandler(&MainMenuButton::handleMessage); + SetUpdateHandler(&MenuButton::update); + SetMessageHandler(&MenuButton::handleMessage); } -void MainMenuButton::update() { +void MenuButton::update() { updatePosition(); if (_countdown != 0 && (--_countdown) == 0) { setVisible(false); @@ -209,7 +190,7 @@ void MainMenuButton::update() { } } -uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 MenuButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x1011: @@ -226,6 +207,30 @@ uint32 MainMenuButton::handleMessage(int messageNum, const MessageParam ¶m, MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true) { + static const uint32 kMenuButtonFileHashes[] = { + 0x36C62120, + 0x56C62120, + 0x96C62120, + 0x16C62121, + 0x16C62122, + 0x16C62124, + 0x16C62128, + 0x16C62130, + 0x16C62100 + }; + + static const NRect kMenuButtonCollisionBounds[] = { + NRect(52, 121, 110, 156), + NRect(52, 192, 109, 222), + NRect(60, 257, 119, 286), + NRect(67, 326, 120, 354), + NRect(70, 389, 128, 416), + NRect(523, 113, 580, 144), + NRect(525, 176, 577, 206), + NRect(527, 384, 580, 412), + NRect(522, 255, 580, 289) + }; + setBackground(0x08C0020C); setPalette(0x08C0020C); insertMouse433(0x00208084); @@ -233,12 +238,13 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) insertStaticSprite(0x41137051, 100); insertStaticSprite(0xC10B2015, 100); - // TODO Only is music is disabled + // TODO Only if music is enabled _musicOnButton = insertStaticSprite(0x0C24C0EE, 100); for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) { - Sprite *mainMenuButton = insertSprite(this, buttonIndex); - _vm->_collisionMan->addSprite(mainMenuButton); + Sprite *menuButton = insertSprite(this, buttonIndex, + kMenuButtonFileHashes[buttonIndex], kMenuButtonCollisionBounds[buttonIndex]); + _vm->_collisionMan->addSprite(menuButton); } SetUpdateHandler(&Scene::update); @@ -341,7 +347,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En leaveScene(0); break; case 0x000B://TODO Implement this message - if (param.asInteger() == 27 && _canAbort) + if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort) leaveScene(0); break; case 0x101D: @@ -358,9 +364,11 @@ WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _currWidget(NULL) { } -void WidgetScene::getMousePos(NPoint &pt) { +NPoint WidgetScene::getMousePos() { + NPoint pt; pt.x = _mouseCursor->getX(); pt.y = _mouseCursor->getY(); + return pt; } void WidgetScene::setCurrWidget(Widget *newWidget) { @@ -372,10 +380,13 @@ void WidgetScene::setCurrWidget(Widget *newWidget) { } } +void WidgetScene::handleEvent(int16 itemID, int eventType) { +} + Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, bool visible) + int baseObjectPriority, int baseSurfacePriority) : StaticSprite(vm, baseObjectPriority), _itemID(itemID), _parentScene(parentScene), - _baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority), _visible(visible) { + _baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority) { SetUpdateHandler(&Widget::update); SetMessageHandler(&Widget::handleMessage); @@ -383,18 +394,6 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene setPosition(x, y); } -void Widget::show() { - if (_surface) - _surface->setVisible(true); - _visible = true; -} - -void Widget::hide() { - if (_surface) - _surface->setVisible(false); - _visible = false; -} - void Widget::onClick() { _parentScene->setCurrWidget(this); // TODO _parentScene->onClick(_itemID, 0); @@ -451,9 +450,9 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam ¶m, Entity * } TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, bool visible, + int baseObjectPriority, int baseSurfacePriority, const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface) - : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority, visible), + : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), _string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _textSurface(textSurface) { } @@ -473,13 +472,11 @@ int16 TextLabelWidget::getHeight() { void TextLabelWidget::drawString(int maxStringLength) { _textSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength)); - _visible = true; _collisionBoundsOffset.set(_tx, _ty, getWidth(), getHeight()); updateBounds(); } void TextLabelWidget::clear() { - _visible = false; _collisionBoundsOffset.set(0, 0, 0, 0); updateBounds(); } @@ -498,47 +495,215 @@ void TextLabelWidget::setTY(int16 ty) { _ty = ty; } +TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, + const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect) + : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), + _maxStringLength(maxStringLength), _textSurface(textSurface), _fileHash(fileHash), _rect(rect), + _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0) { + + _entryString = (const char*)string; + _maxVisibleChars = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth(); + _cursorPos = _entryString.size(); + + SetUpdateHandler(&TextEditWidget::update); + SetMessageHandler(&TextEditWidget::handleMessage); +} + +TextEditWidget::~TextEditWidget() { + delete _cursorSurface; +} + +void TextEditWidget::onClick() { + NPoint mousePos = _parentScene->getMousePos(); + mousePos.x -= _x + _rect.x1; + mousePos.y -= _y + _rect.y1; + if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 && + mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) { + if (_entryString.size() == 1) + _cursorPos = 0; + else { + int newCursorPos = mousePos.x / _textSurface->getCharWidth(); + if (mousePos.x % _textSurface->getCharWidth() > _textSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//### + ++newCursorPos; + _cursorPos = MIN((int)_entryString.size(), newCursorPos); + } + _cursorSurface->setVisible(true); + refresh(); + } + Widget::onClick(); +} + +void TextEditWidget::addSprite() { + SpriteResource cursorSpriteResource(_vm); + + _spriteResource.load2(_fileHash); + createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); + refreshPosition(); + _parentScene->addSprite(this); + _vm->_collisionMan->addSprite(this); + _surface->setVisible(true); + _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2, + 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, + (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _textSurface); + _textLabelWidget->addSprite(); + cursorSpriteResource.load2(_cursorFileHash); + _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); + _cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); + _cursorSurface->setVisible(true); + refresh(); +} + +void TextEditWidget::enterWidget() { + _cursorSurface->setVisible(true); + refresh(); +} + +void TextEditWidget::exitWidget() { + _cursorSurface->setVisible(false); + refresh(); +} + +void TextEditWidget::setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight) { + _cursorFileHash = cursorFileHash; + _cursorWidth = cursorWidth; + _cursorHeight = cursorHeight; +} + +void TextEditWidget::drawCursor() { + if (_cursorSurface->getVisible() && _cursorPos >= 0 && _cursorPos <= _maxVisibleChars) { + NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight); + _surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _textSurface->getCharWidth(), + _rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect, true); + } else + _cursorSurface->setVisible(false); +} + +void TextEditWidget::updateString() { + _textLabelWidget->setString((const byte *)_entryString.c_str(), _entryString.size()); + _textLabelWidget->drawString(_maxVisibleChars); +} + +void TextEditWidget::getString(Common::String &string) { + string = _entryString; +} + +void TextEditWidget::setString(const Common::String &string) { + _entryString = string; + _cursorPos = _entryString.size(); + refresh(); +} + +void TextEditWidget::handleAsciiKey(char ch) { + if ((int)_entryString.size() < _maxStringLength && + ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == ' ')) { + _entryString.insertChar(ch, _cursorPos); + ++_cursorPos; + refresh(); + } +} + +void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) { + bool doRefresh = true; + switch (keyCode) { + case Common::KEYCODE_DELETE: + if (_entryString.size() > 0 && _cursorPos < (int)_entryString.size()) + _entryString.deleteChar(_cursorPos); + break; + case Common::KEYCODE_HOME: + _cursorPos = 0; + break; + case Common::KEYCODE_END: + _cursorPos = _entryString.size(); + break; + case Common::KEYCODE_LEFT: + if (_entryString.size() > 0 && _cursorPos > 0) + --_cursorPos; + break; + case Common::KEYCODE_RIGHT: + if (_cursorPos < (int)_entryString.size()) + ++_cursorPos; + break; + case Common::KEYCODE_BACKSPACE: + if (_entryString.size() > 0 && _cursorPos > 0) + _entryString.deleteChar(--_cursorPos); + break; + default: + break; + } + if (doRefresh) { + _cursorSurface->setVisible(true); + _cursorTicks = 0; + refresh(); + } +} + +void TextEditWidget::refresh() { + refreshPosition(); + updateString(); + drawCursor(); +} + +void TextEditWidget::update() { + Widget::update(); + if (_parentScene->getCurrWidget() == this && _cursorTicks++ == 10) { + _cursorSurface->setVisible(!_cursorSurface->getVisible()); + refresh(); + _cursorTicks = 0; + } +} + +uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Widget::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x000A: + handleAsciiKey(param.asInteger()); + break; + case 0x000B: + handleKeyDown((Common::KeyCode)param.asInteger()); + break; + } + return messageResult; +} + SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, bool visible, - StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect) - : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority, visible), - _savegameList(savegameList), _textSurface1(textSurface1), _textSurface2(textSurface2), _fileHash1(fileHash1), _rect(rect), - _maxStringLength(0), _topIndex(0), _visibleItemsCount(0), _currIndex(0) { + int baseObjectPriority, int baseSurfacePriority, + StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect) + : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), + _savegameList(savegameList), _textSurface(textSurface), _bgFileHash(bgFileHash), _rect(rect), + _maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) { - _maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface1->getCharHeight(); - _maxStringLength = (_rect.x2 - _rect.x1) / _textSurface1->getCharWidth(); + _maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface->getCharHeight(); + _maxStringLength = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth(); } void SavegameListBox::onClick() { - NPoint mousePos; - int16 w = _rect.x2 - _rect.x1, h = _rect.y2 - _rect.y1; - _parentScene->getMousePos(mousePos); + NPoint mousePos = _parentScene->getMousePos(); mousePos.x -= _x + _rect.x1; mousePos.y -= _y + _rect.y1; - if (mousePos.x >= 0 && mousePos.x <= w && mousePos.y >= 0 && mousePos.y <= h) { - int newIndex = _topIndex + mousePos.y / _textSurface1->getCharHeight(); - if (newIndex <= _visibleItemsCount) { + if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 && + mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) { + int newIndex = _firstVisibleItem + mousePos.y / _textSurface->getCharHeight(); + if (newIndex <= _lastVisibleItem) { _currIndex = newIndex; refresh(); _parentScene->setCurrWidget(this); - // TODO _parentScene->onClick(_itemID, 5); + debug("_currIndex = %d", _currIndex); + _parentScene->handleEvent(_itemID, 5); } } } void SavegameListBox::addSprite() { - _spriteResource.load2(_fileHash1); + _spriteResource.load2(_bgFileHash); createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); _vm->_collisionMan->addSprite(this); - if (_visible) - show(); - else - hide(); + _surface->setVisible(true); buildItems(); - _topIndex = 0; - _visibleItemsCount = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size()); + _firstVisibleItem = 0; + _lastVisibleItem = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size()); refresh(); } @@ -549,7 +714,7 @@ void SavegameListBox::buildItems() { const byte *string = (const byte*)savegameList[i].c_str(); int stringLen = (int)savegameList[i].size(); TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1, - _baseSurfacePriority + 1, _visible, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface1); + _baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface); label->addSprite(); _textLabelItems.push_back(label); } @@ -558,13 +723,12 @@ void SavegameListBox::buildItems() { void SavegameListBox::drawItems() { for (int i = 0; i < (int)_textLabelItems.size(); ++i) { TextLabelWidget *label = _textLabelItems[i]; - if (i >= _topIndex && i <= _visibleItemsCount) { - label->setY(_rect.y1 + (i - _topIndex) * _textSurface1->getCharHeight()); + if (i >= _firstVisibleItem && i < _lastVisibleItem) { + label->setY(_rect.y1 + (i - _firstVisibleItem) * _textSurface->getCharHeight()); label->updateBounds(); label->drawString(_maxStringLength); - } else { + } else label->clear(); - } } } @@ -574,37 +738,153 @@ void SavegameListBox::refresh() { } void SavegameListBox::scrollUp() { - if (_topIndex > 0) { - --_topIndex; - --_visibleItemsCount; + if (_firstVisibleItem > 0) { + --_firstVisibleItem; + --_lastVisibleItem; refresh(); } } void SavegameListBox::scrollDown() { - if (_visibleItemsCount < (int)_textLabelItems.size()) { - ++_topIndex; - ++_visibleItemsCount; + if (_lastVisibleItem < (int)_textLabelItems.size()) { + ++_firstVisibleItem; + ++_lastVisibleItem; refresh(); } } void SavegameListBox::pageUp() { - int distance = MIN(_topIndex, _maxVisibleItemsCount); - if (distance > 0) { - _topIndex -= distance; - _visibleItemsCount = distance; + int amount = MIN(_firstVisibleItem, _maxVisibleItemsCount); + if (amount > 0) { + _firstVisibleItem -= amount; + _lastVisibleItem -= amount; refresh(); } } void SavegameListBox::pageDown() { - int distance = MIN((int)_textLabelItems.size() - _visibleItemsCount - 1, _maxVisibleItemsCount); - if (distance > 0) { - _topIndex += distance; - _visibleItemsCount += distance; + int amount = MIN((int)_textLabelItems.size() - _lastVisibleItem, _maxVisibleItemsCount); + if (amount > 0) { + _firstVisibleItem += amount; + _lastVisibleItem += amount; refresh(); } } +SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList) + : WidgetScene(vm, parentModule), _savegameList(savegameList) { + + static const uint32 kSaveGameMenuButtonFileHashes[] = { + 0x8359A824, + 0x0690E260, + 0x0352B050, + 0x1392A223, + 0x13802260, + 0x0B32B200 + }; + + static const NRect kSaveGameMenuButtonCollisionBounds[] = { + NRect(518, 106, 602, 160), + NRect(516, 378, 596, 434), + NRect(394, 108, 458, 206), + NRect(400, 204, 458, 276), + NRect(398, 292, 456, 352), + NRect(396, 352, 460, 444) + }; + + static const NRect kListBoxRect(0, 0, 320, 272); + static const NRect kTextEditRect(0, 0, 377, 17); + static const NRect kMouseRect(50, 47, 427, 64); + + _textSurface = new TextSurface(_vm, 0x2328121A, 7, 32, 32, 11, 17); + + setBackground(0x30084E25); + setPalette(0x30084E25); + insertMouse433(0x84E21308, &kMouseRect); + insertStaticSprite(0x1340A5C2, 200); + insertStaticSprite(0x1301A7EA, 200); + + _listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, 1000, 1000, + _savegameList, _textSurface, 0x1115A223, kListBoxRect); + _listBox->addSprite(); + + _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, + (const byte*)_savegameName.c_str(), 29, _textSurface, 0x3510A868, kTextEditRect); + _textEditWidget->setCursor(0x8290AC20, 2, 13); + _textEditWidget->addSprite(); + _textEditWidget->setString(_savegameName); + setCurrWidget(_textEditWidget); + + for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { + Sprite *menuButton = insertSprite(this, buttonIndex, + kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]); + _vm->_collisionMan->addSprite(menuButton); + } + + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&SaveGameMenu::handleMessage); +} + +SaveGameMenu::~SaveGameMenu() { + delete _textSurface; +} + +void SaveGameMenu::handleEvent(int16 itemID, int eventType) { + if (itemID == 69 && eventType == 5) { + uint currIndex = _listBox->getCurrIndex(); + _textEditWidget->setString((*_savegameList)[currIndex]); + setCurrWidget(_textEditWidget); + } +} + +uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x000A: + sendMessage(_textEditWidget, 0x000A, param.asInteger()); + setCurrWidget(_textEditWidget); + break; + case 0x000B: + if (param.asInteger() == Common::KEYCODE_RETURN) { + // Return + // TODO 00486B05 + // Get string from edit field and inform main module + leaveScene(0); + } else if (param.asInteger() == Common::KEYCODE_ESCAPE) { + // Escape + leaveScene(1); + } else { + sendMessage(_textEditWidget, 0x000B, param.asInteger()); + setCurrWidget(_textEditWidget); + } + break; + case 0x2000: + // Handle menu button click + switch (param.asInteger()) { + case 0: + // TODO Same handling as Return + leaveScene(0); + break; + case 1: + leaveScene(1); + break; + case 2: + _listBox->pageUp(); + break; + case 3: + _listBox->scrollUp(); + break; + case 4: + _listBox->scrollDown(); + break; + case 5: + _listBox->pageDown(); + break; + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 1d7678d4bf..7c1e6e1041 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -30,6 +30,8 @@ namespace Neverhood { +typedef Common::Array StringArray; + class MenuModule : public Module { public: MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); @@ -37,17 +39,18 @@ public: protected: int _sceneNum; Common::String _savegameName; - Background *_savedBackground; byte *_savedPaletteData; - // TODO _savegameList (list of strings?) + StringArray *_savegameList; void createScene(int sceneNum, int which); void updateScene(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createSaveGameMenu(); + void handleSaveGameMenuAction(int action); }; -class MainMenuButton : public StaticSprite { +class MenuButton : public StaticSprite { public: - MainMenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex); + MenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex, uint32 fileHash, const NRect &collisionBounds); protected: Scene *_parentScene; int _countdown; @@ -79,15 +82,15 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -typedef Common::Array StringArray; - class Widget; class WidgetScene : public Scene { public: WidgetScene(NeverhoodEngine *vm, Module *parentModule); - void getMousePos(NPoint &pt); + NPoint getMousePos(); virtual void setCurrWidget(Widget *newWidget); + virtual Widget *getCurrWidget() { return _currWidget; } + virtual void handleEvent(int16 itemID, int eventType); protected: Widget *_currWidget; }; @@ -95,9 +98,7 @@ protected: class Widget : public StaticSprite { public: Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, bool visible); - virtual void show(); - virtual void hide(); + int baseObjectPriority, int baseSurfacePriority); virtual void onClick(); virtual void setPosition(int16 x, int16 y); virtual void refreshPosition(); @@ -111,7 +112,6 @@ protected: WidgetScene *_parentScene; int _baseObjectPriority; int _baseSurfacePriority; - bool _visible; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -119,7 +119,7 @@ protected: class TextLabelWidget : public Widget { public: TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, bool visible, + int baseObjectPriority, int baseSurfacePriority, const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface); virtual void onClick(); virtual void addSprite(); @@ -138,11 +138,46 @@ protected: int _stringLen; }; +class TextEditWidget : public Widget { +public: + TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + int baseObjectPriority, int baseSurfacePriority, + const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect); + ~TextEditWidget(); + virtual void onClick(); + virtual void addSprite(); + virtual void enterWidget(); + virtual void exitWidget(); + void setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight); + void drawCursor(); + void updateString(); + void getString(Common::String &string); + void setString(const Common::String &string); + void handleAsciiKey(char ch); + void handleKeyDown(Common::KeyCode keyCode); + void refresh(); +protected: + NRect _rect; + uint32 _fileHash; + int _maxVisibleChars; + int _maxStringLength; + int _cursorPos; + int _cursorTicks; + Common::String _entryString; + TextSurface *_textSurface; + TextLabelWidget *_textLabelWidget; + BaseSurface *_cursorSurface; + uint32 _cursorFileHash; + int16 _cursorWidth, _cursorHeight; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + class SavegameListBox : public Widget { public: SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, bool visible, - StringArray *savegameList, TextSurface *textSurface1, TextSurface *textSurface2, uint32 fileHash1, NRect &rect); + int baseObjectPriority, int baseSurfacePriority, + StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect); virtual void onClick(); virtual void addSprite(); void buildItems(); @@ -152,20 +187,35 @@ public: void scrollDown(); void pageUp(); void pageDown(); + uint getCurrIndex() const { return _currIndex; } protected: - NRect _rect; - uint32 _fileHash1; + const NRect _rect; + uint32 _bgFileHash; int _maxStringLength; Common::Array _textLabelItems; - int _topIndex; - int _visibleItemsCount; + int _firstVisibleItem; + int _lastVisibleItem; StringArray *_savegameList; - TextSurface *_textSurface1; - TextSurface *_textSurface2; - int _currIndex; + TextSurface *_textSurface; + uint _currIndex; int _maxVisibleItemsCount; }; +class SaveGameMenu : public WidgetScene { +public: + SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList); + ~SaveGameMenu(); + virtual void handleEvent(int16 itemID, int eventType); +protected: + StringArray *_savegameList; + TextSurface *_textSurface; + SavegameListBox *_listBox; + TextEditWidget *_textEditWidget; + Common::String _savegameName; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + } // End of namespace Neverhood #endif /* NEVERHOOD_MENUMODULE_H */ diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 9141de078a..208a1572e2 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -112,16 +112,8 @@ Common::Error NeverhoodEngine::run() { switch (event.type) { case Common::EVENT_KEYDOWN: _keyState = event.kbd.keycode; - switch (_keyState) { - case Common::KEYCODE_ESCAPE: - _gameModule->handleEscapeKey(); - break; - case Common::KEYCODE_SPACE: - _gameModule->handleSpaceKey(); - break; - default: - break; - } + _gameModule->handleKeyDown(event.kbd.keycode); + _gameModule->handleAsciiKey(event.kbd.ascii); break; case Common::EVENT_KEYUP: _keyState = Common::KEYCODE_INVALID; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 9e49c6b137..aa4efaca13 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -100,28 +100,29 @@ void Scene::addEntity(Entity *entity) { } bool Scene::removeEntity(Entity *entity) { - for (uint index = 0; index < _entities.size(); index++) { + for (uint index = 0; index < _entities.size(); index++) if (_entities[index] == entity) { _entities.remove_at(index); return true; } - } return false; } void Scene::addSurface(BaseSurface *surface) { - int index = 0, insertIndex = -1; - for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { - if ((*iter)->getPriority() > surface->getPriority()) { - insertIndex = index; - break; + if (surface) { + int index = 0, insertIndex = -1; + for (Common::Array::iterator iter = _surfaces.begin(); iter != _surfaces.end(); iter++) { + if ((*iter)->getPriority() > surface->getPriority()) { + insertIndex = index; + break; + } + index++; } - index++; + if (insertIndex >= 0) + _surfaces.insert_at(insertIndex, surface); + else + _surfaces.push_back(surface); } - if (insertIndex >= 0) - _surfaces.insert_at(insertIndex, surface); - else - _surfaces.push_back(surface); } bool Scene::removeSurface(BaseSurface *surface) { @@ -191,7 +192,7 @@ Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { return addSprite(new StaticSprite(_vm, fileHash, surfacePriority)); } -void Scene::insertMouse433(uint32 fileHash, NRect *mouseRect) { +void Scene::insertMouse433(uint32 fileHash, const NRect *mouseRect) { NRect rect(-1, -1, -1, -1); if (mouseRect) rect = *mouseRect; diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index c9e27f7bb4..21f054e123 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -59,7 +59,7 @@ public: void setPalette(uint32 fileHash = 0); void setHitRects(uint32 id); Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); - void insertMouse433(uint32 fileHash, NRect *mouseRect = NULL); + void insertMouse433(uint32 fileHash, const NRect *mouseRect = NULL); void insertMouse435(uint32 fileHash, int16 x1, int16 x2); void insertNavigationMouse(uint32 fileHash, int type); void showMouse(bool visible); -- cgit v1.2.3 From 73e0372cefad2fa4eb95d4c02c66b3361b7599be Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 28 Oct 2012 16:23:54 +0000 Subject: NEVERHOOD: A little more work on the menu stuff --- engines/neverhood/menumodule.cpp | 56 +++++++++++++++++++++++----------------- engines/neverhood/menumodule.h | 16 +++++++----- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 6a82c47e8e..528d3035ff 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -64,6 +64,13 @@ MenuModule::~MenuModule() { _vm->_screen->setPaletteData(_savedPaletteData); } +void MenuModule::setSavegameInfo(const Common::String &description, uint slot, bool newSavegame) { + _savegameDescription = description; + _savegameSlot = slot; + _newSavegame = newSavegame; + debug("SAVEGAME: description = [%s]; slot = %d; new = %d", description.c_str(), slot, newSavegame); +} + void MenuModule::createScene(int sceneNum, int which) { _sceneNum = sceneNum; switch (_sceneNum) { @@ -491,20 +498,16 @@ void TextLabelWidget::setString(const byte *string, int stringLen) { _stringLen = stringLen; } -void TextLabelWidget::setTY(int16 ty) { - _ty = ty; -} - TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, - const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect) + int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface, + uint32 fileHash, const NRect &rect) : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), _maxStringLength(maxStringLength), _textSurface(textSurface), _fileHash(fileHash), _rect(rect), - _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0) { + _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0), + _modified(false) { - _entryString = (const char*)string; _maxVisibleChars = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth(); - _cursorPos = _entryString.size(); + _cursorPos = 0; SetUpdateHandler(&TextEditWidget::update); SetMessageHandler(&TextEditWidget::handleMessage); @@ -584,13 +587,14 @@ void TextEditWidget::updateString() { _textLabelWidget->drawString(_maxVisibleChars); } -void TextEditWidget::getString(Common::String &string) { - string = _entryString; +Common::String& TextEditWidget::getString() { + return _entryString; } void TextEditWidget::setString(const Common::String &string) { _entryString = string; _cursorPos = _entryString.size(); + _modified = false; refresh(); } @@ -599,6 +603,7 @@ void TextEditWidget::handleAsciiKey(char ch) { ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == ' ')) { _entryString.insertChar(ch, _cursorPos); ++_cursorPos; + _modified = true; refresh(); } } @@ -606,10 +611,6 @@ void TextEditWidget::handleAsciiKey(char ch) { void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) { bool doRefresh = true; switch (keyCode) { - case Common::KEYCODE_DELETE: - if (_entryString.size() > 0 && _cursorPos < (int)_entryString.size()) - _entryString.deleteChar(_cursorPos); - break; case Common::KEYCODE_HOME: _cursorPos = 0; break; @@ -624,9 +625,17 @@ void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) { if (_cursorPos < (int)_entryString.size()) ++_cursorPos; break; + case Common::KEYCODE_DELETE: + if (_entryString.size() > 0 && _cursorPos < (int)_entryString.size()) { + _entryString.deleteChar(_cursorPos); + _modified = true; + } + break; case Common::KEYCODE_BACKSPACE: - if (_entryString.size() > 0 && _cursorPos > 0) + if (_entryString.size() > 0 && _cursorPos > 0) { _entryString.deleteChar(--_cursorPos); + _modified = true; + } break; default: break; @@ -808,11 +817,10 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra _savegameList, _textSurface, 0x1115A223, kListBoxRect); _listBox->addSprite(); - _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, - (const byte*)_savegameName.c_str(), 29, _textSurface, 0x3510A868, kTextEditRect); + _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, 29, + _textSurface, 0x3510A868, kTextEditRect); _textEditWidget->setCursor(0x8290AC20, 2, 13); _textEditWidget->addSprite(); - _textEditWidget->setString(_savegameName); setCurrWidget(_textEditWidget); for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { @@ -847,12 +855,10 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En break; case 0x000B: if (param.asInteger() == Common::KEYCODE_RETURN) { - // Return - // TODO 00486B05 - // Get string from edit field and inform main module + ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), + _listBox->getCurrIndex(), _textEditWidget->isModified()); leaveScene(0); } else if (param.asInteger() == Common::KEYCODE_ESCAPE) { - // Escape leaveScene(1); } else { sendMessage(_textEditWidget, 0x000B, param.asInteger()); @@ -863,7 +869,9 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En // Handle menu button click switch (param.asInteger()) { case 0: - // TODO Same handling as Return + // TODO Same handling as Return, merge + ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), + _listBox->getCurrIndex(), _textEditWidget->isModified()); leaveScene(0); break; case 1: diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 7c1e6e1041..0f45795ab9 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -36,11 +36,14 @@ class MenuModule : public Module { public: MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~MenuModule(); + void setSavegameInfo(const Common::String &description, uint slot, bool newSavegame); protected: int _sceneNum; - Common::String _savegameName; byte *_savedPaletteData; StringArray *_savegameList; + Common::String _savegameDescription; + uint _savegameSlot; + bool _newSavegame; void createScene(int sceneNum, int which); void updateScene(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -129,7 +132,6 @@ public: void clear(); void setString(const byte *string, int stringLen); TextSurface *getTextSurface() const { return _textSurface; } - void setTY(int16 ty); protected: BaseSurface *_drawSurface; int16 _tx, _ty; @@ -141,8 +143,8 @@ protected: class TextEditWidget : public Widget { public: TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, - const byte *string, int maxStringLength, TextSurface *textSurface, uint32 fileHash, const NRect &rect); + int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface, + uint32 fileHash, const NRect &rect); ~TextEditWidget(); virtual void onClick(); virtual void addSprite(); @@ -151,11 +153,12 @@ public: void setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight); void drawCursor(); void updateString(); - void getString(Common::String &string); + Common::String& getString(); void setString(const Common::String &string); void handleAsciiKey(char ch); void handleKeyDown(Common::KeyCode keyCode); void refresh(); + bool isModified() const { return _modified; } protected: NRect _rect; uint32 _fileHash; @@ -169,6 +172,7 @@ protected: BaseSurface *_cursorSurface; uint32 _cursorFileHash; int16 _cursorWidth, _cursorHeight; + bool _modified; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -211,7 +215,7 @@ protected: TextSurface *_textSurface; SavegameListBox *_listBox; TextEditWidget *_textEditWidget; - Common::String _savegameName; + Common::String _savegameDescription; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 685ce4e3122dfd48ce136f6bc6baaacf142e8850 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 13 Nov 2012 13:19:49 +0000 Subject: NEVERHOOD: Add initCodeSymbolsPuzzle --- engines/neverhood/gamemodule.cpp | 17 +++++++++++++++++ engines/neverhood/gamemodule.h | 3 ++- engines/neverhood/module1600.cpp | 2 +- engines/neverhood/module3000.cpp | 2 +- 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index ce72a22835..c7ce53fe79 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -262,6 +262,23 @@ void GameModule::initCannonSymbolsPuzzle() { } } +void GameModule::initCodeSymbolsPuzzle() { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x0CD09B50)) { + for (int i = 0; i < 12; ++i) + setSubVar(VA_CODE_SYMBOLS, i, i); + for (int i = 0; i < 12; ++i) { + uint32 index1 = _vm->_rnd->getRandomNumber(12 - 1); + uint32 index2 = _vm->_rnd->getRandomNumber(12 - 1); + uint32 temp = getSubVar(VA_CODE_SYMBOLS, index1); + setSubVar(VA_CODE_SYMBOLS, index1, getSubVar(VA_CODE_SYMBOLS, index2)); + setSubVar(VA_CODE_SYMBOLS, index2, temp); + } + setGlobalVar(V_NOISY_SYMBOL_INDEX, _vm->_rnd->getRandomNumber(11 - 1) + 1); + setSubVar(VA_IS_PUZZLE_INIT, 0x0CD09B50, 1); + } + +} + uint32 GameModule::getCurrRadioMusicFileHash() { uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); return (musicIndex % 5 != 0) ? 0 : kRadioMusicFileHashes[CLIP(musicIndex / 5, 0, 17)]; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 81ebfb85bb..e1461d2413 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -46,8 +46,9 @@ public: void initWaterPipesPuzzle(); void initRadioPuzzle(); void initTestTubes1Puzzle(); - void initTestTubes2Puzzle(); + void initTestTubes2Puzzle(); void initCannonSymbolsPuzzle(); + void initCodeSymbolsPuzzle(); uint32 getCurrRadioMusicFileHash(); protected: Entity *_prevChildObject; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index db8eeab4ab..ca4d2e5322 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1317,7 +1317,7 @@ void Scene1608::updateKlaymanCliprect() { Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) : Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { - // TODO _vm->gameModule()->initScene3011Vars(); + _vm->gameModule()->initCodeSymbolsPuzzle(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); SetMessageHandler(&Scene1609::handleMessage); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 9c2d896802..1fc1f5339b 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -1450,7 +1450,7 @@ void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) { Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) { - // TODO _vm->gameModule()->initScene3011Vars(); + _vm->gameModule()->initCodeSymbolsPuzzle(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); SetMessageHandler(&Scene3011::handleMessage); -- cgit v1.2.3 From 1904e944c561a21dbe6271f64393f2bfc5f584f9 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Nov 2012 12:21:13 +0000 Subject: NEVERHOOD: Add initCubeSymbolsPuzzle - Add microtiles to the screen update to eliminate overdraw (microtiles code taken from the Toltecs engine) - Fix sprite dimensions in AsScene1402PuzzleBox which caused a crash - Fix screen shaking in Scene1402 (the puzzle box and bridge parts now shake along :) - Use addSoundItem/addMusicItem in the SoundMan instead of directly using push_back on the resp. arrays - Remove old code and comments --- engines/neverhood/gamemodule.cpp | 14 ++- engines/neverhood/gamemodule.h | 1 + engines/neverhood/microtiles.cpp | 164 ++++++++++++++++++++++++++++++++++++ engines/neverhood/microtiles.h | 64 ++++++++++++++ engines/neverhood/module.mk | 1 + engines/neverhood/module1400.cpp | 12 +-- engines/neverhood/module2200.cpp | 7 +- engines/neverhood/scene.cpp | 153 +++++++++------------------------ engines/neverhood/scene.h | 13 ++- engines/neverhood/screen.cpp | 94 +++++++-------------- engines/neverhood/screen.h | 8 +- engines/neverhood/smackerplayer.cpp | 17 +--- engines/neverhood/smackerplayer.h | 1 - engines/neverhood/sound.cpp | 44 +++++----- engines/neverhood/sprite.cpp | 11 +-- 15 files changed, 357 insertions(+), 247 deletions(-) create mode 100644 engines/neverhood/microtiles.cpp create mode 100644 engines/neverhood/microtiles.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c7ce53fe79..be4f5d3d51 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -276,7 +276,15 @@ void GameModule::initCodeSymbolsPuzzle() { setGlobalVar(V_NOISY_SYMBOL_INDEX, _vm->_rnd->getRandomNumber(11 - 1) + 1); setSubVar(VA_IS_PUZZLE_INIT, 0x0CD09B50, 1); } +} +void GameModule::initCubeSymbolsPuzzle() { + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x60400854)) { + NonRepeatingRandomNumbers cubeSymbols(_vm->_rnd, 9); + for (uint32 cubePosition = 0; cubePosition < 9; ++cubePosition) + setSubVar(VA_CUBE_POSITIONS, cubePosition, (uint32)(cubeSymbols.getNumber() - 1)); + setSubVar(VA_IS_PUZZLE_INIT, 0x60400854, 1); + } } uint32 GameModule::getCurrRadioMusicFileHash() { @@ -352,7 +360,7 @@ void GameModule::startup() { setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4); // <<>> createScene(_vm->gameState().sceneNum, _vm->gameState().which); @@ -364,9 +372,9 @@ void GameModule::startup() { _vm->gameState().sceneNum = 28; createModule(2700, -1); #endif -#if 0 +#if 1 _vm->gameState().sceneNum = 0; - createModule(1800, -1); + createModule(1400, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index e1461d2413..53adb859f8 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -49,6 +49,7 @@ public: void initTestTubes2Puzzle(); void initCannonSymbolsPuzzle(); void initCodeSymbolsPuzzle(); + void initCubeSymbolsPuzzle(); uint32 getCurrRadioMusicFileHash(); protected: Entity *_prevChildObject; diff --git a/engines/neverhood/microtiles.cpp b/engines/neverhood/microtiles.cpp new file mode 100644 index 0000000000..ee64fdadc5 --- /dev/null +++ b/engines/neverhood/microtiles.cpp @@ -0,0 +1,164 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * + */ + +#include "neverhood/microtiles.h" + +namespace Neverhood { + +MicroTileArray::MicroTileArray(int16 width, int16 height) { + _tilesW = (width / TileSize) + ((width % TileSize) > 0 ? 1 : 0); + _tilesH = (height / TileSize) + ((height % TileSize) > 0 ? 1 : 0); + _tiles = new BoundingBox[_tilesW * _tilesH]; + clear(); +} + +MicroTileArray::~MicroTileArray() { + delete[] _tiles; +} + +void MicroTileArray::addRect(Common::Rect r) { + + int ux0, uy0, ux1, uy1; + int tx0, ty0, tx1, ty1; + int ix0, iy0, ix1, iy1; + + r.clip(Common::Rect(0, 0, 639, 479)); + + ux0 = r.left / TileSize; + uy0 = r.top / TileSize; + ux1 = r.right / TileSize; + uy1 = r.bottom / TileSize; + + tx0 = r.left % TileSize; + ty0 = r.top % TileSize; + tx1 = r.right % TileSize; + ty1 = r.bottom % TileSize; + + for (int yc = uy0; yc <= uy1; yc++) { + for (int xc = ux0; xc <= ux1; xc++) { + ix0 = (xc == ux0) ? tx0 : 0; + ix1 = (xc == ux1) ? tx1 : TileSize - 1; + iy0 = (yc == uy0) ? ty0 : 0; + iy1 = (yc == uy1) ? ty1 : TileSize - 1; + updateBoundingBox(_tiles[xc + yc * _tilesW], ix0, iy0, ix1, iy1); + } + } + +} + +void MicroTileArray::clear() { + memset(_tiles, 0, _tilesW * _tilesH * sizeof(BoundingBox)); +} + +byte MicroTileArray::TileX0(const BoundingBox &boundingBox) { + return (boundingBox >> 24) & 0xFF; +} + +byte MicroTileArray::TileY0(const BoundingBox &boundingBox) { + return (boundingBox >> 16) & 0xFF; +} + +byte MicroTileArray::TileX1(const BoundingBox &boundingBox) { + return (boundingBox >> 8) & 0xFF; +} + +byte MicroTileArray::TileY1(const BoundingBox &boundingBox) { + return boundingBox & 0xFF; +} + +bool MicroTileArray::isBoundingBoxEmpty(const BoundingBox &boundingBox) { + return boundingBox == EmptyBoundingBox; +} + +bool MicroTileArray::isBoundingBoxFull(const BoundingBox &boundingBox) { + return boundingBox == FullBoundingBox; +} + +void MicroTileArray::setBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1) { + boundingBox = (x0 << 24) | (y0 << 16) | (x1 << 8) | y1; +} + +void MicroTileArray::updateBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1) { + if (!isBoundingBoxEmpty(boundingBox)) { + x0 = MIN(TileX0(boundingBox), x0); + y0 = MIN(TileY0(boundingBox), y0); + x1 = MAX(TileX1(boundingBox), x1); + y1 = MAX(TileY1(boundingBox), y1); + } + setBoundingBox(boundingBox, x0, y0, x1, y1); +} + +RectArray *MicroTileArray::getRectangles() { + + RectArray *rects = new RectArray(); + + int x, y; + int x0, y0, x1, y1; + int i = 0; + + for (y = 0; y < _tilesH; ++y) { + for (x = 0; x < _tilesW; ++x) { + + int start; + int finish = 0; + BoundingBox boundingBox = _tiles[i]; + + if (isBoundingBoxEmpty(boundingBox)) { + ++i; + continue; + } + + x0 = (x * TileSize) + TileX0(boundingBox); + y0 = (y * TileSize) + TileY0(boundingBox); + y1 = (y * TileSize) + TileY1(boundingBox); + + start = i; + + if (TileX1(boundingBox) == TileSize - 1 && x != _tilesW - 1) { // check if the tile continues + while (!finish) { + ++x; + ++i; + if (x == _tilesW || i >= _tilesW * _tilesH || + TileY0(_tiles[i]) != TileY0(boundingBox) || + TileY1(_tiles[i]) != TileY1(boundingBox) || + TileX0(_tiles[i]) != 0) + { + --x; + --i; + finish = 1; + } + } + } + + x1 = (x * TileSize) + TileX1(_tiles[i]); + + rects->push_back(Common::Rect(x0, y0, x1 + 1, y1 + 1)); + + ++i; + } + } + + return rects; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/microtiles.h b/engines/neverhood/microtiles.h new file mode 100644 index 0000000000..2ad6796903 --- /dev/null +++ b/engines/neverhood/microtiles.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * + */ + +#ifndef NEVERHOOD_MICROTILES_H +#define NEVERHOOD_MICROTILES_H + +#include "common/scummsys.h" +#include "common/array.h" +#include "common/util.h" +#include "common/rect.h" + +namespace Neverhood { + +typedef uint32 BoundingBox; + +const BoundingBox FullBoundingBox = 0x00001F1F; +const BoundingBox EmptyBoundingBox = 0x00000000; +const int TileSize = 32; + +typedef Common::Array RectArray; + +class MicroTileArray { +public: + MicroTileArray(int16 width, int16 height); + ~MicroTileArray(); + void addRect(Common::Rect r); + void clear(); + RectArray *getRectangles(); +protected: + BoundingBox *_tiles; + int16 _tilesW, _tilesH; + byte TileX0(const BoundingBox &boundingBox); + byte TileY0(const BoundingBox &boundingBox); + byte TileX1(const BoundingBox &boundingBox); + byte TileY1(const BoundingBox &boundingBox); + bool isBoundingBoxEmpty(const BoundingBox &boundingBox); + bool isBoundingBoxFull(const BoundingBox &boundingBox); + void setBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1); + void updateBoundingBox(BoundingBox &boundingBox, byte x0, byte y0, byte x1, byte y1); +}; + +} // namespace Neverhood + +#endif // NEVERHOOD_MICROTILES_H diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 224dfb579f..9069203e9b 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -12,6 +12,7 @@ MODULE_OBJS = \ graphics.o \ klayman.o \ menumodule.o \ + microtiles.o \ module.o \ module1000.o \ module1100.o \ diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 249494179e..db3acb68f5 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -780,7 +780,7 @@ SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHas AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status) : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - createSurface(900, 152, 147); + createSurface(900, 347, 230); SetFilterY(&Sprite::defFilterY); SetUpdateHandler(&AnimatedSprite::update); @@ -844,9 +844,10 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1402::handleMessage); + _vm->_screen->setYOffset(0); + setBackground(0x231482F0); setBackgroundY(-10); - // TODO g_screen->field_26 = 0; setPalette(0x231482F0); _palette->addPalette(0x91D3A391, 0, 64, 0); insertMouse433(0x482F4239); @@ -891,7 +892,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) startShaking(); } } - + if (_asPuzzleBox) _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); @@ -919,10 +920,10 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) void Scene1402::upShaking() { if (_isShaking) { setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10); - // TODO g_screen->field_26 = -10 - _background->getDrawRect().y; + _vm->_screen->setYOffset(-10 - getBackgroundY()); } else { setBackgroundY(-10); - // TODO g_screen->field_26 = 0; + _vm->_screen->setYOffset(0); SetUpdateHandler(&Scene::update); } Scene::update(); @@ -973,6 +974,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit } else setMessageList2(0x004B0B68); } + break; } return 0; } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 8616592c18..8a7e3464a5 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -539,9 +539,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; - if (!getSubVar(VA_IS_PUZZLE_INIT, 0x60400854)) { - // TODO _vm->gameModule()->initScene2201Vars(); - } + _vm->gameModule()->initCubeSymbolsPuzzle(); SetMessageHandler(&Scene2201::handleMessage); SetUpdateHandler(&Scene2201::update); @@ -875,7 +873,8 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isCubeMoving(false), _ssMovingCube(NULL), _ssDoneMovingCube(NULL) { - // TODO initScene2201Vars(); + _vm->gameModule()->initCubeSymbolsPuzzle(); + SetMessageHandler(&Scene2202::handleMessage); SetUpdateHandler(&Scene2202::update); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index aa4efaca13..6141ee4487 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -29,7 +29,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) { _isKlaymanBusy = false; - _systemCallbackFlag = false; + _doConvertMessages = false; _messageList = NULL; _rectType = 0; _mouseClickPos.x = 0; @@ -46,7 +46,6 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) } _vm->_screen->setFps(24); _vm->_screen->setSmackerDecoder(NULL); - // TODO g_screen->resetDirtyRects(); _canAcceptInput = true; _messageList2 = NULL; _smackerPlayer = NULL; @@ -229,7 +228,6 @@ void Scene::update() { if (_mouseClicked) { if (_klayman) { - // TODO: Merge later if (_canAcceptInput && _klayman->hasMessageHandler() && sendMessage(_klayman, 0x1008, 0) != 0 && @@ -262,27 +260,11 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s case 0: // mouse moved if (_mouseCursor && _mouseCursor->hasMessageHandler()) sendMessage(_mouseCursor, 0x4002, param); - // TODO Seems unused: queryPositionSomeRects(param.asPoint().x, param.asPoint().y); break; case 1: // mouse clicked _mouseClicked = true; _mouseClickPos = param.asPoint(); break; - /* ORIGINAL DEBUG - case 3: - drawSurfaceRects(); - break; - */ - /* ORIGINAL DEBUG - case 4: - drawRectListRects(); - break; - */ - /* ORIGINAL DEBUG - case 5: - broadcastObjectMessage5(); - break; - */ case 6: sendMessage(_parentModule, 0x1009, param); break; @@ -331,34 +313,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s return 0; } -void Scene::smackerUpdate() { - //**ALL TODO -#if 0 - _smackerPlayer->handleUpdate(); - if (_smackerDone) { - delete _smackerPlayer; - _smackerPlayer = NULL; - _updateHandlerCb = _savedUpdateHandlerCb; - _messageHandlerCb = _savedMessageHandlerCb; - if (_palette) - _palette->usePalette(); - // TODO _background->restore(); - // TODO g_screen->smackerPlayer = NULL; - } -#endif -} - -uint32 Scene::smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x3002: - _smackerDone = true; - break; - } - return 0; -} - bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { - //debug("Scene::queryPositionSprite(%d, %d)", mouseX, mouseY); for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) { Sprite *sprite = _vm->_collisionMan->getSprite(i); if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && @@ -380,7 +335,6 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { for (uint j = 0; j < rectList[i].subRects.size(); j++) { debug(2, " (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2); if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) { - //debug("Scene::queryPositionRectList() -> %08X", rectList[i].subRects[j].messageListId); return setMessageList2(rectList[i].subRects[j].messageListId); } } @@ -394,53 +348,33 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { return true; } -void Scene::setMessageList(uint32 id, bool canAcceptInput, bool systemCallbackFlag) { - setMessageList(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag); +void Scene::setMessageList(uint32 id, bool canAcceptInput, bool doConvertMessages) { + setMessageList(_vm->_staticData->getMessageList(id), canAcceptInput, doConvertMessages); } -void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) { - //debug("Scene::setMessageList(%p)", (void*)messageList); +void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool doConvertMessages) { _messageList = messageList; _messageListCount = _messageList ? _messageList->size() : 0; _messageListIndex = 0; _isKlaymanBusy = false; _canAcceptInput = canAcceptInput; - _systemCallbackFlag = systemCallbackFlag; + _doConvertMessages = doConvertMessages; _messageListStatus = 1; sendMessage(_klayman, 0x101C, 0); - -#if 0 - // DEBUG: Show message list - for (uint i = 0; i < messageList->size(); i++) { - debug("A: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); - } - debug("A: ================================================================"); -#endif - } -bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool systemCallbackFlag) { - return setMessageList2(_vm->_staticData->getMessageList(id), canAcceptInput, systemCallbackFlag); +bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool doConvertMessages) { + return setMessageList2(_vm->_staticData->getMessageList(id), canAcceptInput, doConvertMessages); } -bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool systemCallbackFlag) { - //debug("Scene::setMessageList2(%p)", (void*)messageList); - -#if 0 - // DEBUG: Show message list - for (uint i = 0; i < messageList->size(); i++) { - debug("B: %02d: %04X, %08X", i, (*messageList)[i].messageNum, (*messageList)[i].messageValue); - } - debug("B: ================================================================"); -#endif - +bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool doConvertMessages) { if (_messageListStatus == 0 || (_messageListStatus == 1 && messageList != _messageList2) || (_messageListStatus == 2 && messageList == _messageList2)) { // NOTE Skipped unneeded resource preloading code _messageValue = -1; _messageList2 = messageList; - setMessageList(messageList, canAcceptInput, systemCallbackFlag); + setMessageList(messageList, canAcceptInput, doConvertMessages); return true; } return false; @@ -465,45 +399,39 @@ void Scene::processMessageList() { uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; - //debug("Scene::processMessageList() %04X, %08X", messageNum, messageParam); - - _messageListIndex++; - if (_messageListIndex == _messageListCount) { + ++_messageListIndex; + if (_messageListIndex == _messageListCount) sendMessage(_klayman, 0x1021, 0); - } - if (_systemCallbackFlag) { + if (_doConvertMessages) messageNum = convertMessageNum(messageNum); - } - if (messageNum != 0x4003) { - if (messageNum == 0x1009 || messageNum == 0x1024) { - sendMessage(_parentModule, messageNum, messageParam); - } else if (messageNum == 0x100A) { - _messageValue = messageParam; - sendMessage(_parentModule, messageNum, messageParam); - } else if (messageNum == 0x4001) { - _isKlaymanBusy = true; - sendPointMessage(_klayman, 0x4001, _mouseClickPos); - } else if (messageNum == 0x100D) { - if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0) - continue; - } else if (messageNum == 0x101A) { - _messageListStatus = 0; - } else if (messageNum == 0x101B) { - _messageListStatus = 2; - } else if (messageNum == 0x1020) { - _canAcceptInput = false; - } else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) { - if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) { - _isMessageListBusy = false; - return; - } - } else { - _isKlaymanBusy = true; - if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) { - _isKlaymanBusy = false; - } - } - } + if (messageNum == 0x1009 || messageNum == 0x1024) { + sendMessage(_parentModule, messageNum, messageParam); + } else if (messageNum == 0x100A) { + _messageValue = messageParam; + sendMessage(_parentModule, messageNum, messageParam); + } else if (messageNum == 0x4001) { + _isKlaymanBusy = true; + sendPointMessage(_klayman, 0x4001, _mouseClickPos); + } else if (messageNum == 0x100D) { + if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0) + continue; + } else if (messageNum == 0x101A) { + _messageListStatus = 0; + } else if (messageNum == 0x101B) { + _messageListStatus = 2; + } else if (messageNum == 0x1020) { + _canAcceptInput = false; + } else if (messageNum >= 0x2000 && messageNum <= 0x2FFF) { + if (this->hasMessageHandler() && sendMessage(this, messageNum, messageParam) != 0) { + _isMessageListBusy = false; + return; + } + } else if (messageNum != 0x4003) { + _isKlaymanBusy = true; + if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) { + _isKlaymanBusy = false; + } + } if (_messageListIndex == _messageListCount) { _canAcceptInput = true; _messageList = NULL; @@ -538,7 +466,6 @@ void Scene::clearRectList() { void Scene::loadHitRectList() { HitRectList *hitRectList = _dataResource.getHitRectList(); - //debug("Scene::loadHitRectList() hitRectList = %p", (void*)hitRectList); if (hitRectList) { _hitRectList = *hitRectList; _vm->_collisionMan->setHitRects(&_hitRectList); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 21f054e123..b531796f40 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -170,7 +170,7 @@ protected: int _messageListStatus; uint _messageListCount; uint _messageListIndex; - bool _systemCallbackFlag; + bool _doConvertMessages; bool _canAcceptInput; bool _isKlaymanBusy; @@ -189,17 +189,14 @@ protected: void (Entity::*_savedUpdateHandlerCb)(); uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); - bool _smackerDone; int _messageValue; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void smackerUpdate(); - uint32 smackerHandleMessage(int messageNum, const MessageParam ¶m, Entity *sender); bool queryPositionSprite(int16 mouseX, int16 mouseY); bool queryPositionRectList(int16 mouseX, int16 mouseY); - void setMessageList(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false); - void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false); - bool setMessageList2(uint32 id, bool canAcceptInput = true, bool systemCallbackFlag = false); - bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool systemCallbackFlag = false); + void setMessageList(uint32 id, bool canAcceptInput = true, bool doConvertMessages = false); + void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false); + bool setMessageList2(uint32 id, bool canAcceptInput = true, bool doConvertMessages = false); + bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false); void processMessageList(); void setRectList(uint32 id); void setRectList(RectList *rectList); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 7321ddb233..352e59e9b2 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -26,7 +26,8 @@ namespace Neverhood { Screen::Screen(NeverhoodEngine *vm) - : _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL) { + : _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL), + _yOffset(0) { _ticks = _vm->_system->getMillis(); @@ -35,10 +36,12 @@ Screen::Screen(NeverhoodEngine *vm) _renderQueue = new RenderQueue(); _prevRenderQueue = new RenderQueue(); + _microTiles = new MicroTileArray(640, 480); } Screen::~Screen() { + delete _microTiles; delete _renderQueue; delete _prevRenderQueue; _backScreen->free(); @@ -56,16 +59,8 @@ void Screen::update() { return; } - // NOTE This is more or less experimental code for a smart "render queue". - // It works well so far but needs some optimizing, e.g. reducing overdraw. - // Maybe I'll use my microtiles code from the Toltecs engine. - // Also better move this to a separate method or even class. - - Common::Array updateRects; + _microTiles->clear(); - for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) - (*jt)._refresh = true; - for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { RenderItem &renderItem = (*it); renderItem._refresh = true; @@ -81,27 +76,34 @@ void Screen::update() { for (RenderQueue::iterator jt = _prevRenderQueue->begin(); jt != _prevRenderQueue->end(); ++jt) { RenderItem &prevRenderItem = (*jt); if (prevRenderItem._refresh) - updateRects.push_back(Common::Rect(prevRenderItem._destX, prevRenderItem._destY, prevRenderItem._destX + prevRenderItem._width, prevRenderItem._destY + prevRenderItem._height)); + _microTiles->addRect(Common::Rect(prevRenderItem._destX, prevRenderItem._destY, prevRenderItem._destX + prevRenderItem._width, prevRenderItem._destY + prevRenderItem._height)); } for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { RenderItem &renderItem = (*it); if (renderItem._refresh) - updateRects.push_back(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height)); + _microTiles->addRect(Common::Rect(renderItem._destX, renderItem._destY, renderItem._destX + renderItem._width, renderItem._destY + renderItem._height)); + renderItem._refresh = true; } + RectArray *updateRects = _microTiles->getRectangles(); + for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { RenderItem &renderItem = (*it); - for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) + for (RectArray::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) blitRenderItem(renderItem, *ri); } SWAP(_renderQueue, _prevRenderQueue); _renderQueue->clear(); - for (Common::Array::iterator ri = updateRects.begin(); ri != updateRects.end(); ++ri) - _vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr((*ri).left, (*ri).top), _backScreen->pitch, (*ri).left, (*ri).top, (*ri).width(), (*ri).height()); - + for (Common::Array::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) { + Common::Rect &r = *ri; + _vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr(r.left, r.top), _backScreen->pitch, r.left, r.top, r.width(), r.height()); + } + + delete updateRects; + } uint32 Screen::getNextFrameTime() { @@ -120,6 +122,14 @@ int Screen::getFps() { return 1000 / _frameDelay; } +void Screen::setYOffset(int16 yOffset) { + _yOffset = yOffset; +} + +int16 Screen::getYOffset() { + return _yOffset; +} + void Screen::setPaletteData(byte *paletteData) { _paletteChanged = true; _paletteData = paletteData; @@ -194,15 +204,8 @@ void Screen::drawSurface2(const Graphics::Surface *surface, NDrawRect &drawRect, ddRect.y1 = 0; } - //debug(2, "draw: x = %d; y = %d; (%d, %d, %d, %d)", destX, destY, ddRect.x1, ddRect.y1, ddRect.x2, ddRect.y2); - queueBlit(surface, destX, destY, ddRect, transparent, version, shadowSurface); - // Useful for debugging - //_backScreen->frameRect(Common::Rect(clipRect.x1, clipRect.y1, clipRect.x2, clipRect.y2), 250); - //_backScreen->frameRect(Common::Rect(destX, destY, destX + ddRect.x2, destY + ddRect.y2), 255); - //_backScreen->frameRect(Common::Rect(drawRect.x, drawRect.y, drawRect.x + drawRect.width, drawRect.y + drawRect.height), 255); - } void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version) { @@ -240,45 +243,6 @@ void Screen::drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, ND } -void Screen::blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, - const Graphics::Surface *shadowSurface) { - - const byte *source = (const byte*)surface->getBasePtr(ddRect.x1, ddRect.y1); - byte *dest = (byte*)_backScreen->getBasePtr(destX, destY); - int width = ddRect.x2 - ddRect.x1; - int height = ddRect.y2 - ddRect.y1; - - if (width <= 0 || height <= 0) - return; - - if (shadowSurface) { - const byte *shadowSource = (const byte*)shadowSurface->getBasePtr(destX, destY); - while (height--) { - for (int xc = 0; xc < width; xc++) - if (source[xc] != 0) - dest[xc] = shadowSource[xc]; - source += surface->pitch; - shadowSource += shadowSurface->pitch; - dest += _backScreen->pitch; - } - } else if (!transparent) { - while (height--) { - memcpy(dest, source, width); - source += surface->pitch; - dest += _backScreen->pitch; - } - } else { - while (height--) { - for (int xc = 0; xc < width; xc++) - if (source[xc] != 0) - dest[xc] = source[xc]; - source += surface->pitch; - dest += _backScreen->pitch; - } - } - -} - void Screen::drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect) { const byte *source = (const byte*)surface->getBasePtr(0, 0); @@ -377,8 +341,8 @@ void Screen::drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &d void Screen::queueBlit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, byte version, const Graphics::Surface *shadowSurface) { - int width = ddRect.x2 - ddRect.x1; - int height = ddRect.y2 - ddRect.y1; + const int width = ddRect.x2 - ddRect.x1; + const int height = ddRect.y2 - ddRect.y1; if (width <= 0 || height <= 0) return; @@ -406,7 +370,7 @@ void Screen::blitRenderItem(const RenderItem &renderItem, const Common::Rect &cl const int16 y0 = MAX(clipRect.top, renderItem._destY); const int16 x1 = MIN(clipRect.right, renderItem._destX + renderItem._width); const int16 y1 = MIN(clipRect.bottom, renderItem._destY + renderItem._height); - int16 width = x1 - x0; + const int16 width = x1 - x0; int16 height = y1 - y0; if (width < 0 || height < 0) diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 4e7618b7b2..33de141ec2 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -27,6 +27,7 @@ #include "graphics/surface.h" #include "video/smk_decoder.h" #include "neverhood/neverhood.h" +#include "neverhood/microtiles.h" #include "neverhood/graphics.h" namespace Neverhood { @@ -64,6 +65,8 @@ public: uint32 getNextFrameTime(); void setFps(int fps); int getFps(); + void setYOffset(int16 yOffset); + int16 getYOffset(); void setPaletteData(byte *paletteData); void unsetPaletteData(byte *paletteData); byte *getPaletteData() { return _paletteData; } @@ -75,8 +78,6 @@ public: const Graphics::Surface *shadowSurface = NULL); void drawSurface3(const Graphics::Surface *surface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect, bool transparent, byte version); void drawShadowSurface(const Graphics::Surface *surface, const Graphics::Surface *shadowSurface, int16 x, int16 y, NDrawRect &drawRect, NRect &clipRect); - void blit(const Graphics::Surface *surface, int16 destX, int16 destY, NRect &ddRect, bool transparent, - const Graphics::Surface *shadowSurface = NULL); void drawDoubleSurface2(const Graphics::Surface *surface, NDrawRect &drawRect); void drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDrawRect &sysRect, NRect &clipRect, bool transparent, byte version); void drawSurfaceClipRects(const Graphics::Surface *surface, NDrawRect &drawRect, NRect *clipRects, uint clipRectsCount, bool transparent, byte version); @@ -86,13 +87,14 @@ public: void blitRenderItem(const RenderItem &renderItem, const Common::Rect &clipRect); protected: NeverhoodEngine *_vm; + MicroTileArray *_microTiles; Graphics::Surface *_backScreen; Video::SmackerDecoder *_smackerDecoder; int32 _ticks; int32 _frameDelay; byte *_paletteData; bool _paletteChanged; - // + int16 _yOffset; bool _fullRefresh; RenderQueue *_renderQueue, *_prevRenderQueue; }; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index d7a244ba94..04959b42b0 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -44,7 +44,6 @@ void SmackerSurface::setSmackerFrame(const Graphics::Surface *smackerFrame) { _drawRect.y = 0; _drawRect.width = smackerFrame->w; _drawRect.height = smackerFrame->h; - // TODO: Check if _sysRect is needed at all in the reimplementation... _sysRect.x = 0; _sysRect.y = 0; _sysRect.width = (smackerFrame->w + 3) & 0xFFFC; // align by 4 bytes @@ -66,7 +65,7 @@ void SmackerDoubleSurface::draw() { // SmackerPlayer SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused) - : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _dirtyFlag(false), _videoDone(false), _paused(paused), + : Entity(vm, 0), _scene(scene), _doubleSurface(doubleSurface), _videoDone(false), _paused(paused), _palette(NULL), _smackerDecoder(NULL), _smackerSurface(NULL), _stream(NULL), _smackerFirst(true), _drawX(-1), _drawY(-1) { @@ -96,8 +95,6 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { _stream = _vm->_res->createStream(fileHash); - // TODO: _keepLastFrame stuff - _smackerDecoder = new Video::SmackerDecoder(); _smackerDecoder->loadStream(_stream); @@ -164,11 +161,6 @@ void SmackerPlayer::update() { if (!_smackerDecoder) return; - if (_dirtyFlag) { - // TODO _vm->_screen->resetDirtyRects(); - _dirtyFlag = false; - } - if (_paused) { if (_smackerFirst) updateFrame(); @@ -208,13 +200,6 @@ void SmackerPlayer::updateFrame() { _smackerFirst = false; } - if (_doubleSurface) { - // TODO - } - - // TODO _vm->_screen->_skipUpdate = true; - _dirtyFlag = true; - if (_smackerDecoder->hasDirtyPalette()) updatePalette(); diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index 63c9ebb774..b4d8ddbe69 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -73,7 +73,6 @@ protected: Common::SeekableReadStream *_stream; bool _keepLastFrame; bool _videoDone; - bool _dirtyFlag; bool _paused; int _drawX, _drawY; void update(); diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 18f40dccaa..52783cc1d3 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -166,7 +166,7 @@ void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) { musicItem->_countdown = 24; musicItem->_musicResource = new MusicResource(_vm); musicItem->_musicResource->load(musicFileHash); - _musicItems.push_back(musicItem); + addMusicItem(musicItem); } void SoundMan::deleteMusic(uint32 musicFileHash) { @@ -203,7 +203,7 @@ void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolume void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) { SoundItem *soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 50, 600, false, 0, false, 0); - _soundItems.push_back(soundItem); + addSoundItem(soundItem); } void SoundMan::addSoundList(uint32 nameHash, const uint32 *soundFileHashList) { @@ -337,8 +337,6 @@ void SoundMan::deleteMusicGroup(uint32 nameHash) { void SoundMan::deleteSoundGroup(uint32 nameHash) { - SoundItem *soundItem; - if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) { deleteSoundByIndex(_soundIndex1); _soundIndex1 = -1; @@ -349,13 +347,9 @@ void SoundMan::deleteSoundGroup(uint32 nameHash) { _soundIndex2 = -1; } - for (uint index = 0; index < _soundItems.size(); ++index) { - soundItem = _soundItems[index]; - if (soundItem && soundItem->_nameHash == nameHash) { - delete soundItem; - _soundItems[index] = NULL; - } - } + for (uint index = 0; index < _soundItems.size(); ++index) + if (_soundItems[index] && _soundItems[index]->_nameHash == nameHash) + deleteSoundByIndex(index); } @@ -384,16 +378,14 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun soundItem = new SoundItem(_vm, nameHash, soundFileHash1, false, 0, 0, _playOnceAfterCountdown, _initialCountdown, false, currCountdown1); soundItem->_soundResource->setVolume(80); - _soundIndex1 = _soundItems.size(); - _soundItems.push_back(soundItem); + _soundIndex1 = addSoundItem(soundItem); } if (soundFileHash2 != 0) { soundItem = new SoundItem(_vm, nameHash, soundFileHash2, false, 0, 0, _playOnceAfterCountdown, _initialCountdown, false, currCountdown2); soundItem->_soundResource->setVolume(80); - _soundIndex2 = _soundItems.size(); - _soundItems.push_back(soundItem); + _soundIndex2 = addSoundItem(soundItem); } } @@ -410,8 +402,7 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) { if (soundFileHash != 0) { soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 0, 0, false, _initialCountdown3, false, 0); - _soundIndex3 = _soundItems.size(); - _soundItems.push_back(soundItem); + _soundIndex3 = addSoundItem(soundItem); } } @@ -445,15 +436,26 @@ SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { } int16 SoundMan::addMusicItem(MusicItem *musicItem) { - return 0; // TODO +#if 0 + for (uint i = 0; i < _musicItems.size(); ++i) + if (!_musicItems[i]) { + _musicItems[i] = musicItem; + return i; + } +#endif + int16 musicIndex = _musicItems.size(); + _musicItems.push_back(musicItem); + return musicIndex; } int16 SoundMan::addSoundItem(SoundItem *soundItem) { +#if 0 for (uint i = 0; i < _soundItems.size(); ++i) if (!_soundItems[i]) { _soundItems[i] = soundItem; return i; } +#endif int16 soundIndex = _soundItems.size(); _soundItems.push_back(soundItem); return soundIndex; @@ -541,6 +543,8 @@ int16 AudioResourceMan::addSound(uint32 fileHash) { void AudioResourceMan::removeSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) + _vm->_mixer->stopHandle(soundItem->_soundHandle); if (soundItem->_data) { _vm->_res->unloadResource(soundItem->_resourceHandle); soundItem->_data = NULL; @@ -549,8 +553,6 @@ void AudioResourceMan::removeSound(int16 soundIndex) { _vm->_res->unuseResource(soundItem->_resourceHandle); soundItem->_resourceHandle = -1; } - if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) - _vm->_mixer->stopHandle(soundItem->_soundHandle); delete soundItem; _soundItems[soundIndex] = NULL; } @@ -565,6 +567,8 @@ void AudioResourceMan::loadSound(int16 soundIndex) { void AudioResourceMan::unloadSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; + if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) + _vm->_mixer->stopHandle(soundItem->_soundHandle); if (soundItem->_data) { _vm->_res->unloadResource(soundItem->_resourceHandle); soundItem->_data = NULL; diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index d034783b03..1e73078a1b 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/sprite.h" +#include "neverhood/screen.h" namespace Neverhood { @@ -74,13 +75,6 @@ bool Sprite::checkCollision(NRect &rect) { } uint32 Sprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x0005: - // TODO: Draw debug marker (?) - // TODO g_Screen->drawLine(_x - 5, _y, _x + 6, _y); - // TODO g_Screen->drawLine(_x, _y - 5, _x, _y + 6); - break; - } return 0; } @@ -93,8 +87,7 @@ void Sprite::createSurface(int surfacePriority, int16 width, int16 height) { } int16 Sprite::defFilterY(int16 y) { - // TODO return y - g_screen->field_26; - return y; + return y - _vm->_screen->getYOffset(); } void Sprite::setClipRect(int16 x1, int16 y1, int16 x2, int16 y2) { -- cgit v1.2.3 From 325c85fc41dd6a0dbf8050ef3e39fe8c91d8966a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Nov 2012 12:31:01 +0000 Subject: NEVERHOOD: Fix Klaymen in Scene1403 (*facepalm*) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/module1400.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index be4f5d3d51..1d01cddd6b 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -373,7 +373,7 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 0; + _vm->gameState().sceneNum = 2; createModule(1400, -1); #endif #if 0 diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index db3acb68f5..e0cf2c5ec3 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -1300,11 +1300,11 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(380, 463); + insertKlayman(380, 463); setMessageList(0x004B1F18); } else { // Klaymen entering from the right - insertKlayman(640, 463); + insertKlayman(640, 463); setMessageList(0x004B1F20); } _klayman->setRepl(64, 0); -- cgit v1.2.3 From 370f00e808a907f940169ce28e4c391e45b4c2f0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Nov 2012 14:34:39 +0000 Subject: NEVERHOOD: New _sceneNum in Module2800 - Very slightly improved the speed in SmackerPlayer::gotoFrame() --- engines/neverhood/gamemodule.cpp | 4 ++-- engines/neverhood/module2800.cpp | 43 ++++++++++++++++++++++++++++++------- engines/neverhood/module2800.h | 5 +---- engines/neverhood/smackerplayer.cpp | 6 +++--- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 1d01cddd6b..bd671ee3a0 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -373,8 +373,8 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 2; - createModule(1400, -1); + _vm->gameState().sceneNum = 1; + createModule(2800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index c42e0331ac..6500ae0955 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -59,13 +59,15 @@ Module2800::~Module2800() { void Module2800::createScene(int sceneNum, int which) { debug("Module2800::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + _sceneNum = sceneNum; + switch (_sceneNum) { case 0: + _vm->gameState().sceneNum = 0; _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); _childObject = new Scene2801(_vm, this, which); break; case 1: + _vm->gameState().sceneNum = 1; _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); if (getGlobalVar(V_RADIO_ENABLED)) _childObject = new Scene2802(_vm, this, which); @@ -73,101 +75,124 @@ void Module2800::createScene(int sceneNum, int which) { createStaticScene(0x000C6444, 0xC6440008); break; case 2: + _vm->gameState().sceneNum = 2; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - //setGlobalVar(V_KLAYMAN_SMALL,1);//DEBUG if (getGlobalVar(V_KLAYMAN_SMALL)) _childObject = new Scene2803Small(_vm, this, which); else _childObject = new Scene2803(_vm, this, which); break; case 3: + _vm->gameState().sceneNum = 3; _childObject = new Scene2804(_vm, this, which); break; case 4: + _vm->gameState().sceneNum = 4; _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2805(_vm, this, which); break; case 5: + _vm->gameState().sceneNum = 5; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2806(_vm, this, which); break; case 6: + _vm->gameState().sceneNum = 6; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2807(_vm, this, which); break; case 7: + _vm->gameState().sceneNum = 7; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2808(_vm, this, 0); break; case 8: + _vm->gameState().sceneNum = 8; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2809(_vm, this, which); break; case 9: + _vm->gameState().sceneNum = 9; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2810(_vm, this, which); break; case 10: + _vm->gameState().sceneNum = 10; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2808(_vm, this, 1); break; case 11: + _vm->gameState().sceneNum = 11; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2812(_vm, this, which); break; case 12: + _vm->gameState().sceneNum = 12; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x0000A245, 0x0A241008); break; case 13: + _vm->gameState().sceneNum = 13; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x81C60635, 0x60631814); break; case 14: + _vm->gameState().sceneNum = 14; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0xCA811204, 0x11200CA0); break; case 15: + _vm->gameState().sceneNum = 15; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x2D438A00, 0x38A042DC); break; case 16: + _vm->gameState().sceneNum = 16; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x0A806204, 0x062000A0); break; case 17: + _vm->gameState().sceneNum = 17; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x010F9284, 0xF9280018); break; case 18: + _vm->gameState().sceneNum = 18; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x0100022B, 0x0022F018); break; case 19: + _vm->gameState().sceneNum = 19; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x10866205, 0x66201100); break; case 20: + _vm->gameState().sceneNum = 20; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x01C58000, 0x58004014); break; case 21: + _vm->gameState().sceneNum = 21; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new Scene2822(_vm, this, which); break; case 22: + _vm->gameState().sceneNum = 22; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x9408121E, 0x8121A948); break; case 23: + _vm->gameState().sceneNum = 23; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x048C0600, 0xC0604040); break; case 24: + _vm->gameState().sceneNum = 24; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); createStaticScene(0x04270A94, 0x70A9004A); break; case 25: + _vm->gameState().sceneNum = 25; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); if (getGlobalVar(V_SHRINK_LIGHTS_ON)) createStaticScene(0x01600204, 0x0020001E); @@ -175,6 +200,7 @@ void Module2800::createScene(int sceneNum, int which) { createStaticScene(0x08611204, 0x1120008E); break; case 26: + _vm->gameState().sceneNum = 26; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); _childObject = new DiskplayerScene(_vm, this, 4); break; @@ -189,7 +215,7 @@ void Module2800::createScene(int sceneNum, int which) { void Module2800::updateScene() { if (!updateChild()) { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: if (_moduleResult != 2) { if (_musicResource) { @@ -359,7 +385,7 @@ void Module2800::updateScene() { break; } } else { - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 0: updateMusic(true); break; @@ -402,6 +428,9 @@ void Module2800::updateMusic(bool halfVolume) { Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true) { + Sprite *_sprite1; + Sprite *_sprite2; + _vm->gameModule()->initRadioPuzzle(); SetMessageHandler(&Scene2801::handleMessage); @@ -586,7 +615,7 @@ void Scene2802::update() { changeTuneStatus(prevTuneStatus, _currTuneStatus); //DEBUG>>> - debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)); + //debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)); //DEBUG<<< if (getGlobalVar(V_RADIO_MOVE_DISH_VIDEO) && prevTuneStatus != _currTuneStatus && _currRadioMusicIndex != 0) { @@ -1990,8 +2019,6 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[1].x1 = _sprite4->getDrawRect().x; _clipRects[1].y1 = _sprite4->getDrawRect().y; - _fieldEC = true; - tempSprite = insertStaticSprite(0xD2012C02, 1100); _clipRects[2].x1 = tempSprite->getDrawRect().x; _clipRects[2].y2 = tempSprite->getDrawRect().y2(); diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index bdcb1ee080..1dd7bca402 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -36,7 +36,7 @@ public: Module2800(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Module2800(); protected: - bool _flag; + int _sceneNum; uint32 _currentMusicFileHash; MusicResource *_musicResource; void createScene(int sceneNum, int which); @@ -49,8 +49,6 @@ public: Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~Scene2801(); protected: - Sprite *_sprite1; - Sprite *_sprite2; Sprite *_asTape; uint32 _paletteHash; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -301,7 +299,6 @@ protected: NPointArray *_pointList; int _pointIndex; NRect _clipRects[4]; - bool _fieldEC; Sprite *_sprite1; Sprite *_sprite2; Sprite *_sprite3; diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 04959b42b0..85319dcf26 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -111,7 +111,7 @@ void SmackerPlayer::close() { _smackerDecoder->stop(); delete _smackerDecoder; delete _palette; - // NOTE: The SmackerDecoder deletes the _stream + // NOTE The SmackerDecoder deletes the _stream delete _smackerSurface; _smackerDecoder = NULL; _palette = NULL; @@ -125,7 +125,7 @@ void SmackerPlayer::gotoFrame(int frameNumber) { if (frameNumber < _smackerDecoder->getCurFrame()) rewind(); while (_smackerDecoder->getCurFrame() != frameNumber) - updateFrame(); + _smackerDecoder->decodeNextFrame(); } } @@ -199,7 +199,7 @@ void SmackerPlayer::updateFrame() { _smackerSurface->getDrawRect().y = _drawY; _smackerFirst = false; } - + if (_smackerDecoder->hasDirtyPalette()) updatePalette(); -- cgit v1.2.3 From 1b9807b312172b0cb31b2eb83b8afc5fd23f97f5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 14 Nov 2012 18:09:46 +0000 Subject: NEVERHOOD: Remove more old comments - Add the remaining idle stuff to Klayman --- engines/neverhood/diskplayerscene.cpp | 2 -- engines/neverhood/gamemodule.cpp | 5 +++-- engines/neverhood/graphics.cpp | 1 - engines/neverhood/klayman.cpp | 19 +++++++++++++++++-- engines/neverhood/klayman.h | 2 ++ engines/neverhood/module1800.cpp | 1 - 6 files changed, 22 insertions(+), 8 deletions(-) diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 572074bd18..d6d4de1a68 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -25,8 +25,6 @@ namespace Neverhood { -// TODO: Maybe move hash tables into neverhood.dat - static const uint32 kDiskplayerPaletteFileHashes[] = { 0x03B78240, 0x34B32B08, diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index bd671ee3a0..956d969a6c 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -373,8 +373,9 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 1 - _vm->gameState().sceneNum = 1; - createModule(2800, -1); + _vm->gameState().sceneNum = 4; + _vm->gameState().which = 1; + createModule(1800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 81cec9f46d..2a8f543587 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -34,7 +34,6 @@ BaseSurface::BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 h _drawRect.y = 0; _drawRect.width = width; _drawRect.height = height; - // TODO: Check if _sysRect is needed at all in the reimplementation... _sysRect.x = 0; _sysRect.y = 0; _sysRect.width = (width + 3) & 0xFFFC; // align by 4 bytes diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 782c376bd4..9673adc6f8 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -53,6 +53,11 @@ static const KlaymanIdleTableItem klaymanTable4[] = { {1, &Klayman::stDoIdleHeadOff}, }; +static const KlaymanIdleTableItem klaymanIdleTable1002[] = { + {1, &Klayman::stDoIdlePickEar}, + {2, &Klayman::stIdleWonderAbout} +}; + // Klayman Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) @@ -268,6 +273,16 @@ uint32 Klayman::hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity return messageResult; } +void Klayman::stIdleWonderAbout() { + _status2 = 1; + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); + SetUpdateHandler(&Klayman::update); + SetMessageHandler(&Klayman::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klayman::stStandAround); +} + void Klayman::stSitIdleTeleporter() { _status2 = 0; _acceptInput = true; @@ -3421,7 +3436,7 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 void KmScene1002::xUpdate() { if (_x >= 250 && _x <= 435 && _y >= 420) { if (_idleTableNum == 0) { - // TODO setKlaymanIdleTable(stru_4B44C8); + setKlaymanIdleTable(klaymanIdleTable1002, ARRAYSIZE(klaymanIdleTable1002)); _idleTableNum = 1; } } else if (_idleTableNum == 1) { @@ -3670,7 +3685,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // TODO setKlaymanIdleTable(dword_4AEF10, 3); + setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); _flagF6 = true; } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index ab2c5235d4..443bb97b2b 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -77,6 +77,8 @@ public: void stIdleHeadOff(); uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdleWonderAbout(); + void stDoIdleTeleporterHands(); void stIdleTeleporterHands(); diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index 30bffb9a79..dc5f94270c 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -163,7 +163,6 @@ void Module1800::updateScene() { case 8: // NOTE: After Klayman jumped into the hole and died... leaveModule(1); - // TODO GameState stuff // Restarts the game? break; case 1009: leaveModule(0); -- cgit v1.2.3 From cc015e3d24d15dc0c3532063927fd40e2329f43e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 16 Nov 2012 21:26:15 +0000 Subject: NEVERHOOD: Simplify resource loading - Renamne and clean up --- engines/neverhood/blbarchive.cpp | 12 +- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/graphics.cpp | 10 +- engines/neverhood/graphics.h | 10 +- engines/neverhood/module1000.cpp | 2 +- engines/neverhood/module2200.cpp | 2 +- engines/neverhood/module2700.cpp | 14 +- engines/neverhood/navigationscene.cpp | 1 - engines/neverhood/neverhood.cpp | 4 +- engines/neverhood/resource.cpp | 240 ++++++++++++---------------------- engines/neverhood/resource.h | 30 ++--- engines/neverhood/resourceman.cpp | 114 +++++----------- engines/neverhood/resourceman.h | 28 ++-- engines/neverhood/smackerscene.cpp | 4 +- engines/neverhood/sound.cpp | 31 ++--- engines/neverhood/sound.h | 8 +- engines/neverhood/sprite.cpp | 12 +- engines/neverhood/staticdata.cpp | 2 +- engines/neverhood/staticdata.h | 2 +- 19 files changed, 194 insertions(+), 334 deletions(-) diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 5551ff07f1..02fad55000 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -73,7 +73,7 @@ void BlbArchive::open(const Common::String &filename) { if (header.id1 != 0x2004940 || header.id2 != 7 || header.fileSize != _fd.size()) error("BlbArchive::open() %s seems to be corrupt", filename.c_str()); - debug(2, "%s: fileCount = %d", filename.c_str(), header.fileCount); + debug(4, "%s: fileCount = %d", filename.c_str(), header.fileCount); _entries.reserve(header.fileCount); @@ -98,7 +98,7 @@ void BlbArchive::open(const Common::String &filename) { entry.offset = _fd.readUint32LE(); entry.diskSize = _fd.readUint32LE(); entry.size = _fd.readUint32LE(); - debug(2, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X", + debug(4, "%08X: %03d, %02X, %04X, %08X, %08X, %08X, %08X", entry.fileHash, entry.type, entry.comprType, extDataOffsets[i], entry.timeStamp, entry.offset, entry.diskSize, entry.size); } @@ -131,11 +131,8 @@ void BlbArchive::load(BlbArchiveEntry *entry, byte *buffer, uint32 size) { _fd.read(buffer, size); break; case 3: // DCL-compressed - if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size)) { - debug("decompressDCL(diskSize: %d; size: %d)", entry->diskSize, entry->size); - debug("-> fileHash: %08X; type: %d; offset: %08X; endOffset: %08X", entry->fileHash, entry->type, entry->offset, entry->offset + entry->diskSize); - debug("-> fd.pos() = %08X", _fd.pos()); - } + if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size)) + error("BlbArchive::load() Error during decompression of %=8X", entry->fileHash); break; default: error("BlbArchive::load() Unknown compression type %d", entry->comprType); @@ -148,7 +145,6 @@ byte *BlbArchive::getEntryExtData(uint index) { } byte *BlbArchive::getEntryExtData(BlbArchiveEntry *entry) { - //return (_extData && entry->extDataOfs != 0) ? &_extData[entry->extDataOfs - 1] : NULL; return entry->extData; } diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 956d969a6c..e6f38f020c 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -375,7 +375,7 @@ void GameModule::startup() { #if 1 _vm->gameState().sceneNum = 4; _vm->gameState().which = 1; - createModule(1800, -1); + createModule(1000, -1); #endif #if 0 _vm->gameState().sceneNum = 0; diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 2a8f543587..3b456a574f 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -150,7 +150,7 @@ void ShadowSurface::draw() { // FontSurface -FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) +FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) : BaseSurface(vm, 0, charWidth * 16, charHeight * numRows), _tracking(tracking), _numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight) { } @@ -168,7 +168,7 @@ void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string) { for (; *string != 0; string++) { drawChar(destSurface, x, y, *string); - x += (*_tracking)[*string - _firstChar].x; + x += _tracking[*string - _firstChar].x; } } @@ -216,7 +216,7 @@ enum BitmapFlags { BF_HAS_IMAGE = 16 }; -void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels) { +void parseBitmapResource(const byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, const byte **palette, const byte **pixels) { uint16 flags; @@ -263,7 +263,7 @@ void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoin } -void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor, byte newColor) { +void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor, byte newColor) { const bool replaceColors = oldColor != newColor; @@ -313,7 +313,7 @@ void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPi } -void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { +void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { // TODO: Flip Y diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index b5286906e9..65d25c04ce 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -131,11 +131,11 @@ protected: class FontSurface : public BaseSurface { public: - FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); + FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string); protected: - NPointArray *_tracking; + NPointArray _tracking; uint16 _numRows; byte _firstChar; uint16 _charWidth; @@ -162,9 +162,9 @@ protected: // Misc -void parseBitmapResource(byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, byte **palette, byte **pixels); -void unpackSpriteRle(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor = 0, byte newColor = 0); -void unpackSpriteNormal(byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); +void parseBitmapResource(const byte *sprite, bool *rle, NDimensions *dimensions, NPoint *position, const byte **palette, const byte **pixels); +void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY, byte oldColor = 0, byte newColor = 0); +void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY); int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2); } // End of namespace Neverhood diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index c7c3fb227e..caa446639b 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1597,7 +1597,7 @@ FontSurface *Scene1005::createFontSurface() { uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); - fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight); + fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight); if (getGlobalVar(V_ENTRANCE_OPEN)) { fontSprite.load2(0x283CE401); } else { diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 8a7e3464a5..8061e977f1 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2242,7 +2242,7 @@ void Scene2208::createFontSurface() { uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); spriteResource.load2(0x0800090C); - _fontSurface = new FontSurface(_vm, tracking, numRows, firstChar, charWidth, charHeight); + _fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight); _fontSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 9a8a2f973d..50b4b24e65 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -185,7 +185,7 @@ void Module2700::createScene(int sceneNum, int which) { case 10: _vm->gameState().sceneNum = 10; _vm->gameState().which = which; - // TODO _vm->gameModule()->initScene2808Vars2(); + _vm->gameModule()->initTestTubes2Puzzle(); _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)]; _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)]; _scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0)]; @@ -631,8 +631,8 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x1E086325, 1200); clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); - if (sceneInfo->class437Filename) { - _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); + if (sceneInfo->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -898,8 +898,8 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _palStatus = 2; - if (sceneInfo->class437Filename) { - _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); + if (sceneInfo->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -1017,8 +1017,8 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 insertMouse433(sceneInfo->mouseCursorFilename); - if (sceneInfo->class437Filename) { - _ssTrackShadowBackground = createSprite(sceneInfo->class437Filename); + if (sceneInfo->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index 8e167dd4d6..ffaa802a21 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -157,7 +157,6 @@ void NavigationScene::handleNavigation(const NPoint &mousePos) { uint32 direction = sendPointMessage(_mouseCursor, 0x2064, mousePos); switch (direction) { - // TODO: Merge cases 0 and 1? case 0: if (navigationItem.leftSmackerFileHash != 0) { _smackerFileHash = navigationItem.leftSmackerFileHash; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 208a1572e2..c29cc7baf5 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -214,7 +214,7 @@ void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, in } void NeverhoodEngine::dumpAllResources() { - +#if 0 PaletteResource paletteResource(this); byte *vgaPalette = new byte[768]; //paletteResource.load(0x4086520E); @@ -258,7 +258,7 @@ void NeverhoodEngine::dumpAllResources() { } delete[] vgaPalette; - +#endif } } // End of namespace Neverhood diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 1246472926..64f106128b 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -20,6 +20,7 @@ * */ +#include "common/algorithm.h" #include "common/memstream.h" #include "neverhood/resource.h" #include "neverhood/resourceman.h" @@ -33,7 +34,7 @@ namespace Neverhood { // SpriteResource SpriteResource::SpriteResource(NeverhoodEngine *vm) - : _vm(vm), _resourceHandle(-1), _pixels(NULL) { + : _vm(vm), _pixels(NULL) { } SpriteResource::~SpriteResource() { @@ -53,43 +54,30 @@ bool SpriteResource::load(uint32 fileHash) { debug(2, "SpriteResource::load(%08X)", fileHash); // TODO: Later merge with load2 and make the mode a parameter unload(); - _resourceHandle = _vm->_res->useResource(fileHash); - debug(2, "SpriteResource::load(0x%08X) _resourceHandle = %d", fileHash, _resourceHandle); - if (_resourceHandle != -1) { - if (_vm->_res->getResourceType(_resourceHandle) == 2) { - byte *spriteData = _vm->_res->loadResource(_resourceHandle, true); - parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels); - } else { - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - } + _vm->_res->queryResource(fileHash, _resourceHandle); + if (_resourceHandle.isValid() && _resourceHandle.type() == 2) { + _vm->_res->loadResource(_resourceHandle); + const byte *spriteData = _resourceHandle.data(); + parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels); } return _pixels != NULL; } bool SpriteResource::load2(uint32 fileHash) { + debug(2, "SpriteResource::load2(%08X)", fileHash); unload(); - _resourceHandle = _vm->_res->useResource(fileHash); - if (_resourceHandle != -1) { - if (_vm->_res->getResourceType(_resourceHandle) == 2) { - byte *spriteData = _vm->_res->loadResource(_resourceHandle, true); - parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels); - } else { - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - } + _vm->_res->queryResource(fileHash, _resourceHandle); + if (_resourceHandle.isValid() && _resourceHandle.type() == 2) { + _vm->_res->loadResource(_resourceHandle); + const byte *spriteData = _resourceHandle.data(); + parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels); } return _pixels != NULL; } void SpriteResource::unload() { - if (_resourceHandle != -1) { - _vm->_res->unloadResource(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - } else { - delete[] _pixels; - } + _vm->_res->unloadResource(_resourceHandle); + delete[] _pixels; _pixels = NULL; _rle = false; } @@ -97,7 +85,7 @@ void SpriteResource::unload() { // PaletteResource PaletteResource::PaletteResource(NeverhoodEngine *vm) - : _vm(vm), _resourceHandle(-1), _palette(NULL) { + : _vm(vm), _palette(NULL) { } PaletteResource::~PaletteResource() { @@ -107,33 +95,22 @@ PaletteResource::~PaletteResource() { bool PaletteResource::load(uint32 fileHash) { debug(2, "PaletteResource::load(%08X)", fileHash); unload(); - _resourceHandle = _vm->_res->useResource(fileHash); - if (_resourceHandle != -1) { - _palette = _vm->_res->loadResource(_resourceHandle, true); - switch (_vm->_res->getResourceType(_resourceHandle)) { - case 2: - // Palette is stored in a bitmap + _vm->_res->queryResource(fileHash, _resourceHandle); + if (_resourceHandle.isValid() && + (_resourceHandle.type() == 2 || _resourceHandle.type() == 3)) { + _vm->_res->loadResource(_resourceHandle); + _palette = _resourceHandle.data(); + // Check if the palette is stored in a bitmap + if (_resourceHandle.type() == 2) parseBitmapResource(_palette, NULL, NULL, NULL, &_palette, NULL); - break; - case 3: - // _palette already points to the correct data - break; - default: - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - break; - } - } + + } return _palette != NULL; } void PaletteResource::unload() { - if (_resourceHandle != -1) { - _vm->_res->unloadResource(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - _palette = NULL; - } + _vm->_res->unloadResource(_resourceHandle); + _palette = NULL; } void PaletteResource::copyPalette(byte *destPalette) { @@ -147,14 +124,12 @@ void PaletteResource::copyPalette(byte *destPalette) { // AnimResource AnimResource::AnimResource(NeverhoodEngine *vm) - : _vm(vm), _width(0), _height(0), _currSpriteData(NULL) { - - clear(); - clear2(); + : _vm(vm), _width(0), _height(0), _currSpriteData(NULL), _fileHash(0), _paletteData(NULL), + _spriteData(NULL), _replEnabled(false), _replOldColor(0), _replNewColor(0) { } AnimResource::~AnimResource() { - unloadInternal(); + unload(); } void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) { @@ -175,27 +150,18 @@ bool AnimResource::load(uint32 fileHash) { return true; unload(); - _resourceHandle = _vm->_res->useResource(fileHash); - if (_resourceHandle == -1) + + _vm->_res->queryResource(fileHash, _resourceHandle); + if (!_resourceHandle.isValid() || _resourceHandle.type() != 4) return false; - byte *resourceData, *animList, *frameList; + const byte *resourceData, *animList, *frameList; uint16 animInfoStartOfs, animListIndex, animListCount; uint16 frameListStartOfs, frameCount; uint32 spriteDataOfs, paletteDataOfs; - if (_vm->_res->getResourceType(_resourceHandle) != 4) { - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - return false; - } - - resourceData = _vm->_res->loadResource(_resourceHandle); - if (!resourceData) { - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - return false; - } + _vm->_res->loadResource(_resourceHandle); + resourceData = _resourceHandle.data(); animListCount = READ_LE_UINT16(resourceData); animInfoStartOfs = READ_LE_UINT16(resourceData + 2); @@ -212,8 +178,6 @@ bool AnimResource::load(uint32 fileHash) { if (animListIndex >= animListCount) { _vm->_res->unloadResource(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; return false; } @@ -257,44 +221,22 @@ bool AnimResource::load(uint32 fileHash) { } _fileHash = fileHash; - + return true; } void AnimResource::unload() { - if (_resourceHandle != -1) { - _vm->_res->unloadResource(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - clear(); - } -} - -void AnimResource::clear() { - _resourceHandle = -1; + _vm->_res->unloadResource(_resourceHandle); _currSpriteData = NULL; _fileHash = 0; _paletteData = NULL; _spriteData = NULL; -} - -void AnimResource::clear2() { - clear(); _replEnabled = true; _replOldColor = 0; _replNewColor = 0; } -bool AnimResource::loadInternal(uint32 fileHash) { - unloadInternal(); - return load(fileHash); -} - -void AnimResource::unloadInternal() { - unload(); - clear2(); -} - int16 AnimResource::getFrameIndex(uint32 frameHash) { int16 frameIndex = -1; for (uint i = 0; i < _frames.size(); i++) @@ -312,8 +254,10 @@ void AnimResource::setRepl(byte oldColor, byte newColor) { } NDimensions AnimResource::loadSpriteDimensions(uint32 fileHash) { + ResourceHandle resourceHandle; NDimensions dimensions; - byte *resDimensions = _vm->_res->getResourceExtDataByHash(fileHash); + _vm->_res->queryResource(fileHash, resourceHandle); + const byte *resDimensions = resourceHandle.extData(); if (resDimensions) { dimensions.width = READ_LE_UINT16(resDimensions + 0); dimensions.height = READ_LE_UINT16(resDimensions + 2); @@ -368,7 +312,7 @@ NDrawRect& MouseCursorResource::getRect() { void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) { if (_cursorSprite.getPixels()) { int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment - byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32; + const byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32; for (int16 yc = 0; yc < 32; yc++) { memcpy(dest, source, 32); source += sourcePitch; @@ -380,7 +324,7 @@ void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) { // TextResource TextResource::TextResource(NeverhoodEngine *vm) - : _vm(vm), _resourceHandle(-1), _textData(NULL), _count(0) { + : _vm(vm), _textData(NULL), _count(0) { } @@ -389,38 +333,20 @@ TextResource::~TextResource() { } void TextResource::load(uint32 fileHash) { + debug(2, "TextResource::load(%08X)", fileHash); unload(); - _resourceHandle = _vm->_res->useResource(fileHash); - if (_resourceHandle != -1) { - if (_vm->_res->getResourceType(_resourceHandle) == 6) { - _textData = _vm->_res->loadResource(_resourceHandle, true); - _count = READ_LE_UINT32(_textData); - - debug("TEXT RESOURCE %08X, count = %d:", fileHash, _count); - for (uint i = 0; i < _count-1; i++) { - const char *textEnd, *text = getString(i, textEnd); - while (text < textEnd) { - debug("[%04d] [%s]", i, text); - text += strlen(text) + 1; - } - debug("------------------"); - } - - } else { - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - } + _vm->_res->queryResource(fileHash, _resourceHandle); + if (_resourceHandle.isValid() && _resourceHandle.type() == 6) { + _vm->_res->loadResource(_resourceHandle); + _textData = _resourceHandle.data(); + _count = READ_LE_UINT32(_textData); } } void TextResource::unload() { - if (_resourceHandle != -1) { - _vm->_res->unloadResource(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - _textData = NULL; - _count = 0; - } + _vm->_res->unloadResource(_resourceHandle); + _textData = NULL; + _count = 0; } const char *TextResource::getString(uint index, const char *&textEnd) { @@ -432,7 +358,7 @@ const char *TextResource::getString(uint index, const char *&textEnd) { // DataResource DataResource::DataResource(NeverhoodEngine *vm) - : _vm(vm), _resourceHandle(-1) { + : _vm(vm) { } DataResource::~DataResource() { @@ -441,18 +367,14 @@ DataResource::~DataResource() { void DataResource::load(uint32 fileHash) { debug(2, "DataResource::load(%08X)", fileHash); - byte *data = NULL; + const byte *data = NULL; uint32 dataSize = 0; unload(); - _resourceHandle = _vm->_res->useResource(fileHash); - if (_resourceHandle != -1) { - if (_vm->_res->getResourceType(_resourceHandle) == 5) { - data = _vm->_res->loadResource(_resourceHandle, true); - dataSize = _vm->_res->getResourceSize(_resourceHandle); - } else { - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - } + _vm->_res->queryResource(fileHash, _resourceHandle); + if (_resourceHandle.isValid() && _resourceHandle.type() == 5) { + _vm->_res->loadResource(_resourceHandle); + data = _resourceHandle.data(); + dataSize = _resourceHandle.size(); } if (data && dataSize) { Common::MemoryReadStream dataS(data, dataSize); @@ -588,40 +510,45 @@ void DataResource::load(uint32 fileHash) { } void DataResource::unload() { - if (_resourceHandle != -1) { - _vm->_res->unloadResource(_resourceHandle); - _vm->_res->unuseResource(_resourceHandle); - _resourceHandle = -1; - // TODO: Clear arrays - } + _vm->_res->unloadResource(_resourceHandle); + _directory.clear(); + _points.clear(); + for (Common::Array::iterator it = _pointArrays.begin(); it != _pointArrays.end(); ++it) + delete (*it); + _pointArrays.clear(); + for (Common::Array::iterator it = _rectArrays.begin(); it != _rectArrays.end(); ++it) + delete (*it); + _rectArrays.clear(); + for (Common::Array::iterator it = _hitRectLists.begin(); it != _hitRectLists.end(); ++it) + delete (*it); + _hitRectLists.clear(); + for (Common::Array::iterator it = _messageLists.begin(); it != _messageLists.end(); ++it) + delete (*it); + _messageLists.clear(); + _drRects.clear(); + for (Common::Array::iterator it = _drSubRectLists.begin(); it != _drSubRectLists.end(); ++it) + delete (*it); + _drSubRectLists.clear(); } NPoint DataResource::getPoint(uint32 nameHash) { DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 1); - if (drDirectoryItem) - return _points[drDirectoryItem->offset]; - return NPoint(); + return drDirectoryItem ? _points[drDirectoryItem->offset] : NPoint(); } NPointArray *DataResource::getPointArray(uint32 nameHash) { DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 2); - if (drDirectoryItem) - return _pointArrays[drDirectoryItem->offset]; - return NULL; + return drDirectoryItem ? _pointArrays[drDirectoryItem->offset] : NULL; } NRectArray *DataResource::getRectArray(uint32 nameHash) { DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(nameHash, 3); - if (drDirectoryItem) - return _rectArrays[drDirectoryItem->offset]; - return NULL; + return drDirectoryItem ? _rectArrays[drDirectoryItem->offset] : NULL; } HitRectList *DataResource::getHitRectList() { DataResource::DRDirectoryItem *drDirectoryItem = findDRDirectoryItem(calcHash("HitArray"), 3); - if (drDirectoryItem) - return _hitRectLists[drDirectoryItem->offset]; - return NULL; + return drDirectoryItem ? _hitRectLists[drDirectoryItem->offset] : NULL; } MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) { @@ -642,10 +569,9 @@ MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, i } DataResource::DRDirectoryItem *DataResource::findDRDirectoryItem(uint32 nameHash, uint16 type) { - for (Common::Array::iterator it = _directory.begin(); it != _directory.end(); it++) { + for (Common::Array::iterator it = _directory.begin(); it != _directory.end(); it++) if ((*it).nameHash == nameHash && (*it).type == type) return &(*it); - } return NULL; } diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 50a49e3bdc..996579bc41 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -27,6 +27,7 @@ #include "neverhood/neverhood.h" #include "neverhood/graphics.h" #include "neverhood/staticdata.h" +#include "neverhood/resourceman.h" namespace Neverhood { @@ -41,13 +42,13 @@ public: const NDimensions& getDimensions() { return _dimensions; } NPoint& getPosition() { return _position; } bool isRle() const { return _rle; } - byte *getPixels() const { return _pixels; } + const byte *getPixels() const { return _pixels; } protected: NeverhoodEngine *_vm; - int _resourceHandle; + ResourceHandle _resourceHandle; NDimensions _dimensions; NPoint _position; - byte *_pixels; + const byte *_pixels; bool _rle; }; @@ -58,11 +59,11 @@ public: bool load(uint32 fileHash); void unload(); void copyPalette(byte *destPalette); - byte *palette() { return _palette; } + const byte *palette() { return _palette; } protected: NeverhoodEngine *_vm; - int _resourceHandle; - byte *_palette; + ResourceHandle _resourceHandle; + const byte *_palette; }; struct AnimFrameInfo { @@ -82,9 +83,6 @@ public: bool load(uint32 fileHash); void unload(); void clear(); - void clear2(); - bool loadInternal(uint32 fileHash); - void unloadInternal(); uint getFrameCount() const { return _frames.size(); } const AnimFrameInfo& getFrameInfo(int16 index) const { return _frames[index]; } int16 getFrameIndex(uint32 frameHash); @@ -93,12 +91,12 @@ public: NDimensions loadSpriteDimensions(uint32 fileHash); protected: NeverhoodEngine *_vm; - int _resourceHandle; + ResourceHandle _resourceHandle; int16 _width, _height; - byte *_currSpriteData; + const byte *_currSpriteData; uint32 _fileHash; - byte *_paletteData; - byte *_spriteData; + const byte *_paletteData; + const byte *_spriteData; bool _replEnabled; byte _replOldColor; byte _replNewColor; @@ -131,8 +129,8 @@ public: uint getCount() const { return _count;} protected: NeverhoodEngine *_vm; - int _resourceHandle; - byte *_textData; + ResourceHandle _resourceHandle; + const byte *_textData; uint _count; }; @@ -178,7 +176,7 @@ protected: typedef Common::Array DRSubRectList; NeverhoodEngine *_vm; - int _resourceHandle; + ResourceHandle _resourceHandle; Common::Array _directory; Common::Array _points; Common::Array _pointArrays; diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index eb6aa01533..3b67b26a06 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -24,6 +24,13 @@ namespace Neverhood { +ResourceHandle::ResourceHandle() + : _resourceFileEntry(NULL), _data(NULL) { +} + +ResourceHandle::~ResourceHandle() { +} + ResourceMan::ResourceMan() { } @@ -66,92 +73,43 @@ ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) { return entry; } -int ResourceMan::useResource(uint32 fileHash) { - ResourceFileEntry *entry = findEntry(fileHash); - if (!entry) - return -1; - if (entry->resourceHandle != -1) { - _resources[entry->resourceHandle]->useRefCount++; - } else { - Resource *resource = new Resource(); - resource->entry = entry; - resource->useRefCount = 1; - entry->resourceHandle = (int)_resources.size(); - _resources.push_back(resource); - } - return entry->resourceHandle; -} - -void ResourceMan::unuseResource(int resourceHandle) { - if (resourceHandle < 0) - return; - Resource *resource = _resources[resourceHandle]; - if (resource->useRefCount > 0) - resource->useRefCount--; -} - -uint32 ResourceMan::getResourceSize(int resourceHandle) const { - if (resourceHandle < 0) - return 0; - Resource *resource = _resources[resourceHandle]; - return resource->entry->archiveEntry->size; -} - -byte ResourceMan::getResourceType(int resourceHandle) { - if (resourceHandle < 0) - return 0; - Resource *resource = _resources[resourceHandle]; - return resource->entry->archiveEntry->type; -} - -byte ResourceMan::getResourceTypeByHash(uint32 fileHash) { +Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) { ResourceFileEntry *entry = findEntry(fileHash); - return entry->archiveEntry->type; -} - -byte *ResourceMan::getResourceExtData(int resourceHandle) { - if (resourceHandle < 0) - return NULL; - Resource *resource = _resources[resourceHandle]; - return resource->entry->archive->getEntryExtData(resource->entry->archiveEntry); + return entry->archive->createStream(entry->archiveEntry); } -byte *ResourceMan::getResourceExtDataByHash(uint32 fileHash) { - ResourceFileEntry *entry = findEntrySimple(fileHash); - return entry ? entry->archive->getEntryExtData(entry->archiveEntry) : NULL; +void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) { + resourceHandle._resourceFileEntry = findEntry(fileHash); } -byte *ResourceMan::loadResource(int resourceHandle, bool moveToFront) { - if (resourceHandle < 0) - return NULL; - Resource *resource = _resources[resourceHandle]; - ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash]; - if (!resourceData) { - resourceData = new ResourceData(); - _data[resource->entry->archiveEntry->fileHash] = resourceData; - } - if (resourceData->data != NULL) { - resourceData->dataRefCount++; - } else { - resourceData->data = new byte[resource->entry->archiveEntry->size]; - resource->entry->archive->load(resource->entry->archiveEntry, resourceData->data, 0); - resourceData->dataRefCount = 1; +void ResourceMan::loadResource(ResourceHandle &resourceHandle) { + resourceHandle._data = NULL; + if (resourceHandle.isValid()) { + const uint32 fileHash = resourceHandle.fileHash(); + ResourceData *resourceData = _data[fileHash]; + if (!resourceData) { + resourceData = new ResourceData(); + _data[fileHash] = resourceData; + } + if (resourceData->data != NULL) { + resourceData->dataRefCount++; + } else { + resourceData->data = new byte[resourceHandle._resourceFileEntry->archiveEntry->size]; + resourceHandle._resourceFileEntry->archive->load(resourceHandle._resourceFileEntry->archiveEntry, resourceData->data, 0); + resourceData->dataRefCount = 1; + } + resourceHandle._data = resourceData->data; } - return resourceData->data; -} - -void ResourceMan::unloadResource(int resourceHandle) { - if (resourceHandle < 0) - return; - Resource *resource = _resources[resourceHandle]; - ResourceData *resourceData = _data[resource->entry->archiveEntry->fileHash]; - if (resourceData && resourceData->dataRefCount > 0) - resourceData->dataRefCount--; } -Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) { - ResourceFileEntry *entry = findEntry(fileHash); - return entry->archive->createStream(entry->archiveEntry); +void ResourceMan::unloadResource(ResourceHandle &resourceHandle) { + if (resourceHandle.isValid()) { + ResourceData *resourceData = _data[resourceHandle.fileHash()]; + if (resourceData && resourceData->dataRefCount > 0) + --resourceData->dataRefCount; + resourceHandle._resourceFileEntry = NULL; + resourceHandle._data = NULL; + } } } // End of namespace Neverhood diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index 5ca8fa2b04..515849efbf 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -48,20 +48,23 @@ struct ResourceData { ResourceData() : data(NULL), dataRefCount() {} }; -#if 0 class ResourceMan; struct ResourceHandle { +friend class ResourceMan; public: ResourceHandle(); ~ResourceHandle(); - const byte *data(); - uint32 size() const { return _archiveEntry ? _archiveEntry->size : 0 }; + bool isValid() const { return _resourceFileEntry != NULL && _resourceFileEntry->archiveEntry != NULL; } + byte type() const { return isValid() ? _resourceFileEntry->archiveEntry->type : 0; }; + const byte *data() const { return _data; } + uint32 size() const { return isValid() ? _resourceFileEntry->archiveEntry->size : 0; }; + const byte *extData() const { return isValid() ? _resourceFileEntry->archiveEntry->extData : NULL; }; + uint32 fileHash() const { return isValid() ? _resourceFileEntry->archiveEntry->fileHash : 0; }; protected: - ResourceMan *_res; ResourceFileEntry *_resourceFileEntry; + const byte *_data; }; -#endif class ResourceMan { public: @@ -70,21 +73,12 @@ public: void addArchive(const Common::String &filename); ResourceFileEntry *findEntrySimple(uint32 fileHash); ResourceFileEntry *findEntry(uint32 fileHash); - int useResource(uint32 fileHash); - void unuseResource(int resourceHandle); - uint32 getResourceSize(int resourceHandle) const; - byte getResourceType(int resourceHandle); - byte getResourceTypeByHash(uint32 fileHash); - byte *getResourceExtData(int resourceHandle); - byte *getResourceExtDataByHash(uint32 fileHash); - byte *loadResource(int resourceHandle, bool moveToFront = false); - void unloadResource(int resourceHandle); Common::SeekableReadStream *createStream(uint32 fileHash); const ResourceFileEntry& getEntry(uint index) { return _entries[index]; } uint getEntryCount() { return _entries.size(); } -#if 0 - ResourceHandle getResource(uint32 fileHash); -#endif + void queryResource(uint32 fileHash, ResourceHandle &resourceHandle); + void loadResource(ResourceHandle &resourceHandle); + void unloadResource(ResourceHandle &resourceHandle); protected: typedef Common::HashMap EntriesMap; Common::Array _archives; diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 0ed689031a..a08aad4cee 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -70,7 +70,9 @@ void SmackerScene::nextVideo() { if (_fileHashList && _fileHashList[_fileHashListIndex] != 0) { uint32 smackerFileHash = _fileHashList[_fileHashListIndex]; - if (_vm->_res->getResourceTypeByHash(smackerFileHash) != 10) { + ResourceHandle resourceHandle; + _vm->_res->queryResource(smackerFileHash, resourceHandle); + if (resourceHandle.type() != 10) { // Not a Smacker file _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, 0); diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 52783cc1d3..f0961f42e9 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -524,7 +524,7 @@ AudioResourceMan::~AudioResourceMan() { int16 AudioResourceMan::addSound(uint32 fileHash) { AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem(); - soundItem->_resourceHandle = _vm->_res->useResource(fileHash); + _vm->_res->queryResource(fileHash, soundItem->_resourceHandle); soundItem->_fileHash = fileHash; soundItem->_data = NULL; soundItem->_isLoaded = false; @@ -543,16 +543,7 @@ int16 AudioResourceMan::addSound(uint32 fileHash) { void AudioResourceMan::removeSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) - _vm->_mixer->stopHandle(soundItem->_soundHandle); - if (soundItem->_data) { - _vm->_res->unloadResource(soundItem->_resourceHandle); - soundItem->_data = NULL; - } - if (soundItem->_resourceHandle != 1) { - _vm->_res->unuseResource(soundItem->_resourceHandle); - soundItem->_resourceHandle = -1; - } + unloadSound(soundIndex); delete soundItem; _soundItems[soundIndex] = NULL; } @@ -561,7 +552,8 @@ void AudioResourceMan::loadSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; if (!soundItem->_data) { // TODO Check if it's a sound resource - soundItem->_data = _vm->_res->loadResource(soundItem->_resourceHandle); + _vm->_res->loadResource(soundItem->_resourceHandle); + soundItem->_data = soundItem->_resourceHandle.data(); } } @@ -569,10 +561,8 @@ void AudioResourceMan::unloadSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) _vm->_mixer->stopHandle(soundItem->_soundHandle); - if (soundItem->_data) { - _vm->_res->unloadResource(soundItem->_resourceHandle); - soundItem->_data = NULL; - } + _vm->_res->unloadResource(soundItem->_resourceHandle); + soundItem->_data = NULL; } void AudioResourceMan::setSoundVolume(int16 soundIndex, int16 volume) { @@ -597,9 +587,8 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) { if (!soundItem->_data) return; - uint32 soundSize = _vm->_res->getResourceSize(soundItem->_resourceHandle); - Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundSize, DisposeAfterUse::NO); - byte *shiftValue = _vm->_res->getResourceExtData(soundItem->_resourceHandle); + Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO); + const byte *shiftValue = soundItem->_resourceHandle.extData(); NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream); _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle, @@ -719,8 +708,10 @@ void AudioResourceMan::updateMusicItem(int16 musicIndex) { AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; if (musicItem->_start && !_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { + ResourceHandle resourceHandle; + _vm->_res->queryResource(musicItem->_fileHash, resourceHandle); Common::SeekableReadStream *stream = _vm->_res->createStream(musicItem->_fileHash); - byte *shiftValue = _vm->_res->getResourceExtDataByHash(musicItem->_fileHash); + const byte *shiftValue = resourceHandle.extData(); NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream); _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &musicItem->_soundHandle, audioStream, -1, VOLUME(musicItem->_isFadingIn ? musicItem->_fadeVolume : musicItem->_volume), diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h index 1f0940c353..8bfd5af2aa 100644 --- a/engines/neverhood/sound.h +++ b/engines/neverhood/sound.h @@ -184,8 +184,8 @@ private: struct AudioResourceManSoundItem { uint32 _fileHash; - int _resourceHandle; - byte *_data; + ResourceHandle _resourceHandle; + const byte *_data; bool _isLoaded; bool _isPlaying; int16 _volume; @@ -195,8 +195,6 @@ struct AudioResourceManSoundItem { struct AudioResourceManMusicItem { uint32 _fileHash; - // streamIndex dw - // needCreate db bool _isPlaying; bool _remove; int16 _volume; @@ -207,8 +205,6 @@ struct AudioResourceManMusicItem { int16 _fadeVolume; int16 _fadeVolumeStep; Audio::SoundHandle _soundHandle; - // status dw - // updateCounter dd }; class AudioResourceMan { diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 1e73078a1b..c7676ce0b4 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -263,10 +263,10 @@ void AnimatedSprite::updateAnim() { if (_currFrameTicks != 0 && (--_currFrameTicks == 0) && _animResource.getFrameCount() != 0) { if (_nextAnimFileHash != 0) { - if (_animResource.loadInternal(_nextAnimFileHash)) { + if (_animResource.load(_nextAnimFileHash)) { _currAnimFileHash = _nextAnimFileHash; } else { - _animResource.loadInternal(calcHash("sqDefault")); + _animResource.load(calcHash("sqDefault")); _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { @@ -294,10 +294,10 @@ void AnimatedSprite::updateAnim() { _currStickFrameIndex = _currFrameIndex; } else { if (_animStatus == 1) { - if (_animResource.loadInternal(_newAnimFileHash)) { + if (_animResource.load(_newAnimFileHash)) { _currAnimFileHash = _newAnimFileHash; } else { - _animResource.loadInternal(calcHash("sqDefault")); + _animResource.load(calcHash("sqDefault")); _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { @@ -307,10 +307,10 @@ void AnimatedSprite::updateAnim() { _currFrameIndex = _plFirstFrameHash != 0 ? MAX(0, _animResource.getFrameIndex(_plFirstFrameHash)) : 0; _lastFrameIndex = _plLastFrameHash != 0 ? MAX(0, _animResource.getFrameIndex(_plLastFrameHash)) : _animResource.getFrameCount() - 1; } else { - if (_animResource.loadInternal(_newAnimFileHash)) { + if (_animResource.load(_newAnimFileHash)) { _currAnimFileHash = _newAnimFileHash; } else { - _animResource.loadInternal(calcHash("sqDefault")); + _animResource.load(calcHash("sqDefault")); _currAnimFileHash = 0; } if (_replOldColor != _replNewColor) { diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 1a633e289a..31f9f5e014 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -147,7 +147,7 @@ void StaticData::load(const char *filename) { SceneInfo2700 *sceneInfo2700 = new SceneInfo2700(); uint32 id = fd.readUint32LE(); sceneInfo2700->bgFilename = fd.readUint32LE(); - sceneInfo2700->class437Filename = fd.readUint32LE(); + sceneInfo2700->bgShadowFilename = fd.readUint32LE(); sceneInfo2700->dataResourceFilename = fd.readUint32LE(); sceneInfo2700->pointListName = fd.readUint32LE(); sceneInfo2700->rectListName = fd.readUint32LE(); diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index 69a407bdcb..f9a8b71f80 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -80,7 +80,7 @@ struct HallOfRecordsInfo { struct SceneInfo2700 { uint32 id; uint32 bgFilename; - uint32 class437Filename; + uint32 bgShadowFilename; uint32 dataResourceFilename; uint32 pointListName; uint32 rectListName; -- cgit v1.2.3 From b2934eb166ba5b442a93969ad8b4dfbbc6ef3314 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Nov 2012 22:24:03 +0000 Subject: NEVERHOOD: Fix Klaymen "grow" animation after drinking the potion - Remove static sprite 0x50C027A8 Scene2803/Scene2803Small because the resource doesn't exist! - Remove some old comments - Fix resource extData handling which fixes some crashes - Enable reusing deleted sound/music slots in SoundMan (was disabled for debugging) --- engines/neverhood/blbarchive.cpp | 3 +- engines/neverhood/entity.cpp | 9 +--- engines/neverhood/entity.h | 4 +- engines/neverhood/gamemodule.cpp | 13 +++--- engines/neverhood/klayman.cpp | 25 ++++++----- engines/neverhood/klayman.h | 4 +- engines/neverhood/module2800.cpp | 94 ++++++++++++++++----------------------- engines/neverhood/resource.cpp | 2 +- engines/neverhood/resourceman.cpp | 8 +++- engines/neverhood/resourceman.h | 5 ++- engines/neverhood/sound.cpp | 10 ++--- engines/neverhood/sprite.cpp | 1 - 12 files changed, 81 insertions(+), 97 deletions(-) diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 02fad55000..748d04c7ca 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -91,7 +91,6 @@ void BlbArchive::open(const Common::String &filename) { BlbArchiveEntry &entry = _entries[i]; entry.type = _fd.readByte(); entry.comprType = _fd.readByte(); - //entry.extDataOfs = _fd.readUint16LE(); entry.extData = NULL; extDataOffsets[i] = _fd.readUint16LE(); entry.timeStamp = _fd.readUint32LE(); @@ -132,7 +131,7 @@ void BlbArchive::load(BlbArchiveEntry *entry, byte *buffer, uint32 size) { break; case 3: // DCL-compressed if (!Common::decompressDCL(&_fd, buffer, entry->diskSize, entry->size)) - error("BlbArchive::load() Error during decompression of %=8X", entry->fileHash); + error("BlbArchive::load() Error during decompression of %08X", entry->fileHash); break; default: error("BlbArchive::load() Unknown compression type %d", entry->comprType); diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index 29524f8639..c7f1659399 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -46,11 +46,6 @@ Entity *MessageParam::asEntity() const { return _entity; } -// TODO: Disable heavy debug stuff in release mode - -#define SetUpdateHandler(handler) _updateHandlerCb = static_cast (handler); debug(2, "SetUpdateHandler(" #handler ")"); _updateHandlerCbName = #handler -#define SetMessageHandler(handler) _messageHandlerCb = static_cast (handler); debug(2, "SetMessageHandler(" #handler ")"); _messageHandlerCbName = #handler - Entity::Entity(NeverhoodEngine *vm, int priority) : _vm(vm), _updateHandlerCb(NULL), _messageHandlerCb(NULL), _priority(priority), _soundResources(NULL) { } @@ -63,13 +58,13 @@ void Entity::draw() { } void Entity::handleUpdate() { - debug(2, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str()); + debug(5, "handleUpdate() -> [%s]", _updateHandlerCbName.c_str()); if (_updateHandlerCb) (this->*_updateHandlerCb)(); } uint32 Entity::receiveMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - debug(2, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); + debug(5, "receiveMessage(%04X) -> [%s]", messageNum, _messageHandlerCbName.c_str()); return _messageHandlerCb ? (this->*_messageHandlerCb)(messageNum, param, sender) : 0; } diff --git a/engines/neverhood/entity.h b/engines/neverhood/entity.h index 89a1a42eb4..fb8941ae43 100644 --- a/engines/neverhood/entity.h +++ b/engines/neverhood/entity.h @@ -61,12 +61,12 @@ protected: #define SetUpdateHandler(handler) \ _updateHandlerCb = static_cast (handler); \ - debug(2, "SetUpdateHandler(" #handler ")"); \ + debug(5, "SetUpdateHandler(" #handler ")"); \ _updateHandlerCbName = #handler #define SetMessageHandler(handler) \ _messageHandlerCb = static_cast (handler); \ - debug(2, "SetMessageHandler(" #handler ")"); \ + debug(5, "SetMessageHandler(" #handler ")"); \ _messageHandlerCbName = #handler const uint kMaxSoundResources = 16; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index e6f38f020c..5cb9198898 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -358,6 +358,8 @@ void GameModule::startup() { setSubVar(VA_CURR_WATER_PIPES_LEVEL, 2, 2); setSubVar(VA_CURR_WATER_PIPES_LEVEL, 3, 0); setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4); + setGlobalVar(V_KLAYMAN_SMALL, 1); + setGlobalVar(V_SHRINK_LIGHTS_ON, 0); // <<gameState().which = 0; - _vm->gameState().sceneNum = 28; - createModule(2700, -1); + _vm->gameState().sceneNum = 2; + createModule(2800, -1); #endif #if 1 - _vm->gameState().sceneNum = 4; - _vm->gameState().which = 1; - createModule(1000, -1); + _vm->gameState().sceneNum = 5; + _vm->gameState().which = 0; + createModule(2800, -1); #endif #if 0 _vm->gameState().sceneNum = 0; @@ -416,7 +418,6 @@ void GameModule::startup() { createModule(2700, -1); #endif #if 0 - setGlobalVar(V_KLAYMAN_SMALL, 1); // DEBUG Make Klayman small _vm->gameState().sceneNum = 2; createModule(2800, -1); #endif diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 9673adc6f8..39d38c322a 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -2212,16 +2212,16 @@ uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity * return messageResult; } -void Klayman::sub421230() {//stGrow +void Klayman::stFinishGrow() { _status2 = 2; _acceptInput = false; - startAnimationByHash(0x38445000, 0, -1); + startAnimation(0x38445000, 0, -1); SetUpdateHandler(&Klayman::update); SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::handleMessage41F1D0); + SetMessageHandler(&Klayman::hmFinishGrow); } -uint32 Klayman::handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 Klayman::hmFinishGrow(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -5728,7 +5728,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4804: if (param.asInteger() == 3) - GotoState(&Klayman::sub421230); + GotoState(&Klayman::stFinishGrow); break; case 0x480D: GotoState(&Klayman::stPullCord); @@ -5882,11 +5882,11 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty - - _surface->setClipRects(clipRects, clipRectsCount); if (flag) { + NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); + delete _surface; + createSurface(1000, dimensions.width, dimensions.height); loadSound(3, 0x58E0C341); loadSound(4, 0x40A00342); loadSound(5, 0xD0A1C348); @@ -5895,6 +5895,7 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } _dataResource.load(0x98182003); + _surface->setClipRects(clipRects, clipRectsCount); } @@ -5943,9 +5944,10 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 bool flag, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { - _surface->setClipRects(clipRects, clipRectsCount); - if (flag) { + NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); + delete _surface; + createSurface(1000, dimensions.width, dimensions.height); loadSound(3, 0x58E0C341); loadSound(4, 0x40A00342); loadSound(5, 0xD0A1C348); @@ -5954,6 +5956,7 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int1 } _dataResource.load(0x1830009A); + _surface->setClipRects(clipRects, clipRectsCount); } @@ -6070,7 +6073,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x4804: if (param.asInteger() == 3) - GotoState(&Klayman::sub421230); + GotoState(&Klayman::stFinishGrow); break; case NM_KLAYMAN_PICKUP: GotoState(&Klayman::stPickUpGeneric); diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 443bb97b2b..3b08108e3a 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -319,8 +319,8 @@ public: void stTurnToBackSmall(); uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); - void sub421230();//stGrow?? - uint32 handleMessage41F1D0(int messageNum, const MessageParam ¶m, Entity *sender); + void stFinishGrow(); + uint32 hmFinishGrow(int messageNum, const MessageParam ¶m, Entity *sender); void stJumpToRingVenusFlyTrap(); uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 6500ae0955..fb437fd86f 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -661,9 +661,6 @@ uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entit if (prevTuneStatus != _currTuneStatus) changeTuneStatus(prevTuneStatus, _currTuneStatus); break; - case 0x000D: - // DEBUG message - break; } return 0; } @@ -1035,7 +1032,6 @@ void Scene2803::toggleBackground() { } void Scene2803::changeBackground() { - // TODO? g_screen->resetDirtyRects(); if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { _asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D); _background->load(0x412A423E); @@ -1050,16 +1046,14 @@ void Scene2803::changeBackground() { _mouseCursor->updateCursor(); _sprite8->loadSprite(0x3C42022F); _sprite9->loadSprite(0x341A0237); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) _asTestTubeOne->loadSprite(0x66121222); - } else + else sendMessage(_asTestTubeOne, 0x2000, 0); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) _asTestTubeTwo->loadSprite(0x64330236); - } - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) _asTestTubeThree->loadSprite(0x2E4A22A2); - } _sprite10->setVisible(true); } else { _asLightCord->setFileHashes(0xAFAD591A, 0x276E321D); @@ -1075,16 +1069,12 @@ void Scene2803::changeBackground() { _mouseCursor->updateCursor(); _sprite8->loadSprite(0x108012C1); _sprite9->loadSprite(0x708072E0); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { - _asTestTubeOne->loadSprite(0x50C027A8); - } else + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0) sendMessage(_asTestTubeOne, 0x2000, 1); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) _asTestTubeTwo->loadSprite(0xD48077A0); - } - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) _asTestTubeThree->loadSprite(0x30022689); - } _sprite10->setVisible(false); } updatePaletteArea(); @@ -1144,18 +1134,14 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh _sprite5 = insertStaticSprite(0x34422912, 1100); _sprite6 = insertStaticSprite(0x3C42022F, 1100); _sprite7 = insertStaticSprite(0x341A0237, 1100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) insertStaticSprite(0x66121222, 100); else insertSprite(kScene2803SmallFileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) insertStaticSprite(0x64330236, 100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) insertStaticSprite(0x2E4A22A2, 100); - } else { setBackground(0x29800A01); setPalette(0x29800A01); @@ -1169,19 +1155,12 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh _sprite6 = insertStaticSprite(0x108012C1, 1100); _sprite7 = insertStaticSprite(0x708072E0, 1100); insertStaticSprite(0x90582EA4, 100); - - setSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0, 1);//DEBUG, FIXME crashes when not done?! - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) - insertStaticSprite(0x50C027A8, 100); - else + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0) insertSprite(kScene2803SmallFileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) insertStaticSprite(0xD48077A0, 100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) insertStaticSprite(0x30022689, 100); - } _sprite6->setVisible(false); @@ -1992,6 +1971,8 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; + which = 3; + SetMessageHandler(&Scene2806::handleMessage); SetUpdateHandler(&Scene2806::update); @@ -2023,7 +2004,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[2].x1 = tempSprite->getDrawRect().x; _clipRects[2].y2 = tempSprite->getDrawRect().y2(); _clipRects[3].y1 = tempSprite->getDrawRect().y2(); - _clipRects[1].x2 = tempSprite->getDrawRect().x2(); + _clipRects[1].x2 = tempSprite->getDrawRect().x; tempSprite = insertStaticSprite(0x72875F42, 1100); _clipRects[3].x1 = tempSprite->getDrawRect().x; @@ -2038,6 +2019,9 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[2].x2 = 640; _clipRects[3].x2 = 640; + for (uint i = 0; i < 4; i++) + debug("clipRect[%d] (%d, %d, %d, %d)", i, _clipRects[i].x1, _clipRects[i].y1, _clipRects[i].x2, _clipRects[i].y2); + if (which < 0) { insertKlayman(441, 423, false, _clipRects, 4); setMessageList(0x004AF098); @@ -2288,25 +2272,21 @@ uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam &pa } void AsScene2808TestTube::fill() { - - - if ((int)_fillLevel < _testTubeSetNum * 3 + 3) - return; - - if (_testTubeSetNum == 0) { - playSound(_fillLevel); - setVisible(true); - startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]); - _newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1]; - } else { - playSound(3 + _fillLevel); - setVisible(true); - startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); - _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; + if ((int)_fillLevel < _testTubeSetNum * 3 + 3) { + if (_testTubeSetNum == 0) { + playSound(_fillLevel); + setVisible(true); + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]); + _newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1]; + } else { + playSound(3 + _fillLevel); + setVisible(true); + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); + _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; + } + _ssDispenser->startCountdown(_fillLevel); + _fillLevel++; } - _ssDispenser->startCountdown(_fillLevel); - _fillLevel++; - } void AsScene2808TestTube::flush() { @@ -2446,13 +2426,12 @@ void AsScene2808LightEffect::update() { Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule, true), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) { - Sprite *tempSprite; + Sprite *asHandle; - if (which == 0) { + if (which == 0) _vm->gameModule()->initTestTubes1Puzzle(); - } else { + else _vm->gameModule()->initTestTubes2Puzzle(); - } SetMessageHandler(&Scene2808::handleMessage); SetUpdateHandler(&Scene2808::update); @@ -2460,8 +2439,8 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(kScene2808FileHashes1[which]); setPalette(kScene2808FileHashes1[which]); - tempSprite = insertSprite(this, which); - _vm->_collisionMan->addSprite(tempSprite); + asHandle = insertSprite(this, which); + _vm->_collisionMan->addSprite(asHandle); _asFlow = insertSprite(this, which); insertSprite(which); @@ -2513,9 +2492,14 @@ uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entit void Scene2808::update() { // DEBUG>>> Show correct values + #if 1 debug("---------------"); - debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2)); + if (_testTubeSetNum == 0) + debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2)); + else + debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)); debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); + #endif // DEBUG<<< Scene::update(); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 64f106128b..7f897a415f 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -162,7 +162,7 @@ bool AnimResource::load(uint32 fileHash) { _vm->_res->loadResource(_resourceHandle); resourceData = _resourceHandle.data(); - + animListCount = READ_LE_UINT16(resourceData); animInfoStartOfs = READ_LE_UINT16(resourceData + 2); spriteDataOfs = READ_LE_UINT32(resourceData + 4); diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 3b67b26a06..c30e272eab 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -66,8 +66,10 @@ ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) { return p != _entries.end() ? &(*p)._value : NULL; } -ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash) { +ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash, ResourceFileEntry **firstEntry) { ResourceFileEntry *entry = findEntrySimple(fileHash); + if (firstEntry) + *firstEntry = entry; for (; entry && entry->archiveEntry->comprType == 0x65; fileHash = entry->archiveEntry->diskSize) entry = findEntrySimple(fileHash); return entry; @@ -79,7 +81,9 @@ Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) { } void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) { - resourceHandle._resourceFileEntry = findEntry(fileHash); + ResourceFileEntry *firstEntry; + resourceHandle._resourceFileEntry = findEntry(fileHash, &firstEntry); + resourceHandle._extData = firstEntry ? firstEntry->archiveEntry->extData : NULL; } void ResourceMan::loadResource(ResourceHandle &resourceHandle) { diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index 515849efbf..e83de240ed 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -59,10 +59,11 @@ public: byte type() const { return isValid() ? _resourceFileEntry->archiveEntry->type : 0; }; const byte *data() const { return _data; } uint32 size() const { return isValid() ? _resourceFileEntry->archiveEntry->size : 0; }; - const byte *extData() const { return isValid() ? _resourceFileEntry->archiveEntry->extData : NULL; }; + const byte *extData() const { return _extData; }; uint32 fileHash() const { return isValid() ? _resourceFileEntry->archiveEntry->fileHash : 0; }; protected: ResourceFileEntry *_resourceFileEntry; + const byte *_extData; const byte *_data; }; @@ -72,7 +73,7 @@ public: ~ResourceMan(); void addArchive(const Common::String &filename); ResourceFileEntry *findEntrySimple(uint32 fileHash); - ResourceFileEntry *findEntry(uint32 fileHash); + ResourceFileEntry *findEntry(uint32 fileHash, ResourceFileEntry **firstEntry = NULL); Common::SeekableReadStream *createStream(uint32 fileHash); const ResourceFileEntry& getEntry(uint index) { return _entries[index]; } uint getEntryCount() { return _entries.size(); } diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index f0961f42e9..3cbcf96354 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -436,26 +436,22 @@ SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { } int16 SoundMan::addMusicItem(MusicItem *musicItem) { -#if 0 for (uint i = 0; i < _musicItems.size(); ++i) if (!_musicItems[i]) { _musicItems[i] = musicItem; return i; } -#endif int16 musicIndex = _musicItems.size(); _musicItems.push_back(musicItem); return musicIndex; } int16 SoundMan::addSoundItem(SoundItem *soundItem) { -#if 0 for (uint i = 0; i < _soundItems.size(); ++i) if (!_soundItems[i]) { _soundItems[i] = soundItem; return i; } -#endif int16 soundIndex = _soundItems.size(); _soundItems.push_back(soundItem); return soundIndex; @@ -550,7 +546,7 @@ void AudioResourceMan::removeSound(int16 soundIndex) { void AudioResourceMan::loadSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (!soundItem->_data) { + if (!soundItem->_data && soundItem->_resourceHandle.isValid()) { // TODO Check if it's a sound resource _vm->_res->loadResource(soundItem->_resourceHandle); soundItem->_data = soundItem->_resourceHandle.data(); @@ -580,6 +576,7 @@ void AudioResourceMan::setSoundPan(int16 soundIndex, int16 pan) { } void AudioResourceMan::playSound(int16 soundIndex, bool looping) { + AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; if (!soundItem->_data) loadSound(soundIndex); @@ -587,8 +584,9 @@ void AudioResourceMan::playSound(int16 soundIndex, bool looping) { if (!soundItem->_data) return; - Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO); const byte *shiftValue = soundItem->_resourceHandle.extData(); + + Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO); NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream); _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle, diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index c7676ce0b4..241912286c 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -477,7 +477,6 @@ void AnimatedSprite::gotoNextState() { if (_nextStateCb) { _currStateCb = _nextStateCb; _nextStateCb = NULL; - //debug("Fire _nextStateCb '%s'", _nextStateCbName.c_str()); (this->*_currStateCb)(); } else { _currStateCb = NULL; -- cgit v1.2.3 From 9a1d9883ad8a8f56b6c7397efe07a17625a03970 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 19 Nov 2012 23:37:20 +0000 Subject: NEVERHOOD: Fix AsCommonCar turning --- engines/neverhood/gamemodule.cpp | 8 ++++---- engines/neverhood/module1600.cpp | 34 +++++++++++----------------------- engines/neverhood/module1600.h | 2 -- engines/neverhood/module2800.cpp | 5 ----- 4 files changed, 15 insertions(+), 34 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 5cb9198898..dacac9861e 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -362,7 +362,7 @@ void GameModule::startup() { setGlobalVar(V_SHRINK_LIGHTS_ON, 0); // <<>> createScene(_vm->gameState().sceneNum, _vm->gameState().which); @@ -371,10 +371,10 @@ void GameModule::startup() { */ _vm->gameState().which = 0; - _vm->gameState().sceneNum = 2; - createModule(2800, -1); + _vm->gameState().sceneNum = 14; + createModule(2700, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 5; _vm->gameState().which = 0; createModule(2800, -1); diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index ca4d2e5322..41fc415cfb 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -210,6 +210,7 @@ AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 _newDeltaXType = -1; _soundCounter = 0; _pathPoints = NULL; + _currMoveDirection = 0; startAnimation(0xD4220027, 0, -1); setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); @@ -496,21 +497,6 @@ void AsCommonCar::stIdleBlink() { NextState(&AsCommonCar::stLeanForwardIdle); } -void AsCommonCar::stHandleRect() { - _isBusy = true; - gotoNextState(); - startAnimation(0x9C220DA4, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - FinalizeState(&AsCommonCar::evHandleRectDone); -} - -void AsCommonCar::evHandleRectDone() { - _isBusy = false; - _newMoveDirection = 0; - stUpdateMoveDirection(); -} - void AsCommonCar::stUpdateMoveDirection() { _isMoving = true; if (_currMoveDirection == 1) @@ -532,12 +518,13 @@ void AsCommonCar::moveToNextPoint() { } else { NPoint nextPt = pathPoint(_currPointIndex + 1); NPoint currPt = pathPoint(_currPointIndex); - if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && nextPt.x >= currPt.x && - (_currMoveDirection == 4 || _currMoveDirection == 2)) { - if (_currMoveDirection == 4) - _currMoveDirection = 2; - else if (_currMoveDirection == 2) + if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && + ((_currMoveDirection == 2 && nextPt.x < currPt.x) || + (_currMoveDirection == 4 && nextPt.x >= currPt.x))) { + if (_currMoveDirection == 2) _currMoveDirection = 4; + else if (_currMoveDirection == 4) + _currMoveDirection = 2; if (_isIdle) stTurnCarMoveToNextPoint(); else @@ -619,8 +606,9 @@ void AsCommonCar::moveToPrevPoint() { prevPt = pathPoint(_currPointIndex); currPt = pathPoint(_currPointIndex + 1); } - if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && currPt.x >= prevPt.x && - (_currMoveDirection == 2 || _currMoveDirection == 4)) { + if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && + ((_currMoveDirection == 2 && prevPt.x < currPt.x) || + (_currMoveDirection == 4 && prevPt.x >= currPt.x))) { if (_currMoveDirection == 2) _currMoveDirection = 4; else if (_currMoveDirection == 4) @@ -657,8 +645,8 @@ void AsCommonCar::stBrakeMoveToPrevPoint() { void AsCommonCar::evTurnCarDone() { _isBusy = false; - _newMoveDirection = 0; setDoDeltaX(2); + _newMoveDirection = 0; stUpdateMoveDirection(); } diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 2a7d547551..0c567e693f 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -89,8 +89,6 @@ protected: void stLeanForwardIdle(); void evIdleDone(); void stIdleBlink(); - void stHandleRect(); - void evHandleRectDone(); void stUpdateMoveDirection(); void stTurnCar(); void moveToNextPoint(); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index fb437fd86f..f97d0719f0 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -1736,8 +1736,6 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2804::handleMessage); SetUpdateHandler(&Scene2804::update); - //setGlobalVar(V_SHRINK_LIGHTS_ON, 1); // DEBUG Set lights on - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { setBackground(0xA1D03005); setPalette(0xA1D03005); @@ -2019,9 +2017,6 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[2].x2 = 640; _clipRects[3].x2 = 640; - for (uint i = 0; i < 4; i++) - debug("clipRect[%d] (%d, %d, %d, %d)", i, _clipRects[i].x1, _clipRects[i].y1, _clipRects[i].x2, _clipRects[i].y2); - if (which < 0) { insertKlayman(441, 423, false, _clipRects, 4); setMessageList(0x004AF098); -- cgit v1.2.3 From c182688e44a385549ca0734196a8a920a13ed8b6 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 21 Nov 2012 20:04:06 +0000 Subject: NEVERHOOD: Add saveload skeleton (doesn't actually do anything yet) --- engines/neverhood/module.mk | 1 + engines/neverhood/neverhood.h | 5 +- engines/neverhood/saveload.cpp | 147 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 engines/neverhood/saveload.cpp diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 9069203e9b..b3deb6f339 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -41,6 +41,7 @@ MODULE_OBJS = \ palette.o \ resource.o \ resourceman.o \ + saveload.o \ scene.o \ screen.o \ smackerscene.o \ diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index ba6b9f7450..a66bdb3dd7 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -105,6 +105,9 @@ public: uint32 version; byte gameID; uint32 flags; + uint32 saveDate; + uint32 saveTime; + uint32 playTime; Graphics::Surface *thumbnail; }; @@ -113,7 +116,6 @@ public: bool canLoadGameStateCurrently() { return _isSaveAllowed; } bool canSaveGameStateCurrently() { return _isSaveAllowed; } -#if 0 // Not used yet but let's keep it for later when it is Common::Error loadGameState(int slot); Common::Error saveGameState(int slot, const Common::String &description); void savegame(const char *filename, const char *description); @@ -121,7 +123,6 @@ public: const char *getSavegameFilename(int num); static Common::String getSavegameFilename(const Common::String &target, int num); static kReadSaveHeaderError readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header); -#endif GameState& gameState() { return _gameState; } GameModule *gameModule() { return _gameModule; } diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp new file mode 100644 index 0000000000..96d7fdd9f2 --- /dev/null +++ b/engines/neverhood/saveload.cpp @@ -0,0 +1,147 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * + */ + +#include "common/savefile.h" + +#include "graphics/thumbnail.h" + +#include "neverhood/neverhood.h" + +namespace Neverhood { + +#define NEVERHOOD_SAVEGAME_VERSION 0 + +NeverhoodEngine::kReadSaveHeaderError NeverhoodEngine::readSaveHeader(Common::SeekableReadStream *in, bool loadThumbnail, SaveHeader &header) { + + header.version = in->readUint32LE(); + if (header.version > NEVERHOOD_SAVEGAME_VERSION) + return kRSHEInvalidVersion; + + byte descriptionLen = in->readByte(); + header.description = ""; + while (descriptionLen--) + header.description += (char)in->readByte(); + + if (loadThumbnail) { + header.thumbnail = Graphics::loadThumbnail(*in); + } else { + Graphics::skipThumbnail(*in); + } + + // Not used yet, reserved for future usage + header.gameID = in->readByte(); + header.flags = in->readUint32LE(); + + header.saveDate = in->readUint32LE(); + header.saveTime = in->readUint32LE(); + header.playTime = in->readUint32LE(); + + return ((in->eos() || in->err()) ? kRSHEIoError : kRSHENoError); +} + +void NeverhoodEngine::savegame(const char *filename, const char *description) { + + Common::OutSaveFile *out; + if (!(out = g_system->getSavefileManager()->openForSaving(filename))) { + warning("Can't create file '%s', game not saved", filename); + return; + } + + TimeDate curTime; + g_system->getTimeAndDate(curTime); + + // Header start + out->writeUint32LE(NEVERHOOD_SAVEGAME_VERSION); + + byte descriptionLen = strlen(description); + out->writeByte(descriptionLen); + out->write(description, descriptionLen); + + Graphics::saveThumbnail(*out); + + // Not used yet, reserved for future usage + out->writeByte(0); + out->writeUint32LE(0); + uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF); + uint32 saveTime = ((curTime.tm_hour & 0xFF) << 16) | (((curTime.tm_min) & 0xFF) << 8) | ((curTime.tm_sec) & 0xFF); + uint32 playTime = g_engine->getTotalPlayTime() / 1000; + out->writeUint32LE(saveDate); + out->writeUint32LE(saveTime); + out->writeUint32LE(playTime); + // Header end + + // TODO + + out->finalize(); + delete out; +} + +void NeverhoodEngine::loadgame(const char *filename) { + Common::InSaveFile *in; + if (!(in = g_system->getSavefileManager()->openForLoading(filename))) { + warning("Can't open file '%s', game not loaded", filename); + return; + } + + SaveHeader header; + + kReadSaveHeaderError errorCode = readSaveHeader(in, false, header); + + if (errorCode != kRSHENoError) { + warning("Error loading savegame '%s'", filename); + delete in; + return; + } + + g_engine->setTotalPlayTime(header.playTime * 1000); + + // TODO + + delete in; + +} + +Common::Error NeverhoodEngine::loadGameState(int slot) { + const char *fileName = getSavegameFilename(slot); + loadgame(fileName); + return Common::kNoError; +} + +Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &description) { + const char *fileName = getSavegameFilename(slot); + savegame(fileName, description.c_str()); + return Common::kNoError; +} + +const char *NeverhoodEngine::getSavegameFilename(int num) { + static Common::String filename; + filename = getSavegameFilename(_targetName, num); + return filename.c_str(); +} + +Common::String NeverhoodEngine::getSavegameFilename(const Common::String &target, int num) { + assert(num >= 0 && num <= 999); + return Common::String::format("%s.%03d", target.c_str(), num); +} + +} // End of namespace Neverhood -- cgit v1.2.3 From 99e15e400537d85ff9f68cc10973b6d2c36c1776 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 22 Nov 2012 00:33:38 +0000 Subject: NEVERHOOD: More work on saveload, saving works, loading not yet (from the GMM, in-game isn't finished yet) --- engines/neverhood/detection.cpp | 39 ++++++++++++++++----------------------- engines/neverhood/gamevars.cpp | 24 ++++++++++++++++++++++++ engines/neverhood/gamevars.h | 5 +++-- engines/neverhood/neverhood.cpp | 16 +++------------- engines/neverhood/saveload.cpp | 8 ++++++-- 5 files changed, 52 insertions(+), 40 deletions(-) diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index df9eca3d7f..ed7053ac34 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -126,12 +126,10 @@ public: virtual bool hasFeature(MetaEngineFeature f) const; virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; -#if 0 // Not used yet but let's keep it for later when it is SaveStateList listSaves(const char *target) const; virtual int getMaximumSaveSlot() const; void removeSaveState(const char *target, int slot) const; SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; -#endif const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const; @@ -139,20 +137,20 @@ public: bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const { return - false; // Nothing yet :( -// (f == kSupportsListSaves) || -// (f == kSupportsLoadingDuringStartup) || + (f == kSupportsListSaves) || + (f == kSupportsLoadingDuringStartup) || // (f == kSupportsDeleteSave) || -// (f == kSavesSupportMetaInfo) || -// (f == kSavesSupportThumbnail); + (f == kSavesSupportMetaInfo) || + (f == kSavesSupportThumbnail) || + (f == kSavesSupportCreationDate) || + (f == kSavesSupportPlayTime); } bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const { return - false; // Nothing yet :( // (f == kSupportsRTL) || // TODO: Not yet... -// (f == kSupportsLoadingDuringRuntime) || -// (f == kSupportsSavingDuringRuntime); + (f == kSupportsLoadingDuringRuntime) || + (f == kSupportsSavingDuringRuntime); } bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { @@ -177,8 +175,6 @@ const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSLis return NULL; } -#if 0 // Not used yet but let's keep it for later when it is - SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Neverhood::NeverhoodEngine::SaveHeader header; @@ -213,9 +209,6 @@ int NeverhoodMetaEngine::getMaximumSaveSlot() const { } void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const { - // Slot 0 can't be deleted, it's for restarting the game(s) - if (slot == 0) - return; Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot); @@ -235,11 +228,6 @@ void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const { // Rename every slot greater than the deleted slot, // Also do not rename quicksaves. if (slotNum > slot && slotNum < 990) { - // FIXME: Our savefile renaming done here is inconsitent with what we do in - // GUI_v2::deleteMenu. While here we rename every slot with a greater equal - // number of the deleted slot to deleted slot, deleted slot + 1 etc., - // we only rename the following slots in GUI_v2::deleteMenu until a slot - // is missing. saveFileMan->renameSavefile(file->c_str(), filename.c_str()); filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot); @@ -265,7 +253,14 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, desc.setDeletableFlag(false); desc.setWriteProtectedFlag(false); desc.setThumbnail(header.thumbnail); - + int day = (header.saveDate >> 24) & 0xFF; + int month = (header.saveDate >> 16) & 0xFF; + int year = header.saveDate & 0xFFFF; + desc.setSaveDate(year, month, day); + int hour = (header.saveTime >> 16) & 0xFF; + int minutes = (header.saveTime >> 8) & 0xFF; + desc.setSaveTime(hour, minutes); + desc.setPlayTime(header.playTime * 1000); return desc; } } @@ -273,8 +268,6 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, return SaveStateDescriptor(); } -#endif - #if PLUGIN_ENABLED_DYNAMIC(NEVERHOOD) REGISTER_PLUGIN_DYNAMIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine); #else diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index e56ec1ec7d..558543fa31 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -31,6 +31,30 @@ GameVars::GameVars() { GameVars::~GameVars() { } +void GameVars::loadState(Common::InSaveFile *in) { + uint varCount; + _vars.clear(); + varCount = in->readUint32LE(); + for (uint i = 0; i < varCount; ++i) { + GameVar var; + var.nameHash = in->readUint32LE(); + var.value = in->readUint32LE(); + var.firstIndex = in->readUint16LE(); + var.nextIndex = in->readUint16LE(); + } +} + +void GameVars::saveState(Common::OutSaveFile *out) { + out->writeUint32LE(_vars.size()); + for (uint i = 0; i < _vars.size(); ++i) { + GameVar &var = _vars[i]; + out->writeUint32LE(var.nameHash); + out->writeUint32LE(var.value); + out->writeUint16LE(var.firstIndex); + out->writeUint16LE(var.nextIndex); + } +} + uint32 GameVars::getGlobalVar(uint32 nameHash) { int16 varIndex = findSubVarIndex(0, nameHash); return varIndex != -1 ? _vars[varIndex].value : 0; diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 623e5b5c6f..36fcebcbb8 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -24,6 +24,7 @@ #define NEVERHOOD_GAMEVARS_H #include "common/array.h" +#include "common/savefile.h" #include "neverhood/neverhood.h" namespace Neverhood { @@ -170,8 +171,8 @@ class GameVars { public: GameVars(); ~GameVars(); - // TODO void load(???); - // TODO void save(???); + void loadState(Common::InSaveFile *in); + void saveState(Common::OutSaveFile *out); uint32 getGlobalVar(uint32 nameHash); void setGlobalVar(uint32 nameHash, uint32 value); uint32 getSubVar(uint32 nameHash, uint32 subNameHash); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index c29cc7baf5..fbb8df319b 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -86,13 +86,6 @@ Common::Error NeverhoodEngine::run() { CursorMan.showMouse(true); -#if 0 - // TODO: This should probably be implemented as debug command later - dumpAllResources(); -#endif - -#if 1 - _soundMan = new SoundMan(this); _audioResourceMan = new AudioResourceMan(this); @@ -101,6 +94,9 @@ Common::Error NeverhoodEngine::run() { _gameModule->startup(); + // TODO Check if this can actually be false... + _isSaveAllowed = true; + uint32 nextFrameTime = 0; // Preliminary main loop, needs some more work but works for testing @@ -145,25 +141,19 @@ Common::Error NeverhoodEngine::run() { _gameModule->draw(); _screen->update(); nextFrameTime = _screen->getNextFrameTime(); - //_gameVars->dumpVars(); }; _soundMan->update(); _audioResourceMan->update(); - //_screen->update(); _system->updateScreen(); _system->delayMillis(10); - debug(0, "---------------------------------------"); - } delete _gameModule; delete _collisionMan; delete _soundMan; delete _audioResourceMan; -#endif - delete _res; delete _screen; diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp index 96d7fdd9f2..851943d61f 100644 --- a/engines/neverhood/saveload.cpp +++ b/engines/neverhood/saveload.cpp @@ -26,6 +26,7 @@ #include "graphics/thumbnail.h" #include "neverhood/neverhood.h" +#include "neverhood/gamevars.h" namespace Neverhood { @@ -90,7 +91,10 @@ void NeverhoodEngine::savegame(const char *filename, const char *description) { out->writeUint32LE(playTime); // Header end - // TODO + _gameVars->setGlobalVar(0x108A4870, _gameState.sceneNum); + _gameVars->setGlobalVar(0x82C80875, _gameState.which); + + _gameVars->saveState(out); out->finalize(); delete out; @@ -115,7 +119,7 @@ void NeverhoodEngine::loadgame(const char *filename) { g_engine->setTotalPlayTime(header.playTime * 1000); - // TODO + _gameVars->loadState(in); delete in; -- cgit v1.2.3 From 060287a4f85189cce3bb3b1b864b85cd81ee5c2f Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 3 Jan 2013 22:38:56 +0000 Subject: NEVERHOOD: Improve frame-exact seeking for Scene2802 Thanks to clone2727 for his help! --- engines/neverhood/gamemodule.cpp | 6 +++--- engines/neverhood/module2800.cpp | 3 +++ engines/neverhood/smackerplayer.cpp | 34 ++++++++++++++++++++++++++-------- engines/neverhood/smackerplayer.h | 9 +++++++-- video/smk_decoder.h | 6 ++++-- 5 files changed, 43 insertions(+), 15 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index dacac9861e..7d5932be42 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -362,7 +362,7 @@ void GameModule::startup() { setGlobalVar(V_SHRINK_LIGHTS_ON, 0); // <<>> createScene(_vm->gameState().sceneNum, _vm->gameState().which); @@ -417,8 +417,8 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif -#if 0 - _vm->gameState().sceneNum = 2; +#if 1 + _vm->gameState().sceneNum = 1; createModule(2800, -1); #endif #if 0 diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index f97d0719f0..e40890a882 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -540,6 +540,9 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) insertMouse435(0x008810A8, 20, 620); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true)); _currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); + // Need to go to the first frame first to load up the palette + _smackerPlayer->gotoFrame(0); + // Now we can actually set the current radio frame _smackerPlayer->gotoFrame(_currRadioMusicIndex); _vm->_soundMan->addSound(0x04360A18, 0x422630C2); _vm->_soundMan->addSound(0x04360A18, 0x00632252); diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 85319dcf26..7c14edf48b 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -62,6 +62,28 @@ void SmackerDoubleSurface::draw() { _vm->_screen->drawDoubleSurface2(_smackerFrame, _drawRect); } +void NeverhoodSmackerDecoder::forceSeekToFrame(uint frame) { + if (!isVideoLoaded()) + return; + + if (frame >= getFrameCount()) + error("Can't force Smacker seek to invalid frame %d", frame); + + if (_header.audioInfo[0].hasAudio) + error("Can't force Smacker frame seek with audio"); + if (!rewind()) + error("Failed to rewind"); + + SmackerVideoTrack *videoTrack = (SmackerVideoTrack *)getTrack(0); + uint32 offset = 0; + for (uint32 i = 0; i < frame; i++) { + videoTrack->increaseCurFrame(); + offset += _frameSizes[i] & ~3; + } + + _fileStream->seek(offset, SEEK_CUR); +} + // SmackerPlayer SmackerPlayer::SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused) @@ -95,7 +117,7 @@ void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { _stream = _vm->_res->createStream(fileHash); - _smackerDecoder = new Video::SmackerDecoder(); + _smackerDecoder = new NeverhoodSmackerDecoder(); _smackerDecoder->loadStream(_stream); _palette = new Palette(_vm); @@ -120,12 +142,9 @@ void SmackerPlayer::close() { } void SmackerPlayer::gotoFrame(int frameNumber) { - // NOTE Slow as hell but only used in Scene2802 - if (frameNumber != _smackerDecoder->getCurFrame()) { - if (frameNumber < _smackerDecoder->getCurFrame()) - rewind(); - while (_smackerDecoder->getCurFrame() != frameNumber) - _smackerDecoder->decodeNextFrame(); + if (_smackerDecoder) { + _smackerDecoder->forceSeekToFrame(frameNumber); + _smackerDecoder->decodeNextFrame(); } } @@ -156,7 +175,6 @@ void SmackerPlayer::rewind() { } void SmackerPlayer::update() { - debug(8, "SmackerPlayer::update()"); if (!_smackerDecoder) return; diff --git a/engines/neverhood/smackerplayer.h b/engines/neverhood/smackerplayer.h index b4d8ddbe69..26ebff5d33 100644 --- a/engines/neverhood/smackerplayer.h +++ b/engines/neverhood/smackerplayer.h @@ -47,6 +47,11 @@ public: virtual void draw(); }; +class NeverhoodSmackerDecoder : public Video::SmackerDecoder { +public: + void forceSeekToFrame(uint frame); +}; + class SmackerPlayer : public Entity { public: SmackerPlayer(NeverhoodEngine *vm, Scene *scene, uint32 fileHash, bool doubleSurface, bool flag, bool paused = false); @@ -61,11 +66,11 @@ public: void setDrawPos(int16 x, int16 y); void rewind(); bool isDone() { return getFrameNumber() + 1 == getFrameCount(); } - Video::SmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; } + NeverhoodSmackerDecoder *getSmackerDecoder() const { return _smackerDecoder; } protected: Scene *_scene; Palette *_palette; - Video::SmackerDecoder *_smackerDecoder; + NeverhoodSmackerDecoder *_smackerDecoder; SmackerSurface *_smackerSurface; uint32 _fileHash; bool _smackerFirst; diff --git a/video/smk_decoder.h b/video/smk_decoder.h index 7227238373..e4bc9bab42 100644 --- a/video/smk_decoder.h +++ b/video/smk_decoder.h @@ -122,7 +122,6 @@ protected: Common::SeekableReadStream *_fileStream; -private: enum AudioCompression { kCompressionNone, kCompressionDPCM, @@ -151,6 +150,10 @@ private: uint32 dummy; } _header; + uint32 *_frameSizes; + +private: + class SmackerAudioTrack : public AudioTrack { public: SmackerAudioTrack(const AudioInfo &audioInfo, Audio::Mixer::SoundType soundType); @@ -173,7 +176,6 @@ private: AudioInfo _audioInfo; }; - uint32 *_frameSizes; // The FrameTypes section of a Smacker file contains an array of bytes, where // the 8 bits of each byte describe the contents of the corresponding frame. // The highest 7 bits correspond to audio frames (bit 7 is track 6, bit 6 track 5 -- cgit v1.2.3 From 0f1aa64fd0172c374c491bcfba4ac7baa2394d2e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 6 Jan 2013 22:41:04 +0000 Subject: NEVERHOOD: Add support for the demo version - Remove debug resource dumping code - Fix Scene1501 (pictures without sound weren't displayed/too fast) - Move main loop to mainLoop method --- engines/neverhood/detection.cpp | 21 ++++++ engines/neverhood/gamemodule.cpp | 50 ++++++++----- engines/neverhood/module.cpp | 5 ++ engines/neverhood/module.h | 1 + engines/neverhood/module1000.cpp | 10 ++- engines/neverhood/module1500.cpp | 2 +- engines/neverhood/module2300.cpp | 8 ++ engines/neverhood/module2600.cpp | 22 +++++- engines/neverhood/neverhood.cpp | 151 ++++++++++++-------------------------- engines/neverhood/neverhood.h | 4 +- engines/neverhood/resourceman.cpp | 2 +- 11 files changed, 139 insertions(+), 137 deletions(-) diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index ed7053ac34..c40b9e76c7 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -55,6 +55,10 @@ uint16 NeverhoodEngine::getVersion() const { return _gameDescription->version; } +bool NeverhoodEngine::isDemo() const { + return _gameDescription->desc.flags & ADGF_DEMO; +} + } static const PlainGameDescriptor neverhoodGames[] = { @@ -84,6 +88,23 @@ static const NeverhoodGameDescription gameDescriptions[] = { 0, }, + { + // Neverhood English demo version + { + "neverhood", + "Demo", + AD_ENTRY1s("nevdemo.blb", "05b735cfb1086892bec79b54dca5545b", 22564568), + Common::EN_ANY, + Common::kPlatformWindows, + ADGF_DEMO, + GUIO1(GUIO_NONE) + }, + 0, + 0, + 0, + 0, + }, + { AD_TABLE_END_MARKER, 0, 0, 0, 0 } }; diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 7d5932be42..548b3585cd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -149,7 +149,9 @@ void GameModule::handleKeyDown(Common::KeyCode keyCode) { } void GameModule::handleEscapeKey() { - if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) + if (_vm->isDemo()) + _vm->quitGame(); + else if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) _mainMenuRequested = true; else if (_childObject) sendMessage(_childObject, 0x000C, 0); @@ -316,8 +318,9 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void GameModule::startup() { // TODO: Displaying of error text probably not needed in ScummVM -// createModule(1500, 0); // Logos and intro video //Real - +#if 1 + createModule(1500, 0); // Logos and intro video //Real +#else // DEBUG>>> /* setGlobalVar(V_SEEN_MUSIC_BOX, 1); @@ -417,7 +420,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 1; createModule(2700, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 1; createModule(2800, -1); #endif @@ -426,9 +429,11 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(2500, -1); #endif -#if 0 +#if 1 _vm->gameState().sceneNum = 1; - createModule(2400, -1); + createModule(2300, -1); +#endif + #endif } @@ -528,6 +533,9 @@ void GameModule::createModule(int moduleNum, int which) { setGlobalVar(V_MODULE_NAME, 0x81293110); _childObject = new Module3000(_vm, this, which); break; + case 9999: + createDemoScene(); + break; default: error("GameModule::createModule() Could not create module %d", moduleNum); } @@ -689,17 +697,18 @@ void GameModule::updateModule() { createModule(2300, 1); break; case 2300: - if (_moduleResult == 1) { - createModule(2200, 0); - } else if (_moduleResult == 2) { + if (_moduleResult == 2) createModule(1200, 0); - } else if (_moduleResult == 3) { + else if (_moduleResult == 0) + createModule(1000, 1); + else if (_vm->isDemo()) + createModule(9999, -1); + else if (_moduleResult == 1) + createModule(2200, 0); + else if (_moduleResult == 3) createModule(2400, 0); - } else if (_moduleResult == 4) { + else if (_moduleResult == 4) createModule(3000, 0); - } else { - createModule(1000, 1); - } break; case 2400: createModule(2300, 3); @@ -708,21 +717,19 @@ void GameModule::updateModule() { createModule(2600, 1); break; case 2600: - if (_moduleResult == 1) { + if (_moduleResult == 1) createModule(2500, 0); - } else { + else createModule(1200, 1); - } break; case 2700: createModule(1800, 2); break; case 2800: - if (_moduleResult == 1) { + if (_moduleResult == 1) createModule(2900, 5); - } else { + else createModule(1800, 0); - } break; case 2900: if (_moduleResult != 0xFFFFFFFF) { @@ -786,6 +793,9 @@ void GameModule::updateModule() { createModule(2300, 4); } break; + case 9999: + createModuleByHash(getGlobalVar(V_MODULE_NAME)); + break; } } } diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 1cd6c0d0b1..aeeb62f65c 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -24,6 +24,7 @@ #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" #include "neverhood/module1000.h" +#include "neverhood/module1500.h" namespace Neverhood { @@ -98,6 +99,10 @@ void Module::createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash) _childObject = new StaticScene(_vm, this, backgroundFileHash, cursorFileHash); } +void Module::createDemoScene() { + _childObject = new Scene1501(_vm, this, 0x0009B624, 0, 288, 0); +} + bool Module::updateChild() { if (_childObject) { _childObject->handleUpdate(); diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index bb01218364..576a5a4b78 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -62,6 +62,7 @@ protected: void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort); void createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash); + void createDemoScene(); bool updateChild(); void leaveModule(uint32 result); }; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index caa446639b..1aaa0c21a8 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -95,9 +95,13 @@ void Module1000::updateScene() { case 1: if (_moduleResult == 1) leaveModule(0); - else if (_moduleResult == 2) - createScene(3, 0); - else + else if (_moduleResult == 2) { + if (_vm->isDemo()) + // Demo version returns to the same scene + createScene(1, 2); + else + createScene(3, 0); + } else createScene(0, 1); break; case 2: diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 98c55bcc13..328bda39a4 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -106,7 +106,7 @@ void Scene1501::update() { _vm->_screen->clear(); leaveScene(0); } - } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || !isSoundPlaying(0)) { + } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0))) { _countdown1 = 12; _palette->startFadeToBlack(11); } diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 2c43afef38..937ba9a4f3 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -105,6 +105,9 @@ void Module2300::createScene(int sceneNum, int which) { _vm->_soundMan->setTwoSoundsPlayFlag(true); createSmackerScene(0x20080A0B, true, true, false); break; + case 9999: + createDemoScene(); + break; } SetUpdateHandler(&Module2300::updateScene); _childObject->handleUpdate(); @@ -122,6 +125,8 @@ void Module2300::updateScene() { case 1: if (_moduleResult == 1) createScene(0, 0); + else if (_vm->isDemo()) + createScene(9999, 0); else if (_moduleResult == 2) createScene(2, 1); else if (_moduleResult == 3) @@ -149,6 +154,9 @@ void Module2300::updateScene() { _vm->_soundMan->setTwoSoundsPlayFlag(false); createScene(1, 2); break; + case 9999: + createScene(1, -1); + break; } } else { switch (_sceneNum) { diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 4ddcc38978..741f4138b9 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -124,6 +124,9 @@ void Module2600::createScene(int sceneNum, int which) { else createSmackerScene(0x42980941, true, true, false); break; + case 9999: + createDemoScene(); + break; } SetUpdateHandler(&Module2600::updateScene); _childObject->handleUpdate(); @@ -151,8 +154,12 @@ void Module2600::updateScene() { case 2: if (_moduleResult == 0) createScene(1, 0); - else if (_moduleResult == 1) - createScene(1002, -1); + else if (_moduleResult == 1) { + if (_vm->isDemo()) + createScene(9999, -1); + else + createScene(1002, -1); + } break; case 3: if (_moduleResult == 0) { @@ -178,8 +185,12 @@ void Module2600::updateScene() { createScene(3, 1); break; case 6: - if (_moduleResult == 0) - createScene(1006, -1); + if (_moduleResult == 0) { + if (_vm->isDemo()) + createScene(9999, -1); + else + createScene(1006, -1); + } else if (_moduleResult == 1) createScene(1, 2); break; @@ -201,6 +212,9 @@ void Module2600::updateScene() { case 1008: createScene(6, 0); break; + case 9999: + createScene(_vm->gameState().sceneNum, -1); + break; } } } diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index fbb8df319b..ae181ff952 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -76,13 +76,19 @@ Common::Error NeverhoodEngine::run() { _screen = new Screen(this); _res = new ResourceMan(); - _res->addArchive("a.blb"); - _res->addArchive("c.blb"); - _res->addArchive("hd.blb"); - _res->addArchive("i.blb"); - _res->addArchive("m.blb"); - _res->addArchive("s.blb"); - _res->addArchive("t.blb"); + + if (isDemo()) { + _res->addArchive("a.blb"); + _res->addArchive("nevdemo.blb"); + } else { + _res->addArchive("a.blb"); + _res->addArchive("c.blb"); + _res->addArchive("hd.blb"); + _res->addArchive("i.blb"); + _res->addArchive("m.blb"); + _res->addArchive("s.blb"); + _res->addArchive("t.blb"); + } CursorMan.showMouse(true); @@ -97,13 +103,42 @@ Common::Error NeverhoodEngine::run() { // TODO Check if this can actually be false... _isSaveAllowed = true; - uint32 nextFrameTime = 0; + if (isDemo()) { + // Adjust some navigation lists for the demo version... + NavigationList *navigationList = _staticData->getNavigationList(0x004B67E8); + (*navigationList)[0].middleSmackerFileHash = 0; + (*navigationList)[0].middleFlag = 1; + (*navigationList)[2].middleSmackerFileHash = 0; + (*navigationList)[2].middleFlag = 1; + (*navigationList)[4].middleSmackerFileHash = 0; + (*navigationList)[4].middleFlag = 1; + (*navigationList)[5].middleSmackerFileHash = 0; + (*navigationList)[5].middleFlag = 1; + } + + mainLoop(); + + delete _gameModule; + delete _collisionMan; + delete _soundMan; + delete _audioResourceMan; + + delete _res; + delete _screen; - // Preliminary main loop, needs some more work but works for testing + delete _gameVars; + delete _staticData; + + debug("Ok."); + + return Common::kNoError; +} + +void NeverhoodEngine::mainLoop() { + uint32 nextFrameTime = 0; while (!shouldQuit()) { Common::Event event; Common::EventManager *eventMan = _system->getEventManager(); - while (eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_KEYDOWN: @@ -134,7 +169,6 @@ Common::Error NeverhoodEngine::run() { break; } } - if (_system->getMillis() >= nextFrameTime) { _gameModule->checkMainMenu(); _gameModule->handleUpdate(); @@ -142,28 +176,11 @@ Common::Error NeverhoodEngine::run() { _screen->update(); nextFrameTime = _screen->getNextFrameTime(); }; - _soundMan->update(); _audioResourceMan->update(); _system->updateScreen(); _system->delayMillis(10); - } - - delete _gameModule; - delete _collisionMan; - delete _soundMan; - delete _audioResourceMan; - - delete _res; - delete _screen; - - delete _gameVars; - delete _staticData; - - debug("Ok."); - - return Common::kNoError; } NPoint NeverhoodEngine::getMousePos() { @@ -173,82 +190,4 @@ NPoint NeverhoodEngine::getMousePos() { return pt; } -void writeTga(const char *filename, byte *pixels, byte *palette, int16 width, int16 height) { - byte identsize = 0; - byte colourmaptype = 1; - byte imagetype = 1; - uint16 colourmapstart = 0; - uint16 colourmaplength = 256; - byte colourmapbits = 24; - uint16 xstart = 0; - uint16 ystart = 0; - byte bits = 8; - byte descriptor = 0x20; - Common::DumpFile tga; - tga.open(filename); - tga.writeByte(identsize); - tga.writeByte(colourmaptype); - tga.writeByte(imagetype); - tga.writeUint16LE(colourmapstart); - tga.writeUint16LE(colourmaplength); - tga.writeByte(colourmapbits); - tga.writeUint16LE(xstart); - tga.writeUint16LE(ystart); - tga.writeUint16LE(width); - tga.writeUint16LE(height); - tga.writeByte(bits); - tga.writeByte(descriptor); - tga.write(palette, 768); - tga.write(pixels, width * height); - tga.close(); -} - -void NeverhoodEngine::dumpAllResources() { -#if 0 - PaletteResource paletteResource(this); - byte *vgaPalette = new byte[768]; - //paletteResource.load(0x4086520E); - paletteResource.load(0x12C23307); - byte *srcpalette = paletteResource.palette(); - for (int i = 0; i < 256; i++) { - vgaPalette[i * 3 + 2] = srcpalette[i * 4 + 0]; - vgaPalette[i * 3 + 1] = srcpalette[i * 4 + 1]; - vgaPalette[i * 3 + 0] = srcpalette[i * 4 + 2]; - } - -#if 0 - for (int i = 0; i < 768; i++) - vgaPalette[i] <<= 2; -#endif - - uint entriesCount = _res->getEntryCount(); - debug("%d entries", entriesCount); - - for (uint i = 0; i < entriesCount; i++) { - const ResourceFileEntry &entry = _res->getEntry(i); - int type = _res->getResourceTypeByHash(entry.archiveEntry->fileHash); - debug("hash: %08X; type: %d", entry.archiveEntry->fileHash, type); - if (type == 4) { - AnimResource anim(this); - anim.load(entry.archiveEntry->fileHash); - for (uint frameIndex = 0; frameIndex < anim.getFrameCount(); frameIndex++) { - const AnimFrameInfo &frameInfo = anim.getFrameInfo(frameIndex); - int16 width = (frameInfo.drawOffset.width + 3) & 0xFFFC; - byte *pixels = new byte[width * frameInfo.drawOffset.height]; - memset(pixels, 0, width * frameInfo.drawOffset.height); - anim.draw(frameIndex, pixels, width, false, false); - Common::String filename = - frameInfo.frameHash != 0 - ? Common::String::format("%08X_%03d_%08X.tga", entry.archiveEntry->fileHash, frameIndex, frameInfo.frameHash) - : Common::String::format("%08X_%03d.tga", entry.archiveEntry->fileHash, frameIndex); - writeTga(filename.c_str(), pixels, vgaPalette, width, frameInfo.drawOffset.height); - delete[] pixels; - } - } - } - - delete[] vgaPalette; -#endif -} - } // End of namespace Neverhood diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index a66bdb3dd7..b0f9abb2e2 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -59,6 +59,7 @@ class NeverhoodEngine : public ::Engine { protected: Common::Error run(); + void mainLoop(); public: NeverhoodEngine(OSystem *syst, const NeverhoodGameDescription *gameDesc); @@ -71,6 +72,7 @@ public: uint16 getVersion() const; Common::Platform getPlatform() const; bool hasFeature(EngineFeature f) const; + bool isDemo() const; Common::RandomSource *_rnd; @@ -130,8 +132,6 @@ public: int16 getMouseY() const { return _mouseY; } NPoint getMousePos(); - void dumpAllResources(); - public: }; diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index c30e272eab..7b7d5cf236 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -77,7 +77,7 @@ ResourceFileEntry *ResourceMan::findEntry(uint32 fileHash, ResourceFileEntry **f Common::SeekableReadStream *ResourceMan::createStream(uint32 fileHash) { ResourceFileEntry *entry = findEntry(fileHash); - return entry->archive->createStream(entry->archiveEntry); + return entry ? entry->archive->createStream(entry->archiveEntry) : NULL; } void ResourceMan::queryResource(uint32 fileHash, ResourceHandle &resourceHandle) { -- cgit v1.2.3 From a35cd088e52eced55d5c0f8253773e9d940b8373 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 8 Jan 2013 00:47:47 +0000 Subject: NEVERHOOD: Remove obsolete _keyState --- engines/neverhood/neverhood.cpp | 11 +++-------- engines/neverhood/neverhood.h | 1 - 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index ae181ff952..4ee801bff4 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -70,11 +70,8 @@ Common::Error NeverhoodEngine::run() { _staticData = new StaticData(); _staticData->load("neverhood.dat"); - _gameVars = new GameVars(); - _screen = new Screen(this); - _res = new ResourceMan(); if (isDemo()) { @@ -98,13 +95,11 @@ Common::Error NeverhoodEngine::run() { _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); - _gameModule->startup(); - // TODO Check if this can actually be false... _isSaveAllowed = true; if (isDemo()) { - // Adjust some navigation lists for the demo version... + // Adjust this navigation list for the demo version NavigationList *navigationList = _staticData->getNavigationList(0x004B67E8); (*navigationList)[0].middleSmackerFileHash = 0; (*navigationList)[0].middleFlag = 1; @@ -116,6 +111,8 @@ Common::Error NeverhoodEngine::run() { (*navigationList)[5].middleFlag = 1; } + _gameModule->startup(); + mainLoop(); delete _gameModule; @@ -142,12 +139,10 @@ void NeverhoodEngine::mainLoop() { while (eventMan->pollEvent(event)) { switch (event.type) { case Common::EVENT_KEYDOWN: - _keyState = event.kbd.keycode; _gameModule->handleKeyDown(event.kbd.keycode); _gameModule->handleAsciiKey(event.kbd.ascii); break; case Common::EVENT_KEYUP: - _keyState = Common::KEYCODE_INVALID; break; case Common::EVENT_MOUSEMOVE: _mouseX = event.mouse.x; diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index b0f9abb2e2..ef0f16c41a 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -77,7 +77,6 @@ public: Common::RandomSource *_rnd; int16 _mouseX, _mouseY; - Common::KeyCode _keyState; uint16 _buttonState; GameState _gameState; -- cgit v1.2.3 From 30178e46e522c6d741e82e282f3f3edc1fab4825 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 8 Jan 2013 01:19:52 +0000 Subject: NEVERHOOD: Implement savegame loading via GMM (in-game saving/loading still TODO) --- engines/neverhood/gamemodule.cpp | 13 ++++++++++++- engines/neverhood/gamemodule.h | 1 + engines/neverhood/gamevars.cpp | 1 + engines/neverhood/gamevars.h | 2 ++ engines/neverhood/module1200.cpp | 3 ++- engines/neverhood/saveload.cpp | 10 ++++++++-- 6 files changed, 26 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 548b3585cd..823f89a05a 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -437,6 +437,15 @@ void GameModule::startup() { #endif } +void GameModule::restoreGame() { + delete _childObject; + delete _prevChildObject; + _childObject = NULL; + _prevChildObject = NULL; + _prevModuleNum = 0; + createModuleByHash(getGlobalVar(V_MODULE_NAME)); +} + void GameModule::checkMainMenu() { if (_mainMenuRequested) openMainMenu(); @@ -544,6 +553,7 @@ void GameModule::createModule(int moduleNum, int which) { } void GameModule::createModuleByHash(uint32 nameHash) { + debug("GameModule::createModuleByHash(%08X)", nameHash); switch (nameHash) { case 0x03294419: createModule(1000, -1); @@ -833,7 +843,7 @@ void GameModule::updateMenuModule() { _moduleNum = _prevModuleNum; SetUpdateHandler(&GameModule::updateModule); } else if (_gameWasLoaded) { - debug("_gameWasLoaded!"); +#if 0 // TODO Handle this in some other way... _gameWasLoaded = false; delete _childObject; delete _prevChildObject; @@ -842,6 +852,7 @@ void GameModule::updateMenuModule() { _prevModuleNum = 0; // TODO Create module from savegame values... // TODO createModuleByHash(...); +#endif } } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 53adb859f8..93373a1a3f 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -33,6 +33,7 @@ public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); void startup(); + void restoreGame(); void checkMainMenu(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index 558543fa31..7bf9f30e25 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -41,6 +41,7 @@ void GameVars::loadState(Common::InSaveFile *in) { var.value = in->readUint32LE(); var.firstIndex = in->readUint16LE(); var.nextIndex = in->readUint16LE(); + _vars.push_back(var); } } diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 36fcebcbb8..a62b33c297 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -32,6 +32,8 @@ namespace Neverhood { enum { // Misc V_MODULE_NAME = 0x91080831, // Currently active module name hash + V_CURRENT_SCENE = 0x108A4870, // Current scene in the current module + V_CURRENT_SCENE_WHICH = 0x82C80875, V_DEBUG = 0xA4014072, // Original debug-flag, can probably be removed V_SMACKER_CAN_ABORT = 0x06C02850, // Not set anywhere (yet), seems like a debug flag V_KEY3_LOCATION = 0x13382860, // Location of the third key diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 98ec012fb5..e86aa003ee 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -1025,7 +1025,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) playSound(0, 0x40106542); loadSound(1, 0x40005446); - loadSound(2, 0x40005446); + loadSound(2, 0x40005446); // Same sound as slot 1 loadSound(3, 0x68E25540); } @@ -1049,6 +1049,7 @@ void Scene1202::update() { playSound(3); _isPuzzleSolved = true; } else if (_clickedIndex >= 0 && _counter == 0) { + // Swap TNT positions int destIndex = kScene1202Table[_clickedIndex]; sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex)); sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp index 851943d61f..e1ef95477b 100644 --- a/engines/neverhood/saveload.cpp +++ b/engines/neverhood/saveload.cpp @@ -26,6 +26,7 @@ #include "graphics/thumbnail.h" #include "neverhood/neverhood.h" +#include "neverhood/gamemodule.h" #include "neverhood/gamevars.h" namespace Neverhood { @@ -91,8 +92,8 @@ void NeverhoodEngine::savegame(const char *filename, const char *description) { out->writeUint32LE(playTime); // Header end - _gameVars->setGlobalVar(0x108A4870, _gameState.sceneNum); - _gameVars->setGlobalVar(0x82C80875, _gameState.which); + _gameVars->setGlobalVar(V_CURRENT_SCENE, _gameState.sceneNum); + _gameVars->setGlobalVar(V_CURRENT_SCENE_WHICH, _gameState.which); _gameVars->saveState(out); @@ -121,6 +122,11 @@ void NeverhoodEngine::loadgame(const char *filename) { _gameVars->loadState(in); + _gameState.sceneNum = _gameVars->getGlobalVar(V_CURRENT_SCENE); + _gameState.which = _gameVars->getGlobalVar(V_CURRENT_SCENE_WHICH); + + _gameModule->restoreGame(); + delete in; } -- cgit v1.2.3 From fec1d7816a3e9924db7eb617eda1a6f3fd7b8978 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 10 Jan 2013 00:08:41 +0000 Subject: NEVERHOOD: Implement resource cache purging and purge it after each scene --- engines/neverhood/resourceman.cpp | 10 ++++++++++ engines/neverhood/resourceman.h | 1 + engines/neverhood/scene.cpp | 3 +++ 3 files changed, 14 insertions(+) diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 7b7d5cf236..9e5f9ae52f 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -116,4 +116,14 @@ void ResourceMan::unloadResource(ResourceHandle &resourceHandle) { } } +void ResourceMan::purgeResources() { + for (Common::HashMap::iterator it = _data.begin(); it != _data.end(); ++it) { + ResourceData *resourceData = (*it)._value; + if (resourceData->dataRefCount == 0) { + delete resourceData->data; + resourceData->data = NULL; + } + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/resourceman.h b/engines/neverhood/resourceman.h index e83de240ed..5a3697fe0d 100644 --- a/engines/neverhood/resourceman.h +++ b/engines/neverhood/resourceman.h @@ -80,6 +80,7 @@ public: void queryResource(uint32 fileHash, ResourceHandle &resourceHandle); void loadResource(ResourceHandle &resourceHandle); void unloadResource(ResourceHandle &resourceHandle); + void purgeResources(); protected: typedef Common::HashMap EntriesMap; Common::Array _archives; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 6141ee4487..c899a59408 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -70,6 +70,9 @@ Scene::~Scene() { delete *iter; // Don't delete surfaces since they always belong to an entity + + // Purge the resources after each scene + _vm->_res->purgeResources(); } -- cgit v1.2.3 From 4b7ad48ca8857fd0c597ae1cc1ce599a3286bd57 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 10 Jan 2013 22:52:46 +0000 Subject: NEVERHOOD: Rename some CollisionMan methods/fields - Remove fallback detector (I think it's not needed) - Rename Scene insertMouse methods --- engines/neverhood/collisionman.cpp | 40 ++++++---------------- engines/neverhood/collisionman.h | 14 ++++---- engines/neverhood/detection.cpp | 36 -------------------- engines/neverhood/diskplayerscene.cpp | 7 ++-- engines/neverhood/menumodule.cpp | 14 ++++---- engines/neverhood/module1000.cpp | 14 ++++---- engines/neverhood/module1100.cpp | 22 ++++++------ engines/neverhood/module1200.cpp | 12 +++---- engines/neverhood/module1300.cpp | 48 +++++++++++++------------- engines/neverhood/module1400.cpp | 30 ++++++++-------- engines/neverhood/module1600.cpp | 22 ++++++------ engines/neverhood/module1700.cpp | 4 +-- engines/neverhood/module1900.cpp | 12 +++---- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2100.cpp | 6 ++-- engines/neverhood/module2200.cpp | 52 ++++++++++++++-------------- engines/neverhood/module2400.cpp | 16 ++++----- engines/neverhood/module2500.cpp | 6 ++-- engines/neverhood/module2600.cpp | 4 +-- engines/neverhood/module2700.cpp | 12 +++---- engines/neverhood/module2800.cpp | 64 +++++++++++++++++------------------ engines/neverhood/module2900.cpp | 6 ++-- engines/neverhood/module3000.cpp | 20 +++++------ engines/neverhood/scene.cpp | 12 +++---- engines/neverhood/scene.h | 4 +-- 25 files changed, 211 insertions(+), 268 deletions(-) diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp index 973c0fe853..bafa1e3e82 100644 --- a/engines/neverhood/collisionman.cpp +++ b/engines/neverhood/collisionman.cpp @@ -39,16 +39,6 @@ void CollisionMan::setHitRects(uint32 id) { void CollisionMan::setHitRects(HitRectList *hitRects) { _hitRects = hitRects; - - // DEBUG - if (_hitRects) { - debug("CollisionMan::setHitRects() count = %d", _hitRects->size()); - for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) { - HitRect *hitRect = &(*it); - debug("(%d, %d, %d, %d) -> %04X", hitRect->rect.x1, hitRect->rect.y1, hitRect->rect.x2, hitRect->rect.y2, hitRect->type); - } - } - } void CollisionMan::clearHitRects() { @@ -63,9 +53,9 @@ HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) { return &defaultHitRect; } -void CollisionMan::addSprite(Sprite *sprite) { +void CollisionMan::addCollisionSprite(Sprite *sprite) { int index = 0, insertIndex = -1; - for (Common::Array::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) { + for (Common::Array::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) { if ((*iter)->getPriority() > sprite->getPriority()) { insertIndex = index; break; @@ -73,26 +63,26 @@ void CollisionMan::addSprite(Sprite *sprite) { index++; } if (insertIndex >= 0) - _sprites.insert_at(insertIndex, sprite); + _collisionSprites.insert_at(insertIndex, sprite); else - _sprites.push_back(sprite); + _collisionSprites.push_back(sprite); } -void CollisionMan::removeSprite(Sprite *sprite) { - for (uint index = 0; index < _sprites.size(); index++) { - if (_sprites[index] == sprite) { - _sprites.remove_at(index); +void CollisionMan::removeCollisionSprite(Sprite *sprite) { + for (uint index = 0; index < _collisionSprites.size(); index++) { + if (_collisionSprites[index] == sprite) { + _collisionSprites.remove_at(index); break; } } } -void CollisionMan::clearSprites() { - _sprites.clear(); +void CollisionMan::clearCollisionSprites() { + _collisionSprites.clear(); } void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) { - for (Common::Array::iterator iter = _sprites.begin(); iter != _sprites.end(); iter++) { + for (Common::Array::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) { Sprite *collSprite = *iter; if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) { sprite->sendMessage(collSprite, messageNum, messageParam); @@ -100,12 +90,4 @@ void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, } } -void CollisionMan::save() { - // TODO -} - -void CollisionMan::restore() { - // TODO -} - } // End of namespace Neverhood diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h index 86359525b0..36bb2a56ad 100644 --- a/engines/neverhood/collisionman.h +++ b/engines/neverhood/collisionman.h @@ -37,18 +37,16 @@ public: void setHitRects(HitRectList *hitRects); void clearHitRects(); HitRect *findHitRectAtPos(int16 x, int16 y); - void addSprite(Sprite *sprite); - void removeSprite(Sprite *sprite); - void clearSprites(); + void addCollisionSprite(Sprite *sprite); + void removeCollisionSprite(Sprite *sprite); + void clearCollisionSprites(); void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam); - void save(); - void restore(); - uint getSpriteCount() const { return _sprites.size(); } - Sprite *getSprite(uint index) const { return _sprites[index]; } + uint getCollisionSpritesCount() const { return _collisionSprites.size(); } + Sprite *getCollisionSprite(uint index) const { return _collisionSprites[index]; } protected: NeverhoodEngine *_vm; HitRectList *_hitRects; - Common::Array _sprites; + Common::Array _collisionSprites; }; diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index c40b9e76c7..9dc4582ba7 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -108,26 +108,6 @@ static const NeverhoodGameDescription gameDescriptions[] = { { AD_TABLE_END_MARKER, 0, 0, 0, 0 } }; -/** - * The fallback game descriptor used by the Neverhood engine's fallbackDetector. - * Contents of this struct are to be overwritten by the fallbackDetector. - */ -static NeverhoodGameDescription g_fallbackDesc = { - { - "", - "", - AD_ENTRY1(0, 0), // This should always be AD_ENTRY1(0, 0) in the fallback descriptor - Common::UNK_LANG, - Common::kPlatformPC, - ADGF_NO_FLAGS, - GUIO_NONE - }, - 0, - 0, - 0, - 0, -}; - } // End of namespace Neverhood class NeverhoodMetaEngine : public AdvancedMetaEngine { @@ -152,8 +132,6 @@ public: void removeSaveState(const char *target, int slot) const; SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; - const ADGameDescription *fallbackDetect(const Common::FSList &fslist) const; - }; bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const { @@ -182,20 +160,6 @@ bool NeverhoodMetaEngine::createInstance(OSystem *syst, Engine **engine, const A return gd != 0; } -const ADGameDescription *NeverhoodMetaEngine::fallbackDetect(const Common::FSList &fslist) const { - // Set the default values for the fallback descriptor's ADGameDescription part. - Neverhood::g_fallbackDesc.desc.language = Common::UNK_LANG; - Neverhood::g_fallbackDesc.desc.platform = Common::kPlatformPC; - Neverhood::g_fallbackDesc.desc.flags = ADGF_NO_FLAGS; - - // Set default values for the fallback descriptor's NeverhoodGameDescription part. - Neverhood::g_fallbackDesc.gameID = 0; - Neverhood::g_fallbackDesc.features = 0; - Neverhood::g_fallbackDesc.version = 3; - - return NULL; -} - SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Neverhood::NeverhoodEngine::SaveHeader header; diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index d6d4de1a68..fbef6006d5 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -325,7 +325,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int setPalette(kDiskplayerPaletteFileHashes[paletteIndex]); _ssPlayButton = insertSprite(this); - _vm->_collisionMan->addSprite(_ssPlayButton); + _vm->_collisionMan->addCollisionSprite(_ssPlayButton); _asKey = insertSprite(); @@ -351,7 +351,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0); addEntity(_finalDiskSlot); - insertMouse435(0x000408A8, 20, 620); + insertPuzzleMouse(0x000408A8, 20, 620); showMouse(false); _diskSmackerPlayer = new SmackerPlayer(_vm, this, 0x08288103, false, true); @@ -442,7 +442,6 @@ void DiskplayerScene::update() { } uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; Scene::handleMessage(messageNum, param, sender); if (!_inputDisabled) { switch (messageNum) { @@ -473,7 +472,7 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, break; } } - return messageResult; + return 0; } void DiskplayerScene::stop() { diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 528d3035ff..521c0e0c72 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -240,7 +240,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) setBackground(0x08C0020C); setPalette(0x08C0020C); - insertMouse433(0x00208084); + insertScreenMouse(0x00208084); insertStaticSprite(0x41137051, 100); insertStaticSprite(0xC10B2015, 100); @@ -251,7 +251,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) { Sprite *menuButton = insertSprite(this, buttonIndex, kMenuButtonFileHashes[buttonIndex], kMenuButtonCollisionBounds[buttonIndex]); - _vm->_collisionMan->addSprite(menuButton); + _vm->_collisionMan->addCollisionSprite(menuButton); } SetUpdateHandler(&Scene::update); @@ -466,7 +466,7 @@ TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 it void TextLabelWidget::addSprite() { _parentScene->addSprite(this); - _vm->_collisionMan->addSprite(this); + _vm->_collisionMan->addCollisionSprite(this); } int16 TextLabelWidget::getWidth() { @@ -544,7 +544,7 @@ void TextEditWidget::addSprite() { createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); - _vm->_collisionMan->addSprite(this); + _vm->_collisionMan->addCollisionSprite(this); _surface->setVisible(true); _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2, 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, @@ -708,7 +708,7 @@ void SavegameListBox::addSprite() { createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); - _vm->_collisionMan->addSprite(this); + _vm->_collisionMan->addCollisionSprite(this); _surface->setVisible(true); buildItems(); _firstVisibleItem = 0; @@ -809,7 +809,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra setBackground(0x30084E25); setPalette(0x30084E25); - insertMouse433(0x84E21308, &kMouseRect); + insertScreenMouse(0x84E21308, &kMouseRect); insertStaticSprite(0x1340A5C2, 200); insertStaticSprite(0x1301A7EA, 200); @@ -826,7 +826,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { Sprite *menuButton = insertSprite(this, buttonIndex, kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]); - _vm->_collisionMan->addSprite(menuButton); + _vm->_collisionMan->addCollisionSprite(menuButton); } diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 1aaa0c21a8..6c5cc28065 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -344,7 +344,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) setHitRects(0x004B4860); setBackground(0x4086520E); setPalette(0x4086520E); - insertMouse433(0x6520A400); + insertScreenMouse(0x6520A400); if (which < 0) { // Restoring game @@ -1226,7 +1226,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_gameState.which = 0; } - insertMouse433(0x23303124); + insertScreenMouse(0x23303124); tempSprite = insertStaticSprite(0xB3242310, 825); tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, @@ -1243,7 +1243,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); _ssPressButton = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); _asVenusFlyTrap = insertSprite(this, _klayman, false); - _vm->_collisionMan->addSprite(_asVenusFlyTrap); + _vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); @@ -1395,7 +1395,7 @@ StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backg setBackground(backgroundFileHash); setPalette(backgroundFileHash); - insertMouse435(cursorFileHash, 20, 620); + insertPuzzleMouse(cursorFileHash, 20, 620); } uint32 StaticScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1460,7 +1460,7 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) } addEntity(_palette); - insertMouse433(0x03001504); + insertScreenMouse(0x03001504); if (which < 0) { // Restoring game @@ -1550,13 +1550,13 @@ Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x2800E011); setPalette(0x2800E011); insertStaticSprite(0x492D5AD7, 100); - insertMouse435(0x0E015288, 20, 620); + insertPuzzleMouse(0x0E015288, 20, 620); } else { setBackground(0x8870A546); setPalette(0x8870A546); insertStaticSprite(0x40D1E0A9, 100); insertStaticSprite(0x149C00A6, 100); - insertMouse435(0x0A54288F, 20, 620); + insertPuzzleMouse(0x0A54288F, 20, 620); } drawTextToBackground(); diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index cc6284b0cc..4b8a8ba75f 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -444,8 +444,8 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule) _asTeddyBear = insertSprite(this); ssOpenButton = insertSprite(this); - _vm->_collisionMan->addSprite(ssOpenButton); - insertMouse435(0x10006208, 20, 620); + _vm->_collisionMan->addCollisionSprite(ssOpenButton); + insertPuzzleMouse(0x10006208, 20, 620); loadSound(0, 0x48442057); loadSound(1, 0xC025014F); @@ -555,19 +555,19 @@ void Scene1105::createObjects() { _ssSymbolDice[2] = insertSprite(2, 485, 304); _ssSymbol1UpButton = insertSprite(this, 0x08002860, NRect(146, 362, 192, 403)); - _vm->_collisionMan->addSprite(_ssSymbol1UpButton); + _vm->_collisionMan->addCollisionSprite(_ssSymbol1UpButton); _ssSymbol1DownButton = insertSprite(this, 0x42012460, NRect(147, 404, 191, 442)); - _vm->_collisionMan->addSprite(_ssSymbol1DownButton); + _vm->_collisionMan->addCollisionSprite(_ssSymbol1DownButton); _ssSymbol2UpButton = insertSprite(this, 0x100030A0, NRect(308, 361, 355, 402)); - _vm->_collisionMan->addSprite(_ssSymbol2UpButton); + _vm->_collisionMan->addCollisionSprite(_ssSymbol2UpButton); _ssSymbol2DownButton = insertSprite(this, 0x840228A0, NRect(306, 406, 352, 445)); - _vm->_collisionMan->addSprite(_ssSymbol2DownButton); + _vm->_collisionMan->addCollisionSprite(_ssSymbol2DownButton); _ssSymbol3UpButton = insertSprite(this, 0x20000120, NRect(476, 358, 509, 394)); - _vm->_collisionMan->addSprite(_ssSymbol3UpButton); + _vm->_collisionMan->addCollisionSprite(_ssSymbol3UpButton); _ssSymbol3DownButton = insertSprite(this, 0x08043121, NRect(463, 401, 508, 438)); - _vm->_collisionMan->addSprite(_ssSymbol3DownButton); + _vm->_collisionMan->addCollisionSprite(_ssSymbol3DownButton); _ssActionButton = insertSprite(this, 0x8248AD35, NRect(280, 170, 354, 245)); - _vm->_collisionMan->addSprite(_ssActionButton); + _vm->_collisionMan->addCollisionSprite(_ssActionButton); _isPanelOpen = true; @@ -575,7 +575,7 @@ void Scene1105::createObjects() { // TODO: Find a nicer way deleteSprite((Sprite**)&_mouseCursor); - insertMouse435(0x18666208, 20, 620); + insertPuzzleMouse(0x18666208, 20, 620); } @@ -652,7 +652,7 @@ Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x8449E02F); setPalette(0x8449E02F); - insertMouse433(0x9E02B84C); + insertScreenMouse(0x9E02B84C); _sprite1 = insertStaticSprite(0x600CEF01, 1100); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index e86aa003ee..11e29fda7a 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -671,10 +671,10 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]); } - insertMouse433(0x9A2C0409); + insertScreenMouse(0x9A2C0409); _asTape = insertSprite(this, 3, 1100, 243, 340, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); tempSprite = insertStaticSprite(0x03C82530, 100); topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; @@ -752,7 +752,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asTntMan = insertSprite(this, _asTntManRope, which == 1); _asTntMan->setClipRect(x1, 0, x2, 480); _asTntMan->setRepl(64, 0); - _vm->_collisionMan->addSprite(_asTntMan); + _vm->_collisionMan->addCollisionSprite(_asTntMan); tempSprite = insertSprite(_asTntMan); tempSprite->setClipRect(x1, 0, x2, 480); } @@ -826,7 +826,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_MATCH_STATUS) < 3) { _asMatch = insertSprite(this); - _vm->_collisionMan->addSprite(_asMatch); + _vm->_collisionMan->addCollisionSprite(_asMatch); } if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { @@ -1011,11 +1011,11 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) _paletteResource.load(0x60250EB5); _paletteResource.copyPalette(_paletteData); - insertMouse435(0x10ED160A, 20, 620); + insertPuzzleMouse(0x10ED160A, 20, 620); for (int tntIndex = 0; tntIndex < 18; tntIndex++) { _asTntItems[tntIndex] = insertSprite(this, tntIndex); - _vm->_collisionMan->addSprite(_asTntItems[tntIndex]); + _vm->_collisionMan->addCollisionSprite(_asTntItems[tntIndex]); } insertStaticSprite(0x8E8419C1, 1100); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index feebd78485..989ada535d 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -427,7 +427,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B0A38); setBackground(0x420643C4); setPalette(0x420643C4); - insertMouse433(0x643C0428); + insertScreenMouse(0x643C0428); _class595 = insertStaticSprite(0xB0420130, 1015); _sprite1 = insertStaticSprite(0x942FC224, 300); @@ -456,7 +456,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); _asVenusFlyTrap = insertSprite(this, _klayman, true); - _vm->_collisionMan->addSprite(_asVenusFlyTrap); + _vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); @@ -637,11 +637,11 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) setRectList(0x004AF9E8); setBackground(0x01581A9C); setPalette(0x01581A9C); - insertMouse433(0x81A9801D); + insertScreenMouse(0x81A9801D); if (!getGlobalVar(V_BALLOON_POPPED)) { _asBalloon = insertSprite(this); - _vm->_collisionMan->addSprite(_asBalloon); + _vm->_collisionMan->addCollisionSprite(_asBalloon); } _sprite1 = insertStaticSprite(0xA014216B, 1100); @@ -699,18 +699,18 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B91A8); setBackground(0x062C0214); setPalette(0x062C0214); - insertMouse433(0xC021006A); + insertScreenMouse(0xC021006A); if (getGlobalVar(V_BALLOON_POPPED)) { _asKey = insertSprite(this, 0, 1100, 278, 347); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); } else { _asKey = insertSprite(0x80106018, 100, 279, 48); } if (!getGlobalVar(V_HAS_NEEDLE)) { _asNeedle = insertSprite(this, 1100, 278, 347); - _vm->_collisionMan->addSprite(_asNeedle); + _vm->_collisionMan->addCollisionSprite(_asNeedle); } _sprite1 = insertStaticSprite(0x0562E621, 1100); @@ -763,7 +763,7 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B6E98); setBackground(0x28801B64); setPalette(0x28801B64); - insertMouse433(0x01B60280); + insertScreenMouse(0x01B60280); if (which < 0) { // Restoring game @@ -876,11 +876,11 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x05303114); setPalette(0x05303114); - insertMouse433(0x0311005B); + insertScreenMouse(0x0311005B); if (getGlobalVar(V_KEY3_LOCATION) == 4) { _asKey = insertSprite(this, 2, 1100, 435, 445); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); } _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); @@ -897,14 +897,14 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(380, 440); setMessageList(0x004AFAD0); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else if (which == 1) { // Klaymen teleporting in insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFAF0); sendMessage(this, 0x2000, 1); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else if (which == 2) { // Klaymen returning from diskplayer if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { @@ -915,27 +915,27 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) } setMessageList(0x004AFBC8); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else if (which == 3) { // Klaymen returning from window insertKlayman(534, 440); setMessageList(0x004AFC30); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else if (which == 4) { // Klaymen teleporting out insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFC38); sendMessage(this, 0x2000, 1); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else if (which == 5) { // Klaymen returning from teleporter insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFB00); sendMessage(this, 0x2000, 1); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else { // Klaymen coming up in elevator insertKlayman(286, 408); @@ -1007,7 +1007,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit setSurfacePriority(_asElevatorDoor->getSurface(), 90); setSurfacePriority(_sprite1->getSurface(), 80); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); break; } return 0; @@ -1033,7 +1033,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, setSurfacePriority(_asElevatorDoor->getSurface(), 90); setSurfacePriority(_sprite1->getSurface(), 80); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); break; } return 0; @@ -1246,7 +1246,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) setBackground(0xA8006200); setPalette(0xA8006200); addEntity(_palette); - insertMouse435(0x06204A88, 20, 620); + insertPuzzleMouse(0x06204A88, 20, 620); tempSprite = insertStaticSprite(0x00A3621C, 800); _clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480); @@ -1260,7 +1260,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) { _asKeys[keyIndex] = insertSprite(this, keyIndex, _clipRects); - _vm->_collisionMan->addSprite(_asKeys[keyIndex]); + _vm->_collisionMan->addCollisionSprite(_asKeys[keyIndex]); } else { _asKeys[keyIndex] = NULL; } @@ -1527,10 +1527,10 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x41024202); setPalette(0x41024202); - insertMouse433(0x24206418); + insertScreenMouse(0x24206418); _asTape = insertSprite(this, 17, 1100, 502, 445, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); if (getGlobalVar(V_MOUSE_SUCKED_IN)) { insertSprite(); @@ -1603,7 +1603,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_asProjector); + _vm->_collisionMan->addCollisionSprite(_asProjector); _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _asProjector->setRepl(64, 0); } @@ -1701,7 +1701,7 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule) SetMessageHandler(&Scene1317::handleMessage); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); - insertMouse433(0x08284011); + insertScreenMouse(0x08284011); showMouse(false); _smackerFileHash = 0; _keepLastSmackerFrame = false; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index e0cf2c5ec3..521981e995 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -637,7 +637,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B6758); setBackground(0x08221FA5); setPalette(0x08221FA5); - insertMouse433(0x21FA108A); + insertScreenMouse(0x21FA108A); _ssFloorButton = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); _asPipe = insertSprite(); @@ -678,7 +678,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) { _asProjector = insertSprite(this, _klayman, _asPipe); - _vm->_collisionMan->addSprite(_asProjector); + _vm->_collisionMan->addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); @@ -850,7 +850,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) setBackgroundY(-10); setPalette(0x231482F0); _palette->addPalette(0x91D3A391, 0, 64, 0); - insertMouse433(0x482F4239); + insertScreenMouse(0x482F4239); _ssBridgePart1 = insertSprite(0x15402D64, 1100); _ssBridgePart2 = insertSprite(0x10A02120, 1100); @@ -898,7 +898,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_asProjector); + _vm->_collisionMan->addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); @@ -1227,7 +1227,7 @@ Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule) setBackground(0x00442225); setPalette(0x00442225); - insertMouse435(0x4222100C, 20, 620); + insertPuzzleMouse(0x4222100C, 20, 620); _asMouse = insertSprite(this); _ssResetButton = insertStaticSprite(0x12006600, 100); @@ -1285,17 +1285,17 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B1FF8); setBackground(0x2110A234); setPalette(0x2110A234); - insertMouse433(0x0A230219); + insertScreenMouse(0x0A230219); _sprite1 = insertStaticSprite(0x01102A33, 100); _sprite1->setVisible(false); _sprite2 = insertStaticSprite(0x04442520, 995); _sprite3 = insertStaticSprite(0x08742271, 995); _asTape1 = insertSprite(this, 12, 1100, 201, 468, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape1); + _vm->_collisionMan->addCollisionSprite(_asTape1); _asTape1->setRepl(64, 0); _asTape2 = insertSprite(this, 16, 1100, 498, 468, 0x9048A093); - _vm->_collisionMan->addSprite(_asTape2); + _vm->_collisionMan->addCollisionSprite(_asTape2); _asTape2->setRepl(64, 0); if (which < 0) { @@ -1311,7 +1311,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_asProjector); + _vm->_collisionMan->addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); @@ -1393,16 +1393,16 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xAC0B006F); setPalette(0xAC0B006F); _palette->addPalette(0x00801510, 0, 65, 0); - insertMouse433(0xB006BAC8); + insertScreenMouse(0xB006BAC8); if (getGlobalVar(V_KEY3_LOCATION) == 5) { _asKey = insertSprite(this, 2, 1100, 267, 411); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); } _sprite1 = insertStaticSprite(0x1900A1F8, 1100); _asTape = insertSprite(this, 14, 1100, 281, 411, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); if (which < 0) { // Restoring game @@ -1429,7 +1429,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addSprite(_asProjector); + _vm->_collisionMan->addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); @@ -1561,11 +1561,11 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule) setBackground(0x0C0C007D); setPalette(0x0C0C007D); - insertMouse435(0xC00790C8, 20, 620); + insertPuzzleMouse(0xC00790C8, 20, 620); for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) { _tiles[tileIndex] = insertSprite(this, tileIndex); - _vm->_collisionMan->addSprite(_tiles[tileIndex]); + _vm->_collisionMan->addCollisionSprite(_tiles[tileIndex]); if (getSubVar(VA_IS_TILE_MATCH, tileIndex)) _tilesLeft--; } diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 41fc415cfb..b40d580c4e 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -996,7 +996,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene1608::hmLowerFloor); _asKey = insertSprite(this, 1, 1100, 198, 220); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); if (which < 0) { // Restoring game @@ -1014,10 +1014,10 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); - insertMouse433(0x80E05108); + insertScreenMouse(0x80E05108); insertStaticSprite(0x4B18F868, 1200); } } else if (which == 0) { @@ -1031,8 +1031,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); - insertMouse433(0x80E05108); + _vm->_collisionMan->addCollisionSprite(_asTape); + insertScreenMouse(0x80E05108); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); @@ -1045,7 +1045,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x98001604); setPalette(0x98001604); _palette->addPalette("paPodRed", 65, 31, 65); - insertMouse433(0x01600988); + insertScreenMouse(0x01600988); _sprite2 = insertStaticSprite(0x491F38A8, 1100); _asCar = createSprite(this, 375, 227); // Create but don't add to the sprite list yet _asIdleCarLower = insertSprite(375, 227); @@ -1072,7 +1072,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); insertSprite(_asCar)->setClipRect(_clipRect1); _klaymanInCar = false; _carClipFlag = false; @@ -1089,7 +1089,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x98001604); setPalette(0x98001604); _palette->addPalette("paPodRed", 65, 31, 65); - insertMouse433(0x01600988); + insertScreenMouse(0x01600988); _asCar = insertSprite(this, 375, 227); _asIdleCarLower = insertSprite(375, 227); _asIdleCarFull = insertSprite(375, 227); @@ -1114,7 +1114,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - // ... _vm->_collisionMan->addSprite(_asTape); + // ... _vm->_collisionMan->addCollisionSprite(_asTape); insertSprite(_asCar)->setClipRect(_clipRect1); _klaymanInCar = true; _carClipFlag = true; @@ -1313,13 +1313,13 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) setBackground(0x92124A14); setPalette(0x92124A14); - insertMouse435(0x24A10929, 20, 620); + insertPuzzleMouse(0x24A10929, 20, 620); for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++) _asSymbols[symbolPosition] = insertSprite(symbolPosition, false); _ssButton = insertSprite(this, true); - _vm->_collisionMan->addSprite(_ssButton); + _vm->_collisionMan->addCollisionSprite(_ssButton); loadSound(0, 0x68E25540); } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index aa145290eb..cf2fe63984 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -193,14 +193,14 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(0x91D3A391, 0, 64, 0); _palette->copyBasePalette(0, 256, 0); addEntity(_palette); - insertMouse433(0x18222039); + insertScreenMouse(0x18222039); insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0); insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1); insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2); _sprite = insertStaticSprite(0x31313A22, 1100); _ssTape = insertSprite(this, 15, 1100, 238, 439, 0x02363852); - _vm->_collisionMan->addSprite(_ssTape); + _vm->_collisionMan->addCollisionSprite(_ssTape); if (which < 0) { // Restoring game diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 269fd840a9..2557121c41 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -95,7 +95,7 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x01303227); setPalette(0x01303227); - insertMouse433(0x0322301B); + insertScreenMouse(0x0322301B); insertStaticSprite(0x42213133, 1100); @@ -358,8 +358,8 @@ void AsScene1907Symbol::stFallOffHitGround() { playSound(1); sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); Entity::_priority = 1000 - _newPositionIndex; - _vm->_collisionMan->removeSprite(this); - _vm->_collisionMan->addSprite(this); + _vm->_collisionMan->removeCollisionSprite(this); + _vm->_collisionMan->addCollisionSprite(this); SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround); NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); _newStickFrameIndex = 0; @@ -527,15 +527,15 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule) for (int i = 0; i < 9; i++) { _asSymbols[i] = insertSprite(this, i, getRandomPositionIndex()); - _vm->_collisionMan->addSprite(_asSymbols[i]); + _vm->_collisionMan->addCollisionSprite(_asSymbols[i]); } _ssUpDownButton = insertSprite(this, _asSymbols[8]); - _vm->_collisionMan->addSprite(_ssUpDownButton); + _vm->_collisionMan->addCollisionSprite(_ssUpDownButton); _asWaterHint = insertSprite(); - insertMouse435(0x28E0120E, 20, 620); + insertPuzzleMouse(0x28E0120E, 20, 620); SetMessageHandler(&Scene1907::handleMessage); SetUpdateHandler(&Scene1907::update); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index ce871de5e8..643bec4d49 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -103,7 +103,7 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xA6417244); setPalette(0xA6417244); - insertMouse433(0x17240A6C); + insertScreenMouse(0x17240A6C); tempSprite = insertStaticSprite(0x0D641724, 1100); diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 7bbb9e8158..12b10b43e2 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -203,15 +203,15 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x44242305); setPalette(0x44242305); - insertMouse433(0x4230144A); + insertScreenMouse(0x4230144A); insertStaticSprite(0x00502330, 1100); tempSprite = insertStaticSprite(0x78492010, 1100); _ssFloorButton = insertSprite(this, 0x72427010, 0x32423010, 200, 0); _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape1); + _vm->_collisionMan->addCollisionSprite(_asTape1); _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape2); + _vm->_collisionMan->addCollisionSprite(_asTape2); if (which < 0) { insertKlayman(380, 438); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 8061e977f1..dc77a5ea08 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -548,10 +548,10 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) loadHitRectList(); setBackground(0x40008208); setPalette(0x40008208); - insertMouse433(0x0820C408); + insertScreenMouse(0x0820C408); _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) @@ -881,13 +881,13 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x08100A0C); setPalette(0x08100A0C); addEntity(_palette); - insertMouse435(0x00A08089, 20, 620); + insertPuzzleMouse(0x00A08089, 20, 620); for (uint32 cubePosition = 0; cubePosition < 9; cubePosition++) { int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition); if (cubeSymbol >= 0) { Sprite *puzzleCubeSprite = insertSprite(this, cubePosition, cubeSymbol); - _vm->_collisionMan->addSprite(puzzleCubeSprite); + _vm->_collisionMan->addCollisionSprite(puzzleCubeSprite); } } @@ -1094,17 +1094,17 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x82C80334); setPalette(0x82C80334); - insertMouse433(0x80330824); + insertScreenMouse(0x80330824); setHitRects(0x004B8320); setRectList(0x004B8420); if (getGlobalVar(V_KEY3_LOCATION) == 1) { _asKey = insertSprite(this, 2, 1100, 282, 432); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); } _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); _asLeftDoor = insertSprite(this, 0); _asRightDoor = insertSprite(this, 1); _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); @@ -1113,8 +1113,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480); sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); - _vm->_collisionMan->addSprite(_asLeftDoor); - _vm->_collisionMan->addSprite(_asRightDoor); + _vm->_collisionMan->addCollisionSprite(_asLeftDoor); + _vm->_collisionMan->addCollisionSprite(_asRightDoor); if (which < 0) { // Restoring game @@ -1227,14 +1227,14 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x0008028D); setPalette(0x0008028D); addEntity(_palette); - insertMouse433(0x80289008); + insertScreenMouse(0x80289008); _ssLightSwitch = insertSprite(this, 0x2D339030, 0x2D309030, 100, 0); } else { _isLightOn = false; setBackground(0xD00A028D); setPalette(0xD00A028D); addEntity(_palette); - insertMouse433(0xA0289D08); + insertScreenMouse(0xA0289D08); _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); } _palette->addBasePalette(0xD00A028D, 0, 256, 0); @@ -1467,7 +1467,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8AF8); _ssButton = insertSprite(this, 0x0E038022, 100, 0); - insertMouse433(0x83212411); + insertScreenMouse(0x83212411); _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x5E00E262); _asPlatform = insertSprite(0x085E25E0); } else { @@ -1479,7 +1479,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); setRectList(0x004B8B58); _ssButton = insertSprite(this, 0x16882608, 100, 0); - insertMouse433(0x02A41E09); + insertScreenMouse(0x02A41E09); _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x52032563); _asPlatform = insertSprite(0x317831A0); } @@ -1491,7 +1491,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(fileHash, 0, 256, 0); if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x0263D144, 0, 65, 0); - _vm->_collisionMan->addSprite(_ssTestTube); + _vm->_collisionMan->addCollisionSprite(_ssTestTube); if (which < 0) { // Restoring game @@ -1944,14 +1944,14 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) if (getGlobalVar(V_LIGHTS_ON)) { setBackground(0x88C00241); setPalette(0x88C00241); - insertMouse433(0x00245884); + insertScreenMouse(0x00245884); _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); _asTape = insertSprite(this, 4, 1100, 277, 428, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); _asLever = insertSprite(this, 527, 333, 0); - _vm->_collisionMan->addSprite(_asLever); + _vm->_collisionMan->addCollisionSprite(_asLever); _asWallRobotAnimation = insertSprite(this); _asWallCannonAnimation = insertSprite(); _asWallRobotAnimation->setVisible(false); @@ -1964,7 +1964,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1); setBackground(0x05C02A55); setPalette(0x05C02A55); - insertMouse433(0x02A51054); + insertScreenMouse(0x02A51054); _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0); insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1); @@ -2134,7 +2134,7 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) addBackground(_background); setPalette(0x08100289); addEntity(_palette); - insertMouse435(0x0028D089, 40, 600); + insertPuzzleMouse(0x0028D089, 40, 600); createFontSurface(); _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); @@ -2296,7 +2296,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_LIGHTS_ON)) { setBackground(0x11840E24); setPalette(0x11840E24); - insertMouse433(0x40E20110); + insertScreenMouse(0x40E20110); setRectList(0x004B3DC8); } else { setBackground(0x25848E24); @@ -2304,12 +2304,12 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); _palette->copyBasePalette(0, 256, 0); _palette->addPalette(0x68033B1C, 0, 65, 0); - insertMouse433(0x48E20250); + insertScreenMouse(0x48E20250); setRectList(0x004B3E18); } _asTape = insertSprite(this, 10, 1100, 464, 435, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); if (which < 0) { // Restoring game @@ -2418,12 +2418,12 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule setRectList(0x004B2BF8); setBackground(_hallOfRecordsInfo->bgFilename2); setPalette(_hallOfRecordsInfo->bgFilename2); - insertMouse433(0x14320138); + insertScreenMouse(0x14320138); } else { setRectList(0x004B2BB8); setBackground(_hallOfRecordsInfo->bgFilename1); setPalette(_hallOfRecordsInfo->bgFilename1); - insertMouse433(0x63A40028); + insertScreenMouse(0x63A40028); } if (which < 0) { @@ -2507,12 +2507,12 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004B5588); setBackground(0x40339414); setPalette(0x40339414); - insertMouse433(0x3941040B); + insertScreenMouse(0x3941040B); } else { setRectList(0x004B55C8); setBackground(0x071963E5); setPalette(0x071963E5); - insertMouse433(0x14320138); + insertScreenMouse(0x14320138); } if (which < 0) { diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 3acb8b4a1f..ed9e23155d 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -382,7 +382,7 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) addEntity(_palette); _palette->addBasePalette(0x8C030206, 0, 256, 0); _palette->addPalette(0x91D3A391, 0, 65, 0); - insertMouse433(0x302028C8); + insertScreenMouse(0x302028C8); _sprite1 = insertStaticSprite(0x2E068A23, 200); insertStaticSprite(0x401410A6, 200); @@ -694,9 +694,9 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) setRectList(0x004AF900); setBackground(0x81660220); setPalette(0x81660220); - insertMouse433(0x6022481E); + insertScreenMouse(0x6022481E); _asTape = insertSprite(this, 9, 1100, 286, 409, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); _ssButton = insertSprite(this, 0x15288120, 100, 0); if (which < 0) { @@ -794,9 +794,9 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x0C05060C); setPalette(0x0C05060C); _palette->addPalette(0x414364B0, 0, 65, 0); - insertMouse433(0x506080C8); + insertScreenMouse(0x506080C8); _asTape = insertSprite(this, 2, 1100, 480, 454, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); _asLightCord = insertSprite(this, 0xA1095A10, 0x836D3813, 368, 200); _asLightCord->setClipRect(0, 25, 640, 480); @@ -889,15 +889,15 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2406::handleMessage); setRectList(0x004B78C8); - insertMouse433(0xB03001A8); + insertScreenMouse(0xB03001A8); if (getGlobalVar(V_KEY3_LOCATION) == 2) { _asKey = insertSprite(this, 2, 1100, 560, 409); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); } _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); tempSprite2 = insertStaticSprite(0x19625293, 1100); _clipRects[0].x1 = 0; _clipRects[0].y1 = 0; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 34793877c6..3fc508a4a6 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -232,7 +232,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x1B8E8115); _palette->addPalette(0x00128842, 65, 31, 65); _palette->addPalette("paKlayRed", 0, 64, 0); - insertMouse433(0xE81111B0); + insertScreenMouse(0xE81111B0); _ssTrackShadowBackground = createSprite(0x99BE9015); // Don't add this to the sprite list addEntity(_ssTrackShadowBackground); @@ -542,8 +542,8 @@ Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x90791B80); setPalette(0x90791B80); ssButton = insertSprite(); - _vm->_collisionMan->addSprite(ssButton); - insertMouse435(0x91B8490F, 20, 620); + _vm->_collisionMan->addCollisionSprite(ssButton); + insertPuzzleMouse(0x91B8490F, 20, 620); SetMessageHandler(&Scene2504::handleMessage); SetUpdateHandler(&Scene::update); } diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 741f4138b9..91132c030a 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -317,8 +317,8 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x51409A16); _asWater = insertSprite(); _ssButton = insertSprite(this); - _vm->_collisionMan->addSprite(_ssButton); - insertMouse435(0x09A1251C, 20, 620); + _vm->_collisionMan->addCollisionSprite(_ssButton); + insertPuzzleMouse(0x09A1251C, 20, 620); insertStaticSprite(0x02138002, 1200); insertStaticSprite(0x825E2827, 1200); } diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 50b4b24e65..b22da94048 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -626,7 +626,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(sceneInfo->bgFilename); _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); - insertMouse433(0x08B08180); + insertScreenMouse(0x08B08180); tempSprite = insertStaticSprite(0x1E086325, 1200); clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); @@ -734,7 +734,7 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); addEntity(_palette); - insertMouse433(0x08B04180); + insertScreenMouse(0x08B04180); _ssTrackShadowBackground = createSprite(0x12002035); addEntity(_ssTrackShadowBackground); @@ -894,7 +894,7 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3 _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); addEntity(_palette); - insertMouse433(sceneInfo->mouseCursorFilename); + insertScreenMouse(sceneInfo->mouseCursorFilename); _palStatus = 2; @@ -1015,7 +1015,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 while (staticSprites && *staticSprites) insertStaticSprite(*staticSprites++, 1100); - insertMouse433(sceneInfo->mouseCursorFilename); + insertScreenMouse(sceneInfo->mouseCursorFilename); if (sceneInfo->bgShadowFilename) { _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); @@ -1111,7 +1111,7 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - insertMouse433(0x08B8C180); + insertScreenMouse(0x08B8C180); _ssTrackShadowBackground = createSprite(0x18808B88); addEntity(_ssTrackShadowBackground); @@ -1224,7 +1224,7 @@ Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule) setBackground(0x0220C041); setPalette(0x0220C041); - insertMouse433(0x0C04502A); + insertScreenMouse(0x0C04502A); setRectList(0x004AE360); insertKlayman(108, 331); diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index e40890a882..25360ac9d5 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -468,9 +468,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _sprite1 = insertStaticSprite(0x100CA0A8, 1100); _sprite2 = insertStaticSprite(0x287C21A4, 1100); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); - insertMouse433(0x0066201C); + insertScreenMouse(0x0066201C); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) { setRectList(0x004B6CD0); setBackground(0x11E00684); @@ -479,9 +479,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(0x11E00684, 0, 256, 0); _sprite2 = insertStaticSprite(0x061601C8, 1100); _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); - insertMouse433(0x00680116); + insertScreenMouse(0x00680116); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else { setRectList(0x004B6CF0); setBackground(0x030006E6); @@ -490,9 +490,9 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(0x030006E6, 0, 256, 0); _sprite2 = insertStaticSprite(0x273801CE, 1100); _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); - insertMouse433(0x006E2038); + insertScreenMouse(0x006E2038); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } addEntity(_palette); @@ -537,7 +537,7 @@ Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2802::handleMessage); SetUpdateHandler(&Scene2802::update); - insertMouse435(0x008810A8, 20, 620); + insertPuzzleMouse(0x008810A8, 20, 620); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true)); _currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); // Need to go to the first frame first to load up the palette @@ -871,7 +871,7 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x412A423E); addEntity(_palette); - insertMouse433(0xA423A41A); + insertScreenMouse(0xA423A41A); if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { _asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100); @@ -1121,7 +1121,7 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh SetMessageHandler(&Scene2803Small::handleMessage); loadDataResource(0x81120132); - insertMouse433(0x00A05290); + insertScreenMouse(0x00A05290); insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); @@ -1743,7 +1743,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xA1D03005); setPalette(0xA1D03005); addEntity(_palette); - insertMouse435(0x03001A15, 20, 620); + insertPuzzleMouse(0x03001A15, 20, 620); _asCoil = insertSprite(); _asTarget = insertSprite(); } else { @@ -1751,7 +1751,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x01C01414); setPalette(0x01C01414); addEntity(_palette); - insertMouse435(0x01410014, 20, 620); + insertPuzzleMouse(0x01410014, 20, 620); ssBeamCoilBody = insertSprite(); _asCoil = insertSprite(this, ssBeamCoilBody); _asTarget = insertSprite(); @@ -1759,7 +1759,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) } _ssRedButton = insertSprite(this); - _vm->_collisionMan->addSprite(_ssRedButton); + _vm->_collisionMan->addCollisionSprite(_ssRedButton); for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) { AsScene2804CrystalWaves *asCrystalWaves = NULL; @@ -1767,7 +1767,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) asCrystalWaves = insertSprite(crystalIndex); _asCrystals[crystalIndex] = insertSprite(asCrystalWaves, crystalIndex); _ssCrystalButtons[crystalIndex] = insertSprite(this, _asCrystals[crystalIndex], crystalIndex); - _vm->_collisionMan->addSprite(_ssCrystalButtons[crystalIndex]); + _vm->_collisionMan->addCollisionSprite(_ssCrystalButtons[crystalIndex]); } } @@ -1889,7 +1889,7 @@ Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x08021E04); setPalette(0x08021E04); _palette->addPalette(0x8A6B1F91, 0, 65, 0); - insertMouse433(0x21E00088); + insertScreenMouse(0x21E00088); _sprite1 = insertStaticSprite(0x008261E7, 1100); _sprite2 = insertStaticSprite(0x020CE421, 1100); @@ -1982,7 +1982,7 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) _pointList = _dataResource.getPointArray(0x3606A422); - insertMouse433(0x22114C13); + insertScreenMouse(0x22114C13); setBackground(0xC1B22110); setPalette(0xC1B22110); @@ -2119,7 +2119,7 @@ Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x3E049A95); setPalette(0x3E049A95); - insertMouse435(0x49A913E8, 20, 620); + insertPuzzleMouse(0x49A913E8, 20, 620); } @@ -2438,19 +2438,19 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(kScene2808FileHashes1[which]); asHandle = insertSprite(this, which); - _vm->_collisionMan->addSprite(asHandle); + _vm->_collisionMan->addCollisionSprite(asHandle); _asFlow = insertSprite(this, which); insertSprite(which); for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) { SsScene2808Dispenser *ssDispenser = insertSprite(this, which, testTubeIndex); - _vm->_collisionMan->addSprite(ssDispenser); + _vm->_collisionMan->addCollisionSprite(ssDispenser); _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, ssDispenser); - _vm->_collisionMan->addSprite(_asTestTubes[testTubeIndex]); + _vm->_collisionMan->addCollisionSprite(_asTestTubes[testTubeIndex]); } - insertMouse433(kScene2808FileHashes2[which]); + insertScreenMouse(kScene2808FileHashes2[which]); } @@ -2570,7 +2570,7 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xB22116C5); setPalette(0xB22116C5); - insertMouse433(0x116C1B2A); + insertScreenMouse(0x116C1B2A); _sprite1 = insertStaticSprite(0x1FA2EB82, 1100); @@ -2711,7 +2711,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x26508804); setPalette(0x26508804); - insertMouse433(0x0880026D); + insertScreenMouse(0x0880026D); _sprite6 = insertStaticSprite(0x03615227, 1100); _sprite5 = insertStaticSprite(0xE059A224, 1100); @@ -2727,10 +2727,10 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KLAYMAN_SMALL)) { _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } else { _asTape = insertSprite(this, 0, 1100, 245, 429, 0x9148A011); - _vm->_collisionMan->addSprite(_asTape); + _vm->_collisionMan->addCollisionSprite(_asTape); } _sprite1 = insertStaticSprite(0x430001C4, 1200); @@ -2752,7 +2752,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE438); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeSprite(_asTape); + _vm->_collisionMan->removeCollisionSprite(_asTape); } else { insertKlayman(300, 424, _clipRects, 2); setMessageList(0x004AE438); @@ -2796,7 +2796,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE6D8); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeSprite(_asTape); + _vm->_collisionMan->removeCollisionSprite(_asTape); } else { insertKlaymanLadder(); if (getGlobalVar(V_LADDER_DOWN_ACTION)) { @@ -2819,7 +2819,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE428); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeSprite(_asTape); + _vm->_collisionMan->removeCollisionSprite(_asTape); } else { insertKlayman(450, 424, _clipRects, 2); setMessageList(0x004AE418); @@ -2838,7 +2838,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE410); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeSprite(_asTape); + _vm->_collisionMan->removeCollisionSprite(_asTape); } } @@ -3035,15 +3035,15 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(0x03600606, 0, 256, 0); _sprite1 = insertStaticSprite(0x0C06C860, 1100); - insertMouse433(0x0060203E); + insertScreenMouse(0x0060203E); if (getGlobalVar(V_KEY3_LOCATION) == 3) { _asKey = insertSprite(this, 2, 1100, 474, 437); - _vm->_collisionMan->addSprite(_asKey); + _vm->_collisionMan->addCollisionSprite(_asKey); } _ssTape = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); - _vm->_collisionMan->addSprite(_ssTape); + _vm->_collisionMan->addCollisionSprite(_ssTape); _asWinch = insertSprite(); _asTrapDoor = insertSprite(); @@ -3181,7 +3181,7 @@ Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) addBackground(_background); _background->getSurface()->getDrawRect().y = -10; setPalette(0xD542022E); - insertMouse435(0x0028D089, 20, 620); + insertPuzzleMouse(0x0028D089, 20, 620); _ssButton = insertStaticSprite(0x1A4D4120, 1100); _ssButton->setVisible(false); loadSound(2, 0x19044E72); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 4b8f28ea7e..551d6cbce7 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -365,7 +365,7 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) for (uint i = 0; i < 6; ++i) { if (i != 2 || !_isButton2Broken) { _ssLocationButtons[i] = insertSprite(this, _currLocationButtonNum, i); - _vm->_collisionMan->addSprite(_ssLocationButtons[i]); + _vm->_collisionMan->addCollisionSprite(_ssLocationButtons[i]); _ssLocationButtonLights[i] = insertSprite(_currLocationButtonNum, i); } } @@ -374,9 +374,9 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) insertSprite(_currLocationButtonNum); _ssBigButton = insertSprite(this, _currLocationButtonNum); - _vm->_collisionMan->addSprite(_ssBigButton); + _vm->_collisionMan->addCollisionSprite(_ssBigButton); - insertMouse435(kScene2901FileHashes2[_currLocationButtonNum], 20, 620); + insertPuzzleMouse(kScene2901FileHashes2[_currLocationButtonNum], 20, 620); SetUpdateHandler(&Scene2901::update); SetMessageHandler(&Scene2901::handleMessage); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 1fc1f5339b..6767aa56ea 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -712,9 +712,9 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009Symbol::handleMessage); _ssArrowPrev = _parentScene->insertSprite(this, _symbolPosition * 2 + 0); - _vm->_collisionMan->addSprite(_ssArrowPrev); + _vm->_collisionMan->addCollisionSprite(_ssArrowPrev); _ssArrowNext = _parentScene->insertSprite(this, _symbolPosition * 2 + 1); - _vm->_collisionMan->addSprite(_ssArrowNext); + _vm->_collisionMan->addCollisionSprite(_ssArrowNext); } uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -766,16 +766,16 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0xD000420C); setPalette(0xD000420C); - insertMouse435(0x04208D08, 20, 620); + insertPuzzleMouse(0x04208D08, 20, 620); _ssFireCannonButton = insertSprite(this); - _vm->_collisionMan->addSprite(_ssFireCannonButton); + _vm->_collisionMan->addCollisionSprite(_ssFireCannonButton); _asVerticalIndicator = insertSprite(this, _cannonTargetStatus); - _vm->_collisionMan->addSprite(_asVerticalIndicator); + _vm->_collisionMan->addCollisionSprite(_asVerticalIndicator); _asHorizontalIndicator = insertSprite(this, _cannonTargetStatus); - _vm->_collisionMan->addSprite(_asHorizontalIndicator); + _vm->_collisionMan->addCollisionSprite(_asHorizontalIndicator); if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) { _keepVideo = true; @@ -1235,7 +1235,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) for (int i = 0; i < 3; i++) { _asDeadBolts[i] = insertSprite(this, i, which == 1);//CHECKME _ssDeadBoltButtons[i] = insertSprite(this, i, initCountdown, which == 1);//CHECKME - _vm->_collisionMan->addSprite(_ssDeadBoltButtons[i]); + _vm->_collisionMan->addCollisionSprite(_ssDeadBoltButtons[i]); if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i])) initCountdown++; _boltUnlocking[i] = false; @@ -1243,7 +1243,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) } if (which == 0) { - insertMouse435(0x02622800, 20, 620); + insertPuzzleMouse(0x02622800, 20, 620); } loadSound(0, 0x68E25540); @@ -1460,13 +1460,13 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0xA4070114); addEntity(_palette); - insertMouse435(0x24A00929, 20, 620); + insertPuzzleMouse(0x24A00929, 20, 620); for (int symbolIndex = 0; symbolIndex < 12; symbolIndex++) _asSymbols[symbolIndex] = insertSprite(symbolIndex, true); _ssButton = insertSprite(this, true); - _vm->_collisionMan->addSprite(_ssButton); + _vm->_collisionMan->addCollisionSprite(_ssButton); } diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index c899a59408..3f0c92f233 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -42,7 +42,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _background = NULL; if (clearHitRects) { _vm->_collisionMan->clearHitRects(); - _vm->_collisionMan->clearSprites(); + _vm->_collisionMan->clearCollisionSprites(); } _vm->_screen->setFps(24); _vm->_screen->setSmackerDecoder(NULL); @@ -160,7 +160,7 @@ void Scene::setSpriteSurfacePriority(Sprite *sprite, int priority) { } void Scene::deleteSprite(Sprite **sprite) { - _vm->_collisionMan->removeSprite(*sprite); + _vm->_collisionMan->removeCollisionSprite(*sprite); removeSurface((*sprite)->getSurface()); removeEntity(*sprite); delete *sprite; @@ -194,7 +194,7 @@ Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { return addSprite(new StaticSprite(_vm, fileHash, surfacePriority)); } -void Scene::insertMouse433(uint32 fileHash, const NRect *mouseRect) { +void Scene::insertScreenMouse(uint32 fileHash, const NRect *mouseRect) { NRect rect(-1, -1, -1, -1); if (mouseRect) rect = *mouseRect; @@ -202,7 +202,7 @@ void Scene::insertMouse433(uint32 fileHash, const NRect *mouseRect) { addEntity(_mouseCursor); } -void Scene::insertMouse435(uint32 fileHash, int16 x1, int16 x2) { +void Scene::insertPuzzleMouse(uint32 fileHash, int16 x1, int16 x2) { _mouseCursor = new Mouse(_vm, fileHash, x1, x2); addEntity(_mouseCursor); } @@ -317,8 +317,8 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s } bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { - for (uint i = 0; i < _vm->_collisionMan->getSpriteCount(); i++) { - Sprite *sprite = _vm->_collisionMan->getSprite(i); + for (uint i = 0; i < _vm->_collisionMan->getCollisionSpritesCount(); i++) { + Sprite *sprite = _vm->_collisionMan->getCollisionSprite(i); if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) { return true; diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index b531796f40..a9e1674325 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -59,8 +59,8 @@ public: void setPalette(uint32 fileHash = 0); void setHitRects(uint32 id); Sprite *insertStaticSprite(uint32 fileHash, int surfacePriority); - void insertMouse433(uint32 fileHash, const NRect *mouseRect = NULL); - void insertMouse435(uint32 fileHash, int16 x1, int16 x2); + void insertScreenMouse(uint32 fileHash, const NRect *mouseRect = NULL); + void insertPuzzleMouse(uint32 fileHash, int16 x1, int16 x2); void insertNavigationMouse(uint32 fileHash, int type); void showMouse(bool visible); void changeMouseCursor(uint32 fileHash); -- cgit v1.2.3 From 9963ce41ea5f2c733873f16fd47be9b060dd2d16 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 10 Jan 2013 23:17:16 +0000 Subject: NEVERHOOD: Merge CollisionMan into Scene class --- engines/neverhood/collisionman.cpp | 93 ----------------------------- engines/neverhood/collisionman.h | 55 ------------------ engines/neverhood/diskplayerscene.cpp | 4 +- engines/neverhood/klayman.cpp | 106 +++++++++++++++++----------------- engines/neverhood/klayman.h | 89 ++++++++++++++-------------- engines/neverhood/menumodule.cpp | 16 ++--- engines/neverhood/module.h | 1 - engines/neverhood/module.mk | 1 - engines/neverhood/module1000.cpp | 12 ++-- engines/neverhood/module1100.cpp | 20 +++---- engines/neverhood/module1200.cpp | 12 ++-- engines/neverhood/module1300.cpp | 48 +++++++-------- engines/neverhood/module1400.cpp | 30 +++++----- engines/neverhood/module1500.cpp | 2 +- engines/neverhood/module1600.cpp | 16 ++--- engines/neverhood/module1700.cpp | 4 +- engines/neverhood/module1900.cpp | 12 ++-- engines/neverhood/module2000.cpp | 2 +- engines/neverhood/module2100.cpp | 6 +- engines/neverhood/module2200.cpp | 40 ++++++------- engines/neverhood/module2400.cpp | 16 ++--- engines/neverhood/module2500.cpp | 6 +- engines/neverhood/module2600.cpp | 4 +- engines/neverhood/module2700.cpp | 12 ++-- engines/neverhood/module2800.cpp | 58 +++++++++---------- engines/neverhood/module2900.cpp | 6 +- engines/neverhood/module3000.cpp | 20 +++---- engines/neverhood/navigationscene.cpp | 2 +- engines/neverhood/neverhood.cpp | 3 - engines/neverhood/neverhood.h | 2 - engines/neverhood/scene.cpp | 75 ++++++++++++++++++++---- engines/neverhood/scene.h | 14 ++++- engines/neverhood/smackerscene.cpp | 2 +- 33 files changed, 349 insertions(+), 440 deletions(-) delete mode 100644 engines/neverhood/collisionman.cpp delete mode 100644 engines/neverhood/collisionman.h diff --git a/engines/neverhood/collisionman.cpp b/engines/neverhood/collisionman.cpp deleted file mode 100644 index bafa1e3e82..0000000000 --- a/engines/neverhood/collisionman.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/collisionman.h" - -namespace Neverhood { - -static HitRect defaultHitRect = {NRect(), 0x5000}; - -CollisionMan::CollisionMan(NeverhoodEngine *vm) - : _vm(vm), _hitRects(NULL) { -} - -CollisionMan::~CollisionMan() { -} - -void CollisionMan::setHitRects(uint32 id) { - setHitRects(_vm->_staticData->getHitRectList(id)); -} - -void CollisionMan::setHitRects(HitRectList *hitRects) { - _hitRects = hitRects; -} - -void CollisionMan::clearHitRects() { - _hitRects = NULL; -} - -HitRect *CollisionMan::findHitRectAtPos(int16 x, int16 y) { - if (_hitRects) - for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) - if ((*it).rect.contains(x, y)) - return &(*it); - return &defaultHitRect; -} - -void CollisionMan::addCollisionSprite(Sprite *sprite) { - int index = 0, insertIndex = -1; - for (Common::Array::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) { - if ((*iter)->getPriority() > sprite->getPriority()) { - insertIndex = index; - break; - } - index++; - } - if (insertIndex >= 0) - _collisionSprites.insert_at(insertIndex, sprite); - else - _collisionSprites.push_back(sprite); -} - -void CollisionMan::removeCollisionSprite(Sprite *sprite) { - for (uint index = 0; index < _collisionSprites.size(); index++) { - if (_collisionSprites[index] == sprite) { - _collisionSprites.remove_at(index); - break; - } - } -} - -void CollisionMan::clearCollisionSprites() { - _collisionSprites.clear(); -} - -void CollisionMan::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) { - for (Common::Array::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) { - Sprite *collSprite = *iter; - if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) { - sprite->sendMessage(collSprite, messageNum, messageParam); - } - } -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/collisionman.h b/engines/neverhood/collisionman.h deleted file mode 100644 index 36bb2a56ad..0000000000 --- a/engines/neverhood/collisionman.h +++ /dev/null @@ -1,55 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_COLLISIONMAN_H -#define NEVERHOOD_COLLISIONMAN_H - -#include "neverhood/neverhood.h" -#include "neverhood/sprite.h" -#include "neverhood/staticdata.h" - -namespace Neverhood { - -class CollisionMan { -public: - CollisionMan(NeverhoodEngine *vm); - ~CollisionMan(); - void setHitRects(uint32 id); - void setHitRects(HitRectList *hitRects); - void clearHitRects(); - HitRect *findHitRectAtPos(int16 x, int16 y); - void addCollisionSprite(Sprite *sprite); - void removeCollisionSprite(Sprite *sprite); - void clearCollisionSprites(); - void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam); - uint getCollisionSpritesCount() const { return _collisionSprites.size(); } - Sprite *getCollisionSprite(uint index) const { return _collisionSprites[index]; } -protected: - NeverhoodEngine *_vm; - HitRectList *_hitRects; - Common::Array _collisionSprites; -}; - - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_COLLISIONMAN_H */ diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index fbef6006d5..907e027bc3 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -316,7 +316,7 @@ void DiskplayerSlot::stop() { } DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int paletteIndex) - : Scene(vm, parentModule, true), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0), + : Scene(vm, parentModule), _diskIndex(0), _appearCountdown(0), _tuneInCountdown(0), _hasAllDisks(false), _dropKey(false), _inputDisabled(true), _updateStatus(kUSStopped) { int availableDisksCount = 0; @@ -325,7 +325,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int setPalette(kDiskplayerPaletteFileHashes[paletteIndex]); _ssPlayButton = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(_ssPlayButton); + addCollisionSprite(_ssPlayButton); _asKey = insertSprite(); diff --git a/engines/neverhood/klayman.cpp b/engines/neverhood/klayman.cpp index 39d38c322a..0dfd29b75a 100644 --- a/engines/neverhood/klayman.cpp +++ b/engines/neverhood/klayman.cpp @@ -21,8 +21,8 @@ */ #include "neverhood/klayman.h" -#include "neverhood/collisionman.h" #include "neverhood/resourceman.h" +#include "neverhood/scene.h" #include "neverhood/staticdata.h" namespace Neverhood { @@ -60,7 +60,7 @@ static const KlaymanIdleTableItem klaymanIdleTable1002[] = { // Klayman -Klayman::Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) +Klayman::Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) : AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), @@ -744,12 +744,12 @@ void Klayman::suSneaking() { _deltaX = 0; if (_destX != _x) { - HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); _x += xdiff; if (_pathPoints) { walkAlongPathPoints(); } else { - HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); } else if (hitRectNext->type == 0x5003) { @@ -925,12 +925,12 @@ void Klayman::suWalkingTestExit() { (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) { sendMessage(this, 0x1019, 0); } else { - HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); _x += xdelta; if (_pathPoints) { walkAlongPathPoints(); } else { - HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); } else if (hitRectNext->type == 0x5003) { @@ -1408,12 +1408,12 @@ void Klayman::suLargeStep() { _deltaX = 0; if (_x != _destX) { - HitRect *hitRectPrev = _vm->_collisionMan->findHitRectAtPos(_x, _y); + HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); _x += xdiff; if (_pathPoints) { walkAlongPathPoints(); } else { - HitRect *hitRectNext = _vm->_collisionMan->findHitRectAtPos(_x, _y); + HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); if (hitRectNext->type == 0x5002) { _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); } else if (hitRectNext->type == 0x5003) { @@ -2868,13 +2868,13 @@ uint32 Klayman::hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity void Klayman::suFallDown() { AnimatedSprite::updateDeltaXY(); - HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); + HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; updateBounds(); sendMessage(this, 0x1019, 0); } - _vm->_collisionMan->checkCollision(this, 0xFFFF, 0x4810, 0); + _parentScene->checkCollision(this, 0xFFFF, 0x4810, 0); } void Klayman::stJumpToRingVenusFlyTrap() { @@ -3028,7 +3028,7 @@ void Klayman::evMoveVenusFlyTrapDone() { void Klayman::suFallSkipJump() { updateDeltaXY(); - HitRect *hitRect = _vm->_collisionMan->findHitRectAtPos(_x, _y + 10); + HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); if (hitRect->type == 0x5001) { _y = hitRect->rect.y1; updateBounds(); @@ -3348,7 +3348,7 @@ void Klayman::stPeekInsideBlink() { // KmScene1001 -KmScene1001::KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { } @@ -3426,7 +3426,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1002 -KmScene1002::KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { setKlaymanIdleTable1(); @@ -3548,7 +3548,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1004 -KmScene1004::KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { _dataResource.load(0x01900A04); @@ -3614,7 +3614,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1109::KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -3682,7 +3682,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1201 -KmScene1201::KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); @@ -3753,7 +3753,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1303::KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -3774,7 +3774,7 @@ uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1304::KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -3828,7 +3828,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1305::KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -3854,7 +3854,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1306::KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { } @@ -3980,7 +3980,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene1308::KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4056,7 +4056,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1401 -KmScene1401::KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4131,7 +4131,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1402 -KmScene1402::KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { SetFilterY(&Sprite::defFilterY); @@ -4176,7 +4176,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1403 -KmScene1403::KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); @@ -4236,7 +4236,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1404 -KmScene1404::KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4314,7 +4314,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene1608::KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { } @@ -4405,7 +4405,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1705 -KmScene1705::KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4498,7 +4498,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene1901::KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4537,7 +4537,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2001::KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4603,7 +4603,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2101::KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty @@ -4689,7 +4689,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2201::KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) +KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { _surface->setClipRects(clipRects, clipRectsCount); @@ -4763,7 +4763,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2203::KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -4835,7 +4835,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2205::KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -4883,7 +4883,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2206::KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { _walkResumeFrameIncr = 1; @@ -4989,7 +4989,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2207::KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5053,7 +5053,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2242::KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5123,7 +5123,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5177,7 +5177,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m return 0; } -KmScene2247::KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5231,7 +5231,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2401::KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5314,7 +5314,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2402::KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5386,7 +5386,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2403::KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5472,7 +5472,7 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2406::KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) +KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { _surface->setClipRects(clipRects, clipRectsCount); @@ -5565,7 +5565,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2501::KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5616,7 +5616,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2732::KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5633,7 +5633,7 @@ uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2801::KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5705,7 +5705,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2803::KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) +KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { _surface->setClipRects(clipRects, clipRectsCount); @@ -5769,7 +5769,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { _dataResource.load(0x81120132); @@ -5822,7 +5822,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam ¶ return 0; } -KmScene2805::KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -5879,7 +5879,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { return messageResult; } -KmScene2806::KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, +KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -5940,7 +5940,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2809::KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, +KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { @@ -6001,7 +6001,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } @@ -6051,7 +6051,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶ return 0; } -KmScene2810::KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) +KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) : Klayman(vm, parentScene, x, y, 1000, 1000) { _surface->setClipRects(clipRects, clipRectsCount); @@ -6146,7 +6146,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { return 0; } -KmScene2812::KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y) +KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klayman(vm, parentScene, x, y, 1000, 1000) { // Empty } diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h index 3b08108e3a..99fccebc0a 100644 --- a/engines/neverhood/klayman.h +++ b/engines/neverhood/klayman.h @@ -34,6 +34,7 @@ namespace Neverhood { // TODO Also the methods should probably rearranged and be grouped together more consistently class Klayman; +class Scene; const uint32 kKlaymanSpeedUpHash = 0x004A2148; @@ -48,7 +49,7 @@ struct KlaymanIdleTableItem { class Klayman : public AnimatedSprite { public: - Klayman(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); + Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); void update(); @@ -385,7 +386,7 @@ public: void stWaitLeverDown(); protected: - Entity *_parentScene; + Scene *_parentScene; Sprite *_attachedSprite; int _ladderStatus; bool _isWalking; @@ -456,14 +457,14 @@ protected: class KmScene1001 : public Klayman { public: - KmScene1001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1002 : public Klayman { public: - KmScene1002(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -471,140 +472,140 @@ protected: class KmScene1004 : public Klayman { public: - KmScene1004(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1109 : public Klayman { public: - KmScene1109(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1201 : public Klayman { public: - KmScene1201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1303 : public Klayman { public: - KmScene1303(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1304 : public Klayman { public: - KmScene1304(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1305 : public Klayman { public: - KmScene1305(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1306 : public Klayman { public: - KmScene1306(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1308 : public Klayman { public: - KmScene1308(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1401 : public Klayman { public: - KmScene1401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1402 : public Klayman { public: - KmScene1402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1403 : public Klayman { public: - KmScene1403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1404 : public Klayman { public: - KmScene1404(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1608 : public Klayman { public: - KmScene1608(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1705 : public Klayman { public: - KmScene1705(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene1901 : public Klayman { public: - KmScene1901(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2001 : public Klayman { public: - KmScene2001(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2101 : public Klayman { public: - KmScene2101(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2201 : public Klayman { public: - KmScene2201(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); + KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2203 : public Klayman { public: - KmScene2203(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2205 : public Klayman { public: - KmScene2205(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -612,7 +613,7 @@ protected: class KmScene2206 : public Klayman { public: - KmScene2206(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); ~KmScene2206(); protected: void xUpdate(); @@ -621,14 +622,14 @@ protected: class KmScene2207 : public Klayman { public: - KmScene2207(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2242 : public Klayman { public: - KmScene2242(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -636,7 +637,7 @@ protected: class KmHallOfRecords : public Klayman { public: - KmHallOfRecords(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -644,7 +645,7 @@ protected: class KmScene2247 : public Klayman { public: - KmScene2247(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: void xUpdate(); uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -652,77 +653,77 @@ protected: class KmScene2401 : public Klayman { public: - KmScene2401(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2402 : public Klayman { public: - KmScene2402(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2403 : public Klayman { public: - KmScene2403(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2406 : public Klayman { public: - KmScene2406(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); + KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2501 : public Klayman { public: - KmScene2501(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2732 : public Klayman { public: - KmScene2732(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2801 : public Klayman { public: - KmScene2801(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2803 : public Klayman { public: - KmScene2803(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); + KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2803Small : public Klayman { public: - KmScene2803Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2805 : public Klayman { public: - KmScene2805(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2806 : public Klayman { public: - KmScene2806(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -730,7 +731,7 @@ protected: class KmScene2809 : public Klayman { public: - KmScene2809(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -738,14 +739,14 @@ protected: class KmScene2810Small : public Klayman { public: - KmScene2810Small(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; class KmScene2810 : public Klayman { public: - KmScene2810(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y, + KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); @@ -753,7 +754,7 @@ protected: class KmScene2812 : public Klayman { public: - KmScene2812(NeverhoodEngine *vm, Entity *parentScene, int16 x, int16 y); + KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 521c0e0c72..a1489fc78b 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -212,7 +212,7 @@ uint32 MenuButton::handleMessage(int messageNum, const MessageParam ¶m, Enti } MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { static const uint32 kMenuButtonFileHashes[] = { 0x36C62120, @@ -251,7 +251,7 @@ MainMenu::MainMenu(NeverhoodEngine *vm, Module *parentModule) for (uint buttonIndex = 0; buttonIndex < 9; ++buttonIndex) { Sprite *menuButton = insertSprite(this, buttonIndex, kMenuButtonFileHashes[buttonIndex], kMenuButtonCollisionBounds[buttonIndex]); - _vm->_collisionMan->addCollisionSprite(menuButton); + addCollisionSprite(menuButton); } SetUpdateHandler(&Scene::update); @@ -298,7 +298,7 @@ static const uint32 kCreditsSceneFileHashes[] = { }; CreditsScene::CreditsScene(NeverhoodEngine *vm, Module *parentModule, bool canAbort) - : Scene(vm, parentModule, true), _canAbort(canAbort), _screenIndex(0), _ticksDuration(0), + : Scene(vm, parentModule), _canAbort(canAbort), _screenIndex(0), _ticksDuration(0), _countdown(216) { SetUpdateHandler(&CreditsScene::update); @@ -368,7 +368,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En } WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _currWidget(NULL) { + : Scene(vm, parentModule), _currWidget(NULL) { } NPoint WidgetScene::getMousePos() { @@ -466,7 +466,7 @@ TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 it void TextLabelWidget::addSprite() { _parentScene->addSprite(this); - _vm->_collisionMan->addCollisionSprite(this); + _parentScene->addCollisionSprite(this); } int16 TextLabelWidget::getWidth() { @@ -544,7 +544,7 @@ void TextEditWidget::addSprite() { createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); - _vm->_collisionMan->addCollisionSprite(this); + _parentScene->addCollisionSprite(this); _surface->setVisible(true); _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2, 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, @@ -708,7 +708,7 @@ void SavegameListBox::addSprite() { createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); - _vm->_collisionMan->addCollisionSprite(this); + _parentScene->addCollisionSprite(this); _surface->setVisible(true); buildItems(); _firstVisibleItem = 0; @@ -826,7 +826,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { Sprite *menuButton = insertSprite(this, buttonIndex, kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]); - _vm->_collisionMan->addCollisionSprite(menuButton); + addCollisionSprite(menuButton); } diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index 576a5a4b78..b91b9deff6 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -27,7 +27,6 @@ #include "neverhood/neverhood.h" #include "neverhood/background.h" -#include "neverhood/collisionman.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" #include "neverhood/mouse.h" diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index b3deb6f339..d9486d9347 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -3,7 +3,6 @@ MODULE := engines/neverhood MODULE_OBJS = \ background.o \ blbarchive.o \ - collisionman.o \ detection.o \ diskplayerscene.o \ entity.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 6c5cc28065..7033cafdc9 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -335,7 +335,7 @@ uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam &p } Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asDoor(NULL), _asWindow(NULL) { + : Scene(vm, parentModule), _asDoor(NULL), _asWindow(NULL) { Sprite *tempSprite; @@ -1156,7 +1156,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa } Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isKlaymanFloor(false), _isClimbingLadder(false) { + : Scene(vm, parentModule), _isKlaymanFloor(false), _isClimbingLadder(false) { NRect tempClipRect; Sprite *tempSprite; @@ -1243,7 +1243,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); _ssPressButton = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); _asVenusFlyTrap = insertSprite(this, _klayman, false); - _vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap); + addCollisionSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); @@ -1389,7 +1389,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit // StaticScene StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&StaticScene::handleMessage); @@ -1442,7 +1442,7 @@ uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam &pa } Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _paletteAreaStatus(-1) { + : Scene(vm, parentModule), _paletteAreaStatus(-1) { Sprite *tempSprite; @@ -1542,7 +1542,7 @@ void Scene1004::updatePaletteArea() { // Scene1005 Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene1005::handleMessage); diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 4b8a8ba75f..c39845e44b 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -429,7 +429,7 @@ uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam & } Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false), + : Scene(vm, parentModule), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false), _isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) { Sprite *ssOpenButton; @@ -444,7 +444,7 @@ Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule) _asTeddyBear = insertSprite(this); ssOpenButton = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(ssOpenButton); + addCollisionSprite(ssOpenButton); insertPuzzleMouse(0x10006208, 20, 620); loadSound(0, 0x48442057); @@ -555,19 +555,19 @@ void Scene1105::createObjects() { _ssSymbolDice[2] = insertSprite(2, 485, 304); _ssSymbol1UpButton = insertSprite(this, 0x08002860, NRect(146, 362, 192, 403)); - _vm->_collisionMan->addCollisionSprite(_ssSymbol1UpButton); + addCollisionSprite(_ssSymbol1UpButton); _ssSymbol1DownButton = insertSprite(this, 0x42012460, NRect(147, 404, 191, 442)); - _vm->_collisionMan->addCollisionSprite(_ssSymbol1DownButton); + addCollisionSprite(_ssSymbol1DownButton); _ssSymbol2UpButton = insertSprite(this, 0x100030A0, NRect(308, 361, 355, 402)); - _vm->_collisionMan->addCollisionSprite(_ssSymbol2UpButton); + addCollisionSprite(_ssSymbol2UpButton); _ssSymbol2DownButton = insertSprite(this, 0x840228A0, NRect(306, 406, 352, 445)); - _vm->_collisionMan->addCollisionSprite(_ssSymbol2DownButton); + addCollisionSprite(_ssSymbol2DownButton); _ssSymbol3UpButton = insertSprite(this, 0x20000120, NRect(476, 358, 509, 394)); - _vm->_collisionMan->addCollisionSprite(_ssSymbol3UpButton); + addCollisionSprite(_ssSymbol3UpButton); _ssSymbol3DownButton = insertSprite(this, 0x08043121, NRect(463, 401, 508, 438)); - _vm->_collisionMan->addCollisionSprite(_ssSymbol3DownButton); + addCollisionSprite(_ssSymbol3DownButton); _ssActionButton = insertSprite(this, 0x8248AD35, NRect(280, 170, 354, 245)); - _vm->_collisionMan->addCollisionSprite(_ssActionButton); + addCollisionSprite(_ssActionButton); _isPanelOpen = true; @@ -646,7 +646,7 @@ void Scene1105::update() { } Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, which) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene1109::handleMessage); diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 11e29fda7a..844d07f771 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -653,7 +653,7 @@ void AsScene1201LeftDoor::stCloseDoor() { } Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL), + : Scene(vm, parentModule), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL), _asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { int16 topY1, topY2, topY3, topY4; @@ -674,7 +674,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) insertScreenMouse(0x9A2C0409); _asTape = insertSprite(this, 3, 1100, 243, 340, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); tempSprite = insertStaticSprite(0x03C82530, 100); topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; @@ -752,7 +752,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) _asTntMan = insertSprite(this, _asTntManRope, which == 1); _asTntMan->setClipRect(x1, 0, x2, 480); _asTntMan->setRepl(64, 0); - _vm->_collisionMan->addCollisionSprite(_asTntMan); + addCollisionSprite(_asTntMan); tempSprite = insertSprite(_asTntMan); tempSprite->setClipRect(x1, 0, x2, 480); } @@ -826,7 +826,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_MATCH_STATUS) < 3) { _asMatch = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(_asMatch); + addCollisionSprite(_asMatch); } if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { @@ -998,7 +998,7 @@ void AsScene1202TntItem::stChangePositionDone() { } Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _paletteResource(vm), + : Scene(vm, parentModule), _paletteResource(vm), _soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) { SetMessageHandler(&Scene1202::handleMessage); @@ -1015,7 +1015,7 @@ Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) for (int tntIndex = 0; tntIndex < 18; tntIndex++) { _asTntItems[tntIndex] = insertSprite(this, tntIndex); - _vm->_collisionMan->addCollisionSprite(_asTntItems[tntIndex]); + addCollisionSprite(_asTntItems[tntIndex]); } insertStaticSprite(0x8E8419C1, 1100); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 989ada535d..a0a1167748 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -419,7 +419,7 @@ void SsScene1302Fence::suMoveUp() { } Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene1302::handleMessage); @@ -456,7 +456,7 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); _asVenusFlyTrap = insertSprite(this, _klayman, true); - _vm->_collisionMan->addCollisionSprite(_asVenusFlyTrap); + addCollisionSprite(_asVenusFlyTrap); sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); @@ -630,7 +630,7 @@ void AsScene1303Balloon::stPopBalloon() { } Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene1303::handleMessage); @@ -641,7 +641,7 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) if (!getGlobalVar(V_BALLOON_POPPED)) { _asBalloon = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(_asBalloon); + addCollisionSprite(_asBalloon); } _sprite1 = insertStaticSprite(0xA014216B, 1100); @@ -692,7 +692,7 @@ uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶ } Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asNeedle(NULL) { + : Scene(vm, parentModule), _asNeedle(NULL) { SetMessageHandler(&Scene1304::handleMessage); @@ -703,14 +703,14 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_BALLOON_POPPED)) { _asKey = insertSprite(this, 0, 1100, 278, 347); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); } else { _asKey = insertSprite(0x80106018, 100, 279, 48); } if (!getGlobalVar(V_HAS_NEEDLE)) { _asNeedle = insertSprite(this, 1100, 278, 347); - _vm->_collisionMan->addCollisionSprite(_asNeedle); + addCollisionSprite(_asNeedle); } _sprite1 = insertStaticSprite(0x0562E621, 1100); @@ -756,7 +756,7 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit } Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene1305::handleMessage); @@ -867,7 +867,7 @@ void AsScene1306Elevator::cbGoingDownEvent() { } Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 4); @@ -880,7 +880,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KEY3_LOCATION) == 4) { _asKey = insertSprite(this, 2, 1100, 435, 445); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); } _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); @@ -897,14 +897,14 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) insertKlayman(380, 440); setMessageList(0x004AFAD0); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else if (which == 1) { // Klaymen teleporting in insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFAF0); sendMessage(this, 0x2000, 1); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else if (which == 2) { // Klaymen returning from diskplayer if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { @@ -915,27 +915,27 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) } setMessageList(0x004AFBC8); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else if (which == 3) { // Klaymen returning from window insertKlayman(534, 440); setMessageList(0x004AFC30); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else if (which == 4) { // Klaymen teleporting out insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFC38); sendMessage(this, 0x2000, 1); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else if (which == 5) { // Klaymen returning from teleporter insertKlayman(136, 440); sendMessage(_klayman, 0x2000, 1); setMessageList(0x004AFB00); sendMessage(this, 0x2000, 1); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else { // Klaymen coming up in elevator insertKlayman(286, 408); @@ -1007,7 +1007,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit setSurfacePriority(_asElevatorDoor->getSurface(), 90); setSurfacePriority(_sprite1->getSurface(), 80); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); break; } return 0; @@ -1033,7 +1033,7 @@ uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, setSurfacePriority(_asElevatorDoor->getSurface(), 90); setSurfacePriority(_sprite1->getSurface(), 80); sendMessage(this, 0x2000, 0); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); break; } return 0; @@ -1222,7 +1222,7 @@ void AsScene1307Key::stInsert() { } Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _countdown(0), _asCurrKey(NULL), + : Scene(vm, parentModule), _countdown(0), _asCurrKey(NULL), _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { Sprite *tempSprite; @@ -1260,7 +1260,7 @@ Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) { _asKeys[keyIndex] = insertSprite(this, keyIndex, _clipRects); - _vm->_collisionMan->addCollisionSprite(_asKeys[keyIndex]); + addCollisionSprite(_asKeys[keyIndex]); } else { _asKeys[keyIndex] = NULL; } @@ -1519,7 +1519,7 @@ uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam ¶m } Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isProjecting(false), _asProjector(NULL) { + : Scene(vm, parentModule), _isProjecting(false), _asProjector(NULL) { _vm->gameModule()->initKeySlotsPuzzle(); @@ -1530,7 +1530,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) insertScreenMouse(0x24206418); _asTape = insertSprite(this, 17, 1100, 502, 445, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); if (getGlobalVar(V_MOUSE_SUCKED_IN)) { insertSprite(); @@ -1603,7 +1603,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addCollisionSprite(_asProjector); + addCollisionSprite(_asProjector); _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _asProjector->setRepl(64, 0); } @@ -1697,7 +1697,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit } Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene1317::handleMessage); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 521981e995..5febe8f08d 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -627,7 +627,7 @@ void AsCommonProjector::stStartSuckedIn() { } Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), + : Scene(vm, parentModule), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), _asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { @@ -678,7 +678,7 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) { _asProjector = insertSprite(this, _klayman, _asPipe); - _vm->_collisionMan->addCollisionSprite(_asProjector); + addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); @@ -840,7 +840,7 @@ void AsScene1402PuzzleBox::stMoveDownSolvedDone() { } Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) { + : Scene(vm, parentModule), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) { SetMessageHandler(&Scene1402::handleMessage); @@ -898,7 +898,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addCollisionSprite(_asProjector); + addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); @@ -1220,7 +1220,7 @@ void AsScene1407Mouse::stArriveAtHole() { } Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { + : Scene(vm, parentModule), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { SetMessageHandler(&Scene1407::handleMessage); SetUpdateHandler(&Scene1407::update); @@ -1278,7 +1278,7 @@ uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1403 Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asProjector(NULL), _isProjecting(false) { + : Scene(vm, parentModule), _asProjector(NULL), _isProjecting(false) { SetMessageHandler(&Scene1403::handleMessage); @@ -1292,10 +1292,10 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x04442520, 995); _sprite3 = insertStaticSprite(0x08742271, 995); _asTape1 = insertSprite(this, 12, 1100, 201, 468, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape1); + addCollisionSprite(_asTape1); _asTape1->setRepl(64, 0); _asTape2 = insertSprite(this, 16, 1100, 498, 468, 0x9048A093); - _vm->_collisionMan->addCollisionSprite(_asTape2); + addCollisionSprite(_asTape2); _asTape2->setRepl(64, 0); if (which < 0) { @@ -1311,7 +1311,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addCollisionSprite(_asProjector); + addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() + 100); @@ -1382,7 +1382,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit // Scene1404 Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asProjector(NULL), _asKey(NULL) { + : Scene(vm, parentModule), _asProjector(NULL), _asKey(NULL) { if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 5); @@ -1397,12 +1397,12 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KEY3_LOCATION) == 5) { _asKey = insertSprite(this, 2, 1100, 267, 411); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); } _sprite1 = insertStaticSprite(0x1900A1F8, 1100); _asTape = insertSprite(this, 14, 1100, 281, 411, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); if (which < 0) { // Restoring game @@ -1429,7 +1429,7 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) { _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); - _vm->_collisionMan->addCollisionSprite(_asProjector); + addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { sendEntityMessage(_klayman, 0x1014, _asProjector); _klayman->setX(_asProjector->getX() - 100); @@ -1552,7 +1552,7 @@ void AsScene1405Tile::hide() { } Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { + : Scene(vm, parentModule), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { _vm->gameModule()->initMemoryPuzzle(); @@ -1565,7 +1565,7 @@ Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule) for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) { _tiles[tileIndex] = insertSprite(this, tileIndex); - _vm->_collisionMan->addCollisionSprite(_tiles[tileIndex]); + addCollisionSprite(_tiles[tileIndex]); if (getSubVar(VA_IS_TILE_MATCH, tileIndex)) _tilesLeft--; } diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp index 328bda39a4..c49e968dca 100644 --- a/engines/neverhood/module1500.cpp +++ b/engines/neverhood/module1500.cpp @@ -82,7 +82,7 @@ void Module1500::updateScene() { // Scene1501 Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) - : Scene(vm, parentModule, true), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) { + : Scene(vm, parentModule), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) { SetUpdateHandler(&Scene1501::update); SetMessageHandler(&Scene1501::handleMessage); diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index b40d580c4e..a2f06e1197 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -989,14 +989,14 @@ void AsCommonCarConnector::update() { } Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _asCar(NULL), _countdown1(0) { + : Scene(vm, parentModule), _asCar(NULL), _countdown1(0) { setGlobalVar(V_CAR_DELTA_X, 1); SetMessageHandler(&Scene1608::hmLowerFloor); _asKey = insertSprite(this, 1, 1100, 198, 220); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); if (which < 0) { // Restoring game @@ -1014,7 +1014,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); insertScreenMouse(0x80E05108); @@ -1031,7 +1031,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); insertScreenMouse(0x80E05108); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); @@ -1072,7 +1072,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); insertSprite(_asCar)->setClipRect(_clipRect1); _klaymanInCar = false; _carClipFlag = false; @@ -1114,7 +1114,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - // ... _vm->_collisionMan->addCollisionSprite(_asTape); + // ... addCollisionSprite(_asTape); insertSprite(_asCar)->setClipRect(_clipRect1); _klaymanInCar = true; _carClipFlag = true; @@ -1303,7 +1303,7 @@ void Scene1608::updateKlaymanCliprect() { } Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { + : Scene(vm, parentModule), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { _vm->gameModule()->initCodeSymbolsPuzzle(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); @@ -1319,7 +1319,7 @@ Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) _asSymbols[symbolPosition] = insertSprite(symbolPosition, false); _ssButton = insertSprite(this, true); - _vm->_collisionMan->addCollisionSprite(_ssButton); + addCollisionSprite(_ssButton); loadSound(0, 0x68E25540); } diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index cf2fe63984..39bc49ba45 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -177,7 +177,7 @@ uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam ¶m, } Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _paletteArea(1) { + : Scene(vm, parentModule), _paletteArea(1) { Sprite *tempSprite; @@ -200,7 +200,7 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2); _sprite = insertStaticSprite(0x31313A22, 1100); _ssTape = insertSprite(this, 15, 1100, 238, 439, 0x02363852); - _vm->_collisionMan->addCollisionSprite(_ssTape); + addCollisionSprite(_ssTape); if (which < 0) { // Restoring game diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 2557121c41..629cfd9b39 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -87,7 +87,7 @@ void Module1900::updateScene() { // Scene1901 Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; @@ -358,8 +358,8 @@ void AsScene1907Symbol::stFallOffHitGround() { playSound(1); sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); Entity::_priority = 1000 - _newPositionIndex; - _vm->_collisionMan->removeCollisionSprite(this); - _vm->_collisionMan->addCollisionSprite(this); + _parentScene->removeCollisionSprite(this); + _parentScene->addCollisionSprite(this); SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround); NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); _newStickFrameIndex = 0; @@ -516,7 +516,7 @@ void AsScene1907WaterHint::hide() { } Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _currMovingSymbolIndex(0), _pluggedInCount(0), + : Scene(vm, parentModule), _currMovingSymbolIndex(0), _pluggedInCount(0), _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { setBackground(0x20628E05); @@ -527,11 +527,11 @@ Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule) for (int i = 0; i < 9; i++) { _asSymbols[i] = insertSprite(this, i, getRandomPositionIndex()); - _vm->_collisionMan->addCollisionSprite(_asSymbols[i]); + addCollisionSprite(_asSymbols[i]); } _ssUpDownButton = insertSprite(this, _asSymbols[8]); - _vm->_collisionMan->addCollisionSprite(_ssUpDownButton); + addCollisionSprite(_ssUpDownButton); _asWaterHint = insertSprite(); diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index 643bec4d49..f08b620030 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -95,7 +95,7 @@ void Module2000::updateScene() { // Scene2001 Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 12b10b43e2..423f93c325 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -194,7 +194,7 @@ uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam &pa } Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; @@ -209,9 +209,9 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x78492010, 1100); _ssFloorButton = insertSprite(this, 0x72427010, 0x32423010, 200, 0); _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape1); + addCollisionSprite(_asTape1); _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape2); + addCollisionSprite(_asTape2); if (which < 0) { insertKlayman(380, 438); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index dc77a5ea08..889af37852 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -535,7 +535,7 @@ SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positio } Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isSoundPlaying(false) { + : Scene(vm, parentModule), _isSoundPlaying(false) { Sprite *tempSprite; @@ -551,7 +551,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) insertScreenMouse(0x0820C408); _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) @@ -870,7 +870,7 @@ void SsScene2202PuzzleCube::stopMoving() { } Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isSolved(false), _leaveScene(false), _isCubeMoving(false), + : Scene(vm, parentModule), _isSolved(false), _leaveScene(false), _isCubeMoving(false), _ssMovingCube(NULL), _ssDoneMovingCube(NULL) { _vm->gameModule()->initCubeSymbolsPuzzle(); @@ -887,7 +887,7 @@ Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition); if (cubeSymbol >= 0) { Sprite *puzzleCubeSprite = insertSprite(this, cubePosition, cubeSymbol); - _vm->_collisionMan->addCollisionSprite(puzzleCubeSprite); + addCollisionSprite(puzzleCubeSprite); } } @@ -1085,7 +1085,7 @@ void AsScene2203Door::closeDoor() { } Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 1); @@ -1100,11 +1100,11 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KEY3_LOCATION) == 1) { _asKey = insertSprite(this, 2, 1100, 282, 432); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); } _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _asLeftDoor = insertSprite(this, 0); _asRightDoor = insertSprite(this, 1); _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); @@ -1113,8 +1113,8 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) _rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480); sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); - _vm->_collisionMan->addCollisionSprite(_asLeftDoor); - _vm->_collisionMan->addCollisionSprite(_asRightDoor); + addCollisionSprite(_asLeftDoor); + addCollisionSprite(_asRightDoor); if (which < 0) { // Restoring game @@ -1215,7 +1215,7 @@ uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam &p } Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene2205::handleMessage); SetUpdateHandler(&Scene2205::update); @@ -1451,7 +1451,7 @@ uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam &pa } Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { uint32 fileHash; @@ -1491,7 +1491,7 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(fileHash, 0, 256, 0); if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x0263D144, 0, 65, 0); - _vm->_collisionMan->addCollisionSprite(_ssTestTube); + addCollisionSprite(_ssTestTube); if (which < 0) { // Restoring game @@ -1926,7 +1926,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i } Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { + : Scene(vm, parentModule), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { _vm->gameModule()->initCannonSymbolsPuzzle(); @@ -1949,9 +1949,9 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); _asTape = insertSprite(this, 4, 1100, 277, 428, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _asLever = insertSprite(this, 527, 333, 0); - _vm->_collisionMan->addCollisionSprite(_asLever); + addCollisionSprite(_asLever); _asWallRobotAnimation = insertSprite(this); _asWallCannonAnimation = insertSprite(); _asWallRobotAnimation->setVisible(false); @@ -2110,7 +2110,7 @@ static const uint32 kScene2208FileHashes2[] = { }; Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _textResource(vm) { + : Scene(vm, parentModule), _textResource(vm) { SpriteResource spriteResource(_vm); const char *textStart, *textEnd; @@ -2288,7 +2288,7 @@ static const uint32 kScene2242MessageListIds1[] = { }; Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isKlaymanInLight(false) { + : Scene(vm, parentModule), _isKlaymanInLight(false) { SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); @@ -2309,7 +2309,7 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) } _asTape = insertSprite(this, 10, 1100, 464, 435, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); if (which < 0) { // Restoring game @@ -2407,7 +2407,7 @@ static const uint32 kHallOfRecordsSceneMessageListIds1[] = { }; HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { _hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId); @@ -2498,7 +2498,7 @@ static const uint32 kScene2247MessageListIds1[] = { }; Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene2247::handleMessage); SetUpdateHandler(&Scene::update); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index ed9e23155d..6c007c47d6 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -368,7 +368,7 @@ void AsScene2401Door::stDoorOpenFinished() { } Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _unkFlag(false), + : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _unkFlag(false), _soundToggle(false), _asWaterSpitIndex(0) { _vm->gameModule()->initWaterPipesPuzzle(); @@ -684,7 +684,7 @@ uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity * } Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _soundToggle(false) { + : Scene(vm, parentModule), _countdown(0), _soundToggle(false) { Sprite *tempSprite; @@ -696,7 +696,7 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x81660220); insertScreenMouse(0x6022481E); _asTape = insertSprite(this, 9, 1100, 286, 409, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _ssButton = insertSprite(this, 0x15288120, 100, 0); if (which < 0) { @@ -786,7 +786,7 @@ void Scene2402::playPipeSound(uint32 fileHash) { } Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite1, *tempSprite2, *tempSprite3; @@ -796,7 +796,7 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addPalette(0x414364B0, 0, 65, 0); insertScreenMouse(0x506080C8); _asTape = insertSprite(this, 2, 1100, 480, 454, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); _asLightCord = insertSprite(this, 0xA1095A10, 0x836D3813, 368, 200); _asLightCord->setClipRect(0, 25, 640, 480); @@ -879,7 +879,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit } Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite1, *tempSprite2; @@ -893,11 +893,11 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KEY3_LOCATION) == 2) { _asKey = insertSprite(this, 2, 1100, 560, 409); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); } _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); tempSprite2 = insertStaticSprite(0x19625293, 1100); _clipRects[0].x1 = 0; _clipRects[0].y1 = 0; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 3fc508a4a6..4aefbfb8a9 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -220,7 +220,7 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con } Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { _sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628); _sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C); @@ -535,14 +535,14 @@ uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam ¶ } Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *ssButton; setBackground(0x90791B80); setPalette(0x90791B80); ssButton = insertSprite(); - _vm->_collisionMan->addCollisionSprite(ssButton); + addCollisionSprite(ssButton); insertPuzzleMouse(0x91B8490F, 20, 620); SetMessageHandler(&Scene2504::handleMessage); SetUpdateHandler(&Scene::update); diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp index 91132c030a..04a91475a1 100644 --- a/engines/neverhood/module2600.cpp +++ b/engines/neverhood/module2600.cpp @@ -308,7 +308,7 @@ uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m } Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isBusy(false) { + : Scene(vm, parentModule), _isBusy(false) { SetUpdateHandler(&Scene::update); SetMessageHandler(&Scene2609::handleMessage); @@ -317,7 +317,7 @@ Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x51409A16); _asWater = insertSprite(); _ssButton = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(_ssButton); + addCollisionSprite(_ssButton); insertPuzzleMouse(0x09A1251C, 20, 620); insertStaticSprite(0x02138002, 1200); insertStaticSprite(0x825E2827, 1200); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index b22da94048..d4f46ea2ca 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -614,7 +614,7 @@ void AsCommonCarTrackShadow::update() { } Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; @@ -720,7 +720,7 @@ static const uint32 kScene2702Infos[2][3] = { Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _isInLight(true), _newTrackIndex(-1), _count(3) { + : Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1), _count(3) { for (int i = 0; i < 2; i++) for (int j = 0; j < 3; j++) @@ -882,7 +882,7 @@ void Scene2702::changeTrack() { } Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); @@ -996,7 +996,7 @@ uint32 Scene2703::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); @@ -1101,7 +1101,7 @@ static const struct { const char *pointListName; int which1, which2; } kSceneInf }; Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _newTrackIndex(-1) { + : Scene(vm, parentModule), _newTrackIndex(-1) { SetMessageHandler(&Scene2706::handleMessage); @@ -1218,7 +1218,7 @@ void Scene2706::changeTrack() { } Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 25360ac9d5..7c7c097696 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -426,7 +426,7 @@ void Module2800::updateMusic(bool halfVolume) { } Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *_sprite1; Sprite *_sprite2; @@ -470,7 +470,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); insertScreenMouse(0x0066201C); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) { setRectList(0x004B6CD0); setBackground(0x11E00684); @@ -481,7 +481,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); insertScreenMouse(0x00680116); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else { setRectList(0x004B6CF0); setBackground(0x030006E6); @@ -492,7 +492,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); insertScreenMouse(0x006E2038); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } addEntity(_palette); @@ -533,7 +533,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit } Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _currTuneStatus(0), _countdown1(0), _countdown2(0) { + : Scene(vm, parentModule), _currTuneStatus(0), _countdown1(0), _countdown2(0) { SetMessageHandler(&Scene2802::handleMessage); SetUpdateHandler(&Scene2802::update); @@ -841,7 +841,7 @@ void AsScene2803Rope::stHide() { } Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _paletteArea(0) { + : Scene(vm, parentModule), _paletteArea(0) { static const uint32 kScene2803FileHashes1[] = { 0, @@ -1108,7 +1108,7 @@ void Scene2803::updatePaletteArea() { } Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _paletteArea(0) { + : Scene(vm, parentModule), _paletteArea(0) { static const uint32 kScene2803SmallFileHashes1[] = { 0, 0x081000F1, 0x08100171, 0x08100271 @@ -1731,7 +1731,7 @@ uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam & } Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown1(0), _countdown2(0), _countdown3(0), + : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _countdown3(0), _beamStatus(0), _isSolved(false), _isWorking(false) { initCrystalColors(); @@ -1759,7 +1759,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) } _ssRedButton = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(_ssRedButton); + addCollisionSprite(_ssRedButton); for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) { AsScene2804CrystalWaves *asCrystalWaves = NULL; @@ -1767,7 +1767,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) asCrystalWaves = insertSprite(crystalIndex); _asCrystals[crystalIndex] = insertSprite(asCrystalWaves, crystalIndex); _ssCrystalButtons[crystalIndex] = insertSprite(this, _asCrystals[crystalIndex], crystalIndex); - _vm->_collisionMan->addCollisionSprite(_ssCrystalButtons[crystalIndex]); + addCollisionSprite(_ssCrystalButtons[crystalIndex]); } } @@ -1882,7 +1882,7 @@ void Scene2804::initCrystalColors() { } Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene2805::handleMessage); @@ -1968,7 +1968,7 @@ uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam ¶m, } Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; @@ -2089,7 +2089,7 @@ void Scene2806::findClosestPoint() { } Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { SetMessageHandler(&Scene2807::handleMessage); @@ -2422,7 +2422,7 @@ void AsScene2808LightEffect::update() { } Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) { + : Scene(vm, parentModule), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) { Sprite *asHandle; @@ -2438,16 +2438,16 @@ Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(kScene2808FileHashes1[which]); asHandle = insertSprite(this, which); - _vm->_collisionMan->addCollisionSprite(asHandle); + addCollisionSprite(asHandle); _asFlow = insertSprite(this, which); insertSprite(which); for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) { SsScene2808Dispenser *ssDispenser = insertSprite(this, which, testTubeIndex); - _vm->_collisionMan->addCollisionSprite(ssDispenser); + addCollisionSprite(ssDispenser); _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, ssDispenser); - _vm->_collisionMan->addCollisionSprite(_asTestTubes[testTubeIndex]); + addCollisionSprite(_asTestTubes[testTubeIndex]); } insertScreenMouse(kScene2808FileHashes2[which]); @@ -2556,7 +2556,7 @@ uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam ¶m, } Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; @@ -2703,7 +2703,7 @@ uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam ¶m, } Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true) { + : Scene(vm, parentModule) { Sprite *tempSprite; @@ -2727,10 +2727,10 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KLAYMAN_SMALL)) { _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } else { _asTape = insertSprite(this, 0, 1100, 245, 429, 0x9148A011); - _vm->_collisionMan->addCollisionSprite(_asTape); + addCollisionSprite(_asTape); } _sprite1 = insertStaticSprite(0x430001C4, 1200); @@ -2752,7 +2752,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE438); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeCollisionSprite(_asTape); + removeCollisionSprite(_asTape); } else { insertKlayman(300, 424, _clipRects, 2); setMessageList(0x004AE438); @@ -2796,7 +2796,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE6D8); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeCollisionSprite(_asTape); + removeCollisionSprite(_asTape); } else { insertKlaymanLadder(); if (getGlobalVar(V_LADDER_DOWN_ACTION)) { @@ -2819,7 +2819,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE428); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeCollisionSprite(_asTape); + removeCollisionSprite(_asTape); } else { insertKlayman(450, 424, _clipRects, 2); setMessageList(0x004AE418); @@ -2838,7 +2838,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) setMessageList(0x004AE410); setRectList(0x004AE810); _isRopingDown = false; - _vm->_collisionMan->removeCollisionSprite(_asTape); + removeCollisionSprite(_asTape); } } @@ -3019,7 +3019,7 @@ uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam &pa } Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _paletteArea(0) { + : Scene(vm, parentModule), _paletteArea(0) { if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) setGlobalVar(V_KEY3_LOCATION, 3); @@ -3039,11 +3039,11 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_KEY3_LOCATION) == 3) { _asKey = insertSprite(this, 2, 1100, 474, 437); - _vm->_collisionMan->addCollisionSprite(_asKey); + addCollisionSprite(_asKey); } _ssTape = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); - _vm->_collisionMan->addCollisionSprite(_ssTape); + addCollisionSprite(_ssTape); _asWinch = insertSprite(); _asTrapDoor = insertSprite(); @@ -3173,7 +3173,7 @@ void Scene2812::updatePaletteArea(bool instantly) { } Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _scrollIndex(0) { + : Scene(vm, parentModule), _countdown(0), _scrollIndex(0) { SetMessageHandler(&Scene2822::handleMessage); SetUpdateHandler(&Scene2822::update); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index 551d6cbce7..b5a6ab2c88 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -347,7 +347,7 @@ uint32 SsScene2901BigButton::handleMessage(int messageNum, const MessageParam &p } Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _currLocationButtonNum(which), _selectedButtonNum(which), + : Scene(vm, parentModule), _currLocationButtonNum(which), _selectedButtonNum(which), _currWhirlButtonNum(0), _prevWhirlButtonNum(0), _countdown1(1), _skipCountdown(0), _blinkOn(0) { _isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0; @@ -365,7 +365,7 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) for (uint i = 0; i < 6; ++i) { if (i != 2 || !_isButton2Broken) { _ssLocationButtons[i] = insertSprite(this, _currLocationButtonNum, i); - _vm->_collisionMan->addCollisionSprite(_ssLocationButtons[i]); + addCollisionSprite(_ssLocationButtons[i]); _ssLocationButtonLights[i] = insertSprite(_currLocationButtonNum, i); } } @@ -374,7 +374,7 @@ Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) insertSprite(_currLocationButtonNum); _ssBigButton = insertSprite(this, _currLocationButtonNum); - _vm->_collisionMan->addCollisionSprite(_ssBigButton); + addCollisionSprite(_ssBigButton); insertPuzzleMouse(kScene2901FileHashes2[_currLocationButtonNum], 20, 620); diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 6767aa56ea..6bf95e3c9a 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -712,9 +712,9 @@ AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene3009Symbol::handleMessage); _ssArrowPrev = _parentScene->insertSprite(this, _symbolPosition * 2 + 0); - _vm->_collisionMan->addCollisionSprite(_ssArrowPrev); + _parentScene->addCollisionSprite(_ssArrowPrev); _ssArrowNext = _parentScene->insertSprite(this, _symbolPosition * 2 + 1); - _vm->_collisionMan->addCollisionSprite(_ssArrowNext); + _parentScene->addCollisionSprite(_ssArrowNext); } uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -752,7 +752,7 @@ void AsScene3009Symbol::hide() { } Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _keepVideo(false), _moveCannonLeftFirst(false), + : Scene(vm, parentModule), _keepVideo(false), _moveCannonLeftFirst(false), _isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { _cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS); @@ -769,13 +769,13 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) insertPuzzleMouse(0x04208D08, 20, 620); _ssFireCannonButton = insertSprite(this); - _vm->_collisionMan->addCollisionSprite(_ssFireCannonButton); + addCollisionSprite(_ssFireCannonButton); _asVerticalIndicator = insertSprite(this, _cannonTargetStatus); - _vm->_collisionMan->addCollisionSprite(_asVerticalIndicator); + addCollisionSprite(_asVerticalIndicator); _asHorizontalIndicator = insertSprite(this, _cannonTargetStatus); - _vm->_collisionMan->addCollisionSprite(_asHorizontalIndicator); + addCollisionSprite(_asHorizontalIndicator); if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) { _keepVideo = true; @@ -1220,7 +1220,7 @@ void AsScene3010DeadBolt::stDisabledMessage() { } Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) { + : Scene(vm, parentModule), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) { int initCountdown = 0; @@ -1235,7 +1235,7 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) for (int i = 0; i < 3; i++) { _asDeadBolts[i] = insertSprite(this, i, which == 1);//CHECKME _ssDeadBoltButtons[i] = insertSprite(this, i, initCountdown, which == 1);//CHECKME - _vm->_collisionMan->addCollisionSprite(_ssDeadBoltButtons[i]); + addCollisionSprite(_ssDeadBoltButtons[i]); if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i])) initCountdown++; _boltUnlocking[i] = false; @@ -1448,7 +1448,7 @@ void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) { } Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule, true), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) { + : Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) { _vm->gameModule()->initCodeSymbolsPuzzle(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); @@ -1466,7 +1466,7 @@ Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) _asSymbols[symbolIndex] = insertSprite(symbolIndex, true); _ssButton = insertSprite(this, true); - _vm->_collisionMan->addCollisionSprite(_ssButton); + addCollisionSprite(_ssButton); } diff --git a/engines/neverhood/navigationscene.cpp b/engines/neverhood/navigationscene.cpp index ffaa802a21..d802322858 100644 --- a/engines/neverhood/navigationscene.cpp +++ b/engines/neverhood/navigationscene.cpp @@ -26,7 +26,7 @@ namespace Neverhood { NavigationScene::NavigationScene(NeverhoodEngine *vm, Module *parentModule, uint32 navigationListId, int navigationIndex, const byte *itemsTypes) - : Scene(vm, parentModule, true), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false), + : Scene(vm, parentModule), _itemsTypes(itemsTypes), _navigationIndex(navigationIndex), _smackerDone(false), _isWalkingForward(false), _isTurning(false), _smackerFileHash(0), _interactive(true), _leaveSceneAfter(false) { _navigationList = _vm->_staticData->getNavigationList(navigationListId); diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 4ee801bff4..c0c6185ec9 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -28,7 +28,6 @@ #include "engines/util.h" #include "neverhood/neverhood.h" #include "neverhood/blbarchive.h" -#include "neverhood/collisionman.h" #include "neverhood/gamemodule.h" #include "neverhood/gamevars.h" #include "neverhood/graphics.h" @@ -92,7 +91,6 @@ Common::Error NeverhoodEngine::run() { _soundMan = new SoundMan(this); _audioResourceMan = new AudioResourceMan(this); - _collisionMan = new CollisionMan(this); _gameModule = new GameModule(this); // TODO Check if this can actually be false... @@ -116,7 +114,6 @@ Common::Error NeverhoodEngine::run() { mainLoop(); delete _gameModule; - delete _collisionMan; delete _soundMan; delete _audioResourceMan; diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index ef0f16c41a..3653127f91 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -40,7 +40,6 @@ enum NeverhoodGameFeatures { struct NeverhoodGameDescription; -class CollisionMan; class GameModule; class GameVars; class ResourceMan; @@ -85,7 +84,6 @@ public: ResourceMan *_res; GameModule *_gameModule; StaticData *_staticData; - CollisionMan *_collisionMan; SoundMan *_soundMan; AudioResourceMan *_audioResourceMan; diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 3f0c92f233..e34f9334ec 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -21,12 +21,11 @@ */ #include "neverhood/scene.h" -#include "neverhood/collisionman.h" namespace Neverhood { -Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) - : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm) { +Scene::Scene(NeverhoodEngine *vm, Module *parentModule) + : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL) { _isKlaymanBusy = false; _doConvertMessages = false; @@ -40,10 +39,8 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects) _mouseCursor = NULL; _palette = NULL; _background = NULL; - if (clearHitRects) { - _vm->_collisionMan->clearHitRects(); - _vm->_collisionMan->clearCollisionSprites(); - } + clearHitRects(); + clearCollisionSprites(); _vm->_screen->setFps(24); _vm->_screen->setSmackerDecoder(NULL); _canAcceptInput = true; @@ -160,7 +157,7 @@ void Scene::setSpriteSurfacePriority(Sprite *sprite, int priority) { } void Scene::deleteSprite(Sprite **sprite) { - _vm->_collisionMan->removeCollisionSprite(*sprite); + removeCollisionSprite(*sprite); removeSurface((*sprite)->getSurface()); removeEntity(*sprite); delete *sprite; @@ -187,7 +184,11 @@ void Scene::setPalette(uint32 fileHash) { } void Scene::setHitRects(uint32 id) { - _vm->_collisionMan->setHitRects(id); + setHitRects(_vm->_staticData->getHitRectList(id)); +} + +void Scene::setHitRects(HitRectList *hitRects) { + _hitRects = hitRects; } Sprite *Scene::insertStaticSprite(uint32 fileHash, int surfacePriority) { @@ -317,8 +318,8 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s } bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { - for (uint i = 0; i < _vm->_collisionMan->getCollisionSpritesCount(); i++) { - Sprite *sprite = _vm->_collisionMan->getCollisionSprite(i); + for (uint i = 0; i < _collisionSprites.size(); i++) { + Sprite *sprite = _collisionSprites[i]; if (sprite->hasMessageHandler() && sprite->isPointInside(mouseX, mouseY) && sendPointMessage(sprite, 0x1011, _mouseClickPos) != 0) { return true; @@ -471,7 +472,7 @@ void Scene::loadHitRectList() { HitRectList *hitRectList = _dataResource.getHitRectList(); if (hitRectList) { _hitRectList = *hitRectList; - _vm->_collisionMan->setHitRects(&_hitRectList); + setHitRects(&_hitRectList); } } @@ -510,4 +511,54 @@ uint16 Scene::convertMessageNum(uint32 messageNum) { return 0x1000; } +void Scene::clearHitRects() { + _hitRects = NULL; +} + +HitRect *Scene::findHitRectAtPos(int16 x, int16 y) { + static HitRect kDefaultHitRect = {NRect(), 0x5000}; + if (_hitRects) + for (HitRectList::iterator it = _hitRects->begin(); it != _hitRects->end(); it++) + if ((*it).rect.contains(x, y)) + return &(*it); + return &kDefaultHitRect; +} + +void Scene::addCollisionSprite(Sprite *sprite) { + int index = 0, insertIndex = -1; + for (Common::Array::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) { + if ((*iter)->getPriority() > sprite->getPriority()) { + insertIndex = index; + break; + } + index++; + } + if (insertIndex >= 0) + _collisionSprites.insert_at(insertIndex, sprite); + else + _collisionSprites.push_back(sprite); +} + +void Scene::removeCollisionSprite(Sprite *sprite) { + for (uint index = 0; index < _collisionSprites.size(); index++) { + if (_collisionSprites[index] == sprite) { + _collisionSprites.remove_at(index); + break; + } + } +} + +void Scene::clearCollisionSprites() { + _collisionSprites.clear(); +} + +void Scene::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam) { + for (Common::Array::iterator iter = _collisionSprites.begin(); iter != _collisionSprites.end(); iter++) { + Sprite *collSprite = *iter; + if ((sprite->getFlags() & flags) && collSprite->checkCollision(sprite->getCollisionBounds())) { + sprite->sendMessage(collSprite, messageNum, messageParam); + } + } +} + } // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index a9e1674325..cb345674f0 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -39,7 +39,7 @@ namespace Neverhood { class Scene : public Entity { public: - Scene(NeverhoodEngine *vm, Module *parentModule, bool clearHitRects); + Scene(NeverhoodEngine *vm, Module *parentModule); virtual ~Scene(); virtual void draw(); void addEntity(Entity *entity); @@ -67,6 +67,10 @@ public: SmackerPlayer *addSmackerPlayer(SmackerPlayer *smackerPlayer); void update(); void leaveScene(uint32 result); + HitRect *findHitRectAtPos(int16 x, int16 y); + void addCollisionSprite(Sprite *sprite); + void removeCollisionSprite(Sprite *sprite); + void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam); // Some crazy templated functions to make the logic code smaller/simpler (imo!) // insertKlayman template @@ -187,6 +191,9 @@ protected: HitRectList _hitRectList; + HitRectList *_hitRects; + Common::Array _collisionSprites; + void (Entity::*_savedUpdateHandlerCb)(); uint32 (Entity::*_savedMessageHandlerCb)(int messageNum, const MessageParam ¶m, Entity *sender); int _messageValue; @@ -205,6 +212,11 @@ protected: void cancelMessageList(); void loadDataResource(uint32 fileHash); uint16 convertMessageNum(uint32 messageNum); + + void setHitRects(HitRectList *hitRects); + void clearHitRects(); + void clearCollisionSprites(); + }; } // End of namespace Neverhood diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index a08aad4cee..7470acbdad 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -25,7 +25,7 @@ namespace Neverhood { SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort) - : Scene(vm, parentModule, true), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false), + : Scene(vm, parentModule), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false), _fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) { debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort); -- cgit v1.2.3 From b875696fc7037d949200a714d1403d922714ed91 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 10 Jan 2013 23:18:37 +0000 Subject: NEVERHOOD: Update todo.txt --- engines/neverhood/todo.txt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt index 5561ead209..c13d3f13d5 100644 --- a/engines/neverhood/todo.txt +++ b/engines/neverhood/todo.txt @@ -6,10 +6,6 @@ else the game disasm and reimplemtation code become even more different TODOs which can be done any time: ----------------------------------- -- Give placeholder stuff (e.g. sub?????, _flag??? etc.) better fitting names -- Use CursorMan for the mouse cursor (instead of using it like a normal sprite) - - This whould make it neccessary to call _system->updateScreen more often else - the mouse movement would be choppy - Cleanup - Clean up staticdata structs to look more like the ones in create_neverhood (e.g. by using template classes etc.) @@ -17,15 +13,10 @@ TODOs which can be done any time: TODOs which should be done only after the game logic is finished: ------------------------------------------------------------------- -- Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary -- Rework the resource system - - The current system can be simplified a lot - - Also resource purging needs to be implemented - Implement game menus - Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes) - This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included - The move special scenes (SmackerScene) into the scenes file -- Maybe merge CollisionMan with Scene (since it's so far never used independently) DONE: ------- @@ -34,7 +25,15 @@ DONE: - Play routine should fill the handle so it can be stopped/queried later - Basically like ScummVM own sound handles - RE and implement yet unknown music/sound stuff - +- Implement clever sprite redrawing code (dirty rectangles, microtiles etc.), only redraw what's neccessary +- Rework the resource system + - The current system can be simplified a lot + - Also resource purging needs to be implemented +- Maybe merge CollisionMan with Scene (since it's so far never used independently) +- Give placeholder stuff (e.g. sub?????, _flag??? etc.) better fitting names +- Use CursorMan for the mouse cursor (instead of using it like a normal sprite) + - This whould make it neccessary to call _system->updateScreen more often else + the mouse movement would be choppy TODOs which are experimental: ------------------------------- -- cgit v1.2.3 From fa205be8924fe5b053d16fe27ffee9a5aaf39d36 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 10 Jan 2013 23:22:12 +0000 Subject: NEVERHOOD: Remove some obsolete TODOs --- engines/neverhood/gamemodule.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 823f89a05a..be56c73e03 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -78,7 +78,6 @@ GameModule::GameModule(NeverhoodEngine *vm) _mainMenuRequested(false), _gameWasLoaded(false) { // Other initializations moved to actual engine class - // TODO _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079); SetMessageHandler(&GameModule::handleMessage); } @@ -88,9 +87,6 @@ GameModule::~GameModule() { _vm->_soundMan->deleteSoundGroup(0x002D0031); delete _childObject; _childObject = NULL; - // TODO: Set palette to black but probably not neccessary - // TODO SoundMan_deinit(); - // TODO Set debug vars (maybe) } void GameModule::handleMouseMove(int16 x, int16 y) { @@ -176,7 +172,7 @@ void GameModule::initMemoryPuzzle() { for (uint32 i = 0; i < 3; i++) setSubVar(VA_CURR_DICE_NUMBERS, i, 1); // Set special symbols - // Symbol 5 is always one the three special symbols + // Symbol 5 is always one of the three special symbols setSubVar(VA_DICE_MEMORY_SYMBOLS, diceIndices.getNumber(), 5); tileSymbols.removeNumber(5); for (int i = 0; i < 2; i++) -- cgit v1.2.3 From 6ddedc955a5d04efda9b462154ccac2df4f8966a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 12 Jan 2013 00:19:20 +0000 Subject: NEVERHOOD: Merge TextSurface into FontSurface --- engines/neverhood/graphics.cpp | 82 ++++++++++++++++++++++------------------ engines/neverhood/graphics.h | 27 ++++--------- engines/neverhood/menumodule.cpp | 48 +++++++++++------------ engines/neverhood/menumodule.h | 16 ++++---- engines/neverhood/module1000.cpp | 22 +---------- engines/neverhood/module1000.h | 1 - engines/neverhood/module2200.cpp | 19 ++-------- engines/neverhood/module2200.h | 1 - 8 files changed, 88 insertions(+), 128 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 3b456a574f..1c3769dc65 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -150,62 +150,70 @@ void ShadowSurface::draw() { // FontSurface -FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) - : BaseSurface(vm, 0, charWidth * 16, charHeight * numRows), _tracking(tracking), _numRows(numRows), _firstChar(firstChar), - _charWidth(charWidth), _charHeight(charHeight) { -} +FontSurface::FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) + : BaseSurface(vm, 0, charWidth * charsPerRow, charHeight * numRows), _charsPerRow(charsPerRow), _numRows(numRows), + _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _tracking(NULL) { + + _tracking = new NPointArray(); + *_tracking = *tracking; -void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) { - NDrawRect sourceRect; - chr -= _firstChar; - sourceRect.x = (chr % 16) * _charWidth; - sourceRect.y = (chr / 16) * _charHeight; - sourceRect.width = _charWidth; - sourceRect.height = _charHeight; - destSurface->copyFrom(_surface, x, y, sourceRect, true); } -void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string) { - for (; *string != 0; string++) { - drawChar(destSurface, x, y, *string); - x += _tracking[*string - _firstChar].x; - } +FontSurface::FontSurface(NeverhoodEngine *vm, uint32 fileHash, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight) + : BaseSurface(vm, 0, charWidth * charsPerRow, charHeight * numRows), _charsPerRow(charsPerRow), _numRows(numRows), + _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _tracking(NULL) { + + SpriteResource fontSpriteResource(_vm); + fontSpriteResource.load2(fileHash); + drawSpriteResourceEx(fontSpriteResource, false, false, 0, 0); } -// TextSurface - -TextSurface::TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount, - byte firstChar, uint16 charWidth, uint16 charHeight) - : BaseSurface(vm, 0, charWidth * charCount, charHeight * numRows), - _numRows(numRows), _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), - _fileHash(fileHash), _charCount(charCount) { - - SpriteResource spriteResource(_vm); - spriteResource.load2(_fileHash); - drawSpriteResourceEx(spriteResource, false, false, 0, 0); +FontSurface::~FontSurface() { + delete _tracking; } -void TextSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) { +void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) { NDrawRect sourceRect; chr -= _firstChar; - sourceRect.x = (chr % _charCount) * _charWidth; - sourceRect.y = (chr / _charCount) * _charHeight; + sourceRect.x = (chr % _charsPerRow) * _charWidth; + sourceRect.y = (chr / _charsPerRow) * _charHeight; sourceRect.width = _charWidth; sourceRect.height = _charHeight; destSurface->copyFrom(_surface, x, y, sourceRect, true); } -void TextSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) { - for (; stringLen > 0; stringLen--, string++) { +void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) { + + if (stringLen < 0) + stringLen = strlen((const char*)string); + + for (; stringLen > 0; --stringLen, ++string) { drawChar(destSurface, x, y, *string); - x += _charWidth; + x += _tracking ? (*_tracking)[*string - _firstChar].x : _charWidth; } + } -int16 TextSurface::getStringWidth(const byte *string, int stringLen) { +int16 FontSurface::getStringWidth(const byte *string, int stringLen) { return string ? stringLen * _charWidth : 0; } +FontSurface *FontSurface::createFontSurface(NeverhoodEngine *vm, uint32 fileHash) { + FontSurface *fontSurface; + DataResource fontData(vm); + SpriteResource fontSprite(vm); + fontData.load(calcHash("asRecFont")); + uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x; + uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x; + uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; + uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; + NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); + fontSprite.load2(fileHash); + fontSurface = new FontSurface(vm, tracking, 16, numRows, firstChar, charWidth, charHeight); + fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0); + return fontSurface; +} + // Misc enum BitmapFlags { @@ -338,8 +346,8 @@ void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, i } int calcDistance(int16 x1, int16 y1, int16 x2, int16 y2) { - int16 deltaX = ABS(x1 - x2); - int16 deltaY = ABS(y1 - y2); + const int16 deltaX = ABS(x1 - x2); + const int16 deltaY = ABS(y1 - y2); return sqrt((double)(deltaX * deltaX + deltaY * deltaY)); } diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index 65d25c04ce..a900cea10f 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -81,8 +81,6 @@ class AnimResource; class SpriteResource; class MouseCursorResource; -// NOTE: "Restore" methods aren't need in the reimplementation as they're DirectDraw-specific - class BaseSurface { public: BaseSurface(NeverhoodEngine *vm, int priority, int16 width, int16 height); @@ -131,33 +129,22 @@ protected: class FontSurface : public BaseSurface { public: - FontSurface(NeverhoodEngine *vm, NPointArray &tracking, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); - void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); - void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string); -protected: - NPointArray _tracking; - uint16 _numRows; - byte _firstChar; - uint16 _charWidth; - uint16 _charHeight; -}; - -class TextSurface : public BaseSurface { -public: - TextSurface(NeverhoodEngine *vm, uint32 fileHash, uint16 numRows, uint charCount, - byte firstChar, uint16 charWidth, uint16 charHeight); + FontSurface(NeverhoodEngine *vm, NPointArray *tracking, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); + FontSurface(NeverhoodEngine *vm, uint32 fileHash, uint charsPerRow, uint16 numRows, byte firstChar, uint16 charWidth, uint16 charHeight); + virtual ~FontSurface(); void drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr); - void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen); + void drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen = -1); int16 getStringWidth(const byte *string, int stringLen); uint16 getCharWidth() const { return _charWidth; } uint16 getCharHeight() const { return _charHeight; } + static FontSurface *createFontSurface(NeverhoodEngine *vm, uint32 fileHash); protected: + uint _charsPerRow; uint16 _numRows; byte _firstChar; uint16 _charWidth; uint16 _charHeight; - uint32 _fileHash; - uint _charCount; + NPointArray *_tracking; }; // Misc diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index a1489fc78b..726ab91b8c 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -458,9 +458,9 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam ¶m, Entity * TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, - const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface) + const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface) : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), - _string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _textSurface(textSurface) { + _string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _fontSurface(fontSurface) { } @@ -470,15 +470,15 @@ void TextLabelWidget::addSprite() { } int16 TextLabelWidget::getWidth() { - return _textSurface->getStringWidth(_string, _stringLen); + return _fontSurface->getStringWidth(_string, _stringLen); } int16 TextLabelWidget::getHeight() { - return _textSurface->getCharHeight(); + return _fontSurface->getCharHeight(); } void TextLabelWidget::drawString(int maxStringLength) { - _textSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength)); + _fontSurface->drawString(_drawSurface, _x, _y, _string, MIN(_stringLen, maxStringLength)); _collisionBoundsOffset.set(_tx, _ty, getWidth(), getHeight()); updateBounds(); } @@ -499,14 +499,14 @@ void TextLabelWidget::setString(const byte *string, int stringLen) { } TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface, + int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect) : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), - _maxStringLength(maxStringLength), _textSurface(textSurface), _fileHash(fileHash), _rect(rect), + _maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect), _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0), _modified(false) { - _maxVisibleChars = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth(); + _maxVisibleChars = (_rect.x2 - _rect.x1) / _fontSurface->getCharWidth(); _cursorPos = 0; SetUpdateHandler(&TextEditWidget::update); @@ -526,8 +526,8 @@ void TextEditWidget::onClick() { if (_entryString.size() == 1) _cursorPos = 0; else { - int newCursorPos = mousePos.x / _textSurface->getCharWidth(); - if (mousePos.x % _textSurface->getCharWidth() > _textSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//### + int newCursorPos = mousePos.x / _fontSurface->getCharWidth(); + if (mousePos.x % _fontSurface->getCharWidth() > _fontSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//### ++newCursorPos; _cursorPos = MIN((int)_entryString.size(), newCursorPos); } @@ -546,9 +546,9 @@ void TextEditWidget::addSprite() { _parentScene->addSprite(this); _parentScene->addCollisionSprite(this); _surface->setVisible(true); - _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _textSurface->getCharHeight()) / 2, + _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _fontSurface->getCharHeight()) / 2, 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, - (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _textSurface); + (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface); _textLabelWidget->addSprite(); cursorSpriteResource.load2(_cursorFileHash); _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); @@ -576,7 +576,7 @@ void TextEditWidget::setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 c void TextEditWidget::drawCursor() { if (_cursorSurface->getVisible() && _cursorPos >= 0 && _cursorPos <= _maxVisibleChars) { NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight); - _surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _textSurface->getCharWidth(), + _surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _fontSurface->getCharWidth(), _rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect, true); } else _cursorSurface->setVisible(false); @@ -677,13 +677,13 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam ¶m, SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, - StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect) + StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect) : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), - _savegameList(savegameList), _textSurface(textSurface), _bgFileHash(bgFileHash), _rect(rect), + _savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect), _maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) { - _maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _textSurface->getCharHeight(); - _maxStringLength = (_rect.x2 - _rect.x1) / _textSurface->getCharWidth(); + _maxVisibleItemsCount = (_rect.y2 - _rect.y1) / _fontSurface->getCharHeight(); + _maxStringLength = (_rect.x2 - _rect.x1) / _fontSurface->getCharWidth(); } void SavegameListBox::onClick() { @@ -692,7 +692,7 @@ void SavegameListBox::onClick() { mousePos.y -= _y + _rect.y1; if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 && mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) { - int newIndex = _firstVisibleItem + mousePos.y / _textSurface->getCharHeight(); + int newIndex = _firstVisibleItem + mousePos.y / _fontSurface->getCharHeight(); if (newIndex <= _lastVisibleItem) { _currIndex = newIndex; refresh(); @@ -723,7 +723,7 @@ void SavegameListBox::buildItems() { const byte *string = (const byte*)savegameList[i].c_str(); int stringLen = (int)savegameList[i].size(); TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1, - _baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _textSurface); + _baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface); label->addSprite(); _textLabelItems.push_back(label); } @@ -733,7 +733,7 @@ void SavegameListBox::drawItems() { for (int i = 0; i < (int)_textLabelItems.size(); ++i) { TextLabelWidget *label = _textLabelItems[i]; if (i >= _firstVisibleItem && i < _lastVisibleItem) { - label->setY(_rect.y1 + (i - _firstVisibleItem) * _textSurface->getCharHeight()); + label->setY(_rect.y1 + (i - _firstVisibleItem) * _fontSurface->getCharHeight()); label->updateBounds(); label->drawString(_maxStringLength); } else @@ -805,7 +805,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra static const NRect kTextEditRect(0, 0, 377, 17); static const NRect kMouseRect(50, 47, 427, 64); - _textSurface = new TextSurface(_vm, 0x2328121A, 7, 32, 32, 11, 17); + _fontSurface = new FontSurface(_vm, 0x2328121A, 32, 7, 32, 11, 17); setBackground(0x30084E25); setPalette(0x30084E25); @@ -814,11 +814,11 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra insertStaticSprite(0x1301A7EA, 200); _listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, 1000, 1000, - _savegameList, _textSurface, 0x1115A223, kListBoxRect); + _savegameList, _fontSurface, 0x1115A223, kListBoxRect); _listBox->addSprite(); _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, 29, - _textSurface, 0x3510A868, kTextEditRect); + _fontSurface, 0x3510A868, kTextEditRect); _textEditWidget->setCursor(0x8290AC20, 2, 13); _textEditWidget->addSprite(); setCurrWidget(_textEditWidget); @@ -835,7 +835,7 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra } SaveGameMenu::~SaveGameMenu() { - delete _textSurface; + delete _fontSurface; } void SaveGameMenu::handleEvent(int16 itemID, int eventType) { diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 0f45795ab9..51c32aa878 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -123,7 +123,7 @@ class TextLabelWidget : public Widget { public: TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, - const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, TextSurface *textSurface); + const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface); virtual void onClick(); virtual void addSprite(); virtual int16 getWidth(); @@ -131,11 +131,11 @@ public: void drawString(int maxStringLength); void clear(); void setString(const byte *string, int stringLen); - TextSurface *getTextSurface() const { return _textSurface; } + FontSurface *getFontSurface() const { return _fontSurface; } protected: BaseSurface *_drawSurface; int16 _tx, _ty; - TextSurface *_textSurface; + FontSurface *_fontSurface; const byte *_string; int _stringLen; }; @@ -143,7 +143,7 @@ protected: class TextEditWidget : public Widget { public: TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, int maxStringLength, TextSurface *textSurface, + int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect); ~TextEditWidget(); virtual void onClick(); @@ -167,7 +167,7 @@ protected: int _cursorPos; int _cursorTicks; Common::String _entryString; - TextSurface *_textSurface; + FontSurface *_fontSurface; TextLabelWidget *_textLabelWidget; BaseSurface *_cursorSurface; uint32 _cursorFileHash; @@ -181,7 +181,7 @@ class SavegameListBox : public Widget { public: SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, - StringArray *savegameList, TextSurface *textSurface, uint32 bgFileHash, const NRect &rect); + StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); virtual void onClick(); virtual void addSprite(); void buildItems(); @@ -200,7 +200,7 @@ protected: int _firstVisibleItem; int _lastVisibleItem; StringArray *_savegameList; - TextSurface *_textSurface; + FontSurface *_fontSurface; uint _currIndex; int _maxVisibleItemsCount; }; @@ -212,7 +212,7 @@ public: virtual void handleEvent(int16 itemID, int eventType); protected: StringArray *_savegameList; - TextSurface *_textSurface; + FontSurface *_fontSurface; SavegameListBox *_listBox; TextEditWidget *_textEditWidget; Common::String _savegameDescription; diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 7033cafdc9..44bb778645 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1580,7 +1580,7 @@ void Scene1005::drawTextToBackground() { const char *textStart, *textEnd; int16 y = 36; uint32 textIndex = getTextIndex(); - FontSurface *fontSurface = createFontSurface(); + FontSurface *fontSurface = FontSurface::createFontSurface(_vm, getGlobalVar(V_ENTRANCE_OPEN) ? 0x283CE401 : 0xC6604282); textResource.load(0x80283101); textStart = textResource.getString(textIndex, textEnd); while (textStart < textEnd) { @@ -1591,26 +1591,6 @@ void Scene1005::drawTextToBackground() { delete fontSurface; } -FontSurface *Scene1005::createFontSurface() { - FontSurface *fontSurface; - DataResource fontData(_vm); - SpriteResource fontSprite(_vm); - fontData.load(calcHash("asRecFont")); - uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x; - uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x; - uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; - uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; - NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); - fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight); - if (getGlobalVar(V_ENTRANCE_OPEN)) { - fontSprite.load2(0x283CE401); - } else { - fontSprite.load2(0xC6604282); - } - fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0); - return fontSurface; -} - uint32 Scene1005::getTextIndex() { uint32 textIndex; textIndex = getTextIndex1(); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 6f73326c61..32228a20e7 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -289,7 +289,6 @@ public: protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void drawTextToBackground(); - FontSurface *createFontSurface(); uint32 getTextIndex(); uint32 getTextIndex1(); uint32 getTextIndex2(); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 889af37852..6448955934 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2135,8 +2135,9 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) setPalette(0x08100289); addEntity(_palette); insertPuzzleMouse(0x0028D089, 40, 600); - - createFontSurface(); + + _fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C); + _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); spriteResource.load2(0x08100289); _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); @@ -2232,20 +2233,6 @@ uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entit return messageResult; } -void Scene2208::createFontSurface() { - DataResource fontData(_vm); - SpriteResource spriteResource(_vm); - fontData.load(calcHash("asRecFont")); - uint16 numRows = fontData.getPoint(calcHash("meNumRows")).x; - uint16 firstChar = fontData.getPoint(calcHash("meFirstChar")).x; - uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; - uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; - NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); - spriteResource.load2(0x0800090C); - _fontSurface = new FontSurface(_vm, *tracking, numRows, firstChar, charWidth, charHeight); - _fontSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); -} - void Scene2208::drawRow(int16 rowIndex) { NDrawRect sourceRect; int16 y = (rowIndex * 48) % 528; diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 34be267645..30cc681b40 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -336,7 +336,6 @@ protected: Common::Array _strings; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createFontSurface(); void drawRow(int16 rowIndex); }; -- cgit v1.2.3 From a98d9aa58afb4dd944616e7f194c09ff28456e1b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 08:27:38 +0000 Subject: NEVERHOOD: Clean up DiskplayerScene - Enable return to launcher - Remove obsolete comments - Remove braces in single-line statements - Remove unused non-transparent drawing code in BaseSurface::copyFrom - Clean up mouse cursor insertion code in Scene class --- engines/neverhood/detection.cpp | 3 +- engines/neverhood/diskplayerscene.cpp | 56 ++++++++++----------- engines/neverhood/diskplayerscene.h | 10 ++-- engines/neverhood/entity.cpp | 1 + engines/neverhood/gamemodule.cpp | 92 +++++++++++++++-------------------- engines/neverhood/gamevars.cpp | 3 -- engines/neverhood/gamevars.h | 1 - engines/neverhood/graphics.cpp | 26 ++++------ engines/neverhood/graphics.h | 2 +- engines/neverhood/menumodule.cpp | 2 +- engines/neverhood/module.cpp | 3 +- engines/neverhood/module1000.cpp | 7 ++- engines/neverhood/module1100.cpp | 2 - engines/neverhood/module2200.cpp | 6 +-- engines/neverhood/module2900.cpp | 12 ++--- engines/neverhood/scene.cpp | 16 +++--- engines/neverhood/scene.h | 1 + 17 files changed, 105 insertions(+), 138 deletions(-) diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index 9dc4582ba7..043cf02723 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -72,7 +72,6 @@ static const NeverhoodGameDescription gameDescriptions[] = { { // Neverhood English version - // TODO: Maybe additional files are needed to properly detect different versions { "neverhood", 0, @@ -147,7 +146,7 @@ bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const { bool Neverhood::NeverhoodEngine::hasFeature(EngineFeature f) const { return -// (f == kSupportsRTL) || // TODO: Not yet... + (f == kSupportsRTL) || (f == kSupportsLoadingDuringRuntime) || (f == kSupportsSavingDuringRuntime); } diff --git a/engines/neverhood/diskplayerscene.cpp b/engines/neverhood/diskplayerscene.cpp index 907e027bc3..d972943759 100644 --- a/engines/neverhood/diskplayerscene.cpp +++ b/engines/neverhood/diskplayerscene.cpp @@ -240,40 +240,40 @@ void DiskplayerPlayButton::release() { } } -DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value) - : Entity(vm, 0), _diskplayerScene(diskplayerScene), _elementIndex(elementIndex), _value(value), - _isLocked(false), _isBlinking(false), _countdown(0), _initialCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { - - if (value != 0 && elementIndex < 20) { - _inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[_elementIndex], 1100)); - _appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[_elementIndex], 1000)); - _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[_elementIndex], 1100)); +DiskplayerSlot::DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int slotIndex, bool isAvailable) + : Entity(vm, 0), _diskplayerScene(diskplayerScene), _isLocked(false), _isBlinking(false), + _blinkCountdown(0), _initialBlinkCountdown(2), _inactiveSlot(NULL), _appearSlot(NULL), _activeSlot(NULL) { + + if (isAvailable && slotIndex < 20) { + _inactiveSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes1[slotIndex], 1100)); + _appearSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes2[slotIndex], 1000)); + _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes3[slotIndex], 1100)); _inactiveSlot->setVisible(false); _appearSlot->setVisible(false); _activeSlot->setVisible(false); loadSound(0, 0x46210074); - setSoundPan(0, elementIndex * 100 / 19); - } else if (elementIndex != 20) { - _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[_elementIndex], 1100)); + setSoundPan(0, slotIndex * 100 / 19); + } else if (slotIndex != 20) { + _activeSlot = _diskplayerScene->addSprite(new StaticSprite(_vm, kDiskplayerSlotFileHashes4[slotIndex], 1100)); _activeSlot->setVisible(false); } SetUpdateHandler(&DiskplayerSlot::update); } void DiskplayerSlot::update() { - if (_countdown != 0 && (--_countdown == 0)) { + if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) { if (_isBlinking) { if (_inactiveSlot) _inactiveSlot->setVisible(true); if (_activeSlot) _activeSlot->setVisible(false); - _countdown = _initialCountdown / 2; + _blinkCountdown = _initialBlinkCountdown / 2; } else { if (_inactiveSlot) _inactiveSlot->setVisible(false); if (_activeSlot) _activeSlot->setVisible(true); - _countdown = _initialCountdown; + _blinkCountdown = _initialBlinkCountdown; } _isBlinking = !_isBlinking; } @@ -295,13 +295,13 @@ void DiskplayerSlot::play() { if (_activeSlot) _activeSlot->setVisible(true); _isBlinking = true; - _countdown = 0; + _blinkCountdown = 0; } } void DiskplayerSlot::activate() { if (!_isLocked) - _countdown = _initialCountdown; + _blinkCountdown = _initialBlinkCountdown; } void DiskplayerSlot::stop() { @@ -311,7 +311,7 @@ void DiskplayerSlot::stop() { if (_activeSlot) _activeSlot->setVisible(false); _isBlinking = false; - _countdown = 0; + _blinkCountdown = 0; } } @@ -330,17 +330,17 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int _asKey = insertSprite(); for (int i = 0; i < 20; i++) { - _diskAvailable[i] = 0; + _diskAvailable[i] = false; if (getSubVar(VA_IS_TAPE_INSERTED, i)) availableDisksCount++; } for (int i = 0; i < availableDisksCount; i++) - _diskAvailable[kDiskplayerInitArray[i] - 1] = 1; + _diskAvailable[kDiskplayerInitArray[i] - 1] = true; - for (int i = 0; i < 20; i++) { - _diskSlots[i] = new DiskplayerSlot(_vm, this, i, _diskAvailable[i]); - addEntity(_diskSlots[i]); + for (int slotIndex = 0; slotIndex < 20; slotIndex++) { + _diskSlots[slotIndex] = new DiskplayerSlot(_vm, this, slotIndex, _diskAvailable[slotIndex]); + addEntity(_diskSlots[slotIndex]); } _hasAllDisks = availableDisksCount == 20; @@ -348,7 +348,7 @@ DiskplayerScene::DiskplayerScene(NeverhoodEngine *vm, Module *parentModule, int if (_hasAllDisks && !getGlobalVar(V_HAS_FINAL_KEY)) _dropKey = true; - _finalDiskSlot = new DiskplayerSlot(_vm, this, 20, 0); + _finalDiskSlot = new DiskplayerSlot(_vm, this, 20, false); addEntity(_finalDiskSlot); insertPuzzleMouse(0x000408A8, 20, 620); @@ -372,11 +372,10 @@ void DiskplayerScene::update() { Scene::update(); if (_updateStatus == kUSTuningIn && _diskSmackerPlayer->isDone()) { - if (_diskAvailable[_diskIndex]) { + if (_diskAvailable[_diskIndex]) playDisk(); - } else { + else playStatic(); - } } else if (_updateStatus == kUSPlaying && _diskSmackerPlayer->isDone()) { _diskSlots[_diskIndex]->stop(); _diskIndex++; @@ -456,11 +455,10 @@ uint32 DiskplayerScene::handleMessage(int messageNum, const MessageParam ¶m, _diskIndex = (param.asPoint().x - 38) / 28; _diskSlots[_diskIndex]->activate(); if (_updateStatus == kUSPlaying) { - if (_diskAvailable[_diskIndex]) { + if (_diskAvailable[_diskIndex]) playDisk(); - } else { + else playStatic(); - } } } break; diff --git a/engines/neverhood/diskplayerscene.h b/engines/neverhood/diskplayerscene.h index 7225ff6341..f3fd9ea874 100644 --- a/engines/neverhood/diskplayerscene.h +++ b/engines/neverhood/diskplayerscene.h @@ -54,7 +54,7 @@ protected: class DiskplayerSlot : public Entity { public: - DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int elementIndex, int value); + DiskplayerSlot(NeverhoodEngine *vm, DiskplayerScene *diskplayerScene, int slotIndex, bool isAvailable); void activate(); void stop(); void appear(); @@ -65,11 +65,9 @@ protected: Sprite *_inactiveSlot; Sprite *_appearSlot; Sprite *_activeSlot; - int _elementIndex; - int _initialCountdown; - int _countdown; + int _initialBlinkCountdown; + int _blinkCountdown; bool _isLocked; - int _value; bool _isBlinking; void update(); }; @@ -92,7 +90,7 @@ protected: DiskplayerSlot *_diskSlots[20]; DiskplayerSlot *_finalDiskSlot; int _updateStatus; - byte _diskAvailable[20]; + bool _diskAvailable[20]; int _diskIndex; int _appearCountdown; int _tuneInCountdown; diff --git a/engines/neverhood/entity.cpp b/engines/neverhood/entity.cpp index c7f1659399..8b1298916c 100644 --- a/engines/neverhood/entity.cpp +++ b/engines/neverhood/entity.cpp @@ -55,6 +55,7 @@ Entity::~Entity() { } void Entity::draw() { + // Empty } void Entity::handleUpdate() { diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index be56c73e03..c9310571f0 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -195,8 +195,7 @@ void GameModule::initMemoryPuzzle() { } setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1); - // DEBUG>>> - // TODO: Some debug code: Leave two matching tiles open + // DEBUG>>> Some debug code: Leave two matching tiles open for (int i = 0; i < 48; i++) setSubVar(VA_IS_TILE_MATCH, i, 1); int debugIndex = 0; @@ -313,9 +312,8 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti } void GameModule::startup() { - // TODO: Displaying of error text probably not needed in ScummVM -#if 1 - createModule(1500, 0); // Logos and intro video //Real +#if 0 + createModule(1500, 0); // Logos and intro video // Real game start #else // DEBUG>>> /* @@ -362,13 +360,6 @@ void GameModule::startup() { // <<>> - createScene(_vm->gameState().sceneNum, _vm->gameState().which); - return; - //DEBUG<<< - */ - _vm->gameState().which = 0; _vm->gameState().sceneNum = 14; createModule(2700, -1); @@ -386,9 +377,9 @@ void GameModule::startup() { _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif -#if 0 - _vm->gameState().sceneNum = 1; - createModule(1000, -1); +#if 1 + _vm->gameState().sceneNum = 7; + createModule(2200, -1); #endif #if 0 _vm->gameState().sceneNum = 1; @@ -425,7 +416,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 0; createModule(2500, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 1; createModule(2300, -1); #endif @@ -626,65 +617,60 @@ void GameModule::updateModule() { createModule(2300, 0); break; case 1200: - if (_moduleResult == 1) { + if (_moduleResult == 1) createModule(2600, 0); - } else { + else createModule(2300, 2); - } break; case 1100: - if (_moduleResult == 0) { + if (_moduleResult == 0) createModule(2900, 2); - } else { + else { setGlobalVar(V_ENTRANCE_OPEN, 1); createModule(1300, 0); } break; case 1300: if (_moduleResult == 1) { + // The game was successfully finished + // TODO Restart the game/show main menu // TODO _gameState.clear(); // TODO GameModule_handleKeyEscape - } else { + } else createModule(2900, 0); - } break; case 1400: - if (_moduleResult == 1) { - error("WEIRD!"); - } else { - createModule(1600, 1); - } + createModule(1600, 1); break; case 1500: createModule(1000, 0); break; case 1600: - if (_moduleResult == 1) { + if (_moduleResult == 1) createModule(1400, 0); - } else if (_moduleResult == 2) { + else if (_moduleResult == 2) createModule(1700, 0); - } else { + else createModule(2100, 0); - } break; case 1700: - if (_moduleResult == 1) { + if (_moduleResult == 1) createModule(2900, 3); - } else { + else createModule(1600, 2); - } break; case 1800: if (_moduleResult == 1) { - // TODO GameState_clear(); - // TODO GameModule_handleKeyEscape(); - } else if (_moduleResult == 2) { + // Game over, Klaymen jumped into the hole + // TODO Restart the game/show main menu + // TODO _gameState.clear(); + // TODO GameModule_handleKeyEscape + } else if (_moduleResult == 2) createModule(2700, 0); - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createModule(3000, 3); - } else { + else createModule(2800, 0); - } break; case 1900: createModule(3000, 1); @@ -693,11 +679,10 @@ void GameModule::updateModule() { createModule(2900, 4); break; case 2100: - if (_moduleResult == 1) { + if (_moduleResult == 1) createModule(2900, 1); - } else { + else createModule(1600, 0); - } break; case 2200: createModule(2300, 1); @@ -738,7 +723,7 @@ void GameModule::updateModule() { createModule(1800, 0); break; case 2900: - if (_moduleResult != 0xFFFFFFFF) { + if (_moduleResult != (uint32)-1) { switch (_moduleResult) { case 0: createModule(1300, 5); @@ -787,17 +772,16 @@ void GameModule::updateModule() { setGlobalVar(V_TELEPORTER_CURR_LOCATION, 0); break; case 3000: - if (_moduleResult == 1) { + // NOTE _moduleResult 2 never used + // TODO Check if _moduleResult 4 is used + if (_moduleResult == 1) createModule(1900, 0); - } else if (_moduleResult == 2) { - // WEIRD: Sets the errorFlag - } else if (_moduleResult == 3) { + else if (_moduleResult == 3) createModule(1800, 3); - } else if (_moduleResult == 4) { + else if (_moduleResult == 4) createModule(3000, 0); - } else { + else createModule(2300, 4); - } break; case 9999: createModuleByHash(getGlobalVar(V_MODULE_NAME)); @@ -814,7 +798,7 @@ void GameModule::openMainMenu() { // If there's no module, create one so there's something to return to createModule(1000, 0); } - // TODO Save FPS, Smacker handle, screen offsets, collisition sprites + // TODO Save FPS, Smacker handle, screen offsets _mainMenuRequested = false; createMenuModule(); } @@ -833,7 +817,7 @@ void GameModule::updateMenuModule() { if (!updateChild()) { // TODO Restore FPS? _childObject = _prevChildObject; - // TODO Restore Smacker handle, screen offsets, collision sprites + // TODO Restore Smacker handle, screen offsets sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed? _prevChildObject = NULL; _moduleNum = _prevModuleNum; diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index 7bf9f30e25..57d9547ac2 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -28,9 +28,6 @@ GameVars::GameVars() { addVar(0, 0); } -GameVars::~GameVars() { -} - void GameVars::loadState(Common::InSaveFile *in) { uint varCount; _vars.clear(); diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index a62b33c297..d3fe15fb5e 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -172,7 +172,6 @@ struct GameVar { class GameVars { public: GameVars(); - ~GameVars(); void loadState(Common::InSaveFile *in); void saveState(Common::OutSaveFile *out); uint32 getGlobalVar(uint32 nameHash); diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 1c3769dc65..5426821133 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -112,25 +112,17 @@ void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResour } } -void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent) { - // TODO: Clipping +void BaseSurface::copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect) { + // Copy a rectangle from sourceSurface, no clipping is performed, 0 is the transparent color byte *source = (byte*)sourceSurface->getBasePtr(sourceRect.x, sourceRect.y); byte *dest = (byte*)_surface->getBasePtr(x, y); int height = sourceRect.height; - if (!transparent) { - while (height--) { - memcpy(dest, source, sourceRect.width); - source += sourceSurface->pitch; - dest += _surface->pitch; - } - } else { - while (height--) { - for (int xc = 0; xc < sourceRect.width; xc++) - if (source[xc] != 0) - dest[xc] = source[xc]; - source += sourceSurface->pitch; - dest += _surface->pitch; - } + while (height--) { + for (int xc = 0; xc < sourceRect.width; xc++) + if (source[xc] != 0) + dest[xc] = source[xc]; + source += sourceSurface->pitch; + dest += _surface->pitch; } ++_version; } @@ -179,7 +171,7 @@ void FontSurface::drawChar(BaseSurface *destSurface, int16 x, int16 y, byte chr) sourceRect.y = (chr / _charsPerRow) * _charHeight; sourceRect.width = _charWidth; sourceRect.height = _charHeight; - destSurface->copyFrom(_surface, x, y, sourceRect, true); + destSurface->copyFrom(_surface, x, y, sourceRect); } void FontSurface::drawString(BaseSurface *destSurface, int16 x, int16 y, const byte *string, int stringLen) { diff --git a/engines/neverhood/graphics.h b/engines/neverhood/graphics.h index a900cea10f..a0ac1f09d5 100644 --- a/engines/neverhood/graphics.h +++ b/engines/neverhood/graphics.h @@ -91,7 +91,7 @@ public: void drawSpriteResourceEx(SpriteResource &spriteResource, bool flipX, bool flipY, int16 width, int16 height); void drawAnimResource(AnimResource &animResource, uint frameIndex, bool flipX, bool flipY, int16 width, int16 height); void drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum); - void copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect, bool transparent); + void copyFrom(Graphics::Surface *sourceSurface, int16 x, int16 y, NDrawRect &sourceRect); int getPriority() const { return _priority; } void setPriority(int priority) { _priority = priority; } NDrawRect& getDrawRect() { return _drawRect; } diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 726ab91b8c..2b7561c431 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -577,7 +577,7 @@ void TextEditWidget::drawCursor() { if (_cursorSurface->getVisible() && _cursorPos >= 0 && _cursorPos <= _maxVisibleChars) { NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight); _surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _fontSurface->getCharWidth(), - _rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect, true); + _rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect); } else _cursorSurface->setVisible(false); } diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index aeeb62f65c..36607d771f 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -48,8 +48,7 @@ void Module::draw() { uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { case 0x0008: - if (_parentModule) - sendMessage(_parentModule, 8, 0); + sendMessage(_parentModule, 8, 0); return 0; case 0x1009: _moduleResult = param.asInteger(); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 44bb778645..12fe408040 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -34,13 +34,12 @@ Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) _vm->_soundMan->addMusic(0x03294419, 0x061880C6); _vm->_soundMan->addMusic(0x03294419, _musicFileHash); - if (which < 0) { + if (which < 0) createScene(_vm->gameState().sceneNum, -1); - } else if (which == 0) { + else if (which == 0) createScene(0, 0); - } else if (which == 1) { + else if (which == 1) createScene(1, 1); - } } diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index c39845e44b..2ee389703c 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -573,8 +573,6 @@ void Scene1105::createObjects() { _asTeddyBear->show(); - // TODO: Find a nicer way - deleteSprite((Sprite**)&_mouseCursor); insertPuzzleMouse(0x18666208, 20, 620); } diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 6448955934..a53bd468f4 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2241,20 +2241,20 @@ void Scene2208::drawRow(int16 rowIndex) { sourceRect.y = y; sourceRect.width = 640; sourceRect.height = 48; - _background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect, true); + _background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect); } else if (rowIndex > _maxRowIndex - 5) { sourceRect.x = 0; sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48; sourceRect.width = 640; sourceRect.height = 48; - _background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect, true); + _background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect); } else { rowIndex -= 4; sourceRect.x = 0; sourceRect.y = (rowIndex * 48) % 480; sourceRect.width = 640; sourceRect.height = 48; - _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect, true); + _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect); if (rowIndex < (int)_strings.size()) { const char *text = _strings[rowIndex]; _fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text); diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp index b5a6ab2c88..1e14d37fd5 100644 --- a/engines/neverhood/module2900.cpp +++ b/engines/neverhood/module2900.cpp @@ -82,8 +82,8 @@ void Module2900::updateScene() { if (!updateChild()) { switch (_sceneNum) { case 0: - if (_moduleResult == 0xFFFFFFFF) { - leaveModule(0xFFFFFFFF); + if (_moduleResult == (uint32)-1) { + leaveModule((uint32)-1); } else { _teleporterModuleResult = _moduleResult; switch (getGlobalVar(V_TELEPORTER_WHICH)) { @@ -417,14 +417,12 @@ uint32 Scene2901::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - leaveScene(0xFFFFFFFF); - } + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene((uint32)-1); break; case 0x2000: - if (_currLocationButtonNum != _selectedButtonNum) { + if (_currLocationButtonNum != _selectedButtonNum) leaveScene(_selectedButtonNum); - } break; case 0x2001: if (_currLocationButtonNum == _selectedButtonNum) diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index e34f9334ec..c22683ae37 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -199,18 +199,15 @@ void Scene::insertScreenMouse(uint32 fileHash, const NRect *mouseRect) { NRect rect(-1, -1, -1, -1); if (mouseRect) rect = *mouseRect; - _mouseCursor = new Mouse(_vm, fileHash, rect); - addEntity(_mouseCursor); + insertMouse(new Mouse(_vm, fileHash, rect)); } void Scene::insertPuzzleMouse(uint32 fileHash, int16 x1, int16 x2) { - _mouseCursor = new Mouse(_vm, fileHash, x1, x2); - addEntity(_mouseCursor); + insertMouse(new Mouse(_vm, fileHash, x1, x2)); } void Scene::insertNavigationMouse(uint32 fileHash, int type) { - _mouseCursor = new Mouse(_vm, fileHash, type); - addEntity(_mouseCursor); + insertMouse(new Mouse(_vm, fileHash, type)); } void Scene::showMouse(bool visible) { @@ -561,4 +558,11 @@ void Scene::checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 } } +void Scene::insertMouse(Mouse *mouseCursor) { + if (_mouseCursor) + deleteSprite((Sprite**)&_mouseCursor); + _mouseCursor = mouseCursor; + addEntity(_mouseCursor); +} + } // End of namespace Neverhood diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index cb345674f0..f03275f569 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -217,6 +217,7 @@ protected: void clearHitRects(); void clearCollisionSprites(); + void insertMouse(Mouse *mouseCursor); }; } // End of namespace Neverhood -- cgit v1.2.3 From 57497817e1f086a62471587e3601d8f0f7d7f13b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 09:09:39 +0000 Subject: NEVERHOOD: Add enum for the resource types --- engines/neverhood/resource.cpp | 18 +++++++----------- engines/neverhood/resource.h | 11 +++++++++++ engines/neverhood/smackerscene.cpp | 2 +- engines/neverhood/sound.cpp | 7 ++++--- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 7f897a415f..6cbbf12a25 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -27,10 +27,6 @@ namespace Neverhood { -// TODO: Since the load() methods are similar in most cases some of the code therein -// can probably be copied into another method (e.g. inside the resource manager) -// to reduce code. - // SpriteResource SpriteResource::SpriteResource(NeverhoodEngine *vm) @@ -55,7 +51,7 @@ bool SpriteResource::load(uint32 fileHash) { // TODO: Later merge with load2 and make the mode a parameter unload(); _vm->_res->queryResource(fileHash, _resourceHandle); - if (_resourceHandle.isValid() && _resourceHandle.type() == 2) { + if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) { _vm->_res->loadResource(_resourceHandle); const byte *spriteData = _resourceHandle.data(); parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels); @@ -67,7 +63,7 @@ bool SpriteResource::load2(uint32 fileHash) { debug(2, "SpriteResource::load2(%08X)", fileHash); unload(); _vm->_res->queryResource(fileHash, _resourceHandle); - if (_resourceHandle.isValid() && _resourceHandle.type() == 2) { + if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) { _vm->_res->loadResource(_resourceHandle); const byte *spriteData = _resourceHandle.data(); parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels); @@ -97,11 +93,11 @@ bool PaletteResource::load(uint32 fileHash) { unload(); _vm->_res->queryResource(fileHash, _resourceHandle); if (_resourceHandle.isValid() && - (_resourceHandle.type() == 2 || _resourceHandle.type() == 3)) { + (_resourceHandle.type() == kResTypeBitmap || _resourceHandle.type() == kResTypePalette)) { _vm->_res->loadResource(_resourceHandle); _palette = _resourceHandle.data(); // Check if the palette is stored in a bitmap - if (_resourceHandle.type() == 2) + if (_resourceHandle.type() == kResTypeBitmap) parseBitmapResource(_palette, NULL, NULL, NULL, &_palette, NULL); } @@ -152,7 +148,7 @@ bool AnimResource::load(uint32 fileHash) { unload(); _vm->_res->queryResource(fileHash, _resourceHandle); - if (!_resourceHandle.isValid() || _resourceHandle.type() != 4) + if (!_resourceHandle.isValid() || _resourceHandle.type() != kResTypeAnimation) return false; const byte *resourceData, *animList, *frameList; @@ -336,7 +332,7 @@ void TextResource::load(uint32 fileHash) { debug(2, "TextResource::load(%08X)", fileHash); unload(); _vm->_res->queryResource(fileHash, _resourceHandle); - if (_resourceHandle.isValid() && _resourceHandle.type() == 6) { + if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeText) { _vm->_res->loadResource(_resourceHandle); _textData = _resourceHandle.data(); _count = READ_LE_UINT32(_textData); @@ -371,7 +367,7 @@ void DataResource::load(uint32 fileHash) { uint32 dataSize = 0; unload(); _vm->_res->queryResource(fileHash, _resourceHandle); - if (_resourceHandle.isValid() && _resourceHandle.type() == 5) { + if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeData) { _vm->_res->loadResource(_resourceHandle); data = _resourceHandle.data(); dataSize = _resourceHandle.size(); diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index 996579bc41..c6f63bf92d 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -31,6 +31,17 @@ namespace Neverhood { +enum { + kResTypeBitmap = 2, + kResTypePalette = 3, + kResTypeAnimation = 4, + kResTypeData = 5, + kResTypeText = 6, + kResTypeSound = 7, + kResTypeMusic = 8, + kResTypeVideo = 10 +}; + class SpriteResource { public: SpriteResource(NeverhoodEngine *vm); diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 7470acbdad..290b8fa23c 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -72,7 +72,7 @@ void SmackerScene::nextVideo() { uint32 smackerFileHash = _fileHashList[_fileHashListIndex]; ResourceHandle resourceHandle; _vm->_res->queryResource(smackerFileHash, resourceHandle); - if (resourceHandle.type() != 10) { + if (resourceHandle.type() != kResTypeVideo) { // Not a Smacker file _vm->_screen->setSmackerDecoder(NULL); sendMessage(_parentModule, 0x1009, 0); diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 3cbcf96354..13ac87fbad 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -128,8 +128,8 @@ MusicItem::~MusicItem() { } SoundItem::SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash, - bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, - bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown) + bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, + bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown) : _soundResource(NULL), _nameHash(nameHash), _soundFileHash(soundFileHash), _playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0), _playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown), @@ -546,7 +546,8 @@ void AudioResourceMan::removeSound(int16 soundIndex) { void AudioResourceMan::loadSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (!soundItem->_data && soundItem->_resourceHandle.isValid()) { + if (!soundItem->_data && soundItem->_resourceHandle.isValid() && + (soundItem->_resourceHandle.type() == kResTypeSound || soundItem->_resourceHandle.type() == kResTypeMusic)) { // TODO Check if it's a sound resource _vm->_res->loadResource(soundItem->_resourceHandle); soundItem->_data = soundItem->_resourceHandle.data(); -- cgit v1.2.3 From f945448c7ba3884cded68314a13aa2132603121d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 09:50:10 +0000 Subject: NEVERHOOD: Change graphic resource draw method to get a Surface instead of separate pixels/pitch - Merge SpriteResource::load and load2 --- engines/neverhood/graphics.cpp | 12 ++++++------ engines/neverhood/menumodule.cpp | 6 +++--- engines/neverhood/module2200.cpp | 8 +++++--- engines/neverhood/resource.cpp | 32 +++++++++++++------------------- engines/neverhood/resource.h | 9 ++++----- engines/neverhood/sprite.cpp | 4 ++-- 6 files changed, 33 insertions(+), 38 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 5426821133..913954532f 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -71,7 +71,7 @@ void BaseSurface::drawSpriteResource(SpriteResource &spriteResource) { if (spriteResource.getDimensions().width <= _drawRect.width && spriteResource.getDimensions().height <= _drawRect.height) { clear(); - spriteResource.draw((byte*)_surface->pixels, _surface->pitch, false, false); + spriteResource.draw(_surface, false, false); ++_version; } } @@ -85,7 +85,7 @@ void BaseSurface::drawSpriteResourceEx(SpriteResource &spriteResource, bool flip _drawRect.height = height; if (_surface) { clear(); - spriteResource.draw((byte*)_surface->pixels, _surface->pitch, flipX, flipY); + spriteResource.draw(_surface, flipX, flipY); ++_version; } } @@ -99,7 +99,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, if (_surface) { clear(); if (frameIndex < animResource.getFrameCount()) { - animResource.draw(frameIndex, (byte*)_surface->pixels, _surface->pitch, flipX, flipY); + animResource.draw(frameIndex, _surface, flipX, flipY); ++_version; } } @@ -107,7 +107,7 @@ void BaseSurface::drawAnimResource(AnimResource &animResource, uint frameIndex, void BaseSurface::drawMouseCursorResource(MouseCursorResource &mouseCursorResource, int frameNum) { if (frameNum < 3) { - mouseCursorResource.draw(frameNum, (byte*)_surface->pixels, _surface->pitch); + mouseCursorResource.draw(frameNum, _surface); ++_version; } } @@ -156,7 +156,7 @@ FontSurface::FontSurface(NeverhoodEngine *vm, uint32 fileHash, uint charsPerRow, _firstChar(firstChar), _charWidth(charWidth), _charHeight(charHeight), _tracking(NULL) { SpriteResource fontSpriteResource(_vm); - fontSpriteResource.load2(fileHash); + fontSpriteResource.load(fileHash, true); drawSpriteResourceEx(fontSpriteResource, false, false, 0, 0); } @@ -200,7 +200,7 @@ FontSurface *FontSurface::createFontSurface(NeverhoodEngine *vm, uint32 fileHash uint16 charWidth = fontData.getPoint(calcHash("meCharWidth")).x; uint16 charHeight = fontData.getPoint(calcHash("meCharHeight")).x; NPointArray *tracking = fontData.getPointArray(calcHash("meTracking")); - fontSprite.load2(fileHash); + fontSprite.load(fileHash, true); fontSurface = new FontSurface(vm, tracking, 16, numRows, firstChar, charWidth, charHeight); fontSurface->drawSpriteResourceEx(fontSprite, false, false, 0, 0); return fontSurface; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 2b7561c431..71b216b940 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -540,7 +540,7 @@ void TextEditWidget::onClick() { void TextEditWidget::addSprite() { SpriteResource cursorSpriteResource(_vm); - _spriteResource.load2(_fileHash); + _spriteResource.load(_fileHash, true); createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); @@ -550,7 +550,7 @@ void TextEditWidget::addSprite() { 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface); _textLabelWidget->addSprite(); - cursorSpriteResource.load2(_cursorFileHash); + cursorSpriteResource.load(_cursorFileHash, true); _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); _cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); _cursorSurface->setVisible(true); @@ -704,7 +704,7 @@ void SavegameListBox::onClick() { } void SavegameListBox::addSprite() { - _spriteResource.load2(_bgFileHash); + _spriteResource.load(_bgFileHash, true); createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); _parentScene->addSprite(this); diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index a53bd468f4..9f5f7fb9ee 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2139,15 +2139,17 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C); _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); - spriteResource.load2(0x08100289); + spriteResource.load(0x08100289, true); _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); - spriteResource.load2(!getGlobalVar(V_COLUMN_BACK_NAME) ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] : getGlobalVar(V_COLUMN_BACK_NAME)); + spriteResource.load(!getGlobalVar(V_COLUMN_BACK_NAME) + ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] + : getGlobalVar(V_COLUMN_BACK_NAME), true); _topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); - spriteResource.load2(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6]); + spriteResource.load(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6], true); _bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); SetUpdateHandler(&Scene2208::update); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 6cbbf12a25..3350b80e61 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -37,8 +37,10 @@ SpriteResource::~SpriteResource() { unload(); } -void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) { +void SpriteResource::draw(Graphics::Surface *destSurface, bool flipX, bool flipY) { if (_pixels) { + byte *dest = (byte*)destSurface->pixels; + const int destPitch = destSurface->pitch; if (_rle) unpackSpriteRle(_pixels, _dimensions.width, _dimensions.height, dest, destPitch, flipX, flipY); else @@ -46,27 +48,15 @@ void SpriteResource::draw(byte *dest, int destPitch, bool flipX, bool flipY) { } } -bool SpriteResource::load(uint32 fileHash) { +bool SpriteResource::load(uint32 fileHash, bool doLoadPosition) { debug(2, "SpriteResource::load(%08X)", fileHash); - // TODO: Later merge with load2 and make the mode a parameter unload(); _vm->_res->queryResource(fileHash, _resourceHandle); if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) { _vm->_res->loadResource(_resourceHandle); const byte *spriteData = _resourceHandle.data(); - parseBitmapResource(spriteData, &_rle, &_dimensions, NULL, NULL, &_pixels); - } - return _pixels != NULL; -} - -bool SpriteResource::load2(uint32 fileHash) { - debug(2, "SpriteResource::load2(%08X)", fileHash); - unload(); - _vm->_res->queryResource(fileHash, _resourceHandle); - if (_resourceHandle.isValid() && _resourceHandle.type() == kResTypeBitmap) { - _vm->_res->loadResource(_resourceHandle); - const byte *spriteData = _resourceHandle.data(); - parseBitmapResource(spriteData, &_rle, &_dimensions, &_position, NULL, &_pixels); + NPoint *position = doLoadPosition ? &_position : NULL; + parseBitmapResource(spriteData, &_rle, &_dimensions, position, NULL, &_pixels); } return _pixels != NULL; } @@ -128,8 +118,10 @@ AnimResource::~AnimResource() { unload(); } -void AnimResource::draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY) { +void AnimResource::draw(uint frameIndex, Graphics::Surface *destSurface, bool flipX, bool flipY) { const AnimFrameInfo frameInfo = _frames[frameIndex]; + byte *dest = (byte*)destSurface->pixels; + const int destPitch = destSurface->pitch; _currSpriteData = _spriteData + frameInfo.spriteDataOffs; _width = frameInfo.drawOffset.width; _height = frameInfo.drawOffset.height; @@ -305,10 +297,12 @@ NDrawRect& MouseCursorResource::getRect() { return _rect; } -void MouseCursorResource::draw(int frameNum, byte *dest, int destPitch) { +void MouseCursorResource::draw(int frameNum, Graphics::Surface *destSurface) { if (_cursorSprite.getPixels()) { - int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment + const int sourcePitch = (_cursorSprite.getDimensions().width + 3) & 0xFFFC; // 4 byte alignment + const int destPitch = destSurface->pitch; const byte *source = _cursorSprite.getPixels() + _cursorNum * (sourcePitch * 32) + frameNum * 32; + byte *dest = (byte*)destSurface->pixels; for (int16 yc = 0; yc < 32; yc++) { memcpy(dest, source, 32); source += sourcePitch; diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index c6f63bf92d..e2609b6fd2 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -46,9 +46,8 @@ class SpriteResource { public: SpriteResource(NeverhoodEngine *vm); ~SpriteResource(); - void draw(byte *dest, int destPitch, bool flipX, bool flipY); - bool load(uint32 fileHash); - bool load2(uint32 fileHash); + void draw(Graphics::Surface *destSurface, bool flipX, bool flipY); + bool load(uint32 fileHash, bool doLoadPosition = false); void unload(); const NDimensions& getDimensions() { return _dimensions; } NPoint& getPosition() { return _position; } @@ -90,7 +89,7 @@ class AnimResource { public: AnimResource(NeverhoodEngine *vm); ~AnimResource(); - void draw(uint frameIndex, byte *dest, int destPitch, bool flipX, bool flipY); + void draw(uint frameIndex, Graphics::Surface *destSurface, bool flipX, bool flipY); bool load(uint32 fileHash); void unload(); void clear(); @@ -120,7 +119,7 @@ public: void load(uint32 fileHash); void unload(); NDrawRect& getRect(); - void draw(int frameNum, byte *dest, int destPitch); + void draw(int frameNum, Graphics::Surface *destSurface); int getCursorNum() const { return _cursorNum; } void setCursorNum(int cursorNum) { _cursorNum = cursorNum; } protected: diff --git a/engines/neverhood/sprite.cpp b/engines/neverhood/sprite.cpp index 241912286c..45d131fd3c 100644 --- a/engines/neverhood/sprite.cpp +++ b/engines/neverhood/sprite.cpp @@ -116,7 +116,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, int objectPriority) StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority, int16 x, int16 y) : Sprite(vm, 0), _spriteResource(vm) { - _spriteResource.load2(fileHash); + _spriteResource.load(fileHash, true); createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); _x = x == kDefPosition ? _spriteResource.getPosition().x : x; _y = y == kDefPosition ? _spriteResource.getPosition().y : y; @@ -126,7 +126,7 @@ StaticSprite::StaticSprite(NeverhoodEngine *vm, uint32 fileHash, int surfacePrio } void StaticSprite::loadSprite(uint32 fileHash, uint flags, int surfacePriority, int16 x, int16 y) { - _spriteResource.load2(fileHash); + _spriteResource.load(fileHash, true); if (!_surface) createSurface(surfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); if (flags & kSLFDefDrawOffset) -- cgit v1.2.3 From df43b8bd6889ebf39c1642b9648b10d64cc5fcdd Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 10:04:17 +0000 Subject: NEVERHOOD: Move Scene2804::initCrystalColors() to GameModule::initCrystalColorsPuzzle() - Add Scene::isMessageList2, only used in Scene2101 --- engines/neverhood/gamemodule.cpp | 40 ++++++++++++++++++++++++++++++++++++++ engines/neverhood/gamemodule.h | 1 + engines/neverhood/module2100.cpp | 2 +- engines/neverhood/module2800.cpp | 42 +--------------------------------------- engines/neverhood/module2800.h | 1 - engines/neverhood/scene.cpp | 4 ++++ engines/neverhood/scene.h | 1 + 7 files changed, 48 insertions(+), 43 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index c9310571f0..6ba3e98261 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -284,6 +284,46 @@ void GameModule::initCubeSymbolsPuzzle() { } } +void GameModule::initCrystalColorsPuzzle() { + // TODO Maybe move this into the GameModule so all puzzle init code is together + if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) { + TextResource textResource(_vm); + const char *textStart, *textEnd; + textResource.load(0x46691611); + textStart = textResource.getString(0, textEnd); + for (uint index = 0; index < 5; index++) { + char colorLetter = (byte)textStart[index]; + byte correctColorNum = 0, misalignedColorNum; + switch (colorLetter) { + case 'B': + correctColorNum = 4; + break; + case 'G': + correctColorNum = 3; + break; + case 'O': + correctColorNum = 1; + break; + case 'R': + correctColorNum = 0; + break; + case 'V': + correctColorNum = 5; + break; + case 'Y': + correctColorNum = 2; + break; + } + do { + misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1); + } while (misalignedColorNum == correctColorNum); + setSubVar(VA_GOOD_CRYSTAL_COLORS, index, correctColorNum); + setSubVar(VA_CURR_CRYSTAL_COLORS, index, misalignedColorNum); + } + setGlobalVar(V_CRYSTAL_COLORS_INIT, 1); + } +} + uint32 GameModule::getCurrRadioMusicFileHash() { uint musicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); return (musicIndex % 5 != 0) ? 0 : kRadioMusicFileHashes[CLIP(musicIndex / 5, 0, 17)]; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 93373a1a3f..ee6b000533 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -51,6 +51,7 @@ public: void initCannonSymbolsPuzzle(); void initCodeSymbolsPuzzle(); void initCubeSymbolsPuzzle(); + void initCrystalColorsPuzzle(); uint32 getCurrRadioMusicFileHash(); protected: Entity *_prevChildObject; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 423f93c325..5b5f5af2f3 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -285,7 +285,7 @@ void Scene2101::update() { } } } - } else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 /* TODO ! && _messageList2 != 0x004B8F48*/) + } else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 && !isMessageList2(0x004B8F48)) setMessageList2(0x004B8F50); Scene::update(); } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 7c7c097696..214e65e62e 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -1734,7 +1734,7 @@ Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _countdown3(0), _beamStatus(0), _isSolved(false), _isWorking(false) { - initCrystalColors(); + _vm->gameModule()->initCrystalColorsPuzzle(); SetMessageHandler(&Scene2804::handleMessage); SetUpdateHandler(&Scene2804::update); @@ -1841,46 +1841,6 @@ void Scene2804::update() { } -void Scene2804::initCrystalColors() { - // TODO Maybe move this into the GameModule so all puzzle init code is together - if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) { - TextResource textResource(_vm); - const char *textStart, *textEnd; - textResource.load(0x46691611); - textStart = textResource.getString(0, textEnd); - for (uint index = 0; index < 5; index++) { - char colorLetter = (byte)textStart[index]; - byte correctColorNum = 0, misalignedColorNum; - switch (colorLetter) { - case 'B': - correctColorNum = 4; - break; - case 'G': - correctColorNum = 3; - break; - case 'O': - correctColorNum = 1; - break; - case 'R': - correctColorNum = 0; - break; - case 'V': - correctColorNum = 5; - break; - case 'Y': - correctColorNum = 2; - break; - } - do { - misalignedColorNum = _vm->_rnd->getRandomNumber(6 - 1); - } while (misalignedColorNum == correctColorNum); - setSubVar(VA_GOOD_CRYSTAL_COLORS, index, correctColorNum); - setSubVar(VA_CURR_CRYSTAL_COLORS, index, misalignedColorNum); - } - setGlobalVar(V_CRYSTAL_COLORS_INIT, 1); - } -} - Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index 1dd7bca402..a341c23944 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -273,7 +273,6 @@ protected: Sprite *_ssCrystalButtons[5]; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void initCrystalColors(); }; class Scene2805 : public Scene { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index c22683ae37..1f2f479ba3 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -381,6 +381,10 @@ bool Scene::setMessageList2(MessageList *messageList, bool canAcceptInput, bool return false; } +bool Scene::isMessageList2(uint32 id) { + return _messageList2 == _vm->_staticData->getMessageList(id); +} + void Scene::processMessageList() { debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymanBusy = %d", _isMessageListBusy, _isKlaymanBusy); diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index f03275f569..39455c78fa 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -204,6 +204,7 @@ protected: void setMessageList(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false); bool setMessageList2(uint32 id, bool canAcceptInput = true, bool doConvertMessages = false); bool setMessageList2(MessageList *messageList, bool canAcceptInput = true, bool doConvertMessages = false); + bool isMessageList2(uint32 id); void processMessageList(); void setRectList(uint32 id); void setRectList(RectList *rectList); -- cgit v1.2.3 From e43184f4f248b38a19d67f1b1b427e19fcd56de5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 10:40:51 +0000 Subject: NEVERHOOD: Remove obsolete TODOs --- engines/neverhood/module2200.cpp | 4 ---- engines/neverhood/module2500.cpp | 2 -- engines/neverhood/module2800.cpp | 2 -- engines/neverhood/resource.cpp | 5 +---- engines/neverhood/sound.cpp | 2 -- 5 files changed, 1 insertion(+), 14 deletions(-) diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 9f5f7fb9ee..ebe0f81291 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -2170,9 +2170,6 @@ Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) _background->getSurface()->getSysRect().y = _backgroundScrollY; - // TODO Screen.yOffset = _backgroundScrollY; - // TODO Scene2208_sub409080 (creates background Sprites via the text, doesn't seem to be used?) - } Scene2208::~Scene2208() { @@ -2219,7 +2216,6 @@ void Scene2208::update() { _background->getSurface()->getSysRect().y = _backgroundScrollY; } - // TODO Screen.yOffset = _backgroundScrollY; Scene::update(); } diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 4aefbfb8a9..ba5b140767 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -25,8 +25,6 @@ namespace Neverhood { -// TODO Maybe move these to the DAT - static const uint32 kScene2505StaticSprites[] = { 0x4000A226, 0 }; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 214e65e62e..dd02d59a6d 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -1667,7 +1667,6 @@ uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam &pa void AsScene2804BeamCoil::show() { _ssBeamCoilBody->setVisible(true); - // TODO _ssBeamCoilBody->updatePosition(); -> show() setVisible(true); startAnimation(0x00494891, 0, -1); playSound(0); @@ -1680,7 +1679,6 @@ void AsScene2804BeamCoil::hide() { SetMessageHandler(&AsScene2804BeamCoil::handleMessage); setVisible(false); _ssBeamCoilBody->setVisible(false); - // TODO _ssBeamCoilBody->updatePosition(); -> hide() _vm->_soundMan->stopSound(0xEF56B094); } diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 3350b80e61..869bebbcfe 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -100,11 +100,8 @@ void PaletteResource::unload() { } void PaletteResource::copyPalette(byte *destPalette) { - if (_palette) { + if (_palette) memcpy(destPalette, _palette, 1024); - } else { - // TODO?: buildDefaultPalette(palette); - } } // AnimResource diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 13ac87fbad..d055107596 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -276,7 +276,6 @@ void SoundMan::setSoundVolume(uint32 soundFileHash, int volume) { } void SoundMan::update() { - // TODO Check if active for (uint i = 0; i < _soundItems.size(); ++i) { SoundItem *soundItem = _soundItems[i]; @@ -548,7 +547,6 @@ void AudioResourceMan::loadSound(int16 soundIndex) { AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; if (!soundItem->_data && soundItem->_resourceHandle.isValid() && (soundItem->_resourceHandle.type() == kResTypeSound || soundItem->_resourceHandle.type() == kResTypeMusic)) { - // TODO Check if it's a sound resource _vm->_res->loadResource(soundItem->_resourceHandle); soundItem->_data = soundItem->_resourceHandle.data(); } -- cgit v1.2.3 From 9ea07e0925d679e8f3e33aa34c0403c3f58d5f1c Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 15:16:30 +0000 Subject: NEVERHOOD: Add tables for Scene2706 --- devtools/create_neverhood/tables.h | 4 ++++ dists/engine-data/neverhood.dat | Bin 25296 -> 25416 bytes 2 files changed, 4 insertions(+) diff --git a/devtools/create_neverhood/tables.h b/devtools/create_neverhood/tables.h index 1218526463..ea39aa807d 100644 --- a/devtools/create_neverhood/tables.h +++ b/devtools/create_neverhood/tables.h @@ -710,5 +710,9 @@ static const uint32 sceneInfo2700Offsets[] = { 0x004B02A0, // Scene2508 0x004B02C8, + // Scene2706 + 0x004B22A0, + 0x004B22C4, + 0x004B22E8, 0 }; diff --git a/dists/engine-data/neverhood.dat b/dists/engine-data/neverhood.dat index e384ee11c5..dc95c00965 100644 Binary files a/dists/engine-data/neverhood.dat and b/dists/engine-data/neverhood.dat differ -- cgit v1.2.3 From 18ce1acc12fe0bd58b6b93b8accb840cd7244356 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 15:19:28 +0000 Subject: NEVERHOOD: Rework the car track scenes in Module2500 and Module2700 - Move findClosestTrack code from several scenes to new Tracks::findTrackPoint - Remove const kScene2706 arrays and use it from the dat instead --- engines/neverhood/gamemodule.cpp | 8 +- engines/neverhood/module1600.cpp | 20 +++- engines/neverhood/module1600.h | 6 ++ engines/neverhood/module2500.cpp | 82 +++++++--------- engines/neverhood/module2500.h | 7 +- engines/neverhood/module2700.cpp | 203 +++++++++++++++++---------------------- engines/neverhood/module2700.h | 20 ++-- engines/neverhood/staticdata.cpp | 2 +- engines/neverhood/staticdata.h | 2 +- 9 files changed, 166 insertions(+), 184 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 6ba3e98261..d037cf55c0 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -399,10 +399,10 @@ void GameModule::startup() { setGlobalVar(V_SHRINK_LIGHTS_ON, 0); // <<gameState().which = 0; - _vm->gameState().sceneNum = 14; - createModule(2700, -1); + _vm->gameState().sceneNum = 0; + createModule(2500, -1); #endif #if 0 _vm->gameState().sceneNum = 5; @@ -417,7 +417,7 @@ void GameModule::startup() { _vm->gameState().sceneNum = 5; createModule(2200, -1); #endif -#if 1 +#if 0 _vm->gameState().sceneNum = 7; createModule(2200, -1); #endif diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index a2f06e1197..54f715a0c5 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -988,6 +988,24 @@ void AsCommonCarConnector::update() { AnimatedSprite::update(); } +void Tracks::findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, + DataResource &dataResource) { + const uint trackCount = size(); + minMatchTrackIndex = -1; + minMatchDistance = 640; + for (uint trackIndex = 0; trackIndex < trackCount; trackIndex++) { + NPointArray *pointList = dataResource.getPointArray((*this)[trackIndex]->trackPointsName); + for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { + NPoint testPt = (*pointList)[pointIndex]; + int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); + if (distance < minMatchDistance) { + minMatchTrackIndex = trackIndex; + minMatchDistance = distance; + } + } + } +} + Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _asCar(NULL), _countdown1(0) { @@ -1082,7 +1100,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) // NOTE: Not in the else because 'which' is set to 1 in the true branch if (which == 1) { - // Klaymen entering riding the car + // Klaymen riding the car _vm->gameState().which = 1; _dataResource.load(0x003C0492); _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 0c567e693f..eaf8986637 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -121,6 +121,12 @@ protected: void update(); }; +class Tracks : public Common::Array { +public: + void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, + DataResource &dataResource); +}; + class Scene1608 : public Scene { public: Scene1608(NeverhoodEngine *vm, Module *parentModule, int which); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index ba5b140767..851ee61722 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -220,9 +220,9 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { - _sceneInfos[0] = _vm->_staticData->getSceneInfo2700(0x004B2628); - _sceneInfos[1] = _vm->_staticData->getSceneInfo2700(0x004B264C); - _sceneInfos[2] = _vm->_staticData->getSceneInfo2700(0x004B2670); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2628)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B264C)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2670)); setGlobalVar(V_CAR_DELTA_X, 1); SetUpdateHandler(&Scene2501::update); @@ -283,14 +283,13 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); insertSprite(_asCar); - _pointListsCount = 3; _newTrackIndex = -1; _dataResource.load(calcHash("Ashooded")); - _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); _asCar->setPathPoints(_trackPoints); - if (which >= 0 && _sceneInfos[_currTrackIndex]->which2 == which) { + if (which >= 0 && _tracks[_currTrackIndex]->which2 == which) { NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) @@ -331,7 +330,7 @@ void Scene2501::update() { _klayman = NULL; _carStatus = 0; } - updateKlaymanCliprect(); + updateKlaymanClipRect(); } void Scene2501::upCarAtHome() { @@ -341,13 +340,13 @@ void Scene2501::upCarAtHome() { sendMessage(_asCar, 0x200A, 0); SetUpdateHandler(&Scene2501::upGettingOutOfCar); } else { - findClosestTrack(_mouseClickPos); + moveCarToPoint(_mouseClickPos); SetMessageHandler(&Scene2501::hmRidingCar); SetUpdateHandler(&Scene2501::upRidingCar); } _mouseClicked = false; } - updateKlaymanCliprect(); + updateKlaymanClipRect(); } void Scene2501::upGettingOutOfCar() { @@ -368,13 +367,13 @@ void Scene2501::upGettingOutOfCar() { _klayman->handleUpdate(); _carStatus = 0; } - updateKlaymanCliprect(); + updateKlaymanClipRect(); } void Scene2501::upRidingCar() { Scene::update(); if (_mouseClicked) { - findClosestTrack(_mouseClickPos); + moveCarToPoint(_mouseClickPos); _mouseClicked = false; } } @@ -397,24 +396,24 @@ uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2005: - if (_sceneInfos[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) + if (_tracks[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) changeTrack(); - else if (_sceneInfos[_currTrackIndex]->which1 == 0) { + else if (_tracks[_currTrackIndex]->which1 == 0) { SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); sendMessage(_asCar, 0x200F, 1); - } else if (_sceneInfos[_currTrackIndex]->which1 > 0) - leaveScene(_sceneInfos[_currTrackIndex]->which1); + } else if (_tracks[_currTrackIndex]->which1 > 0) + leaveScene(_tracks[_currTrackIndex]->which1); break; case 0x2006: - if (_sceneInfos[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) + if (_tracks[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) changeTrack(); - else if (_sceneInfos[_currTrackIndex]->which2 == 0) { + else if (_tracks[_currTrackIndex]->which2 == 0) { SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); sendMessage(_asCar, 0x200F, 1); - } else if (_sceneInfos[_currTrackIndex]->which2 > 0) - leaveScene(_sceneInfos[_currTrackIndex]->which2); + } else if (_tracks[_currTrackIndex]->which2 > 0) + leaveScene(_tracks[_currTrackIndex]->which2); break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -436,34 +435,9 @@ uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Scene2501::changeTrack() { - _currTrackIndex = _newTrackIndex; - _trackPoints = _dataResource.getPointArray(_sceneInfos[_currTrackIndex]->pointListName); - _asCar->setPathPoints(_trackPoints); - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2002, 0); - sendPointMessage(_asCar, 0x2004, _clickPoint); - _newTrackIndex = -1; -} - -void Scene2501::findClosestTrack(NPoint &pt) { - // TODO NOTE This is uses with minor variations in other scenes, maybe merge them? - int minMatchDistance = 640; - int minMatchTrackIndex = -1; - // Find the track which contains a point closest to pt - for (int infoIndex = 0; infoIndex < _pointListsCount; infoIndex++) { - NPointArray *pointList = _dataResource.getPointArray(_sceneInfos[infoIndex]->pointListName); - for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { - NPoint testPt = (*pointList)[pointIndex]; - int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); - if (distance < minMatchDistance) { - minMatchTrackIndex = infoIndex; - minMatchDistance = distance; - } - } - } +void Scene2501::moveCarToPoint(NPoint &pt) { + int minMatchTrackIndex, minMatchDistance; + _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; _clickPoint = pt; @@ -477,7 +451,19 @@ void Scene2501::findClosestTrack(NPoint &pt) { } } -void Scene2501::updateKlaymanCliprect() { +void Scene2501::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2002, 0); + sendPointMessage(_asCar, 0x2004, _clickPoint); + _newTrackIndex = -1; +} + +void Scene2501::updateKlaymanClipRect() { if (_kmScene2501->getX() <= 211) _kmScene2501->setClipRect(0, 0, 640, 480); else diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index 38a1a431fa..9a7e9442f1 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -60,11 +60,10 @@ protected: Sprite *_asIdleCarLower; Sprite *_asIdleCarFull; Klayman *_kmScene2501; + Tracks _tracks; NPointArray *_trackPoints; - SceneInfo2700 *_sceneInfos[3]; int _currTrackIndex; NPoint _clickPoint; - int _pointListsCount; int _newTrackIndex; int _carStatus; bool _klaymanInCar; @@ -75,9 +74,9 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); - void findClosestTrack(NPoint &pt); + void moveCarToPoint(NPoint &pt); void changeTrack(); - void updateKlaymanCliprect(); + void updateKlaymanClipRect(); }; class SsScene2504Button : public StaticSprite { diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index d4f46ea2ca..07273f9a07 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -528,12 +528,12 @@ uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Enti return messageResult; } -void Module2700::createScene2703(int which, uint32 sceneInfoId) { - _childObject = new Scene2703(_vm, this, which, sceneInfoId); +void Module2700::createScene2703(int which, uint32 trackInfoId) { + _childObject = new Scene2703(_vm, this, which, trackInfoId); } -void Module2700::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { - _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); +void Module2700::createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { + _childObject = new Scene2704(_vm, this, which, trackInfoId, value, staticSprites, clipRect); } static const NPoint kCarShadowOffsets[] = { @@ -619,11 +619,11 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; NRect clipRect; - SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(0x004B2240); + SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(0x004B2240); setGlobalVar(V_CAR_DELTA_X, 1); - setBackground(sceneInfo->bgFilename); - setPalette(sceneInfo->bgFilename); + setBackground(tracks->bgFilename); + setPalette(tracks->bgFilename); _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); insertScreenMouse(0x08B08180); @@ -631,8 +631,8 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x1E086325, 1200); clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); - if (sceneInfo->bgShadowFilename) { - _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); + if (tracks->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -644,10 +644,10 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) } _asCarConnector = insertSprite(_asCar); - _which1 = sceneInfo->which1; - _which2 = sceneInfo->which2; - _dataResource.load(sceneInfo->dataResourceFilename); - _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); + _which1 = tracks->which1; + _which2 = tracks->which2; + _dataResource.load(tracks->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); _asCar->setPathPoints(_trackPoints); if (which == _which2) { @@ -713,18 +713,8 @@ uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity return 0; } -static const uint32 kScene2702Infos[2][3] = { - {0x004B5F68, 0x004B5F8C, 0x004B5FB0}, - {0x004B5FD8, 0x004B5FFC, 0x004B6020} -}; - - Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1), _count(3) { - - for (int i = 0; i < 2; i++) - for (int j = 0; j < 3; j++) - _sceneInfos[i][j] = _vm->_staticData->getSceneInfo2700(kScene2702Infos[i][j]); + : Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1) { SetMessageHandler(&Scene2702::handleMessage); SetUpdateHandler(&Scene2702::update); @@ -746,38 +736,48 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) _dataResource.load(0x04310014); if (which == 1) { - _currSceneInfos = _sceneInfos[1]; + _isUpperTrack = false; _currTrackIndex = 1; } else if (which == 2) { - _currSceneInfos = _sceneInfos[1]; + _isUpperTrack = false; _currTrackIndex = 2; _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); _isInLight = false; } else if (which == 3) { - _currSceneInfos = _sceneInfos[0]; + _isUpperTrack = true; _currTrackIndex = 0; } else if (which == 4) { - _currSceneInfos = _sceneInfos[0]; + _isUpperTrack = true; _currTrackIndex = 2; _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); _isInLight = false; } else if (which == 5) { - _currSceneInfos = _sceneInfos[0]; + _isUpperTrack = true; _currTrackIndex = 1; _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); _isInLight = false; } else { - _currSceneInfos = _sceneInfos[1]; + _isUpperTrack = false; _currTrackIndex = 0; } - _trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName); + if (_isUpperTrack) { + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F68)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F8C)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FB0)); + } else { + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FD8)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FFC)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B6020)); + } + + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); _asCar->setPathPoints(_trackPoints); - if (which == _currSceneInfos[_currTrackIndex]->which2) { + if (which == _tracks[_currTrackIndex]->which2) { sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); sendMessage(_asCar, 0x2007, 150); } else { @@ -808,21 +808,21 @@ uint32 Scene2702::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - findClosestTrack(param.asPoint()); + moveCarToPoint(param.asPoint()); break; case 0x2005: if (_newTrackIndex >= 0) { - if (_currSceneInfos[_currTrackIndex]->which1 < 0) + if (_tracks[_currTrackIndex]->which1 < 0) changeTrack(); - } else if (_currSceneInfos[_currTrackIndex]->which1 >= 0) - leaveScene(_currSceneInfos[_currTrackIndex]->which1); + } else if (_tracks[_currTrackIndex]->which1 >= 0) + leaveScene(_tracks[_currTrackIndex]->which1); break; case 0x2006: if (_newTrackIndex >= 0) { - if (_currSceneInfos[_currTrackIndex]->which2 < 0) + if (_tracks[_currTrackIndex]->which2 < 0) changeTrack(); - } else if (_currSceneInfos[_currTrackIndex]->which2 >= 0) - leaveScene(_currSceneInfos[_currTrackIndex]->which2); + } else if (_tracks[_currTrackIndex]->which2 >= 0) + leaveScene(_tracks[_currTrackIndex]->which2); break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -831,25 +831,13 @@ uint32 Scene2702::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -void Scene2702::findClosestTrack(NPoint pt) { - int minMatchTrackIndex = -1; - int minMatchDistance = 640; - // Find the track which contains a point closest to pt - for (int infoIndex = 0; infoIndex < _count; infoIndex++) { - NPointArray *pointList = _dataResource.getPointArray(_currSceneInfos[infoIndex]->pointListName); - for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { - NPoint testPt = (*pointList)[pointIndex]; - int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); - if (distance < minMatchDistance) { - minMatchTrackIndex = infoIndex; - minMatchDistance = distance; - } - } - } +void Scene2702::moveCarToPoint(NPoint pt) { + int minMatchTrackIndex, minMatchDistance; + _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; _newTrackDestX = pt.x; - if (_currSceneInfos == _sceneInfos[0]) { + if (_isUpperTrack) { if (_currTrackIndex == 0) sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); else @@ -866,9 +854,9 @@ void Scene2702::findClosestTrack(NPoint pt) { void Scene2702::changeTrack() { _currTrackIndex = _newTrackIndex; - _trackPoints = _dataResource.getPointArray(_currSceneInfos[_currTrackIndex]->pointListName); + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); _asCar->setPathPoints(_trackPoints); - if (_currSceneInfos == _sceneInfos[0]) { + if (_isUpperTrack) { if (_currTrackIndex == 0) sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); else @@ -881,25 +869,25 @@ void Scene2702::changeTrack() { _newTrackIndex = -1; } -Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId) +Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId) : Scene(vm, parentModule) { - SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); + SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId); SetMessageHandler(&Scene2703::handleMessage); SetUpdateHandler(&Scene2703::update); - setBackground(sceneInfo->bgFilename); - setPalette(sceneInfo->bgFilename); + setBackground(tracks->bgFilename); + setPalette(tracks->bgFilename); _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); addEntity(_palette); - insertScreenMouse(sceneInfo->mouseCursorFilename); + insertScreenMouse(tracks->mouseCursorFilename); _palStatus = 2; - if (sceneInfo->bgShadowFilename) { - _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); + if (tracks->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -912,10 +900,10 @@ Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint3 } _asCarConnector = insertSprite(_asCar); - _which1 = sceneInfo->which1; - _which2 = sceneInfo->which2; - _dataResource.load(sceneInfo->dataResourceFilename); - _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); + _which1 = tracks->which1; + _which2 = tracks->which2; + _dataResource.load(tracks->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); _asCar->setPathPoints(_trackPoints); if (which == _which2) { @@ -994,31 +982,31 @@ uint32 Scene2703::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, +Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) : Scene(vm, parentModule) { - SceneInfo2700 *sceneInfo = _vm->_staticData->getSceneInfo2700(sceneInfoId); + SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId); SetMessageHandler(&Scene2704::handleMessage); SetUpdateHandler(&Scene2704::update); - setBackground(sceneInfo->bgFilename); - setPalette(sceneInfo->bgFilename); + setBackground(tracks->bgFilename); + setPalette(tracks->bgFilename); - if (sceneInfo->exPaletteFilename1) - _palette->addPalette(sceneInfo->exPaletteFilename1, 0, 65, 0); + if (tracks->exPaletteFilename1) + _palette->addPalette(tracks->exPaletteFilename1, 0, 65, 0); - if (sceneInfo->exPaletteFilename2) - _palette->addPalette(sceneInfo->exPaletteFilename2, 65, 31, 65); + if (tracks->exPaletteFilename2) + _palette->addPalette(tracks->exPaletteFilename2, 65, 31, 65); while (staticSprites && *staticSprites) insertStaticSprite(*staticSprites++, 1100); - insertScreenMouse(sceneInfo->mouseCursorFilename); + insertScreenMouse(tracks->mouseCursorFilename); - if (sceneInfo->bgShadowFilename) { - _ssTrackShadowBackground = createSprite(sceneInfo->bgShadowFilename); + if (tracks->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); addEntity(_ssTrackShadowBackground); _asCar = insertSprite(this, 320, 240); _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); @@ -1031,10 +1019,10 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 } _asCarConnector = insertSprite(_asCar); - _which1 = sceneInfo->which1; - _which2 = sceneInfo->which2; - _dataResource.load(sceneInfo->dataResourceFilename); - _trackPoints = _dataResource.getPointArray(sceneInfo->pointListName); + _which1 = tracks->which1; + _which2 = tracks->which2; + _dataResource.load(tracks->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); _asCar->setPathPoints(_trackPoints); if (which == _which2) { @@ -1093,17 +1081,14 @@ uint32 Scene2704::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -static const int kSceneInfo2706Count = 3; -static const struct { const char *pointListName; int which1, which2; } kSceneInfo2706[] = { - {"me06slotSlotPath2", 4, -1}, - {"me06slotSlotPath3", -1, 6}, - {"me06slotSlotPath4", -1, 5} -}; - Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule), _newTrackIndex(-1) { SetMessageHandler(&Scene2706::handleMessage); + + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22A0)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22C4)); + _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22E8)); setBackground(0x18808B88); setPalette(0x18808B88); @@ -1131,10 +1116,10 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) else _currTrackIndex = 0; - _trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName)); + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); _asCar->setPathPoints(_trackPoints); - if (which == kSceneInfo2706[_currTrackIndex].which2) { + if (which == _tracks[_currTrackIndex]->which2) { sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); if (which == 5) sendMessage(_asCar, 0x2007, 50); @@ -1154,21 +1139,21 @@ uint32 Scene2706::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - findClosestTrack(param.asPoint()); + moveCarToPoint(param.asPoint()); break; case 0x2005: if (_newTrackIndex >= 0) { - if (kSceneInfo2706[_currTrackIndex].which1 < 0) + if (_tracks[_currTrackIndex]->which1 < 0) changeTrack(); - } else if (kSceneInfo2706[_currTrackIndex].which1 >= 0) - leaveScene(kSceneInfo2706[_currTrackIndex].which1); + } else if (_tracks[_currTrackIndex]->which1 >= 0) + leaveScene(_tracks[_currTrackIndex]->which1); break; case 0x2006: if (_newTrackIndex >= 0) { - if (kSceneInfo2706[_currTrackIndex].which2 < 0) + if (_tracks[_currTrackIndex]->which2 < 0) changeTrack(); - } else if (kSceneInfo2706[_currTrackIndex].which2 >= 0) - leaveScene(kSceneInfo2706[_currTrackIndex].which2); + } else if (_tracks[_currTrackIndex]->which2 >= 0) + leaveScene(_tracks[_currTrackIndex]->which2); break; case 0x200D: sendMessage(_parentModule, 0x200D, 0); @@ -1177,21 +1162,9 @@ uint32 Scene2706::handleMessage(int messageNum, const MessageParam ¶m, Entit return 0; } -void Scene2706::findClosestTrack(NPoint pt) { - int minMatchTrackIndex = -1; - int minMatchDistance = 640; - // Find the track which contains a point closest to pt - for (int infoIndex = 0; infoIndex < kSceneInfo2706Count; infoIndex++) { - NPointArray *pointList = _dataResource.getPointArray(calcHash(kSceneInfo2706[infoIndex].pointListName)); - for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { - NPoint testPt = (*pointList)[pointIndex]; - int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); - if (distance < minMatchDistance) { - minMatchTrackIndex = infoIndex; - minMatchDistance = distance; - } - } - } +void Scene2706::moveCarToPoint(NPoint pt) { + int minMatchTrackIndex, minMatchDistance; + _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { _newTrackIndex = minMatchTrackIndex; _newTrackDestX = pt.x; @@ -1207,7 +1180,7 @@ void Scene2706::findClosestTrack(NPoint pt) { void Scene2706::changeTrack() { _currTrackIndex = _newTrackIndex; - _trackPoints = _dataResource.getPointArray(calcHash(kSceneInfo2706[_currTrackIndex].pointListName)); + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); _asCar->setPathPoints(_trackPoints); if (_currTrackIndex == 0) sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h index 68c471c58d..5861c2e4b5 100644 --- a/engines/neverhood/module2700.h +++ b/engines/neverhood/module2700.h @@ -45,8 +45,8 @@ protected: void createScene(int sceneNum, int which); void updateScene(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene2703(int which, uint32 sceneInfoId); - void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); + void createScene2703(int which, uint32 trackInfoId); + void createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); }; class SsCommonTrackShadowBackground : public StaticSprite { @@ -108,21 +108,20 @@ protected: Sprite *_asCarTrackShadow; Sprite *_asCarConnectorShadow; int16 _newTrackDestX; - int _currTrackIndex, _newTrackIndex; - int _count; bool _isInLight; - SceneInfo2700 *_sceneInfos[2][3]; - SceneInfo2700 **_currSceneInfos; + int _currTrackIndex, _newTrackIndex; + bool _isUpperTrack; + Tracks _tracks; NPointArray *_trackPoints; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void findClosestTrack(NPoint pt); + void moveCarToPoint(NPoint pt); void changeTrack(); }; class Scene2703 : public Scene { public: - Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId); + Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId); protected: AsCommonCar *_asCar; Sprite *_ssTrackShadowBackground; @@ -139,7 +138,7 @@ protected: class Scene2704 : public Scene { public: - Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 sceneInfoId, int16 value, + Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); protected: AsCommonCar *_asCar; @@ -166,9 +165,10 @@ protected: Sprite *_asCarConnectorShadow; int16 _newTrackDestX; int _currTrackIndex, _newTrackIndex; + Tracks _tracks; NPointArray *_trackPoints; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void findClosestTrack(NPoint pt); + void moveCarToPoint(NPoint pt); void changeTrack(); }; diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 31f9f5e014..cf272e573a 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -149,7 +149,7 @@ void StaticData::load(const char *filename) { sceneInfo2700->bgFilename = fd.readUint32LE(); sceneInfo2700->bgShadowFilename = fd.readUint32LE(); sceneInfo2700->dataResourceFilename = fd.readUint32LE(); - sceneInfo2700->pointListName = fd.readUint32LE(); + sceneInfo2700->trackPointsName = fd.readUint32LE(); sceneInfo2700->rectListName = fd.readUint32LE(); sceneInfo2700->exPaletteFilename2 = fd.readUint32LE(); sceneInfo2700->exPaletteFilename1 = fd.readUint32LE(); diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index f9a8b71f80..874a8a52e0 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -82,7 +82,7 @@ struct SceneInfo2700 { uint32 bgFilename; uint32 bgShadowFilename; uint32 dataResourceFilename; - uint32 pointListName; + uint32 trackPointsName; uint32 rectListName; uint32 exPaletteFilename2; uint32 exPaletteFilename1; -- cgit v1.2.3 From 5bf8fb3e96506a758b59d67f68fa6c255e77456a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 15:24:13 +0000 Subject: NEVERHOOD: Remove more old TODOs --- engines/neverhood/module2700.cpp | 2 +- engines/neverhood/neverhood.cpp | 1 - engines/neverhood/scene.cpp | 3 +-- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index 07273f9a07..f1cb571421 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -505,7 +505,7 @@ void Module2700::updateScene() { _vm->gameModule()->initRadioPuzzle(); _musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME); _vm->_soundMan->addMusic(0x42212411, _musicFileHash); - _vm->_soundMan->startMusic(_musicFileHash, 0, 2/*TODO ??? */); + _vm->_soundMan->startMusic(_musicFileHash, 0, 2); _vm->_soundMan->addSound(0x42212411, 0x44014282); _vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0); _raidoMusicInitialized = true; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index c0c6185ec9..fcaf756f84 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -93,7 +93,6 @@ Common::Error NeverhoodEngine::run() { _gameModule = new GameModule(this); - // TODO Check if this can actually be false... _isSaveAllowed = true; if (isDemo()) { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 1f2f479ba3..30b93bdada 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -302,8 +302,7 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s case 0x101E: // Show the mouse cursor if (_mouseCursorWasVisible && _mouseCursor) { - _mouseCursor->getSurface()->setVisible(true);//CHECKME?!? - // TODO sendMessage(_mouseCursor, 0x4002, g_Screen->_mousePos); + _mouseCursor->getSurface()->setVisible(true); } break; case 0x1022: -- cgit v1.2.3 From 51979c4f3f522c6d98290b93de7ecad141980b42 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 17 Jan 2013 15:41:17 +0000 Subject: NEVERHOOD: Rename SceneInfo2700 to TrackInfo --- engines/neverhood/module1600.h | 2 +- engines/neverhood/module2500.cpp | 6 +++--- engines/neverhood/module2700.cpp | 24 ++++++++++++------------ engines/neverhood/staticdata.cpp | 40 ++++++++++++++++++++-------------------- engines/neverhood/staticdata.h | 6 +++--- 5 files changed, 39 insertions(+), 39 deletions(-) diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index eaf8986637..6bffb2d9ed 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -121,7 +121,7 @@ protected: void update(); }; -class Tracks : public Common::Array { +class Tracks : public Common::Array { public: void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, DataResource &dataResource); diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index 851ee61722..f5894e9dad 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -220,9 +220,9 @@ void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, con Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) : Scene(vm, parentModule) { - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2628)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B264C)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B2670)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2628)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B264C)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2670)); setGlobalVar(V_CAR_DELTA_X, 1); SetUpdateHandler(&Scene2501::update); diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index f1cb571421..b5db9118d9 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -619,7 +619,7 @@ Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) Sprite *tempSprite; NRect clipRect; - SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(0x004B2240); + TrackInfo *tracks = _vm->_staticData->getTrackInfo(0x004B2240); setGlobalVar(V_CAR_DELTA_X, 1); setBackground(tracks->bgFilename); @@ -765,13 +765,13 @@ Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) } if (_isUpperTrack) { - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F68)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5F8C)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FB0)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F68)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F8C)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FB0)); } else { - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FD8)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B5FFC)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B6020)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FD8)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FFC)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B6020)); } _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); @@ -872,7 +872,7 @@ void Scene2702::changeTrack() { Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId) : Scene(vm, parentModule) { - SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId); + TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId); SetMessageHandler(&Scene2703::handleMessage); SetUpdateHandler(&Scene2703::update); @@ -986,7 +986,7 @@ Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint3 const uint32 *staticSprites, const NRect *clipRect) : Scene(vm, parentModule) { - SceneInfo2700 *tracks = _vm->_staticData->getSceneInfo2700(trackInfoId); + TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId); SetMessageHandler(&Scene2704::handleMessage); SetUpdateHandler(&Scene2704::update); @@ -1086,9 +1086,9 @@ Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene2706::handleMessage); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22A0)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22C4)); - _tracks.push_back(_vm->_staticData->getSceneInfo2700(0x004B22E8)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22A0)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22C4)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22E8)); setBackground(0x18808B88); setPalette(0x18808B88); diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index cf272e573a..45935945f7 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -140,23 +140,23 @@ void StaticData::load(const char *filename) { _hallOfRecordsInfoItems[id] = hallOfRecordsInfo; } - // Load SceneInfo2700 items - uint32 sceneInfo2700ItemsCount = fd.readUint32LE(); - debug("sceneInfo2700ItemsCount: %d", sceneInfo2700ItemsCount); - for (uint32 i = 0; i < sceneInfo2700ItemsCount; i++) { - SceneInfo2700 *sceneInfo2700 = new SceneInfo2700(); + // Load TrackInfo items + uint32 trackInfoItemsCount = fd.readUint32LE(); + debug("trackInfoItemsCount: %d", trackInfoItemsCount); + for (uint32 i = 0; i < trackInfoItemsCount; i++) { + TrackInfo *trackInfo = new TrackInfo(); uint32 id = fd.readUint32LE(); - sceneInfo2700->bgFilename = fd.readUint32LE(); - sceneInfo2700->bgShadowFilename = fd.readUint32LE(); - sceneInfo2700->dataResourceFilename = fd.readUint32LE(); - sceneInfo2700->trackPointsName = fd.readUint32LE(); - sceneInfo2700->rectListName = fd.readUint32LE(); - sceneInfo2700->exPaletteFilename2 = fd.readUint32LE(); - sceneInfo2700->exPaletteFilename1 = fd.readUint32LE(); - sceneInfo2700->mouseCursorFilename = fd.readUint32LE(); - sceneInfo2700->which1 = fd.readUint16LE(); - sceneInfo2700->which2 = fd.readUint16LE(); - _sceneInfo2700Items[id] = sceneInfo2700; + trackInfo->bgFilename = fd.readUint32LE(); + trackInfo->bgShadowFilename = fd.readUint32LE(); + trackInfo->dataResourceFilename = fd.readUint32LE(); + trackInfo->trackPointsName = fd.readUint32LE(); + trackInfo->rectListName = fd.readUint32LE(); + trackInfo->exPaletteFilename2 = fd.readUint32LE(); + trackInfo->exPaletteFilename1 = fd.readUint32LE(); + trackInfo->mouseCursorFilename = fd.readUint32LE(); + trackInfo->which1 = fd.readUint16LE(); + trackInfo->which2 = fd.readUint16LE(); + _trackInfoItems[id] = trackInfo; } } @@ -191,10 +191,10 @@ HallOfRecordsInfo *StaticData::getHallOfRecordsInfoItem(uint32 id) { return _hallOfRecordsInfoItems[id]; } -SceneInfo2700 *StaticData::getSceneInfo2700(uint32 id) { - if (!_sceneInfo2700Items[id]) - error("StaticData::getSceneInfo2700() SceneInfo2700 with id %08X not found", id); - return _sceneInfo2700Items[id]; +TrackInfo *StaticData::getTrackInfo(uint32 id) { + if (!_trackInfoItems[id]) + error("StaticData::getTrackInfo() TrackInfo with id %08X not found", id); + return _trackInfoItems[id]; } } // End of namespace Neverhood diff --git a/engines/neverhood/staticdata.h b/engines/neverhood/staticdata.h index 874a8a52e0..b1cab3bfcd 100644 --- a/engines/neverhood/staticdata.h +++ b/engines/neverhood/staticdata.h @@ -77,7 +77,7 @@ struct HallOfRecordsInfo { byte count; }; -struct SceneInfo2700 { +struct TrackInfo { uint32 id; uint32 bgFilename; uint32 bgShadowFilename; @@ -101,14 +101,14 @@ public: MessageList *getMessageList(uint32 id); NavigationList *getNavigationList(uint32 id); HallOfRecordsInfo *getHallOfRecordsInfoItem(uint32 id); - SceneInfo2700 *getSceneInfo2700(uint32 id); + TrackInfo *getTrackInfo(uint32 id); protected: Common::HashMap _hitRectLists; Common::HashMap _rectLists; Common::HashMap _messageLists; Common::HashMap _navigationLists; Common::HashMap _hallOfRecordsInfoItems; - Common::HashMap _sceneInfo2700Items; + Common::HashMap _trackInfoItems; }; } // End of namespace Neverhood -- cgit v1.2.3 From eea9dbe2da9c6195431f234e89671fffd1e1ac29 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 18 Jan 2013 08:44:38 +0000 Subject: NEVERHOOD: Minor renaming and cleanup --- engines/neverhood/module.cpp | 11 ++++------- engines/neverhood/module.h | 4 ++-- engines/neverhood/module1000.cpp | 19 +++++++++---------- engines/neverhood/module1000.h | 2 +- engines/neverhood/smackerscene.cpp | 10 +++++----- engines/neverhood/smackerscene.h | 4 ++-- 6 files changed, 23 insertions(+), 27 deletions(-) diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 36607d771f..93b4134f6b 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -67,7 +67,6 @@ uint32 Module::handleMessage(int messageNum, const MessageParam ¶m, Entity * } NavigationScene *Module::navigationScene() { - // Not so nice return (NavigationScene*)_childObject; } @@ -76,19 +75,17 @@ void Module::createNavigationScene(uint32 navigationListId, int navigationIndex, _childObject = new NavigationScene(_vm, this, navigationListId, navigationIndex, itemsTypes); } -void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort) { - SmackerScene *smackerScene; +void Module::createSmackerScene(uint32 fileHash, bool doubleSurface, bool canSkip, bool canAbort) { _sceneType = kSceneTypeSmacker; - smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort); + SmackerScene *smackerScene = new SmackerScene(_vm, this, doubleSurface, canSkip, canAbort); smackerScene->setFileHash(fileHash); smackerScene->nextVideo(); _childObject = smackerScene; } -void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort) { - SmackerScene *smackerScene; +void Module::createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool canSkip, bool canAbort) { _sceneType = kSceneTypeSmacker; - smackerScene = new SmackerScene(_vm, this, doubleSurface, flag1, canAbort); + SmackerScene *smackerScene = new SmackerScene(_vm, this, doubleSurface, canSkip, canAbort); smackerScene->setFileHashList(fileHashList); smackerScene->nextVideo(); _childObject = smackerScene; diff --git a/engines/neverhood/module.h b/engines/neverhood/module.h index b91b9deff6..e98012cbea 100644 --- a/engines/neverhood/module.h +++ b/engines/neverhood/module.h @@ -58,8 +58,8 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); NavigationScene *navigationScene(); void createNavigationScene(uint32 navigationListId, int navigationIndex, const byte *itemsTypes = NULL); - void createSmackerScene(uint32 fileHash, bool doubleSurface, bool flag1, bool canAbort); - void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool flag1, bool canAbort); + void createSmackerScene(uint32 fileHash, bool doubleSurface, bool canSkip, bool canAbort); + void createSmackerScene(const uint32 *fileHashList, bool doubleSurface, bool canSkip, bool canAbort); void createStaticScene(uint32 backgroundFileHash, uint32 cursorFileHash); void createDemoScene(); bool updateChild(); diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 12fe408040..0329f589a4 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -1175,7 +1175,7 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); - _class599 = insertStaticSprite(0x316C4BB4, 1015); + _ssCeiling = insertStaticSprite(0x316C4BB4, 1015); if (which < 0) { // Restoring game @@ -1231,11 +1231,11 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2()); - _asRing1 = insertSprite(this, false, 258, 191, _class599->getDrawRect().y, false); - _asRing2 = insertSprite(this, false, 297, 189, _class599->getDrawRect().y, false); - _asRing3 = insertSprite(this, true, 370, 201, _class599->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR)); - _asRing4 = insertSprite(this, false, 334, 191, _class599->getDrawRect().y, false); - _asRing5 = insertSprite(this, false, 425, 184, _class599->getDrawRect().y, false); + _asRing1 = insertSprite(this, false, 258, 191, _ssCeiling->getDrawRect().y, false); + _asRing2 = insertSprite(this, false, 297, 189, _ssCeiling->getDrawRect().y, false); + _asRing3 = insertSprite(this, true, 370, 201, _ssCeiling->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR)); + _asRing4 = insertSprite(this, false, 334, 191, _ssCeiling->getDrawRect().y, false); + _asRing5 = insertSprite(this, false, 425, 184, _ssCeiling->getDrawRect().y, false); _asDoor = insertSprite(tempClipRect); tempSprite = insertSprite(); @@ -1374,11 +1374,11 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asOutsideDoorBackground, 0x4808, 0); break; case 0x8000: - setSpriteSurfacePriority(_class599, 995); + setSpriteSurfacePriority(_ssCeiling, 995); setSpriteSurfacePriority(_ssLadderArch, 995); break; case 0x8001: - setSpriteSurfacePriority(_class599, 1015); + setSpriteSurfacePriority(_ssCeiling, 1015); setSpriteSurfacePriority(_ssLadderArch, 1015); break; } @@ -1566,9 +1566,8 @@ uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entit Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) leaveScene(0); - } break; } return 0; diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 32228a20e7..2cc9a556dd 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -249,7 +249,7 @@ protected: Sprite *_ssLadderArchPart1; Sprite *_ssLadderArchPart2; Sprite *_ssLadderArchPart3; - Sprite *_class599; + Sprite *_ssCeiling; Sprite *_asKlaymanLadderHands; Sprite *_asKlaymanPeekHand; Sprite *_asOutsideDoorBackground; diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 290b8fa23c..20eebe2bc7 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -24,16 +24,16 @@ namespace Neverhood { -SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort) - : Scene(vm, parentModule), _doubleSurface(doubleSurface), _flag1(flag1), _canAbort(canAbort), _videoPlayedBefore(false), +SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool canSkip, bool canAbort) + : Scene(vm, parentModule), _doubleSurface(doubleSurface), _canSkip(canSkip), _canAbort(canAbort), _videoPlayedBefore(false), _fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) { - debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, flag1, canAbort); + debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort); // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) if (getGlobalVar(V_SMACKER_CAN_ABORT)) { - _flag1 = true; + _canSkip = true; _canAbort = true; } @@ -105,7 +105,7 @@ uint32 SmackerScene::handleMessage(int messageNum, const MessageParam ¶m, En uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0009: - if ((_videoPlayedBefore && _flag1) || (_canAbort && _flag1)) + if ((_videoPlayedBefore && _canSkip) || (_canAbort && _canSkip)) _playNextVideoFlag = true; break; case 0x000C: diff --git a/engines/neverhood/smackerscene.h b/engines/neverhood/smackerscene.h index 54de28a720..7ed2e0262b 100644 --- a/engines/neverhood/smackerscene.h +++ b/engines/neverhood/smackerscene.h @@ -31,14 +31,14 @@ namespace Neverhood { class SmackerScene : public Scene { public: - SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool flag1, bool canAbort); + SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubleSurface, bool canSkip, bool canAbort); virtual ~SmackerScene(); void setFileHash(uint32 fileHash); void setFileHashList(const uint32 *fileHashList); void nextVideo(); protected: bool _doubleSurface; - bool _flag1; + bool _canSkip; bool _canAbort; bool _videoPlayedBefore; bool _playNextVideoFlag; -- cgit v1.2.3 From e51bea9b4e4d2857b1225cdd7c0ebbe137b530ee Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 18 Jan 2013 19:00:28 +0000 Subject: NEVERHOOD: Don't load a DataResource if the same data is already loaded; this fixes a nasty bug in several scenes which use message lists from a DataResource --- engines/neverhood/gamemodule.cpp | 6 +++--- engines/neverhood/resource.cpp | 6 ++++-- engines/neverhood/scene.cpp | 11 ++++++++++- engines/neverhood/staticdata.cpp | 12 ++++++------ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index d037cf55c0..f22a0d12e5 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -400,9 +400,9 @@ void GameModule::startup() { // <<gameState().which = 0; - _vm->gameState().sceneNum = 0; - createModule(2500, -1); + _vm->gameState().which = 1; + _vm->gameState().sceneNum = 1; + createModule(1000, -1); #endif #if 0 _vm->gameState().sceneNum = 5; diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 869bebbcfe..269d13ded2 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -353,7 +353,9 @@ DataResource::~DataResource() { } void DataResource::load(uint32 fileHash) { - debug(2, "DataResource::load(%08X)", fileHash); + if (_resourceHandle.fileHash() == fileHash) + return; + debug("DataResource::load(%08X)", fileHash); const byte *data = NULL; uint32 dataSize = 0; unload(); @@ -497,7 +499,6 @@ void DataResource::load(uint32 fileHash) { } void DataResource::unload() { - _vm->_res->unloadResource(_resourceHandle); _directory.clear(); _points.clear(); for (Common::Array::iterator it = _pointArrays.begin(); it != _pointArrays.end(); ++it) @@ -516,6 +517,7 @@ void DataResource::unload() { for (Common::Array::iterator it = _drSubRectLists.begin(); it != _drSubRectLists.end(); ++it) delete (*it); _drSubRectLists.clear(); + _vm->_res->unloadResource(_resourceHandle); } NPoint DataResource::getPoint(uint32 nameHash) { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 30b93bdada..866b75d399 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -397,7 +397,16 @@ void Scene::processMessageList() { _messageListStatus = 0; } - if (_messageList && _klayman) { + if (_messageList && _klayman) { + +#if 0 + debug("MessageList: %p, %d", (void*)_messageList, _messageList->size()); + for (uint i = 0; i < _messageList->size(); ++i) { + if (i == _messageListIndex) debugN("**"); else debugN(" "); + debug("(%08X, %08X)", (*_messageList)[i].messageNum, (*_messageList)[i].messageValue); + } + debug("--------------------------------"); +#endif while (_messageList && _messageListIndex < _messageListCount && !_isKlaymanBusy) { uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; diff --git a/engines/neverhood/staticdata.cpp b/engines/neverhood/staticdata.cpp index 45935945f7..3f89c2236f 100644 --- a/engines/neverhood/staticdata.cpp +++ b/engines/neverhood/staticdata.cpp @@ -42,7 +42,7 @@ void StaticData::load(const char *filename) { // Load message lists uint32 messageListsCount = fd.readUint32LE(); - debug("messageListsCount: %d", messageListsCount); + debug(3, "messageListsCount: %d", messageListsCount); for (uint32 i = 0; i < messageListsCount; i++) { MessageList *messageList = new MessageList(); uint32 id = fd.readUint32LE(); @@ -58,7 +58,7 @@ void StaticData::load(const char *filename) { // Load rect lists uint32 rectListsCount = fd.readUint32LE(); - debug("rectListsCount: %d", rectListsCount); + debug(3, "rectListsCount: %d", rectListsCount); for (uint32 i = 0; i < rectListsCount; i++) { RectList *rectList = new RectList(); uint32 id = fd.readUint32LE(); @@ -87,7 +87,7 @@ void StaticData::load(const char *filename) { // Load hit rects uint32 hitRectListsCount = fd.readUint32LE(); - debug("hitRectListsCount: %d", hitRectListsCount); + debug(3, "hitRectListsCount: %d", hitRectListsCount); for (uint32 i = 0; i < hitRectListsCount; i++) { HitRectList *hitRectList = new HitRectList(); uint32 id = fd.readUint32LE(); @@ -106,7 +106,7 @@ void StaticData::load(const char *filename) { // Load navigation lists uint32 navigationListsCount = fd.readUint32LE(); - debug("navigationListsCount: %d", navigationListsCount); + debug(3, "navigationListsCount: %d", navigationListsCount); for (uint32 i = 0; i < navigationListsCount; i++) { NavigationList *navigationList = new NavigationList(); uint32 id = fd.readUint32LE(); @@ -127,7 +127,7 @@ void StaticData::load(const char *filename) { // Load HallOfRecordsInfo items uint32 hallOfRecordsInfoItemsCount = fd.readUint32LE(); - debug("hallOfRecordsInfoItemsCount: %d", hallOfRecordsInfoItemsCount); + debug(3, "hallOfRecordsInfoItemsCount: %d", hallOfRecordsInfoItemsCount); for (uint32 i = 0; i < hallOfRecordsInfoItemsCount; i++) { HallOfRecordsInfo *hallOfRecordsInfo = new HallOfRecordsInfo(); uint32 id = fd.readUint32LE(); @@ -142,7 +142,7 @@ void StaticData::load(const char *filename) { // Load TrackInfo items uint32 trackInfoItemsCount = fd.readUint32LE(); - debug("trackInfoItemsCount: %d", trackInfoItemsCount); + debug(3, "trackInfoItemsCount: %d", trackInfoItemsCount); for (uint32 i = 0; i < trackInfoItemsCount; i++) { TrackInfo *trackInfo = new TrackInfo(); uint32 id = fd.readUint32LE(); -- cgit v1.2.3 From 5ff11f00413d1adf1a5abf11e0f5d3db19945064 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 18 Jan 2013 19:49:28 +0000 Subject: NEVERHOOD: Rework the sound system - Move code from the manager classes to the sound/music classes --- engines/neverhood/neverhood.cpp | 2 +- engines/neverhood/sound.cpp | 685 +++++++++++++++++++++------------------- engines/neverhood/sound.h | 127 +++++--- 3 files changed, 447 insertions(+), 367 deletions(-) diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index fcaf756f84..d4b09844be 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -168,7 +168,7 @@ void NeverhoodEngine::mainLoop() { nextFrameTime = _screen->getNextFrameTime(); }; _soundMan->update(); - _audioResourceMan->update(); + _audioResourceMan->updateMusic(); _system->updateScreen(); _system->delayMillis(10); } diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index d055107596..9e0e572ca0 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -27,9 +27,6 @@ namespace Neverhood { -// TODO Put more stuff into the constructors/destructors of the item structs -// TODO Some parts are quite bad here, but my priority is to get sound working at all - SoundResource::SoundResource(NeverhoodEngine *vm) : _vm(vm), _soundIndex(-1) { } @@ -39,14 +36,16 @@ SoundResource::~SoundResource() { } bool SoundResource::isPlaying() { - return _soundIndex >= 0 && - _vm->_audioResourceMan->isSoundPlaying(_soundIndex); + AudioResourceManSoundItem *soundItem = getSoundItem(); + return soundItem ? soundItem->isPlaying() : false; } void SoundResource::load(uint32 fileHash) { unload(); _soundIndex = _vm->_audioResourceMan->addSound(fileHash); - _vm->_audioResourceMan->loadSound(_soundIndex); + AudioResourceManSoundItem *soundItem = getSoundItem(); + if (soundItem) + soundItem->loadSound(); } void SoundResource::unload() { @@ -62,32 +61,40 @@ void SoundResource::play(uint32 fileHash) { } void SoundResource::play() { - if (_soundIndex >= 0) - _vm->_audioResourceMan->playSound(_soundIndex, false); + AudioResourceManSoundItem *soundItem = getSoundItem(); + if (soundItem) + soundItem->playSound(false); } void SoundResource::stop() { - if (_soundIndex >= 0) - _vm->_audioResourceMan->stopSound(_soundIndex); + AudioResourceManSoundItem *soundItem = getSoundItem(); + if (soundItem) + soundItem->stopSound(); } void SoundResource::setVolume(int16 volume) { - if (_soundIndex >= 0) - _vm->_audioResourceMan->setSoundVolume(_soundIndex, volume); + AudioResourceManSoundItem *soundItem = getSoundItem(); + if (soundItem) + soundItem->setVolume(volume); } void SoundResource::setPan(int16 pan) { - if (_soundIndex >= 0) - _vm->_audioResourceMan->setSoundPan(_soundIndex, pan); + AudioResourceManSoundItem *soundItem = getSoundItem(); + if (soundItem) + soundItem->setPan(pan); +} + +AudioResourceManSoundItem *SoundResource::getSoundItem() { + return _vm->_audioResourceMan->getSoundItem(_soundIndex); } MusicResource::MusicResource(NeverhoodEngine *vm) : _vm(vm), _musicIndex(-1) { } -bool MusicResource::isPlaying() { - return _musicIndex >= 0 && - _vm->_audioResourceMan->isMusicPlaying(_musicIndex); +bool MusicResource::isPlaying() { + AudioResourceManMusicItem *musicItem = getMusicItem(); + return musicItem && musicItem->isPlaying(); } void MusicResource::load(uint32 fileHash) { @@ -96,29 +103,46 @@ void MusicResource::load(uint32 fileHash) { } void MusicResource::unload() { - if (_musicIndex >= 0) { - _vm->_audioResourceMan->unloadMusic(_musicIndex); + AudioResourceManMusicItem *musicItem = getMusicItem(); + if (musicItem) { + musicItem->unloadMusic(); _musicIndex = -1; } } void MusicResource::play(int16 fadeVolumeStep) { - if (_musicIndex >= 0) - _vm->_audioResourceMan->playMusic(_musicIndex, fadeVolumeStep); + AudioResourceManMusicItem *musicItem = getMusicItem(); + if (musicItem) + musicItem->playMusic(fadeVolumeStep); } void MusicResource::stop(int16 fadeVolumeStep) { - if (_musicIndex >= 0) - _vm->_audioResourceMan->stopMusic(_musicIndex, fadeVolumeStep); + AudioResourceManMusicItem *musicItem = getMusicItem(); + if (musicItem) + musicItem->stopMusic(fadeVolumeStep); } void MusicResource::setVolume(int16 volume) { - if (_musicIndex >= 0) - _vm->_audioResourceMan->setMusicVolume(_musicIndex, volume); + AudioResourceManMusicItem *musicItem = getMusicItem(); + if (musicItem) + musicItem->setVolume(volume); } -MusicItem::MusicItem() - : _musicResource(NULL) { +AudioResourceManMusicItem *MusicResource::getMusicItem() { + return _vm->_audioResourceMan->getMusicItem(_musicIndex); +} + +MusicItem::MusicItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 musicFileHash) + : _vm(vm), _musicResource(NULL) { + + _groupNameHash = groupNameHash; + _fileHash = musicFileHash; + _play = false; + _stop = false; + _fadeVolumeStep = 0; + _countdown = 24; + _musicResource = new MusicResource(_vm); + _musicResource->load(musicFileHash); } MusicItem::~MusicItem() { @@ -127,10 +151,39 @@ MusicItem::~MusicItem() { delete _musicResource; } -SoundItem::SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash, +void MusicItem::startMusic(int16 countdown, int16 fadeVolumeStep) { + _play = true; + _stop = false; + _countdown = countdown; + _fadeVolumeStep = fadeVolumeStep; +} + +void MusicItem::stopMusic(int16 countdown, int16 fadeVolumeStep) { + _play = false; + _stop = true; + _countdown = countdown; + _fadeVolumeStep = fadeVolumeStep; +} + +void MusicItem::update() { + if (_countdown) { + --_countdown; + } else if (_play && !_musicResource->isPlaying()) { + debug(1, "MusicItem: play music %08X (fade %d)", _fileHash, _fadeVolumeStep); + _musicResource->play(_fadeVolumeStep); + _fadeVolumeStep = 0; + } else if (_stop) { + debug(1, "MusicItem: stop music %08X (fade %d)", _fileHash, _fadeVolumeStep); + _musicResource->stop(_fadeVolumeStep); + _fadeVolumeStep = 0; + _stop = false; + } +} + +SoundItem::SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFileHash, bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown) - : _soundResource(NULL), _nameHash(nameHash), _soundFileHash(soundFileHash), + : _vm(vm), _soundResource(NULL), _groupNameHash(groupNameHash), _fileHash(soundFileHash), _playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0), _playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown), _playLooping(false), _currCountdown(currCountdown) { @@ -145,28 +198,70 @@ SoundItem::~SoundItem() { delete _soundResource; } +void SoundItem::setSoundParams(bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, + int16 firstMinCountdown, int16 firstMaxCountdown) { + + _playOnceAfterCountdown = false; + _playLooping = false; + _playOnceAfterRandomCountdown = playOnceAfterRandomCountdown; + if (minCountdown > 0) + _minCountdown = minCountdown; + if (maxCountdown > 0) + _maxCountdown = maxCountdown; + if (firstMinCountdown >= firstMaxCountdown) + _currCountdown = firstMinCountdown; + else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown) + _currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown); +} + +void SoundItem::playSoundLooping() { + _playOnceAfterRandomCountdown = false; + _playOnceAfterCountdown = false; + _playLooping = true; +} + +void SoundItem::stopSound() { + _playOnceAfterRandomCountdown = false; + _playOnceAfterCountdown = false; + _playLooping = false; + _soundResource->stop(); +} + +void SoundItem::setVolume(int volume) { + _soundResource->setVolume(volume); +} + +void SoundItem::update() { + if (_playOnceAfterCountdown) { + if (_currCountdown == 0) { + _currCountdown = _initialCountdown; + } else if (--_currCountdown == 0) { + _soundResource->play(); + } + } else if (_playOnceAfterRandomCountdown) { + if (_currCountdown == 0) { + if (_minCountdown > 0 && _maxCountdown > 0 && _minCountdown < _maxCountdown) + _currCountdown = _vm->_rnd->getRandomNumberRng(_minCountdown, _maxCountdown); + } else if (--_currCountdown == 0) { + _soundResource->play(); + } + } else if (_playLooping && !_soundResource->isPlaying()) { + _soundResource->play(); // TODO Looping parameter? + } +} + // SoundMan SoundMan::SoundMan(NeverhoodEngine *vm) - : _vm(vm), - _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) { + : _vm(vm), _soundIndex1(-1), _soundIndex2(-1), _soundIndex3(-1) { } SoundMan::~SoundMan() { // TODO Clean up } -void SoundMan::addMusic(uint32 nameHash, uint32 musicFileHash) { - MusicItem *musicItem = new MusicItem(); - musicItem->_nameHash = nameHash; - musicItem->_musicFileHash = musicFileHash; - musicItem->_play = false; - musicItem->_stop = false; - musicItem->_fadeVolumeStep = 0; - musicItem->_countdown = 24; - musicItem->_musicResource = new MusicResource(_vm); - musicItem->_musicResource->load(musicFileHash); - addMusicItem(musicItem); +void SoundMan::addMusic(uint32 groupNameHash, uint32 musicFileHash) { + addMusicItem(new MusicItem(_vm, groupNameHash, musicFileHash)); } void SoundMan::deleteMusic(uint32 musicFileHash) { @@ -183,32 +278,23 @@ void SoundMan::deleteMusic(uint32 musicFileHash) { void SoundMan::startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) { MusicItem *musicItem = getMusicItemByHash(musicFileHash); - if (musicItem) { - musicItem->_play = true; - musicItem->_stop = false; - musicItem->_countdown = countdown; - musicItem->_fadeVolumeStep = fadeVolumeStep; - } + if (musicItem) + musicItem->startMusic(countdown, fadeVolumeStep); } void SoundMan::stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep) { MusicItem *musicItem = getMusicItemByHash(musicFileHash); - if (musicItem) { - musicItem->_play = false; - musicItem->_stop = true; - musicItem->_countdown = countdown; - musicItem->_fadeVolumeStep = fadeVolumeStep; - } + if (musicItem) + musicItem->stopMusic(countdown, fadeVolumeStep); } -void SoundMan::addSound(uint32 nameHash, uint32 soundFileHash) { - SoundItem *soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 50, 600, false, 0, false, 0); - addSoundItem(soundItem); +void SoundMan::addSound(uint32 groupNameHash, uint32 soundFileHash) { + addSoundItem(new SoundItem(_vm, groupNameHash, soundFileHash, false, 50, 600, false, 0, false, 0)); } -void SoundMan::addSoundList(uint32 nameHash, const uint32 *soundFileHashList) { +void SoundMan::addSoundList(uint32 groupNameHash, const uint32 *soundFileHashList) { while (*soundFileHashList) - addSound(nameHash, *soundFileHashList++); + addSound(groupNameHash, *soundFileHashList++); } void SoundMan::deleteSound(uint32 soundFileHash) { @@ -227,19 +313,9 @@ void SoundMan::setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCoun int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown) { SoundItem *soundItem = getSoundItemByHash(soundFileHash); - if (soundItem) { - soundItem->_playOnceAfterCountdown = false; - soundItem->_playLooping = false; - soundItem->_playOnceAfterRandomCountdown = playOnceAfterRandomCountdown; - if (minCountdown > 0) - soundItem->_minCountdown = minCountdown; - if (maxCountdown > 0) - soundItem->_maxCountdown = maxCountdown; - if (firstMinCountdown >= firstMaxCountdown) - soundItem->_currCountdown = firstMinCountdown; - else if (firstMinCountdown > 0 && firstMaxCountdown > 0 && firstMinCountdown < firstMaxCountdown) - soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(firstMinCountdown, firstMaxCountdown); - } + if (soundItem) + soundItem->setSoundParams(playOnceAfterRandomCountdown, minCountdown, maxCountdown, + firstMinCountdown, firstMaxCountdown); } void SoundMan::setSoundListParams(const uint32 *soundFileHashList, bool playOnceAfterRandomCountdown, @@ -252,120 +328,84 @@ void SoundMan::setSoundListParams(const uint32 *soundFileHashList, bool playOnce void SoundMan::playSoundLooping(uint32 soundFileHash) { SoundItem *soundItem = getSoundItemByHash(soundFileHash); - if (soundItem) { - soundItem->_playOnceAfterRandomCountdown = false; - soundItem->_playOnceAfterCountdown = false; - soundItem->_playLooping = true; - } + if (soundItem) + soundItem->playSoundLooping(); } void SoundMan::stopSound(uint32 soundFileHash) { SoundItem *soundItem = getSoundItemByHash(soundFileHash); - if (soundItem) { - soundItem->_playOnceAfterRandomCountdown = false; - soundItem->_playOnceAfterCountdown = false; - soundItem->_playLooping = false; - soundItem->_soundResource->stop(); - } + if (soundItem) + soundItem->stopSound(); } void SoundMan::setSoundVolume(uint32 soundFileHash, int volume) { SoundItem *soundItem = getSoundItemByHash(soundFileHash); if (soundItem) - soundItem->_soundResource->setVolume(volume); + soundItem->setVolume(volume); } void SoundMan::update() { for (uint i = 0; i < _soundItems.size(); ++i) { SoundItem *soundItem = _soundItems[i]; - if (soundItem) { - if (soundItem->_playOnceAfterCountdown) { - if (soundItem->_currCountdown == 0) { - soundItem->_currCountdown = soundItem->_initialCountdown; - } else if (--soundItem->_currCountdown == 0) { - soundItem->_soundResource->play(); - } - } else if (soundItem->_playOnceAfterRandomCountdown) { - if (soundItem->_currCountdown == 0) { - if (soundItem->_minCountdown > 0 && soundItem->_maxCountdown > 0 && soundItem->_minCountdown < soundItem->_maxCountdown) - soundItem->_currCountdown = _vm->_rnd->getRandomNumberRng(soundItem->_minCountdown, soundItem->_maxCountdown); - } else if (--soundItem->_currCountdown == 0) { - soundItem->_soundResource->play(); - } - } else if (soundItem->_playLooping && !soundItem->_soundResource->isPlaying()) { - soundItem->_soundResource->play(); // TODO Looping parameter? - } - } + if (soundItem) + soundItem->update(); } for (uint i = 0; i < _musicItems.size(); ++i) { MusicItem *musicItem = _musicItems[i]; - if (musicItem) { - if (musicItem->_countdown) { - --musicItem->_countdown; - } else if (musicItem->_play && !musicItem->_musicResource->isPlaying()) { - debug(1, "SoundMan: play music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); - musicItem->_musicResource->play(musicItem->_fadeVolumeStep); - musicItem->_fadeVolumeStep = 0; - } else if (musicItem->_stop) { - debug(1, "SoundMan: stop music %08X (fade %d)", musicItem->_musicFileHash, musicItem->_fadeVolumeStep); - musicItem->_musicResource->stop(musicItem->_fadeVolumeStep); - musicItem->_fadeVolumeStep = 0; - musicItem->_stop = false; - } - } + if (musicItem) + musicItem->update(); } } -void SoundMan::deleteGroup(uint32 nameHash) { - deleteMusicGroup(nameHash); - deleteSoundGroup(nameHash); +void SoundMan::deleteGroup(uint32 groupNameHash) { + deleteMusicGroup(groupNameHash); + deleteSoundGroup(groupNameHash); } -void SoundMan::deleteMusicGroup(uint32 nameHash) { +void SoundMan::deleteMusicGroup(uint32 groupNameHash) { for (uint index = 0; index < _musicItems.size(); ++index) { MusicItem *musicItem = _musicItems[index]; - if (musicItem && musicItem->_nameHash == nameHash) { + if (musicItem && musicItem->getGroupNameHash() == groupNameHash) { delete musicItem; _musicItems[index] = NULL; } } } -void SoundMan::deleteSoundGroup(uint32 nameHash) { +void SoundMan::deleteSoundGroup(uint32 groupNameHash) { - if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->_nameHash == nameHash) { + if (_soundIndex1 != -1 && _soundItems[_soundIndex1]->getGroupNameHash() == groupNameHash) { deleteSoundByIndex(_soundIndex1); _soundIndex1 = -1; } - if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->_nameHash == nameHash) { + if (_soundIndex2 != -1 && _soundItems[_soundIndex2]->getGroupNameHash() == groupNameHash) { deleteSoundByIndex(_soundIndex2); _soundIndex2 = -1; } for (uint index = 0; index < _soundItems.size(); ++index) - if (_soundItems[index] && _soundItems[index]->_nameHash == nameHash) + if (_soundItems[index] && _soundItems[index]->getGroupNameHash() == groupNameHash) deleteSoundByIndex(index); } -void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown) { +void SoundMan::playTwoSounds(uint32 groupNameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown) { - SoundItem *soundItem; int16 currCountdown1 = _initialCountdown; int16 currCountdown2 = _initialCountdown / 2; if (_soundIndex1 != -1) { - currCountdown1 = _soundItems[_soundIndex1]->_currCountdown; + currCountdown1 = _soundItems[_soundIndex1]->getCurrCountdown(); deleteSoundByIndex(_soundIndex1); _soundIndex1 = -1; } if (_soundIndex2 != -1) { - currCountdown2 = _soundItems[_soundIndex2]->_currCountdown; + currCountdown2 = _soundItems[_soundIndex2]->getCurrCountdown(); deleteSoundByIndex(_soundIndex2); _soundIndex2 = -1; } @@ -374,24 +414,22 @@ void SoundMan::playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soun _initialCountdown = initialCountdown; if (soundFileHash1 != 0) { - soundItem = new SoundItem(_vm, nameHash, soundFileHash1, false, 0, 0, + SoundItem *soundItem = new SoundItem(_vm, groupNameHash, soundFileHash1, false, 0, 0, _playOnceAfterCountdown, _initialCountdown, false, currCountdown1); - soundItem->_soundResource->setVolume(80); + soundItem->setVolume(80); _soundIndex1 = addSoundItem(soundItem); } if (soundFileHash2 != 0) { - soundItem = new SoundItem(_vm, nameHash, soundFileHash2, false, 0, 0, + SoundItem *soundItem = new SoundItem(_vm, groupNameHash, soundFileHash2, false, 0, 0, _playOnceAfterCountdown, _initialCountdown, false, currCountdown2); - soundItem->_soundResource->setVolume(80); + soundItem->setVolume(80); _soundIndex2 = addSoundItem(soundItem); } } -void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) { - - SoundItem *soundItem; +void SoundMan::playSoundThree(uint32 groupNameHash, uint32 soundFileHash) { if (_soundIndex3 != -1) { deleteSoundByIndex(_soundIndex3); @@ -399,8 +437,7 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) { } if (soundFileHash != 0) { - soundItem = new SoundItem(_vm, nameHash, soundFileHash, false, 0, 0, - false, _initialCountdown3, false, 0); + SoundItem *soundItem = new SoundItem(_vm, groupNameHash, soundFileHash, false, 0, 0, false, _initialCountdown3, false, 0); _soundIndex3 = addSoundItem(soundItem); } @@ -408,28 +445,28 @@ void SoundMan::playSoundThree(uint32 nameHash, uint32 soundFileHash) { void SoundMan::setTwoSoundsPlayFlag(bool playOnceAfterCountdown) { if (_soundIndex1 != -1) - _soundItems[_soundIndex1]->_playOnceAfterCountdown = playOnceAfterCountdown; + _soundItems[_soundIndex1]->setPlayOnceAfterCountdown(playOnceAfterCountdown); if (_soundIndex2 != -1) - _soundItems[_soundIndex2]->_playOnceAfterCountdown = playOnceAfterCountdown; + _soundItems[_soundIndex2]->setPlayOnceAfterCountdown(playOnceAfterCountdown); _playOnceAfterCountdown = playOnceAfterCountdown; } void SoundMan::setSoundThreePlayFlag(bool playOnceAfterCountdown) { if (_soundIndex3 != -1) - _soundItems[_soundIndex3]->_playOnceAfterCountdown = playOnceAfterCountdown; + _soundItems[_soundIndex3]->setPlayOnceAfterCountdown(playOnceAfterCountdown); _playOnceAfterCountdown3 = playOnceAfterCountdown; } MusicItem *SoundMan::getMusicItemByHash(uint32 musicFileHash) { for (uint i = 0; i < _musicItems.size(); ++i) - if (_musicItems[i] && _musicItems[i]->_musicFileHash == musicFileHash) + if (_musicItems[i] && _musicItems[i]->getFileHash() == musicFileHash) return _musicItems[i]; return NULL; } SoundItem *SoundMan::getSoundItemByHash(uint32 soundFileHash) { for (uint i = 0; i < _soundItems.size(); ++i) - if (_soundItems[i] && _soundItems[i]->_soundFileHash == soundFileHash) + if (_soundItems[i] && _soundItems[i]->getFileHash() == soundFileHash) return _soundItems[i]; return NULL; } @@ -510,128 +547,205 @@ int NeverhoodAudioStream::readBuffer(int16 *buffer, const int numSamples) { return numSamples - samplesLeft; } -AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm) - : _vm(vm) { +AudioResourceManSoundItem::AudioResourceManSoundItem(NeverhoodEngine *vm, uint32 fileHash) + : _vm(vm), _fileHash(fileHash), _data(NULL), _isLoaded(false), _isPlaying(false), + _volume(100), _panning(50) { + + _vm->_res->queryResource(_fileHash, _resourceHandle); } -AudioResourceMan::~AudioResourceMan() { +void AudioResourceManSoundItem::loadSound() { + if (!_data && _resourceHandle.isValid() && + (_resourceHandle.type() == kResTypeSound || _resourceHandle.type() == kResTypeMusic)) { + _vm->_res->loadResource(_resourceHandle); + _data = _resourceHandle.data(); + } } -int16 AudioResourceMan::addSound(uint32 fileHash) { - AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem(); - _vm->_res->queryResource(fileHash, soundItem->_resourceHandle); - soundItem->_fileHash = fileHash; - soundItem->_data = NULL; - soundItem->_isLoaded = false; - soundItem->_isPlaying = false; - soundItem->_volume = 100; - soundItem->_panning = 50; - for (uint i = 0; i < _soundItems.size(); ++i) - if (!_soundItems[i]) { - _soundItems[i] = soundItem; - return i; - } - int16 soundIndex = (int16)_soundItems.size(); - _soundItems.push_back(soundItem); - return soundIndex; +void AudioResourceManSoundItem::unloadSound() { + if (_vm->_mixer->isSoundHandleActive(_soundHandle)) + _vm->_mixer->stopHandle(_soundHandle); + _vm->_res->unloadResource(_resourceHandle); + _data = NULL; } -void AudioResourceMan::removeSound(int16 soundIndex) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - unloadSound(soundIndex); - delete soundItem; - _soundItems[soundIndex] = NULL; -} - -void AudioResourceMan::loadSound(int16 soundIndex) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (!soundItem->_data && soundItem->_resourceHandle.isValid() && - (soundItem->_resourceHandle.type() == kResTypeSound || soundItem->_resourceHandle.type() == kResTypeMusic)) { - _vm->_res->loadResource(soundItem->_resourceHandle); - soundItem->_data = soundItem->_resourceHandle.data(); +void AudioResourceManSoundItem::setVolume(int16 volume) { + _volume = MIN(volume, 100); + if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle)) + _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_volume)); +} + +void AudioResourceManSoundItem::setPan(int16 pan) { + _panning = MIN(pan, 100); + if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle)) + _vm->_mixer->setChannelVolume(_soundHandle, PANNING(_panning)); +} + +void AudioResourceManSoundItem::playSound(bool looping) { + if (!_data) + loadSound(); + if (_data) { + const byte *shiftValue = _resourceHandle.extData(); + Common::MemoryReadStream *stream = new Common::MemoryReadStream(_data, _resourceHandle.size(), DisposeAfterUse::NO); + NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream); + _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, + audioStream, -1, VOLUME(_volume), PANNING(_panning)); + debug(1, "playing sound %08X", _fileHash); + _isPlaying = true; } } -void AudioResourceMan::unloadSound(int16 soundIndex) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) - _vm->_mixer->stopHandle(soundItem->_soundHandle); - _vm->_res->unloadResource(soundItem->_resourceHandle); - soundItem->_data = NULL; +void AudioResourceManSoundItem::stopSound() { + if (_vm->_mixer->isSoundHandleActive(_soundHandle)) + _vm->_mixer->stopHandle(_soundHandle); + _isPlaying = false; } -void AudioResourceMan::setSoundVolume(int16 soundIndex, int16 volume) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - soundItem->_volume = MIN(volume, 100); - if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) - _vm->_mixer->setChannelVolume(soundItem->_soundHandle, VOLUME(soundItem->_volume)); +bool AudioResourceManSoundItem::isPlaying() { + return _vm->_mixer->isSoundHandleActive(_soundHandle); } -void AudioResourceMan::setSoundPan(int16 soundIndex, int16 pan) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - soundItem->_panning = MIN(pan, 100); - if (soundItem->_isPlaying && _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) - _vm->_mixer->setChannelVolume(soundItem->_soundHandle, PANNING(soundItem->_panning)); +AudioResourceManMusicItem::AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash) + : _vm(vm), _fileHash(fileHash), _terminate(false), _canRestart(false), + _volume(100), _panning(50), _start(false), _isFadingIn(false), _isFadingOut(false) { + } -void AudioResourceMan::playSound(int16 soundIndex, bool looping) { +void AudioResourceManMusicItem::playMusic(int16 fadeVolumeStep) { + if (!_isPlaying) { + _isFadingIn = false; + _isFadingOut = false; + if (fadeVolumeStep != 0) { + _isFadingIn = true; + _fadeVolume = 0; + _fadeVolumeStep = fadeVolumeStep; + } + _start = true; + _terminate = false; + } +} - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (!soundItem->_data) - loadSound(soundIndex); +void AudioResourceManMusicItem::stopMusic(int16 fadeVolumeStep) { + if (_vm->_mixer->isSoundHandleActive(_soundHandle)) { + if (fadeVolumeStep != 0) { + if (_isFadingIn) + _isFadingIn = false; + else + _fadeVolume = _volume; + _isFadingOut = true; + _fadeVolumeStep = fadeVolumeStep; + } else { + _vm->_mixer->stopHandle(_soundHandle); + } + _isPlaying = false; + } +} - if (!soundItem->_data) - return; - - const byte *shiftValue = soundItem->_resourceHandle.extData(); - - Common::MemoryReadStream *stream = new Common::MemoryReadStream(soundItem->_data, soundItem->_resourceHandle.size(), DisposeAfterUse::NO); - NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, false, DisposeAfterUse::YES, stream); +void AudioResourceManMusicItem::unloadMusic() { + if (_isFadingOut) { + _canRestart = true; + } else { + if (_vm->_mixer->isSoundHandleActive(_soundHandle)) + _vm->_mixer->stopHandle(_soundHandle); + _isPlaying = false; + _terminate = true; + } +} - _vm->_mixer->playStream(Audio::Mixer::kSFXSoundType, &soundItem->_soundHandle, - audioStream, -1, VOLUME(soundItem->_volume), PANNING(soundItem->_panning)); - - debug(1, "playing sound %08X", soundItem->_fileHash); - - soundItem->_isPlaying = true; +void AudioResourceManMusicItem::setVolume(int16 volume) { + _volume = MIN(volume, 100); + if (_isPlaying && _vm->_mixer->isSoundHandleActive(_soundHandle)) + _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_volume)); +} + +void AudioResourceManMusicItem::restart() { + _canRestart = false; + _isFadingOut = false; + _isFadingIn = true; +} + +void AudioResourceManMusicItem::update() { + + if (_start && !_vm->_mixer->isSoundHandleActive(_soundHandle)) { + ResourceHandle resourceHandle; + _vm->_res->queryResource(_fileHash, resourceHandle); + Common::SeekableReadStream *stream = _vm->_res->createStream(_fileHash); + const byte *shiftValue = resourceHandle.extData(); + NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream); + _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &_soundHandle, + audioStream, -1, VOLUME(_isFadingIn ? _fadeVolume : _volume), + PANNING(_panning)); + _start = false; + _isPlaying = true; + } + if (_vm->_mixer->isSoundHandleActive(_soundHandle)) { + if (_isFadingIn) { + _fadeVolume += _fadeVolumeStep; + if (_fadeVolume >= _volume) { + _fadeVolume = _volume; + _isFadingIn = false; + } + _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_fadeVolume)); + } + if (_isFadingOut) { + _fadeVolume -= _fadeVolumeStep; + if (_fadeVolume < 0) + _fadeVolume = 0; + _vm->_mixer->setChannelVolume(_soundHandle, VOLUME(_fadeVolume)); + if (_fadeVolume == 0) { + _isFadingOut = false; + stopMusic(0); + if (_canRestart) + unloadMusic(); + } + } + } + } -void AudioResourceMan::stopSound(int16 soundIndex) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - if (_vm->_mixer->isSoundHandleActive(soundItem->_soundHandle)) - _vm->_mixer->stopHandle(soundItem->_soundHandle); - soundItem->_isPlaying = false; +AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm) + : _vm(vm) { } -bool AudioResourceMan::isSoundPlaying(int16 soundIndex) { - AudioResourceManSoundItem *soundItem = _soundItems[soundIndex]; - return _vm->_mixer->isSoundHandleActive(soundItem->_soundHandle); +AudioResourceMan::~AudioResourceMan() { } -int16 AudioResourceMan::loadMusic(uint32 fileHash) { +int16 AudioResourceMan::addSound(uint32 fileHash) { + AudioResourceManSoundItem *soundItem = new AudioResourceManSoundItem(_vm, fileHash); + + for (uint i = 0; i < _soundItems.size(); ++i) + if (!_soundItems[i]) { + _soundItems[i] = soundItem; + return i; + } + int16 soundIndex = (int16)_soundItems.size(); + _soundItems.push_back(soundItem); + return soundIndex; +} + +void AudioResourceMan::removeSound(int16 soundIndex) { + AudioResourceManSoundItem *soundItem = getSoundItem(soundIndex); + if (soundItem) { + soundItem->unloadSound(); + delete soundItem; + _soundItems[soundIndex] = NULL; + } +} + +int16 AudioResourceMan::loadMusic(uint32 fileHash) { AudioResourceManMusicItem *musicItem; for (uint i = 0; i < _musicItems.size(); ++i) { musicItem = _musicItems[i]; - if (musicItem && musicItem->_fileHash == fileHash && musicItem->_remove) { - musicItem->_remove = false; - musicItem->_isFadingOut = false; - musicItem->_isFadingIn = true; + if (musicItem && musicItem->getFileHash() == fileHash && musicItem->canRestart()) { + musicItem->restart(); return i; } } - - musicItem = new AudioResourceManMusicItem(); - musicItem->_fileHash = fileHash; - musicItem->_isPlaying = false; - musicItem->_remove = false; - musicItem->_volume = 100; - musicItem->_panning = 50; - musicItem->_start = false; - musicItem->_isFadingIn = false; - musicItem->_isFadingOut = false; + + musicItem = new AudioResourceManMusicItem(_vm, fileHash); for (uint i = 0; i < _musicItems.size(); ++i) { if (!_musicItems[i]) { @@ -646,106 +760,25 @@ int16 AudioResourceMan::loadMusic(uint32 fileHash) { } -void AudioResourceMan::unloadMusic(int16 musicIndex) { - AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; - if (musicItem->_isFadingOut) { - musicItem->_remove = true; - } else { - if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) - _vm->_mixer->stopHandle(musicItem->_soundHandle); - musicItem->_isPlaying = false; - _musicItems[musicIndex] = NULL; - } -} - -void AudioResourceMan::setMusicVolume(int16 musicIndex, int16 volume) { - AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; - musicItem->_volume = MIN(volume, 100); - if (musicItem->_isPlaying && _vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) - _vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_volume)); -} - -void AudioResourceMan::playMusic(int16 musicIndex, int16 fadeVolumeStep) { - AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; - if (!musicItem->_isPlaying) { - musicItem->_isFadingIn = false; - musicItem->_isFadingOut = false; - if (fadeVolumeStep != 0) { - musicItem->_isFadingIn = true; - musicItem->_fadeVolume = 0; - musicItem->_fadeVolumeStep = fadeVolumeStep; - } - musicItem->_start = true; - } -} - -void AudioResourceMan::stopMusic(int16 musicIndex, int16 fadeVolumeStep) { - AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; - if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { - if (fadeVolumeStep != 0) { - if (musicItem->_isFadingIn) - musicItem->_isFadingIn = false; - else - musicItem->_fadeVolume = musicItem->_volume; - musicItem->_isFadingOut = true; - musicItem->_fadeVolumeStep = fadeVolumeStep; - } else { - _vm->_mixer->stopHandle(musicItem->_soundHandle); - } - musicItem->_isPlaying = false; - } -} - -bool AudioResourceMan::isMusicPlaying(int16 musicIndex) { - AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; - return musicItem->_isPlaying; -} - -void AudioResourceMan::updateMusicItem(int16 musicIndex) { - AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; - - if (musicItem->_start && !_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { - ResourceHandle resourceHandle; - _vm->_res->queryResource(musicItem->_fileHash, resourceHandle); - Common::SeekableReadStream *stream = _vm->_res->createStream(musicItem->_fileHash); - const byte *shiftValue = resourceHandle.extData(); - NeverhoodAudioStream *audioStream = new NeverhoodAudioStream(22050, *shiftValue, true, DisposeAfterUse::YES, stream); - _vm->_mixer->playStream(Audio::Mixer::kMusicSoundType, &musicItem->_soundHandle, - audioStream, -1, VOLUME(musicItem->_isFadingIn ? musicItem->_fadeVolume : musicItem->_volume), - PANNING(musicItem->_panning)); - musicItem->_start = false; - musicItem->_isPlaying = true; - } - - if (_vm->_mixer->isSoundHandleActive(musicItem->_soundHandle)) { - if (musicItem->_isFadingIn) { - musicItem->_fadeVolume += musicItem->_fadeVolumeStep; - if (musicItem->_fadeVolume >= musicItem->_volume) { - musicItem->_fadeVolume = musicItem->_volume; - musicItem->_isFadingIn = false; - } - _vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume)); - } - if (musicItem->_isFadingOut) { - musicItem->_fadeVolume -= musicItem->_fadeVolumeStep; - if (musicItem->_fadeVolume < 0) - musicItem->_fadeVolume = 0; - _vm->_mixer->setChannelVolume(musicItem->_soundHandle, VOLUME(musicItem->_fadeVolume)); - if (musicItem->_fadeVolume == 0) { - musicItem->_isFadingOut = false; - stopMusic(musicIndex, 0); - if (musicItem->_remove) - unloadMusic(musicIndex); +void AudioResourceMan::updateMusic() { + for (uint musicIndex = 0; musicIndex < _musicItems.size(); ++musicIndex) { + AudioResourceManMusicItem *musicItem = _musicItems[musicIndex]; + if (musicItem) { + musicItem->update(); + if (musicItem->isTerminated()) { + delete musicItem; + _musicItems[musicIndex] = NULL; } } } +} +AudioResourceManSoundItem *AudioResourceMan::getSoundItem(int16 index) { + return (index >= 0 && index < (int16)_soundItems.size()) ? _soundItems[index] : NULL; } -void AudioResourceMan::update() { - for (uint i = 0; i < _musicItems.size(); ++i) - if (_musicItems[i]) - updateMusicItem(i); +AudioResourceManMusicItem *AudioResourceMan::getMusicItem(int16 index) { + return (index >= 0 && index < (int16)_musicItems.size()) ? _musicItems[index] : NULL; } } // End of namespace Neverhood diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h index 8bfd5af2aa..e0e45e9ad1 100644 --- a/engines/neverhood/sound.h +++ b/engines/neverhood/sound.h @@ -37,6 +37,10 @@ namespace Neverhood { // Convert panning from percent (50% equals center) to -127..0..+127 #define PANNING(panning) (254 / 100 * (panning) - 127) +class AudioResourceManSoundItem; +class AudioResourceManMusicItem; +class AudioResourceMan; + class SoundResource { public: SoundResource(NeverhoodEngine *vm); @@ -51,7 +55,8 @@ public: void setPan(int16 pan); protected: NeverhoodEngine *_vm; - int16 _soundIndex; + int16 _soundIndex; + AudioResourceManSoundItem *getSoundItem(); }; class MusicResource { @@ -66,23 +71,49 @@ public: protected: NeverhoodEngine *_vm; int16 _musicIndex; + AudioResourceManMusicItem *getMusicItem(); }; -struct MusicItem { - uint32 _nameHash; - uint32 _musicFileHash; +class MusicItem { +public: + MusicItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 musicFileHash); + ~MusicItem(); + void startMusic(int16 countdown, int16 fadeVolumeStep); + void stopMusic(int16 countdown, int16 fadeVolumeStep); + void update(); + uint32 getGroupNameHash() const { return _groupNameHash; } + uint32 getFileHash() const { return _fileHash; } +protected: + NeverhoodEngine *_vm; + uint32 _groupNameHash; + uint32 _fileHash; bool _play; bool _stop; int16 _fadeVolumeStep; int16 _countdown; MusicResource *_musicResource; - MusicItem(); - ~MusicItem(); }; -struct SoundItem { - uint32 _nameHash; - uint32 _soundFileHash; +class SoundItem { +public: + SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFileHash, + bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, + bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown); + ~SoundItem(); + void setSoundParams(bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, + int16 firstMinCountdown, int16 firstMaxCountdown); + void playSoundLooping(); + void stopSound(); + void setVolume(int volume); + void update(); + void setPlayOnceAfterCountdown(bool playOnceAfterCountdown) { _playOnceAfterCountdown = playOnceAfterCountdown; } + uint32 getGroupNameHash() const { return _groupNameHash; } + uint32 getFileHash() const { return _fileHash; } + int16 getCurrCountdown() const { return _currCountdown; } +protected: + NeverhoodEngine *_vm; + uint32 _groupNameHash; + uint32 _fileHash; bool _playOnceAfterRandomCountdown; int16 _minCountdown; int16 _maxCountdown; @@ -91,29 +122,30 @@ struct SoundItem { bool _playLooping; int16 _currCountdown; SoundResource *_soundResource; - - SoundItem(NeverhoodEngine *vm, uint32 nameHash, uint32 soundFileHash, - bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, - bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown); - ~SoundItem(); }; // TODO Give this a better name +/* +template +class SoundManItems : public Common::Array { +}; +*/ + class SoundMan { public: SoundMan(NeverhoodEngine *vm); ~SoundMan(); // Music - void addMusic(uint32 nameHash, uint32 musicFileHash); + void addMusic(uint32 groupNameHash, uint32 musicFileHash); void deleteMusic(uint32 musicFileHash); void startMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep); void stopMusic(uint32 musicFileHash, int16 countdown, int16 fadeVolumeStep); // Sound - void addSound(uint32 nameHash, uint32 soundFileHash); - void addSoundList(uint32 nameHash, const uint32 *soundFileHashList); + void addSound(uint32 groupNameHash, uint32 soundFileHash); + void addSoundList(uint32 groupNameHash, const uint32 *soundFileHashList); void deleteSound(uint32 soundFileHash); void setSoundParams(uint32 soundFileHash, bool playOnceAfterRandomCountdown, int16 minCountdown, int16 maxCountdown, int16 firstMinCountdown, int16 firstMaxCountdown); @@ -125,11 +157,11 @@ public: // Misc void update(); - void deleteGroup(uint32 nameHash); - void deleteMusicGroup(uint32 nameHash); - void deleteSoundGroup(uint32 nameHash); - void playTwoSounds(uint32 nameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown); - void playSoundThree(uint32 nameHash, uint32 soundFileHash); + void deleteGroup(uint32 groupNameHash); + void deleteMusicGroup(uint32 groupNameHash); + void deleteSoundGroup(uint32 groupNameHash); + void playTwoSounds(uint32 groupNameHash, uint32 soundFileHash1, uint32 soundFileHash2, int16 initialCountdown); + void playSoundThree(uint32 groupNameHash, uint32 soundFileHash); void setTwoSoundsPlayFlag(bool playOnceAfterCountdown); void setSoundThreePlayFlag(bool playOnceAfterCountdown); @@ -182,7 +214,18 @@ private: // TODO Rename these -struct AudioResourceManSoundItem { +class AudioResourceManSoundItem { +public: + AudioResourceManSoundItem(NeverhoodEngine *vm, uint32 fileHash); + void loadSound(); + void unloadSound(); + void setVolume(int16 volume); + void setPan(int16 pan); + void playSound(bool looping); + void stopSound(); + bool isPlaying(); +protected: + NeverhoodEngine *_vm; uint32 _fileHash; ResourceHandle _resourceHandle; const byte *_data; @@ -193,10 +236,25 @@ struct AudioResourceManSoundItem { Audio::SoundHandle _soundHandle; }; -struct AudioResourceManMusicItem { +class AudioResourceManMusicItem { +public: + AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash); + void playMusic(int16 fadeVolumeStep); + void stopMusic(int16 fadeVolumeStep); + void unloadMusic(); + void setVolume(int16 volume); + void restart(); + void update(); + bool isPlaying() const { return _isPlaying; } + bool canRestart() const { return _canRestart; } + bool isTerminated() const { return _terminate; } + uint32 getFileHash() const { return _fileHash; } +protected: + NeverhoodEngine *_vm; uint32 _fileHash; bool _isPlaying; - bool _remove; + bool _canRestart; + bool _terminate; int16 _volume; int16 _panning; bool _start; @@ -214,23 +272,12 @@ public: int16 addSound(uint32 fileHash); void removeSound(int16 soundIndex); - void loadSound(int16 soundIndex); - void unloadSound(int16 soundIndex); - void setSoundVolume(int16 soundIndex, int16 volume); - void setSoundPan(int16 soundIndex, int16 pan); - void playSound(int16 soundIndex, bool looping); - void stopSound(int16 soundIndex); - bool isSoundPlaying(int16 soundIndex); - + int16 loadMusic(uint32 fileHash); - void unloadMusic(int16 musicIndex); - void setMusicVolume(int16 musicIndex, int16 volume); - void playMusic(int16 musicIndex, int16 fadeVolumeStep); - void stopMusic(int16 musicIndex, int16 fadeVolumeStep); - bool isMusicPlaying(int16 musicIndex); - void updateMusicItem(int16 musicIndex); + void updateMusic(); - void update(); + AudioResourceManSoundItem *getSoundItem(int16 index); + AudioResourceManMusicItem *getMusicItem(int16 index); protected: NeverhoodEngine *_vm; -- cgit v1.2.3 From ac1dc3e4db23572b9a7d6855bfbdc20f9044a612 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 19 Jan 2013 22:37:51 +0000 Subject: NEVERHOOD: Fix Module1300::createScene --- engines/neverhood/module1300.cpp | 2 +- engines/neverhood/scene.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index a0a1167748..690ca7cea3 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -111,7 +111,7 @@ Module1300::~Module1300() { void Module1300::createScene(int sceneNum, int which) { debug("Module1300::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { + switch (_sceneNum) { case 1: _vm->gameState().sceneNum = 1; _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 866b75d399..63242a41c7 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -258,15 +258,15 @@ void Scene::leaveScene(uint32 result) { uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { switch (messageNum) { - case 0: // mouse moved + case 0x0000: // mouse moved if (_mouseCursor && _mouseCursor->hasMessageHandler()) sendMessage(_mouseCursor, 0x4002, param); break; - case 1: // mouse clicked + case 0x0001: // mouse clicked _mouseClicked = true; _mouseClickPos = param.asPoint(); break; - case 6: + case 0x0006: sendMessage(_parentModule, 0x1009, param); break; case 0x1006: -- cgit v1.2.3 From 4389d32974cd0965624d30b6566fcc8e1c2a72b4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Mon, 21 Jan 2013 11:34:50 +0000 Subject: NEVERHOOD: Rename "Klayman" to "Klaymen" (the correct name of the game's hero) --- engines/neverhood/gamemodule.cpp | 2 +- engines/neverhood/gamevars.h | 14 +- engines/neverhood/klayman.cpp | 6240 -------------------------------------- engines/neverhood/klayman.h | 764 ----- engines/neverhood/klaymen.cpp | 6240 ++++++++++++++++++++++++++++++++++++++ engines/neverhood/klaymen.h | 764 +++++ engines/neverhood/messages.h | 8 +- engines/neverhood/module.mk | 2 +- engines/neverhood/module1000.cpp | 212 +- engines/neverhood/module1000.h | 32 +- engines/neverhood/module1100.cpp | 22 +- engines/neverhood/module1200.cpp | 84 +- engines/neverhood/module1200.h | 24 +- engines/neverhood/module1300.cpp | 144 +- engines/neverhood/module1300.h | 6 +- engines/neverhood/module1400.cpp | 140 +- engines/neverhood/module1400.h | 8 +- engines/neverhood/module1600.cpp | 62 +- engines/neverhood/module1600.h | 6 +- engines/neverhood/module1700.cpp | 40 +- engines/neverhood/module1800.cpp | 2 +- engines/neverhood/module1900.cpp | 8 +- engines/neverhood/module2000.cpp | 24 +- engines/neverhood/module2100.cpp | 50 +- engines/neverhood/module2100.h | 4 +- engines/neverhood/module2200.cpp | 266 +- engines/neverhood/module2200.h | 14 +- engines/neverhood/module2400.cpp | 82 +- engines/neverhood/module2400.h | 6 +- engines/neverhood/module2500.cpp | 40 +- engines/neverhood/module2500.h | 6 +- engines/neverhood/module2700.cpp | 4 +- engines/neverhood/module2800.cpp | 346 +-- engines/neverhood/module2800.h | 16 +- engines/neverhood/resource.cpp | 6 +- engines/neverhood/resource.h | 2 +- engines/neverhood/scene.cpp | 74 +- engines/neverhood/scene.h | 36 +- 38 files changed, 7900 insertions(+), 7900 deletions(-) delete mode 100644 engines/neverhood/klayman.cpp delete mode 100644 engines/neverhood/klayman.h create mode 100644 engines/neverhood/klaymen.cpp create mode 100644 engines/neverhood/klaymen.h diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index f22a0d12e5..cf56522fbd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -395,7 +395,7 @@ void GameModule::startup() { setSubVar(VA_CURR_WATER_PIPES_LEVEL, 2, 2); setSubVar(VA_CURR_WATER_PIPES_LEVEL, 3, 0); setSubVar(VA_CURR_WATER_PIPES_LEVEL, 4, 4); - setGlobalVar(V_KLAYMAN_SMALL, 1); + setGlobalVar(V_KLAYMEN_SMALL, 1); setGlobalVar(V_SHRINK_LIGHTS_ON, 0); // <<_rnd->getRandomNumber(64 - 1) + 24; -} - -void Klayman::upSitIdleTeleporter() { - update(); - _idleCounter++; - if (_idleCounter >= _idleCounterMax) { - _idleCounter = 0; - if (_idleTable) { - int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); - for (int i = 0; i < _idleTableCount; i++) { - if (randomValue < _idleTable[i].value) { - (this->*(_idleTable[i].callback))(); - _idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24; - break; - } - randomValue -= _idleTable[i].value; - } - } - } else if (++_blinkCounter >= _blinkCounterMax) { - _blinkCounter = 0; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; - stSitIdleTeleporterBlink(); - } -} - -void Klayman::stSitIdleTeleporterBlink() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x5C24C018, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); - NextState(&Klayman::stSitIdleTeleporterBlinkSecond); -} - -void Klayman::stSitIdleTeleporterBlinkSecond() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x5C24C018, 0, -1); - SetUpdateHandler(&Klayman::upSitIdleTeleporter); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); -} - -void Klayman::stPickUpNeedle() { - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - if (!stStartAction(AnimationCallback(&Klayman::stPickUpNeedle))) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x1449C169, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPickUpObject); - SetSpriteUpdate(NULL); - } -} - -void Klayman::stPickUpTube() { - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - if (!stStartAction(AnimationCallback(&Klayman::stPickUpTube))) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x0018C032, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPickUpTube); - SetSpriteUpdate(NULL); - } -} - -uint32 Klayman::hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xC1380080) { - sendMessage(_attachedSprite, 0x4806, 0); - playSound(0, 0xC8004340); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x03020231) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0x67221A03) { - playSound(0, 0x44051000); - } else if (param.asInteger() == 0x925A0C1E) { - playSound(0, 0x40E5884D); - } - break; - } - return messageResult; -} - -void Klayman::stTurnToUseInTeleporter() { - _status2 = 0; - _acceptInput = false; - startAnimation(0xD229823D, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stReturnFromUseInTeleporter() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x9A2801E0, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stStepOver() { - if (!stStartAction(AnimationCallback(&Klayman::stStepOver))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x004AA310, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stSitInTeleporter() { - if (!stStartAction(AnimationCallback(&Klayman::stSitInTeleporter))) { - _status2 = 0; - _acceptInput = false; - startAnimation(0x392A0330, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSitInTeleporter); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -uint32 Klayman::hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x001A2832) { - playSound(0, 0xC0E4884C); - } - break; - } - return messageResult; -} - -void Klayman::stGetUpFromTeleporter() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x913AB120, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -///////////////////////////////////////////////////////////////// - -void Klayman::stopWalking() { - _destX = _x; - if (!_isWalking && !_isSneaking && !_isLargeStep) { - gotoState(NULL); - gotoNextStateExt(); - } -} - -void Klayman::startIdleAnimation(uint32 fileHash, AnimationCb callback) { - debug("startIdleAnimation(%08X)", fileHash); - NextState(callback); - SetUpdateHandler(&Klayman::upIdleAnimation); -} - -void Klayman::upIdleAnimation() { - gotoNextStateExt(); - update(); -} - -bool Klayman::stStartActionFromIdle(AnimationCb callback) { - if (_status2 == 2) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x9A7020B8, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStartAction); - SetSpriteUpdate(NULL); - NextState(callback); - return true; - } - return false; -} - -void Klayman::gotoNextStateExt() { - if (_finalizeStateCb) { - AnimationCb cb = _finalizeStateCb; - _finalizeStateCb = NULL; - (this->*cb)(); - } - if (_nextStateCb) { - AnimationCb cb = _nextStateCb; - _nextStateCb = NULL; - (this->*cb)(); - } else { - // Inform the scene that the current Klayman animation sequence has finished - sendMessage(_parentScene, 0x1006, 0); - } -} - -void Klayman::sub41C770() { - _flagFA = false; - _status3 = 1; -} - -void Klayman::sub41C790() { - if (_flagFA) - _status3 = 0; -} - -void Klayman::stTryStandIdle() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTryStandIdle))) { - _status2 = 1; - _acceptInput = true; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::upStandIdle); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); - _idleCounter = 0; - _blinkCounter = 0; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; - } -} - -void Klayman::upStandIdle() { - update(); - if (++_idleCounter >= 720) { - _idleCounter = 0; - if (_idleTable) { - int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1); - for (int i = 0; i < _idleTableCount; i++) { - if (randomValue < _idleTable[i].value) { - (this->*(_idleTable[i].callback))(); - break; - } - randomValue -= _idleTable[i].value; - } - } - } else if (++_blinkCounter >= _blinkCounterMax) { - _blinkCounter = 0; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; - stIdleBlink(); - } -} - -uint32 Klayman::hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender) { - Sprite::handleMessage(messageNum, param, sender); - uint32 messageResult = xHandleMessage(messageNum, param); - switch (messageNum) { - case 0x1008: - messageResult = _acceptInput; - break; - case 0x1014: - _attachedSprite = (Sprite*)(param.asEntity()); - break; - case 0x1019: - gotoNextStateExt(); - break; - case 0x101C: - sub41C770(); - break; - case 0x1021: - sub41C790(); - break; - case 0x481C: - _status3 = param.asInteger(); - _flagFA = true; - messageResult = 1; - break; - case 0x482C: - if (param.asInteger() != 0) { - _pathPoints = _dataResource.getPointArray(param.asInteger()); - } else { - _pathPoints = NULL; - } - break; - } - return messageResult; -} - -void Klayman::stIdleBlink() { - _status2 = 1; - _acceptInput = true; - startAnimation(0x5900C41E, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); - NextState(&Klayman::stStandAround); -} - -uint32 Klayman::hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextStateExt(); - break; - } - return messageResult; -} - -void Klayman::stStandAround() { - _status2 = 1; - _acceptInput = true; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::upStandIdle); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x271AA210) { - playSound(0, 0x4924AAC4); - } else if (param.asInteger() == 0x2B22AA81) { - playSound(0, 0x0A2AA8E0); - } - break; - } - return messageResult; -} - - -void Klayman::startWalkToX(int16 x, bool flag) { - int16 xdiff = ABS(x - _x); - if (x == _x) { - _destX = x; - if (!_isWalking && !_isSneaking && !_isLargeStep) { - gotoState(NULL); - gotoNextStateExt(); - } - } else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) { - _destX = x; - gotoState(NULL); - gotoNextStateExt(); - } else if (xdiff <= 42 && _status3 != 3) { - if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { - _destX = x; - } else { - _destX = x; - GotoState(&Klayman::stSneak); - } - } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { - _destX = x; - } else if (flag) { - _destX = x; - GotoState(&Klayman::stStartWalkingExt); - } else { - _destX = x; - GotoState(&Klayman::stStartWalking); - } -} - -void Klayman::stWakeUp() { - _status2 = 1; - _acceptInput = false; - startAnimation(0x527AC970, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stSleeping() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x5A38C110, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSleeping); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x03060012) { - playSound(0, 0xC0238244); - } - break; - } - return messageResult; -} - -bool Klayman::stStartAction(AnimationCb callback3) { - if (_status2 == 1) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x5C7080D4, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStartAction); - SetSpriteUpdate(&Klayman::suAction); - NextState(callback3); - return true; - } else { - _x = _destX; - return false; - } -} - -void Klayman::suAction() { - - int16 xdiff = _destX - _x; - - if (_doDeltaX) { - _x -= _deltaX; - } else { - _x += _deltaX; - } - _deltaX = 0; - - if (_doDeltaY) { - _y -= _deltaY; - } else { - _y += _deltaY; - } - _deltaY = 0; - - if (_frameChanged) { - if (xdiff > 6) - _x += 6; - else if (xdiff < -6) - _x -= 6; - else - _x = _destX; - } - - updateBounds(); - -} - -void Klayman::suSneaking() { - - int16 xdiff = _destX - _x; - - if (_currFrameIndex == 9) { - if (xdiff > 26) - _deltaX += xdiff - 26; - else if (xdiff < -26) - _deltaX -= xdiff + 26; - } - - if (xdiff > _deltaX) - xdiff = _deltaX; - else if (xdiff < -_deltaX) - xdiff = -_deltaX; - _deltaX = 0; - - if (_destX != _x) { - HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); - _x += xdiff; - if (_pathPoints) { - walkAlongPathPoints(); - } else { - HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); - if (hitRectNext->type == 0x5002) { - _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); - } else if (hitRectNext->type == 0x5003) { - _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); - } else if (hitRectPrev->type == 0x5002) { - if (xdiff > 0) { - _y = hitRectPrev->rect.y2; - } else { - _y = hitRectPrev->rect.y1; - } - } else if (hitRectPrev->type == 0x5003) { - if (xdiff < 0) { - _y = hitRectPrev->rect.y2; - } else { - _y = hitRectPrev->rect.y1; - } - } - } - updateBounds(); - } - -} - -void Klayman::stSneak() { - _status2 = 1; - _isSneaking = true; - _acceptInput = true; - setDoDeltaX(_destX < _x ? 1 : 0); - startAnimation(0x5C48C506, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSneaking); - SetSpriteUpdate(&Klayman::suSneaking); - FinalizeState(&Klayman::evSneakingDone); -} - -void Klayman::evSneakingDone() { - _isSneaking = false; -} - -uint32 Klayman::hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) { - playSound(0, 0x4924AAC4); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0A2AA8E0); - } else if (param.asInteger() == 0x32188010) { - playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); - } else if (param.asInteger() == 0x02A2909C) { - playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); - } - break; - case 0x3002: - _x = _destX; - gotoNextStateExt(); - break; - } - return messageResult; -} - -void Klayman::stStartWalking() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalking))) { - _status2 = 0; - _isWalking = true; - _acceptInput = true; - setDoDeltaX(_destX < _x ? 1 : 0); - startAnimation(0x242C0198, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteUpdate(&Klayman::suWalkingTestExit); - NextState(&Klayman::stWalkingFirst); - FinalizeState(&Klayman::evStartWalkingDone); - } -} - -void Klayman::evStartWalkingDone() { - _isWalking = false; -} - -uint32 Klayman::hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) { - playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); - } - break; - } - return messageResult; -} - -void Klayman::stWalkingFirst() { - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::suWalkingFirst); - NextState(&Klayman::stUpdateWalkingFirst); - FinalizeState(&Klayman::evStartWalkingDone); -} - -void Klayman::suWalkingFirst() { - SetSpriteUpdate(&Klayman::suWalkingTestExit); - _deltaX = 0; -} - -uint32 Klayman::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) { - playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); - } - break; - } - return messageResult; -} - -void Klayman::stUpdateWalkingFirst() { - if (_status3 == 2) { - gotoNextStateExt(); - } else if (_status3 == 3) { - stWalkingOpenDoor(); - } else { - _isSneaking = true; - _acceptInput = true; - if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { - if (_status3 == 0) { - _status2 = 1; - startAnimation(0xF234EE31, 0, -1); - } else { - _status2 = 2; - startAnimation(0xF135CC21, 0, -1); - } - } else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { - if (_status3 == 0) { - _status2 = 1; - startAnimation(0x8604A152, 0, -1); - } else { - _status2 = 2; - startAnimation(0xA246A132, 0, -1); - } - } - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSneaking); - SetSpriteUpdate(&Klayman::suSneaking); - FinalizeState(&Klayman::evSneakingDone); - } -} - -void Klayman::suWalkingTestExit() { - int16 xdiff = ABS(_destX - _x); - int16 xdelta = _destX - _x; - - if (xdelta > _deltaX) - xdelta = _deltaX; - else if (xdelta < -_deltaX) - xdelta = -_deltaX; - - _deltaX = 0; - - if (xdiff == 0 || - (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) || - (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) || - (_status3 == 3 && xdiff < 30) || - (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) { - sendMessage(this, 0x1019, 0); - } else { - HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); - _x += xdelta; - if (_pathPoints) { - walkAlongPathPoints(); - } else { - HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); - if (hitRectNext->type == 0x5002) { - _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); - } else if (hitRectNext->type == 0x5003) { - _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); - } else if (hitRectPrev->type == 0x5002) { - _y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; - } else if (hitRectPrev->type == 0x5003) { - _y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; - } else if (_flagF6 && xdelta != 0) { - if (hitRectNext->type == 0x5000) { - _y++; - } else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) { - _y--; - } - } - } - updateBounds(); - } - -} - -uint32 Klayman::hmLever(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } - break; - } - return messageResult; -} - -void Klayman::stPickUpGeneric() { - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - if (!stStartAction(AnimationCallback(&Klayman::stPickUpGeneric))) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x1C28C178, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPickUpObject); - SetSpriteUpdate(NULL); - } -} - -uint32 Klayman::hmPickUpObject(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xC1380080) { - sendMessage(_attachedSprite, 0x4806, 0); - playSound(0, 0x40208200); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x03020231) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0x67221A03) { - playSound(0, 0x44051000); - } else if (param.asInteger() == 0x2EAE0303) { - playSound(0, 0x03630300); - } else if (param.asInteger() == 0x61CE4467) { - playSound(0, 0x03630300); - } - break; - } - return messageResult; - -} - -void Klayman::stPressButton() { - if (!stStartAction(AnimationCallback(&Klayman::stPressButton))) { - _status2 = 2; - _acceptInput = true; - startAnimation(0x1C02B03D, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPressButton); - SetSpriteUpdate(NULL); - } -} - -uint32 Klayman::hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x0D01B294) { - sendMessage(_attachedSprite, 0x480B, 0); - } else if (param.asInteger() == 0x32180101) { - playSound(0, 0x4924AAC4); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0A2AA8E0); - } - break; - } - return messageResult; -} - -void Klayman::stPressFloorButton() { - if (!stStartAction(AnimationCallback(&Klayman::stPressFloorButton))) { - _status2 = 2; - _acceptInput = true; - startAnimation(0x1C16B033, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPressButton); - SetSpriteUpdate(NULL); - } -} - -void Klayman::stPressButtonSide() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stPressButtonSide))) { - _status2 = 1; - _acceptInput = true; - startAnimation(0x1CD89029, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPressButton); - SetSpriteUpdate(&Klayman::suAction); - } -} - -void Klayman::startSpecialWalkRight(int16 x) { - if (_x == x) { - _destX = x; - gotoState(NULL); - gotoNextStateExt(); - } else if (_x < x) { - startWalkToX(x, false); - } else if (_x - x <= 105) { - startWalkToXExt(x); - } else { - startWalkToX(x, false); - } -} - -void Klayman::startSpecialWalkLeft(int16 x) { - if (x == _x) { - _destX = x; - gotoState(NULL); - gotoNextStateExt(); - } else if (x < _x) { - startWalkToX(x, false); - } else if (x - _x <= 105) { - startWalkToXExt(x); - } else { - startWalkToX(x, false); - } -} - -void Klayman::startWalkToXSmall(int16 x) { - _status3 = 2; - if (_x == x) { - _destX = x; - if (_isWalking) { - GotoState(NULL); - gotoNextStateExt(); - } - } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { - _destX = x; - } else { - _destX = x; - GotoState(&Klayman::stStartWalkingSmall); - } -} - -void Klayman::stStartWalkingSmall() { - _isWalking = true; - _acceptInput = true; - _status3 = 2; - setDoDeltaX(_destX < _x ? 1 : 0); - startAnimation(0x3A4CD934, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkingSmall); - SetSpriteUpdate(&Klayman::suWalkingTestExit); - FinalizeState(&Klayman::evStartWalkingDone); -} - -uint32 Klayman::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) - playSound(0, 0x4924AAC4); - else if (param.asInteger() == 0x0A2A9098) - playSound(0, 0x0A2AA8E0); - } - return messageResult; -} - -void Klayman::stStandIdleSmall() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x90D0D1D0, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); -} - -void Klayman::stWonderAboutAfterSmall() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x11C8D156, 30, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stWonderAboutHalfSmall() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x11C8D156, 0, 10); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stWonderAboutSmall() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x11C8D156, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stWalkToFrontNoStepSmall() { - _status2 = 0; - _acceptInput = false; - startAnimationByHash(0x3F9CC394, 0x14884392, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkFrontBackSmall); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -uint32 Klayman::hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x80C110B5) - sendMessage(_parentScene, 0x482A, 0); - else if (param.asInteger() == 0x110010D1) - sendMessage(_parentScene, 0x482B, 0); - else if (param.asInteger() == 0x32180101) - playSound(0, 0x4924AAC4); - else if (param.asInteger() == 0x0A2A9098) - playSound(0, 0x0A2AA8E0); - break; - } - return messageResult; -} - -void Klayman::stWalkToFront2Small() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2F1C4694, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkFrontBackSmall); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stWalkToFrontSmall() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x3F9CC394, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkFrontBackSmall); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stTurnToBackHalfSmall() { - _status2 = 0; - _acceptInput = false; - startAnimationByHash(0x37ECD436, 0, 0x8520108C); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkFrontBackSmall); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stTurnToBackWalkSmall() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x16EDDE36, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkFrontBackSmall); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stTurnToBackSmall() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x37ECD436, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkFrontBackSmall); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stPullCord() { - if (!stStartAction(AnimationCallback(&Klayman::stPullCord))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x3F28E094, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPullReleaseCord); - SetSpriteUpdate(NULL); - NextState(&Klayman::stReleaseCord); - } -} - -void Klayman::stReleaseCord() { - _acceptInput = false; - startAnimation(0x3A28C094, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPullReleaseCord); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmPullReleaseCord(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - sendMessage(_attachedSprite, 0x480F, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } - break; - } - return messageResult; -} - -void Klayman::stUseTube() { - if (!stStartAction(AnimationCallback(&Klayman::stUseTube))) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x1A38A814, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmUseTube); - SetSpriteUpdate(NULL); - } -} - -uint32 Klayman::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02B20220) - playSound(0, 0xC5408620); - else if (param.asInteger() == 0x0A720138) - playSound(0, 0xD4C08010); - else if (param.asInteger() == 0x03020231) - playSound(0, 0xD4C08010); - else if (param.asInteger() == 0xB613A180) - playSound(0, 0x44051000); - else if (param.asInteger() == 0x67221A03) - playSound(0, 0x44051000); - else if (param.asInteger() == 0x038A010B) - playSound(0, 0x00018040); - else if (param.asInteger() == 0x422B0280) - playSound(0, 0x166FC6E0); - else if (param.asInteger() == 0x925A0C1E) - playSound(0, 0x40E5884D); - break; - } - return messageResult; -} - -void Klayman::stWalkingFirstExt() { - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x5A2CBC00, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::suWalkingFirst); - NextState(&Klayman::stUpdateWalkingFirst); - FinalizeState(&Klayman::evStartWalkingDone); -} - -void Klayman::stStartWalkingExt() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stStartWalkingExt))) { - _status2 = 0; - _isWalking = true; - _acceptInput = true; - setDoDeltaX(_destX < _x ? 1 : 0); - startAnimation(0x272C1199, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteUpdate(&Klayman::suWalkingTestExit); - NextState(&Klayman::stWalkingFirstExt); - FinalizeState(&Klayman::evStartWalkingDone); - } -} - -void Klayman::sub41CC40(int16 x1, int16 x2) { - if (_x > x1) { - if (_x == x1 + x2) { - _destX = x1 + x2; - gotoState(NULL); - gotoNextStateExt(); - } else if (_x < x1 + x2) { - startWalkToXExt(x1 + x2); - } else { - startWalkToX(x1 + x2, false); - } - } else { - if (_x == x1 - x2) { - _destX = x1 - x2; - gotoState(NULL); - gotoNextStateExt(); - } else if (_x > x1 - x2) { - startWalkToXExt(x1 - x2); - } else { - startWalkToX(x1 - x2, false); - } - } -} - -void Klayman::startWalkToXExt(int16 x) { - int16 xdiff = ABS(x - _x); - if (x == _x) { - _destX = x; - if (!_isWalking && !_isSneaking && !_isLargeStep) { - gotoState(NULL); - gotoNextStateExt(); - } - } else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) { - _destX = x; - gotoState(NULL); - gotoNextStateExt(); - } else if (xdiff <= 42 && _status3 != 3) { - if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { - _destX = x; - } else { - _destX = x; - GotoState(&Klayman::stSneak); - } - } else if (_isLargeStep && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { - _destX = x; - } else { - _destX = x; - GotoState(&Klayman::stLargeStep); - } -} - -void Klayman::stLargeStep() { - _status2 = 2; - _isLargeStep = true; - _acceptInput = true; - setDoDeltaX(_destX >= _x ? 1 : 0); - startAnimation(0x08B28116, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLargeStep); - SetSpriteUpdate(&Klayman::suLargeStep); - FinalizeState(&Klayman::evLargeStepDone); -} - -void Klayman::evLargeStepDone() { - _isLargeStep = false; -} - -void Klayman::suLargeStep() { - int16 xdiff = _destX - _x; - - if (_doDeltaX) { - _deltaX = -_deltaX; - } - - if (_currFrameIndex == 7) { - _deltaX = xdiff; - } - - if ((xdiff > 0 && xdiff > _deltaX) || (xdiff < 0 && xdiff < _deltaX)) - xdiff = _deltaX; - - _deltaX = 0; - - if (_x != _destX) { - HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); - _x += xdiff; - if (_pathPoints) { - walkAlongPathPoints(); - } else { - HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); - if (hitRectNext->type == 0x5002) { - _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); - } else if (hitRectNext->type == 0x5003) { - _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); - } else if (hitRectPrev->type == 0x5002) { - _y = xdiff > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; - } else if (hitRectPrev->type == 0x5003) { - _y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; - } - } - updateBounds(); - } -} - -uint32 Klayman::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) { - playSound(0, 0x4924AAC4); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0A2AA8E0); - } - break; - case 0x3002: - _x = _destX; - gotoNextStateExt(); - break; - } - return messageResult; -} - -void Klayman::stWonderAboutHalf() { - _status2 = 0; - _acceptInput = true; - startAnimation(0xD820A114, 0, 10); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stWonderAboutAfter() { - _status2 = 1; - _acceptInput = true; - startAnimation(0xD820A114, 30, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stTurnToUseHalf() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x9B250AD2, 0, 7); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) { - playSound(0, 0x4924AAC4); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0A2AA8E0); - } - break; - } - return messageResult; -} - -void Klayman::stTurnAwayFromUse() { - _status2 = 1; - _acceptInput = true; - startAnimation(0x98F88391, 4, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteUpdate(NULL); -} - -void Klayman::stWonderAbout() { - _status2 = 1; - _acceptInput = true; - startAnimation(0xD820A114, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stPeekWall() { - _status2 = 1; - _acceptInput = true; - startAnimation(0xAC20C012, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPeekWall); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender) { - int16 speedUpFrameIndex; - switch (messageNum) { - case 0x1008: - speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_currFrameIndex < speedUpFrameIndex) - startAnimation(0xAC20C012, speedUpFrameIndex, -1); - return 0; - case 0x100D: - if (param.asInteger() == 0x32180101) { - playSound(0, 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0460E2FA); - } - break; - } - return hmLowLevelAnimation(messageNum, param, sender); -} - -void Klayman::stJumpToRing1() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing1))) { - _status2 = 0; - startAnimation(0xD82890BA, 0, -1); - setupJumpToRing(); - } -} - -void Klayman::setupJumpToRing() { - _acceptInput = false; - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmJumpToRing); - SetSpriteUpdate(&Klayman::suUpdateDestX); - NextState(&Klayman::stHangOnRing); - sendMessage(_attachedSprite, 0x482B, 0); -} - -uint32 Klayman::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x168050A0) { - sendMessage(_attachedSprite, 0x4806, 0); - _acceptInput = true; - } else if (param.asInteger() == 0x320AC306) { - playSound(0, 0x5860C640); - } else if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } - break; - } - return messageResult; -} - -void Klayman::suUpdateDestX() { - AnimatedSprite::updateDeltaXY(); - _destX = _x; -} - -void Klayman::stHangOnRing() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x4829E0B8, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); -} - -void Klayman::stJumpToRing2() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing2))) { - _status2 = 0; - startAnimation(0x900980B2, 0, -1); - setupJumpToRing(); - } -} - -void Klayman::stJumpToRing3() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing3))) { - _status2 = 0; - _acceptInput = false; - startAnimation(0xBA1910B2, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::hmJumpToRing3); - NextState(&Klayman::stHoldRing3); - sendMessage(_attachedSprite, 0x482B, 0); - } -} - -uint32 Klayman::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x168050A0) { - sendMessage(_attachedSprite, 0x4806, 0); - } else if (param.asInteger() == 0x320AC306) { - playSound(0, 0x5860C640); - } else if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } - break; - } - return messageResult; -} - -void Klayman::stHoldRing3() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x4A293FB0, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmHoldRing3); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *sender) { - if (messageNum == 0x1008) { - stReleaseRing(); - return 0; - } - return hmLowLevel(messageNum, param, sender); -} - -void Klayman::stReleaseRing() { - _status2 = 1; - _acceptInput = false; - sendMessage(_attachedSprite, 0x4807, 0); - _attachedSprite = NULL; - startAnimation(0xB869A4B9, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stJumpToRing4() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpToRing4))) { - _status2 = 0; - startAnimation(0xB8699832, 0, -1); - setupJumpToRing(); - } -} - -void Klayman::sub41CCE0(int16 x) { - sub41CC40(_attachedSprite->getX(), x); -} - -void Klayman::stContinueClimbLadderUp() { - _status2 = 0; - _acceptInput = true; - _ladderStatus = 3; - startAnimationByHash(0x3A292504, 0x01084280, 0); - _newStickFrameHash = 0x01084280; - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); - gotoNextStateExt(); -} - -void Klayman::stStartClimbLadderDown() { - if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderDown))) { - _status2 = 0; - if (_destY < _y) { - if (_ladderStatus == 1) { - _ladderStatus = 2; - stClimbLadderHalf(); - } else { - gotoNextStateExt(); - } - } else if (_ladderStatus == 0) { - _ladderStatus = 2; - _acceptInput = false; - startAnimation(0x122D1505, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } else if (_ladderStatus == 3) { - _ladderStatus = 2; - _acceptInput = true; - startAnimationByHash(0x122D1505, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } else if (_ladderStatus == 1) { - _ladderStatus = 2; - _acceptInput = true; - startAnimation(0x122D1505, 29 - _currFrameIndex, -1); - } - } -} - -void Klayman::stClimbLadderHalf() { - _status2 = 2; - if (_ladderStatus == 1) { - _ladderStatus = 0; - _acceptInput = false; - startAnimationByHash(0x3A292504, 0x02421405, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClimbLadderHalf); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } else if (_ladderStatus == 2) { - _ladderStatus = 0; - _acceptInput = false; - startAnimationByHash(0x122D1505, 0x02421405, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClimbLadderHalf); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } else { - gotoNextStateExt(); - } -} - -uint32 Klayman::hmClimbLadderHalf(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x489B025C) { - playSound(0, 0x52C4C2D7); - } else if (param.asInteger() == 0x400A0E64) { - playSound(0, 0x50E081D9); - } else if (param.asInteger() == 0x32180101) { - playSound(0, 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0460E2FA); - } - break; - } - return messageResult; -} - -uint32 Klayman::hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x01084280) { - _acceptInput = true; - } else if (param.asInteger() == 0x489B025C) { - playSound(0, 0x52C4C2D7); - } else if (param.asInteger() == 0x400A0E64) { - playSound(0, 0x50E081D9); - } else if (param.asInteger() == 0x02421405) { - if (_ladderStatus == 1) { - startAnimationByHash(0x3A292504, 0x01084280, 0); - if (_destY >= _y - 30) - sendMessage(this, 0x1019, 0); - } else { - startAnimationByHash(0x122D1505, 0x01084280, 0); - if (_destY <= _y) - sendMessage(this, 0x1019, 0); - } - } - break; - } - return messageResult; -} - -void Klayman::stStartClimbLadderUp() { - if (!stStartAction(AnimationCallback(&Klayman::stStartClimbLadderUp))) { - _status2 = 0; - if (_destY >= _y - 30) { - gotoNextStateExt(); - } else if (_ladderStatus == 0) { - _ladderStatus = 1; - _acceptInput = false; - startAnimation(0x3A292504, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } else if (_ladderStatus == 3) { - _ladderStatus = 1; - _acceptInput = true; - startAnimationByHash(0x3A292504, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClimbLadderUpDown); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } else if (_ladderStatus == 2) { - _ladderStatus = 1; - _acceptInput = true; - startAnimation(0x3A292504, 29 - _currFrameIndex, -1); - } - } -} - -void Klayman::stWalkToFrontNoStep() { - _status2 = 2; - _acceptInput = false; - startAnimationByHash(0xF229C003, 0x14884392, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -uint32 Klayman::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x80C110B5) { - sendMessage(_parentScene, 0x482A, 0); - } else if (param.asInteger() == 0x110010D1) { - sendMessage(_parentScene, 0x482B, 0); - } else if (param.asInteger() == 0x32180101) { - playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); - } - break; - } - return messageResult; -} - -void Klayman::stWalkToFront() { - if (!stStartAction(AnimationCallback(&Klayman::stWalkToFront))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0xF229C003, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stTurnToFront() { - if (!stStartAction(AnimationCallback(&Klayman::stTurnToFront))) { - _status2 = 0; - _acceptInput = false; - startAnimationByHash(0xCA221107, 0, 0x8520108C); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stTurnToBack() { - if (!stStartAction(AnimationCallback(&Klayman::stTurnToBack))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0xCA221107, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalkToFront); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stLandOnFeet() { - _status2 = 1; - _acceptInput = true; - startAnimation(0x18118554, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLandOnFeet); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x320AC306) { - playSound(0, 0x5860C640); - } - break; - } - return messageResult; -} - -void Klayman::stTurnToBackToUse() { - if (!stStartAction(AnimationCallback(&Klayman::stTurnToBackToUse))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x91540140, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTurnToBackToUse); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -uint32 Klayman::hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xC61A0119) { - playSound(0, 0x402338C2); - } else if (param.asInteger() == 0x32180101) { - playSound(0, 0x4924AAC4); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0A2AA8E0); - } - break; - } - return messageResult; -} - -void Klayman::stClayDoorOpen() { - if (!stStartAction(AnimationCallback(&Klayman::stClayDoorOpen))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x5CCCB330, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmClayDoorOpen); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -uint32 Klayman::hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x040D4186) { - sendMessage(_attachedSprite, 0x4808, 0); - } - break; - } - return messageResult; -} - -void Klayman::stTurnToUse() { - if (!stStartAction(AnimationCallback(&Klayman::stTurnToUse))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x9B250AD2, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stReturnFromUse() { - _status2 = 2; - _acceptInput = false; - startAnimation(0x98F88391, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stWalkingOpenDoor() { - _isWalkingOpenDoorNotified = false; - _acceptInput = false; - startAnimation(0x11A8E012, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStartWalking); - SetSpriteUpdate(&Klayman::suWalkingOpenDoor); -} - -void Klayman::suWalkingOpenDoor() { - if (!_isWalkingOpenDoorNotified && ABS(_destX - _x) < 80) { - sendMessage(_parentScene, 0x4829, 0); - _isWalkingOpenDoorNotified = true; - } - AnimatedSprite::updateDeltaXY(); -} - -void Klayman::stMoveObjectSkipTurnFaceObject() { - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - _isMoveObjectRequested = false; - _acceptInput = true; - startAnimationByHash(0x0C1CA072, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::hmMoveObjectTurn); -} - -void Klayman::evMoveObjectTurnDone() { - sendMessage(_attachedSprite, 0x4807, 0); -} - -uint32 Klayman::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x01084280) { - sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); - } else if (param.asInteger() == 0x02421405) { - if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { - stMoveObjectSkipTurn(); - } else { - FinalizeState(&Klayman::evMoveObjectTurnDone); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - } - } else if (param.asInteger() == 0x32180101) { - playSound(0, 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0460E2FA); - } - break; - case 0x480A: - _isMoveObjectRequested = true; - return 0; - } - return hmLowLevelAnimation(messageNum, param, sender); -} - -void Klayman::stMoveObjectSkipTurn() { - _isMoveObjectRequested = false; - _acceptInput = true; - startAnimationByHash(0x0C1CA072, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::hmMoveObjectTurn); -} - -void Klayman::stMoveObjectFaceObject() { - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - if (!stStartAction(AnimationCallback(&Klayman::stMoveObjectFaceObject))) { - _status2 = 2; - _isMoveObjectRequested = false; - _acceptInput = true; - startAnimation(0x0C1CA072, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmMoveObjectTurn); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stUseLever() { - if (!stStartAction(AnimationCallback(&Klayman::stUseLever))) { - _status2 = 0; - if (_isLeverDown) { - stUseLeverRelease(); - } else { - sendMessage(_attachedSprite, 0x482B, 0); - startAnimation(0x0C303040, 0, -1); - SetSpriteUpdate(&Klayman::suUpdateDestX); - SetMessageHandler(&Klayman::hmLever); - SetUpdateHandler(&Klayman::update); - NextState(&Klayman::stPullLeverDown); - _acceptInput = false; - } - } -} - -// Exactly the same code as sub420DA0 which was removed -void Klayman::stPullLeverDown() { - startAnimation(0x0D318140, 0, -1); - sendMessage(_attachedSprite, 0x480F, 0); - NextState(&Klayman::stHoldLeverDown); -} - -void Klayman::stHoldLeverDown() { - startAnimation(0x4464A440, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(&Klayman::suUpdateDestX); - _isLeverDown = true; - _acceptInput = true; -} - -void Klayman::stUseLeverRelease() { - startAnimation(0x09018068, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLever); - SetSpriteUpdate(&Klayman::suUpdateDestX); - sendMessage(_attachedSprite, 0x4807, 0); - NextState(&Klayman::stPullLeverDown); - _acceptInput = false; -} - -void Klayman::stReleaseLever() { - if (_isLeverDown) { - _status2 = 2; - startAnimation(0x09018068, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLever); - SetSpriteUpdate(&Klayman::suUpdateDestX); - sendMessage(_attachedSprite, 0x4807, 0); - NextState(&Klayman::stLetGoOfLever); - _acceptInput = false; - _isLeverDown = false; - } else { - gotoNextStateExt(); - } -} - -void Klayman::stLetGoOfLever() { - startAnimation(0x0928C048, 0, -1); - FinalizeState(&Klayman::evLeverReleasedEvent); -} - -void Klayman::evLeverReleasedEvent() { - sendMessage(_attachedSprite, 0x482A, 0); -} - -void Klayman::stInsertDisk() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertDisk))) { - _status2 = 2; - _tapesToInsert = 0; - for (uint32 i = 0; i < 20; i++) { - if (getSubVar(VA_HAS_TAPE, i)) { - setSubVar(VA_IS_TAPE_INSERTED, i, 1); - setSubVar(VA_HAS_TAPE, i, 0); - _tapesToInsert++; - } - } - if (_tapesToInsert == 0) { - GotoState(NULL); - gotoNextStateExt(); - } else { - startAnimation(0xD8C8D100, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmInsertDisk); - SetSpriteUpdate(&Klayman::suAction); - _acceptInput = false; - _tapesToInsert--; - } - } -} - -uint32 Klayman::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) { - nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); - } else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { - _tapesToInsert--; - startAnimationByHash(0xD8C8D100, 0x01084280, 0); - } else if (param.asInteger() == 0x062A1510) { - playSound(0, 0x41688704); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - playSound(0, 0x44051000); - } else if (param.asInteger() == 0x0E040501) { - playSound(1, 0xC6A129C1); - } - } - return messageResult; -} - -void Klayman::walkAlongPathPoints() { - if (_x <= (*_pathPoints)[0].x) - _y = (*_pathPoints)[0].y; - else if (_x >= (*_pathPoints)[_pathPoints->size() - 1].x) - _y = (*_pathPoints)[_pathPoints->size() - 1].y; - else { - int16 deltaX = _x - (*_pathPoints)[0].x, deltaXIncr = 0; - uint index = 0; - while (deltaX > 0) { - NPoint pt2 = (*_pathPoints)[index]; - NPoint pt1 = index + 1 >= _pathPoints->size() ? (*_pathPoints)[0] : (*_pathPoints)[index + 1]; - int16 xd = ABS(pt1.x - pt2.x); - int16 yd = ABS(pt1.y - pt2.y); - if (deltaX + deltaXIncr >= xd) { - deltaX -= xd; - deltaX += deltaXIncr; - ++index; - if (index >= _pathPoints->size()) - index = 0; - _y = (*_pathPoints)[index].y; - } else { - deltaXIncr += deltaX; - if (pt1.y >= pt2.y) { - _y = pt2.y + (yd * deltaXIncr) / xd; - } else { - _y = pt2.y - (yd * deltaXIncr) / xd; - } - deltaX = 0; - } - } - } -} - -void Klayman::stJumpToGrab() { - _status2 = 0; - _acceptInput = false; - startAnimationByHash(0x00AB8C10, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suJumpToGrab); - SetMessageHandler(&Klayman::hmJumpToGrab); -} - -void Klayman::suJumpToGrab() { - updateDeltaXY(); - if (_y >= _destY) { - _y = _destY; - updateBounds(); - gotoNextStateExt(); - } -} - -uint32 Klayman::hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x168050A0) - sendMessage(_attachedSprite, 0x4806, 0); - else if (param.asInteger() == 0x320AC306) - startAnimationByHash(0x00AB8C10, 0x01084280, 0); - else if (param.asInteger() == 0x4AB28209) - sendMessage(_attachedSprite, 0x482A, 0); - else if (param.asInteger() == 0x88001184) - sendMessage(_attachedSprite, 0x482B, 0); - break; - } - return messageResult; -} - -void Klayman::stFinishGrow() { - _status2 = 2; - _acceptInput = false; - startAnimation(0x38445000, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::hmFinishGrow); -} - -uint32 Klayman::hmFinishGrow(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x040C4C01) - playSound(0, 0x01E11140); - break; - } - return messageResult; -} - -void Klayman::stTurnToUseExt() { - if (!stStartAction(AnimationCallback(&Klayman::stTurnToUseExt))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x1B3D8216, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTurnToUse); - SetSpriteUpdate(&Klayman::suUpdateDestX); - } -} - -void Klayman::stJumpToGrabFall() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpToGrabFall))) { - _status2 = 0; - _acceptInput = false; - startAnimation(0x00AB8C10, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmJumpToGrab); - SetSpriteUpdate(&Klayman::suJumpToGrab); - sendMessage(_attachedSprite, 0x482B, 0); - } -} - -void Klayman::stJumpToGrabRelease() { - _status2 = 1; - _acceptInput = false; - startAnimationByHash(0x00AB8C10, 0x320AC306, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmJumpToGrabRelease); - SetSpriteUpdate(NULL); - NextState(&Klayman::stReleaseRing); -} - -uint32 Klayman::hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x320AC306) - playSound(0, 0x5860C640); - break; - } - return messageResult; -} - -void Klayman::stDoIdleTeleporterHands() { - startIdleAnimation(0x90EF8D38, AnimationCallback(&Klayman::stIdleTeleporterHands)); -} - -void Klayman::stIdleTeleporterHands() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x90EF8D38, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); - NextState(&Klayman::stSitIdleTeleporterBlinkSecond); -} - -void Klayman::stDoIdleTeleporterHands2() { - startIdleAnimation(0x900F0930, AnimationCallback(&Klayman::stIdleTeleporterHands2)); -} - -void Klayman::stIdleTeleporterHands2() { - _status2 = 0; - _acceptInput = true; - startAnimation(0x900F0930, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); - NextState(&Klayman::stSitIdleTeleporterBlinkSecond); -} - -void Klayman::teleporterAppear(uint32 fileHash) { - _status2 = 0; - _acceptInput = false; - startAnimation(fileHash, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTeleporterAppearDisappear); - SetSpriteUpdate(NULL); -} - -void Klayman::teleporterDisappear(uint32 fileHash) { - _status2 = 0; - _acceptInput = false; - startAnimation(fileHash, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTeleporterAppearDisappear); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4E0A2C24) { - playSound(0, 0x85B10BB8); - } else if (param.asInteger() == 0x4E6A0CA0) { - playSound(0, 0xC5B709B0); - } - break; - } - return messageResult; -} - -uint32 Klayman::hmShrink(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x80C110B5) - sendMessage(_parentScene, 0x482A, 0); - else if (param.asInteger() == 0x33288344) - playSound(2, 0x10688664); - break; - } - return messageResult; -} - -void Klayman::stShrink() { - _status2 = 0; - _acceptInput = false; - playSound(0, 0x4C69EA53); - startAnimation(0x1AE88904, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmShrink); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -void Klayman::stStandWonderAbout() { - if (_x > 260) - setDoDeltaX(1); - _status2 = 0; - _acceptInput = true; - startAnimation(0xD820A114, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); - _newStickFrameIndex = 10; -} - -uint32 Klayman::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x1008: - if (_potionFlag1) { - startAnimationByHash(0x1C388C04, 0x004A2148, 0); - messageResult = 0; - } else - _potionFlag2 = true; - break; - case 0x100D: - if (param.asInteger() == 0x0002418E) - sendMessage(_parentScene, 0x2000, 0); - else if (param.asInteger() == 0x924090C2) { - _potionFlag1 = true; - if (_potionFlag2) { - startAnimationByHash(0x1C388C04, 0x004A2148, 0); - messageResult = 0; - } - } else if (param.asInteger() == 0x004A2148) - _potionFlag1 = false; - else if (param.asInteger() == 0x02B20220) - playSound(0, 0xC5408620); - else if (param.asInteger() == 0x0A720138) - playSound(0, 0xD4C08010); - else if (param.asInteger() == 0x03020231) - playSound(0, 0xD4C08010); - else if (param.asInteger() == 0xB613A180) - playSound(0, 0x44051000); - else if (param.asInteger() == 0x67221A03) - playSound(0, 0x44051000); - else if (param.asInteger() == 0x038A010B) - playSound(0, 0x00018040); - else if (param.asInteger() == 0x422B0280) - playSound(0, 0x166FC6E0); - else if (param.asInteger() == 0x925A0C1E) - playSound(0, 0x40E5884D); - else if (param.asInteger() == 0x000F0082) - playSound(0, 0x546CDCC1); - else if (param.asInteger() == 0x00020814) - playSound(0, 0x786CC6D0); - else if (param.asInteger() == 0x06020500) - playSound(0, 0x1069C0E1); - else if (param.asInteger() == 0x02128C00) - playSound(0, 0x5068C4C3); - else if (param.asInteger() == 0x82022030) - playSound(0, 0x5C48C0E8); - break; - } - return messageResult; -} - -uint32 Klayman::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x32180101) - playSound(0, 0x405002D8); - else if (param.asInteger() == 0x0A2A9098) - playSound(0, 0x0460E2FA); - else if (param.asInteger() == 0xD00A0C0C) - playSound(3); - else if (param.asInteger() == 0x04121920) - playSound(4); - else if (param.asInteger() == 0x030B4480) - playSound(5); - else if (param.asInteger() == 0x422B0280) - playSound(6); - else if (param.asInteger() == 0x038A010B) - playSound(7); - else if (param.asInteger() == 0x67221A03) - playSound(0, 0x44051000); - else if (param.asInteger() == 0x02B20220) - playSound(0, 0xC5408620); - else if (param.asInteger() == 0x925A0C1E) - playSound(0, 0x40E5884D); - else if (param.asInteger() == 0x03020231) - playSound(0, 0xD4C08010); - else if (param.asInteger() == 0x08040840) - setDoDeltaX(2); - break; - } - return messageResult; -} - -void Klayman::stGrow() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2838C010, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmGrow); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -void Klayman::stDrinkPotion() { - _status2 = 1; - _acceptInput = false; - _potionFlag1 = false; - _potionFlag2 = false; - startAnimation(0x1C388C04, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmDrinkPotion); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -uint32 Klayman::hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (_keysToInsert == 0 && param.asInteger() == 0x06040580) { - nextAnimationByHash(0xDC409440, 0x46431401, 0); - } else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) { - _keysToInsert--; - startAnimationByHash(0xDC409440, 0x01084280, 0); - } else if (param.asInteger() == 0x062A1510) { - playSound(0, 0x41688704); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - playSound(0, 0x44051000); - } else if (param.asInteger() == 0x0E4C8141) { - playSound(0, 0xDC4A1280); - } - break; - } - return messageResult; -} - -void Klayman::stInsertKey() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stInsertKey))) { - _status2 = 2; - _keysToInsert = 0; - for (uint32 i = 0; i < 3; i++) { - if (getSubVar(VA_HAS_KEY, i)) { - bool more; - setSubVar(VA_IS_KEY_INSERTED, i, 1); - setSubVar(VA_HAS_KEY, i, 0); - do { - more = false; - setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); - for (uint j = 0; j < i && !more; j++) { - if (getSubVar(VA_IS_KEY_INSERTED, j) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i)) - more = true; - } - if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i)) - more = true; - } while (more); - _keysToInsert++; - } - } - if (_keysToInsert == 0) { - GotoState(NULL); - gotoNextStateExt(); - } else { - _acceptInput = false; - startAnimation(0xDC409440, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmInsertKey); - SetSpriteUpdate(&Klayman::suAction); - _keysToInsert--; - } - } -} - -uint32 Klayman::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x04684052) { - _acceptInput = true; - sendMessage(_parentScene, 0x2002, 0); - } - break; - } - return messageResult; -} - -void Klayman::stReadNote() { - _status2 = 2; - _acceptInput = false; - startAnimation(0x123E9C9F, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmReadNote); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -uint32 Klayman::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - int16 speedUpFrameIndex; - switch (messageNum) { - case 0x1008: - speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_currFrameIndex < speedUpFrameIndex) { - startAnimation(0x35AA8059, speedUpFrameIndex, -1); - _y = 438; - } - messageResult = 0; - break; - case 0x100D: - if (param.asInteger() == 0x1A1A0785) { - playSound(0, 0x40F0A342); - } else if (param.asInteger() == 0x60428026) { - playSound(0, 0x40608A59); - } - break; - } - return messageResult; -} - -void Klayman::stHitByDoor() { - _status2 = 1; - _acceptInput = false; - startAnimation(0x35AA8059, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmHitByDoor); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - playSound(0, 0x402E82D4); -} - -uint32 Klayman::hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == calcHash("PopBalloon")) { - sendMessage(_parentScene, 0x2000, 0); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - playSound(0, 0x44051000); - } - break; - } - return messageResult; -} - -void Klayman::upPeekWallBlink() { - Klayman::update(); - _blinkCounter++; - if (_blinkCounter >= _blinkCounterMax) - stPeekWallBlink(); -} - -void Klayman::stPeekWall1() { - _status2 = 0; - _acceptInput = true; - startAnimation(0xAC20C012, 8, 37); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); - NextState(&Klayman::stPeekWallBlink); -} - -void Klayman::stPeekWall2() { - _status2 = 1; - _acceptInput = false; - startAnimation(0xAC20C012, 43, 49); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::hmLowLevelAnimation); -} - -void Klayman::stPeekWallBlink() { - _blinkCounter = 0; - _status2 = 0; - _acceptInput = true; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; - startAnimation(0xAC20C012, 38, 42); - SetUpdateHandler(&Klayman::upPeekWallBlink); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::hmLowLevel); - _newStickFrameIndex = 42; -} - -void Klayman::stPeekWallReturn() { - _status2 = 0; - _acceptInput = false; - startAnimation(0x2426932E, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPeekWallReturn); - SetSpriteUpdate(NULL); -} - -void Klayman::stPullHammerLever() { - if (!stStartAction(AnimationCallback(&Klayman::stPullHammerLever))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x00648953, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPullHammerLever); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - } -} - -uint32 Klayman::hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::hmLever(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) - sendMessage(_attachedSprite, 0x480F, 0); - break; - } - return messageResult; -} - -void Klayman::suRidePlatformDown() { - _platformDeltaY++; - _y += _platformDeltaY; - if (_y > 600) - sendMessage(this, 0x1019, 0); -} - -void Klayman::stRidePlatformDown() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatformDown))) { - _status2 = 1; - sendMessage(_parentScene, 0x4803, 0); - _acceptInput = false; - _platformDeltaY = 0; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(&Klayman::suRidePlatformDown); - _vm->_soundMan->playSoundLooping(0xD3B02847); - } -} - -void Klayman::stCrashDown() { - playSound(0, 0x41648271); - _status2 = 1; - _acceptInput = false; - startAnimationByHash(0x000BAB02, 0x88003000, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - NextState(&Klayman::stCrashDownFinished); -} - -void Klayman::stCrashDownFinished() { - setDoDeltaX(2); - stTryStandIdle(); -} - -void Klayman::upSpitOutFall() { - Klayman::update(); - if (_countdown1 != 0 && (--_countdown1 == 0)) { - _surface->setVisible(true); - SetUpdateHandler(&Klayman::update); - } -} - -uint32 Klayman::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x168050A0) { - sendMessage(_attachedSprite, 0x480F, 0); - } else if (param.asInteger() == 0x586B0300) { - sendMessage(_otherSprite, 0x480E, 1); - } else if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } - break; - } - return messageResult; -} - -uint32 Klayman::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x4811: - playSound(0, 0x5252A0E4); - setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - if (_doDeltaX) { - _x = ((Sprite*)sender)->getX() - 75; - } else { - _x = ((Sprite*)sender)->getX() + 75; - } - _y = ((Sprite*)sender)->getY() - 200; - if (param.asInteger() == 0) { - stSpitOutFall0(); - } else if (param.asInteger() == 1) { - // NOTE This is never used and the code was removed - // Also the animations used here in the original don't exist... - } else if (param.asInteger() == 2) { - stSpitOutFall2(); - } - break; - } - return 0; -} - -uint32 Klayman::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x942D2081) { - _acceptInput = false; - sendMessage(_attachedSprite, 0x2003, 0); - } else if (param.asInteger() == 0xDA600012) { - stHitByBoxingGlove(); - } else if (param.asInteger() == 0x0D01B294) { - _acceptInput = false; - sendMessage(_attachedSprite, 0x480B, 0); - } - break; - } - return messageResult; -} - -uint32 Klayman::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x01084280) { - sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX); - } else if (param.asInteger() == 0x02421405) { - if (_isMoveObjectRequested) { - if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) - stContinueMovingVenusFlyTrap(); - } else { - SetMessageHandler(&Klayman::hmFirstMoveVenusFlyTrap); - } - } else if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } else if (param.asInteger() == 0x32180101) { - playSound(0, 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0460E2FA); - } - break; - case 0x480A: - _isMoveObjectRequested = true; - return 0; - } - return hmLowLevelAnimation(messageNum, param, sender); -} - -uint32 Klayman::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) { - sendMessage(_attachedSprite, 0x482A, 0); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_attachedSprite, 0x482B, 0); - } else if (param.asInteger() == 0x32180101) { - playSound(0, 0x405002D8); - } else if (param.asInteger() == 0x0A2A9098) { - playSound(0, 0x0460E2FA); - } - break; - } - return messageResult; -} - -uint32 Klayman::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { - int16 speedUpFrameIndex; - uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x1008: - speedUpFrameIndex = getFrameIndex(kKlaymanSpeedUpHash); - if (_currFrameIndex < speedUpFrameIndex) { - startAnimation(0x35AA8059, speedUpFrameIndex, -1); - _y = 435; - } - messageResult = 0; - break; - case 0x100D: - if (param.asInteger() == 0x1A1A0785) { - playSound(0, 0x40F0A342); - } else if (param.asInteger() == 0x60428026) { - playSound(0, 0x40608A59); - } - break; - } - return messageResult; -} - -uint32 Klayman::hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmLowLevel(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x1307050A) { - playSound(0, 0x40428A09); - } - break; - } - return messageResult; -} - -void Klayman::suFallDown() { - AnimatedSprite::updateDeltaXY(); - HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); - if (hitRect->type == 0x5001) { - _y = hitRect->rect.y1; - updateBounds(); - sendMessage(this, 0x1019, 0); - } - _parentScene->checkCollision(this, 0xFFFF, 0x4810, 0); -} - -void Klayman::stJumpToRingVenusFlyTrap() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpToRingVenusFlyTrap))) { - _status2 = 2; - _acceptInput = false; - startAnimation(0x584984B4, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmJumpToRingVenusFlyTrap); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - NextState(&Klayman::stLandOnFeet); - sendMessage(_attachedSprite, 0x482B, 0); - } -} - -void Klayman::stStandIdleSpecial() { - playSound(0, 0x56548280); - _status2 = 0; - _acceptInput = false; - _surface->setVisible(false); - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmStandIdleSpecial); - SetSpriteUpdate(NULL); -} - -void Klayman::stSpitOutFall0() { - _countdown1 = 1; - _status2 = 0; - _acceptInput = false; - startAnimation(0x000BAB02, 0, -1); - SetUpdateHandler(&Klayman::upSpitOutFall); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(&Klayman::suFallDown); - NextState(&Klayman::stFalling); - sendMessage(_parentScene, 0x8000, 0); -} - -void Klayman::stSpitOutFall2() { - _countdown1 = 1; - _status2 = 0; - _acceptInput = false; - startAnimation(0x9308C132, 0, -1); - SetUpdateHandler(&Klayman::upSpitOutFall); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(&Klayman::suFallDown); - NextState(&Klayman::stFalling); - sendMessage(_parentScene, 0x8000, 0); -} - -void Klayman::stFalling() { - sendMessage(_parentScene, 0x1024, 1); - playSound(0, 0x41648271); - _status2 = 1; - _acceptInput = false; - _isWalking = false; - startAnimationByHash(0x000BAB02, 0x88003000, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(NULL); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - NextState(&Klayman::stFallTouchdown); - sendMessage(_parentScene, 0x2002, 0); - _attachedSprite = NULL; - sendMessage(_parentScene, 0x8001, 0); -} - -void Klayman::stFallTouchdown() { - setDoDeltaX(2); - stTryStandIdle(); -} - -void Klayman::stJumpAndFall() { - if (!stStartAction(AnimationCallback(&Klayman::stJumpAndFall))) { - sendMessage(_parentScene, 0x1024, 3); - _status2 = 2; - _acceptInput = false; - startAnimation(0xB93AB151, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmJumpAndFall); - SetSpriteUpdate(&Klayman::suFallDown); - NextState(&Klayman::stLandOnFeet); - } -} - -void Klayman::stDropFromRing() { - if (_attachedSprite) { - _x = _attachedSprite->getX(); - sendMessage(_attachedSprite, 0x4807, 0); - _attachedSprite = NULL; - } - _status2 = 2; - _acceptInput = false; - startAnimation(0x586984B1, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(&Klayman::suFallDown); - NextState(&Klayman::stLandOnFeet); -} - -void Klayman::stPressDoorButton() { - _status2 = 2; - _acceptInput = true; - setDoDeltaX(0); - startAnimation(0x1CD89029, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmPressDoorButton); - SetSpriteUpdate(&Klayman::suAction); -} - -void Klayman::stHitByBoxingGlove() { - _status2 = 1; - _acceptInput = false; - startAnimation(0x35AA8059, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmHitByBoxingGlove); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klayman::evHitByBoxingGloveDone); -} - -void Klayman::evHitByBoxingGloveDone() { - sendMessage(_parentScene, 0x1024, 1); -} - -void Klayman::stMoveVenusFlyTrap() { - if (!stStartAction(AnimationCallback(&Klayman::stMoveVenusFlyTrap))) { - _status2 = 2; - _isMoveObjectRequested = false; - _acceptInput = true; - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - startAnimation(0x5C01A870, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmMoveVenusFlyTrap); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klayman::evMoveVenusFlyTrapDone); - } -} - -void Klayman::stContinueMovingVenusFlyTrap() { - _isMoveObjectRequested = false; - _acceptInput = true; - startAnimationByHash(0x5C01A870, 0x01084280, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmMoveVenusFlyTrap); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - FinalizeState(&Klayman::evMoveVenusFlyTrapDone); -} - -void Klayman::evMoveVenusFlyTrapDone() { - sendMessage(_attachedSprite, 0x482A, 0); -} - -void Klayman::suFallSkipJump() { - updateDeltaXY(); - HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); - if (hitRect->type == 0x5001) { - _y = hitRect->rect.y1; - updateBounds(); - sendMessage(this, 0x1019, 0); - } -} - -void Klayman::stFallSkipJump() { - _status2 = 2; - _acceptInput = false; - startAnimationByHash(0xB93AB151, 0x40A100F8, 0); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suFallSkipJump); - SetMessageHandler(&Klayman::hmLowLevel); - NextState(&Klayman::stLandOnFeet); -} - -void Klayman::upMoveObject() { - if (_x >= 380) - gotoNextStateExt(); - Klayman::update(); -} - -uint32 Klayman::hmMatch(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x51281850) { - setGlobalVar(V_TNT_DUMMY_FUSE_LIT, 1); - } else if (param.asInteger() == 0x43000538) { - playSound(0, 0x21043059); - } else if (param.asInteger() == 0x02B20220) { - playSound(0, 0xC5408620); - } else if (param.asInteger() == 0x0A720138) { - playSound(0, 0xD4C08010); - } else if (param.asInteger() == 0xB613A180) { - playSound(0, 0x44051000); - } - break; - } - return messageResult; -} - -void Klayman::stFetchMatch() { - if (!stStartAction(AnimationCallback(&Klayman::stFetchMatch))) { - _status2 = 0; - _acceptInput = false; - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - startAnimation(0x9CAA0218, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmMatch); - SetSpriteUpdate(NULL); - NextState(&Klayman::stLightMatch); - } -} - -void Klayman::stLightMatch() { - _status2 = 1; - _acceptInput = false; - setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); - startAnimation(0x1222A513, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmMatch); - SetSpriteUpdate(NULL); -} - -uint32 Klayman::hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x01084280) { - playSound(0, 0x405002D8); - sendMessage(_attachedSprite, 0x480B, 0); - } else if (param.asInteger() == 0x02421405) { - if (_moveObjectCountdown != 0) { - _moveObjectCountdown--; - stContinueMoveObject(); - } else { - SetMessageHandler(&Klayman::hmLowLevelAnimation); - } - } - break; - } - return Klayman::hmLowLevelAnimation(messageNum, param, sender); -} - -uint32 Klayman::hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x000F0082) { - playSound(0, 0x74E2810F); - } - break; - } - return messageResult; -} - -void Klayman::stMoveObject() { - if (!stStartAction(AnimationCallback(&Klayman::stMoveObject))) { - _status2 = 2; - _acceptInput = false; - _moveObjectCountdown = 8; - setDoDeltaX(0); - startAnimation(0x0C1CA072, 0, -1); - SetUpdateHandler(&Klayman::upMoveObject); - SetMessageHandler(&Klayman::hmMoveObject); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - } -} - -void Klayman::stContinueMoveObject() { - _acceptInput = false; - startAnimationByHash(0x0C1CA072, 0x01084280, 0); - SetUpdateHandler(&Klayman::upMoveObject); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&Klayman::hmMoveObject); -} - -void Klayman::stTumbleHeadless() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stTumbleHeadless))) { - _status2 = 1; - _acceptInput = false; - setDoDeltaX(0); - startAnimation(0x2821C590, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmTumbleHeadless); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - NextState(&Klayman::stTryStandIdle); - sendMessage(_parentScene, 0x8000, 0); - playSound(0, 0x62E0A356); - } -} - -void Klayman::stCloseEyes() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stCloseEyes))) { - _status2 = 1; - _acceptInput = false; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); - } -} - -uint32 Klayman::hmSpit(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Klayman::hmLowLevelAnimation(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x16401CA6) { - _canSpitPipe = true; - if (_contSpitPipe) - spitIntoPipe(); - } else if (param.asInteger() == 0xC11C0008) { - _canSpitPipe = false; - _acceptInput = false; - _readyToSpit = false; - } else if (param.asInteger() == 0x018A0001) { - sendMessage(_parentScene, 0x2001, _spitDestPipeIndex); - } - break; - } - return messageResult; -} - -void Klayman::stTrySpitIntoPipe() { - if (_readyToSpit) { - _contSpitPipe = true; - _spitContDestPipeIndex = _spitPipeIndex; - if (_canSpitPipe) - spitIntoPipe(); - } else if (!stStartAction(AnimationCallback(&Klayman::stTrySpitIntoPipe))) { - _status2 = 2; - _acceptInput = true; - _spitDestPipeIndex = _spitPipeIndex; - _readyToSpit = true; - _canSpitPipe = false; - _contSpitPipe = false; - startAnimation(0x1808B150, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSpit); - SetSpriteUpdate(NULL); - } -} - -void Klayman::spitIntoPipe() { - _contSpitPipe = false; - _spitDestPipeIndex = _spitContDestPipeIndex; - _canSpitPipe = false; - _acceptInput = false; - startAnimation(0x1B08B553, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSpit); - SetSpriteUpdate(NULL); - NextState(&Klayman::stContSpitIntoPipe); -} - -void Klayman::stContSpitIntoPipe() { - _canSpitPipe = true; - _acceptInput = true; - startAnimationByHash(0x1808B150, 0x16401CA6, 0); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmSpit); - SetSpriteUpdate(NULL); -} - -void Klayman::suRidePlatform() { - _x = _attachedSprite->getX() - 20; - _y = _attachedSprite->getY() + 46; - updateBounds(); -} - -void Klayman::stRidePlatform() { - if (!stStartActionFromIdle(AnimationCallback(&Klayman::stRidePlatform))) { - _status2 = 1; - _acceptInput = true; - startAnimation(0x5420E254, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(&Klayman::suRidePlatform); - } -} - -void Klayman::stInteractLever() { - if (!stStartAction(AnimationCallback(&Klayman::stInteractLever))) { - _status2 = 0; - if (_isLeverDown) { - stUseLeverRelease(); - } else { - _acceptInput = false; - startAnimation(0x0C303040, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLever); - SetSpriteUpdate(&Klayman::suUpdateDestX); - NextState(&Klayman::stPullLever); - } - } -} - -void Klayman::stPullLever() { - startAnimation(0x0D318140, 0, -1); - NextState(&Klayman::stLookLeverDown); - sendMessage(_attachedSprite, 0x480F, 0); -} - -void Klayman::stLookLeverDown() { - _acceptInput = true; - _isLeverDown = true; - startAnimation(0x1564A2C0, 0, -1); - SetUpdateHandler(&Klayman::update); - SetSpriteUpdate(&Klayman::suUpdateDestX); - NextState(&Klayman::stWaitLeverDown); -} - -void Klayman::stWaitLeverDown() { - _acceptInput = true; - _isLeverDown = true; - startAnimation(0x4464A440, 0, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(&Klayman::suUpdateDestX); -} - -void Klayman::stStartWalkingResume() { - int16 frameIndex = getGlobalVar(V_KLAYMAN_FRAMEINDEX) + _walkResumeFrameIncr; - if (frameIndex < 0 || frameIndex > 13) - frameIndex = 0; - _status2 = 0; - _isWalking = true; - _acceptInput = true; - startAnimation(0x1A249001, frameIndex, -1); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmWalking); - SetSpriteUpdate(&Klayman::suWalkingFirst); - NextState(&Klayman::stUpdateWalkingFirst); - FinalizeState(&Klayman::evStartWalkingDone); -} - -void Klayman::upPeekInsideBlink() { - update(); - ++_blinkCounter; - if (_blinkCounter >= _blinkCounterMax) - stPeekInsideBlink(); -} - -void Klayman::stPeekInside() { - _status2 = 0; - _acceptInput = true; - startAnimation(0xAC20C012, 8, 37); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); - NextState(&Klayman::stPeekInsideBlink); -} - -void Klayman::stPeekInsideReturn() { - _status2 = 1; - _acceptInput = false; - startAnimation(0xAC20C012, 43, 49); - SetUpdateHandler(&Klayman::update); - SetMessageHandler(&Klayman::hmLowLevelAnimation); - SetSpriteUpdate(NULL); -} - -void Klayman::stPeekInsideBlink() { - _status2 = 0; - _acceptInput = true; - startAnimation(0xAC20C012, 38, 42); - _newStickFrameIndex = 42; - SetUpdateHandler(&Klayman::upPeekInsideBlink); - SetMessageHandler(&Klayman::hmLowLevel); - SetSpriteUpdate(NULL); - _blinkCounter = 0; - _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; -} - -//############################################################################## - -// KmScene1001 - -KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { -} - -uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() == 2) - GotoState(&Klayman::stSleeping); - break; - case 0x480D: - GotoState(&Klayman::stPullHammerLever); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4836: - if (param.asInteger() == 1) { - sendMessage(_parentScene, 0x2002, 0); - GotoState(&Klayman::stWakeUp); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -// KmScene1002 - -KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - setKlaymanIdleTable1(); - -} - -void KmScene1002::xUpdate() { - if (_x >= 250 && _x <= 435 && _y >= 420) { - if (_idleTableNum == 0) { - setKlaymanIdleTable(klaymanIdleTable1002, ARRAYSIZE(klaymanIdleTable1002)); - _idleTableNum = 1; - } - } else if (_idleTableNum == 1) { - setKlaymanIdleTable1(); - _idleTableNum = 0; - } -} - -uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x2001: - GotoState(&Klayman::stStandIdleSpecial); - break; - case 0x2007: - _otherSprite = (Sprite*)param.asEntity(); - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4803: - if (param.asInteger() == 1) { - GotoState(&Klayman::stJumpAndFall); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stDropFromRing); - } - break; - case 0x4804: - GotoState(&Klayman::stPeekWall); - break; - case 0x4805: - switch (param.asInteger()) { - case 1: - GotoState(&Klayman::stJumpToRing1); - break; - case 2: - GotoState(&Klayman::stJumpToRing2); - break; - case 3: - GotoState(&Klayman::stJumpToRing3); - break; - case 4: - GotoState(&Klayman::stJumpToRing4); - break; - } - break; - case 0x480A: - GotoState(&Klayman::stMoveVenusFlyTrap); - break; - case 0x480D: - GotoState(&Klayman::stJumpToRingVenusFlyTrap); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 0) { - GotoState(&Klayman::stPressDoorButton); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - sub41CCE0(param.asInteger()); - break; - case 0x4820: - sendMessage(_parentScene, 0x2005, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2005, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2005, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2006, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -// KmScene1004 - -KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _dataResource.load(0x01900A04); -} - -uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x481E: - GotoState(&Klayman::stReadNote); - break; - case 0x4820: - sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x4824: - sendMessage(_parentScene, 0x2000, 0); - _destY = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4825: - sendMessage(_parentScene, 0x2000, 0); - _destY = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4828: - GotoState(&Klayman::stTurnToBackToUse); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) - GotoState(&Klayman::stSitIdleTeleporter); - else - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stWalkingFirst); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - break; - case 0x481E: - if (_isSittingInTeleporter) - GotoState(&Klayman::stReturnFromUseInTeleporter); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483D: - teleporterAppear(0x2C2A4A1C); - break; - case 0x483E: - teleporterDisappear(0x3C2E4245); - break; - } - return messageResult; -} - -// KmScene1201 - -KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); - _flagF6 = true; - -} - -uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480A: - GotoState(&Klayman::stMoveObject); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case 0x4813: - GotoState(&Klayman::stFetchMatch); - break; - case 0x4814: - GotoState(&Klayman::stTumbleHeadless); - break; - case 0x4815: - GotoState(&Klayman::stCloseEyes); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 0) { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x481F: - GotoState(&Klayman::stWonderAbout); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4804: - GotoState(&Klayman::stPeekWall1); - break; - case 0x483B: - GotoState(&Klayman::stPeekWallReturn); - break; - case 0x483C: - GotoState(&Klayman::stPeekWall2); - break; - } - return 0; -} - -KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - GotoState(&Klayman::stCrashDown); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - } - return 0; -} - -KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - -} - -uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) - GotoState(&Klayman::stSitIdleTeleporter); - else - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case NM_KLAYMAN_INSERT_DISK: - GotoState(&Klayman::stInsertDisk); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - else - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - if (_isSittingInTeleporter) - GotoState(&Klayman::stReturnFromUseInTeleporter); - else - GotoState(&Klayman::stReturnFromUse); - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483D: - teleporterAppear(0xEE084A04); - break; - case 0x483E: - teleporterDisappear(0xB86A4274); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return messageResult; -} - -KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480A: - if (param.asInteger() == 1) { - GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); - } else { - GotoState(&Klayman::stMoveObjectFaceObject); - } - break; - case 0x480D: - GotoState(&Klayman::stUseLever); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case NM_KLAYMAN_INSERT_DISK: - if (param.asInteger() == 1) { - GotoState(&Klayman::stInsertKey); - } else { - GotoState(&Klayman::stInsertDisk); - } - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case NM_KLAYMAN_RELEASE_LEVER: - GotoState(&Klayman::stReleaseLever); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -// KmScene1401 - -KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480A: - if (param.asInteger() == 1) { - GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); - } else { - GotoState(&Klayman::stMoveObjectFaceObject); - } - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - } - return 0; -} - -// KmScene1402 - -KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - SetFilterY(&Sprite::defFilterY); -} - -uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480A: - if (param.asInteger() == 1) { - GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); - } else { - GotoState(&Klayman::stMoveObjectFaceObject); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - } - return 0; -} - -// KmScene1403 - -KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - setKlaymanIdleTable(klaymanTable4, ARRAYSIZE(klaymanTable4)); -} - -uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480A: - if (param.asInteger() == 1) { - GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); - } else { - GotoState(&Klayman::stMoveObjectFaceObject); - } - break; - case 0x480D: - GotoState(&Klayman::stUseLever); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case NM_KLAYMAN_RELEASE_LEVER: - GotoState(&Klayman::stReleaseLever); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -// KmScene1404 - -KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480A: - if (param.asInteger() == 1) { - GotoState(&Klayman::stMoveObjectSkipTurnFaceObject); - } else { - GotoState(&Klayman::stMoveObjectFaceObject); - } - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case NM_KLAYMAN_INSERT_DISK: - GotoState(&Klayman::stInsertDisk); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { -} - -uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2032: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) - GotoState(&Klayman::stSitIdleTeleporter); - else - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - break; - case 0x481E: - if (_isSittingInTeleporter) - GotoState(&Klayman::stReturnFromUseInTeleporter); - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2032, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2032, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return messageResult; -} - -// KmScene1705 - -KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) { - GotoState(&Klayman::stSitIdleTeleporter); - } else { - GotoState(&Klayman::stTryStandIdle); - } - break; - case 0x4803: - GotoState(&Klayman::stFallSkipJump); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - if (_isSittingInTeleporter) { - GotoState(&Klayman::stTurnToUseInTeleporter); - } - break; - case 0x481E: - if (_isSittingInTeleporter) { - GotoState(&Klayman::stReturnFromUseInTeleporter); - } - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483D: - teleporterAppear(0x5E0A4905); - break; - case 0x483E: - teleporterDisappear(0xD86E4477); - break; - } - return messageResult; -} - -KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) { - GotoState(&Klayman::stSitIdleTeleporter); - } else - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stWalkingFirst); - } else - GotoState(&Klayman::stPeekWall); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - break; - case 0x481E: - if (_isSittingInTeleporter) { - GotoState(&Klayman::stReturnFromUseInTeleporter); - } - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483D: - teleporterAppear(0xBE68CC54); - break; - case 0x483E: - teleporterDisappear(0x18AB4ED4); - break; - } - return messageResult; -} - -KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - // Empty -} - -uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) - GotoState(&Klayman::stSitIdleTeleporter); - else - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4811: - GotoState(&Klayman::stHitByDoor); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - break; - case 0x481E: - if (_isSittingInTeleporter)//CHECKME - GotoState(&Klayman::stReturnFromUseInTeleporter); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483D: - teleporterAppear(0xFF290E30); - break; - case 0x483E: - teleporterDisappear(0x9A28CA1C); - break; - } - return messageResult; -} - -KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _surface->setClipRects(clipRects, clipRectsCount); - - _dataResource.load(0x04104242); - _flagF6 = false; -} - -uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 0) { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x4819: - GotoState(&Klayman::stClayDoorOpen); - break; - case NM_KLAYMAN_INSERT_DISK: - GotoState(&Klayman::stInsertDisk); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -void KmScene2205::xUpdate() { - setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); -} - -uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stStartWalkingResume); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 0) { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _walkResumeFrameIncr = 1; - _vm->_soundMan->addSound(0x80101800, 0xD3B02847); -} - -KmScene2206::~KmScene2206() { - _vm->_soundMan->deleteSoundGroup(0x80101800); -} - -void KmScene2206::xUpdate() { - setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); -} - -uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4803: - GotoState(&Klayman::stRidePlatformDown); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stStartWalkingResume); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x4837: - stopWalking(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x2001: - GotoState(&Klayman::stRidePlatform); - break; - case 0x2005: - suRidePlatform(); - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480D: - GotoState(&Klayman::stInteractLever); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case NM_KLAYMAN_RELEASE_LEVER: - GotoState(&Klayman::stReleaseLever); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -void KmScene2242::xUpdate() { - setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); -} - -uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stStartWalkingResume); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) { - GotoState(&Klayman::stPickUpNeedle); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stPickUpTube); - } else { - GotoState(&Klayman::stPickUpGeneric); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4837: - stopWalking(); - break; - } - return 0; -} - -KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -void KmHallOfRecords::xUpdate() { - setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); -} - -uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stStartWalkingResume); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4837: - stopWalking(); - break; - } - return 0; -} - -KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -void KmScene2247::xUpdate() { - setGlobalVar(V_KLAYMAN_FRAMEINDEX, _currFrameIndex); -} - -uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stStartWalkingResume); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4837: - stopWalking(); - break; - } - return 0; -} - -KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x4832: - GotoState(&Klayman::stUseTube); - break; - case 0x4833: - if (param.asInteger() == 1) - GotoState(&Klayman::stWonderAbout); - else { - _spitPipeIndex = sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klayman::stTrySpitIntoPipe); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return messageResult; -} - -KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (!getGlobalVar(V_TV_JOKE_TOLD)) - GotoState(&Klayman::stStandWonderAbout); - else - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stWalkingFirst); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return messageResult; -} - -KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x480D: - GotoState(&Klayman::stPullCord); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case NM_KLAYMAN_PRESS_BUTTON: - if (param.asInteger() == 1) { - GotoState(&Klayman::stPressButton); - } else if (param.asInteger() == 2) { - GotoState(&Klayman::stPressFloorButton); - } else { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x4820: - sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return messageResult; -} - -KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _surface->setClipRects(clipRects, clipRectsCount); - -} - -uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - if (param.asInteger() != 0) { - _destX = param.asInteger(); - GotoState(&Klayman::stWalkingFirst); - } else { - GotoState(&Klayman::stPeekWall); - } - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) - GotoState(&Klayman::stPickUpNeedle); - else if (param.asInteger() == 1) - GotoState(&Klayman::stPickUpTube); - else - GotoState(&Klayman::stPickUpGeneric); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481A: - GotoState(&Klayman::stInsertDisk); - break; - case 0x481B: - if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); - else - sub41CCE0(param.asPoint().x); - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x4820: - sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return messageResult; -} - -KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) - GotoState(&Klayman::stSitIdleTeleporter); - else - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - break; - case 0x481E: - if (_isSittingInTeleporter) - GotoState(&Klayman::stReturnFromUseInTeleporter); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - } - return messageResult; -} - -KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4804: - GotoState(&Klayman::stPeekInside); - break; - case 0x483C: - GotoState(&Klayman::stPeekInsideReturn); - break; - } - return 0; -} - -KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x4837: - stopWalking(); - break; - } - return 0; -} - -KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _surface->setClipRects(clipRects, clipRectsCount); - - _dataResource.load(0x00900849); -} - -uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4803: - _destY = param.asInteger(); - GotoState(&Klayman::stJumpToGrab); - break; - case 0x4804: - if (param.asInteger() == 3) - GotoState(&Klayman::stFinishGrow); - break; - case 0x480D: - GotoState(&Klayman::stPullCord); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x481F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else { - GotoState(&Klayman::stWonderAboutHalf); - } - break; - case 0x482E: - GotoState(&Klayman::stWalkToFront); - break; - case 0x482F: - GotoState(&Klayman::stTurnToBack); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4838: - GotoState(&Klayman::stJumpToGrabRelease); - break; - } - return 0; -} - -KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _dataResource.load(0x81120132); -} - -uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToXSmall(param.asPoint().x); - break; - case 0x4004: - GotoState(&Klayman::stStandIdleSmall); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x); - break; - case 0x481F: - if (param.asInteger() == 1) - GotoState(&Klayman::stWonderAboutAfterSmall); - else if (param.asInteger() == 0) - GotoState(&Klayman::stWonderAboutHalfSmall); - else - GotoState(&Klayman::stWonderAboutSmall); - break; - case 0x482E: - if (param.asInteger() == 1) - GotoState(&Klayman::stWalkToFrontNoStepSmall); - else if (param.asInteger() == 2) - GotoState(&Klayman::stWalkToFront2Small); - else - GotoState(&Klayman::stWalkToFrontSmall); - break; - case 0x482F: - if (param.asInteger() == 1) - GotoState(&Klayman::stTurnToBackHalfSmall); - else if (param.asInteger() == 2) - GotoState(&Klayman::stTurnToBackWalkSmall); - else - GotoState(&Klayman::stTurnToBackSmall); - break; - case 0x4830: - GotoState(&Klayman::stShrink); - break; - } - return 0; -} - -KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { - uint32 messageResult = 0; - switch (messageNum) { - case 0x2000: - _isSittingInTeleporter = param.asInteger() != 0; - messageResult = 1; - break; - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - if (_isSittingInTeleporter) - GotoState(&Klayman::stSitIdleTeleporter); - else - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481D: - if (_isSittingInTeleporter) - GotoState(&Klayman::stTurnToUseInTeleporter); - break; - case 0x481E: - if (_isSittingInTeleporter) - GotoState(&Klayman::stReturnFromUseInTeleporter); - break; - case 0x4834: - GotoState(&Klayman::stStepOver); - break; - case 0x4835: - sendMessage(_parentScene, 0x2000, 1); - _isSittingInTeleporter = true; - GotoState(&Klayman::stSitInTeleporter); - break; - case 0x4836: - sendMessage(_parentScene, 0x2000, 0); - _isSittingInTeleporter = false; - GotoState(&Klayman::stGetUpFromTeleporter); - break; - case 0x483D: - teleporterAppear(0xDE284B74); - break; - case 0x483E: - teleporterDisappear(0xD82A4094); - break; - } - return messageResult; -} - -KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - if (flag) { - NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); - delete _surface; - createSurface(1000, dimensions.width, dimensions.height); - loadSound(3, 0x58E0C341); - loadSound(4, 0x40A00342); - loadSound(5, 0xD0A1C348); - loadSound(6, 0x166FC6E0); - loadSound(7, 0x00018040); - } - - _dataResource.load(0x98182003); - _surface->setClipRects(clipRects, clipRectsCount); - -} - -uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - startWalkToX(440, true); - break; - case 0x480D: - GotoState(&Klayman::stPullCord); - break; - case 0x4816: - if (param.asInteger() == 0) { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x4831: - GotoState(&Klayman::stGrow); - break; - case 0x4832: - if (param.asInteger() == 1) { - GotoState(&Klayman::stDrinkPotion); - } else { - GotoState(&Klayman::stUseTube); - } - break; - } - return 0; -} - -KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - if (flag) { - NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); - delete _surface; - createSurface(1000, dimensions.width, dimensions.height); - loadSound(3, 0x58E0C341); - loadSound(4, 0x40A00342); - loadSound(5, 0xD0A1C348); - loadSound(6, 0x166FC6E0); - loadSound(7, 0x00018040); - } - - _dataResource.load(0x1830009A); - _surface->setClipRects(clipRects, clipRectsCount); - -} - -uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4804: - startWalkToX(226, true); - break; - case 0x480D: - GotoState(&Klayman::stPullCord); - break; - case 0x4816: - if (param.asInteger() == 0) { - GotoState(&Klayman::stPressButtonSide); - } - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x4831: - GotoState(&Klayman::stGrow); - break; - case 0x4832: - if (param.asInteger() == 1) { - GotoState(&Klayman::stDrinkPotion); - } else { - GotoState(&Klayman::stUseTube); - } - break; - } - return 0; -} - -KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToXSmall(param.asPoint().x); - break; - case 0x4004: - GotoState(&Klayman::stStandIdleSmall); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x); - break; - case 0x481F: - if (param.asInteger() == 1) - GotoState(&Klayman::stWonderAboutAfterSmall); - else if (param.asInteger() == 0) - GotoState(&Klayman::stWonderAboutHalfSmall); - else - GotoState(&Klayman::stWonderAboutSmall); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStepSmall); - } else { - GotoState(&Klayman::stWalkToFrontSmall); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToBackHalfSmall); - } else { - GotoState(&Klayman::stTurnToBackSmall); - } - break; - case 0x4837: - stopWalking(); - break; - } - return 0; -} - -KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - - _surface->setClipRects(clipRects, clipRectsCount); - -} - -uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4803: - _destY = param.asInteger(); - GotoState(&Klayman::stJumpToGrab); - break; - case 0x4804: - if (param.asInteger() == 3) - GotoState(&Klayman::stFinishGrow); - break; - case NM_KLAYMAN_PICKUP: - GotoState(&Klayman::stPickUpGeneric); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x4818: - startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); - break; - case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } - break; - case 0x481F: - if (param.asInteger() == 0) { - GotoState(&Klayman::stWonderAboutHalf); - } else if (param.asInteger() == 1) { - GotoState(&Klayman::stWonderAboutAfter); - } else if (param.asInteger() == 3) { - GotoState(&Klayman::stTurnToUseHalf); - } else if (param.asInteger() == 4) { - GotoState(&Klayman::stTurnAwayFromUse); - } else if (param.asInteger() == 5) { - GotoState(&Klayman::stTurnToUseExt); - } else { - GotoState(&Klayman::stWonderAbout); - } - break; - case 0x4820: - sendMessage(_parentScene, 0x2000, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2000, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x4824: - sendMessage(_parentScene, 0x2000, 0); - _destY = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4825: - sendMessage(_parentScene, 0x2000, 0); - _destY = _dataResource.getPoint(param.asInteger()).y; - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x4837: - stopWalking(); - break; - } - return 0; -} - -KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klayman(vm, parentScene, x, y, 1000, 1000) { - // Empty -} - -uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { - switch (messageNum) { - case 0x4001: - case 0x4800: - startWalkToX(param.asPoint().x, false); - break; - case 0x4004: - GotoState(&Klayman::stTryStandIdle); - break; - case 0x4805: - _destY = param.asInteger(); - GotoState(&Klayman::stJumpToGrabFall); - break; - case NM_KLAYMAN_PICKUP: - if (param.asInteger() == 2) - GotoState(&Klayman::stPickUpNeedle); - else if (param.asInteger() == 1) - GotoState(&Klayman::stPickUpTube); - else - GotoState(&Klayman::stPickUpGeneric); - break; - case 0x4817: - setDoDeltaX(param.asInteger()); - gotoNextStateExt(); - break; - case 0x481A: - GotoState(&Klayman::stInsertDisk); - break; - case 0x481B: - if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); - else - sub41CCE0(param.asPoint().x); - break; - case 0x481D: - GotoState(&Klayman::stTurnToUse); - break; - case 0x481E: - GotoState(&Klayman::stReturnFromUse); - break; - case 0x4820: - sendMessage(_parentScene, 0x2001, 0); - GotoState(&Klayman::stContinueClimbLadderUp); - break; - case 0x4821: - sendMessage(_parentScene, 0x2001, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderDown); - break; - case 0x4822: - sendMessage(_parentScene, 0x2001, 0); - _destY = param.asInteger(); - GotoState(&Klayman::stStartClimbLadderUp); - break; - case 0x4823: - sendMessage(_parentScene, 0x2002, 0); - GotoState(&Klayman::stClimbLadderHalf); - break; - case 0x482D: - setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); - gotoNextStateExt(); - break; - case 0x482E: - if (param.asInteger() == 1) { - GotoState(&Klayman::stWalkToFrontNoStep); - } else { - GotoState(&Klayman::stWalkToFront); - } - break; - case 0x482F: - if (param.asInteger() == 1) { - GotoState(&Klayman::stTurnToFront); - } else { - GotoState(&Klayman::stTurnToBack); - } - break; - case 0x483F: - startSpecialWalkRight(param.asInteger()); - break; - case 0x4840: - startSpecialWalkLeft(param.asInteger()); - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/klayman.h b/engines/neverhood/klayman.h deleted file mode 100644 index 99fccebc0a..0000000000 --- a/engines/neverhood/klayman.h +++ /dev/null @@ -1,764 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_KLAYMAN_H -#define NEVERHOOD_KLAYMAN_H - -#include "neverhood/neverhood.h" -#include "neverhood/sprite.h" -#include "neverhood/graphics.h" -#include "neverhood/resource.h" - -namespace Neverhood { - -// TODO This code is horrible and weird and a lot of stuff needs renaming once a better name is found -// TODO Also the methods should probably rearranged and be grouped together more consistently - -class Klayman; -class Scene; - -const uint32 kKlaymanSpeedUpHash = 0x004A2148; - -#include "common/pack-start.h" // START STRUCT PACKING - -struct KlaymanIdleTableItem { - int value; - void (Klayman::*callback)(); -}; - -#include "common/pack-end.h" // END STRUCT PACKING - -class Klayman : public AnimatedSprite { -public: - Klayman(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); - - void update(); - - void startIdleAnimation(uint32 fileHash, AnimationCb callback); - void upIdleAnimation(); - - void stDoIdlePickEar(); - void stIdlePickEar(); - void evIdlePickEarDone(); - uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); - - void stDoIdleSpinHead(); - void stIdleSpinHead(); - uint32 hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender); - - void stDoIdleArms(); - void stIdleArms(); - void evIdleArmsDone(); - uint32 hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender); - - void stDoIdleChest(); - void stIdleChest(); - uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); - - void stDoIdleHeadOff(); - void stIdleHeadOff(); - uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); - - void stIdleWonderAbout(); - - void stDoIdleTeleporterHands(); - void stIdleTeleporterHands(); - - void stDoIdleTeleporterHands2(); - void stIdleTeleporterHands2(); - - void stTryStandIdle(); - void stStandAround(); - void upStandIdle(); - void stIdleBlink(); - - bool stStartAction(AnimationCb callback3); - bool stStartActionFromIdle(AnimationCb callback); - uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); - - void stSneak(); - uint32 hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender); - void suSneaking(); - void evSneakingDone(); - - void stStartWalking(); - void stStartWalkingExt(); - void stWalkingOpenDoor(); - void suWalkingOpenDoor(); - void stStepOver(); - uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); - void evStartWalkingDone(); - - void stWalkingFirst(); - void stWalkingFirstExt(); - void stStartWalkingResume(); - void stUpdateWalkingFirst(); - uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); - void suWalkingFirst(); - - void stWalkToFrontNoStep(); - void stWalkToFront(); - void stTurnToFront(); - void stTurnToBack(); - uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); - - void stTurnToBackToUse(); - uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPickUpGeneric(); - void stPickUpNeedle(); - uint32 hmPickUpObject(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPickUpTube(); - uint32 hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender); - - void stTurnToUse(); - void stTurnToUseHalf(); - void stTurnAwayFromUse(); - void stReturnFromUse(); - void stTurnToUseExt(); - uint32 hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender); - - void stLargeStep(); - uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); - void suLargeStep(); - void evLargeStepDone(); - - void stInsertKey(); - uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); - - void stReadNote(); - uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); - - void stHitByDoor(); - uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPeekWall(); - uint32 hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPeekWallReturn(); - uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPeekWallBlink(); - void upPeekWallBlink(); - - void stPeekWall1(); - - void stPeekWall2(); - - void stPullHammerLever(); - uint32 hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender); - - void stRidePlatformDown(); - void suRidePlatformDown(); - - void stCrashDown(); - void stCrashDownFinished(); - - void stShrink(); - uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); - - void stGrow(); - uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); - - void stDrinkPotion(); - uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPullCord(); - void stReleaseCord(); - uint32 hmPullReleaseCord(int messageNum, const MessageParam ¶m, Entity *sender); - - void stUseTube(); - uint32 hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender); - - void stUseLever(); - void stUseLeverRelease(); - void stReleaseLever(); - void stInteractLever(); - uint32 hmLever(int messageNum, const MessageParam ¶m, Entity *sender); - - void stLetGoOfLever(); - void evLeverReleasedEvent(); - - void stWakeUp(); - - void stSleeping(); - uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPressButton(); - void stPressFloorButton(); - void stPressButtonSide(); - uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); - - void stWonderAbout(); - void stWonderAboutHalf(); - void stWonderAboutAfter(); - - void stStandWonderAbout(); - - void stStartClimbLadderUp(); - void stStartClimbLadderDown(); - uint32 hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender); - - void stContinueClimbLadderUp(); - - void stClimbLadderHalf(); - uint32 hmClimbLadderHalf(int messageNum, const MessageParam ¶m, Entity *sender); - - void setupJumpToRing(); - void stJumpToRing1(); - void stJumpToRing2(); - void stJumpToRing4(); - uint32 hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender); - - void stHangOnRing(); - - void stJumpToRing3(); - uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); - - void stHoldRing3(); - uint32 hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *sender); - - void stReleaseRing(); - - void stLandOnFeet(); - uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPullLeverDown(); - void stHoldLeverDown(); - - void stInsertDisk(); - uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); - - void stMoveObjectSkipTurnFaceObject(); - void stMoveObjectSkipTurn(); - void stMoveObjectFaceObject(); - uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); - void evMoveObjectTurnDone(); - - void stJumpToGrab(); - void stJumpToGrabFall(); - uint32 hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender); - void suJumpToGrab(); - - void stJumpToGrabRelease(); - uint32 hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender); - - void stSitInTeleporter(); - uint32 hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender); - - void stSitIdleTeleporter(); - void upSitIdleTeleporter(); - - void stSitIdleTeleporterBlink(); - - void stSitIdleTeleporterBlinkSecond(); - - void stTurnToUseInTeleporter(); - - void stReturnFromUseInTeleporter(); - - void stGetUpFromTeleporter(); - - void teleporterAppear(uint32 fileHash); - void teleporterDisappear(uint32 fileHash); - uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); - - void stClayDoorOpen(); - uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); - - void stFallSkipJump(); - void suFallSkipJump(); - - void stMoveObject(); - void stContinueMoveObject(); - uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); - void upMoveObject(); - - void stCloseEyes(); - - void stTumbleHeadless(); - uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); - - void stFetchMatch(); - void stLightMatch(); - uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); - - void stHitByBoxingGlove(); - uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); - void evHitByBoxingGloveDone(); - - void stStandIdleSmall(); - void stWonderAboutSmall(); - void stWonderAboutHalfSmall(); - void stWonderAboutAfterSmall(); - - void stWalkToFrontNoStepSmall(); - void stWalkToFrontSmall(); - void stWalkToFront2Small(); - void stTurnToBackHalfSmall(); - void stTurnToBackWalkSmall(); - void stTurnToBackSmall(); - uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); - - void stFinishGrow(); - uint32 hmFinishGrow(int messageNum, const MessageParam ¶m, Entity *sender); - - void stJumpToRingVenusFlyTrap(); - uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - - void stDropFromRing(); - - void stStandIdleSpecial(); - uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); - - void stPressDoorButton(); - uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); - - void stSpitOutFall0(); - void stSpitOutFall2(); - void suFallDown(); - void upSpitOutFall(); - - void stJumpAndFall(); - uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); - - void stFalling(); - void stFallTouchdown(); - - void stMoveVenusFlyTrap(); - void stContinueMovingVenusFlyTrap(); - uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); - void evMoveVenusFlyTrapDone(); - - void stPeekInside(); - void stPeekInsideReturn(); - void stPeekInsideBlink(); - void upPeekInsideBlink(); - - //////////////////////////////////////////////////////////////////////////// - - void stopWalking(); - - void suAction(); - void suUpdateDestX(); - void suWalkingTestExit(); - - uint32 hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - - void setKlaymanIdleTable(const KlaymanIdleTableItem *table, int tableCount); - void setKlaymanIdleTable1(); - void setKlaymanIdleTable2(); - void setKlaymanIdleTable3(); - - void setSoundFlag(bool value) { _soundFlag = value; } - - void spitIntoPipe(); - void stTrySpitIntoPipe(); - void stContSpitIntoPipe(); - uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); - - void stRidePlatform(); - void suRidePlatform(); - void stPullLever(); - void stLookLeverDown(); - void stWaitLeverDown(); - -protected: - Scene *_parentScene; - Sprite *_attachedSprite; - int _ladderStatus; - bool _isWalking; - bool _isSneaking; - bool _isLargeStep; - bool _isMoveObjectRequested; - bool _acceptInput; - int16 _destX, _destY; - int16 _idleCounter, _idleCounterMax; - int16 _blinkCounter, _blinkCounterMax; - int16 _countdown1; - int16 _tapesToInsert, _keysToInsert; - bool _flagF6; - bool _isLeverDown; - bool _isWalkingOpenDoorNotified; - int _status2; - bool _flagFA; - int _status3; - const KlaymanIdleTableItem *_idleTable; - int _idleTableCount; - int _idleTableMaxValue; - NPointArray *_pathPoints; - bool _soundFlag; - - bool _isSittingInTeleporter; - - bool _potionFlag1; - bool _potionFlag2; - - int16 _platformDeltaY; - - Sprite *_otherSprite; - int _idleTableNum; - - int16 _walkResumeFrameIncr; - - int _moveObjectCountdown; - - bool _canSpitPipe; - bool _contSpitPipe; - bool _readyToSpit; - uint32 _spitPipeIndex; - uint32 _spitDestPipeIndex; - uint32 _spitContDestPipeIndex; - - virtual void xUpdate(); - // TODO Check if this can be turned into a void result - virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - - void startWalkToX(int16 x, bool flag); - void startWalkToXExt(int16 x); - void startWalkToXSmall(int16 x); - void startSpecialWalkLeft(int16 x); - void startSpecialWalkRight(int16 x); - void sub41CC40(int16 x1, int16 x2); - void sub41CCE0(int16 x); - - void gotoNextStateExt(); - void sub41C770(); - void sub41C790(); - - void stStartWalkingSmall(); - uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); - - void walkAlongPathPoints(); - -}; - -class KmScene1001 : public Klayman { -public: - KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1002 : public Klayman { -public: - KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - void xUpdate(); - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1004 : public Klayman { -public: - KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1109 : public Klayman { -public: - KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1201 : public Klayman { -public: - KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1303 : public Klayman { -public: - KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1304 : public Klayman { -public: - KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1305 : public Klayman { -public: - KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1306 : public Klayman { -public: - KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1308 : public Klayman { -public: - KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1401 : public Klayman { -public: - KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1402 : public Klayman { -public: - KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1403 : public Klayman { -public: - KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1404 : public Klayman { -public: - KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1608 : public Klayman { -public: - KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1705 : public Klayman { -public: - KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene1901 : public Klayman { -public: - KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2001 : public Klayman { -public: - KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2101 : public Klayman { -public: - KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2201 : public Klayman { -public: - KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2203 : public Klayman { -public: - KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2205 : public Klayman { -public: - KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - void xUpdate(); - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2206 : public Klayman { -public: - KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); - ~KmScene2206(); -protected: - void xUpdate(); - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2207 : public Klayman { -public: - KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2242 : public Klayman { -public: - KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - void xUpdate(); - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmHallOfRecords : public Klayman { -public: - KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - void xUpdate(); - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2247 : public Klayman { -public: - KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - void xUpdate(); - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2401 : public Klayman { -public: - KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2402 : public Klayman { -public: - KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2403 : public Klayman { -public: - KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2406 : public Klayman { -public: - KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2501 : public Klayman { -public: - KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2732 : public Klayman { -public: - KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2801 : public Klayman { -public: - KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2803 : public Klayman { -public: - KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2803Small : public Klayman { -public: - KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2805 : public Klayman { -public: - KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2806 : public Klayman { -public: - KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2809 : public Klayman { -public: - KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2810Small : public Klayman { -public: - KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2810 : public Klayman { -public: - KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - NRect *clipRects, uint clipRectsCount); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -class KmScene2812 : public Klayman { -public: - KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); -protected: - uint32 xHandleMessage(int messageNum, const MessageParam ¶m); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_KLAYMAN_H */ diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp new file mode 100644 index 0000000000..6d139b1abc --- /dev/null +++ b/engines/neverhood/klaymen.cpp @@ -0,0 +1,6240 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/klaymen.h" +#include "neverhood/resourceman.h" +#include "neverhood/scene.h" +#include "neverhood/staticdata.h" + +namespace Neverhood { + +static const KlaymenIdleTableItem klaymenTable1[] = { + {1, &Klaymen::stDoIdlePickEar}, + {1, &Klaymen::stDoIdleSpinHead}, + {1, &Klaymen::stDoIdleArms}, + {1, &Klaymen::stDoIdleChest}, + {1, &Klaymen::stDoIdleHeadOff} +}; + +static const KlaymenIdleTableItem klaymenTable2[] = { + {1, &Klaymen::stDoIdlePickEar}, + {1, &Klaymen::stDoIdleSpinHead}, + {1, &Klaymen::stDoIdleChest}, + {1, &Klaymen::stDoIdleHeadOff} +}; + +static const KlaymenIdleTableItem klaymenTable3[] = { + {1, &Klaymen::stDoIdleTeleporterHands}, + {1, &Klaymen::stDoIdleTeleporterHands2} +}; + +static const KlaymenIdleTableItem klaymenTable4[] = { + {1, &Klaymen::stDoIdleSpinHead}, + {1, &Klaymen::stDoIdleChest}, + {1, &Klaymen::stDoIdleHeadOff}, +}; + +static const KlaymenIdleTableItem klaymenIdleTable1002[] = { + {1, &Klaymen::stDoIdlePickEar}, + {2, &Klaymen::stIdleWonderAbout} +}; + +// Klaymen + +Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) + : AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), + _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), + _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), + _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), + _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) { + + createSurface(surfacePriority, 320, 200); + _x = x; + _y = y; + _destX = x; + _destY = y; + _flags = 2; + setKlaymenIdleTable1(); + stTryStandIdle(); + SetUpdateHandler(&Klaymen::update); +} + +void Klaymen::xUpdate() { + // Empty +} + +uint32 Klaymen::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + } + return 0; +} + +void Klaymen::update() { + AnimatedSprite::update(); + xUpdate(); +} + +void Klaymen::setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount) { + _idleTable = table; + _idleTableCount = tableCount; + _idleTableMaxValue = 0; + for (int i = 0; i < tableCount; i++) + _idleTableMaxValue += table[i].value; +} + +void Klaymen::setKlaymenIdleTable1() { + setKlaymenIdleTable(klaymenTable1, ARRAYSIZE(klaymenTable1)); +} + +void Klaymen::setKlaymenIdleTable2() { + setKlaymenIdleTable(klaymenTable2, ARRAYSIZE(klaymenTable2)); +} + +void Klaymen::setKlaymenIdleTable3() { + setKlaymenIdleTable(klaymenTable3, ARRAYSIZE(klaymenTable3)); +} + +void Klaymen::stDoIdlePickEar() { + startIdleAnimation(0x5B20C814, AnimationCallback(&Klaymen::stIdlePickEar)); +} + +void Klaymen::stIdlePickEar() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5B20C814, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmIdlePickEar); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); + FinalizeState(&Klaymen::evIdlePickEarDone); +} + +uint32 Klaymen::hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x04DBC02C) { + playSound(0, 0x44528AA1); + } + break; + } + return messageResult; +} + +void Klaymen::evIdlePickEarDone() { + stopSound(0); +} + +void Klaymen::stDoIdleSpinHead() { + startIdleAnimation(0xD122C137, AnimationCallback(&Klaymen::stIdleSpinHead)); +} + +void Klaymen::stIdleSpinHead() { + _status2 = 1; + _acceptInput = true; + startAnimation(0xD122C137, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmIdleSpinHead); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); +} + +uint32 Klaymen::hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x808A0008) { + playSound(0, 0xD948A340); + } + break; + } + return messageResult; +} + +void Klaymen::stDoIdleArms() { + startIdleAnimation(0x543CD054, AnimationCallback(&Klaymen::stIdleArms)); +} + +void Klaymen::stIdleArms() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x543CD054, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmIdleArms); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); + FinalizeState(&Klaymen::evIdleArmsDone); +} + +void Klaymen::evIdleArmsDone() { + stopSound(0); +} + +uint32 Klaymen::hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x5A0F0104) { + playSound(0, 0x7970A100); + } else if (param.asInteger() == 0x9A9A0109) { + playSound(0, 0xD170CF04); + } else if (param.asInteger() == 0x989A2169) { + playSound(0, 0xD073CF14); + } + break; + } + return messageResult; +} + +void Klaymen::stDoIdleChest() { + startIdleAnimation(0x40A0C034, AnimationCallback(&Klaymen::stIdleChest)); +} + +void Klaymen::stIdleChest() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x40A0C034, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmIdleChest); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); +} + +uint32 Klaymen::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0D2A0288) { + playSound(0, 0xD192A368); + } + break; + } + return messageResult; +} + +void Klaymen::stDoIdleHeadOff() { + startIdleAnimation(0x5120E137, AnimationCallback(&Klaymen::stIdleHeadOff)); +} + +void Klaymen::stIdleHeadOff() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5120E137, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmIdleHeadOff); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); +} + +uint32 Klaymen::hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC006000C) { + playSound(0, 0x9D406340); + } else if (param.asInteger() == 0x2E4A2940) { + playSound(0, 0x53A4A1D4); + } else if (param.asInteger() == 0xAA0A0860) { + playSound(0, 0x5BE0A3C6); + } else if (param.asInteger() == 0xC0180260) { + playSound(0, 0x5D418366); + } + break; + } + return messageResult; +} + +void Klaymen::stIdleWonderAbout() { + _status2 = 1; + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); +} + +void Klaymen::stSitIdleTeleporter() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x582EC138, 0, -1); + SetUpdateHandler(&Klaymen::upSitIdleTeleporter); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); + _idleCounter = 0; + _blinkCounter = 0; + _idleCounterMax = 8; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; +} + +void Klaymen::upSitIdleTeleporter() { + update(); + _idleCounter++; + if (_idleCounter >= _idleCounterMax) { + _idleCounter = 0; + if (_idleTable) { + int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); + for (int i = 0; i < _idleTableCount; i++) { + if (randomValue < _idleTable[i].value) { + (this->*(_idleTable[i].callback))(); + _idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24; + break; + } + randomValue -= _idleTable[i].value; + } + } + } else if (++_blinkCounter >= _blinkCounterMax) { + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + stSitIdleTeleporterBlink(); + } +} + +void Klaymen::stSitIdleTeleporterBlink() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x5C24C018, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stSitIdleTeleporterBlinkSecond); +} + +void Klaymen::stSitIdleTeleporterBlinkSecond() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x5C24C018, 0, -1); + SetUpdateHandler(&Klaymen::upSitIdleTeleporter); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); +} + +void Klaymen::stPickUpNeedle() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klaymen::stPickUpNeedle))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x1449C169, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPickUpObject); + SetSpriteUpdate(NULL); + } +} + +void Klaymen::stPickUpTube() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klaymen::stPickUpTube))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x0018C032, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPickUpTube); + SetSpriteUpdate(NULL); + } +} + +uint32 Klaymen::hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC1380080) { + sendMessage(_attachedSprite, 0x4806, 0); + playSound(0, 0xC8004340); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x03020231) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0x67221A03) { + playSound(0, 0x44051000); + } else if (param.asInteger() == 0x925A0C1E) { + playSound(0, 0x40E5884D); + } + break; + } + return messageResult; +} + +void Klaymen::stTurnToUseInTeleporter() { + _status2 = 0; + _acceptInput = false; + startAnimation(0xD229823D, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stReturnFromUseInTeleporter() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x9A2801E0, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stStepOver() { + if (!stStartAction(AnimationCallback(&Klaymen::stStepOver))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x004AA310, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStartWalking); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stSitInTeleporter() { + if (!stStartAction(AnimationCallback(&Klaymen::stSitInTeleporter))) { + _status2 = 0; + _acceptInput = false; + startAnimation(0x392A0330, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSitInTeleporter); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +uint32 Klaymen::hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x001A2832) { + playSound(0, 0xC0E4884C); + } + break; + } + return messageResult; +} + +void Klaymen::stGetUpFromTeleporter() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x913AB120, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +///////////////////////////////////////////////////////////////// + +void Klaymen::stopWalking() { + _destX = _x; + if (!_isWalking && !_isSneaking && !_isLargeStep) { + gotoState(NULL); + gotoNextStateExt(); + } +} + +void Klaymen::startIdleAnimation(uint32 fileHash, AnimationCb callback) { + debug("startIdleAnimation(%08X)", fileHash); + NextState(callback); + SetUpdateHandler(&Klaymen::upIdleAnimation); +} + +void Klaymen::upIdleAnimation() { + gotoNextStateExt(); + update(); +} + +bool Klaymen::stStartActionFromIdle(AnimationCb callback) { + if (_status2 == 2) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x9A7020B8, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStartAction); + SetSpriteUpdate(NULL); + NextState(callback); + return true; + } + return false; +} + +void Klaymen::gotoNextStateExt() { + if (_finalizeStateCb) { + AnimationCb cb = _finalizeStateCb; + _finalizeStateCb = NULL; + (this->*cb)(); + } + if (_nextStateCb) { + AnimationCb cb = _nextStateCb; + _nextStateCb = NULL; + (this->*cb)(); + } else { + // Inform the scene that the current Klaymen animation sequence has finished + sendMessage(_parentScene, 0x1006, 0); + } +} + +void Klaymen::sub41C770() { + _flagFA = false; + _status3 = 1; +} + +void Klaymen::sub41C790() { + if (_flagFA) + _status3 = 0; +} + +void Klaymen::stTryStandIdle() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTryStandIdle))) { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klaymen::upStandIdle); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); + _idleCounter = 0; + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; + } +} + +void Klaymen::upStandIdle() { + update(); + if (++_idleCounter >= 720) { + _idleCounter = 0; + if (_idleTable) { + int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1); + for (int i = 0; i < _idleTableCount; i++) { + if (randomValue < _idleTable[i].value) { + (this->*(_idleTable[i].callback))(); + break; + } + randomValue -= _idleTable[i].value; + } + } + } else if (++_blinkCounter >= _blinkCounterMax) { + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + stIdleBlink(); + } +} + +uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + uint32 messageResult = xHandleMessage(messageNum, param); + switch (messageNum) { + case 0x1008: + messageResult = _acceptInput; + break; + case 0x1014: + _attachedSprite = (Sprite*)(param.asEntity()); + break; + case 0x1019: + gotoNextStateExt(); + break; + case 0x101C: + sub41C770(); + break; + case 0x1021: + sub41C790(); + break; + case 0x481C: + _status3 = param.asInteger(); + _flagFA = true; + messageResult = 1; + break; + case 0x482C: + if (param.asInteger() != 0) { + _pathPoints = _dataResource.getPointArray(param.asInteger()); + } else { + _pathPoints = NULL; + } + break; + } + return messageResult; +} + +void Klaymen::stIdleBlink() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5900C41E, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stStandAround); +} + +uint32 Klaymen::hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextStateExt(); + break; + } + return messageResult; +} + +void Klaymen::stStandAround() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klaymen::upStandIdle); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x271AA210) { + playSound(0, 0x4924AAC4); + } else if (param.asInteger() == 0x2B22AA81) { + playSound(0, 0x0A2AA8E0); + } + break; + } + return messageResult; +} + + +void Klaymen::startWalkToX(int16 x, bool flag) { + int16 xdiff = ABS(x - _x); + if (x == _x) { + _destX = x; + if (!_isWalking && !_isSneaking && !_isLargeStep) { + gotoState(NULL); + gotoNextStateExt(); + } + } else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) { + _destX = x; + gotoState(NULL); + gotoNextStateExt(); + } else if (xdiff <= 42 && _status3 != 3) { + if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { + _destX = x; + } else { + _destX = x; + GotoState(&Klaymen::stSneak); + } + } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _destX = x; + } else if (flag) { + _destX = x; + GotoState(&Klaymen::stStartWalkingExt); + } else { + _destX = x; + GotoState(&Klaymen::stStartWalking); + } +} + +void Klaymen::stWakeUp() { + _status2 = 1; + _acceptInput = false; + startAnimation(0x527AC970, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stSleeping() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x5A38C110, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSleeping); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x03060012) { + playSound(0, 0xC0238244); + } + break; + } + return messageResult; +} + +bool Klaymen::stStartAction(AnimationCb callback3) { + if (_status2 == 1) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x5C7080D4, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStartAction); + SetSpriteUpdate(&Klaymen::suAction); + NextState(callback3); + return true; + } else { + _x = _destX; + return false; + } +} + +void Klaymen::suAction() { + + int16 xdiff = _destX - _x; + + if (_doDeltaX) { + _x -= _deltaX; + } else { + _x += _deltaX; + } + _deltaX = 0; + + if (_doDeltaY) { + _y -= _deltaY; + } else { + _y += _deltaY; + } + _deltaY = 0; + + if (_frameChanged) { + if (xdiff > 6) + _x += 6; + else if (xdiff < -6) + _x -= 6; + else + _x = _destX; + } + + updateBounds(); + +} + +void Klaymen::suSneaking() { + + int16 xdiff = _destX - _x; + + if (_currFrameIndex == 9) { + if (xdiff > 26) + _deltaX += xdiff - 26; + else if (xdiff < -26) + _deltaX -= xdiff + 26; + } + + if (xdiff > _deltaX) + xdiff = _deltaX; + else if (xdiff < -_deltaX) + xdiff = -_deltaX; + _deltaX = 0; + + if (_destX != _x) { + HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); + _x += xdiff; + if (_pathPoints) { + walkAlongPathPoints(); + } else { + HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + if (xdiff > 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } else if (hitRectPrev->type == 0x5003) { + if (xdiff < 0) { + _y = hitRectPrev->rect.y2; + } else { + _y = hitRectPrev->rect.y1; + } + } + } + updateBounds(); + } + +} + +void Klaymen::stSneak() { + _status2 = 1; + _isSneaking = true; + _acceptInput = true; + setDoDeltaX(_destX < _x ? 1 : 0); + startAnimation(0x5C48C506, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSneaking); + SetSpriteUpdate(&Klaymen::suSneaking); + FinalizeState(&Klaymen::evSneakingDone); +} + +void Klaymen::evSneakingDone() { + _isSneaking = false; +} + +uint32 Klaymen::hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + playSound(0, 0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0A2AA8E0); + } else if (param.asInteger() == 0x32188010) { + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); + } else if (param.asInteger() == 0x02A2909C) { + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); + } + break; + case 0x3002: + _x = _destX; + gotoNextStateExt(); + break; + } + return messageResult; +} + +void Klaymen::stStartWalking() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalking))) { + _status2 = 0; + _isWalking = true; + _acceptInput = true; + setDoDeltaX(_destX < _x ? 1 : 0); + startAnimation(0x242C0198, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStartWalking); + SetSpriteUpdate(&Klaymen::suWalkingTestExit); + NextState(&Klaymen::stWalkingFirst); + FinalizeState(&Klaymen::evStartWalkingDone); + } +} + +void Klaymen::evStartWalkingDone() { + _isWalking = false; +} + +uint32 Klaymen::hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); + } + break; + } + return messageResult; +} + +void Klaymen::stWalkingFirst() { + _status2 = 0; + _isWalking = true; + _acceptInput = true; + startAnimation(0x1A249001, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalking); + SetSpriteUpdate(&Klaymen::suWalkingFirst); + NextState(&Klaymen::stUpdateWalkingFirst); + FinalizeState(&Klaymen::evStartWalkingDone); +} + +void Klaymen::suWalkingFirst() { + SetSpriteUpdate(&Klaymen::suWalkingTestExit); + _deltaX = 0; +} + +uint32 Klaymen::hmWalking(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); + } + break; + } + return messageResult; +} + +void Klaymen::stUpdateWalkingFirst() { + if (_status3 == 2) { + gotoNextStateExt(); + } else if (_status3 == 3) { + stWalkingOpenDoor(); + } else { + _isSneaking = true; + _acceptInput = true; + if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { + if (_status3 == 0) { + _status2 = 1; + startAnimation(0xF234EE31, 0, -1); + } else { + _status2 = 2; + startAnimation(0xF135CC21, 0, -1); + } + } else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { + if (_status3 == 0) { + _status2 = 1; + startAnimation(0x8604A152, 0, -1); + } else { + _status2 = 2; + startAnimation(0xA246A132, 0, -1); + } + } + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSneaking); + SetSpriteUpdate(&Klaymen::suSneaking); + FinalizeState(&Klaymen::evSneakingDone); + } +} + +void Klaymen::suWalkingTestExit() { + int16 xdiff = ABS(_destX - _x); + int16 xdelta = _destX - _x; + + if (xdelta > _deltaX) + xdelta = _deltaX; + else if (xdelta < -_deltaX) + xdelta = -_deltaX; + + _deltaX = 0; + + if (xdiff == 0 || + (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) || + (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) || + (_status3 == 3 && xdiff < 30) || + (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) { + sendMessage(this, 0x1019, 0); + } else { + HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); + _x += xdelta; + if (_pathPoints) { + walkAlongPathPoints(); + } else { + HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + _y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; + } else if (hitRectPrev->type == 0x5003) { + _y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; + } else if (_flagF6 && xdelta != 0) { + if (hitRectNext->type == 0x5000) { + _y++; + } else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) { + _y--; + } + } + } + updateBounds(); + } + +} + +uint32 Klaymen::hmLever(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } + break; + } + return messageResult; +} + +void Klaymen::stPickUpGeneric() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klaymen::stPickUpGeneric))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x1C28C178, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPickUpObject); + SetSpriteUpdate(NULL); + } +} + +uint32 Klaymen::hmPickUpObject(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC1380080) { + sendMessage(_attachedSprite, 0x4806, 0); + playSound(0, 0x40208200); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x03020231) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0x67221A03) { + playSound(0, 0x44051000); + } else if (param.asInteger() == 0x2EAE0303) { + playSound(0, 0x03630300); + } else if (param.asInteger() == 0x61CE4467) { + playSound(0, 0x03630300); + } + break; + } + return messageResult; + +} + +void Klaymen::stPressButton() { + if (!stStartAction(AnimationCallback(&Klaymen::stPressButton))) { + _status2 = 2; + _acceptInput = true; + startAnimation(0x1C02B03D, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPressButton); + SetSpriteUpdate(NULL); + } +} + +uint32 Klaymen::hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0D01B294) { + sendMessage(_attachedSprite, 0x480B, 0); + } else if (param.asInteger() == 0x32180101) { + playSound(0, 0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0A2AA8E0); + } + break; + } + return messageResult; +} + +void Klaymen::stPressFloorButton() { + if (!stStartAction(AnimationCallback(&Klaymen::stPressFloorButton))) { + _status2 = 2; + _acceptInput = true; + startAnimation(0x1C16B033, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPressButton); + SetSpriteUpdate(NULL); + } +} + +void Klaymen::stPressButtonSide() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stPressButtonSide))) { + _status2 = 1; + _acceptInput = true; + startAnimation(0x1CD89029, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPressButton); + SetSpriteUpdate(&Klaymen::suAction); + } +} + +void Klaymen::startSpecialWalkRight(int16 x) { + if (_x == x) { + _destX = x; + gotoState(NULL); + gotoNextStateExt(); + } else if (_x < x) { + startWalkToX(x, false); + } else if (_x - x <= 105) { + startWalkToXExt(x); + } else { + startWalkToX(x, false); + } +} + +void Klaymen::startSpecialWalkLeft(int16 x) { + if (x == _x) { + _destX = x; + gotoState(NULL); + gotoNextStateExt(); + } else if (x < _x) { + startWalkToX(x, false); + } else if (x - _x <= 105) { + startWalkToXExt(x); + } else { + startWalkToX(x, false); + } +} + +void Klaymen::startWalkToXSmall(int16 x) { + _status3 = 2; + if (_x == x) { + _destX = x; + if (_isWalking) { + GotoState(NULL); + gotoNextStateExt(); + } + } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _destX = x; + } else { + _destX = x; + GotoState(&Klaymen::stStartWalkingSmall); + } +} + +void Klaymen::stStartWalkingSmall() { + _isWalking = true; + _acceptInput = true; + _status3 = 2; + setDoDeltaX(_destX < _x ? 1 : 0); + startAnimation(0x3A4CD934, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkingSmall); + SetSpriteUpdate(&Klaymen::suWalkingTestExit); + FinalizeState(&Klaymen::evStartWalkingDone); +} + +uint32 Klaymen::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) + playSound(0, 0x4924AAC4); + else if (param.asInteger() == 0x0A2A9098) + playSound(0, 0x0A2AA8E0); + } + return messageResult; +} + +void Klaymen::stStandIdleSmall() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x90D0D1D0, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); +} + +void Klaymen::stWonderAboutAfterSmall() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x11C8D156, 30, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stWonderAboutHalfSmall() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x11C8D156, 0, 10); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stWonderAboutSmall() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x11C8D156, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stWalkToFrontNoStepSmall() { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0x3F9CC394, 0x14884392, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +uint32 Klaymen::hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) + sendMessage(_parentScene, 0x482A, 0); + else if (param.asInteger() == 0x110010D1) + sendMessage(_parentScene, 0x482B, 0); + else if (param.asInteger() == 0x32180101) + playSound(0, 0x4924AAC4); + else if (param.asInteger() == 0x0A2A9098) + playSound(0, 0x0A2AA8E0); + break; + } + return messageResult; +} + +void Klaymen::stWalkToFront2Small() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2F1C4694, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stWalkToFrontSmall() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x3F9CC394, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stTurnToBackHalfSmall() { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0x37ECD436, 0, 0x8520108C); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stTurnToBackWalkSmall() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x16EDDE36, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stTurnToBackSmall() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x37ECD436, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkFrontBackSmall); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stPullCord() { + if (!stStartAction(AnimationCallback(&Klaymen::stPullCord))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x3F28E094, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPullReleaseCord); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stReleaseCord); + } +} + +void Klaymen::stReleaseCord() { + _acceptInput = false; + startAnimation(0x3A28C094, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPullReleaseCord); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmPullReleaseCord(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + sendMessage(_attachedSprite, 0x480F, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } + break; + } + return messageResult; +} + +void Klaymen::stUseTube() { + if (!stStartAction(AnimationCallback(&Klaymen::stUseTube))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x1A38A814, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmUseTube); + SetSpriteUpdate(NULL); + } +} + +uint32 Klaymen::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02B20220) + playSound(0, 0xC5408620); + else if (param.asInteger() == 0x0A720138) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0x03020231) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0xB613A180) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x67221A03) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x038A010B) + playSound(0, 0x00018040); + else if (param.asInteger() == 0x422B0280) + playSound(0, 0x166FC6E0); + else if (param.asInteger() == 0x925A0C1E) + playSound(0, 0x40E5884D); + break; + } + return messageResult; +} + +void Klaymen::stWalkingFirstExt() { + _status2 = 0; + _isWalking = true; + _acceptInput = true; + startAnimation(0x5A2CBC00, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalking); + SetSpriteUpdate(&Klaymen::suWalkingFirst); + NextState(&Klaymen::stUpdateWalkingFirst); + FinalizeState(&Klaymen::evStartWalkingDone); +} + +void Klaymen::stStartWalkingExt() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalkingExt))) { + _status2 = 0; + _isWalking = true; + _acceptInput = true; + setDoDeltaX(_destX < _x ? 1 : 0); + startAnimation(0x272C1199, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStartWalking); + SetSpriteUpdate(&Klaymen::suWalkingTestExit); + NextState(&Klaymen::stWalkingFirstExt); + FinalizeState(&Klaymen::evStartWalkingDone); + } +} + +void Klaymen::sub41CC40(int16 x1, int16 x2) { + if (_x > x1) { + if (_x == x1 + x2) { + _destX = x1 + x2; + gotoState(NULL); + gotoNextStateExt(); + } else if (_x < x1 + x2) { + startWalkToXExt(x1 + x2); + } else { + startWalkToX(x1 + x2, false); + } + } else { + if (_x == x1 - x2) { + _destX = x1 - x2; + gotoState(NULL); + gotoNextStateExt(); + } else if (_x > x1 - x2) { + startWalkToXExt(x1 - x2); + } else { + startWalkToX(x1 - x2, false); + } + } +} + +void Klaymen::startWalkToXExt(int16 x) { + int16 xdiff = ABS(x - _x); + if (x == _x) { + _destX = x; + if (!_isWalking && !_isSneaking && !_isLargeStep) { + gotoState(NULL); + gotoNextStateExt(); + } + } else if (xdiff <= 36 && !_isWalking && !_isSneaking && !_isLargeStep) { + _destX = x; + gotoState(NULL); + gotoNextStateExt(); + } else if (xdiff <= 42 && _status3 != 3) { + if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { + _destX = x; + } else { + _destX = x; + GotoState(&Klaymen::stSneak); + } + } else if (_isLargeStep && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { + _destX = x; + } else { + _destX = x; + GotoState(&Klaymen::stLargeStep); + } +} + +void Klaymen::stLargeStep() { + _status2 = 2; + _isLargeStep = true; + _acceptInput = true; + setDoDeltaX(_destX >= _x ? 1 : 0); + startAnimation(0x08B28116, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLargeStep); + SetSpriteUpdate(&Klaymen::suLargeStep); + FinalizeState(&Klaymen::evLargeStepDone); +} + +void Klaymen::evLargeStepDone() { + _isLargeStep = false; +} + +void Klaymen::suLargeStep() { + int16 xdiff = _destX - _x; + + if (_doDeltaX) { + _deltaX = -_deltaX; + } + + if (_currFrameIndex == 7) { + _deltaX = xdiff; + } + + if ((xdiff > 0 && xdiff > _deltaX) || (xdiff < 0 && xdiff < _deltaX)) + xdiff = _deltaX; + + _deltaX = 0; + + if (_x != _destX) { + HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); + _x += xdiff; + if (_pathPoints) { + walkAlongPathPoints(); + } else { + HitRect *hitRectNext = _parentScene->findHitRectAtPos(_x, _y); + if (hitRectNext->type == 0x5002) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (hitRectNext->rect.x2 - _x) / 2); + } else if (hitRectNext->type == 0x5003) { + _y = MAX(hitRectNext->rect.y1, hitRectNext->rect.y2 - (_x - hitRectNext->rect.x1) / 2); + } else if (hitRectPrev->type == 0x5002) { + _y = xdiff > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; + } else if (hitRectPrev->type == 0x5003) { + _y = xdiff < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; + } + } + updateBounds(); + } +} + +uint32 Klaymen::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + playSound(0, 0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0A2AA8E0); + } + break; + case 0x3002: + _x = _destX; + gotoNextStateExt(); + break; + } + return messageResult; +} + +void Klaymen::stWonderAboutHalf() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xD820A114, 0, 10); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stWonderAboutAfter() { + _status2 = 1; + _acceptInput = true; + startAnimation(0xD820A114, 30, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stTurnToUseHalf() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x9B250AD2, 0, 7); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTurnToUse); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) { + playSound(0, 0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0A2AA8E0); + } + break; + } + return messageResult; +} + +void Klaymen::stTurnAwayFromUse() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x98F88391, 4, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTurnToUse); + SetSpriteUpdate(NULL); +} + +void Klaymen::stWonderAbout() { + _status2 = 1; + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stPeekWall() { + _status2 = 1; + _acceptInput = true; + startAnimation(0xAC20C012, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPeekWall); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender) { + int16 speedUpFrameIndex; + switch (messageNum) { + case 0x1008: + speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash); + if (_currFrameIndex < speedUpFrameIndex) + startAnimation(0xAC20C012, speedUpFrameIndex, -1); + return 0; + case 0x100D: + if (param.asInteger() == 0x32180101) { + playSound(0, 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0460E2FA); + } + break; + } + return hmLowLevelAnimation(messageNum, param, sender); +} + +void Klaymen::stJumpToRing1() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing1))) { + _status2 = 0; + startAnimation(0xD82890BA, 0, -1); + setupJumpToRing(); + } +} + +void Klaymen::setupJumpToRing() { + _acceptInput = false; + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmJumpToRing); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + NextState(&Klaymen::stHangOnRing); + sendMessage(_attachedSprite, 0x482B, 0); +} + +uint32 Klaymen::hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) { + sendMessage(_attachedSprite, 0x4806, 0); + _acceptInput = true; + } else if (param.asInteger() == 0x320AC306) { + playSound(0, 0x5860C640); + } else if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } + break; + } + return messageResult; +} + +void Klaymen::suUpdateDestX() { + AnimatedSprite::updateDeltaXY(); + _destX = _x; +} + +void Klaymen::stHangOnRing() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x4829E0B8, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); +} + +void Klaymen::stJumpToRing2() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing2))) { + _status2 = 0; + startAnimation(0x900980B2, 0, -1); + setupJumpToRing(); + } +} + +void Klaymen::stJumpToRing3() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing3))) { + _status2 = 0; + _acceptInput = false; + startAnimation(0xBA1910B2, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + SetMessageHandler(&Klaymen::hmJumpToRing3); + NextState(&Klaymen::stHoldRing3); + sendMessage(_attachedSprite, 0x482B, 0); + } +} + +uint32 Klaymen::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) { + sendMessage(_attachedSprite, 0x4806, 0); + } else if (param.asInteger() == 0x320AC306) { + playSound(0, 0x5860C640); + } else if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } + break; + } + return messageResult; +} + +void Klaymen::stHoldRing3() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x4A293FB0, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmHoldRing3); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *sender) { + if (messageNum == 0x1008) { + stReleaseRing(); + return 0; + } + return hmLowLevel(messageNum, param, sender); +} + +void Klaymen::stReleaseRing() { + _status2 = 1; + _acceptInput = false; + sendMessage(_attachedSprite, 0x4807, 0); + _attachedSprite = NULL; + startAnimation(0xB869A4B9, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stJumpToRing4() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing4))) { + _status2 = 0; + startAnimation(0xB8699832, 0, -1); + setupJumpToRing(); + } +} + +void Klaymen::sub41CCE0(int16 x) { + sub41CC40(_attachedSprite->getX(), x); +} + +void Klaymen::stContinueClimbLadderUp() { + _status2 = 0; + _acceptInput = true; + _ladderStatus = 3; + startAnimationByHash(0x3A292504, 0x01084280, 0); + _newStickFrameHash = 0x01084280; + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); + gotoNextStateExt(); +} + +void Klaymen::stStartClimbLadderDown() { + if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderDown))) { + _status2 = 0; + if (_destY < _y) { + if (_ladderStatus == 1) { + _ladderStatus = 2; + stClimbLadderHalf(); + } else { + gotoNextStateExt(); + } + } else if (_ladderStatus == 0) { + _ladderStatus = 2; + _acceptInput = false; + startAnimation(0x122D1505, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClimbLadderUpDown); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } else if (_ladderStatus == 3) { + _ladderStatus = 2; + _acceptInput = true; + startAnimationByHash(0x122D1505, 0x01084280, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClimbLadderUpDown); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } else if (_ladderStatus == 1) { + _ladderStatus = 2; + _acceptInput = true; + startAnimation(0x122D1505, 29 - _currFrameIndex, -1); + } + } +} + +void Klaymen::stClimbLadderHalf() { + _status2 = 2; + if (_ladderStatus == 1) { + _ladderStatus = 0; + _acceptInput = false; + startAnimationByHash(0x3A292504, 0x02421405, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClimbLadderHalf); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } else if (_ladderStatus == 2) { + _ladderStatus = 0; + _acceptInput = false; + startAnimationByHash(0x122D1505, 0x02421405, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClimbLadderHalf); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } else { + gotoNextStateExt(); + } +} + +uint32 Klaymen::hmClimbLadderHalf(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x489B025C) { + playSound(0, 0x52C4C2D7); + } else if (param.asInteger() == 0x400A0E64) { + playSound(0, 0x50E081D9); + } else if (param.asInteger() == 0x32180101) { + playSound(0, 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0460E2FA); + } + break; + } + return messageResult; +} + +uint32 Klaymen::hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + _acceptInput = true; + } else if (param.asInteger() == 0x489B025C) { + playSound(0, 0x52C4C2D7); + } else if (param.asInteger() == 0x400A0E64) { + playSound(0, 0x50E081D9); + } else if (param.asInteger() == 0x02421405) { + if (_ladderStatus == 1) { + startAnimationByHash(0x3A292504, 0x01084280, 0); + if (_destY >= _y - 30) + sendMessage(this, 0x1019, 0); + } else { + startAnimationByHash(0x122D1505, 0x01084280, 0); + if (_destY <= _y) + sendMessage(this, 0x1019, 0); + } + } + break; + } + return messageResult; +} + +void Klaymen::stStartClimbLadderUp() { + if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderUp))) { + _status2 = 0; + if (_destY >= _y - 30) { + gotoNextStateExt(); + } else if (_ladderStatus == 0) { + _ladderStatus = 1; + _acceptInput = false; + startAnimation(0x3A292504, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClimbLadderUpDown); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } else if (_ladderStatus == 3) { + _ladderStatus = 1; + _acceptInput = true; + startAnimationByHash(0x3A292504, 0x01084280, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClimbLadderUpDown); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } else if (_ladderStatus == 2) { + _ladderStatus = 1; + _acceptInput = true; + startAnimation(0x3A292504, 29 - _currFrameIndex, -1); + } + } +} + +void Klaymen::stWalkToFrontNoStep() { + _status2 = 2; + _acceptInput = false; + startAnimationByHash(0xF229C003, 0x14884392, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkToFront); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +uint32 Klaymen::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) { + sendMessage(_parentScene, 0x482A, 0); + } else if (param.asInteger() == 0x110010D1) { + sendMessage(_parentScene, 0x482B, 0); + } else if (param.asInteger() == 0x32180101) { + playSound(0, _soundFlag ? 0x48498E46 : 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, _soundFlag ? 0x50399F64 : 0x0460E2FA); + } + break; + } + return messageResult; +} + +void Klaymen::stWalkToFront() { + if (!stStartAction(AnimationCallback(&Klaymen::stWalkToFront))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0xF229C003, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkToFront); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stTurnToFront() { + if (!stStartAction(AnimationCallback(&Klaymen::stTurnToFront))) { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0xCA221107, 0, 0x8520108C); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkToFront); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stTurnToBack() { + if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBack))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0xCA221107, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalkToFront); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stLandOnFeet() { + _status2 = 1; + _acceptInput = true; + startAnimation(0x18118554, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLandOnFeet); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x320AC306) { + playSound(0, 0x5860C640); + } + break; + } + return messageResult; +} + +void Klaymen::stTurnToBackToUse() { + if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBackToUse))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x91540140, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTurnToBackToUse); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +uint32 Klaymen::hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xC61A0119) { + playSound(0, 0x402338C2); + } else if (param.asInteger() == 0x32180101) { + playSound(0, 0x4924AAC4); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0A2AA8E0); + } + break; + } + return messageResult; +} + +void Klaymen::stClayDoorOpen() { + if (!stStartAction(AnimationCallback(&Klaymen::stClayDoorOpen))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x5CCCB330, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmClayDoorOpen); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +uint32 Klaymen::hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040D4186) { + sendMessage(_attachedSprite, 0x4808, 0); + } + break; + } + return messageResult; +} + +void Klaymen::stTurnToUse() { + if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUse))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x9B250AD2, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTurnToUse); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stReturnFromUse() { + _status2 = 2; + _acceptInput = false; + startAnimation(0x98F88391, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTurnToUse); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stWalkingOpenDoor() { + _isWalkingOpenDoorNotified = false; + _acceptInput = false; + startAnimation(0x11A8E012, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStartWalking); + SetSpriteUpdate(&Klaymen::suWalkingOpenDoor); +} + +void Klaymen::suWalkingOpenDoor() { + if (!_isWalkingOpenDoorNotified && ABS(_destX - _x) < 80) { + sendMessage(_parentScene, 0x4829, 0); + _isWalkingOpenDoorNotified = true; + } + AnimatedSprite::updateDeltaXY(); +} + +void Klaymen::stMoveObjectSkipTurnFaceObject() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + _isMoveObjectRequested = false; + _acceptInput = true; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + SetMessageHandler(&Klaymen::hmMoveObjectTurn); +} + +void Klaymen::evMoveObjectTurnDone() { + sendMessage(_attachedSprite, 0x4807, 0); +} + +uint32 Klaymen::hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + sendMessage(_attachedSprite, 0x480B, _doDeltaX ? 1 : 0); + } else if (param.asInteger() == 0x02421405) { + if (_isMoveObjectRequested && sendMessage(_attachedSprite, 0x480C, _doDeltaX ? 1 : 0) != 0) { + stMoveObjectSkipTurn(); + } else { + FinalizeState(&Klaymen::evMoveObjectTurnDone); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + } + } else if (param.asInteger() == 0x32180101) { + playSound(0, 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0460E2FA); + } + break; + case 0x480A: + _isMoveObjectRequested = true; + return 0; + } + return hmLowLevelAnimation(messageNum, param, sender); +} + +void Klaymen::stMoveObjectSkipTurn() { + _isMoveObjectRequested = false; + _acceptInput = true; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + SetMessageHandler(&Klaymen::hmMoveObjectTurn); +} + +void Klaymen::stMoveObjectFaceObject() { + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + if (!stStartAction(AnimationCallback(&Klaymen::stMoveObjectFaceObject))) { + _status2 = 2; + _isMoveObjectRequested = false; + _acceptInput = true; + startAnimation(0x0C1CA072, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmMoveObjectTurn); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stUseLever() { + if (!stStartAction(AnimationCallback(&Klaymen::stUseLever))) { + _status2 = 0; + if (_isLeverDown) { + stUseLeverRelease(); + } else { + sendMessage(_attachedSprite, 0x482B, 0); + startAnimation(0x0C303040, 0, -1); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + SetMessageHandler(&Klaymen::hmLever); + SetUpdateHandler(&Klaymen::update); + NextState(&Klaymen::stPullLeverDown); + _acceptInput = false; + } + } +} + +// Exactly the same code as sub420DA0 which was removed +void Klaymen::stPullLeverDown() { + startAnimation(0x0D318140, 0, -1); + sendMessage(_attachedSprite, 0x480F, 0); + NextState(&Klaymen::stHoldLeverDown); +} + +void Klaymen::stHoldLeverDown() { + startAnimation(0x4464A440, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + _isLeverDown = true; + _acceptInput = true; +} + +void Klaymen::stUseLeverRelease() { + startAnimation(0x09018068, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLever); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + sendMessage(_attachedSprite, 0x4807, 0); + NextState(&Klaymen::stPullLeverDown); + _acceptInput = false; +} + +void Klaymen::stReleaseLever() { + if (_isLeverDown) { + _status2 = 2; + startAnimation(0x09018068, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLever); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + sendMessage(_attachedSprite, 0x4807, 0); + NextState(&Klaymen::stLetGoOfLever); + _acceptInput = false; + _isLeverDown = false; + } else { + gotoNextStateExt(); + } +} + +void Klaymen::stLetGoOfLever() { + startAnimation(0x0928C048, 0, -1); + FinalizeState(&Klaymen::evLeverReleasedEvent); +} + +void Klaymen::evLeverReleasedEvent() { + sendMessage(_attachedSprite, 0x482A, 0); +} + +void Klaymen::stInsertDisk() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertDisk))) { + _status2 = 2; + _tapesToInsert = 0; + for (uint32 i = 0; i < 20; i++) { + if (getSubVar(VA_HAS_TAPE, i)) { + setSubVar(VA_IS_TAPE_INSERTED, i, 1); + setSubVar(VA_HAS_TAPE, i, 0); + _tapesToInsert++; + } + } + if (_tapesToInsert == 0) { + GotoState(NULL); + gotoNextStateExt(); + } else { + startAnimation(0xD8C8D100, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmInsertDisk); + SetSpriteUpdate(&Klaymen::suAction); + _acceptInput = false; + _tapesToInsert--; + } + } +} + +uint32 Klaymen::hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_tapesToInsert == 0 && param.asInteger() == 0x06040580) { + nextAnimationByHash(0xD8C8D100, calcHash("GoToStartLoop/Finish"), 0); + } else if (_tapesToInsert != 0 && param.asInteger() == calcHash("GoToStartLoop/Finish")) { + _tapesToInsert--; + startAnimationByHash(0xD8C8D100, 0x01084280, 0); + } else if (param.asInteger() == 0x062A1510) { + playSound(0, 0x41688704); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } else if (param.asInteger() == 0x0E040501) { + playSound(1, 0xC6A129C1); + } + } + return messageResult; +} + +void Klaymen::walkAlongPathPoints() { + if (_x <= (*_pathPoints)[0].x) + _y = (*_pathPoints)[0].y; + else if (_x >= (*_pathPoints)[_pathPoints->size() - 1].x) + _y = (*_pathPoints)[_pathPoints->size() - 1].y; + else { + int16 deltaX = _x - (*_pathPoints)[0].x, deltaXIncr = 0; + uint index = 0; + while (deltaX > 0) { + NPoint pt2 = (*_pathPoints)[index]; + NPoint pt1 = index + 1 >= _pathPoints->size() ? (*_pathPoints)[0] : (*_pathPoints)[index + 1]; + int16 xd = ABS(pt1.x - pt2.x); + int16 yd = ABS(pt1.y - pt2.y); + if (deltaX + deltaXIncr >= xd) { + deltaX -= xd; + deltaX += deltaXIncr; + ++index; + if (index >= _pathPoints->size()) + index = 0; + _y = (*_pathPoints)[index].y; + } else { + deltaXIncr += deltaX; + if (pt1.y >= pt2.y) { + _y = pt2.y + (yd * deltaXIncr) / xd; + } else { + _y = pt2.y - (yd * deltaXIncr) / xd; + } + deltaX = 0; + } + } + } +} + +void Klaymen::stJumpToGrab() { + _status2 = 0; + _acceptInput = false; + startAnimationByHash(0x00AB8C10, 0x01084280, 0); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(&Klaymen::suJumpToGrab); + SetMessageHandler(&Klaymen::hmJumpToGrab); +} + +void Klaymen::suJumpToGrab() { + updateDeltaXY(); + if (_y >= _destY) { + _y = _destY; + updateBounds(); + gotoNextStateExt(); + } +} + +uint32 Klaymen::hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) + sendMessage(_attachedSprite, 0x4806, 0); + else if (param.asInteger() == 0x320AC306) + startAnimationByHash(0x00AB8C10, 0x01084280, 0); + else if (param.asInteger() == 0x4AB28209) + sendMessage(_attachedSprite, 0x482A, 0); + else if (param.asInteger() == 0x88001184) + sendMessage(_attachedSprite, 0x482B, 0); + break; + } + return messageResult; +} + +void Klaymen::stFinishGrow() { + _status2 = 2; + _acceptInput = false; + startAnimation(0x38445000, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klaymen::hmFinishGrow); +} + +uint32 Klaymen::hmFinishGrow(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040C4C01) + playSound(0, 0x01E11140); + break; + } + return messageResult; +} + +void Klaymen::stTurnToUseExt() { + if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUseExt))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x1B3D8216, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTurnToUse); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + } +} + +void Klaymen::stJumpToGrabFall() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpToGrabFall))) { + _status2 = 0; + _acceptInput = false; + startAnimation(0x00AB8C10, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmJumpToGrab); + SetSpriteUpdate(&Klaymen::suJumpToGrab); + sendMessage(_attachedSprite, 0x482B, 0); + } +} + +void Klaymen::stJumpToGrabRelease() { + _status2 = 1; + _acceptInput = false; + startAnimationByHash(0x00AB8C10, 0x320AC306, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmJumpToGrabRelease); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stReleaseRing); +} + +uint32 Klaymen::hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x320AC306) + playSound(0, 0x5860C640); + break; + } + return messageResult; +} + +void Klaymen::stDoIdleTeleporterHands() { + startIdleAnimation(0x90EF8D38, AnimationCallback(&Klaymen::stIdleTeleporterHands)); +} + +void Klaymen::stIdleTeleporterHands() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x90EF8D38, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stSitIdleTeleporterBlinkSecond); +} + +void Klaymen::stDoIdleTeleporterHands2() { + startIdleAnimation(0x900F0930, AnimationCallback(&Klaymen::stIdleTeleporterHands2)); +} + +void Klaymen::stIdleTeleporterHands2() { + _status2 = 0; + _acceptInput = true; + startAnimation(0x900F0930, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stSitIdleTeleporterBlinkSecond); +} + +void Klaymen::teleporterAppear(uint32 fileHash) { + _status2 = 0; + _acceptInput = false; + startAnimation(fileHash, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTeleporterAppearDisappear); + SetSpriteUpdate(NULL); +} + +void Klaymen::teleporterDisappear(uint32 fileHash) { + _status2 = 0; + _acceptInput = false; + startAnimation(fileHash, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTeleporterAppearDisappear); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4E0A2C24) { + playSound(0, 0x85B10BB8); + } else if (param.asInteger() == 0x4E6A0CA0) { + playSound(0, 0xC5B709B0); + } + break; + } + return messageResult; +} + +uint32 Klaymen::hmShrink(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x80C110B5) + sendMessage(_parentScene, 0x482A, 0); + else if (param.asInteger() == 0x33288344) + playSound(2, 0x10688664); + break; + } + return messageResult; +} + +void Klaymen::stShrink() { + _status2 = 0; + _acceptInput = false; + playSound(0, 0x4C69EA53); + startAnimation(0x1AE88904, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmShrink); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +void Klaymen::stStandWonderAbout() { + if (_x > 260) + setDoDeltaX(1); + _status2 = 0; + _acceptInput = true; + startAnimation(0xD820A114, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); + _newStickFrameIndex = 10; +} + +uint32 Klaymen::hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + if (_potionFlag1) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } else + _potionFlag2 = true; + break; + case 0x100D: + if (param.asInteger() == 0x0002418E) + sendMessage(_parentScene, 0x2000, 0); + else if (param.asInteger() == 0x924090C2) { + _potionFlag1 = true; + if (_potionFlag2) { + startAnimationByHash(0x1C388C04, 0x004A2148, 0); + messageResult = 0; + } + } else if (param.asInteger() == 0x004A2148) + _potionFlag1 = false; + else if (param.asInteger() == 0x02B20220) + playSound(0, 0xC5408620); + else if (param.asInteger() == 0x0A720138) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0x03020231) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0xB613A180) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x67221A03) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x038A010B) + playSound(0, 0x00018040); + else if (param.asInteger() == 0x422B0280) + playSound(0, 0x166FC6E0); + else if (param.asInteger() == 0x925A0C1E) + playSound(0, 0x40E5884D); + else if (param.asInteger() == 0x000F0082) + playSound(0, 0x546CDCC1); + else if (param.asInteger() == 0x00020814) + playSound(0, 0x786CC6D0); + else if (param.asInteger() == 0x06020500) + playSound(0, 0x1069C0E1); + else if (param.asInteger() == 0x02128C00) + playSound(0, 0x5068C4C3); + else if (param.asInteger() == 0x82022030) + playSound(0, 0x5C48C0E8); + break; + } + return messageResult; +} + +uint32 Klaymen::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x32180101) + playSound(0, 0x405002D8); + else if (param.asInteger() == 0x0A2A9098) + playSound(0, 0x0460E2FA); + else if (param.asInteger() == 0xD00A0C0C) + playSound(3); + else if (param.asInteger() == 0x04121920) + playSound(4); + else if (param.asInteger() == 0x030B4480) + playSound(5); + else if (param.asInteger() == 0x422B0280) + playSound(6); + else if (param.asInteger() == 0x038A010B) + playSound(7); + else if (param.asInteger() == 0x67221A03) + playSound(0, 0x44051000); + else if (param.asInteger() == 0x02B20220) + playSound(0, 0xC5408620); + else if (param.asInteger() == 0x925A0C1E) + playSound(0, 0x40E5884D); + else if (param.asInteger() == 0x03020231) + playSound(0, 0xD4C08010); + else if (param.asInteger() == 0x08040840) + setDoDeltaX(2); + break; + } + return messageResult; +} + +void Klaymen::stGrow() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2838C010, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmGrow); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +void Klaymen::stDrinkPotion() { + _status2 = 1; + _acceptInput = false; + _potionFlag1 = false; + _potionFlag2 = false; + startAnimation(0x1C388C04, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmDrinkPotion); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +uint32 Klaymen::hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_keysToInsert == 0 && param.asInteger() == 0x06040580) { + nextAnimationByHash(0xDC409440, 0x46431401, 0); + } else if (_keysToInsert != 0 && param.asInteger() == 0x46431401) { + _keysToInsert--; + startAnimationByHash(0xDC409440, 0x01084280, 0); + } else if (param.asInteger() == 0x062A1510) { + playSound(0, 0x41688704); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } else if (param.asInteger() == 0x0E4C8141) { + playSound(0, 0xDC4A1280); + } + break; + } + return messageResult; +} + +void Klaymen::stInsertKey() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertKey))) { + _status2 = 2; + _keysToInsert = 0; + for (uint32 i = 0; i < 3; i++) { + if (getSubVar(VA_HAS_KEY, i)) { + bool more; + setSubVar(VA_IS_KEY_INSERTED, i, 1); + setSubVar(VA_HAS_KEY, i, 0); + do { + more = false; + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, i, _vm->_rnd->getRandomNumber(16 - 1)); + for (uint j = 0; j < i && !more; j++) { + if (getSubVar(VA_IS_KEY_INSERTED, j) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, j) == getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i)) + more = true; + } + if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, i) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, i)) + more = true; + } while (more); + _keysToInsert++; + } + } + if (_keysToInsert == 0) { + GotoState(NULL); + gotoNextStateExt(); + } else { + _acceptInput = false; + startAnimation(0xDC409440, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmInsertKey); + SetSpriteUpdate(&Klaymen::suAction); + _keysToInsert--; + } + } +} + +uint32 Klaymen::hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x04684052) { + _acceptInput = true; + sendMessage(_parentScene, 0x2002, 0); + } + break; + } + return messageResult; +} + +void Klaymen::stReadNote() { + _status2 = 2; + _acceptInput = false; + startAnimation(0x123E9C9F, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmReadNote); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +uint32 Klaymen::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + int16 speedUpFrameIndex; + switch (messageNum) { + case 0x1008: + speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash); + if (_currFrameIndex < speedUpFrameIndex) { + startAnimation(0x35AA8059, speedUpFrameIndex, -1); + _y = 438; + } + messageResult = 0; + break; + case 0x100D: + if (param.asInteger() == 0x1A1A0785) { + playSound(0, 0x40F0A342); + } else if (param.asInteger() == 0x60428026) { + playSound(0, 0x40608A59); + } + break; + } + return messageResult; +} + +void Klaymen::stHitByDoor() { + _status2 = 1; + _acceptInput = false; + startAnimation(0x35AA8059, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmHitByDoor); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + playSound(0, 0x402E82D4); +} + +uint32 Klaymen::hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == calcHash("PopBalloon")) { + sendMessage(_parentScene, 0x2000, 0); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } + break; + } + return messageResult; +} + +void Klaymen::upPeekWallBlink() { + Klaymen::update(); + _blinkCounter++; + if (_blinkCounter >= _blinkCounterMax) + stPeekWallBlink(); +} + +void Klaymen::stPeekWall1() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xAC20C012, 8, 37); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stPeekWallBlink); +} + +void Klaymen::stPeekWall2() { + _status2 = 1; + _acceptInput = false; + startAnimation(0xAC20C012, 43, 49); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); +} + +void Klaymen::stPeekWallBlink() { + _blinkCounter = 0; + _status2 = 0; + _acceptInput = true; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; + startAnimation(0xAC20C012, 38, 42); + SetUpdateHandler(&Klaymen::upPeekWallBlink); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klaymen::hmLowLevel); + _newStickFrameIndex = 42; +} + +void Klaymen::stPeekWallReturn() { + _status2 = 0; + _acceptInput = false; + startAnimation(0x2426932E, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPeekWallReturn); + SetSpriteUpdate(NULL); +} + +void Klaymen::stPullHammerLever() { + if (!stStartAction(AnimationCallback(&Klaymen::stPullHammerLever))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x00648953, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPullHammerLever); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + } +} + +uint32 Klaymen::hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klaymen::hmLever(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) + sendMessage(_attachedSprite, 0x480F, 0); + break; + } + return messageResult; +} + +void Klaymen::suRidePlatformDown() { + _platformDeltaY++; + _y += _platformDeltaY; + if (_y > 600) + sendMessage(this, 0x1019, 0); +} + +void Klaymen::stRidePlatformDown() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatformDown))) { + _status2 = 1; + sendMessage(_parentScene, 0x4803, 0); + _acceptInput = false; + _platformDeltaY = 0; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(&Klaymen::suRidePlatformDown); + _vm->_soundMan->playSoundLooping(0xD3B02847); + } +} + +void Klaymen::stCrashDown() { + playSound(0, 0x41648271); + _status2 = 1; + _acceptInput = false; + startAnimationByHash(0x000BAB02, 0x88003000, 0); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + NextState(&Klaymen::stCrashDownFinished); +} + +void Klaymen::stCrashDownFinished() { + setDoDeltaX(2); + stTryStandIdle(); +} + +void Klaymen::upSpitOutFall() { + Klaymen::update(); + if (_countdown1 != 0 && (--_countdown1 == 0)) { + _surface->setVisible(true); + SetUpdateHandler(&Klaymen::update); + } +} + +uint32 Klaymen::hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x168050A0) { + sendMessage(_attachedSprite, 0x480F, 0); + } else if (param.asInteger() == 0x586B0300) { + sendMessage(_otherSprite, 0x480E, 1); + } else if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } + break; + } + return messageResult; +} + +uint32 Klaymen::hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x4811: + playSound(0, 0x5252A0E4); + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + if (_doDeltaX) { + _x = ((Sprite*)sender)->getX() - 75; + } else { + _x = ((Sprite*)sender)->getX() + 75; + } + _y = ((Sprite*)sender)->getY() - 200; + if (param.asInteger() == 0) { + stSpitOutFall0(); + } else if (param.asInteger() == 1) { + // NOTE This is never used and the code was removed + // Also the animations used here in the original don't exist... + } else if (param.asInteger() == 2) { + stSpitOutFall2(); + } + break; + } + return 0; +} + +uint32 Klaymen::hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x942D2081) { + _acceptInput = false; + sendMessage(_attachedSprite, 0x2003, 0); + } else if (param.asInteger() == 0xDA600012) { + stHitByBoxingGlove(); + } else if (param.asInteger() == 0x0D01B294) { + _acceptInput = false; + sendMessage(_attachedSprite, 0x480B, 0); + } + break; + } + return messageResult; +} + +uint32 Klaymen::hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + sendMessage(_attachedSprite, 0x480B, (uint32)_doDeltaX); + } else if (param.asInteger() == 0x02421405) { + if (_isMoveObjectRequested) { + if (sendMessage(_attachedSprite, 0x480C, (uint32)_doDeltaX) != 0) + stContinueMovingVenusFlyTrap(); + } else { + SetMessageHandler(&Klaymen::hmFirstMoveVenusFlyTrap); + } + } else if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } else if (param.asInteger() == 0x32180101) { + playSound(0, 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0460E2FA); + } + break; + case 0x480A: + _isMoveObjectRequested = true; + return 0; + } + return hmLowLevelAnimation(messageNum, param, sender); +} + +uint32 Klaymen::hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + sendMessage(_attachedSprite, 0x482A, 0); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_attachedSprite, 0x482B, 0); + } else if (param.asInteger() == 0x32180101) { + playSound(0, 0x405002D8); + } else if (param.asInteger() == 0x0A2A9098) { + playSound(0, 0x0460E2FA); + } + break; + } + return messageResult; +} + +uint32 Klaymen::hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender) { + int16 speedUpFrameIndex; + uint32 messageResult = hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x1008: + speedUpFrameIndex = getFrameIndex(kKlaymenSpeedUpHash); + if (_currFrameIndex < speedUpFrameIndex) { + startAnimation(0x35AA8059, speedUpFrameIndex, -1); + _y = 435; + } + messageResult = 0; + break; + case 0x100D: + if (param.asInteger() == 0x1A1A0785) { + playSound(0, 0x40F0A342); + } else if (param.asInteger() == 0x60428026) { + playSound(0, 0x40608A59); + } + break; + } + return messageResult; +} + +uint32 Klaymen::hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmLowLevel(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x1307050A) { + playSound(0, 0x40428A09); + } + break; + } + return messageResult; +} + +void Klaymen::suFallDown() { + AnimatedSprite::updateDeltaXY(); + HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); + if (hitRect->type == 0x5001) { + _y = hitRect->rect.y1; + updateBounds(); + sendMessage(this, 0x1019, 0); + } + _parentScene->checkCollision(this, 0xFFFF, 0x4810, 0); +} + +void Klaymen::stJumpToRingVenusFlyTrap() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRingVenusFlyTrap))) { + _status2 = 2; + _acceptInput = false; + startAnimation(0x584984B4, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmJumpToRingVenusFlyTrap); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + NextState(&Klaymen::stLandOnFeet); + sendMessage(_attachedSprite, 0x482B, 0); + } +} + +void Klaymen::stStandIdleSpecial() { + playSound(0, 0x56548280); + _status2 = 0; + _acceptInput = false; + _surface->setVisible(false); + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmStandIdleSpecial); + SetSpriteUpdate(NULL); +} + +void Klaymen::stSpitOutFall0() { + _countdown1 = 1; + _status2 = 0; + _acceptInput = false; + startAnimation(0x000BAB02, 0, -1); + SetUpdateHandler(&Klaymen::upSpitOutFall); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(&Klaymen::suFallDown); + NextState(&Klaymen::stFalling); + sendMessage(_parentScene, 0x8000, 0); +} + +void Klaymen::stSpitOutFall2() { + _countdown1 = 1; + _status2 = 0; + _acceptInput = false; + startAnimation(0x9308C132, 0, -1); + SetUpdateHandler(&Klaymen::upSpitOutFall); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(&Klaymen::suFallDown); + NextState(&Klaymen::stFalling); + sendMessage(_parentScene, 0x8000, 0); +} + +void Klaymen::stFalling() { + sendMessage(_parentScene, 0x1024, 1); + playSound(0, 0x41648271); + _status2 = 1; + _acceptInput = false; + _isWalking = false; + startAnimationByHash(0x000BAB02, 0x88003000, 0); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(NULL); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + NextState(&Klaymen::stFallTouchdown); + sendMessage(_parentScene, 0x2002, 0); + _attachedSprite = NULL; + sendMessage(_parentScene, 0x8001, 0); +} + +void Klaymen::stFallTouchdown() { + setDoDeltaX(2); + stTryStandIdle(); +} + +void Klaymen::stJumpAndFall() { + if (!stStartAction(AnimationCallback(&Klaymen::stJumpAndFall))) { + sendMessage(_parentScene, 0x1024, 3); + _status2 = 2; + _acceptInput = false; + startAnimation(0xB93AB151, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmJumpAndFall); + SetSpriteUpdate(&Klaymen::suFallDown); + NextState(&Klaymen::stLandOnFeet); + } +} + +void Klaymen::stDropFromRing() { + if (_attachedSprite) { + _x = _attachedSprite->getX(); + sendMessage(_attachedSprite, 0x4807, 0); + _attachedSprite = NULL; + } + _status2 = 2; + _acceptInput = false; + startAnimation(0x586984B1, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(&Klaymen::suFallDown); + NextState(&Klaymen::stLandOnFeet); +} + +void Klaymen::stPressDoorButton() { + _status2 = 2; + _acceptInput = true; + setDoDeltaX(0); + startAnimation(0x1CD89029, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmPressDoorButton); + SetSpriteUpdate(&Klaymen::suAction); +} + +void Klaymen::stHitByBoxingGlove() { + _status2 = 1; + _acceptInput = false; + startAnimation(0x35AA8059, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmHitByBoxingGlove); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + FinalizeState(&Klaymen::evHitByBoxingGloveDone); +} + +void Klaymen::evHitByBoxingGloveDone() { + sendMessage(_parentScene, 0x1024, 1); +} + +void Klaymen::stMoveVenusFlyTrap() { + if (!stStartAction(AnimationCallback(&Klaymen::stMoveVenusFlyTrap))) { + _status2 = 2; + _isMoveObjectRequested = false; + _acceptInput = true; + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + startAnimation(0x5C01A870, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmMoveVenusFlyTrap); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + FinalizeState(&Klaymen::evMoveVenusFlyTrapDone); + } +} + +void Klaymen::stContinueMovingVenusFlyTrap() { + _isMoveObjectRequested = false; + _acceptInput = true; + startAnimationByHash(0x5C01A870, 0x01084280, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmMoveVenusFlyTrap); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + FinalizeState(&Klaymen::evMoveVenusFlyTrapDone); +} + +void Klaymen::evMoveVenusFlyTrapDone() { + sendMessage(_attachedSprite, 0x482A, 0); +} + +void Klaymen::suFallSkipJump() { + updateDeltaXY(); + HitRect *hitRect = _parentScene->findHitRectAtPos(_x, _y + 10); + if (hitRect->type == 0x5001) { + _y = hitRect->rect.y1; + updateBounds(); + sendMessage(this, 0x1019, 0); + } +} + +void Klaymen::stFallSkipJump() { + _status2 = 2; + _acceptInput = false; + startAnimationByHash(0xB93AB151, 0x40A100F8, 0); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(&Klaymen::suFallSkipJump); + SetMessageHandler(&Klaymen::hmLowLevel); + NextState(&Klaymen::stLandOnFeet); +} + +void Klaymen::upMoveObject() { + if (_x >= 380) + gotoNextStateExt(); + Klaymen::update(); +} + +uint32 Klaymen::hmMatch(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x51281850) { + setGlobalVar(V_TNT_DUMMY_FUSE_LIT, 1); + } else if (param.asInteger() == 0x43000538) { + playSound(0, 0x21043059); + } else if (param.asInteger() == 0x02B20220) { + playSound(0, 0xC5408620); + } else if (param.asInteger() == 0x0A720138) { + playSound(0, 0xD4C08010); + } else if (param.asInteger() == 0xB613A180) { + playSound(0, 0x44051000); + } + break; + } + return messageResult; +} + +void Klaymen::stFetchMatch() { + if (!stStartAction(AnimationCallback(&Klaymen::stFetchMatch))) { + _status2 = 0; + _acceptInput = false; + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + startAnimation(0x9CAA0218, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmMatch); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stLightMatch); + } +} + +void Klaymen::stLightMatch() { + _status2 = 1; + _acceptInput = false; + setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); + startAnimation(0x1222A513, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmMatch); + SetSpriteUpdate(NULL); +} + +uint32 Klaymen::hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x01084280) { + playSound(0, 0x405002D8); + sendMessage(_attachedSprite, 0x480B, 0); + } else if (param.asInteger() == 0x02421405) { + if (_moveObjectCountdown != 0) { + _moveObjectCountdown--; + stContinueMoveObject(); + } else { + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + } + } + break; + } + return Klaymen::hmLowLevelAnimation(messageNum, param, sender); +} + +uint32 Klaymen::hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000F0082) { + playSound(0, 0x74E2810F); + } + break; + } + return messageResult; +} + +void Klaymen::stMoveObject() { + if (!stStartAction(AnimationCallback(&Klaymen::stMoveObject))) { + _status2 = 2; + _acceptInput = false; + _moveObjectCountdown = 8; + setDoDeltaX(0); + startAnimation(0x0C1CA072, 0, -1); + SetUpdateHandler(&Klaymen::upMoveObject); + SetMessageHandler(&Klaymen::hmMoveObject); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + } +} + +void Klaymen::stContinueMoveObject() { + _acceptInput = false; + startAnimationByHash(0x0C1CA072, 0x01084280, 0); + SetUpdateHandler(&Klaymen::upMoveObject); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&Klaymen::hmMoveObject); +} + +void Klaymen::stTumbleHeadless() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTumbleHeadless))) { + _status2 = 1; + _acceptInput = false; + setDoDeltaX(0); + startAnimation(0x2821C590, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmTumbleHeadless); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + NextState(&Klaymen::stTryStandIdle); + sendMessage(_parentScene, 0x8000, 0); + playSound(0, 0x62E0A356); + } +} + +void Klaymen::stCloseEyes() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stCloseEyes))) { + _status2 = 1; + _acceptInput = false; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); + } +} + +uint32 Klaymen::hmSpit(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Klaymen::hmLowLevelAnimation(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x16401CA6) { + _canSpitPipe = true; + if (_contSpitPipe) + spitIntoPipe(); + } else if (param.asInteger() == 0xC11C0008) { + _canSpitPipe = false; + _acceptInput = false; + _readyToSpit = false; + } else if (param.asInteger() == 0x018A0001) { + sendMessage(_parentScene, 0x2001, _spitDestPipeIndex); + } + break; + } + return messageResult; +} + +void Klaymen::stTrySpitIntoPipe() { + if (_readyToSpit) { + _contSpitPipe = true; + _spitContDestPipeIndex = _spitPipeIndex; + if (_canSpitPipe) + spitIntoPipe(); + } else if (!stStartAction(AnimationCallback(&Klaymen::stTrySpitIntoPipe))) { + _status2 = 2; + _acceptInput = true; + _spitDestPipeIndex = _spitPipeIndex; + _readyToSpit = true; + _canSpitPipe = false; + _contSpitPipe = false; + startAnimation(0x1808B150, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSpit); + SetSpriteUpdate(NULL); + } +} + +void Klaymen::spitIntoPipe() { + _contSpitPipe = false; + _spitDestPipeIndex = _spitContDestPipeIndex; + _canSpitPipe = false; + _acceptInput = false; + startAnimation(0x1B08B553, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSpit); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stContSpitIntoPipe); +} + +void Klaymen::stContSpitIntoPipe() { + _canSpitPipe = true; + _acceptInput = true; + startAnimationByHash(0x1808B150, 0x16401CA6, 0); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmSpit); + SetSpriteUpdate(NULL); +} + +void Klaymen::suRidePlatform() { + _x = _attachedSprite->getX() - 20; + _y = _attachedSprite->getY() + 46; + updateBounds(); +} + +void Klaymen::stRidePlatform() { + if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatform))) { + _status2 = 1; + _acceptInput = true; + startAnimation(0x5420E254, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(&Klaymen::suRidePlatform); + } +} + +void Klaymen::stInteractLever() { + if (!stStartAction(AnimationCallback(&Klaymen::stInteractLever))) { + _status2 = 0; + if (_isLeverDown) { + stUseLeverRelease(); + } else { + _acceptInput = false; + startAnimation(0x0C303040, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLever); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + NextState(&Klaymen::stPullLever); + } + } +} + +void Klaymen::stPullLever() { + startAnimation(0x0D318140, 0, -1); + NextState(&Klaymen::stLookLeverDown); + sendMessage(_attachedSprite, 0x480F, 0); +} + +void Klaymen::stLookLeverDown() { + _acceptInput = true; + _isLeverDown = true; + startAnimation(0x1564A2C0, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetSpriteUpdate(&Klaymen::suUpdateDestX); + NextState(&Klaymen::stWaitLeverDown); +} + +void Klaymen::stWaitLeverDown() { + _acceptInput = true; + _isLeverDown = true; + startAnimation(0x4464A440, 0, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(&Klaymen::suUpdateDestX); +} + +void Klaymen::stStartWalkingResume() { + int16 frameIndex = getGlobalVar(V_KLAYMEN_FRAMEINDEX) + _walkResumeFrameIncr; + if (frameIndex < 0 || frameIndex > 13) + frameIndex = 0; + _status2 = 0; + _isWalking = true; + _acceptInput = true; + startAnimation(0x1A249001, frameIndex, -1); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmWalking); + SetSpriteUpdate(&Klaymen::suWalkingFirst); + NextState(&Klaymen::stUpdateWalkingFirst); + FinalizeState(&Klaymen::evStartWalkingDone); +} + +void Klaymen::upPeekInsideBlink() { + update(); + ++_blinkCounter; + if (_blinkCounter >= _blinkCounterMax) + stPeekInsideBlink(); +} + +void Klaymen::stPeekInside() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xAC20C012, 8, 37); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); + NextState(&Klaymen::stPeekInsideBlink); +} + +void Klaymen::stPeekInsideReturn() { + _status2 = 1; + _acceptInput = false; + startAnimation(0xAC20C012, 43, 49); + SetUpdateHandler(&Klaymen::update); + SetMessageHandler(&Klaymen::hmLowLevelAnimation); + SetSpriteUpdate(NULL); +} + +void Klaymen::stPeekInsideBlink() { + _status2 = 0; + _acceptInput = true; + startAnimation(0xAC20C012, 38, 42); + _newStickFrameIndex = 42; + SetUpdateHandler(&Klaymen::upPeekInsideBlink); + SetMessageHandler(&Klaymen::hmLowLevel); + SetSpriteUpdate(NULL); + _blinkCounter = 0; + _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; +} + +//############################################################################## + +// KmScene1001 + +KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { +} + +uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() == 2) + GotoState(&Klaymen::stSleeping); + break; + case 0x480D: + GotoState(&Klaymen::stPullHammerLever); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4836: + if (param.asInteger() == 1) { + sendMessage(_parentScene, 0x2002, 0); + GotoState(&Klaymen::stWakeUp); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +// KmScene1002 + +KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + setKlaymenIdleTable1(); + +} + +void KmScene1002::xUpdate() { + if (_x >= 250 && _x <= 435 && _y >= 420) { + if (_idleTableNum == 0) { + setKlaymenIdleTable(klaymenIdleTable1002, ARRAYSIZE(klaymenIdleTable1002)); + _idleTableNum = 1; + } + } else if (_idleTableNum == 1) { + setKlaymenIdleTable1(); + _idleTableNum = 0; + } +} + +uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2001: + GotoState(&Klaymen::stStandIdleSpecial); + break; + case 0x2007: + _otherSprite = (Sprite*)param.asEntity(); + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4803: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stJumpAndFall); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stDropFromRing); + } + break; + case 0x4804: + GotoState(&Klaymen::stPeekWall); + break; + case 0x4805: + switch (param.asInteger()) { + case 1: + GotoState(&Klaymen::stJumpToRing1); + break; + case 2: + GotoState(&Klaymen::stJumpToRing2); + break; + case 3: + GotoState(&Klaymen::stJumpToRing3); + break; + case 4: + GotoState(&Klaymen::stJumpToRing4); + break; + } + break; + case 0x480A: + GotoState(&Klaymen::stMoveVenusFlyTrap); + break; + case 0x480D: + GotoState(&Klaymen::stJumpToRingVenusFlyTrap); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stPressDoorButton); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + sub41CCE0(param.asInteger()); + break; + case 0x4820: + sendMessage(_parentScene, 0x2005, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2005, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2005, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2006, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +// KmScene1004 + +KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _dataResource.load(0x01900A04); +} + +uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481E: + GotoState(&Klaymen::stReadNote); + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x4824: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4825: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4828: + GotoState(&Klaymen::stTurnToBackToUse); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stSitIdleTeleporter); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stWalkingFirst); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stReturnFromUseInTeleporter); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483D: + teleporterAppear(0x2C2A4A1C); + break; + case 0x483E: + teleporterDisappear(0x3C2E4245); + break; + } + return messageResult; +} + +// KmScene1201 + +KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); + _flagF6 = true; + +} + +uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480A: + GotoState(&Klaymen::stMoveObject); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case 0x4813: + GotoState(&Klaymen::stFetchMatch); + break; + case 0x4814: + GotoState(&Klaymen::stTumbleHeadless); + break; + case 0x4815: + GotoState(&Klaymen::stCloseEyes); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x481F: + GotoState(&Klaymen::stWonderAbout); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4804: + GotoState(&Klaymen::stPeekWall1); + break; + case 0x483B: + GotoState(&Klaymen::stPeekWallReturn); + break; + case 0x483C: + GotoState(&Klaymen::stPeekWall2); + break; + } + return 0; +} + +KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + GotoState(&Klaymen::stCrashDown); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + } + return 0; +} + +KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + +} + +uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stSitIdleTeleporter); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case NM_KLAYMEN_INSERT_DISK: + GotoState(&Klaymen::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + else + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stReturnFromUseInTeleporter); + else + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483D: + teleporterAppear(0xEE084A04); + break; + case 0x483E: + teleporterDisappear(0xB86A4274); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480A: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); + } else { + GotoState(&Klaymen::stMoveObjectFaceObject); + } + break; + case 0x480D: + GotoState(&Klaymen::stUseLever); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case NM_KLAYMEN_INSERT_DISK: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stInsertKey); + } else { + GotoState(&Klaymen::stInsertDisk); + } + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case NM_KLAYMEN_RELEASE_LEVER: + GotoState(&Klaymen::stReleaseLever); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +// KmScene1401 + +KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480A: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); + } else { + GotoState(&Klaymen::stMoveObjectFaceObject); + } + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + } + return 0; +} + +// KmScene1402 + +KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + SetFilterY(&Sprite::defFilterY); +} + +uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480A: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); + } else { + GotoState(&Klaymen::stMoveObjectFaceObject); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + } + return 0; +} + +// KmScene1403 + +KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); +} + +uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480A: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); + } else { + GotoState(&Klaymen::stMoveObjectFaceObject); + } + break; + case 0x480D: + GotoState(&Klaymen::stUseLever); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case NM_KLAYMEN_RELEASE_LEVER: + GotoState(&Klaymen::stReleaseLever); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +// KmScene1404 + +KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480A: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); + } else { + GotoState(&Klaymen::stMoveObjectFaceObject); + } + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case NM_KLAYMEN_INSERT_DISK: + GotoState(&Klaymen::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { +} + +uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2032: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stSitIdleTeleporter); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stReturnFromUseInTeleporter); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2032, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2032, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +// KmScene1705 + +KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) { + GotoState(&Klaymen::stSitIdleTeleporter); + } else { + GotoState(&Klaymen::stTryStandIdle); + } + break; + case 0x4803: + GotoState(&Klaymen::stFallSkipJump); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_isSittingInTeleporter) { + GotoState(&Klaymen::stTurnToUseInTeleporter); + } + break; + case 0x481E: + if (_isSittingInTeleporter) { + GotoState(&Klaymen::stReturnFromUseInTeleporter); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483D: + teleporterAppear(0x5E0A4905); + break; + case 0x483E: + teleporterDisappear(0xD86E4477); + break; + } + return messageResult; +} + +KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) { + GotoState(&Klaymen::stSitIdleTeleporter); + } else + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stWalkingFirst); + } else + GotoState(&Klaymen::stPeekWall); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) { + GotoState(&Klaymen::stReturnFromUseInTeleporter); + } + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483D: + teleporterAppear(0xBE68CC54); + break; + case 0x483E: + teleporterDisappear(0x18AB4ED4); + break; + } + return messageResult; +} + +KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + // Empty +} + +uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stSitIdleTeleporter); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4811: + GotoState(&Klaymen::stHitByDoor); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter)//CHECKME + GotoState(&Klaymen::stReturnFromUseInTeleporter); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483D: + teleporterAppear(0xFF290E30); + break; + case 0x483E: + teleporterDisappear(0x9A28CA1C); + break; + } + return messageResult; +} + +KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _surface->setClipRects(clipRects, clipRectsCount); + + _dataResource.load(0x04104242); + _flagF6 = false; +} + +uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x4819: + GotoState(&Klaymen::stClayDoorOpen); + break; + case NM_KLAYMEN_INSERT_DISK: + GotoState(&Klaymen::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmScene2205::xUpdate() { + setGlobalVar(V_KLAYMEN_FRAMEINDEX, _currFrameIndex); +} + +uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stStartWalkingResume); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _walkResumeFrameIncr = 1; + _vm->_soundMan->addSound(0x80101800, 0xD3B02847); +} + +KmScene2206::~KmScene2206() { + _vm->_soundMan->deleteSoundGroup(0x80101800); +} + +void KmScene2206::xUpdate() { + setGlobalVar(V_KLAYMEN_FRAMEINDEX, _currFrameIndex); +} + +uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4803: + GotoState(&Klaymen::stRidePlatformDown); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stStartWalkingResume); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x4837: + stopWalking(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x2001: + GotoState(&Klaymen::stRidePlatform); + break; + case 0x2005: + suRidePlatform(); + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480D: + GotoState(&Klaymen::stInteractLever); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case NM_KLAYMEN_RELEASE_LEVER: + GotoState(&Klaymen::stReleaseLever); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmScene2242::xUpdate() { + setGlobalVar(V_KLAYMEN_FRAMEINDEX, _currFrameIndex); +} + +uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stStartWalkingResume); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) { + GotoState(&Klaymen::stPickUpNeedle); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stPickUpTube); + } else { + GotoState(&Klaymen::stPickUpGeneric); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4837: + stopWalking(); + break; + } + return 0; +} + +KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmHallOfRecords::xUpdate() { + setGlobalVar(V_KLAYMEN_FRAMEINDEX, _currFrameIndex); +} + +uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stStartWalkingResume); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4837: + stopWalking(); + break; + } + return 0; +} + +KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +void KmScene2247::xUpdate() { + setGlobalVar(V_KLAYMEN_FRAMEINDEX, _currFrameIndex); +} + +uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stStartWalkingResume); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4837: + stopWalking(); + break; + } + return 0; +} + +KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x4832: + GotoState(&Klaymen::stUseTube); + break; + case 0x4833: + if (param.asInteger() == 1) + GotoState(&Klaymen::stWonderAbout); + else { + _spitPipeIndex = sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klaymen::stTrySpitIntoPipe); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (!getGlobalVar(V_TV_JOKE_TOLD)) + GotoState(&Klaymen::stStandWonderAbout); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stWalkingFirst); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x480D: + GotoState(&Klaymen::stPullCord); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case NM_KLAYMEN_PRESS_BUTTON: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stPressButton); + } else if (param.asInteger() == 2) { + GotoState(&Klaymen::stPressFloorButton); + } else { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _surface->setClipRects(clipRects, clipRectsCount); + +} + +uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + if (param.asInteger() != 0) { + _destX = param.asInteger(); + GotoState(&Klaymen::stWalkingFirst); + } else { + GotoState(&Klaymen::stPeekWall); + } + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) + GotoState(&Klaymen::stPickUpNeedle); + else if (param.asInteger() == 1) + GotoState(&Klaymen::stPickUpTube); + else + GotoState(&Klaymen::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481A: + GotoState(&Klaymen::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) + sub41CC40(param.asPoint().y, param.asPoint().x); + else + sub41CCE0(param.asPoint().x); + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return messageResult; +} + +KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stSitIdleTeleporter); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stReturnFromUseInTeleporter); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + } + return messageResult; +} + +KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4804: + GotoState(&Klaymen::stPeekInside); + break; + case 0x483C: + GotoState(&Klaymen::stPeekInsideReturn); + break; + } + return 0; +} + +KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x4837: + stopWalking(); + break; + } + return 0; +} + +KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _surface->setClipRects(clipRects, clipRectsCount); + + _dataResource.load(0x00900849); +} + +uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4803: + _destY = param.asInteger(); + GotoState(&Klaymen::stJumpToGrab); + break; + case 0x4804: + if (param.asInteger() == 3) + GotoState(&Klaymen::stFinishGrow); + break; + case 0x480D: + GotoState(&Klaymen::stPullCord); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x481F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else { + GotoState(&Klaymen::stWonderAboutHalf); + } + break; + case 0x482E: + GotoState(&Klaymen::stWalkToFront); + break; + case 0x482F: + GotoState(&Klaymen::stTurnToBack); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4838: + GotoState(&Klaymen::stJumpToGrabRelease); + break; + } + return 0; +} + +KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _dataResource.load(0x81120132); +} + +uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToXSmall(param.asPoint().x); + break; + case 0x4004: + GotoState(&Klaymen::stStandIdleSmall); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x); + break; + case 0x481F: + if (param.asInteger() == 1) + GotoState(&Klaymen::stWonderAboutAfterSmall); + else if (param.asInteger() == 0) + GotoState(&Klaymen::stWonderAboutHalfSmall); + else + GotoState(&Klaymen::stWonderAboutSmall); + break; + case 0x482E: + if (param.asInteger() == 1) + GotoState(&Klaymen::stWalkToFrontNoStepSmall); + else if (param.asInteger() == 2) + GotoState(&Klaymen::stWalkToFront2Small); + else + GotoState(&Klaymen::stWalkToFrontSmall); + break; + case 0x482F: + if (param.asInteger() == 1) + GotoState(&Klaymen::stTurnToBackHalfSmall); + else if (param.asInteger() == 2) + GotoState(&Klaymen::stTurnToBackWalkSmall); + else + GotoState(&Klaymen::stTurnToBackSmall); + break; + case 0x4830: + GotoState(&Klaymen::stShrink); + break; + } + return 0; +} + +KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { + uint32 messageResult = 0; + switch (messageNum) { + case 0x2000: + _isSittingInTeleporter = param.asInteger() != 0; + messageResult = 1; + break; + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stSitIdleTeleporter); + else + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481D: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stTurnToUseInTeleporter); + break; + case 0x481E: + if (_isSittingInTeleporter) + GotoState(&Klaymen::stReturnFromUseInTeleporter); + break; + case 0x4834: + GotoState(&Klaymen::stStepOver); + break; + case 0x4835: + sendMessage(_parentScene, 0x2000, 1); + _isSittingInTeleporter = true; + GotoState(&Klaymen::stSitInTeleporter); + break; + case 0x4836: + sendMessage(_parentScene, 0x2000, 0); + _isSittingInTeleporter = false; + GotoState(&Klaymen::stGetUpFromTeleporter); + break; + case 0x483D: + teleporterAppear(0xDE284B74); + break; + case 0x483E: + teleporterDisappear(0xD82A4094); + break; + } + return messageResult; +} + +KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + if (flag) { + NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); + delete _surface; + createSurface(1000, dimensions.width, dimensions.height); + loadSound(3, 0x58E0C341); + loadSound(4, 0x40A00342); + loadSound(5, 0xD0A1C348); + loadSound(6, 0x166FC6E0); + loadSound(7, 0x00018040); + } + + _dataResource.load(0x98182003); + _surface->setClipRects(clipRects, clipRectsCount); + +} + +uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + startWalkToX(440, true); + break; + case 0x480D: + GotoState(&Klaymen::stPullCord); + break; + case 0x4816: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x4831: + GotoState(&Klaymen::stGrow); + break; + case 0x4832: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stDrinkPotion); + } else { + GotoState(&Klaymen::stUseTube); + } + break; + } + return 0; +} + +KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + if (flag) { + NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); + delete _surface; + createSurface(1000, dimensions.width, dimensions.height); + loadSound(3, 0x58E0C341); + loadSound(4, 0x40A00342); + loadSound(5, 0xD0A1C348); + loadSound(6, 0x166FC6E0); + loadSound(7, 0x00018040); + } + + _dataResource.load(0x1830009A); + _surface->setClipRects(clipRects, clipRectsCount); + +} + +uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4804: + startWalkToX(226, true); + break; + case 0x480D: + GotoState(&Klaymen::stPullCord); + break; + case 0x4816: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stPressButtonSide); + } + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x4831: + GotoState(&Klaymen::stGrow); + break; + case 0x4832: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stDrinkPotion); + } else { + GotoState(&Klaymen::stUseTube); + } + break; + } + return 0; +} + +KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToXSmall(param.asPoint().x); + break; + case 0x4004: + GotoState(&Klaymen::stStandIdleSmall); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToXSmall(_dataResource.getPoint(param.asInteger()).x); + break; + case 0x481F: + if (param.asInteger() == 1) + GotoState(&Klaymen::stWonderAboutAfterSmall); + else if (param.asInteger() == 0) + GotoState(&Klaymen::stWonderAboutHalfSmall); + else + GotoState(&Klaymen::stWonderAboutSmall); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStepSmall); + } else { + GotoState(&Klaymen::stWalkToFrontSmall); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToBackHalfSmall); + } else { + GotoState(&Klaymen::stTurnToBackSmall); + } + break; + case 0x4837: + stopWalking(); + break; + } + return 0; +} + +KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + + _surface->setClipRects(clipRects, clipRectsCount); + +} + +uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4803: + _destY = param.asInteger(); + GotoState(&Klaymen::stJumpToGrab); + break; + case 0x4804: + if (param.asInteger() == 3) + GotoState(&Klaymen::stFinishGrow); + break; + case NM_KLAYMEN_PICKUP: + GotoState(&Klaymen::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x4818: + startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); + break; + case 0x481B: + if (param.asPoint().y != 0) { + sub41CC40(param.asPoint().y, param.asPoint().x); + } else { + sub41CCE0(param.asPoint().x); + } + break; + case 0x481F: + if (param.asInteger() == 0) { + GotoState(&Klaymen::stWonderAboutHalf); + } else if (param.asInteger() == 1) { + GotoState(&Klaymen::stWonderAboutAfter); + } else if (param.asInteger() == 3) { + GotoState(&Klaymen::stTurnToUseHalf); + } else if (param.asInteger() == 4) { + GotoState(&Klaymen::stTurnAwayFromUse); + } else if (param.asInteger() == 5) { + GotoState(&Klaymen::stTurnToUseExt); + } else { + GotoState(&Klaymen::stWonderAbout); + } + break; + case 0x4820: + sendMessage(_parentScene, 0x2000, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2000, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x4824: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4825: + sendMessage(_parentScene, 0x2000, 0); + _destY = _dataResource.getPoint(param.asInteger()).y; + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x4837: + stopWalking(); + break; + } + return 0; +} + +KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : Klaymen(vm, parentScene, x, y, 1000, 1000) { + // Empty +} + +uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { + switch (messageNum) { + case 0x4001: + case 0x4800: + startWalkToX(param.asPoint().x, false); + break; + case 0x4004: + GotoState(&Klaymen::stTryStandIdle); + break; + case 0x4805: + _destY = param.asInteger(); + GotoState(&Klaymen::stJumpToGrabFall); + break; + case NM_KLAYMEN_PICKUP: + if (param.asInteger() == 2) + GotoState(&Klaymen::stPickUpNeedle); + else if (param.asInteger() == 1) + GotoState(&Klaymen::stPickUpTube); + else + GotoState(&Klaymen::stPickUpGeneric); + break; + case 0x4817: + setDoDeltaX(param.asInteger()); + gotoNextStateExt(); + break; + case 0x481A: + GotoState(&Klaymen::stInsertDisk); + break; + case 0x481B: + if (param.asPoint().y != 0) + sub41CC40(param.asPoint().y, param.asPoint().x); + else + sub41CCE0(param.asPoint().x); + break; + case 0x481D: + GotoState(&Klaymen::stTurnToUse); + break; + case 0x481E: + GotoState(&Klaymen::stReturnFromUse); + break; + case 0x4820: + sendMessage(_parentScene, 0x2001, 0); + GotoState(&Klaymen::stContinueClimbLadderUp); + break; + case 0x4821: + sendMessage(_parentScene, 0x2001, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderDown); + break; + case 0x4822: + sendMessage(_parentScene, 0x2001, 0); + _destY = param.asInteger(); + GotoState(&Klaymen::stStartClimbLadderUp); + break; + case 0x4823: + sendMessage(_parentScene, 0x2002, 0); + GotoState(&Klaymen::stClimbLadderHalf); + break; + case 0x482D: + setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); + gotoNextStateExt(); + break; + case 0x482E: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stWalkToFrontNoStep); + } else { + GotoState(&Klaymen::stWalkToFront); + } + break; + case 0x482F: + if (param.asInteger() == 1) { + GotoState(&Klaymen::stTurnToFront); + } else { + GotoState(&Klaymen::stTurnToBack); + } + break; + case 0x483F: + startSpecialWalkRight(param.asInteger()); + break; + case 0x4840: + startSpecialWalkLeft(param.asInteger()); + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h new file mode 100644 index 0000000000..6e5a843f47 --- /dev/null +++ b/engines/neverhood/klaymen.h @@ -0,0 +1,764 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_KLAYMEN_H +#define NEVERHOOD_KLAYMEN_H + +#include "neverhood/neverhood.h" +#include "neverhood/sprite.h" +#include "neverhood/graphics.h" +#include "neverhood/resource.h" + +namespace Neverhood { + +// TODO This code is horrible and weird and a lot of stuff needs renaming once a better name is found +// TODO Also the methods should probably rearranged and be grouped together more consistently + +class Klaymen; +class Scene; + +const uint32 kKlaymenSpeedUpHash = 0x004A2148; + +#include "common/pack-start.h" // START STRUCT PACKING + +struct KlaymenIdleTableItem { + int value; + void (Klaymen::*callback)(); +}; + +#include "common/pack-end.h" // END STRUCT PACKING + +class Klaymen : public AnimatedSprite { +public: + Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); + + void update(); + + void startIdleAnimation(uint32 fileHash, AnimationCb callback); + void upIdleAnimation(); + + void stDoIdlePickEar(); + void stIdlePickEar(); + void evIdlePickEarDone(); + uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDoIdleSpinHead(); + void stIdleSpinHead(); + uint32 hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDoIdleArms(); + void stIdleArms(); + void evIdleArmsDone(); + uint32 hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDoIdleChest(); + void stIdleChest(); + uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDoIdleHeadOff(); + void stIdleHeadOff(); + uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); + + void stIdleWonderAbout(); + + void stDoIdleTeleporterHands(); + void stIdleTeleporterHands(); + + void stDoIdleTeleporterHands2(); + void stIdleTeleporterHands2(); + + void stTryStandIdle(); + void stStandAround(); + void upStandIdle(); + void stIdleBlink(); + + bool stStartAction(AnimationCb callback3); + bool stStartActionFromIdle(AnimationCb callback); + uint32 hmStartAction(int messageNum, const MessageParam ¶m, Entity *sender); + + void stSneak(); + uint32 hmSneaking(int messageNum, const MessageParam ¶m, Entity *sender); + void suSneaking(); + void evSneakingDone(); + + void stStartWalking(); + void stStartWalkingExt(); + void stWalkingOpenDoor(); + void suWalkingOpenDoor(); + void stStepOver(); + uint32 hmStartWalking(int messageNum, const MessageParam ¶m, Entity *sender); + void evStartWalkingDone(); + + void stWalkingFirst(); + void stWalkingFirstExt(); + void stStartWalkingResume(); + void stUpdateWalkingFirst(); + uint32 hmWalking(int messageNum, const MessageParam ¶m, Entity *sender); + void suWalkingFirst(); + + void stWalkToFrontNoStep(); + void stWalkToFront(); + void stTurnToFront(); + void stTurnToBack(); + uint32 hmWalkToFront(int messageNum, const MessageParam ¶m, Entity *sender); + + void stTurnToBackToUse(); + uint32 hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPickUpGeneric(); + void stPickUpNeedle(); + uint32 hmPickUpObject(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPickUpTube(); + uint32 hmPickUpTube(int messageNum, const MessageParam ¶m, Entity *sender); + + void stTurnToUse(); + void stTurnToUseHalf(); + void stTurnAwayFromUse(); + void stReturnFromUse(); + void stTurnToUseExt(); + uint32 hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *sender); + + void stLargeStep(); + uint32 hmLargeStep(int messageNum, const MessageParam ¶m, Entity *sender); + void suLargeStep(); + void evLargeStepDone(); + + void stInsertKey(); + uint32 hmInsertKey(int messageNum, const MessageParam ¶m, Entity *sender); + + void stReadNote(); + uint32 hmReadNote(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHitByDoor(); + uint32 hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPeekWall(); + uint32 hmPeekWall(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPeekWallReturn(); + uint32 hmPeekWallReturn(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPeekWallBlink(); + void upPeekWallBlink(); + + void stPeekWall1(); + + void stPeekWall2(); + + void stPullHammerLever(); + uint32 hmPullHammerLever(int messageNum, const MessageParam ¶m, Entity *sender); + + void stRidePlatformDown(); + void suRidePlatformDown(); + + void stCrashDown(); + void stCrashDownFinished(); + + void stShrink(); + uint32 hmShrink(int messageNum, const MessageParam ¶m, Entity *sender); + + void stGrow(); + uint32 hmGrow(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDrinkPotion(); + uint32 hmDrinkPotion(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPullCord(); + void stReleaseCord(); + uint32 hmPullReleaseCord(int messageNum, const MessageParam ¶m, Entity *sender); + + void stUseTube(); + uint32 hmUseTube(int messageNum, const MessageParam ¶m, Entity *sender); + + void stUseLever(); + void stUseLeverRelease(); + void stReleaseLever(); + void stInteractLever(); + uint32 hmLever(int messageNum, const MessageParam ¶m, Entity *sender); + + void stLetGoOfLever(); + void evLeverReleasedEvent(); + + void stWakeUp(); + + void stSleeping(); + uint32 hmSleeping(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPressButton(); + void stPressFloorButton(); + void stPressButtonSide(); + uint32 hmPressButton(int messageNum, const MessageParam ¶m, Entity *sender); + + void stWonderAbout(); + void stWonderAboutHalf(); + void stWonderAboutAfter(); + + void stStandWonderAbout(); + + void stStartClimbLadderUp(); + void stStartClimbLadderDown(); + uint32 hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, Entity *sender); + + void stContinueClimbLadderUp(); + + void stClimbLadderHalf(); + uint32 hmClimbLadderHalf(int messageNum, const MessageParam ¶m, Entity *sender); + + void setupJumpToRing(); + void stJumpToRing1(); + void stJumpToRing2(); + void stJumpToRing4(); + uint32 hmJumpToRing(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHangOnRing(); + + void stJumpToRing3(); + uint32 hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHoldRing3(); + uint32 hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *sender); + + void stReleaseRing(); + + void stLandOnFeet(); + uint32 hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPullLeverDown(); + void stHoldLeverDown(); + + void stInsertDisk(); + uint32 hmInsertDisk(int messageNum, const MessageParam ¶m, Entity *sender); + + void stMoveObjectSkipTurnFaceObject(); + void stMoveObjectSkipTurn(); + void stMoveObjectFaceObject(); + uint32 hmMoveObjectTurn(int messageNum, const MessageParam ¶m, Entity *sender); + void evMoveObjectTurnDone(); + + void stJumpToGrab(); + void stJumpToGrabFall(); + uint32 hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity *sender); + void suJumpToGrab(); + + void stJumpToGrabRelease(); + uint32 hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, Entity *sender); + + void stSitInTeleporter(); + uint32 hmSitInTeleporter(int messageNum, const MessageParam ¶m, Entity *sender); + + void stSitIdleTeleporter(); + void upSitIdleTeleporter(); + + void stSitIdleTeleporterBlink(); + + void stSitIdleTeleporterBlinkSecond(); + + void stTurnToUseInTeleporter(); + + void stReturnFromUseInTeleporter(); + + void stGetUpFromTeleporter(); + + void teleporterAppear(uint32 fileHash); + void teleporterDisappear(uint32 fileHash); + uint32 hmTeleporterAppearDisappear(int messageNum, const MessageParam ¶m, Entity *sender); + + void stClayDoorOpen(); + uint32 hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity *sender); + + void stFallSkipJump(); + void suFallSkipJump(); + + void stMoveObject(); + void stContinueMoveObject(); + uint32 hmMoveObject(int messageNum, const MessageParam ¶m, Entity *sender); + void upMoveObject(); + + void stCloseEyes(); + + void stTumbleHeadless(); + uint32 hmTumbleHeadless(int messageNum, const MessageParam ¶m, Entity *sender); + + void stFetchMatch(); + void stLightMatch(); + uint32 hmMatch(int messageNum, const MessageParam ¶m, Entity *sender); + + void stHitByBoxingGlove(); + uint32 hmHitByBoxingGlove(int messageNum, const MessageParam ¶m, Entity *sender); + void evHitByBoxingGloveDone(); + + void stStandIdleSmall(); + void stWonderAboutSmall(); + void stWonderAboutHalfSmall(); + void stWonderAboutAfterSmall(); + + void stWalkToFrontNoStepSmall(); + void stWalkToFrontSmall(); + void stWalkToFront2Small(); + void stTurnToBackHalfSmall(); + void stTurnToBackWalkSmall(); + void stTurnToBackSmall(); + uint32 hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, Entity *sender); + + void stFinishGrow(); + uint32 hmFinishGrow(int messageNum, const MessageParam ¶m, Entity *sender); + + void stJumpToRingVenusFlyTrap(); + uint32 hmJumpToRingVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + + void stDropFromRing(); + + void stStandIdleSpecial(); + uint32 hmStandIdleSpecial(int messageNum, const MessageParam ¶m, Entity *sender); + + void stPressDoorButton(); + uint32 hmPressDoorButton(int messageNum, const MessageParam ¶m, Entity *sender); + + void stSpitOutFall0(); + void stSpitOutFall2(); + void suFallDown(); + void upSpitOutFall(); + + void stJumpAndFall(); + uint32 hmJumpAndFall(int messageNum, const MessageParam ¶m, Entity *sender); + + void stFalling(); + void stFallTouchdown(); + + void stMoveVenusFlyTrap(); + void stContinueMovingVenusFlyTrap(); + uint32 hmMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmFirstMoveVenusFlyTrap(int messageNum, const MessageParam ¶m, Entity *sender); + void evMoveVenusFlyTrapDone(); + + void stPeekInside(); + void stPeekInsideReturn(); + void stPeekInsideBlink(); + void upPeekInsideBlink(); + + //////////////////////////////////////////////////////////////////////////// + + void stopWalking(); + + void suAction(); + void suUpdateDestX(); + void suWalkingTestExit(); + + uint32 hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + + void setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount); + void setKlaymenIdleTable1(); + void setKlaymenIdleTable2(); + void setKlaymenIdleTable3(); + + void setSoundFlag(bool value) { _soundFlag = value; } + + void spitIntoPipe(); + void stTrySpitIntoPipe(); + void stContSpitIntoPipe(); + uint32 hmSpit(int messageNum, const MessageParam ¶m, Entity *sender); + + void stRidePlatform(); + void suRidePlatform(); + void stPullLever(); + void stLookLeverDown(); + void stWaitLeverDown(); + +protected: + Scene *_parentScene; + Sprite *_attachedSprite; + int _ladderStatus; + bool _isWalking; + bool _isSneaking; + bool _isLargeStep; + bool _isMoveObjectRequested; + bool _acceptInput; + int16 _destX, _destY; + int16 _idleCounter, _idleCounterMax; + int16 _blinkCounter, _blinkCounterMax; + int16 _countdown1; + int16 _tapesToInsert, _keysToInsert; + bool _flagF6; + bool _isLeverDown; + bool _isWalkingOpenDoorNotified; + int _status2; + bool _flagFA; + int _status3; + const KlaymenIdleTableItem *_idleTable; + int _idleTableCount; + int _idleTableMaxValue; + NPointArray *_pathPoints; + bool _soundFlag; + + bool _isSittingInTeleporter; + + bool _potionFlag1; + bool _potionFlag2; + + int16 _platformDeltaY; + + Sprite *_otherSprite; + int _idleTableNum; + + int16 _walkResumeFrameIncr; + + int _moveObjectCountdown; + + bool _canSpitPipe; + bool _contSpitPipe; + bool _readyToSpit; + uint32 _spitPipeIndex; + uint32 _spitDestPipeIndex; + uint32 _spitContDestPipeIndex; + + virtual void xUpdate(); + // TODO Check if this can be turned into a void result + virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); + + void startWalkToX(int16 x, bool flag); + void startWalkToXExt(int16 x); + void startWalkToXSmall(int16 x); + void startSpecialWalkLeft(int16 x); + void startSpecialWalkRight(int16 x); + void sub41CC40(int16 x1, int16 x2); + void sub41CCE0(int16 x); + + void gotoNextStateExt(); + void sub41C770(); + void sub41C790(); + + void stStartWalkingSmall(); + uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); + + void walkAlongPathPoints(); + +}; + +class KmScene1001 : public Klaymen { +public: + KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1002 : public Klaymen { +public: + KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1004 : public Klaymen { +public: + KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1109 : public Klaymen { +public: + KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1201 : public Klaymen { +public: + KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1303 : public Klaymen { +public: + KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1304 : public Klaymen { +public: + KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1305 : public Klaymen { +public: + KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1306 : public Klaymen { +public: + KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1308 : public Klaymen { +public: + KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1401 : public Klaymen { +public: + KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1402 : public Klaymen { +public: + KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1403 : public Klaymen { +public: + KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1404 : public Klaymen { +public: + KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1608 : public Klaymen { +public: + KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1705 : public Klaymen { +public: + KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene1901 : public Klaymen { +public: + KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2001 : public Klaymen { +public: + KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2101 : public Klaymen { +public: + KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2201 : public Klaymen { +public: + KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2203 : public Klaymen { +public: + KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2205 : public Klaymen { +public: + KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2206 : public Klaymen { +public: + KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); + ~KmScene2206(); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2207 : public Klaymen { +public: + KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2242 : public Klaymen { +public: + KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmHallOfRecords : public Klaymen { +public: + KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2247 : public Klaymen { +public: + KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + void xUpdate(); + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2401 : public Klaymen { +public: + KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2402 : public Klaymen { +public: + KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2403 : public Klaymen { +public: + KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2406 : public Klaymen { +public: + KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2501 : public Klaymen { +public: + KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2732 : public Klaymen { +public: + KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2801 : public Klaymen { +public: + KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2803 : public Klaymen { +public: + KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2803Small : public Klaymen { +public: + KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2805 : public Klaymen { +public: + KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2806 : public Klaymen { +public: + KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2809 : public Klaymen { +public: + KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, + bool flag, NRect *clipRects, uint clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2810Small : public Klaymen { +public: + KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2810 : public Klaymen { +public: + KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, + NRect *clipRects, uint clipRectsCount); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +class KmScene2812 : public Klaymen { +public: + KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); +protected: + uint32 xHandleMessage(int messageNum, const MessageParam ¶m); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_KLAYMEN_H */ diff --git a/engines/neverhood/messages.h b/engines/neverhood/messages.h index 5a2139db2c..78c66868d5 100644 --- a/engines/neverhood/messages.h +++ b/engines/neverhood/messages.h @@ -26,10 +26,10 @@ namespace Neverhood { enum NeverhoodMessage { - NM_KLAYMAN_PICKUP = 0x4812, - NM_KLAYMAN_PRESS_BUTTON = 0x4816, - NM_KLAYMAN_INSERT_DISK = 0x481A, - NM_KLAYMAN_RELEASE_LEVER = 0x4827 + NM_KLAYMEN_PICKUP = 0x4812, + NM_KLAYMEN_PRESS_BUTTON = 0x4816, + NM_KLAYMEN_INSERT_DISK = 0x481A, + NM_KLAYMEN_RELEASE_LEVER = 0x4827 }; } // End of namespace Neverhood diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index d9486d9347..59effb593c 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -9,7 +9,7 @@ MODULE_OBJS = \ gamemodule.o \ gamevars.o \ graphics.o \ - klayman.o \ + klaymen.o \ menumodule.o \ microtiles.o \ module.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp index 0329f589a4..096072b7b6 100644 --- a/engines/neverhood/module1000.cpp +++ b/engines/neverhood/module1000.cpp @@ -348,33 +348,33 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game setRectList(0x004B49F0); - insertKlayman(200, 433); + insertKlaymen(200, 433); setMessageList(0x004B4888); } else if (which == 1) { // Klaymen entering from the right setRectList(0x004B49F0); - insertKlayman(640, 433); + insertKlaymen(640, 433); setMessageList(0x004B4898); } else if (which == 2) { // Klaymen returning from looking through the window setRectList(0x004B49F0); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(390, 433); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(390, 433); + _klaymen->setDoDeltaX(1); } else { - insertKlayman(300, 433); + insertKlaymen(300, 433); } setMessageList(0x004B4970); } else { // Klaymen sleeping setRectList(0x004B4A00); - insertKlayman(200, 433); + insertKlaymen(200, 433); setMessageList(0x004B4890); } tempSprite = insertStaticSprite(0x2080A3A8, 1300); - _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); if (!getGlobalVar(V_DOOR_BUSTED)) { _asDoor = insertSprite(); @@ -399,7 +399,7 @@ Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1001::~Scene1001() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX()); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX()); } uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -408,7 +408,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x00342624) { - sendEntityMessage(_klayman, 0x1014, _asLever); + sendEntityMessage(_klaymen, 0x1014, _asLever); setMessageList2(0x004B4910); messageResult = 1; } else if (param.asInteger() == 0x21E64A00) { @@ -419,7 +419,7 @@ uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entit } messageResult = 1; } else if (param.asInteger() == 0x040424D0) { - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); } else if (param.asInteger() == 0x80006358) { if (getGlobalVar(V_WINDOW_OPEN)) { setMessageList(0x004B4938); @@ -768,8 +768,8 @@ uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam &pa return messageResult; } -AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool isSecond) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _isSecond(isSecond), _countdown(0) { +AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _isSecond(isSecond), _countdown(0) { createSurface(995, 175, 195); if (!_isSecond) { @@ -805,9 +805,9 @@ void AsScene1002VenusFlyTrap::update() { } void AsScene1002VenusFlyTrap::upIdle() { - if (_countdown == 0 && _klayman->getX() - 20 > _x) + if (_countdown == 0 && _klaymen->getX() - 20 > _x) setDoDeltaX(1); - else if (_klayman->getX() + 20 < _x) + else if (_klaymen->getX() + 20 < _x) setDoDeltaX(0); update(); } @@ -866,7 +866,7 @@ uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam stGrabRing(); break; case 0x4810: - swallowKlayman(); + swallowKlaymen(); break; case 0x482A: sendMessage(_parentScene, 0x1022, 995); @@ -897,11 +897,11 @@ uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessagePara else if (param.asInteger() == 0x41881801) { if (_isSecond) { if (_x > 330) - sendMessage(_klayman, 0x4811, 2); + sendMessage(_klaymen, 0x4811, 2); else - sendMessage(_klayman, 0x4811, 0); + sendMessage(_klaymen, 0x4811, 0); } else { - sendMessage(_klayman, 0x4811, 0); + sendMessage(_klaymen, 0x4811, 0); } } else if (param.asInteger() == 0x522200A0) playSound(0, 0x931080C8); @@ -956,11 +956,11 @@ void AsScene1002VenusFlyTrap::stRingGrabbed() { SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); } -void AsScene1002VenusFlyTrap::stKlaymanInside() { +void AsScene1002VenusFlyTrap::stKlaymenInside() { startAnimation(0x31303094, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(NULL); - NextState(&AsScene1002VenusFlyTrap::stKlaymanInsideMoving); + NextState(&AsScene1002VenusFlyTrap::stKlaymenInsideMoving); _countdown = 24; } @@ -985,31 +985,31 @@ void AsScene1002VenusFlyTrap::stIdle() { } } -void AsScene1002VenusFlyTrap::stKlaymanInsideMoving() { +void AsScene1002VenusFlyTrap::stKlaymenInsideMoving() { startAnimation(0x152920C4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); - NextState(&AsScene1002VenusFlyTrap::stSpitOutKlayman); + NextState(&AsScene1002VenusFlyTrap::stSpitOutKlaymen); } -void AsScene1002VenusFlyTrap::stSpitOutKlayman() { +void AsScene1002VenusFlyTrap::stSpitOutKlaymen() { startAnimation(0x84001117, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); NextState(&AsScene1002VenusFlyTrap::stIdle); } -void AsScene1002VenusFlyTrap::swallowKlayman() { - if (_x - 15 < _klayman->getX() && _x + 15 > _klayman->getX()) { +void AsScene1002VenusFlyTrap::swallowKlaymen() { + if (_x - 15 < _klaymen->getX() && _x + 15 > _klaymen->getX()) { if (_isSecond) setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); else setDoDeltaX(_x > 320 ? 1 : 0); - sendMessage(_klayman, 0x2001, 0); + sendMessage(_klaymen, 0x2001, 0); startAnimation(0x8C2C80D4, 0, -1); SetUpdateHandler(&AsScene1002VenusFlyTrap::update); SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); - NextState(&AsScene1002VenusFlyTrap::stKlaymanInside); + NextState(&AsScene1002VenusFlyTrap::stKlaymenInside); } } @@ -1083,59 +1083,59 @@ void AsScene1002OutsideDoorBackground::stDoorClosed() { stopAnimation(); } -AsScene1002KlaymanLadderHands::AsScene1002KlaymanLadderHands(NeverhoodEngine *vm, Klayman *klayman) - : AnimatedSprite(vm, 1200), _klayman(klayman) { +AsScene1002KlaymenLadderHands::AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen) + : AnimatedSprite(vm, 1200), _klaymen(klaymen) { createSurface(1200, 40, 163); setVisible(false); - SetUpdateHandler(&AsScene1002KlaymanLadderHands::update); + SetUpdateHandler(&AsScene1002KlaymenLadderHands::update); SetMessageHandler(&Sprite::handleMessage); } -void AsScene1002KlaymanLadderHands::update() { - if (_klayman->getCurrAnimFileHash() == 0x3A292504) { - startAnimation(0xBA280522, _klayman->getFrameIndex(), -1); - _newStickFrameIndex = _klayman->getFrameIndex(); +void AsScene1002KlaymenLadderHands::update() { + if (_klaymen->getCurrAnimFileHash() == 0x3A292504) { + startAnimation(0xBA280522, _klaymen->getFrameIndex(), -1); + _newStickFrameIndex = _klaymen->getFrameIndex(); setVisible(true); - _x = _klayman->getX(); - _y = _klayman->getY(); - setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); - } else if (_klayman->getCurrAnimFileHash() == 0x122D1505) { - startAnimation(0x1319150C, _klayman->getFrameIndex(), -1); - _newStickFrameIndex = _klayman->getFrameIndex(); + _x = _klaymen->getX(); + _y = _klaymen->getY(); + setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); + } else if (_klaymen->getCurrAnimFileHash() == 0x122D1505) { + startAnimation(0x1319150C, _klaymen->getFrameIndex(), -1); + _newStickFrameIndex = _klaymen->getFrameIndex(); setVisible(true); - _x = _klayman->getX(); - _y = _klayman->getY(); - setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); + _x = _klaymen->getX(); + _y = _klaymen->getY(); + setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); } else setVisible(false); AnimatedSprite::update(); } -AsScene1002KlaymanPeekHand::AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman) - : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klayman(klayman), +AsScene1002KlaymenPeekHand::AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen) + : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klaymen(klaymen), _isClipRectSaved(false) { createSurface(1000, 33, 41); setVisible(false); - SetUpdateHandler(&AsScene1002KlaymanPeekHand::update); - SetMessageHandler(&AsScene1002KlaymanPeekHand::handleMessage); + SetUpdateHandler(&AsScene1002KlaymenPeekHand::update); + SetMessageHandler(&AsScene1002KlaymenPeekHand::handleMessage); } -void AsScene1002KlaymanPeekHand::update() { - if (_klayman->getCurrAnimFileHash() == 0xAC20C012 && _klayman->getFrameIndex() < 50) { - startAnimation(0x9820C913, _klayman->getFrameIndex(), -1); - _newStickFrameIndex = _klayman->getFrameIndex(); +void AsScene1002KlaymenPeekHand::update() { + if (_klaymen->getCurrAnimFileHash() == 0xAC20C012 && _klaymen->getFrameIndex() < 50) { + startAnimation(0x9820C913, _klaymen->getFrameIndex(), -1); + _newStickFrameIndex = _klaymen->getFrameIndex(); setVisible(true); - _x = _klayman->getX(); - _y = _klayman->getY(); - setDoDeltaX(_klayman->isDoDeltaX() ? 1 : 0); + _x = _klaymen->getX(); + _y = _klaymen->getY(); + setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); } else setVisible(false); AnimatedSprite::update(); } -uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1002KlaymenPeekHand::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: @@ -1155,7 +1155,7 @@ uint32 AsScene1002KlaymanPeekHand::handleMessage(int messageNum, const MessagePa } Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isKlaymanFloor(false), _isClimbingLadder(false) { + : Scene(vm, parentModule), _isKlaymenFloor(false), _isClimbingLadder(false) { NRect tempClipRect; Sprite *tempSprite; @@ -1181,47 +1181,47 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) // Restoring game if (_vm->_gameState.which == 0) { // Klaymen on top - insertKlayman(90, 226); - _asKlaymanLadderHands = insertSprite(_klayman); + insertKlaymen(90, 226); + _asKlaymenLadderHands = insertSprite(_klaymen); setMessageList(0x004B4270); - _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); - _asKlaymanLadderHands->getSurface()->getClipRect() = _klayman->getSurface()->getClipRect(); - _klayman->setRepl(64, 0); + _klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); + _asKlaymenLadderHands->getSurface()->getClipRect() = _klaymen->getSurface()->getClipRect(); + _klaymen->setRepl(64, 0); } else { // Klaymen on the floor - insertKlayman(379, 435); - _asKlaymanLadderHands = insertSprite(_klayman); + insertKlaymen(379, 435); + _asKlaymenLadderHands = insertSprite(_klaymen); setMessageList(0x004B4270); - _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); } } else if (which == 1) { // Klaymen entering from the right - insertKlayman(650, 435); - _asKlaymanLadderHands = insertSprite(_klayman); + insertKlaymen(650, 435); + _asKlaymenLadderHands = insertSprite(_klaymen); setMessageList(0x004B4478); - _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); _vm->_gameState.which = 1; } else if (which == 2) { // Klaymen coming up the ladder - insertKlayman(68, 645); - _asKlaymanLadderHands = insertSprite(_klayman); + insertKlaymen(68, 645); + _asKlaymenLadderHands = insertSprite(_klaymen); setMessageList(0x004B4298); - _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); _vm->_gameState.which = 1; - sendMessage(_klayman, 0x4820, 0); + sendMessage(_klaymen, 0x4820, 0); } else { // Klaymen entering from the left, peeking - insertKlayman(90, 226); - _asKlaymanLadderHands = insertSprite(_klayman); + insertKlaymen(90, 226); + _asKlaymenLadderHands = insertSprite(_klaymen); setMessageList(0x004B4470); - _klayman->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); - _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); - _asKlaymanPeekHand = insertSprite(this, _klayman); - _asKlaymanPeekHand->setClipRect(_klayman->getClipRect()); - _klayman->setRepl(64, 0); + _klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + _asKlaymenPeekHand = insertSprite(this, _klaymen); + _asKlaymenPeekHand->setClipRect(_klaymen->getClipRect()); + _klaymen->setRepl(64, 0); _vm->_gameState.which = 0; } @@ -1241,10 +1241,10 @@ Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertSprite(); _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); _ssPressButton = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); - _asVenusFlyTrap = insertSprite(this, _klayman, false); + _asVenusFlyTrap = insertSprite(this, _klaymen, false); addCollisionSprite(_asVenusFlyTrap); - sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); + sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap); _asOutsideDoorBackground = insertSprite(); @@ -1260,12 +1260,12 @@ Scene1002::~Scene1002() { void Scene1002::update() { Scene::update(); - if (!_isKlaymanFloor && _klayman->getY() > 230) { - _klayman->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); + if (!_isKlaymenFloor && _klaymen->getY() > 230) { + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); deleteSprite(&_ssLadderArchPart3); - _klayman->clearRepl(); - _isKlaymanFloor = true; + _klaymen->clearRepl(); + _isKlaymenFloor = true; _vm->_gameState.which = 1; } } @@ -1282,14 +1282,14 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B4448); messageResult = 1; } else if (param.asInteger() == 0x4A845A00) - sendEntityMessage(_klayman, 0x1014, _asRing1); + sendEntityMessage(_klaymen, 0x1014, _asRing1); else if (param.asInteger() == 0x43807801) - sendEntityMessage(_klayman, 0x1014, _asRing2); + sendEntityMessage(_klaymen, 0x1014, _asRing2); else if (param.asInteger() == 0x46C26A01) { if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { setMessageList(0x004B44B8); } else { - sendEntityMessage(_klayman, 0x1014, _asRing3); + sendEntityMessage(_klaymen, 0x1014, _asRing3); if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) { setGlobalVar(V_FLYTRAP_RING_EATEN, 1); setMessageList(0x004B44A8); @@ -1299,11 +1299,11 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } messageResult = 1; } else if (param.asInteger() == 0x468C7B11) - sendEntityMessage(_klayman, 0x1014, _asRing4); + sendEntityMessage(_klaymen, 0x1014, _asRing4); else if (param.asInteger() == 0x42845B19) - sendEntityMessage(_klayman, 0x1014, _asRing5); + sendEntityMessage(_klaymen, 0x1014, _asRing5); else if (param.asInteger() == 0xC0A07458) - sendEntityMessage(_klayman, 0x1014, _ssPressButton); + sendEntityMessage(_klaymen, 0x1014, _ssPressButton); break; case 0x1024: sendMessage(_parentModule, 0x1024, param.asInteger()); @@ -1312,10 +1312,10 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_isClimbingLadder) { setMessageList2(0x004B43D0); } else { - if (_klayman->getY() > 420) { - sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap); + if (_klaymen->getY() > 420) { + sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap); setMessageList2(0x004B4480); - } else if (_klayman->getY() > 227) { + } else if (_klaymen->getY() > 227) { setMessageList2(0x004B41E0); } else { setMessageList2(0x004B4148); @@ -1365,7 +1365,7 @@ uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x480B: - sendEntityMessage(_klayman, 0x1014, _asDoorSpy); + sendEntityMessage(_klaymen, 0x1014, _asDoorSpy); break; case 0x480F: setGlobalVar(V_RADIO_ENABLED, 0); @@ -1464,31 +1464,31 @@ Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game setRectList(0x004B7C70); - insertKlayman(330, 327); + insertKlaymen(330, 327); setMessageList(0x004B7C18); } else if (which == 1) { // Klaymen returning from reading a note setRectList(0x004B7C70); - insertKlayman(330, 327); + insertKlaymen(330, 327); setMessageList(0x004B7C08); } else { // Klaymen coming down the ladder loadDataResource(0x01900A04); - insertKlayman(_dataResource.getPoint(0x80052A29).x, 27); + insertKlaymen(_dataResource.getPoint(0x80052A29).x, 27); setMessageList(0x004B7BF0); } updatePaletteArea(); - _asKlaymanLadderHands = insertSprite(_klayman); + _asKlaymenLadderHands = insertSprite(_klaymen); insertStaticSprite(0x800034A0, 1100); insertStaticSprite(0x64402020, 1100); insertStaticSprite(0x3060222E, 1300); tempSprite = insertStaticSprite(0x0E002004, 1300); - _klayman->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); - _asKlaymanLadderHands->setClipRect(_klayman->getClipRect()); + _klaymen->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); _asTrashCan = insertSprite(); @@ -1523,7 +1523,7 @@ uint32 Scene1004::handleMessage(int messageNum, const MessageParam ¶m, Entit } void Scene1004::updatePaletteArea() { - if (_klayman->getY() < 150) { + if (_klaymen->getY() < 150) { if (_paletteAreaStatus != 0) { _paletteAreaStatus = 0; _palette->addBasePalette(0x406B0D10, 0, 64, 0); diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h index 2cc9a556dd..897d026470 100644 --- a/engines/neverhood/module1000.h +++ b/engines/neverhood/module1000.h @@ -175,10 +175,10 @@ protected: class AsScene1002VenusFlyTrap : public AnimatedSprite { public: - AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, bool isSecond); + AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond); protected: Scene *_parentScene; - Sprite *_klayman; + Sprite *_klaymen; int _countdown; bool _isSecond; void update(); @@ -191,11 +191,11 @@ protected: void stRelease(); void stGrabRing(); void stRingGrabbed(); - void stKlaymanInside(); + void stKlaymenInside(); void stIdle(); - void stKlaymanInsideMoving(); - void stSpitOutKlayman(); - void swallowKlayman(); + void stKlaymenInsideMoving(); + void stSpitOutKlaymen(); + void swallowKlaymen(); }; class AsScene1002OutsideDoorBackground : public AnimatedSprite { @@ -212,20 +212,20 @@ protected: void stDoorClosed(); }; -class AsScene1002KlaymanLadderHands : public AnimatedSprite { +class AsScene1002KlaymenLadderHands : public AnimatedSprite { public: - AsScene1002KlaymanLadderHands(NeverhoodEngine *vm, Klayman *klayman); + AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen); protected: - Klayman *_klayman; + Klaymen *_klaymen; void update(); }; -class AsScene1002KlaymanPeekHand : public AnimatedSprite { +class AsScene1002KlaymenPeekHand : public AnimatedSprite { public: - AsScene1002KlaymanPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klayman *klayman); + AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen); protected: Scene *_parentScene; - Klayman *_klayman; + Klaymen *_klaymen; bool _isClipRectSaved; NRect _savedClipRect; void update(); @@ -250,11 +250,11 @@ protected: Sprite *_ssLadderArchPart2; Sprite *_ssLadderArchPart3; Sprite *_ssCeiling; - Sprite *_asKlaymanLadderHands; - Sprite *_asKlaymanPeekHand; + Sprite *_asKlaymenLadderHands; + Sprite *_asKlaymenPeekHand; Sprite *_asOutsideDoorBackground; Sprite *_ssPressButton; - bool _isKlaymanFloor; + bool _isKlaymenFloor; bool _isClimbingLadder; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -273,7 +273,7 @@ class Scene1004 : public Scene { public: Scene1004(NeverhoodEngine *vm, Module *parentModule, int which); protected: - Sprite *_asKlaymanLadderHands; + Sprite *_asKlaymenLadderHands; Sprite *_asTrashCan; int _paletteAreaStatus; void update(); diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp index 2ee389703c..067018dea0 100644 --- a/engines/neverhood/module1100.cpp +++ b/engines/neverhood/module1100.cpp @@ -656,35 +656,35 @@ Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(140, 436); + insertKlaymen(140, 436); setMessageList(0x004B6260); sendMessage(this, 0x2000, 0); } else if (which == 1) { // Klaymen teleporting in - insertKlayman(450, 436); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(450, 436); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B6268, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { // Klaymen teleporting out - insertKlayman(450, 436); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(450, 436); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B6318, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { // Klaymen returning from teleporter console - insertKlayman(450, 436); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(450, 436); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B6278, false); sendMessage(this, 0x2000, 1); } else { // Klaymen entering from the left - insertKlayman(0, 436); + insertKlaymen(0, 436); setMessageList(0x004B6258); sendMessage(this, 0x2000, 0); } - _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); } @@ -694,10 +694,10 @@ uint32 Scene1109::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004B63A8); - _klayman->setKlaymanIdleTable3(); + _klaymen->setKlaymenIdleTable3(); } else { setRectList(0x004B6398); - _klayman->setKlaymanIdleTable1(); + _klaymen->setKlaymenIdleTable1(); } break; } diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp index 844d07f771..1536114df8 100644 --- a/engines/neverhood/module1200.cpp +++ b/engines/neverhood/module1200.cpp @@ -196,8 +196,8 @@ uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam & return messageResult; } -AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen) - : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0) { +AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0) { createSurface1(0xD088AC30, 100); _x = 320; @@ -254,17 +254,17 @@ void AsScene1201RightDoor::stCloseDoorDone() { setVisible(false); } -AsScene1201KlaymanHead::AsScene1201KlaymanHead(NeverhoodEngine *vm) +AsScene1201KlaymenHead::AsScene1201KlaymenHead(NeverhoodEngine *vm) : AnimatedSprite(vm, 1200) { createSurface(1200, 69, 98); SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1201KlaymanHead::handleMessage); + SetMessageHandler(&AsScene1201KlaymenHead::handleMessage); SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); setVisible(false); } -uint32 AsScene1201KlaymanHead::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201KlaymenHead::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2006: @@ -514,8 +514,8 @@ void AsScene1201Match::stIdleOnFloor() { _newStickFrameIndex = 0; } -AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _klayman(klayman), _klaymanTooClose(false) { +AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _klaymen(klaymen), _klaymenTooClose(false) { // NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed @@ -528,9 +528,9 @@ AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene } void AsScene1201Creature::update() { - bool oldKlaymanTooClose = _klaymanTooClose; - _klaymanTooClose = _klayman->getX() >= 385; - if (_klaymanTooClose != oldKlaymanTooClose) + bool oldKlaymenTooClose = _klaymenTooClose; + _klaymenTooClose = _klaymen->getX() >= 385; + if (_klaymenTooClose != oldKlaymenTooClose) stWaiting(); if (_countdown != 0 && (--_countdown == 0)) gotoNextState(); @@ -550,7 +550,7 @@ uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam ¶m, GotoState(&AsScene1201Creature::stStartReachForTntDummy); break; case 0x2006: - GotoState(&AsScene1201Creature::stPincerSnapKlayman); + GotoState(&AsScene1201Creature::stPincerSnapKlaymen); break; } return messageResult; @@ -566,14 +566,14 @@ uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam &par return messageResult; } -uint32 AsScene1201Creature::hmPincerSnapKlayman(int messageNum, const MessageParam ¶m, Entity *sender) { +uint32 AsScene1201Creature::hmPincerSnapKlaymen(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02060018) { playSound(0, 0xCD298116); sendMessage(_parentScene, 0x4814, 0); - sendMessage(_klayman, 0x4814, 0); + sendMessage(_klaymen, 0x4814, 0); } break; case 0x3002: @@ -591,7 +591,7 @@ void AsScene1201Creature::stWaiting() { } void AsScene1201Creature::stPincerSnap() { - if (!_klaymanTooClose) { + if (!_klaymenTooClose) { startAnimation(0xCA287133, 0, -1); SetMessageHandler(&AsScene1201Creature::hmPincerSnap); NextState(&AsScene1201Creature::stWaiting); @@ -611,20 +611,20 @@ void AsScene1201Creature::stReachForTntDummy() { _countdown = 0; } -void AsScene1201Creature::stPincerSnapKlayman() { +void AsScene1201Creature::stPincerSnapKlaymen() { startAnimation(0xCA287133, 0, -1); - SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlayman); + SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlaymen); NextState(&AsScene1201Creature::stWaiting); _countdown = 0; } -AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman) - : AnimatedSprite(vm, 1100), _klayman(klayman) { +AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen) { _x = 320; _y = 240; createSurface(800, 55, 199); - if (_klayman->getX() < 100) { + if (_klaymen->getX() < 100) { startAnimation(0x508A111B, 0, -1); _newStickFrameIndex = STICK_LAST_FRAME; playSound(0, calcHash("fxDoorOpen03")); @@ -699,42 +699,42 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0xA29223FA, 1200); x2 = tempSprite->getX() + tempSprite->getDrawRect().width; - _asKlaymanHead = insertSprite(); + _asKlaymenHead = insertSprite(); if (which < 0) { // Restoring game - insertKlayman(364, 333); + insertKlaymen(364, 333); setMessageList(0x004AEC08); } else if (which == 3) { // Klaymen standing after the weasel exploded - insertKlayman(400, 329); + insertKlaymen(400, 329); setMessageList(0x004AEC08); } else if (which == 2) { // Klaymen entering from the right if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { - insertKlayman(374, 333); + insertKlaymen(374, 333); setMessageList(0x004AEC08); } else { - insertKlayman(640, 329); + insertKlaymen(640, 329); setMessageList(0x004AEC20); } } else if (which == 1) { // Klaymen returning from the TNT console - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(364, 333); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(364, 333); + _klaymen->setDoDeltaX(1); } else { - insertKlayman(246, 333); + insertKlaymen(246, 333); } setMessageList(0x004AEC30); } else { // Klaymen entering from the left - insertKlayman(0, 336); + insertKlaymen(0, 336); setMessageList(0x004AEC10); } - _klayman->setClipRect(x1, 0, x2, 480); - _klayman->setRepl(64, 0); + _klaymen->setClipRect(x1, 0, x2, 480); + _klaymen->setRepl(64, 0); if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { setBackground(0x4019A2C4); @@ -743,7 +743,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } else { setBackground(0x40206EC5); setPalette(0x40206EC5); - _asRightDoor = insertSprite(_klayman, which == 2); + _asRightDoor = insertSprite(_klaymen, which == 2); } if (getGlobalVar(V_TNT_DUMMY_BUILT)) { @@ -816,7 +816,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) tempSprite = insertStaticSprite(0x63D400BC, 900); - _asLeftDoor = insertSprite(_klayman); + _asLeftDoor = insertSprite(_klaymen); _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) @@ -830,7 +830,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) } if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { - _asCreature = insertSprite(this, _klayman); + _asCreature = insertSprite(this, _klaymen); _asCreature->setClipRect(x1, 0, x2, 480); } @@ -839,7 +839,7 @@ Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) Scene1201::~Scene1201() { if (_creatureExploded) setGlobalVar(V_CREATURE_EXPLODED, 1); - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } void Scene1201::update() { @@ -861,7 +861,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit _canAcceptInput = false; sendMessage(_asCreature, 0x2006, 0); } else if (param.asInteger() == 0x090EB048) { - if (_klayman->getX() < 572) + if (_klaymen->getX() < 572) setMessageList2(0x004AEC90); else setMessageList2(0x004AEC20); @@ -871,19 +871,19 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit if (getGlobalVar(V_MATCH_STATUS) == 0) setMessageList2(0x004AECB0); else { - sendEntityMessage(_klayman, 0x1014, _asMatch); + sendEntityMessage(_klaymen, 0x1014, _asMatch); setMessageList2(0x004AECC0); } break; case 0x2002: if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { // Move the TNT dummy if the fuse is burning - sendEntityMessage(_klayman, 0x1014, _asTntMan); + sendEntityMessage(_klaymen, 0x1014, _asTntMan); setMessageList2(0x004AECF0, false); } else if (getGlobalVar(V_MATCH_STATUS) == 3) { // Light the TNT dummy if we have the match - sendEntityMessage(_klayman, 0x1014, _asTntMan); - if (_klayman->getX() > _asTntMan->getX()) + sendEntityMessage(_klaymen, 0x1014, _asTntMan); + if (_klaymen->getX() > _asTntMan->getX()) setMessageList(0x004AECD0); else setMessageList(0x004AECE0); @@ -894,7 +894,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004AED38); } break; @@ -902,7 +902,7 @@ uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entit sendMessage(_asRightDoor, 0x4829, 0); break; case 0x8000: - sendMessage(_asKlaymanHead, 0x2006, 0); + sendMessage(_asKlaymenHead, 0x2006, 0); break; } return messageResult; diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h index 1fe607d308..f6f97b4131 100644 --- a/engines/neverhood/module1200.h +++ b/engines/neverhood/module1200.h @@ -61,9 +61,9 @@ protected: class AsScene1201RightDoor : public AnimatedSprite { public: - AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen); + AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen); protected: - Sprite *_klayman; + Sprite *_klaymen; int _countdown; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -72,9 +72,9 @@ protected: void stCloseDoorDone(); }; -class AsScene1201KlaymanHead : public AnimatedSprite { +class AsScene1201KlaymenHead : public AnimatedSprite { public: - AsScene1201KlaymanHead(NeverhoodEngine *vm); + AsScene1201KlaymenHead(NeverhoodEngine *vm); protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -126,28 +126,28 @@ protected: class AsScene1201Creature : public AnimatedSprite { public: - AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman); + AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen); protected: Scene *_parentScene; - Sprite *_klayman; + Sprite *_klaymen; int _countdown; - bool _klaymanTooClose; + bool _klaymenTooClose; void update(); uint32 hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPincerSnapKlayman(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPincerSnapKlaymen(int messageNum, const MessageParam ¶m, Entity *sender); void stWaiting(); void stPincerSnap(); void stStartReachForTntDummy(); void stReachForTntDummy(); - void stPincerSnapKlayman(); + void stPincerSnapKlaymen(); }; class AsScene1201LeftDoor : public AnimatedSprite { public: - AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klayman); + AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen); protected: - Sprite *_klayman; + Sprite *_klaymen; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void stCloseDoor(); }; @@ -171,7 +171,7 @@ protected: Sprite *_asLeftDoor; Sprite *_asRightDoor; Sprite *_asTape; - Sprite *_asKlaymanHead; + Sprite *_asKlaymenHead; bool _creatureExploded; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 690ca7cea3..94937c4c7f 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -445,20 +445,20 @@ Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(380, 364); + insertKlaymen(380, 364); setMessageList(0x004B0868); } else { // Klaymen entering from back - insertKlayman(293, 330); + insertKlaymen(293, 330); setMessageList(0x004B0870); } - _klayman->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); - _asVenusFlyTrap = insertSprite(this, _klayman, true); + _asVenusFlyTrap = insertSprite(this, _klaymen, true); addCollisionSprite(_asVenusFlyTrap); - sendEntityMessage(_klayman, 0x2007, _asVenusFlyTrap); + sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap); } @@ -468,10 +468,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x4A845A00) - sendEntityMessage(_klayman, 0x1014, _asRing1); + sendEntityMessage(_klaymen, 0x1014, _asRing1); else if (param.asInteger() == 0x43807801) { if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { - sendEntityMessage(_klayman, 0x1014, _asRing2); + sendEntityMessage(_klaymen, 0x1014, _asRing2); if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) setMessageList(0x004B0940); else @@ -480,10 +480,10 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B0950); messageResult = 1; } else if (param.asInteger() == 0x46C26A01) - sendEntityMessage(_klayman, 0x1014, _asRing3); + sendEntityMessage(_klaymen, 0x1014, _asRing3); else if (param.asInteger() == 0x468C7B11) { if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) { - sendEntityMessage(_klayman, 0x1014, _asRing4); + sendEntityMessage(_klaymen, 0x1014, _asRing4); if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) setMessageList(0x004B0940); else @@ -492,7 +492,7 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList(0x004B0950); messageResult = 1; } else if (param.asInteger() == 0x42845B19) - sendEntityMessage(_klayman, 0x1014, _asRing5); + sendEntityMessage(_klaymen, 0x1014, _asRing5); else if (param.asInteger() == 0x430A6060) { if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) setMessageList2(0x004B0910); @@ -511,14 +511,14 @@ uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x2000: - if (_klayman->getY() > 360) { - sendEntityMessage(_klayman, 0x1014, _asVenusFlyTrap); + if (_klaymen->getY() > 360) { + sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap); setMessageList2(0x004B08F0); } else setMessageList2(0x004B0920); break; case 0x2002: - if (_klayman->getX() > 545) + if (_klaymen->getX() > 545) leaveScene(1); break; case 0x2032: @@ -646,10 +646,10 @@ Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) _sprite1 = insertStaticSprite(0xA014216B, 1100); - insertKlayman(207, 332); + insertKlaymen(207, 332); setMessageList(0x004AF9A0); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } @@ -671,7 +671,7 @@ uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entit AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { - // NOTE: Skipped check if Klayman already has the needle since that's done in the scene itself + // NOTE: Skipped check if Klaymen already has the needle since that's done in the scene itself SetMessageHandler(&AsScene1304Needle::handleMessage); } @@ -719,15 +719,15 @@ Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(217, 347); + insertKlaymen(217, 347); setMessageList(0x004B90E8); } else { // Klaymen entering from the left - insertKlayman(100, 347); + insertKlaymen(100, 347); setMessageList(0x004B90F0); } - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } @@ -744,10 +744,10 @@ uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asNeedle) { - sendEntityMessage(_klayman, 0x1014, _asNeedle); + sendEntityMessage(_klaymen, 0x1014, _asNeedle); setMessageList(0x004B9130); } else if (sender == _asKey) { - sendEntityMessage(_klayman, 0x1014, _asKey); + sendEntityMessage(_klaymen, 0x1014, _asKey); setMessageList(0x004B9140); } break; @@ -767,11 +767,11 @@ Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(212, 441); + insertKlaymen(212, 441); setMessageList(0x004B6E40); } else { // Klaymen enters falling - insertKlayman(212, 441); + insertKlaymen(212, 441); setMessageList(0x004B6E48); } @@ -894,51 +894,51 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Resoring game - insertKlayman(380, 440); + insertKlaymen(380, 440); setMessageList(0x004AFAD0); sendMessage(this, 0x2000, 0); addCollisionSprite(_asTape); } else if (which == 1) { // Klaymen teleporting in - insertKlayman(136, 440); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(136, 440); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004AFAF0); sendMessage(this, 0x2000, 1); addCollisionSprite(_asTape); } else if (which == 2) { // Klaymen returning from diskplayer - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(515, 440); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(515, 440); + _klaymen->setDoDeltaX(1); } else { - insertKlayman(355, 440); + insertKlaymen(355, 440); } setMessageList(0x004AFBC8); sendMessage(this, 0x2000, 0); addCollisionSprite(_asTape); } else if (which == 3) { // Klaymen returning from window - insertKlayman(534, 440); + insertKlaymen(534, 440); setMessageList(0x004AFC30); sendMessage(this, 0x2000, 0); addCollisionSprite(_asTape); } else if (which == 4) { // Klaymen teleporting out - insertKlayman(136, 440); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(136, 440); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004AFC38); sendMessage(this, 0x2000, 1); addCollisionSprite(_asTape); } else if (which == 5) { // Klaymen returning from teleporter - insertKlayman(136, 440); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(136, 440); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004AFB00); sendMessage(this, 0x2000, 1); addCollisionSprite(_asTape); } else { // Klaymen coming up in elevator - insertKlayman(286, 408); + insertKlaymen(286, 408); setSurfacePriority(_asElevator->getSurface(), 1100); setSurfacePriority(_asElevatorDoor->getSurface(), 1090); setSurfacePriority(_sprite1->getSurface(), 1080); @@ -951,7 +951,7 @@ Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1306::~Scene1306() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -959,7 +959,7 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x01C66840) { if (sendMessage(_asElevator, 0x2001, 0) != 0) setMessageList(0x004AFBD8); @@ -974,10 +974,10 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger() != 0) { setRectList(0x004AFD28); - _klayman->setKlaymanIdleTable3(); + _klaymen->setKlaymenIdleTable3(); } else { setRectList(0x004AFD18); - _klayman->setKlaymanIdleTable1(); + _klaymen->setKlaymenIdleTable1(); } break; case 0x480B: @@ -986,13 +986,13 @@ uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asKey) { - if (_klayman->getX() >= 249) { - sendEntityMessage(_klayman, 0x1014, _asKey); + if (_klaymen->getX() >= 249) { + sendEntityMessage(_klaymen, 0x1014, _asKey); setMessageList(0x004AFC58); } } else if (sender == _asTape) { - if (_klayman->getX() >= 249) { - sendEntityMessage(_klayman, 0x1014, _asTape); + if (_klaymen->getX() >= 249) { + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004AFC68); } } @@ -1549,7 +1549,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(380, 440); + insertKlaymen(380, 440); setMessageList(0x004B57C0); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1560,7 +1560,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 440); + insertKlaymen(640, 440); setMessageList(0x004B57C8); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); @@ -1571,7 +1571,7 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } } else if (which == 2) { // Klaymen returning from keyslots panel - insertKlayman(475, 440); + insertKlaymen(475, 440); setMessageList(0x004B58B0); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite5 = insertSprite(this); @@ -1583,26 +1583,26 @@ Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) } } else { // Klaymen entering from the left - insertKlayman(41, 440); + insertKlaymen(41, 440); setMessageList(0x004B57D0); sendMessage(_asJaggyDoor, 0x4808, 0); _sprite1->setVisible(false); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { _sprite4 = insertStaticSprite(0x0101A624, 1100); - _klayman->setVisible(false); + _klaymen->setVisible(false); } else { _sprite5 = insertStaticSprite(0x080811A0, 100); - _klayman->setVisible(false); + _klaymen->setVisible(false); } } if (_sprite4) - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480); else - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { - _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); addCollisionSprite(_asProjector); _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); _asProjector->setRepl(64, 0); @@ -1618,7 +1618,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B59A0); _isProjecting = true; } else if (param.asInteger() == 0x08821382) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + sendEntityMessage(_klaymen, 0x1014, _asProjector); if (getGlobalVar(V_KEYDOOR_UNLOCKED)) setRectList(0x004B5990); else @@ -1628,7 +1628,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit clearRectList(); sendMessage(_asJaggyDoor, 0x4809, 0); _sprite1->setVisible(false); - _klayman->setVisible(false); + _klaymen->setVisible(false); } break; case 0x1022: @@ -1646,7 +1646,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B5980); setMessageList(0x004B57E8, false); _sprite1->setVisible(true); - _klayman->setVisible(true); + _klaymen->setVisible(true); break; case 0x2001: leaveScene(0); @@ -1675,10 +1675,10 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit setMessageList2(0x004B5868); else { if (param.asInteger() == 1) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B5848); - } else if (sendMessage(_asProjector, 0x480C, _klayman->getX() <= _asProjector->getX() ? 0 : 1) != 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + } else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() <= _asProjector->getX() ? 0 : 1) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B5830); } else setMessageList2(0x004B5800); @@ -1687,7 +1687,7 @@ uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_isProjecting) setMessageList2(0x004B5868); else if (_messageListStatus != 2) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList2(0x004B58E0); } } @@ -1716,18 +1716,18 @@ void Scene1317::update() { } void Scene1317::upChooseKing() { - if (!_klaymanBlinks && _klaymanBlinkCountdown != 0 && (--_klaymanBlinkCountdown == 0)) - _klaymanBlinks = true; + if (!_klaymenBlinks && _klaymenBlinkCountdown != 0 && (--_klaymenBlinkCountdown == 0)) + _klaymenBlinks = true; - if (!_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) { + if (!_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) { _smackerPlayer->rewind(); - } else if (_klaymanBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) { + } else if (_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) { _smackerPlayer->rewind(); - _klaymanBlinks = false; - _klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; + _klaymenBlinks = false; + _klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; } - if (!_klaymanBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0)) + if (!_klaymenBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0)) stNoDecisionYet(); if (_smackerFileHash) { @@ -1758,10 +1758,10 @@ uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam ¶m, Entity stHoborgAsKing(); } else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 && param.asPoint().x <= 399 && param.asPoint().y <= 379) { - stKlaymanAsKing(); + stKlaymenAsKing(); } else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 && param.asPoint().x <= 418 && param.asPoint().y <= 474) { - stKlaymanAsKing(); + stKlaymenAsKing(); } break; } @@ -1793,8 +1793,8 @@ void Scene1317::stChooseKing() { _smackerFileHash = 0x10982841; _keepLastSmackerFrame = true; _decisionCountdown = 450; - _klaymanBlinks = false; - _klaymanBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; + _klaymenBlinks = false; + _klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; SetMessageHandler(&Scene1317::hmChooseKing); SetUpdateHandler(&Scene1317::upChooseKing); } @@ -1815,7 +1815,7 @@ void Scene1317::stHoborgAsKing() { SetUpdateHandler(&Scene1317::update); } -void Scene1317::stKlaymanAsKing() { +void Scene1317::stKlaymenAsKing() { showMouse(false); _smackerFileHash = 0x80982841; _keepLastSmackerFrame = false; diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h index ebbd03184e..147bfd0645 100644 --- a/engines/neverhood/module1300.h +++ b/engines/neverhood/module1300.h @@ -272,8 +272,8 @@ public: Scene1317(NeverhoodEngine *vm, Module *parentModule); protected: SmackerPlayer *_smackerPlayer; - bool _klaymanBlinks; - int _klaymanBlinkCountdown; + bool _klaymenBlinks; + int _klaymenBlinkCountdown; int _decisionCountdown; uint32 _smackerFileHash; bool _keepLastSmackerFrame; @@ -286,7 +286,7 @@ protected: void stChooseKing(); void stNoDecisionYet(); void stHoborgAsKing(); - void stKlaymanAsKing(); + void stKlaymenAsKing(); void stEndMovie(); }; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index 5febe8f08d..d96703b6f2 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -301,8 +301,8 @@ void AsScene1401Cheese::stSuckedIn() { SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn); } -AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen) - : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown(0), _isOpen(isOpen) { +AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0), _isOpen(isOpen) { _x = 320; _y = 240; @@ -376,8 +376,8 @@ static const AsCommonProjectorItem kAsCommonProjectorItems[] = { {{262, 433}, 1, 1, 0, 0, 0} }; -AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klayman(klayman), _asPipe(asPipe) { +AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _asPipe(asPipe) { _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)]; createSurface(990, 101, 182); @@ -493,10 +493,10 @@ uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam ¶m, } void AsCommonProjector::suMoving() { - if (_x <= _klayman->getX()) - _x = _klayman->getX() - 100; + if (_x <= _klaymen->getX()) + _x = _klaymen->getX() - 100; else - _x = _klayman->getX() + 100; + _x = _klaymen->getX() + 100; moveProjector(); if (_beforeMoveX == _x) { if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) { @@ -656,49 +656,49 @@ Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(380, 447); + insertKlaymen(380, 447); setMessageList(0x004B65C8); _sprite1->setVisible(false); } else if (which == 1) { // Klaymen entering from the left - insertKlayman(0, 447); + insertKlaymen(0, 447); setMessageList(0x004B65D0); _sprite1->setVisible(false); } else if (which == 2) { // Klaymen entering from the right - insertKlayman(660, 447); + insertKlaymen(660, 447); setMessageList(0x004B65D8); _sprite1->setVisible(false); } else { // Klaymen entering from the back - insertKlayman(290, 413); + insertKlaymen(290, 413); setMessageList(0x004B65E8); _sprite1->setVisible(false); } if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) { - _asProjector = insertSprite(this, _klayman, _asPipe); + _asProjector = insertSprite(this, _klaymen, _asPipe); addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { - sendEntityMessage(_klayman, 0x1014, _asProjector); - _klayman->setX(_asProjector->getX() + 100); - _klayman->updateBounds(); + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() + 100); + _klaymen->updateBounds(); setMessageList(0x004B6670); } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); - _klayman->setX(_asProjector->getX() - 100); - _klayman->updateBounds(); + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() - 100); + _klaymen->updateBounds(); setMessageList(0x004B6670); } _asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); } - _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); if (which == 0 && _asProjector) sendMessage(_asProjector, 0x482B, 0); - _asBackDoor = insertSprite(_klayman, which == 0); + _asBackDoor = insertSprite(_klaymen, which == 0); } @@ -716,9 +716,9 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02144CB1) - sendEntityMessage(_klayman, 0x1014, _ssFloorButton); + sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x01C66840) { if (sendMessage(_asBackDoor, 0x2001, 0) != 0) setMessageList(0x004B6690); @@ -747,8 +747,8 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B6658); } else setMessageList2(0x004B65F0); @@ -863,19 +863,19 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(377, 391); + insertKlaymen(377, 391); setMessageList(0x004B0B48); if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) _asPuzzleBox = insertSprite(this, 0); } else if (which == 1) { // Klaymen entering from the left - insertKlayman(42, 391); + insertKlaymen(42, 391); setMessageList(0x004B0B50); } else if (which == 2) { // Klaymen returning from the puzzle box - insertKlayman(377, 391); + insertKlaymen(377, 391); setMessageList(0x004B0B60); - _klayman->setDoDeltaX(1); + _klaymen->setDoDeltaX(1); if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { _asPuzzleBox = insertSprite(this, 1); clearRectList(); @@ -885,7 +885,7 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _asPuzzleBox = insertSprite(this, 0); } else { // Klaymen entering from the right - insertKlayman(513, 391); + insertKlaymen(513, 391); setMessageList(0x004B0B58); if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { _asPuzzleBox = insertSprite(this, 2); @@ -897,23 +897,23 @@ Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) { - _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { - sendEntityMessage(_klayman, 0x1014, _asProjector); - _klayman->setX(_asProjector->getX() + 100); - _klayman->updateBounds(); + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() + 100); + _klaymen->updateBounds(); setMessageList(0x004B0BD0); } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); - _klayman->setX(_asProjector->getX() - 100); - _klayman->updateBounds(); + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() - 100); + _klaymen->updateBounds(); setMessageList(0x004B0BD0); } _asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2()); } - _klayman->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); + _klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); } @@ -929,7 +929,7 @@ void Scene1402::upShaking() { Scene::update(); if (_asPuzzleBox) _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); - _klayman->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); + _klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); } uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -941,7 +941,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit leaveScene(0); else { clearRectList(); - _klayman->setVisible(false); + _klaymen->setVisible(false); showMouse(false); sendMessage(_asPuzzleBox, 0x2002, 0); startShaking(); @@ -968,8 +968,8 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x408C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + if (sendMessage(_asProjector, 0x408C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B0BB8); } else setMessageList2(0x004B0B68); @@ -1300,22 +1300,22 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(380, 463); + insertKlaymen(380, 463); setMessageList(0x004B1F18); } else { // Klaymen entering from the right - insertKlayman(640, 463); + insertKlaymen(640, 463); setMessageList(0x004B1F20); } - _klayman->setRepl(64, 0); + _klaymen->setRepl(64, 0); if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { - _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { - sendEntityMessage(_klayman, 0x1014, _asProjector); - _klayman->setX(_asProjector->getX() + 100); - _klayman->updateBounds(); + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() + 100); + _klaymen->updateBounds(); setMessageList(0x004B1F70); } _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); @@ -1332,7 +1332,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit setRectList(0x004B2008); _isProjecting = true; } else if (param.asInteger() == 0x08821382) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + sendEntityMessage(_klaymen, 0x1014, _asProjector); setRectList(0x004B1FF8); _isProjecting = false; } @@ -1359,10 +1359,10 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_isProjecting) setMessageList2(0x004B1FA8); else if (param.asInteger() == 1) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B1F88); - } else if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + } else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B1F58); } else setMessageList2(0x004B1F28); @@ -1370,7 +1370,7 @@ uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_isProjecting) setMessageList2(0x004B1FA8); else if (_messageListStatus != 2) { - sendEntityMessage(_klayman, 0x1014, sender); + sendEntityMessage(_klaymen, 0x1014, sender); setMessageList2(0x004B1FB8); } } @@ -1406,45 +1406,45 @@ Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(376, 406); + insertKlaymen(376, 406); setMessageList(0x004B8C28); } else if (which == 1) { // Klaymen returning from the tiles puzzle - insertKlayman(376, 406); + insertKlaymen(376, 406); setMessageList(0x004B8C30); } else if (which == 2) { // Klaymen returning from the diskplayer - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(347, 406); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(347, 406); + _klaymen->setDoDeltaX(1); } else { - insertKlayman(187, 406); + insertKlaymen(187, 406); } setMessageList(0x004B8D28); } else { // Klaymen entering from the left - insertKlayman(30, 406); + insertKlaymen(30, 406); setMessageList(0x004B8C38); } if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) { - _asProjector = insertSprite(this, _klayman, (Sprite*)NULL); + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); - _klayman->setX(_asProjector->getX() - 100); - _klayman->updateBounds(); + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() - 100); + _klaymen->updateBounds(); setMessageList(0x004B8CB8); } _asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); } Scene1404::~Scene1404() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1463,16 +1463,16 @@ uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x480C, _klayman->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klayman, 0x1014, _asProjector); + if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B8CA0); } else setMessageList2(0x004B8C40); } else if (sender == _asTape && _messageListStatus != 2) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B8CD0); } else if (sender == _asKey && _messageListStatus != 2) { - sendEntityMessage(_klayman, 0x1014, _asKey); + sendEntityMessage(_klaymen, 0x1014, _asKey); setMessageList(0x004B8D18); } break; diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h index ada3c66009..14857062c1 100644 --- a/engines/neverhood/module1400.h +++ b/engines/neverhood/module1400.h @@ -78,9 +78,9 @@ protected: class AsScene1401BackDoor : public AnimatedSprite { public: - AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klayman, bool isOpen); + AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen); protected: - Sprite *_klayman; + Sprite *_klaymen; int _countdown; bool _isOpen; void update(); @@ -101,11 +101,11 @@ struct AsCommonProjectorItem { class AsCommonProjector : public AnimatedSprite { public: - AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klayman, Sprite *asPipe); + AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe); virtual ~AsCommonProjector(); protected: Scene *_parentScene; - Sprite *_klayman; + Sprite *_klaymen; Sprite *_asPipe; const AsCommonProjectorItem *_asProjectorItem; int16 _beforeMoveX; diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index 54f715a0c5..bb6874ee03 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -1024,16 +1024,16 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) else { // Klaymen is standing around setRectList(0x004B47D0); - insertKlayman(380, 438); - _kmScene1608 = _klayman; - _klaymanInCar = false; + insertKlaymen(380, 438); + _kmScene1608 = _klaymen; + _klaymenInCar = false; _sprite1 = insertStaticSprite(0x7D0404E8, 1100); setMessageList(0x004B46A8); setBackground(0x10080E01); setPalette(0x10080E01); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); addCollisionSprite(_asTape); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); insertScreenMouse(0x80E05108); insertStaticSprite(0x4B18F868, 1200); @@ -1042,9 +1042,9 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) // Klaymen entering from the left _vm->gameState().which = 0; setRectList(0x004B47D0); - insertKlayman(0, 438); - _kmScene1608 = _klayman; - _klaymanInCar = false; + insertKlaymen(0, 438); + _kmScene1608 = _klaymen; + _klaymenInCar = false; setMessageList(0x004B46B0); setBackground(0x10080E01); setPalette(0x10080E01); @@ -1052,7 +1052,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) addCollisionSprite(_asTape); insertScreenMouse(0x80E05108); _sprite1 = insertStaticSprite(0x7D0404E8, 1100); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); SetUpdateHandler(&Scene1608::upLowerFloor); insertStaticSprite(0x4B18F868, 1200); } else if (which == 2) { @@ -1069,12 +1069,12 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asIdleCarLower = insertSprite(375, 227); _asIdleCarFull = insertSprite(375, 227); _asCar->setVisible(false); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(373, 220); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(373, 220); + _klaymen->setDoDeltaX(1); } else - insertKlayman(283, 220); - _kmScene1608 = _klayman; + insertKlaymen(283, 220); + _kmScene1608 = _klaymen; setMessageList(0x004B47A8); SetMessageHandler(&Scene1608::hmUpperFloor); SetUpdateHandler(&Scene1608::upUpperFloor); @@ -1085,14 +1085,14 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); _clipRect2 = _clipRect1; _clipRect2.y2 = 215; - _klayman->setClipRect(_clipRect1); + _klaymen->setClipRect(_clipRect1); _asCar->setClipRect(_clipRect1); _asIdleCarLower->setClipRect(_clipRect1); _asIdleCarFull->setClipRect(_clipRect1); _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); addCollisionSprite(_asTape); insertSprite(_asCar)->setClipRect(_clipRect1); - _klaymanInCar = false; + _klaymenInCar = false; _carClipFlag = false; _carStatus = 0; setRectList(0x004B4810); @@ -1134,7 +1134,7 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); // ... addCollisionSprite(_asTape); insertSprite(_asCar)->setClipRect(_clipRect1); - _klaymanInCar = true; + _klaymenInCar = true; _carClipFlag = true; _carStatus = 0; } @@ -1144,8 +1144,8 @@ Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) } Scene1608::~Scene1608() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); - if (_klaymanInCar) + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); + if (_klaymenInCar) delete _kmScene1608; else delete _asCar; @@ -1160,10 +1160,10 @@ void Scene1608::upLowerFloor() { void Scene1608::upUpperFloor() { Scene::update(); if (_carStatus == 1) { - removeSurface(_klayman->getSurface()); - removeEntity(_klayman); + removeSurface(_klaymen->getSurface()); + removeEntity(_klaymen); addSprite(_asCar); - _klaymanInCar = true; + _klaymenInCar = true; clearRectList(); SetUpdateHandler(&Scene1608::upCarAtHome); SetMessageHandler(&Scene1608::hmCarAtHome); @@ -1172,10 +1172,10 @@ void Scene1608::upUpperFloor() { _asCar->setVisible(true); sendMessage(_asCar, 0x2009, 0); _asCar->handleUpdate(); - _klayman = NULL; + _klaymen = NULL; _carStatus = 0; } - updateKlaymanCliprect(); + updateKlaymenCliprect(); } void Scene1608::upCarAtHome() { @@ -1191,17 +1191,17 @@ void Scene1608::upCarAtHome() { } _mouseClicked = false; } - updateKlaymanCliprect(); + updateKlaymenCliprect(); } void Scene1608::upGettingOutOfCar() { Scene::update(); if (_carStatus == 2) { - _klayman = _kmScene1608; + _klaymen = _kmScene1608; removeSurface(_asCar->getSurface()); removeEntity(_asCar); - addSprite(_klayman); - _klaymanInCar = false; + addSprite(_klaymen); + _klaymenInCar = false; SetMessageHandler(&Scene1608::hmUpperFloor); SetUpdateHandler(&Scene1608::upUpperFloor); setRectList(0x004B4810); @@ -1210,10 +1210,10 @@ void Scene1608::upGettingOutOfCar() { _asCar->setVisible(false); setMessageList(0x004B4748); processMessageList(); - _klayman->handleUpdate(); + _klaymen->handleUpdate(); _carStatus = 0; } - updateKlaymanCliprect(); + updateKlaymenCliprect(); } void Scene1608::upRidingCar() { @@ -1241,7 +1241,7 @@ uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity case 0x100D: if (param.asInteger() == 0x20250B1A) { clearRectList(); - _klayman->setVisible(false); + _klaymen->setVisible(false); showMouse(false); _sprite1->setVisible(false); //sendMessage(_asDoor, 0x4809, 0); // Play sound? @@ -1313,7 +1313,7 @@ uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity return 0; } -void Scene1608::updateKlaymanCliprect() { +void Scene1608::updateKlaymenCliprect() { if (_kmScene1608->getX() <= 375) _kmScene1608->setClipRect(_clipRect1); else diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h index 6bffb2d9ed..0743767244 100644 --- a/engines/neverhood/module1600.h +++ b/engines/neverhood/module1600.h @@ -140,13 +140,13 @@ protected: Sprite *_sprite2; Sprite *_sprite3; Sprite *_asTape; - Klayman *_kmScene1608; + Klaymen *_kmScene1608; NRect _clipRect1; NRect _clipRect2; NRect _clipRect3; int _carStatus; bool _carClipFlag; - bool _klaymanInCar; + bool _klaymenInCar; int _countdown1; NPointArray *_roomPathPoints; void upLowerFloor(); @@ -158,7 +158,7 @@ protected: uint32 hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); - void updateKlaymanCliprect(); + void updateKlaymenCliprect(); }; class Scene1609 : public Scene { diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp index 39bc49ba45..183b0b8e75 100644 --- a/engines/neverhood/module1700.cpp +++ b/engines/neverhood/module1700.cpp @@ -204,50 +204,50 @@ Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(231, 434); + insertKlaymen(231, 434); setMessageList(0x004B69E8); sendMessage(this, 0x2000, 0); - _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 1) { // Klaymen teleporting in - insertKlayman(431, 434); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(431, 434); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B6A08, false); sendMessage(this, 0x2000, 1); - _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 2) { // Klaymen teleporting out - insertKlayman(431, 434); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(431, 434); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B6AA0, false); sendMessage(this, 0x2000, 1); - _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else if (which == 3) { // Klaymen returning from teleporter console - insertKlayman(431, 434); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(431, 434); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B6A18, false); sendMessage(this, 0x2000, 1); - _klayman->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); } else { // Klaymen falling through the hole - insertKlayman(231, 74); - sendMessage(_klayman, 0x2000, 0); + insertKlaymen(231, 74); + sendMessage(_klaymen, 0x2000, 0); setMessageList(0x004B69F0); sendMessage(this, 0x2000, 0); tempSprite = insertStaticSprite(0x30303822, 1100); - _klayman->setClipRect(0, tempSprite->getDrawRect().y, _sprite->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, tempSprite->getDrawRect().y, _sprite->getDrawRect().x2(), 480); } } void Scene1705::update() { Scene::update(); - if (_klayman->getX() < 224 && _paletteArea != 0) { + if (_klaymen->getX() < 224 && _paletteArea != 0) { _palette->addBasePalette(0xF2210C15, 0, 64, 0); _palette->startFadeToPalette(12); _paletteArea = 0; - } else if (_klayman->getX() >= 224 && _paletteArea == 0) { + } else if (_klaymen->getX() >= 224 && _paletteArea == 0) { _palette->addBasePalette(0x91D3A391, 0, 64, 0); _palette->startFadeToPalette(12); _paletteArea = 1; @@ -260,15 +260,15 @@ uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004B6B40); - _klayman->setKlaymanIdleTable3(); + _klaymen->setKlaymenIdleTable3(); } else { setRectList(0x004B6B30); - _klayman->setKlaymanIdleTable1(); + _klaymen->setKlaymenIdleTable1(); } break; case 0x4826: - if (sender == _ssTape && _klayman->getX() <= 318) { - sendEntityMessage(_klayman, 0x1014, sender); + if (sender == _ssTape && _klaymen->getX() <= 318) { + sendEntityMessage(_klaymen, 0x1014, sender); setMessageList(0x004B6AC0); } break; diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp index dc5f94270c..99b51295b7 100644 --- a/engines/neverhood/module1800.cpp +++ b/engines/neverhood/module1800.cpp @@ -161,7 +161,7 @@ void Module1800::updateScene() { leaveModule(3); break; case 8: - // NOTE: After Klayman jumped into the hole and died... + // NOTE: After Klaymen jumped into the hole and died... leaveModule(1); break; case 1009: diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 629cfd9b39..31bf05b6ee 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -109,20 +109,20 @@ Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(120, 380); + insertKlaymen(120, 380); setMessageList(0x004B3408); } else if (which == 1) { // Klaymen returning from the puzzle - insertKlayman(372, 380); + insertKlaymen(372, 380); setMessageList(0x004B3410); } else { // Klaymen entering from the left - insertKlayman(0, 380); + insertKlaymen(0, 380); setMessageList(0x004B3400); } tempSprite = insertStaticSprite(0x4830A402, 1100); - _klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); } diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp index f08b620030..71bcdc7e58 100644 --- a/engines/neverhood/module2000.cpp +++ b/engines/neverhood/module2000.cpp @@ -109,36 +109,36 @@ Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(300, 345); + insertKlaymen(300, 345); setMessageList(0x004B3538); sendMessage(this, 0x2000, 0); } else if (which == 1) { // Klaymen teleporting in - insertKlayman(116, 345); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(116, 345); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B3540, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { // Klaymen teleporting out - insertKlayman(116, 345); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(116, 345); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B35F0, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { // Klaymen returning from teleporter console - insertKlayman(116, 345); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(116, 345); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B3550, false); sendMessage(this, 0x2000, 1); } else { // Klaymen standing around - insertKlayman(390, 345); + insertKlaymen(390, 345); setMessageList(0x004B3530); sendMessage(this, 0x2000, 0); - _klayman->setDoDeltaX(1); + _klaymen->setDoDeltaX(1); } - _klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); } @@ -148,10 +148,10 @@ uint32 Scene2001::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004B3680); - _klayman->setKlaymanIdleTable3(); + _klaymen->setKlaymenIdleTable3(); } else { setRectList(0x004B3670); - _klayman->setKlaymanIdleTable1(); + _klaymen->setKlaymenIdleTable1(); } } return 0; diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp index 5b5f5af2f3..cd7a3d5e24 100644 --- a/engines/neverhood/module2100.cpp +++ b/engines/neverhood/module2100.cpp @@ -127,8 +127,8 @@ void AsScene2101Door::stCloseDoorDone() { setVisible(false); } -AsScene2101HitByDoorEffect::AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klayman) - : AnimatedSprite(vm, 1400), _klayman(klayman) { +AsScene2101HitByDoorEffect::AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klaymen) + : AnimatedSprite(vm, 1400), _klaymen(klaymen) { SetUpdateHandler(&AnimatedSprite::update); SetMessageHandler(&AsScene2101HitByDoorEffect::handleMessage); @@ -140,8 +140,8 @@ uint32 AsScene2101HitByDoorEffect::handleMessage(int messageNum, const MessagePa uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2001: - _x = _klayman->getX(); - _y = _klayman->getY() - 132; + _x = _klaymen->getX(); + _y = _klaymen->getY() - 132; startAnimation(0x0422255A, 0, -1); setVisible(true); break; @@ -214,7 +214,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) addCollisionSprite(_asTape2); if (which < 0) { - insertKlayman(380, 438); + insertKlaymen(380, 438); setMessageList(0x004B8E48); sendMessage(this, 0x2000, 0); _asDoor = insertSprite(false); @@ -222,7 +222,7 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _countdown1 = 0; } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 438); + insertKlaymen(640, 438); setMessageList(0x004B8E50); sendMessage(this, 0x2000, 0); _asDoor = insertSprite(true); @@ -230,8 +230,8 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _countdown1 = 48; } else if (which == 2) { // Klaymen teleporting out - insertKlayman(115, 438); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(115, 438); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B8F58); sendMessage(this, 0x2000, 1); _asDoor = insertSprite(false); @@ -239,8 +239,8 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _countdown1 = 0; } else if (which == 3) { // Klaymen returning from the teleporter console - insertKlayman(115, 438); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(115, 438); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B8EB0); sendMessage(this, 0x2000, 1); _asDoor = insertSprite(false); @@ -248,8 +248,8 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _countdown1 = 0; } else { // Klaymen teleporting in - insertKlayman(115, 438); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(115, 438); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004B8EA0); sendMessage(this, 0x2000, 1); _asDoor = insertSprite(false); @@ -257,8 +257,8 @@ Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) _countdown1 = 0; } - _asHitByDoorEffect = insertSprite(_klayman); - _klayman->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); + _asHitByDoorEffect = insertSprite(_klaymen); + _klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); } @@ -270,14 +270,14 @@ void Scene2101::update() { _doorStatus = 1; } } else { - if (_klayman->getX() > 575) + if (_klaymen->getX() > 575) _canAcceptInput = false; if (--_countdown1 == 0) { - if (_klayman->getX() < 480) { + if (_klaymen->getX() < 480) { sendMessage(_asDoor, 0x4809, 0); _doorStatus = 1; - } else if (_klayman->getX() >= 480 && _klayman->getX() <= 575) { - _klayman->setDoDeltaX(0); + } else if (_klaymen->getX() >= 480 && _klaymen->getX() <= 575) { + _klaymen->setDoDeltaX(0); setMessageList2(0x004B8F48); sendMessage(_asDoor, 0x4809, 0); sendMessage(_asHitByDoorEffect, 0x2001, 0); @@ -285,7 +285,7 @@ void Scene2101::update() { } } } - } else if (_doorStatus == 1 && _messageValue >= 0 && _klayman->getX() > 470 && !isMessageList2(0x004B8F48)) + } else if (_doorStatus == 1 && _messageValue >= 0 && _klaymen->getX() > 470 && !isMessageList2(0x004B8F48)) setMessageList2(0x004B8F50); Scene::update(); } @@ -295,7 +295,7 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x02144CB1) - sendEntityMessage(_klayman, 0x1014, _ssFloorButton); + sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); else if (param.asInteger() == 0x21E64A00) { if (_doorStatus == 0) setMessageList(0x004B8E80); @@ -307,10 +307,10 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger() != 0) { setRectList(0x004B9008); - _klayman->setKlaymanIdleTable3(); + _klaymen->setKlaymenIdleTable3(); } else { setRectList(0x004B8FF8); - _klayman->setKlaymanIdleTable1(); + _klaymen->setKlaymenIdleTable1(); } break; case 0x480B: @@ -322,10 +322,10 @@ uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape1 || sender == _asTape2) { - if (_klayman->getX() >= 228 && _klayman->getX() <= 500) { - sendEntityMessage(_klayman, 0x1014, sender); + if (_klaymen->getX() >= 228 && _klaymen->getX() <= 500) { + sendEntityMessage(_klaymen, 0x1014, sender); setMessageList(0x004B8F78); - } else if (_klayman->getX() < 228) + } else if (_klaymen->getX() < 228) setMessageList2(0x004B8F00); } break; diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h index 8ec12f774f..c2e7d09ff4 100644 --- a/engines/neverhood/module2100.h +++ b/engines/neverhood/module2100.h @@ -54,9 +54,9 @@ protected: class AsScene2101HitByDoorEffect : public AnimatedSprite { public: - AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klayman); + AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klaymen); protected: - Sprite *_klayman; + Sprite *_klaymen; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index ebe0f81291..2e6549a230 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -457,8 +457,8 @@ AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) SetUpdateHandler(&AnimatedSprite::update); } -AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool isOpen) - : AnimatedSprite(vm, 1100), _klayman(klayman), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) { +AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) { _x = 408; _y = 290; @@ -578,29 +578,29 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(300, 427, _clipRects, 2); + insertKlaymen(300, 427, _clipRects, 2); setMessageList(0x004B8118); - _asDoor = insertSprite(_klayman, _ssDoorLight, false); + _asDoor = insertSprite(_klaymen, _ssDoorLight, false); } else if (which == 1) { // Klaymen entering from the back - insertKlayman(412, 393, _clipRects, 2); + insertKlaymen(412, 393, _clipRects, 2); setMessageList(0x004B8130); - _asDoor = insertSprite(_klayman, _ssDoorLight, false); + _asDoor = insertSprite(_klaymen, _ssDoorLight, false); } else if (which == 2) { // Klaymen returning from the puzzle - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(379, 427, _clipRects, 2); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(379, 427, _clipRects, 2); + _klaymen->setDoDeltaX(1); } else - insertKlayman(261, 427, _clipRects, 2); + insertKlaymen(261, 427, _clipRects, 2); setMessageList(0x004B8178); - _asDoor = insertSprite(_klayman, _ssDoorLight, false); + _asDoor = insertSprite(_klaymen, _ssDoorLight, false); } else { // Klaymen entering from the left NPoint pt = _dataResource.getPoint(0x0304D8DC); - insertKlayman(pt.x, pt.y, _clipRects, 2); + insertKlaymen(pt.x, pt.y, _clipRects, 2); setMessageList(0x004B8120); - _asDoor = insertSprite(_klayman, _ssDoorLight, true); + _asDoor = insertSprite(_klaymen, _ssDoorLight, true); } insertSprite(); @@ -610,7 +610,7 @@ Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2201::~Scene2201() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); _vm->_soundMan->deleteSoundGroup(0x04106220); } @@ -627,7 +627,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssDoorButton); + sendEntityMessage(_klaymen, 0x1014, _ssDoorButton); else if (param.asInteger() == 0x35803198) { if (sendMessage(_asDoor, 0x2000, 0)) setMessageList(0x004B81A0); @@ -653,7 +653,7 @@ uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B81C8); } break; @@ -1000,7 +1000,7 @@ AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, if (!getSubVar(VA_HAS_KEY, _keyIndex) && !getSubVar(VA_IS_KEY_INSERTED, _keyIndex)) { SetMessageHandler(&AsCommonKey::handleMessage); } else { - // If Klayman already has the key or it's already inserted then don't show it + // If Klaymen already has the key or it's already inserted then don't show it setVisible(false); SetMessageHandler(NULL); } @@ -1118,45 +1118,45 @@ Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(200, 427); + insertKlaymen(200, 427); setMessageList(0x004B8340); } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 427); + insertKlaymen(640, 427); setMessageList(0x004B8350); } else if (which == 2) { // Klaymen returning from the displayer - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(362, 427); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(362, 427); + _klaymen->setDoDeltaX(1); } else - insertKlayman(202, 427); + insertKlaymen(202, 427); setMessageList(0x004B8358); } else { // Klaymen entering from the left - insertKlayman(0, 427); + insertKlaymen(0, 427); setMessageList(0x004B8348); } if (getGlobalVar(V_LARGE_DOOR_NUMBER)) { _ssSmallLeftDoor->setVisible(false); - _klayman->setClipRect(_rightDoorClipRect); + _klaymen->setClipRect(_rightDoorClipRect); } else { _ssSmallRightDoor->setVisible(false); - _klayman->setClipRect(_leftDoorClipRect); + _klaymen->setClipRect(_leftDoorClipRect); } } Scene2203::~Scene2203() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { uint32 messageResult = Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x2001: - sendEntityMessage(_klayman, 0x1014, sender); + sendEntityMessage(_klaymen, 0x1014, sender); if (sender == _asLeftDoor) setMessageList2(0x004B83B0); else @@ -1177,18 +1177,18 @@ uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x4808: if (sender == _asLeftDoor) { _ssSmallLeftDoor->setVisible(true); - _klayman->setClipRect(_leftDoorClipRect); + _klaymen->setClipRect(_leftDoorClipRect); } else { _ssSmallRightDoor->setVisible(true); - _klayman->setClipRect(_rightDoorClipRect); + _klaymen->setClipRect(_rightDoorClipRect); } break; case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B83E0); } else if (sender == _asKey) { - sendEntityMessage(_klayman, 0x1014, _asKey); + sendEntityMessage(_klaymen, 0x1014, _asKey); setMessageList(0x004B83F0); } break; @@ -1242,27 +1242,27 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(320, 417); + insertKlaymen(320, 417); setMessageList(0x004B0658); if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x68033B1C, 0, 65, 0); - _isKlaymanInLight = false; + _isKlaymenInLight = false; } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 417); + insertKlaymen(640, 417); setMessageList(0x004B0648); if (!getGlobalVar(V_LIGHTS_ON)) _palette->addPalette(0x68033B1C, 0, 65, 0); - _isKlaymanInLight = false; + _isKlaymenInLight = false; } else { // Klaymen entering from the left - insertKlayman(0, 417); + insertKlaymen(0, 417); setMessageList(0x004B0640); - _isKlaymanInLight = true; + _isKlaymenInLight = true; } - _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); - _klayman->setSoundFlag(true); + _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); + _klaymen->setSoundFlag(true); } void Scene2205::update() { @@ -1280,22 +1280,22 @@ void Scene2205::update() { _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); sendMessage(_ssDoorFrame, 0x2000, 0); changeMouseCursor(0xA0289D08); - _isKlaymanInLight = true; - if (_klayman->getX() > 85) { + _isKlaymenInLight = true; + if (_klaymen->getX() > 85) { _palette->addPalette(0x68033B1C, 0, 65, 0); - _isKlaymanInLight = false; + _isKlaymenInLight = false; } _isLightOn = false; } if (!getGlobalVar(V_LIGHTS_ON)) { - if (_isKlaymanInLight && _klayman->getX() > 85) { + if (_isKlaymenInLight && _klaymen->getX() > 85) { _palette->addBasePalette(0x68033B1C, 0, 65, 0); _palette->startFadeToPalette(12); - _isKlaymanInLight = false; - } else if (!_isKlaymanInLight && _klayman->getX() <= 85) { + _isKlaymenInLight = false; + } else if (!_isKlaymenInLight && _klaymen->getX() <= 85) { _palette->addBasePalette(0xD00A028D, 0, 65, 0); _palette->startFadeToPalette(12); - _isKlaymanInLight = true; + _isKlaymenInLight = true; } } } @@ -1309,7 +1309,7 @@ uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entit else if (param.asInteger() == 0x2841369C) setMessageList(0x004B0630); else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssLightSwitch); + sendEntityMessage(_klaymen, 0x1014, _ssLightSwitch); break; case 0x480B: setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1); @@ -1495,38 +1495,38 @@ Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(200, 430); + insertKlaymen(200, 430); setMessageList(0x004B88A8); } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 430); + insertKlaymen(640, 430); setMessageList(0x004B88B8); } else if (which == 2) { // Klaymen entering from the back - insertKlayman(205, 396); + insertKlaymen(205, 396); setMessageList(0x004B88C8); _palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0); - klaymanBehindSpikes(); + klaymenBehindSpikes(); playSound(0, 0x53B8284A); } else if (which == 3) { // Klaymen entering from reading a text column - insertKlayman(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) - _klayman->setDoDeltaX(1); + insertKlaymen(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); setMessageList(0x004B8A70); } else { // Klaymen entering from the left - insertKlayman(0, 430); + insertKlaymen(0, 430); setMessageList(0x004B88B0); } - _klayman->setSoundFlag(true); - _klayman->setKlaymanIdleTable2(); + _klaymen->setSoundFlag(true); + _klaymen->setKlaymenIdleTable2(); } Scene2206::~Scene2206() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -1536,7 +1536,7 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit if (param.asInteger() == 0x800C6694) readClickedColumn(); else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x11C40840) { if (getGlobalVar(V_SPIKES_RETRACTED)) setMessageList(0x004B8948); @@ -1557,20 +1557,20 @@ uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entit } break; case 0x4826: - sendEntityMessage(_klayman, 0x1014, _ssTestTube); + sendEntityMessage(_klaymen, 0x1014, _ssTestTube); setMessageList(0x004B8988); break; case 0x482A: - klaymanBehindSpikes(); + klaymenBehindSpikes(); break; case 0x482B: - klaymanInFrontSpikes(); + klaymenInFrontSpikes(); break; } return messageResult; } -void Scene2206::klaymanInFrontSpikes() { +void Scene2206::klaymenInFrontSpikes() { if (getGlobalVar(V_LIGHTS_ON)) { _palette->addBasePalette(0x41983216, 0, 65, 0); _palette->startFadeToPalette(12); @@ -1579,10 +1579,10 @@ void Scene2206::klaymanInFrontSpikes() { setSurfacePriority(_sprite2->getSurface(), 300); setSurfacePriority(_sprite3->getSurface(), 100); setSurfacePriority(_asDoorSpikes->getSurface(), 200); - _klayman->setClipRect(0, 0, 640, 480); + _klaymen->setClipRect(0, 0, 640, 480); } -void Scene2206::klaymanBehindSpikes() { +void Scene2206::klaymenBehindSpikes() { if (!getGlobalVar(V_LIGHTS_ON)) { _palette->addBasePalette(0xB103B604, 0, 65, 0); _palette->startFadeToPalette(12); @@ -1591,7 +1591,7 @@ void Scene2206::klaymanBehindSpikes() { setSurfacePriority(_sprite2->getSurface(), 1300); setSurfacePriority(_sprite3->getSurface(), 1100); setSurfacePriority(_asDoorSpikes->getSurface(), 1200); - _klayman->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + _klaymen->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); } void Scene2206::readClickedColumn() { @@ -1601,7 +1601,7 @@ void Scene2206::readClickedColumn() { setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7); setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); setGlobalVar(V_COLUMN_BACK_NAME, 0); - if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klayman->getX()) >= 144) + if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klaymen->getX()) >= 144) setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); else setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); @@ -1926,7 +1926,7 @@ SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int i } Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _klaymanAtElevator(true), _elevatorSurfacePriority(0) { + : Scene(vm, parentModule), _klaymenAtElevator(true), _elevatorSurfacePriority(0) { _vm->gameModule()->initCannonSymbolsPuzzle(); @@ -1936,8 +1936,8 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) SetMessageHandler(&Scene2207::handleMessage); SetUpdateHandler(&Scene2207::update); - insertKlayman(0, 0); - _klayman->setRepl(64, 0); + insertKlaymen(0, 0); + _klaymen->setRepl(64, 0); setMessageList(0x004B38E8); _asElevator = insertSprite(this); @@ -1958,7 +1958,7 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) _asWallCannonAnimation->setVisible(false); _ssButton = insertSprite(this, 0x2C4061C4, 100, 0); _asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480); - _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); + _klaymen->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); } else { setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1); @@ -1974,15 +1974,15 @@ Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) _asWallRobotAnimation = NULL; _asWallCannonAnimation = NULL; _ssButton = NULL; - _klayman->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); + _klaymen->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); } _dataResource.load(0x00524846); setRectList(0x004B38B8); - sendEntityMessage(_klayman, 0x1014, _asElevator); - sendMessage(_klayman, 0x2001, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); sendMessage(_asElevator, 0x2000, 480); loadSound(1, calcHash("fxFogHornSoft")); @@ -1995,8 +1995,8 @@ void Scene2207::update() { setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority); _elevatorSurfacePriority = 0; } - if (_klayman->getY() == 423) - _klaymanAtElevator = _klayman->getX() > 459 && _klayman->getX() < 525; + if (_klaymen->getY() == 423) + _klaymenAtElevator = _klaymen->getX() > 459 && _klaymen->getX() < 525; } uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2004,33 +2004,33 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0014F275) { - if (_klaymanAtElevator) { + if (_klaymenAtElevator) { sendMessage(_asElevator, 0x2000, _mouseClickPos.y); - sendEntityMessage(_klayman, 0x1014, _asElevator); - sendMessage(_klayman, 0x2001, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); } else cancelMessageList(); } else if (param.asInteger() == 0x34569073) { - if (_klaymanAtElevator) { - _isKlaymanBusy = true; + if (_klaymenAtElevator) { + _isKlaymenBusy = true; sendMessage(_asElevator, 0x2000, 0); - sendEntityMessage(_klayman, 0x1014, _asElevator); - sendMessage(_klayman, 0x2001, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); } else cancelMessageList(); } else if (param.asInteger() == 0x4054C877) { - if (_klaymanAtElevator) { + if (_klaymenAtElevator) { sendMessage(_asElevator, 0x2000, 480); - sendEntityMessage(_klayman, 0x1014, _asElevator); - sendMessage(_klayman, 0x2001, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); } else cancelMessageList(); } else if (param.asInteger() == 0x0CBC6211) { - sendEntityMessage(_klayman, 0x1014, _asElevator); - sendMessage(_klayman, 0x2001, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); setRectList(0x004B38B8); } else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x231DA241) { if (_ssButton) setMessageList(0x004B38F0); @@ -2042,7 +2042,7 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit _elevatorSurfacePriority = param.asInteger(); break; case 0x2003: - _isKlaymanBusy = false; + _isKlaymenBusy = false; break; case 0x4807: sendMessage(_asWallRobotAnimation, 0x2007, 0); @@ -2067,15 +2067,15 @@ uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - if (_klayman->getY() == 423) { - sendEntityMessage(_klayman, 0x1014, _asTape); + if (_klaymen->getY() == 423) { + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B3958); } - } else if (_klaymanAtElevator) { + } else if (_klaymenAtElevator) { SetMessageHandler(&Scene2207::handleMessage2); sendMessage(_asElevator, 0x2000, 347); - sendEntityMessage(_klayman, 0x1014, _asElevator); - sendMessage(_klayman, 0x2001, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); } break; } @@ -2090,8 +2090,8 @@ uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Enti break; case 0x2004: SetMessageHandler(&Scene2207::handleMessage); - sendMessage(_klayman, 0x2005, 0); - sendEntityMessage(_klayman, 0x1014, _asLever); + sendMessage(_klaymen, 0x2005, 0); + sendEntityMessage(_klaymen, 0x1014, _asLever); setMessageList(0x004B3920); setRectList(0x004B3948); break; @@ -2273,7 +2273,7 @@ static const uint32 kScene2242MessageListIds1[] = { }; Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isKlaymanInLight(false) { + : Scene(vm, parentModule), _isKlaymenInLight(false) { SetMessageHandler(&Scene2242::handleMessage); SetUpdateHandler(&Scene2242::update); @@ -2298,42 +2298,42 @@ Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(200, 430); + insertKlaymen(200, 430); setMessageList(0x004B3C18); } else if (which == 1) { // Klaymen entering from looking through the window - insertKlayman(530, 430); + insertKlaymen(530, 430); setMessageList(0x004B3D60); } else if (which == 2) { // Klaymen returning from reading a text column - insertKlayman(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430); + insertKlaymen(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430); setMessageList(0x004B3D48); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); } else { // Klaymen entering from the left - insertKlayman(0, 430); + insertKlaymen(0, 430); setMessageList(0x004B3C20); } - _klayman->setSoundFlag(true); + _klaymen->setSoundFlag(true); } Scene2242::~Scene2242() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } void Scene2242::update() { if (!getGlobalVar(V_LIGHTS_ON)) { - if (_isKlaymanInLight && _klayman->getX() < 440) { + if (_isKlaymenInLight && _klaymen->getX() < 440) { _palette->addBasePalette(0x68033B1C, 0, 65, 0); _palette->startFadeToPalette(12); - _isKlaymanInLight = false; - } else if (!_isKlaymanInLight && _klayman->getX() >= 440) { + _isKlaymenInLight = false; + } else if (!_isKlaymenInLight && _klaymen->getX() >= 440) { _palette->addBasePalette(0x25848E24, 0, 65, 0); _palette->startFadeToPalette(12); - _isKlaymanInLight = true; + _isKlaymenInLight = true; } } Scene::update(); @@ -2348,7 +2348,7 @@ uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B3D50); } break; @@ -2370,13 +2370,13 @@ void Scene2242::readClickedColumn() { index = 1; } setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - if (ABS(_klayman->getX() - kScene2242XPositions[index]) < 133) + if (ABS(_klaymen->getX() - kScene2242XPositions[index]) < 133) setMessageList2(kScene2242MessageListIds1[index]); else setMessageList2(kScene2242MessageListIds2[index]); } -static const int16 kHallOfRecordsKlaymanXPos[] = { +static const int16 kHallOfRecordsKlaymenXPos[] = { 68, 157, 246, 335, 424, 513, 602 }; @@ -2413,31 +2413,31 @@ HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule if (which < 0) { // Restoring game - insertKlayman(200, 430); + insertKlaymen(200, 430); setMessageList(0x004B2900); } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 430); + insertKlaymen(640, 430); setMessageList(0x004B2910); } else if (which == 2) { // Klaymen returning from reading a text column - insertKlayman(kHallOfRecordsKlaymanXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _hallOfRecordsInfo->xPosIndex], 430); + insertKlaymen(kHallOfRecordsKlaymenXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _hallOfRecordsInfo->xPosIndex], 430); setMessageList(0x004B2B70); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); } else { // Klaymen entering from the left - insertKlayman(0, 430); + insertKlaymen(0, 430); setMessageList(0x004B2908); } - _klayman->setSoundFlag(true); - _klayman->setKlaymanIdleTable2(); + _klaymen->setSoundFlag(true); + _klaymen->setKlaymenIdleTable2(); } HallOfRecordsScene::~HallOfRecordsScene() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2463,7 +2463,7 @@ void HallOfRecordsScene::readClickedColumn() { setGlobalVar(V_COLUMN_BACK_NAME, _hallOfRecordsInfo->bgFilename3); else setGlobalVar(V_COLUMN_BACK_NAME, 0); - if (ABS(_klayman->getX() - kHallOfRecordsKlaymanXPos[index]) < 133) + if (ABS(_klaymen->getX() - kHallOfRecordsKlaymenXPos[index]) < 133) setMessageList2(kHallOfRecordsSceneMessageListIds1[index]); else setMessageList2(kHallOfRecordsSceneMessageListIds2[index]); @@ -2502,30 +2502,30 @@ Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(200, 430); + insertKlaymen(200, 430); setMessageList(0x004B5428); } else if (which == 1) { // Klaymen entering from the right - insertKlayman(640, 430); + insertKlaymen(640, 430); setMessageList(0x004B5438); } else if (which == 2) { // Klaymen returning from reading a text column - insertKlayman(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) - _klayman->setDoDeltaX(1); + insertKlaymen(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); setMessageList(0x004B5530); } else { // Klaymen entering from the left - insertKlayman(0, 430); + insertKlaymen(0, 430); setMessageList(0x004B5430); } - _klayman->setSoundFlag(true); + _klaymen->setSoundFlag(true); } Scene2247::~Scene2247() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -2552,7 +2552,7 @@ void Scene2247::readClickedColumn() { } setGlobalVar(V_CLICKED_COLUMN_INDEX, 0); setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - if (ABS(_klayman->getX() - kScene2247XPositions[index]) < 133) + if (ABS(_klaymen->getX() - kScene2247XPositions[index]) < 133) setMessageList2(kScene2247MessageListIds1[index]); else setMessageList2(kScene2247MessageListIds2[index]); diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h index 30cc681b40..f198871613 100644 --- a/engines/neverhood/module2200.h +++ b/engines/neverhood/module2200.h @@ -64,9 +64,9 @@ public: class AsScene2201Door : public AnimatedSprite { public: - AsScene2201Door(NeverhoodEngine *vm, Klayman *klayman, Sprite *ssDoorLight, bool isOpen); + AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen); protected: - Klayman *_klayman; + Klaymen *_klaymen; Sprite *_ssDoorLight; bool _isOpen; int _countdown; @@ -188,7 +188,7 @@ public: protected: SsCommonPressButton *_ssLightSwitch; Sprite *_ssDoorFrame; - bool _isKlaymanInLight; + bool _isKlaymenInLight; bool _isLightOn; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); @@ -236,8 +236,8 @@ protected: Sprite *_asPlatform; Sprite *_ssTestTube; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void klaymanInFrontSpikes(); - void klaymanBehindSpikes(); + void klaymenInFrontSpikes(); + void klaymenBehindSpikes(); void readClickedColumn(); }; @@ -311,7 +311,7 @@ protected: Sprite *_asWallCannonAnimation; Sprite *_ssButton; int _elevatorSurfacePriority; - bool _klaymanAtElevator; + bool _klaymenAtElevator; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); @@ -345,7 +345,7 @@ public: ~Scene2242(); protected: Sprite *_asTape; - bool _isKlaymanInLight; + bool _isKlaymenInLight; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void readClickedColumn(); diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp index 6c007c47d6..369132187d 100644 --- a/engines/neverhood/module2400.cpp +++ b/engines/neverhood/module2400.cpp @@ -404,19 +404,19 @@ Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(200, 447); + insertKlaymen(200, 447); setMessageList(0x004B2F70); _asDoor = insertSprite(false); } else if (which == 1) { // Klaymen entering from the back - insertKlayman(280, 413); + insertKlaymen(280, 413); setMessageList(0x004B2F80); _palette->addBasePalette(0xB103B604, 0, 65, 0); _palette->addPalette(0xB103B604, 0, 65, 0); _asDoor = insertSprite(true); } else { // Klaymen entering from the left - insertKlayman(-20, 447); + insertKlaymen(-20, 447); setMessageList(0x004B2F78); _asDoor = insertSprite(false); } @@ -471,9 +471,9 @@ uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x02144CB1) - sendEntityMessage(_klayman, 0x1014, _ssFloorButton); + sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); else if (param.asInteger() == 0x11C40840) { if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) setMessageList(0x004B3090); @@ -604,8 +604,8 @@ void AsScene2402Door::stDoorClosingFinished() { setVisible(false); } -AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) - : AnimatedSprite(vm, 1100), _klayman(klayman), _countdown1(0), _countdown2(0) { +AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown1(0), _countdown2(0) { _x = 260; _y = 210; @@ -620,13 +620,13 @@ AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman) SetUpdateHandler(&AsScene2402TV::upWait); } else { int16 frameIndex; - if (_klayman->getX() > 320) + if (_klaymen->getX() > 320) _currFrameIndex = 29; - frameIndex = CLIP((_klayman->getX() - _x + 150) / 10, 0, 29); + frameIndex = CLIP((_klaymen->getX() - _x + 150) / 10, 0, 29); startAnimation(0x050A0103, frameIndex, -1); _newStickFrameIndex = frameIndex; _countdown1 = 0; - SetUpdateHandler(&AsScene2402TV::upFocusKlayman); + SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); } } @@ -643,8 +643,8 @@ void AsScene2402TV::upWait() { AnimatedSprite::update(); } -void AsScene2402TV::upFocusKlayman() { - int16 frameIndex = CLIP((_klayman->getX() - _x + 150) / 10, 0, 29); +void AsScene2402TV::upFocusKlaymen() { + int16 frameIndex = CLIP((_klaymen->getX() - _x + 150) / 10, 0, 29); if (frameIndex != _currFrameIndex) { if (frameIndex > _currFrameIndex) _currFrameIndex++; @@ -666,7 +666,7 @@ void AsScene2402TV::stJokeFinished() { setGlobalVar(V_TV_JOKE_TOLD, 1); startAnimation(0x050A0103, 0, -1); _newStickFrameIndex = 0; - SetUpdateHandler(&AsScene2402TV::upFocusKlayman); + SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); } uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -701,34 +701,34 @@ Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(198, 404); + insertKlaymen(198, 404); setMessageList(0x004AF7C8); } else if (which == 1) { // Klaymen entering from the right - insertKlayman(660, 404); + insertKlaymen(660, 404); setMessageList(0x004AF7D8); } else if (which == 2) { // Klaymen returning from looking through the window - insertKlayman(409, 404); - _klayman->setDoDeltaX(getGlobalVar(V_KLAYMAN_IS_DELTA_X) ? 1 : 0); + insertKlaymen(409, 404); + _klaymen->setDoDeltaX(getGlobalVar(V_KLAYMEN_IS_DELTA_X) ? 1 : 0); setMessageList(0x004AF888); } else { // Klaymen entering from the left - insertKlayman(0, 404); + insertKlaymen(0, 404); setMessageList(0x004AF7D0); } tempSprite = insertStaticSprite(0x081A60A8, 1100); _ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100); - _klayman->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2()); + _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2()); _asDoor = insertSprite(this, which == 0); - insertSprite(_klayman); + insertSprite(_klaymen); insertStaticSprite(0x3A01A020, 200); } Scene2402::~Scene2402() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } void Scene2402::update() { @@ -753,7 +753,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x01C66840) { if (sendMessage(_asDoor, 0x2000, 0)) setMessageList(0x004AF800); @@ -772,7 +772,7 @@ uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004AF890); } break; @@ -803,26 +803,26 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game _isClimbingLadder = false; - insertKlayman(220, 449); + insertKlaymen(220, 449); setMessageList(0x004B5C98); setRectList(0x004B5E18); } else if (which == 1) { // Klaymen returning from looking through the window _isClimbingLadder = false; - insertKlayman(433, 449); + insertKlaymen(433, 449); setMessageList(0x004B5D70); setRectList(0x004B5E18); } else if (which == 2) { // Klaymen standing around after the critter video _isClimbingLadder = false; - insertKlayman(440, 449); - _klayman->setDoDeltaX(1); + insertKlaymen(440, 449); + _klaymen->setDoDeltaX(1); setMessageList(0x004B5C98); setRectList(0x004B5E18); } else { // Klaymen coming up from ladder _isClimbingLadder = true; - insertKlayman(122, 599); + insertKlaymen(122, 599); setMessageList(0x004B5CA0); setRectList(0x004B5E28); } @@ -830,9 +830,9 @@ Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) _ssButton = insertSprite(this, 0x3130B0EB, 100, 0); tempSprite1 = insertStaticSprite(0x20C24220, 1100); tempSprite2 = insertStaticSprite(0x03080900, 1300); - tempSprite3 = insertSprite(_klayman); + tempSprite3 = insertSprite(_klaymen); tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); - _klayman->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); + _klaymen->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); loadSound(1, calcHash("fxFogHornSoft")); } @@ -841,9 +841,9 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x040424D0) - sendEntityMessage(_klayman, 0x1014, _ssButton); + sendEntityMessage(_klaymen, 0x1014, _ssButton); else if (param.asInteger() == 0x180CE614) - sendEntityMessage(_klayman, 0x1014, _asLightCord); + sendEntityMessage(_klaymen, 0x1014, _asLightCord); break; case 0x2000: _isClimbingLadder = true; @@ -870,7 +870,7 @@ uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape && !_isClimbingLadder) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B5D98); } break; @@ -923,36 +923,36 @@ Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game _isClimbingLadder = false; - insertKlayman(307, 404, _clipRects, 2); + insertKlaymen(307, 404, _clipRects, 2); setMessageList(0x004B76C8); setRectList(0x004B78C8); } else if (which == 1) { // Klaymen coming down the ladder _isClimbingLadder = true; - insertKlayman(253, -16, _clipRects, 2); + insertKlaymen(253, -16, _clipRects, 2); setMessageList(0x004B76D8); setRectList(0x004B78D8); } else if (which == 2) { // Klaymen returning from the diskplayer _isClimbingLadder = false; - insertKlayman(480, 404, _clipRects, 2); + insertKlaymen(480, 404, _clipRects, 2); setMessageList(0x004B77C0); setRectList(0x004B78C8); } else if (which == 3) { // Klaymen returning from looking through the window _isClimbingLadder = false; - insertKlayman(387, 404, _clipRects, 2); + insertKlaymen(387, 404, _clipRects, 2); setMessageList(0x004B7810); setRectList(0x004B78C8); } else { // Klaymen entering from the left _isClimbingLadder = false; - insertKlayman(0, 404, _clipRects, 2); + insertKlaymen(0, 404, _clipRects, 2); setMessageList(0x004B76D0); setRectList(0x004B78C8); } - tempSprite2 = insertSprite(_klayman); + tempSprite2 = insertSprite(_klaymen); tempSprite2->setClipRect(_clipRects[1]); } @@ -978,10 +978,10 @@ uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asTape && !_isClimbingLadder) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B77C8); } else if (sender == _asKey && !_isClimbingLadder) { - sendEntityMessage(_klayman, 0x1014, _asKey); + sendEntityMessage(_klaymen, 0x1014, _asKey); setMessageList(0x004B77D8); } break; diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h index 908c9d6bf5..38664658ce 100644 --- a/engines/neverhood/module2400.h +++ b/engines/neverhood/module2400.h @@ -125,14 +125,14 @@ protected: class AsScene2402TV : public AnimatedSprite { public: - AsScene2402TV(NeverhoodEngine *vm, Klayman *klayman); + AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen); virtual ~AsScene2402TV(); protected: - Klayman *_klayman; + Klaymen *_klaymen; int _countdown1; int _countdown2; void upWait(); - void upFocusKlayman(); + void upFocusKlaymen(); void stJokeFinished(); uint32 hmJoke(int messageNum, const MessageParam ¶m, Entity *sender); }; diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp index f5894e9dad..1623e4ca90 100644 --- a/engines/neverhood/module2500.cpp +++ b/engines/neverhood/module2500.cpp @@ -241,9 +241,9 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { // Restoring game - insertKlayman(162, 393); - _kmScene2501 = _klayman; - _klaymanInCar = false; + insertKlaymen(162, 393); + _kmScene2501 = _klaymen; + _klaymenInCar = false; setMessageList(0x004B2538); setRectList(0x004B2608); SetMessageHandler(&Scene2501::handleMessage); @@ -255,8 +255,8 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) // 1: Klaymen entering riding the car on the left track // 2: Klaymen entering riding the car on the bottom track addSprite(_asCar); - _kmScene2501 = (Klayman*)new KmScene2501(_vm, this, 275, 393); - _klaymanInCar = true; + _kmScene2501 = (Klaymen*)new KmScene2501(_vm, this, 275, 393); + _klaymenInCar = true; sendMessage(_kmScene2501, 0x2000, 1); _kmScene2501->setDoDeltaX(1); SetMessageHandler(&Scene2501::hmRidingCar); @@ -266,9 +266,9 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) _currTrackIndex = which; } else { // Klaymen entering the car - insertKlayman(162, 393); - _kmScene2501 = _klayman; - _klaymanInCar = false; + insertKlaymen(162, 393); + _kmScene2501 = _klaymen; + _klaymenInCar = false; setMessageList(0x004B2538); setRectList(0x004B2608); SetMessageHandler(&Scene2501::handleMessage); @@ -307,7 +307,7 @@ Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) Scene2501::~Scene2501() { // Free sprites not currently in the sprite list - if (_klaymanInCar) + if (_klaymenInCar) delete _kmScene2501; else delete _asCar; @@ -316,10 +316,10 @@ Scene2501::~Scene2501() { void Scene2501::update() { Scene::update(); if (_carStatus == 1) { - removeSprite(_klayman); + removeSprite(_klaymen); addSprite(_asCar); clearRectList(); - _klaymanInCar = true; + _klaymenInCar = true; SetMessageHandler(&Scene2501::hmCarAtHome); SetUpdateHandler(&Scene2501::upCarAtHome); _asIdleCarLower->setVisible(false); @@ -327,10 +327,10 @@ void Scene2501::update() { _asCar->setVisible(true); sendMessage(_asCar, 0x2009, 0); _asCar->handleUpdate(); - _klayman = NULL; + _klaymen = NULL; _carStatus = 0; } - updateKlaymanClipRect(); + updateKlaymenClipRect(); } void Scene2501::upCarAtHome() { @@ -346,16 +346,16 @@ void Scene2501::upCarAtHome() { } _mouseClicked = false; } - updateKlaymanClipRect(); + updateKlaymenClipRect(); } void Scene2501::upGettingOutOfCar() { Scene::update(); if (_carStatus == 2) { - _klayman = _kmScene2501; + _klaymen = _kmScene2501; removeSprite(_asCar); - addSprite(_klayman); - _klaymanInCar = false; + addSprite(_klaymen); + _klaymenInCar = false; SetMessageHandler(&Scene2501::handleMessage); SetUpdateHandler(&Scene2501::update); setRectList(0x004B2608); @@ -364,10 +364,10 @@ void Scene2501::upGettingOutOfCar() { _asCar->setVisible(false); setMessageList(0x004B2570); processMessageList(); - _klayman->handleUpdate(); + _klaymen->handleUpdate(); _carStatus = 0; } - updateKlaymanClipRect(); + updateKlaymenClipRect(); } void Scene2501::upRidingCar() { @@ -463,7 +463,7 @@ void Scene2501::changeTrack() { _newTrackIndex = -1; } -void Scene2501::updateKlaymanClipRect() { +void Scene2501::updateKlaymenClipRect() { if (_kmScene2501->getX() <= 211) _kmScene2501->setClipRect(0, 0, 640, 480); else diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h index 9a7e9442f1..10301b089d 100644 --- a/engines/neverhood/module2500.h +++ b/engines/neverhood/module2500.h @@ -59,14 +59,14 @@ protected: Sprite *_asCarTrackShadow; Sprite *_asIdleCarLower; Sprite *_asIdleCarFull; - Klayman *_kmScene2501; + Klaymen *_kmScene2501; Tracks _tracks; NPointArray *_trackPoints; int _currTrackIndex; NPoint _clickPoint; int _newTrackIndex; int _carStatus; - bool _klaymanInCar; + bool _klaymenInCar; void update(); void upCarAtHome(); void upGettingOutOfCar(); @@ -76,7 +76,7 @@ protected: uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); void moveCarToPoint(NPoint &pt); void changeTrack(); - void updateKlaymanClipRect(); + void updateKlaymenClipRect(); }; class SsScene2504Button : public StaticSprite { diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp index b5db9118d9..53e73af179 100644 --- a/engines/neverhood/module2700.cpp +++ b/engines/neverhood/module2700.cpp @@ -1200,11 +1200,11 @@ Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule) insertScreenMouse(0x0C04502A); setRectList(0x004AE360); - insertKlayman(108, 331); + insertKlaymen(108, 331); setMessageList(0x004AE328); tempSprite = insertStaticSprite(0x50C22C48, 1100); - _klayman->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); } diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index dd02d59a6d..5fececd568 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -77,7 +77,7 @@ void Module2800::createScene(int sceneNum, int which) { case 2: _vm->gameState().sceneNum = 2; _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - if (getGlobalVar(V_KLAYMAN_SMALL)) + if (getGlobalVar(V_KLAYMEN_SMALL)) _childObject = new Scene2803Small(_vm, this, which); else _childObject = new Scene2803(_vm, this, which); @@ -441,21 +441,21 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) insertStaticSprite(0x0001264C, 100); if (which < 0) { - insertKlayman(194, 430); + insertKlaymen(194, 430); setMessageList(0x004B6BB8); } else if (which == 1) { - insertKlayman(443, 398); + insertKlaymen(443, 398); setMessageList(0x004B6BC0); } else if (which == 2) { - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(312, 432); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(312, 432); + _klaymen->setDoDeltaX(1); } else { - insertKlayman(194, 432); + insertKlaymen(194, 432); } setMessageList(0x004B6C10); } else { - insertKlayman(0, 432); + insertKlaymen(0, 432); setMessageList(0x004B6BB0); } @@ -467,7 +467,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _palette->addBasePalette(0x01400666, 0, 256, 0); _sprite1 = insertStaticSprite(0x100CA0A8, 1100); _sprite2 = insertStaticSprite(0x287C21A4, 1100); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); insertScreenMouse(0x0066201C); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); addCollisionSprite(_asTape); @@ -478,7 +478,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _paletteHash = 0x15021024; _palette->addBasePalette(0x11E00684, 0, 256, 0); _sprite2 = insertStaticSprite(0x061601C8, 1100); - _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); insertScreenMouse(0x00680116); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); addCollisionSprite(_asTape); @@ -489,7 +489,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) _paletteHash = 0x15021024; _palette->addBasePalette(0x030006E6, 0, 256, 0); _sprite2 = insertStaticSprite(0x273801CE, 1100); - _klayman->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); insertScreenMouse(0x006E2038); _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); addCollisionSprite(_asTape); @@ -508,7 +508,7 @@ Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2801::~Scene2801() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); } uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -516,7 +516,7 @@ uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x4826: if (sender == _asTape) { - sendEntityMessage(_klayman, 0x1014, _asTape); + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004B6C40); } break; @@ -923,46 +923,46 @@ Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) _clipRectsStairs[2].y2 = 480; if (which < 0) { - insertKlayman(302, 445, _clipRectsFloor, 2); + insertKlaymen(302, 445, _clipRectsFloor, 2); setMessageList(0x004B79F0); - klaymanFloor(); + klaymenFloor(); } else if (which == 1) { - insertKlayman(200, 445, _clipRectsFloor, 2); + insertKlaymen(200, 445, _clipRectsFloor, 2); setMessageList(0x004B79C8); - klaymanFloor(); + klaymenFloor(); } else if (which == 3) { NPoint pt = _dataResource.getPoint(0xC2A08694); - insertKlayman(pt.x, pt.y, _clipRectsStairs, 3); + insertKlaymen(pt.x, pt.y, _clipRectsStairs, 3); setMessageList(0x004B7A00); - klaymanStairs(); + klaymenStairs(); } else if (which == 5) { - insertKlayman(253, 298, _clipRectsStairs, 3); + insertKlaymen(253, 298, _clipRectsStairs, 3); setMessageList(0x004B7A00); - klaymanStairs(); + klaymenStairs(); } else if (which == 6) { _asRope = insertSprite(this, 384); _asRope->setClipRect(0, 25, 640, 480); - insertKlayman(384, 0, _clipRectsFloor, 2); - sendEntityMessage(_klayman, 0x1014, _asRope); - _klayman->setClipRect(0, 25, 640, 480); + insertKlaymen(384, 0, _clipRectsFloor, 2); + sendEntityMessage(_klaymen, 0x1014, _asRope); + _klaymen->setClipRect(0, 25, 640, 480); setMessageList(0x004B7A78); - klaymanFloor(); + klaymenFloor(); } else if (which == 2) { - insertKlayman(400, 445, _clipRectsFloor, 2); + insertKlaymen(400, 445, _clipRectsFloor, 2); setMessageList(0x004B79F8); - klaymanFloor(); + klaymenFloor(); } else { - insertKlayman(50, 231, _clipRectsStairs, 3); + insertKlaymen(50, 231, _clipRectsStairs, 3); setMessageList(0x004B79C0); - klaymanStairs(); + klaymenStairs(); } changeBackground(); } -void Scene2803::upKlaymanStairs() { - if (_klayman->getX() < 350) { +void Scene2803::upKlaymenStairs() { + if (_klaymen->getX() < 350) { setPaletteArea0(); } else { setPaletteArea1(); @@ -986,27 +986,27 @@ uint32 Scene2803::handleMessage(int messageNum, const MessageParam ¶m, Entit else if (param.asInteger() == 0x482D1210) setMessageList(0x004B7A30); else if (param.asInteger() == 0x802402B2) { - sendEntityMessage(_klayman, 0x1014, _asLightCord); + sendEntityMessage(_klaymen, 0x1014, _asLightCord); setMessageList(0x004B7A68); } else if (param.asInteger() == 0x9626F390) setMessageList(0x004B7A88); break; case 0x482A: - klaymanStairs(); + klaymenStairs(); setPaletteArea1(); break; case 0x482B: - klaymanFloor(); + klaymenFloor(); setPaletteArea0(); break; } return messageResult; } -void Scene2803::klaymanStairs() { - SetUpdateHandler(&Scene2803::upKlaymanStairs); - _klayman->getSurface()->setClipRects(_clipRectsStairs, 3); - sendMessage(_klayman, 0x482C, 0xE5A48297); +void Scene2803::klaymenStairs() { + SetUpdateHandler(&Scene2803::upKlaymenStairs); + _klaymen->getSurface()->setClipRects(_clipRectsStairs, 3); + sendMessage(_klaymen, 0x482C, 0xE5A48297); _sprite3->setVisible(true); _sprite4->setVisible(true); _sprite5->setVisible(true); @@ -1016,10 +1016,10 @@ void Scene2803::klaymanStairs() { _sprite9->setVisible(false); } -void Scene2803::klaymanFloor() { +void Scene2803::klaymenFloor() { SetUpdateHandler(&Scene::update); - _klayman->getSurface()->setClipRects(_clipRectsFloor, 2); - sendMessage(_klayman, 0x482C, 0); + _klaymen->getSurface()->setClipRects(_clipRectsFloor, 2); + sendMessage(_klaymen, 0x482C, 0); _sprite3->setVisible(false); _sprite4->setVisible(false); _sprite5->setVisible(false); @@ -1170,35 +1170,35 @@ Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int wh _sprite7->setVisible(false); if (which < 0) { - insertKlayman(479, 435); - klaymanFloor(); + insertKlaymen(479, 435); + klaymenFloor(); setMessageList(0x004B60D8); } else if (which == 3) { NPoint pt = _dataResource.getPoint(0x096520ED); - insertKlayman(pt.x, pt.y); - klaymanSlope(); + insertKlaymen(pt.x, pt.y); + klaymenSlope(); setMessageList(0x004B6100); - _klayman->setRepl(64, 0); + _klaymen->setRepl(64, 0); } else if (which == 4) { NPoint pt = _dataResource.getPoint(0x20C6238D); - insertKlayman(pt.x, pt.y); - klaymanSlope(); + insertKlaymen(pt.x, pt.y); + klaymenSlope(); setMessageList(0x004B60F8); - _klayman->setRepl(64, 0); + _klaymen->setRepl(64, 0); } else if (which == 5) { NPoint pt = _dataResource.getPoint(0x2146690D); - insertKlayman(pt.x, pt.y); - klaymanSlope(); + insertKlaymen(pt.x, pt.y); + klaymenSlope(); setMessageList(0x004B6100); - _klayman->setRepl(64, 0); + _klaymen->setRepl(64, 0); } else if (which == 2) { NPoint pt = _dataResource.getPoint(0x104C03ED); - insertKlayman(pt.x, pt.y); - klaymanFloor(); + insertKlaymen(pt.x, pt.y); + klaymenFloor(); setMessageList(0x004B6138); } else { - insertKlayman(135, 444); - klaymanFloor(); + insertKlaymen(135, 444); + klaymenFloor(); setMessageList(0x004B60E0, false); _sprite6->setVisible(true); _sprite7->setVisible(true); @@ -1214,11 +1214,11 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, setMessageList(0x004B6180); } else if (param.asInteger() == 0xB1FDAB2E) { NPoint pt = _dataResource.getPoint(0x0D84A1AD); - _klayman->setX(pt.x); - _klayman->setY(pt.y); - _klayman->updateBounds(); - klaymanFloor(); - _klayman->setClipRect(517, 401, 536, 480); + _klaymen->setX(pt.x); + _klaymen->setY(pt.y); + _klaymen->updateBounds(); + klaymenFloor(); + _klaymen->setClipRect(517, 401, 536, 480); setMessageList(0x004B6198); } else if (param.asInteger() == 0xB00C7C48) { setMessageList(0x004B6108); @@ -1227,71 +1227,71 @@ uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, } else if (param.asInteger() == 0xAC69A28D) { setMessageList(0x004B6168); } else if (param.asInteger() == 0x00086212) { - _klayman->setClipRect(0, 0, 560, 315); - _klayman->setX(560); - _klayman->setY(315); - _klayman->updateBounds(); - klaymanSlope(); + _klaymen->setClipRect(0, 0, 560, 315); + _klaymen->setX(560); + _klaymen->setY(315); + _klaymen->updateBounds(); + klaymenSlope(); setMessageList(0x004B61A0); } else if (param.asInteger() == 0x002CAA68) { setMessageList(0x004B61A8); } break; case 0x482A: - if (_klayman->getX() < 200) { + if (_klaymen->getX() < 200) { setPaletteArea3(); - } else if (_klayman->getX() < 500) { + } else if (_klaymen->getX() < 500) { setSurfacePriority(_sprite5->getSurface(), 1100); - sendMessage(_klayman, 0x482C, 0); + sendMessage(_klaymen, 0x482C, 0); setPaletteArea2(); } else { - _klayman->setClipRect(517, 401, 536, 480); + _klaymen->setClipRect(517, 401, 536, 480); setPaletteArea2(); } break; case 0x482B: _sprite6->setVisible(false); _sprite7->setVisible(false); - _klayman->setClipRect(0, 0, 640, 480); + _klaymen->setClipRect(0, 0, 640, 480); setSurfacePriority(_sprite5->getSurface(), 900); - sendMessage(_klayman, 0x482C, 0x2086222D); + sendMessage(_klaymen, 0x482C, 0x2086222D); break; } return 0; } -void Scene2803Small::upKlaymanSlope() { - if (_klayman->getX() < 388) { - _klayman->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); +void Scene2803Small::upKlaymenSlope() { + if (_klaymen->getX() < 388) { + _klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); setPaletteArea0(); - } else if (_klayman->getX() < 500) { - _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + } else if (_klaymen->getX() < 500) { + _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); setPaletteArea1(); } Scene::update(); } -void Scene2803Small::upKlaymanFloor() { - if (_klayman->getX() > 194 && _klayman->getX() < 273) +void Scene2803Small::upKlaymenFloor() { + if (_klaymen->getX() > 194 && _klaymen->getX() < 273) setPaletteArea2(); - else if (_klayman->getX() > 155 && _klayman->getX() < 300) + else if (_klaymen->getX() > 155 && _klaymen->getX() < 300) setPaletteArea0(); Scene::update(); } -void Scene2803Small::klaymanSlope() { - SetUpdateHandler(&Scene2803Small::upKlaymanSlope); - sendMessage(_klayman, 0x482C, 0x23C630D9); - _klayman->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); - _klayman->setRepl(64, 0); +void Scene2803Small::klaymenSlope() { + SetUpdateHandler(&Scene2803Small::upKlaymenSlope); + sendMessage(_klaymen, 0x482C, 0x23C630D9); + _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + _klaymen->setRepl(64, 0); _sprite1->setVisible(true); } -void Scene2803Small::klaymanFloor() { - SetUpdateHandler(&Scene2803Small::upKlaymanFloor); - sendMessage(_klayman, 0x482C, 0x2086222D); - _klayman->setClipRect(0, 0, 640, 480); - _klayman->clearRepl(); +void Scene2803Small::klaymenFloor() { + SetUpdateHandler(&Scene2803Small::upKlaymenFloor); + sendMessage(_klaymen, 0x482C, 0x2086222D); + _klaymen->setClipRect(0, 0, 640, 480); + _klaymen->clearRepl(); _sprite1->setVisible(false); } @@ -1821,7 +1821,7 @@ void Scene2804::update() { if (_isSolved) { _palette->fillBaseWhite(0, 256); _palette->startFadeToPalette(18); - setGlobalVar(V_KLAYMAN_SMALL, 1); + setGlobalVar(V_KLAYMEN_SMALL, 1); _countdown1 = 48; } } else if (_beamStatus == 6) { @@ -1853,31 +1853,31 @@ Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x020CE421, 1100); if (which < 0) { - insertKlayman(380, 338); + insertKlaymen(380, 338); setMessageList(0x004AE1C8); sendMessage(this, 0x2000, 0); } else if (which == 1) { - insertKlayman(493, 338); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(493, 338); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004AE1D0, false); sendMessage(this, 0x2000, 1); } else if (which == 2) { - insertKlayman(493, 338); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(493, 338); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004AE288, false); sendMessage(this, 0x2000, 1); } else if (which == 3) { - insertKlayman(493, 338); - sendMessage(_klayman, 0x2000, 1); + insertKlaymen(493, 338); + sendMessage(_klaymen, 0x2000, 1); setMessageList(0x004AE1E0, false); sendMessage(this, 0x2000, 1); } else { - insertKlayman(340, 338); + insertKlaymen(340, 338); setMessageList(0x004AE1C0); sendMessage(this, 0x2000, 0); } - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); } @@ -1887,10 +1887,10 @@ uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entit case 0x2000: if (param.asInteger()) { setRectList(0x004AE318); - _klayman->setKlaymanIdleTable3(); + _klaymen->setKlaymenIdleTable3(); } else { setRectList(0x004AE308); - _klayman->setKlaymanIdleTable1(); + _klaymen->setKlaymenIdleTable1(); } break; } @@ -1979,20 +1979,20 @@ Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[3].x2 = 640; if (which < 0) { - insertKlayman(441, 423, false, _clipRects, 4); + insertKlaymen(441, 423, false, _clipRects, 4); setMessageList(0x004AF098); } else if (which == 1) { - insertKlayman(378, 423, false, _clipRects, 4); + insertKlaymen(378, 423, false, _clipRects, 4); setMessageList(0x004AF098); } else if (which == 2) { - insertKlayman(378, 423, false, _clipRects, 4); + insertKlaymen(378, 423, false, _clipRects, 4); setMessageList(0x004AF0C8, false); } else if (which == 3) { - insertKlayman(378, 423, true, _clipRects, 4); + insertKlaymen(378, 423, true, _clipRects, 4); setMessageList(0x004AF0A0, false); - setGlobalVar(V_KLAYMAN_SMALL, 0); + setGlobalVar(V_KLAYMEN_SMALL, 0); } else { - insertKlayman(670, 423, false, _clipRects, 4); + insertKlaymen(670, 423, false, _clipRects, 4); setMessageList(0x004AF090); } @@ -2032,7 +2032,7 @@ void Scene2806::findClosestPoint() { 0x086B8890 }; - int16 x = MIN(_klayman->getX(), 639); + int16 x = MIN(_klaymen->getX(), 639); int index = 1; while (index < (int)_pointList->size() && (*_pointList)[index].x < x) @@ -2565,20 +2565,20 @@ Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[3].x1 = 0; if (which < 0) { - insertKlayman(226, 423, false, _clipRects, 4); + insertKlaymen(226, 423, false, _clipRects, 4); setMessageList(0x004B5B90); } else if (which == 1) { - insertKlayman(262, 423, false, _clipRects, 4); + insertKlaymen(262, 423, false, _clipRects, 4); setMessageList(0x004B5B90); } else if (which == 2) { - insertKlayman(262, 423, false, _clipRects, 4); + insertKlaymen(262, 423, false, _clipRects, 4); setMessageList(0x004B5BD0); } else if (which == 3) { - insertKlayman(262, 423, true, _clipRects, 4); + insertKlaymen(262, 423, true, _clipRects, 4); setMessageList(0x004B5BA8, false); - setGlobalVar(V_KLAYMAN_SMALL, 0); + setGlobalVar(V_KLAYMEN_SMALL, 0); } else { - insertKlayman(-30, 423, false, _clipRects, 4); + insertKlaymen(-30, 423, false, _clipRects, 4); setMessageList(0x004B5B88); } @@ -2618,7 +2618,7 @@ void Scene2809::findClosestPoint() { 0x6A8B9008 }; - int16 x = MAX(_klayman->getX(), 2); + int16 x = MAX(_klaymen->getX(), 2); int index = 1; while (index < (int)_pointList->size() && (*_pointList)[index].x >= x) @@ -2683,7 +2683,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _clipRects[1].x2 = _sprite6->getDrawRect().x2(); _clipRects[1].y2 = 480; - if (getGlobalVar(V_KLAYMAN_SMALL)) { + if (getGlobalVar(V_KLAYMEN_SMALL)) { _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); addCollisionSprite(_asTape); } else { @@ -2695,7 +2695,7 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) if (getGlobalVar(V_LADDER_DOWN)) { setGlobalVar(V_BEEN_STATUE_ROOM, 1); - if (getGlobalVar(V_KLAYMAN_SMALL)) { + if (getGlobalVar(V_KLAYMEN_SMALL)) { _sprite4 = insertStaticSprite(0x82653808, 100); } else { _sprite4 = insertStaticSprite(0x82653808, 1100); @@ -2704,30 +2704,30 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } if (which < 0) { - if (getGlobalVar(V_KLAYMAN_SMALL)) { - insertKlayman(240, 448); - _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + if (getGlobalVar(V_KLAYMEN_SMALL)) { + insertKlaymen(240, 448); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE438); setRectList(0x004AE810); _isRopingDown = false; removeCollisionSprite(_asTape); } else { - insertKlayman(300, 424, _clipRects, 2); + insertKlaymen(300, 424, _clipRects, 2); setMessageList(0x004AE438); if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); - tempSprite = insertSprite(_klayman); + tempSprite = insertSprite(_klaymen); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); _clipRects[0].y1 = _sprite1->getDrawRect().y; _isRopingDown = false; } } else if (which == 1) { - insertKlayman(186, 64, _clipRects, 2); + insertKlaymen(186, 64, _clipRects, 2); setMessageList(0x004AE440); loadDataResource(0x84130112); - tempSprite = insertSprite(_klayman); + tempSprite = insertSprite(_klaymen); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); _isRopingDown = true; _clipRects[0].y1 = _sprite1->getDrawRect().y; @@ -2736,27 +2736,27 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) _sprite2 = insertStaticSprite(0x02780936, 1100); _sprite3 = insertStaticSprite(0x1CA02160, 1100); _asRope = insertSprite(this, 384); - insertKlayman(384, 0, _clipRects, 0); - sendEntityMessage(_klayman, 0x1014, _asRope); + insertKlaymen(384, 0, _clipRects, 0); + sendEntityMessage(_klaymen, 0x1014, _asRope); setMessageList(0x004AE738); - _klayman->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); _vm->_soundMan->addSound(0x84400112, 0xC874EE6C); _vm->_soundMan->playSoundLooping(0xC874EE6C); _vm->_soundMan->setSoundVolume(0xC874EE6C, 50); _isRopingDown = false; } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { - if (getGlobalVar(V_KLAYMAN_SMALL)) { - insertKlayman((int16)getGlobalVar(V_KLAYMAN_SAVED_X), 448); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) - _klayman->setDoDeltaX(1); - _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + if (getGlobalVar(V_KLAYMEN_SMALL)) { + insertKlaymen((int16)getGlobalVar(V_KLAYMEN_SAVED_X), 448); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE6D8); setRectList(0x004AE810); _isRopingDown = false; removeCollisionSprite(_asTape); } else { - insertKlaymanLadder(); + insertKlaymenLadder(); if (getGlobalVar(V_LADDER_DOWN_ACTION)) { setMessageList(0x004AE6E8); setGlobalVar(V_LADDER_DOWN_ACTION, 0); @@ -2767,32 +2767,32 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } } } else if (which >= 15 && which <= 18) { - insertKlaymanLadder(); + insertKlaymenLadder(); setMessageList(0x004AE6E0); _isRopingDown = false; } else if (which == 4) { - if (getGlobalVar(V_KLAYMAN_SMALL)) { - insertKlayman(473, 448); - _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + if (getGlobalVar(V_KLAYMEN_SMALL)) { + insertKlaymen(473, 448); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE428); setRectList(0x004AE810); _isRopingDown = false; removeCollisionSprite(_asTape); } else { - insertKlayman(450, 424, _clipRects, 2); + insertKlaymen(450, 424, _clipRects, 2); setMessageList(0x004AE418); if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); - tempSprite = insertSprite(_klayman); + tempSprite = insertSprite(_klaymen); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); _clipRects[0].y1 = _sprite1->getDrawRect().y; _isRopingDown = false; } } else { - insertKlayman(120, 448); - _klayman->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + insertKlaymen(120, 448); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); setMessageList(0x004AE410); setRectList(0x004AE810); _isRopingDown = false; @@ -2802,27 +2802,27 @@ Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) } Scene2810::~Scene2810() { - setGlobalVar(V_KLAYMAN_IS_DELTA_X, _klayman->isDoDeltaX() ? 1 : 0); - setGlobalVar(V_KLAYMAN_SAVED_X, _klayman->getX()); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_SAVED_X, _klaymen->getX()); _vm->_soundMan->deleteSoundGroup(0x84400112); } -void Scene2810::insertKlaymanLadder() { +void Scene2810::insertKlaymenLadder() { Sprite *tempSprite; if (getGlobalVar(V_LADDER_DOWN_ACTION)) { - insertKlayman(430, 424, _clipRects, 2); - _klayman->setDoDeltaX(1); + insertKlaymen(430, 424, _clipRects, 2); + _klaymen->setDoDeltaX(1); } else { - insertKlayman((int16)getGlobalVar(V_KLAYMAN_SAVED_X), 424, _clipRects, 2); - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) - _klayman->setDoDeltaX(1); + insertKlaymen((int16)getGlobalVar(V_KLAYMEN_SAVED_X), 424, _clipRects, 2); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); } if (getGlobalVar(V_LADDER_DOWN)) loadDataResource(0x84130112); else loadDataResource(0x84500132); - tempSprite = insertSprite(_klayman); + tempSprite = insertSprite(_klaymen); tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); _clipRects[0].y1 = _sprite1->getDrawRect().y; } @@ -2872,8 +2872,8 @@ uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entit _isRopingDown = false; break; case 0x4826: - if (sender == _asTape && getGlobalVar(V_KLAYMAN_SMALL) == 0 && !_isRopingDown) { - sendEntityMessage(_klayman, 0x1014, _asTape); + if (sender == _asTape && getGlobalVar(V_KLAYMEN_SMALL) == 0 && !_isRopingDown) { + sendEntityMessage(_klaymen, 0x1014, _asTape); setMessageList(0x004AE750); } break; @@ -3013,34 +3013,34 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) if (which < 0) { _isRopingDown = false; - insertKlayman(272, 432); + insertKlaymen(272, 432); setMessageList(0x004AF560); _sprite1->setVisible(false); - _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); } else if (which == 1) { _isRopingDown = false; - insertKlayman(338, 398); + insertKlaymen(338, 398); setMessageList(0x004AF588); setPaletteArea1(true); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); } else if (which == 2) { _isRopingDown = false; - if (getGlobalVar(V_KLAYMAN_IS_DELTA_X)) { - insertKlayman(554, 432); - _klayman->setDoDeltaX(1); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(554, 432); + _klaymen->setDoDeltaX(1); } else { - insertKlayman(394, 432); + insertKlaymen(394, 432); } setMessageList(0x004AF5F0); _sprite1->setVisible(false); - _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); } else { _isRopingDown = true; - insertKlayman(150, 582); + insertKlaymen(150, 582); setMessageList(0x004AF568); setPaletteArea2(true); _sprite1->setVisible(false); - _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); } _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); @@ -3048,9 +3048,9 @@ Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) } void Scene2812::update() { - if (_klayman->getX() < 220) + if (_klaymen->getX() < 220) setPaletteArea2(false); - else if (_klayman->getX() < 240) + else if (_klaymen->getX() < 240) setPaletteArea0(false); Scene::update(); } @@ -3060,17 +3060,17 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit switch (messageNum) { case 0x100D: if (param.asInteger() == 0x0004269B) - sendEntityMessage(_klayman, 0x1014, _asRope); + sendEntityMessage(_klaymen, 0x1014, _asRope); break; case 0x2001: _isRopingDown = true; setRectList(0x004AF710); - _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2()); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2()); break; case 0x2002: _isRopingDown = false; setRectList(0x004AF700); - _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); break; case 0x4806: sendMessage(_asWinch, 0x2000, 0); @@ -3078,22 +3078,22 @@ uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _ssTape && !_isRopingDown) { - sendEntityMessage(_klayman, 0x1014, _ssTape); + sendEntityMessage(_klaymen, 0x1014, _ssTape); setMessageList(0x004AF658); } else if (sender == _asKey && !_isRopingDown) { - sendEntityMessage(_klayman, 0x1014, _asKey); + sendEntityMessage(_klaymen, 0x1014, _asKey); setMessageList(0x004AF668); } break; case 0x482A: setPaletteArea1(false); _sprite1->setVisible(true); - _klayman->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); break; case 0x482B: setPaletteArea0(false); _sprite1->setVisible(false); - _klayman->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); break; } return messageResult; diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h index a341c23944..970de3cbdf 100644 --- a/engines/neverhood/module2800.h +++ b/engines/neverhood/module2800.h @@ -124,9 +124,9 @@ protected: NRect _clipRectsStairs[3]; int _paletteArea; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void upKlaymanStairs(); - void klaymanStairs(); - void klaymanFloor(); + void upKlaymenStairs(); + void klaymenStairs(); + void klaymenFloor(); void toggleBackground(); void changeBackground(); void setPaletteArea0(); @@ -147,10 +147,10 @@ protected: Sprite *_sprite6; Sprite *_sprite7; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void upKlaymanSlope(); - void upKlaymanFloor(); - void klaymanSlope(); - void klaymanFloor(); + void upKlaymenSlope(); + void upKlaymenFloor(); + void klaymenSlope(); + void klaymenFloor(); void setPaletteArea0(); void setPaletteArea1(); void setPaletteArea2(); @@ -437,7 +437,7 @@ protected: bool _isRopingDown; NRect _clipRects[2]; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void insertKlaymanLadder(); + void insertKlaymenLadder(); }; class AsScene2812Winch : public AnimatedSprite { diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 269d13ded2..2fce4ba18e 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -540,10 +540,10 @@ HitRectList *DataResource::getHitRectList() { return drDirectoryItem ? _hitRectLists[drDirectoryItem->offset] : NULL; } -MessageList *DataResource::getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY) { +MessageList *DataResource::getMessageListAtPos(int16 klaymenX, int16 klaymenY, int16 mouseX, int16 mouseY) { for (uint i = 0; i < _drRects.size(); i++) { - if (klaymanX >= _drRects[i].rect.x1 && klaymanX <= _drRects[i].rect.x2 && - klaymanY >= _drRects[i].rect.y1 && klaymanY <= _drRects[i].rect.y2) { + if (klaymenX >= _drRects[i].rect.x1 && klaymenX <= _drRects[i].rect.x2 && + klaymenY >= _drRects[i].rect.y1 && klaymenY <= _drRects[i].rect.y2) { DRSubRectList *drSubRectList = _drSubRectLists[_drRects[i].subRectIndex]; for (uint j = 0; j < drSubRectList->size(); j++) { DRSubRect &subRect = (*drSubRectList)[j]; diff --git a/engines/neverhood/resource.h b/engines/neverhood/resource.h index e2609b6fd2..6a84a69ecd 100644 --- a/engines/neverhood/resource.h +++ b/engines/neverhood/resource.h @@ -163,7 +163,7 @@ public: NPointArray *getPointArray(uint32 nameHash); NRectArray *getRectArray(uint32 nameHash); HitRectList *getHitRectList(); - MessageList *getMessageListAtPos(int16 klaymanX, int16 klaymanY, int16 mouseX, int16 mouseY); + MessageList *getMessageListAtPos(int16 klaymenX, int16 klaymenY, int16 mouseX, int16 mouseY); protected: struct DRDirectoryItem { diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 63242a41c7..2705668c00 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -27,7 +27,7 @@ namespace Neverhood { Scene::Scene(NeverhoodEngine *vm, Module *parentModule) : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL) { - _isKlaymanBusy = false; + _isKlaymenBusy = false; _doConvertMessages = false; _messageList = NULL; _rectType = 0; @@ -35,7 +35,7 @@ Scene::Scene(NeverhoodEngine *vm, Module *parentModule) _mouseClickPos.y = 0; _mouseClicked = false; _rectList = NULL; - _klayman = NULL; + _klaymen = NULL; _mouseCursor = NULL; _palette = NULL; _background = NULL; @@ -228,15 +228,15 @@ SmackerPlayer *Scene::addSmackerPlayer(SmackerPlayer *smackerPlayer) { void Scene::update() { if (_mouseClicked) { - if (_klayman) { + if (_klaymen) { if (_canAcceptInput && - _klayman->hasMessageHandler() && - sendMessage(_klayman, 0x1008, 0) != 0 && + _klaymen->hasMessageHandler() && + sendMessage(_klaymen, 0x1008, 0) != 0 && queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { _mouseClicked = false; } else if (_canAcceptInput && - _klayman->hasMessageHandler() && - sendMessage(_klayman, 0x1008, 0) != 0) { + _klaymen->hasMessageHandler() && + sendMessage(_klaymen, 0x1008, 0) != 0) { _mouseClicked = !queryPositionRectList(_mouseClickPos.x, _mouseClickPos.y); } } else if (queryPositionSprite(_mouseClickPos.x, _mouseClickPos.y)) { @@ -270,13 +270,13 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s sendMessage(_parentModule, 0x1009, param); break; case 0x1006: - // Sent by Klayman when its animation sequence has finished - if (_isKlaymanBusy) { - _isKlaymanBusy = false; + // Sent by Klaymen when its animation sequence has finished + if (_isKlaymenBusy) { + _isKlaymenBusy = false; if (_messageListIndex == _messageListCount) { // If the current message list was processed completely, - // sent Klayman into the idle state. - sendMessage(_klayman, 0x4004, 0); + // sent Klaymen into the idle state. + sendMessage(_klaymen, 0x4004, 0); } else { // Else continue with the next message in the current message list processMessageList(); @@ -285,11 +285,11 @@ uint32 Scene::handleMessage(int messageNum, const MessageParam ¶m, Entity *s break; case 0x1007: // This isn't sent by any code, check if it's in a message list - // This cancels the current message list and sets Klayman into the idle state. - if (_isKlaymanBusy) { - _isKlaymanBusy = false; + // This cancels the current message list and sets Klaymen into the idle state. + if (_isKlaymenBusy) { + _isKlaymenBusy = false; _messageList = NULL; - sendMessage(_klayman, 0x4004, 0); + sendMessage(_klaymen, 0x4004, 0); } break; case 0x101D: @@ -325,13 +325,13 @@ bool Scene::queryPositionSprite(int16 mouseX, int16 mouseY) { } bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { - int16 klaymanX = _klayman->getX(); - int16 klaymanY = _klayman->getY(); + int16 klaymenX = _klaymen->getX(); + int16 klaymenY = _klaymen->getY(); if (_rectType == 1) { RectList &rectList = *_rectList; for (uint i = 0; i < rectList.size(); i++) { - debug(2, "(%d, %d) ? (%d, %d, %d, %d)", klaymanX, klaymanY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2); - if (rectList[i].rect.contains(klaymanX, klaymanY)) { + debug(2, "(%d, %d) ? (%d, %d, %d, %d)", klaymenX, klaymenY, rectList[i].rect.x1, rectList[i].rect.y1, rectList[i].rect.x2, rectList[i].rect.y2); + if (rectList[i].rect.contains(klaymenX, klaymenY)) { for (uint j = 0; j < rectList[i].subRects.size(); j++) { debug(2, " (%d, %d) ? (%d, %d, %d, %d)", mouseX, mouseY, rectList[i].subRects[j].rect.x1, rectList[i].subRects[j].rect.y1, rectList[i].subRects[j].rect.x2, rectList[i].subRects[j].rect.y2); if (rectList[i].subRects[j].rect.contains(mouseX, mouseY)) { @@ -341,7 +341,7 @@ bool Scene::queryPositionRectList(int16 mouseX, int16 mouseY) { } } } else if (_rectType == 2) { - MessageList *messageList = _dataResource.getMessageListAtPos(klaymanX, klaymanY, mouseX, mouseY); + MessageList *messageList = _dataResource.getMessageListAtPos(klaymenX, klaymenY, mouseX, mouseY); if (messageList && messageList->size()) setMessageList2(messageList, true, true); } @@ -356,11 +356,11 @@ void Scene::setMessageList(MessageList *messageList, bool canAcceptInput, bool d _messageList = messageList; _messageListCount = _messageList ? _messageList->size() : 0; _messageListIndex = 0; - _isKlaymanBusy = false; + _isKlaymenBusy = false; _canAcceptInput = canAcceptInput; _doConvertMessages = doConvertMessages; _messageListStatus = 1; - sendMessage(_klayman, 0x101C, 0); + sendMessage(_klaymen, 0x101C, 0); } bool Scene::setMessageList2(uint32 id, bool canAcceptInput, bool doConvertMessages) { @@ -385,9 +385,9 @@ bool Scene::isMessageList2(uint32 id) { } void Scene::processMessageList() { - debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymanBusy = %d", _isMessageListBusy, _isKlaymanBusy); + debug(7, "Scene::processMessageList() _isMessageListBusy = %d; _isKlaymenBusy = %d", _isMessageListBusy, _isKlaymenBusy); - if (_isMessageListBusy || _isKlaymanBusy) + if (_isMessageListBusy || _isKlaymenBusy) return; _isMessageListBusy = true; @@ -397,7 +397,7 @@ void Scene::processMessageList() { _messageListStatus = 0; } - if (_messageList && _klayman) { + if (_messageList && _klaymen) { #if 0 debug("MessageList: %p, %d", (void*)_messageList, _messageList->size()); @@ -408,13 +408,13 @@ void Scene::processMessageList() { debug("--------------------------------"); #endif - while (_messageList && _messageListIndex < _messageListCount && !_isKlaymanBusy) { + while (_messageList && _messageListIndex < _messageListCount && !_isKlaymenBusy) { uint32 messageNum = (*_messageList)[_messageListIndex].messageNum; uint32 messageParam = (*_messageList)[_messageListIndex].messageValue; ++_messageListIndex; if (_messageListIndex == _messageListCount) - sendMessage(_klayman, 0x1021, 0); + sendMessage(_klaymen, 0x1021, 0); if (_doConvertMessages) messageNum = convertMessageNum(messageNum); if (messageNum == 0x1009 || messageNum == 0x1024) { @@ -423,8 +423,8 @@ void Scene::processMessageList() { _messageValue = messageParam; sendMessage(_parentModule, messageNum, messageParam); } else if (messageNum == 0x4001) { - _isKlaymanBusy = true; - sendPointMessage(_klayman, 0x4001, _mouseClickPos); + _isKlaymenBusy = true; + sendPointMessage(_klaymen, 0x4001, _mouseClickPos); } else if (messageNum == 0x100D) { if (this->hasMessageHandler() && sendMessage(this, 0x100D, messageParam) != 0) continue; @@ -440,9 +440,9 @@ void Scene::processMessageList() { return; } } else if (messageNum != 0x4003) { - _isKlaymanBusy = true; - if (_klayman->hasMessageHandler() && sendMessage(_klayman, messageNum, messageParam) != 0) { - _isKlaymanBusy = false; + _isKlaymenBusy = true; + if (_klaymen->hasMessageHandler() && sendMessage(_klaymen, messageNum, messageParam) != 0) { + _isKlaymenBusy = false; } } if (_messageListIndex == _messageListCount) { @@ -457,10 +457,10 @@ void Scene::processMessageList() { } void Scene::cancelMessageList() { - _isKlaymanBusy = false; + _isKlaymenBusy = false; _messageList = NULL; _canAcceptInput = true; - sendMessage(_klayman, 0x4004, 0); + sendMessage(_klaymen, 0x4004, 0); } void Scene::setRectList(uint32 id) { @@ -488,8 +488,8 @@ void Scene::loadHitRectList() { void Scene::loadDataResource(uint32 fileHash) { _dataResource.load(fileHash); _rectType = 2; - if (_klayman) - _klayman->loadDataResource(fileHash); + if (_klaymen) + _klaymen->loadDataResource(fileHash); } uint16 Scene::convertMessageNum(uint32 messageNum) { diff --git a/engines/neverhood/scene.h b/engines/neverhood/scene.h index 39455c78fa..1abcbfb964 100644 --- a/engines/neverhood/scene.h +++ b/engines/neverhood/scene.h @@ -28,7 +28,7 @@ #include "neverhood/background.h" #include "neverhood/entity.h" #include "neverhood/graphics.h" -#include "neverhood/klayman.h" +#include "neverhood/klaymen.h" #include "neverhood/module.h" #include "neverhood/palette.h" #include "neverhood/smackerplayer.h" @@ -72,34 +72,34 @@ public: void removeCollisionSprite(Sprite *sprite); void checkCollision(Sprite *sprite, uint16 flags, int messageNum, uint32 messageParam); // Some crazy templated functions to make the logic code smaller/simpler (imo!) - // insertKlayman + // insertKlaymen template - void insertKlayman() { - _klayman = (T*)addSprite(new T(_vm, this)); + void insertKlaymen() { + _klaymen = (T*)addSprite(new T(_vm, this)); } template - void insertKlayman(Arg1 arg1) { - _klayman = (T*)addSprite(new T(_vm, this, arg1)); + void insertKlaymen(Arg1 arg1) { + _klaymen = (T*)addSprite(new T(_vm, this, arg1)); } template - void insertKlayman(Arg1 arg1, Arg2 arg2) { - _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2)); + void insertKlaymen(Arg1 arg1, Arg2 arg2) { + _klaymen = (T*)addSprite(new T(_vm, this, arg1, arg2)); } template - void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3) { - _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3)); + void insertKlaymen(Arg1 arg1, Arg2 arg2, Arg3 arg3) { + _klaymen = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3)); } template - void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) { - _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4)); + void insertKlaymen(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4) { + _klaymen = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4)); } template - void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) { - _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5)); + void insertKlaymen(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5) { + _klaymen = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5)); } template - void insertKlayman(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { - _klayman = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5, arg6)); + void insertKlaymen(Arg1 arg1, Arg2 arg2, Arg3 arg3, Arg4 arg4, Arg5 arg5, Arg6 arg6) { + _klaymen = (T*)addSprite(new T(_vm, this, arg1, arg2, arg3, arg4, arg5, arg6)); } // insertSprite template @@ -164,7 +164,7 @@ protected: Common::Array _entities; Common::Array _surfaces; - Klayman *_klayman; + Klaymen *_klaymen; Background *_background; Palette *_palette; SmackerPlayer *_smackerPlayer; @@ -177,7 +177,7 @@ protected: bool _doConvertMessages; bool _canAcceptInput; - bool _isKlaymanBusy; + bool _isKlaymenBusy; bool _isMessageListBusy; Mouse *_mouseCursor; -- cgit v1.2.3 From 490d447ed19d481c9e15847c9bb43223b71c7847 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 22 Jan 2013 12:13:34 +0000 Subject: NEVERHOOD: Implement restart functionality (from both main menu and game logic) - Some minor cleanup --- engines/neverhood/gamemodule.cpp | 29 ++++++++------ engines/neverhood/gamemodule.h | 2 + engines/neverhood/gamevars.cpp | 5 +++ engines/neverhood/gamevars.h | 1 + engines/neverhood/menumodule.cpp | 82 ++++++++++++++++++---------------------- engines/neverhood/module1600.cpp | 8 +--- engines/neverhood/module1900.cpp | 20 +++++----- engines/neverhood/neverhood.cpp | 2 - 8 files changed, 74 insertions(+), 75 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index cf56522fbd..fa8a6d5d29 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -75,7 +75,7 @@ enum { GameModule::GameModule(NeverhoodEngine *vm) : Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1), - _mainMenuRequested(false), _gameWasLoaded(false) { + _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) { // Other initializations moved to actual engine class _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079); @@ -400,9 +400,9 @@ void GameModule::startup() { // <<gameState().which = 1; - _vm->gameState().sceneNum = 1; - createModule(1000, -1); + _vm->gameState().which = 0; + _vm->gameState().sceneNum = 8; + createModule(1800, -1); #endif #if 0 _vm->gameState().sceneNum = 5; @@ -473,7 +473,17 @@ void GameModule::restoreGame() { createModuleByHash(getGlobalVar(V_MODULE_NAME)); } +void GameModule::requestRestartGame(bool requestMainMenu) { + _restartGameRequested = true; + _mainMenuRequested = requestMainMenu; +} + void GameModule::checkMainMenu() { + if (_restartGameRequested) { + _restartGameRequested = false; + _vm->_gameVars->clear(); + restoreGame(); + } if (_mainMenuRequested) openMainMenu(); } @@ -646,7 +656,8 @@ void GameModule::createModuleByHash(uint32 nameHash) { createModule(3000, -1); break; default: - error("GameModule::createModuleByHash() Unknown module name %08X", nameHash); + createModule(1000, 0); + break; } } @@ -673,9 +684,7 @@ void GameModule::updateModule() { case 1300: if (_moduleResult == 1) { // The game was successfully finished - // TODO Restart the game/show main menu - // TODO _gameState.clear(); - // TODO GameModule_handleKeyEscape + requestRestartGame(true); } else createModule(2900, 0); break; @@ -702,9 +711,7 @@ void GameModule::updateModule() { case 1800: if (_moduleResult == 1) { // Game over, Klaymen jumped into the hole - // TODO Restart the game/show main menu - // TODO _gameState.clear(); - // TODO GameModule_handleKeyEscape + requestRestartGame(true); } else if (_moduleResult == 2) createModule(2700, 0); else if (_moduleResult == 3) diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index ee6b000533..b212a1905c 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -34,6 +34,7 @@ public: virtual ~GameModule(); void startup(); void restoreGame(); + void requestRestartGame(bool requestMainMenu); void checkMainMenu(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); @@ -57,6 +58,7 @@ protected: Entity *_prevChildObject; int _prevModuleNum; bool _gameWasLoaded; + bool _restartGameRequested; bool _mainMenuRequested; bool _someFlag1; bool _field2C; diff --git a/engines/neverhood/gamevars.cpp b/engines/neverhood/gamevars.cpp index 57d9547ac2..87f5fe6dd9 100644 --- a/engines/neverhood/gamevars.cpp +++ b/engines/neverhood/gamevars.cpp @@ -28,6 +28,11 @@ GameVars::GameVars() { addVar(0, 0); } +void GameVars::clear() { + _vars.clear(); + addVar(0, 0); +} + void GameVars::loadState(Common::InSaveFile *in) { uint varCount; _vars.clear(); diff --git a/engines/neverhood/gamevars.h b/engines/neverhood/gamevars.h index 3672aa6e45..5337c13394 100644 --- a/engines/neverhood/gamevars.h +++ b/engines/neverhood/gamevars.h @@ -172,6 +172,7 @@ struct GameVar { class GameVars { public: GameVars(); + void clear(); void loadState(Common::InSaveFile *in); void saveState(Common::OutSaveFile *out); uint32 getGlobalVar(uint32 nameHash); diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 71b216b940..b86fc7095a 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -21,6 +21,7 @@ */ #include "neverhood/menumodule.h" +#include "neverhood/gamemodule.h" namespace Neverhood { @@ -31,6 +32,18 @@ enum { SAVE_GAME_MENU = 3 }; +enum { + kMainMenuRestartGame = 0, + kMainMenuLoadGame = 1, + kMainMenuSaveGame = 2, + kMainMenuResumeGame = 3, + kMainMenuQuitGame = 4, + kMainMenuCredits = 5, + kMainMenuMakingOf = 6, + kMainMenuToggleMusic = 7, + kMainMenuDeleteGame = 8 +}; + static const uint32 kMakingOfSmackerFileHashList[] = { 0x21082409, 0x21082809, @@ -97,42 +110,34 @@ void MenuModule::updateScene() { case MAIN_MENU: // TODO switch (_moduleResult) { - case 0: - // 0048A2A5 - debug("RESTART GAME"); + case kMainMenuRestartGame: + _vm->_gameModule->requestRestartGame(false); + leaveModule(0); break; - case 1: - debug("LOAD GAME"); + case kMainMenuLoadGame: // TODO createLoadGameMenu(); break; - case 2: - debug("SAVE GAME"); + case kMainMenuSaveGame: createScene(SAVE_GAME_MENU, -1); break; - case 3: - debug("RESUME GAME"); + case kMainMenuResumeGame: leaveModule(0); break; - case 4: - debug("QUIT GAME"); + case kMainMenuQuitGame: leaveModule(0); _vm->quitGame(); break; - case 5: - debug("CREDITS"); + case kMainMenuCredits: createScene(CREDITS_SCENE, -1); break; - case 6: - debug("MAKING OF"); + case kMainMenuMakingOf: createScene(MAKING_OF, -1); break; - case 7: - debug("TOGGLE MUSIC"); + case kMainMenuToggleMusic: // TODO Toggle music 0048A367 createScene(MAIN_MENU, -1); break; - case 8: - debug("DELETE GAME"); + case kMainMenuDeleteGame: // TODO createDeleteGameMenu(); break; default: @@ -270,30 +275,14 @@ uint32 MainMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity } static const uint32 kCreditsSceneFileHashes[] = { - 0x6081128C, - 0x608112BC, - 0x608112DC, - 0x6081121C, - 0x6081139C, - 0x6081109C, - 0x6081169C, - 0x60811A9C, - 0x6081029C, - 0x0081128C, - 0x008112BC, - 0x008012BC, - 0x008112DC, - 0x0081121C, - 0x0081139C, - 0x0081109C, - 0x0081169C, - 0x00811A9C, - 0x0081029C, - 0x0081329C, - 0xC08112BC, - 0xC08112DC, - 0xC081121C, - 0xC081139C, + 0x6081128C, 0x608112BC, 0x608112DC, + 0x6081121C, 0x6081139C, 0x6081109C, + 0x6081169C, 0x60811A9C, 0x6081029C, + 0x0081128C, 0x008112BC, 0x008012BC, + 0x008112DC, 0x0081121C, 0x0081139C, + 0x0081109C, 0x0081169C, 0x00811A9C, + 0x0081029C, 0x0081329C, 0xC08112BC, + 0xC08112DC, 0xC081121C, 0xC081139C, 0 }; @@ -353,7 +342,7 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En case 0x0009: leaveScene(0); break; - case 0x000B://TODO Implement this message + case 0x000B: if (param.asInteger() == Common::KEYCODE_ESCAPE && _canAbort) leaveScene(0); break; @@ -388,6 +377,7 @@ void WidgetScene::setCurrWidget(Widget *newWidget) { } void WidgetScene::handleEvent(int16 itemID, int eventType) { + // Empty } Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, @@ -403,7 +393,7 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene void Widget::onClick() { _parentScene->setCurrWidget(this); - // TODO _parentScene->onClick(_itemID, 0); + // TODO? _parentScene->onClick(_itemID, 0); } void Widget::setPosition(int16 x, int16 y) { @@ -490,7 +480,7 @@ void TextLabelWidget::clear() { void TextLabelWidget::onClick() { Widget::onClick(); - // TODO Click handler? + // TODO? Click handler } void TextLabelWidget::setString(const byte *string, int stringLen) { diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp index bb6874ee03..cc1aa2c3de 100644 --- a/engines/neverhood/module1600.cpp +++ b/engines/neverhood/module1600.cpp @@ -28,12 +28,8 @@ namespace Neverhood { static const uint32 kModule1600SoundList[] = { - 0x90805C50, - 0x90804450, - 0xB4005E60, - 0x91835066, - 0x90E14440, - 0 + 0x90805C50, 0x90804450, 0xB4005E60, + 0x91835066, 0x90E14440, 0 }; Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp index 31bf05b6ee..348306f39b 100644 --- a/engines/neverhood/module1900.cpp +++ b/engines/neverhood/module1900.cpp @@ -199,9 +199,9 @@ AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene } void AsScene1907Symbol::update() { - AnimatedSprite::updateAnim(); + updateAnim(); handleSpriteUpdate(); - AnimatedSprite::updatePosition(); + updatePosition(); if (_plugInFailed && _plugInTryCount == 0) _plugInFailed = false; } @@ -488,8 +488,8 @@ AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) } void AsScene1907WaterHint::update() { - AnimatedSprite::updateAnim(); - AnimatedSprite::updatePosition(); + updateAnim(); + updatePosition(); } uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam ¶m, Entity *sender) { @@ -629,19 +629,19 @@ void Scene1907::plugInFailed() { } int Scene1907::getRandomPositionIndex() { - bool flag = false; + bool found = false; int index = 0; // Check if any position is free for (int i = 0; i < 9; i++) if (_positionFree[i]) - flag = true; - if (flag) { + found = true; + if (found) { // Get a random free position - flag = false; - while (!flag) { + found = false; + while (!found) { index = _vm->_rnd->getRandomNumber(9 - 1); if (_positionFree[index]) - flag = true; + found = true; } } return index; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index d4b09844be..bfba0b9b95 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -122,8 +122,6 @@ Common::Error NeverhoodEngine::run() { delete _gameVars; delete _staticData; - debug("Ok."); - return Common::kNoError; } -- cgit v1.2.3 From 379a8cbbe031c0c637029946b4cebea1e3e72bd5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 23 Jan 2013 11:24:17 +0000 Subject: NEVERHOOD: Add support for loading/saving games with the game's own menu - Add LoadGameMenu class --- engines/neverhood/gamemodule.cpp | 31 ++++-- engines/neverhood/gamemodule.h | 6 +- engines/neverhood/menumodule.cpp | 233 +++++++++++++++++++++++++++++++++------ engines/neverhood/menumodule.h | 39 +++++-- engines/neverhood/neverhood.cpp | 2 +- engines/neverhood/neverhood.h | 2 + engines/neverhood/saveload.cpp | 2 +- 7 files changed, 260 insertions(+), 55 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index fa8a6d5d29..48462a2282 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -75,7 +75,7 @@ enum { GameModule::GameModule(NeverhoodEngine *vm) : Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1), - _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) { + _restoreGameRequested(false), _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) { // Other initializations moved to actual engine class _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079); @@ -464,13 +464,8 @@ void GameModule::startup() { #endif } -void GameModule::restoreGame() { - delete _childObject; - delete _prevChildObject; - _childObject = NULL; - _prevChildObject = NULL; - _prevModuleNum = 0; - createModuleByHash(getGlobalVar(V_MODULE_NAME)); +void GameModule::requestRestoreGame() { + _restoreGameRequested = true; } void GameModule::requestRestartGame(bool requestMainMenu) { @@ -478,11 +473,27 @@ void GameModule::requestRestartGame(bool requestMainMenu) { _mainMenuRequested = requestMainMenu; } -void GameModule::checkMainMenu() { +void GameModule::redrawPrevChildObject() { + if (_prevChildObject) { + _prevChildObject->draw(); + _vm->_screen->update(); + } +} + +void GameModule::checkRequests() { if (_restartGameRequested) { _restartGameRequested = false; _vm->_gameVars->clear(); - restoreGame(); + requestRestoreGame(); + } + if (_restoreGameRequested) { + _restoreGameRequested = false; + delete _childObject; + delete _prevChildObject; + _childObject = NULL; + _prevChildObject = NULL; + _prevModuleNum = 0; + createModuleByHash(getGlobalVar(V_MODULE_NAME)); } if (_mainMenuRequested) openMainMenu(); diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index b212a1905c..04fc780b02 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -33,9 +33,10 @@ public: GameModule(NeverhoodEngine *vm); virtual ~GameModule(); void startup(); - void restoreGame(); + void requestRestoreGame(); void requestRestartGame(bool requestMainMenu); - void checkMainMenu(); + void redrawPrevChildObject(); + void checkRequests(); void handleMouseMove(int16 x, int16 y); void handleMouseDown(int16 x, int16 y); void handleMouseUp(int16 x, int16 y); @@ -58,6 +59,7 @@ protected: Entity *_prevChildObject; int _prevModuleNum; bool _gameWasLoaded; + bool _restoreGameRequested; bool _restartGameRequested; bool _mainMenuRequested; bool _someFlag1; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index b86fc7095a..396d8cfb30 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -23,13 +23,16 @@ #include "neverhood/menumodule.h" #include "neverhood/gamemodule.h" +#include "engines/savestate.h" + namespace Neverhood { enum { MAIN_MENU = 0, CREDITS_SCENE = 1, MAKING_OF = 2, - SAVE_GAME_MENU = 3 + LOAD_GAME_MENU = 3, + SAVE_GAME_MENU = 4 }; enum { @@ -77,10 +80,14 @@ MenuModule::~MenuModule() { _vm->_screen->setPaletteData(_savedPaletteData); } +void MenuModule::setLoadgameInfo(uint slot) { + _savegameSlot = slot; + debug("LOADGAME: slot = %d", slot); +} + void MenuModule::setSavegameInfo(const Common::String &description, uint slot, bool newSavegame) { _savegameDescription = description; - _savegameSlot = slot; - _newSavegame = newSavegame; + _savegameSlot = newSavegame ? _savegameList->size() : slot; debug("SAVEGAME: description = [%s]; slot = %d; new = %d", description.c_str(), slot, newSavegame); } @@ -96,6 +103,9 @@ void MenuModule::createScene(int sceneNum, int which) { case MAKING_OF: createSmackerScene(kMakingOfSmackerFileHashList, false, true, true); break; + case LOAD_GAME_MENU: + createLoadGameMenu(); + break; case SAVE_GAME_MENU: createSaveGameMenu(); break; @@ -108,14 +118,13 @@ void MenuModule::updateScene() { if (!updateChild()) { switch (_sceneNum) { case MAIN_MENU: - // TODO switch (_moduleResult) { case kMainMenuRestartGame: _vm->_gameModule->requestRestartGame(false); leaveModule(0); break; case kMainMenuLoadGame: - // TODO createLoadGameMenu(); + createScene(LOAD_GAME_MENU, -1); break; case kMainMenuSaveGame: createScene(SAVE_GAME_MENU, -1); @@ -149,8 +158,11 @@ void MenuModule::updateScene() { case MAKING_OF: createScene(MAIN_MENU, -1); break; + case LOAD_GAME_MENU: + handleLoadGameMenuAction(_moduleResult != 1); + break; case SAVE_GAME_MENU: - handleSaveGameMenuAction(_moduleResult); + handleSaveGameMenuAction(_moduleResult != 1); break; default: break; @@ -163,27 +175,71 @@ uint32 MenuModule::handleMessage(int messageNum, const MessageParam ¶m, Enti return Module::handleMessage(messageNum, param, sender);; } +void MenuModule::createLoadGameMenu() { + _savegameSlot = -1; + _savegameList = new Common::StringArray(); + loadSavegameList(); + _childObject = new LoadGameMenu(_vm, this, _savegameList); +} + void MenuModule::createSaveGameMenu() { - // TODO Load actual savegames list :) - _savegameList = new StringArray(); - _savegameList->push_back(Common::String("Annoying scene")); - _savegameList->push_back(Common::String("Stuff happens")); - for (uint i = 0; i < 33; ++i) - _savegameList->push_back(Common::String::format("Game %d", i)); + _savegameSlot = -1; + _savegameList = new Common::StringArray(); + loadSavegameList(); _childObject = new SaveGameMenu(_vm, this, _savegameList); } -void MenuModule::handleSaveGameMenuAction(int action) { - if (action != 0) { - createScene(MAIN_MENU, -1); - } else { - // TODO Actual saving later 0048A62E - createScene(MAIN_MENU, -1); +void MenuModule::handleLoadGameMenuAction(bool doLoad) { + createScene(MAIN_MENU, -1); + if (doLoad && _savegameSlot >= 0) { + _vm->loadGameState(_savegameSlot); + leaveModule(0); + } + delete _savegameList; + _savegameList = NULL; +} + +void MenuModule::handleSaveGameMenuAction(bool doSave) { + createScene(MAIN_MENU, -1); + if (doSave && _savegameSlot >= 0) { + // Restore the scene palette and background so that the correct thumbnail is saved + byte *menuPaletteData = _vm->_screen->getPaletteData(); + _vm->_screen->setPaletteData(_savedPaletteData); + _vm->_gameModule->redrawPrevChildObject(); + _vm->saveGameState(_savegameSlot, _savegameDescription); + _vm->_screen->setPaletteData(menuPaletteData); + leaveModule(0); } delete _savegameList; _savegameList = NULL; } +void MenuModule::loadSavegameList() { + + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Neverhood::NeverhoodEngine::SaveHeader header; + Common::String pattern = _vm->getTargetName(); + pattern += ".???"; + + Common::StringArray filenames; + filenames = saveFileMan->listSavefiles(pattern.c_str()); + Common::sort(filenames.begin(), filenames.end()); + + SaveStateList saveList; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) { + int slotNum = atoi(file->c_str() + file->size() - 3); + if (slotNum >= 0 && slotNum <= 999) { + Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); + if (in) { + if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) + _savegameList->push_back(header.description); + delete in; + } + } + } + +} + MenuButton::MenuButton(NeverhoodEngine *vm, Scene *parentScene, uint buttonIndex, uint32 fileHash, const NRect &collisionBounds) : StaticSprite(vm, 900), _parentScene(parentScene), _buttonIndex(buttonIndex), _countdown(0) { @@ -393,7 +449,6 @@ Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene void Widget::onClick() { _parentScene->setCurrWidget(this); - // TODO? _parentScene->onClick(_itemID, 0); } void Widget::setPosition(int16 x, int16 y) { @@ -494,7 +549,7 @@ TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 item : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), _maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect), _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0), - _modified(false) { + _modified(false), _readOnly(false) { _maxVisibleChars = (_rect.x2 - _rect.x1) / _fontSurface->getCharWidth(); _cursorPos = 0; @@ -543,17 +598,19 @@ void TextEditWidget::addSprite() { cursorSpriteResource.load(_cursorFileHash, true); _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); _cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); - _cursorSurface->setVisible(true); + _cursorSurface->setVisible(!_readOnly); refresh(); } void TextEditWidget::enterWidget() { - _cursorSurface->setVisible(true); + if (!_readOnly) + _cursorSurface->setVisible(true); refresh(); } void TextEditWidget::exitWidget() { - _cursorSurface->setVisible(false); + if (!_readOnly) + _cursorSurface->setVisible(false); refresh(); } @@ -568,7 +625,7 @@ void TextEditWidget::drawCursor() { NDrawRect sourceRect(0, 0, _cursorWidth, _cursorHeight); _surface->copyFrom(_cursorSurface->getSurface(), _rect.x1 + _cursorPos * _fontSurface->getCharWidth(), _rect.y1 + (_rect.y2 - _cursorHeight - _rect.y1 + 1) / 2, sourceRect); - } else + } else if (!_readOnly) _cursorSurface->setVisible(false); } @@ -628,10 +685,11 @@ void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) { } break; default: + doRefresh = false; break; } if (doRefresh) { - _cursorSurface->setVisible(true); + _cursorSurface->setVisible(!_readOnly); _cursorTicks = 0; refresh(); } @@ -645,7 +703,7 @@ void TextEditWidget::refresh() { void TextEditWidget::update() { Widget::update(); - if (_parentScene->getCurrWidget() == this && _cursorTicks++ == 10) { + if (!_readOnly && _parentScene->getCurrWidget() == this && _cursorTicks++ == 10) { _cursorSurface->setVisible(!_cursorSurface->getVisible()); refresh(); _cursorTicks = 0; @@ -667,7 +725,7 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam ¶m, SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, - StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect) + Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect) : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), _savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect), _maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) { @@ -687,7 +745,6 @@ void SavegameListBox::onClick() { _currIndex = newIndex; refresh(); _parentScene->setCurrWidget(this); - debug("_currIndex = %d", _currIndex); _parentScene->handleEvent(_itemID, 5); } } @@ -707,7 +764,7 @@ void SavegameListBox::addSprite() { } void SavegameListBox::buildItems() { - StringArray &savegameList = *_savegameList; + Common::StringArray &savegameList = *_savegameList; int16 itemX = _rect.x1, itemY = 0; for (uint i = 0; i < savegameList.size(); ++i) { const byte *string = (const byte*)savegameList[i].c_str(); @@ -770,7 +827,7 @@ void SavegameListBox::pageDown() { } } -SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList) +SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList) : WidgetScene(vm, parentModule), _savegameList(savegameList) { static const uint32 kSaveGameMenuButtonFileHashes[] = { @@ -819,7 +876,6 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArra addCollisionSprite(menuButton); } - SetUpdateHandler(&Scene::update); SetMessageHandler(&SaveGameMenu::handleMessage); } @@ -885,4 +941,119 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } +LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList) + : WidgetScene(vm, parentModule), _savegameList(savegameList) { + + static const uint32 kLoadGameMenuButtonFileHashes[] = { + 0x100B2091, + 0x84822B03, + 0x20E22087, + 0x04040107, + 0x04820122, + 0x24423047 + }; + + static const NRect kLoadGameMenuButtonCollisionBounds[] = { + NRect( 44, 115, 108, 147), + NRect( 52, 396, 112, 426), + NRect(188, 116, 245, 196), + NRect(189, 209, 239, 269), + NRect(187, 301, 233, 349), + NRect(182, 358, 241, 433) + }; + + static const NRect kListBoxRect(0, 0, 320, 271); + static const NRect kTextEditRect(0, 0, 320, 17); + static const NRect kMouseRect(263, 48, 583, 65); + + _fontSurface = new FontSurface(_vm, calcHash("bgLoadTinyAlphabet"), 32, 7, 32, 11, 17); + + setBackground(0x98620234); + setPalette(0x98620234); + insertScreenMouse(0x2023098E, &kMouseRect); + insertStaticSprite(0x0BC600A3, 200); + insertStaticSprite(0x0F960021, 200); + + _listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, 1000, 1000, + _savegameList, _fontSurface, 0x04040409, kListBoxRect); + _listBox->addSprite(); + + _textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 1000, 1000, 29, + _fontSurface, 0x10924C03, kTextEditRect); + _textEditWidget->setCursor(0x18032303, 2, 13); + _textEditWidget->setReadOnly(true); + _textEditWidget->addSprite(); + setCurrWidget(_textEditWidget); + + for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { + Sprite *menuButton = insertSprite(this, buttonIndex, + kLoadGameMenuButtonFileHashes[buttonIndex], kLoadGameMenuButtonCollisionBounds[buttonIndex]); + addCollisionSprite(menuButton); + } + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&LoadGameMenu::handleMessage); +} + +LoadGameMenu::~LoadGameMenu() { + delete _fontSurface; +} + +void LoadGameMenu::handleEvent(int16 itemID, int eventType) { + if (itemID == 69 && eventType == 5) { + uint currIndex = _listBox->getCurrIndex(); + _textEditWidget->setString((*_savegameList)[currIndex]); + setCurrWidget(_textEditWidget); + } +} + +uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { +#if 0 + case 0x000A: + sendMessage(_textEditWidget, 0x000A, param.asInteger()); + setCurrWidget(_textEditWidget); + break; +#endif + case 0x000B: + if (param.asInteger() == Common::KEYCODE_RETURN) { + ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); + leaveScene(0); + } else if (param.asInteger() == Common::KEYCODE_ESCAPE) { + leaveScene(1); + }/* else { + sendMessage(_textEditWidget, 0x000B, param.asInteger()); + setCurrWidget(_textEditWidget); + }*/ + break; + case 0x2000: + // Handle menu button click + switch (param.asInteger()) { + case 0: + // TODO Same handling as Return, merge + ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); + leaveScene(0); + break; + case 1: + leaveScene(1); + break; + case 2: + _listBox->pageUp(); + break; + case 3: + _listBox->scrollUp(); + break; + case 4: + _listBox->scrollDown(); + break; + case 5: + _listBox->pageDown(); + break; + } + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 51c32aa878..083679571b 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -24,31 +24,33 @@ #define NEVERHOOD_MENUMODULE_H #include "common/str.h" +#include "common/str-array.h" #include "neverhood/neverhood.h" #include "neverhood/module.h" #include "neverhood/scene.h" namespace Neverhood { -typedef Common::Array StringArray; - class MenuModule : public Module { public: MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~MenuModule(); + void setLoadgameInfo(uint slot); void setSavegameInfo(const Common::String &description, uint slot, bool newSavegame); protected: int _sceneNum; byte *_savedPaletteData; - StringArray *_savegameList; + Common::StringArray *_savegameList; Common::String _savegameDescription; - uint _savegameSlot; - bool _newSavegame; + int _savegameSlot; void createScene(int sceneNum, int which); void updateScene(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createLoadGameMenu(); void createSaveGameMenu(); - void handleSaveGameMenuAction(int action); + void handleLoadGameMenuAction(bool doLoad); + void handleSaveGameMenuAction(bool doSave); + void loadSavegameList(); }; class MenuButton : public StaticSprite { @@ -158,6 +160,7 @@ public: void handleAsciiKey(char ch); void handleKeyDown(Common::KeyCode keyCode); void refresh(); + void setReadOnly(bool value) { _readOnly = value; } bool isModified() const { return _modified; } protected: NRect _rect; @@ -173,6 +176,7 @@ protected: uint32 _cursorFileHash; int16 _cursorWidth, _cursorHeight; bool _modified; + bool _readOnly; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; @@ -181,7 +185,7 @@ class SavegameListBox : public Widget { public: SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, - StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); + Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); virtual void onClick(); virtual void addSprite(); void buildItems(); @@ -199,7 +203,7 @@ protected: Common::Array _textLabelItems; int _firstVisibleItem; int _lastVisibleItem; - StringArray *_savegameList; + Common::StringArray *_savegameList; FontSurface *_fontSurface; uint _currIndex; int _maxVisibleItemsCount; @@ -207,11 +211,26 @@ protected: class SaveGameMenu : public WidgetScene { public: - SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, StringArray *savegameList); + SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList); ~SaveGameMenu(); virtual void handleEvent(int16 itemID, int eventType); protected: - StringArray *_savegameList; + Common::StringArray *_savegameList; + FontSurface *_fontSurface; + SavegameListBox *_listBox; + TextEditWidget *_textEditWidget; + Common::String _savegameDescription; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class LoadGameMenu : public WidgetScene { +public: + LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList); + ~LoadGameMenu(); + virtual void handleEvent(int16 itemID, int eventType); +protected: + Common::StringArray *_savegameList; FontSurface *_fontSurface; SavegameListBox *_listBox; TextEditWidget *_textEditWidget; diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index bfba0b9b95..7b068bdf46 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -159,7 +159,7 @@ void NeverhoodEngine::mainLoop() { } } if (_system->getMillis() >= nextFrameTime) { - _gameModule->checkMainMenu(); + _gameModule->checkRequests(); _gameModule->handleUpdate(); _gameModule->draw(); _screen->update(); diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 3653127f91..14c283bc12 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -28,6 +28,7 @@ #include "common/keyboard.h" #include "common/random.h" #include "common/savefile.h" +#include "common/str-array.h" #include "common/system.h" #include "audio/mixer.h" #include "engines/engine.h" @@ -72,6 +73,7 @@ public: Common::Platform getPlatform() const; bool hasFeature(EngineFeature f) const; bool isDemo() const; + Common::String getTargetName() { return _targetName; }; Common::RandomSource *_rnd; diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp index e1ef95477b..2f97adeeee 100644 --- a/engines/neverhood/saveload.cpp +++ b/engines/neverhood/saveload.cpp @@ -125,7 +125,7 @@ void NeverhoodEngine::loadgame(const char *filename) { _gameState.sceneNum = _gameVars->getGlobalVar(V_CURRENT_SCENE); _gameState.which = _gameVars->getGlobalVar(V_CURRENT_SCENE_WHICH); - _gameModule->restoreGame(); + _gameModule->requestRestoreGame(); delete in; -- cgit v1.2.3 From 4c6e82fc05134b71481c56ce70b9d26268a66cd5 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 24 Jan 2013 09:07:07 +0000 Subject: NEVERHOOD: Remove objectPriority and surfacePriority parameters from the Klaymen class constructor since they always have the same value (1000) --- engines/neverhood/klaymen.cpp | 187 +++++++++++++++++++++--------------------- engines/neverhood/klaymen.h | 2 +- 2 files changed, 93 insertions(+), 96 deletions(-) diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp index 6d139b1abc..4323d73f37 100644 --- a/engines/neverhood/klaymen.cpp +++ b/engines/neverhood/klaymen.cpp @@ -60,14 +60,14 @@ static const KlaymenIdleTableItem klaymenIdleTable1002[] = { // Klaymen -Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority, int objectPriority, NRectArray *clipRects) - : AnimatedSprite(vm, objectPriority), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), - _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), /*_field118(0), */_status2(0), _acceptInput(true), +Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects) + : AnimatedSprite(vm, 1000), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), + _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _status2(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) { - createSurface(surfacePriority, 320, 200); + createSurface(1000, 320, 200); _x = x; _y = y; _destX = x; @@ -3344,12 +3344,10 @@ void Klaymen::stPeekInsideBlink() { _blinkCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; } -//############################################################################## - // KmScene1001 KmScene1001::KmScene1001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { } uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3368,10 +3366,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klaymen::stPullHammerLever); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -3427,7 +3425,7 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1002 KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { setKlaymenIdleTable1(); @@ -3492,7 +3490,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klaymen::stJumpToRingVenusFlyTrap); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 0) { GotoState(&Klaymen::stPressDoorButton); } @@ -3549,7 +3547,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1004 KmScene1004::KmScene1004(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _dataResource.load(0x01900A04); } @@ -3615,7 +3613,7 @@ uint32 KmScene1004::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1109::KmScene1109(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -3683,7 +3681,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1201 KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); _flagF6 = true; @@ -3702,7 +3700,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480A: GotoState(&Klaymen::stMoveObject); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; case 0x4813: @@ -3714,7 +3712,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4815: GotoState(&Klaymen::stCloseEyes); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 0) { GotoState(&Klaymen::stPressButtonSide); } @@ -3754,7 +3752,7 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1303::KmScene1303(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -3775,7 +3773,7 @@ uint32 KmScene1303::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1304::KmScene1304(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -3789,7 +3787,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3829,7 +3827,7 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1305::KmScene1305(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -3855,7 +3853,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { } @@ -3876,7 +3874,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { else GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -3885,7 +3883,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); } break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -3898,7 +3896,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; - case NM_KLAYMEN_INSERT_DISK: + case 0x481A: GotoState(&Klaymen::stInsertDisk); break; case 0x481B: @@ -3981,7 +3979,7 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1308::KmScene1308(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4005,7 +4003,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klaymen::stUseLever); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4018,7 +4016,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; - case NM_KLAYMEN_INSERT_DISK: + case 0x481A: if (param.asInteger() == 1) { GotoState(&Klaymen::stInsertKey); } else { @@ -4038,7 +4036,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x481E: GotoState(&Klaymen::stReturnFromUse); break; - case NM_KLAYMEN_RELEASE_LEVER: + case 0x4827: GotoState(&Klaymen::stReleaseLever); break; case 0x4834: @@ -4057,7 +4055,7 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1401 KmScene1401::KmScene1401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4078,7 +4076,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stMoveObjectFaceObject); } break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -4132,7 +4130,7 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1402 KmScene1402::KmScene1402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { SetFilterY(&Sprite::defFilterY); } @@ -4177,7 +4175,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1403 KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); } @@ -4201,7 +4199,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klaymen::stUseLever); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4221,7 +4219,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41CCE0(param.asPoint().x); } break; - case NM_KLAYMEN_RELEASE_LEVER: + case 0x4827: GotoState(&Klaymen::stReleaseLever); break; case 0x483F: @@ -4237,7 +4235,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1404 KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4258,7 +4256,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stMoveObjectFaceObject); } break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4271,7 +4269,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; - case NM_KLAYMEN_INSERT_DISK: + case 0x481A: GotoState(&Klaymen::stInsertDisk); break; case 0x481B: @@ -4315,7 +4313,7 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { } uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4335,7 +4333,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { else GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4406,7 +4404,7 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { // KmScene1705 KmScene1705::KmScene1705(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4423,16 +4421,15 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(param.asPoint().x, false); break; case 0x4004: - if (_isSittingInTeleporter) { + if (_isSittingInTeleporter) GotoState(&Klaymen::stSitIdleTeleporter); - } else { + else GotoState(&Klaymen::stTryStandIdle); - } break; case 0x4803: GotoState(&Klaymen::stFallSkipJump); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4499,7 +4496,7 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene1901::KmScene1901(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4538,7 +4535,7 @@ uint32 KmScene1901::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2001::KmScene2001(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4555,9 +4552,9 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(param.asPoint().x, false); break; case 0x4004: - if (_isSittingInTeleporter) { + if (_isSittingInTeleporter) GotoState(&Klaymen::stSitIdleTeleporter); - } else + else GotoState(&Klaymen::stTryStandIdle); break; case 0x4804: @@ -4604,7 +4601,7 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2101::KmScene2101(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4629,7 +4626,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4811: GotoState(&Klaymen::stHitByDoor); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4638,7 +4635,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); } break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -4690,7 +4687,7 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); @@ -4707,10 +4704,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 0) { GotoState(&Klaymen::stPressButtonSide); } @@ -4764,7 +4761,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4777,7 +4774,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -4786,7 +4783,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); } break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -4805,7 +4802,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4819: GotoState(&Klaymen::stClayDoorOpen); break; - case NM_KLAYMEN_INSERT_DISK: + case 0x481A: GotoState(&Klaymen::stInsertDisk); break; case 0x481B: @@ -4836,7 +4833,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -4861,7 +4858,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPeekWall); } break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 0) { GotoState(&Klaymen::stPressButtonSide); } @@ -4884,7 +4881,7 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2206::KmScene2206(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _walkResumeFrameIncr = 1; _vm->_soundMan->addSound(0x80101800, 0xD3B02847); @@ -4918,14 +4915,14 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPeekWall); } break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 1) { GotoState(&Klaymen::stPickUpTube); } else { GotoState(&Klaymen::stPickUpGeneric); } break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -4990,7 +4987,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5013,10 +5010,10 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klaymen::stInteractLever); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -5036,7 +5033,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { sub41CCE0(param.asPoint().x); } break; - case NM_KLAYMEN_RELEASE_LEVER: + case 0x4827: GotoState(&Klaymen::stReleaseLever); break; case 0x482D: @@ -5054,7 +5051,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5079,7 +5076,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPeekWall); } break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) { GotoState(&Klaymen::stPickUpNeedle); } else if (param.asInteger() == 1) { @@ -5124,7 +5121,7 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmHallOfRecords::KmHallOfRecords(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5178,7 +5175,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m } KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5232,7 +5229,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5246,7 +5243,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -5315,7 +5312,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5340,10 +5337,10 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPeekWall); } break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -5387,7 +5384,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5404,10 +5401,10 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x480D: GotoState(&Klaymen::stPullCord); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; - case NM_KLAYMEN_PRESS_BUTTON: + case 0x4816: if (param.asInteger() == 1) { GotoState(&Klaymen::stPressButton); } else if (param.asInteger() == 2) { @@ -5473,7 +5470,7 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); @@ -5497,7 +5494,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPeekWall); } break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); else if (param.asInteger() == 1) @@ -5566,7 +5563,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5617,7 +5614,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5634,7 +5631,7 @@ uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5647,7 +5644,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { case 0x4004: GotoState(&Klaymen::stTryStandIdle); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; case 0x4817: @@ -5706,7 +5703,7 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, int clipRectsCount) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); @@ -5770,7 +5767,7 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2803Small::KmScene2803Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _dataResource.load(0x81120132); } @@ -5823,7 +5820,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam ¶ } KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -5881,7 +5878,7 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { if (flag) { NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); @@ -5942,7 +5939,7 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, bool flag, NRect *clipRects, uint clipRectsCount) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { if (flag) { NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); @@ -6002,7 +5999,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -6052,7 +6049,7 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶ } KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRect *clipRects, uint clipRectsCount) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); @@ -6075,7 +6072,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() == 3) GotoState(&Klaymen::stFinishGrow); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; case 0x4817: @@ -6147,7 +6144,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : Klaymen(vm, parentScene, x, y, 1000, 1000) { + : Klaymen(vm, parentScene, x, y) { // Empty } @@ -6164,7 +6161,7 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { _destY = param.asInteger(); GotoState(&Klaymen::stJumpToGrabFall); break; - case NM_KLAYMEN_PICKUP: + case 0x4812: if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); else if (param.asInteger() == 1) diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h index 6e5a843f47..31f8e5a700 100644 --- a/engines/neverhood/klaymen.h +++ b/engines/neverhood/klaymen.h @@ -49,7 +49,7 @@ struct KlaymenIdleTableItem { class Klaymen : public AnimatedSprite { public: - Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int surfacePriority = 1000, int objectPriority = 1000, NRectArray *clipRects = NULL); + Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects = NULL); void update(); -- cgit v1.2.3 From c218cb46e0181cdb213c9cc0486acb880bbf9d29 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 24 Jan 2013 09:22:44 +0000 Subject: NEVERHOOD: Remove unneeded braces --- engines/neverhood/klaymen.cpp | 572 ++++++++++++++++++------------------------ 1 file changed, 239 insertions(+), 333 deletions(-) diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp index 4323d73f37..18a8b344ad 100644 --- a/engines/neverhood/klaymen.cpp +++ b/engines/neverhood/klaymen.cpp @@ -3370,13 +3370,12 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3390,17 +3389,16 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -3459,11 +3457,10 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x4803: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stJumpAndFall); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stDropFromRing); - } break; case 0x4804: GotoState(&Klaymen::stPeekWall); @@ -3491,9 +3488,8 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stJumpToRingVenusFlyTrap); break; case 0x4816: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stPressDoorButton); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3521,18 +3517,16 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stClimbLadderHalf); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -3639,9 +3633,8 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stWalkingFirst); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3713,9 +3706,8 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stCloseEyes); break; case 0x4816: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3788,13 +3780,12 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3808,13 +3799,12 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -3875,22 +3865,20 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -3919,35 +3907,32 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stReturnFromUse); break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x4834: GotoState(&Klaymen::stStepOver); @@ -3994,41 +3979,37 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x480A: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); - } else { + else GotoState(&Klaymen::stMoveObjectFaceObject); - } break; case 0x480D: GotoState(&Klaymen::stUseLever); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481A: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stInsertKey); - } else { + else GotoState(&Klaymen::stInsertDisk); - } break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4070,20 +4051,18 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x480A: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); - } else { + else GotoState(&Klaymen::stMoveObjectFaceObject); - } break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4097,31 +4076,28 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; } return 0; @@ -4145,11 +4121,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x480A: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); - } else { + else GotoState(&Klaymen::stMoveObjectFaceObject); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4190,23 +4165,21 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x480A: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); - } else { + else GotoState(&Klaymen::stMoveObjectFaceObject); - } break; case 0x480D: GotoState(&Klaymen::stUseLever); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4250,20 +4223,18 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x480A: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stMoveObjectSkipTurnFaceObject); - } else { + else GotoState(&Klaymen::stMoveObjectFaceObject); - } break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4273,11 +4244,10 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stInsertDisk); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4286,17 +4256,16 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stReturnFromUse); break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4334,13 +4303,12 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4362,17 +4330,16 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stReturnFromUseInTeleporter); break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -4430,24 +4397,22 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stFallSkipJump); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481D: if (_isSittingInTeleporter) { @@ -4455,22 +4420,20 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481E: - if (_isSittingInTeleporter) { + if (_isSittingInTeleporter) GotoState(&Klaymen::stReturnFromUseInTeleporter); - } break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x4834: GotoState(&Klaymen::stStepOver); @@ -4573,9 +4536,8 @@ uint32 KmScene2001::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTurnToUseInTeleporter); break; case 0x481E: - if (_isSittingInTeleporter) { + if (_isSittingInTeleporter) GotoState(&Klaymen::stReturnFromUseInTeleporter); - } break; case 0x4834: GotoState(&Klaymen::stStepOver); @@ -4627,40 +4589,37 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stHitByDoor); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481D: if (_isSittingInTeleporter) GotoState(&Klaymen::stTurnToUseInTeleporter); break; case 0x481E: - if (_isSittingInTeleporter)//CHECKME + if (_isSittingInTeleporter) GotoState(&Klaymen::stReturnFromUseInTeleporter); break; case 0x4834: @@ -4708,9 +4667,8 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); break; case 0x4816: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger() ? 1 : 0); @@ -4737,18 +4695,16 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -4775,22 +4731,20 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4806,11 +4760,10 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stInsertDisk); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4854,14 +4807,12 @@ uint32 KmScene2205::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stStartWalkingResume); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4816: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4911,25 +4862,22 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stStartWalkingResume); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4812: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -4943,35 +4891,32 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { } break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x4837: stopWalking(); @@ -5014,24 +4959,22 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x4827: GotoState(&Klaymen::stReleaseLever); @@ -5072,42 +5015,38 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stStartWalkingResume); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4812: - if (param.asInteger() == 2) { + if (param.asInteger() == 2) GotoState(&Klaymen::stPickUpNeedle); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stPickUpTube); - } else { + else GotoState(&Klaymen::stPickUpGeneric); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -5142,26 +5081,24 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stStartWalkingResume); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -5196,26 +5133,24 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stStartWalkingResume); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); @@ -5244,51 +5179,46 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stTryStandIdle); break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x4832: GotoState(&Klaymen::stUseTube); @@ -5333,45 +5263,41 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stWalkingFirst); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4812: GotoState(&Klaymen::stPickUpGeneric); break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x483F: startSpecialWalkRight(param.asInteger()); @@ -5405,37 +5331,34 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPickUpGeneric); break; case 0x4816: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stPressButton); - } else if (param.asInteger() == 2) { + else if (param.asInteger() == 2) GotoState(&Klaymen::stPressFloorButton); - } else { + else GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x4820: sendMessage(_parentScene, 0x2000, 0); @@ -5490,9 +5413,8 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { if (param.asInteger() != 0) { _destX = param.asInteger(); GotoState(&Klaymen::stWalkingFirst); - } else { + } else GotoState(&Klaymen::stPeekWall); - } break; case 0x4812: if (param.asInteger() == 2) @@ -5522,17 +5444,16 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stReturnFromUse); break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x4820: sendMessage(_parentScene, 0x2000, 0); @@ -5652,11 +5573,10 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -5665,35 +5585,32 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stReturnFromUse); break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 0) { + else if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x482D: setDoDeltaX(_x > (int16)param.asInteger() ? 1 : 0); gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x4837: stopWalking(); @@ -5744,11 +5661,10 @@ uint32 KmScene2803::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stReturnFromUse); break; case 0x481F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else { + else GotoState(&Klaymen::stWonderAboutHalf); - } break; case 0x482E: GotoState(&Klaymen::stWalkToFront); @@ -5912,9 +5828,8 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPullCord); break; case 0x4816: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -5927,11 +5842,10 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stGrow); break; case 0x4832: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stDrinkPotion); - } else { + else GotoState(&Klaymen::stUseTube); - } break; } return 0; @@ -5973,9 +5887,8 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stPullCord); break; case 0x4816: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stPressButtonSide); - } break; case 0x4817: setDoDeltaX(param.asInteger()); @@ -5988,11 +5901,10 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stGrow); break; case 0x4832: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stDrinkPotion); - } else { + else GotoState(&Klaymen::stUseTube); - } break; } return 0; @@ -6028,18 +5940,16 @@ uint32 KmScene2810Small::xHandleMessage(int messageNum, const MessageParam ¶ GotoState(&Klaymen::stWonderAboutSmall); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStepSmall); - } else { + else GotoState(&Klaymen::stWalkToFrontSmall); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToBackHalfSmall); - } else { + else GotoState(&Klaymen::stTurnToBackSmall); - } break; case 0x4837: stopWalking(); @@ -6083,26 +5993,24 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x481B: - if (param.asPoint().y != 0) { + if (param.asPoint().y != 0) sub41CC40(param.asPoint().y, param.asPoint().x); - } else { + else sub41CCE0(param.asPoint().x); - } break; case 0x481F: - if (param.asInteger() == 0) { + if (param.asInteger() == 0) GotoState(&Klaymen::stWonderAboutHalf); - } else if (param.asInteger() == 1) { + else if (param.asInteger() == 1) GotoState(&Klaymen::stWonderAboutAfter); - } else if (param.asInteger() == 3) { + else if (param.asInteger() == 3) GotoState(&Klaymen::stTurnToUseHalf); - } else if (param.asInteger() == 4) { + else if (param.asInteger() == 4) GotoState(&Klaymen::stTurnAwayFromUse); - } else if (param.asInteger() == 5) { + else if (param.asInteger() == 5) GotoState(&Klaymen::stTurnToUseExt); - } else { + else GotoState(&Klaymen::stWonderAbout); - } break; case 0x4820: sendMessage(_parentScene, 0x2000, 0); @@ -6211,18 +6119,16 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x482E: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stWalkToFrontNoStep); - } else { + else GotoState(&Klaymen::stWalkToFront); - } break; case 0x482F: - if (param.asInteger() == 1) { + if (param.asInteger() == 1) GotoState(&Klaymen::stTurnToFront); - } else { + else GotoState(&Klaymen::stTurnToBack); - } break; case 0x483F: startSpecialWalkRight(param.asInteger()); -- cgit v1.2.3 From 1383c5f39504dfc4dc3b1b5e5f99645077abc5fe Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Thu, 24 Jan 2013 19:10:27 +0000 Subject: NEVERHOOD: Rename stuff in the Klaymen class --- engines/neverhood/klaymen.cpp | 524 +++++++++++++++++++++--------------------- engines/neverhood/klaymen.h | 22 +- 2 files changed, 272 insertions(+), 274 deletions(-) diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp index 18a8b344ad..484d7aa3aa 100644 --- a/engines/neverhood/klaymen.cpp +++ b/engines/neverhood/klaymen.cpp @@ -62,9 +62,9 @@ static const KlaymenIdleTableItem klaymenIdleTable1002[] = { Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects) : AnimatedSprite(vm, 1000), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), - _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _status2(0), _acceptInput(true), - _attachedSprite(NULL), _isWalking(false), _status3(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), - _flagF6(false), _isLeverDown(false), _isSittingInTeleporter(false), _flagFA(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), + _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _busyStatus(0), _acceptInput(true), + _attachedSprite(NULL), _isWalking(false), _actionStatus(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), + _doYHitIncr(false), _isLeverDown(false), _isSittingInTeleporter(false), _actionStatusChanged(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) { createSurface(1000, 320, 200); @@ -128,7 +128,7 @@ void Klaymen::stDoIdlePickEar() { } void Klaymen::stIdlePickEar() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x5B20C814, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -159,7 +159,7 @@ void Klaymen::stDoIdleSpinHead() { } void Klaymen::stIdleSpinHead() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0xD122C137, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -185,7 +185,7 @@ void Klaymen::stDoIdleArms() { } void Klaymen::stIdleArms() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x543CD054, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -220,7 +220,7 @@ void Klaymen::stDoIdleChest() { } void Klaymen::stIdleChest() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x40A0C034, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -246,7 +246,7 @@ void Klaymen::stDoIdleHeadOff() { } void Klaymen::stIdleHeadOff() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x5120E137, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -274,7 +274,7 @@ uint32 Klaymen::hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity } void Klaymen::stIdleWonderAbout() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0xD820A114, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -284,7 +284,7 @@ void Klaymen::stIdleWonderAbout() { } void Klaymen::stSitIdleTeleporter() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x582EC138, 0, -1); SetUpdateHandler(&Klaymen::upSitIdleTeleporter); @@ -320,7 +320,7 @@ void Klaymen::upSitIdleTeleporter() { } void Klaymen::stSitIdleTeleporterBlink() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -330,7 +330,7 @@ void Klaymen::stSitIdleTeleporterBlink() { } void Klaymen::stSitIdleTeleporterBlinkSecond() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x5C24C018, 0, -1); SetUpdateHandler(&Klaymen::upSitIdleTeleporter); @@ -341,7 +341,7 @@ void Klaymen::stSitIdleTeleporterBlinkSecond() { void Klaymen::stPickUpNeedle() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klaymen::stPickUpNeedle))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x1449C169, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -353,7 +353,7 @@ void Klaymen::stPickUpNeedle() { void Klaymen::stPickUpTube() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klaymen::stPickUpTube))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x0018C032, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -384,7 +384,7 @@ uint32 Klaymen::hmPickUpTube(int messageNum, const MessageParam ¶m, Entity * } void Klaymen::stTurnToUseInTeleporter() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0xD229823D, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -393,7 +393,7 @@ void Klaymen::stTurnToUseInTeleporter() { } void Klaymen::stReturnFromUseInTeleporter() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x9A2801E0, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -403,7 +403,7 @@ void Klaymen::stReturnFromUseInTeleporter() { void Klaymen::stStepOver() { if (!stStartAction(AnimationCallback(&Klaymen::stStepOver))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x004AA310, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -414,7 +414,7 @@ void Klaymen::stStepOver() { void Klaymen::stSitInTeleporter() { if (!stStartAction(AnimationCallback(&Klaymen::stSitInTeleporter))) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x392A0330, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -436,7 +436,7 @@ uint32 Klaymen::hmSitInTeleporter(int messageNum, const MessageParam ¶m, Ent } void Klaymen::stGetUpFromTeleporter() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x913AB120, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -466,8 +466,8 @@ void Klaymen::upIdleAnimation() { } bool Klaymen::stStartActionFromIdle(AnimationCb callback) { - if (_status2 == 2) { - _status2 = 1; + if (_busyStatus == 2) { + _busyStatus = 1; _acceptInput = false; startAnimation(0x9A7020B8, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -495,19 +495,19 @@ void Klaymen::gotoNextStateExt() { } } -void Klaymen::sub41C770() { - _flagFA = false; - _status3 = 1; +void Klaymen::beginAction() { + _actionStatusChanged = false; + _actionStatus = 1; } -void Klaymen::sub41C790() { - if (_flagFA) - _status3 = 0; +void Klaymen::endAction() { + if (_actionStatusChanged) + _actionStatus = 0; } void Klaymen::stTryStandIdle() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTryStandIdle))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klaymen::upStandIdle); @@ -554,14 +554,14 @@ uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam ¶m, Entity *se gotoNextStateExt(); break; case 0x101C: - sub41C770(); + beginAction(); break; case 0x1021: - sub41C790(); + endAction(); break; case 0x481C: - _status3 = param.asInteger(); - _flagFA = true; + _actionStatus = param.asInteger(); + _actionStatusChanged = true; messageResult = 1; break; case 0x482C: @@ -576,7 +576,7 @@ uint32 Klaymen::hmLowLevel(int messageNum, const MessageParam ¶m, Entity *se } void Klaymen::stIdleBlink() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x5900C41E, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -596,7 +596,7 @@ uint32 Klaymen::hmLowLevelAnimation(int messageNum, const MessageParam ¶m, E } void Klaymen::stStandAround() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klaymen::upStandIdle); @@ -619,7 +619,7 @@ uint32 Klaymen::hmStartAction(int messageNum, const MessageParam ¶m, Entity } -void Klaymen::startWalkToX(int16 x, bool flag) { +void Klaymen::startWalkToX(int16 x, bool walkExt) { int16 xdiff = ABS(x - _x); if (x == _x) { _destX = x; @@ -631,7 +631,7 @@ void Klaymen::startWalkToX(int16 x, bool flag) { _destX = x; gotoState(NULL); gotoNextStateExt(); - } else if (xdiff <= 42 && _status3 != 3) { + } else if (xdiff <= 42 && _actionStatus != 3) { if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { _destX = x; } else { @@ -640,7 +640,7 @@ void Klaymen::startWalkToX(int16 x, bool flag) { } } else if (_isWalking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0))) { _destX = x; - } else if (flag) { + } else if (walkExt) { _destX = x; GotoState(&Klaymen::stStartWalkingExt); } else { @@ -650,7 +650,7 @@ void Klaymen::startWalkToX(int16 x, bool flag) { } void Klaymen::stWakeUp() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x527AC970, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -659,7 +659,7 @@ void Klaymen::stWakeUp() { } void Klaymen::stSleeping() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x5A38C110, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -680,8 +680,8 @@ uint32 Klaymen::hmSleeping(int messageNum, const MessageParam ¶m, Entity *se } bool Klaymen::stStartAction(AnimationCb callback3) { - if (_status2 == 1) { - _status2 = 2; + if (_busyStatus == 1) { + _busyStatus = 2; _acceptInput = false; startAnimation(0x5C7080D4, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -774,7 +774,7 @@ void Klaymen::suSneaking() { } void Klaymen::stSneak() { - _status2 = 1; + _busyStatus = 1; _isSneaking = true; _acceptInput = true; setDoDeltaX(_destX < _x ? 1 : 0); @@ -813,7 +813,7 @@ uint32 Klaymen::hmSneaking(int messageNum, const MessageParam ¶m, Entity *se void Klaymen::stStartWalking() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalking))) { - _status2 = 0; + _busyStatus = 0; _isWalking = true; _acceptInput = true; setDoDeltaX(_destX < _x ? 1 : 0); @@ -845,7 +845,7 @@ uint32 Klaymen::hmStartWalking(int messageNum, const MessageParam ¶m, Entity } void Klaymen::stWalkingFirst() { - _status2 = 0; + _busyStatus = 0; _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, 0, -1); @@ -876,27 +876,27 @@ uint32 Klaymen::hmWalking(int messageNum, const MessageParam ¶m, Entity *sen } void Klaymen::stUpdateWalkingFirst() { - if (_status3 == 2) { + if (_actionStatus == 2) { gotoNextStateExt(); - } else if (_status3 == 3) { + } else if (_actionStatus == 3) { stWalkingOpenDoor(); } else { _isSneaking = true; _acceptInput = true; if (ABS(_destX - _x) <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) { - if (_status3 == 0) { - _status2 = 1; + if (_actionStatus == 0) { + _busyStatus = 1; startAnimation(0xF234EE31, 0, -1); } else { - _status2 = 2; + _busyStatus = 2; startAnimation(0xF135CC21, 0, -1); } } else if (ABS(_destX - _x) <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) { - if (_status3 == 0) { - _status2 = 1; + if (_actionStatus == 0) { + _busyStatus = 1; startAnimation(0x8604A152, 0, -1); } else { - _status2 = 2; + _busyStatus = 2; startAnimation(0xA246A132, 0, -1); } } @@ -919,10 +919,10 @@ void Klaymen::suWalkingTestExit() { _deltaX = 0; if (xdiff == 0 || - (_status3 != 2 && _status3 != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) || - (_status3 != 2 && _status3 != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) || - (_status3 == 3 && xdiff < 30) || - (_status3 == 3 && xdiff < 150 && _currFrameIndex >= 6)) { + (_actionStatus != 2 && _actionStatus != 3 && xdiff <= 42 && _currFrameIndex >= 5 && _currFrameIndex <= 11) || + (_actionStatus != 2 && _actionStatus != 3 && xdiff <= 10 && (_currFrameIndex >= 12 || _currFrameIndex <= 4)) || + (_actionStatus == 3 && xdiff < 30) || + (_actionStatus == 3 && xdiff < 150 && _currFrameIndex >= 6)) { sendMessage(this, 0x1019, 0); } else { HitRect *hitRectPrev = _parentScene->findHitRectAtPos(_x, _y); @@ -939,7 +939,7 @@ void Klaymen::suWalkingTestExit() { _y = xdelta > 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; } else if (hitRectPrev->type == 0x5003) { _y = xdelta < 0 ? hitRectPrev->rect.y2 : hitRectPrev->rect.y1; - } else if (_flagF6 && xdelta != 0) { + } else if (_doYHitIncr && xdelta != 0) { if (hitRectNext->type == 0x5000) { _y++; } else if (hitRectNext->type == 0x5001 && _y > hitRectNext->rect.y1) { @@ -969,7 +969,7 @@ uint32 Klaymen::hmLever(int messageNum, const MessageParam ¶m, Entity *sende void Klaymen::stPickUpGeneric() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klaymen::stPickUpGeneric))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x1C28C178, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1004,7 +1004,7 @@ uint32 Klaymen::hmPickUpObject(int messageNum, const MessageParam ¶m, Entity void Klaymen::stPressButton() { if (!stStartAction(AnimationCallback(&Klaymen::stPressButton))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = true; startAnimation(0x1C02B03D, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1031,7 +1031,7 @@ uint32 Klaymen::hmPressButton(int messageNum, const MessageParam ¶m, Entity void Klaymen::stPressFloorButton() { if (!stStartAction(AnimationCallback(&Klaymen::stPressFloorButton))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = true; startAnimation(0x1C16B033, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1042,7 +1042,7 @@ void Klaymen::stPressFloorButton() { void Klaymen::stPressButtonSide() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stPressButtonSide))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x1CD89029, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1080,7 +1080,7 @@ void Klaymen::startSpecialWalkLeft(int16 x) { } void Klaymen::startWalkToXSmall(int16 x) { - _status3 = 2; + _actionStatus = 2; if (_x == x) { _destX = x; if (_isWalking) { @@ -1098,7 +1098,7 @@ void Klaymen::startWalkToXSmall(int16 x) { void Klaymen::stStartWalkingSmall() { _isWalking = true; _acceptInput = true; - _status3 = 2; + _actionStatus = 2; setDoDeltaX(_destX < _x ? 1 : 0); startAnimation(0x3A4CD934, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1120,7 +1120,7 @@ uint32 Klaymen::hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity } void Klaymen::stStandIdleSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x90D0D1D0, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1129,7 +1129,7 @@ void Klaymen::stStandIdleSmall() { } void Klaymen::stWonderAboutAfterSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x11C8D156, 30, -1); SetUpdateHandler(&Klaymen::update); @@ -1138,7 +1138,7 @@ void Klaymen::stWonderAboutAfterSmall() { } void Klaymen::stWonderAboutHalfSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x11C8D156, 0, 10); SetUpdateHandler(&Klaymen::update); @@ -1147,7 +1147,7 @@ void Klaymen::stWonderAboutHalfSmall() { } void Klaymen::stWonderAboutSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x11C8D156, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1156,7 +1156,7 @@ void Klaymen::stWonderAboutSmall() { } void Klaymen::stWalkToFrontNoStepSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimationByHash(0x3F9CC394, 0x14884392, 0); SetUpdateHandler(&Klaymen::update); @@ -1182,7 +1182,7 @@ uint32 Klaymen::hmWalkFrontBackSmall(int messageNum, const MessageParam ¶m, } void Klaymen::stWalkToFront2Small() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x2F1C4694, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1191,7 +1191,7 @@ void Klaymen::stWalkToFront2Small() { } void Klaymen::stWalkToFrontSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x3F9CC394, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1200,7 +1200,7 @@ void Klaymen::stWalkToFrontSmall() { } void Klaymen::stTurnToBackHalfSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimationByHash(0x37ECD436, 0, 0x8520108C); SetUpdateHandler(&Klaymen::update); @@ -1209,7 +1209,7 @@ void Klaymen::stTurnToBackHalfSmall() { } void Klaymen::stTurnToBackWalkSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x16EDDE36, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1218,7 +1218,7 @@ void Klaymen::stTurnToBackWalkSmall() { } void Klaymen::stTurnToBackSmall() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x37ECD436, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1228,7 +1228,7 @@ void Klaymen::stTurnToBackSmall() { void Klaymen::stPullCord() { if (!stStartAction(AnimationCallback(&Klaymen::stPullCord))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x3F28E094, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1263,7 +1263,7 @@ uint32 Klaymen::hmPullReleaseCord(int messageNum, const MessageParam ¶m, Ent void Klaymen::stUseTube() { if (!stStartAction(AnimationCallback(&Klaymen::stUseTube))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x1A38A814, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1298,7 +1298,7 @@ uint32 Klaymen::hmUseTube(int messageNum, const MessageParam ¶m, Entity *sen } void Klaymen::stWalkingFirstExt() { - _status2 = 0; + _busyStatus = 0; _isWalking = true; _acceptInput = true; startAnimation(0x5A2CBC00, 0, -1); @@ -1311,7 +1311,7 @@ void Klaymen::stWalkingFirstExt() { void Klaymen::stStartWalkingExt() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stStartWalkingExt))) { - _status2 = 0; + _busyStatus = 0; _isWalking = true; _acceptInput = true; setDoDeltaX(_destX < _x ? 1 : 0); @@ -1324,26 +1324,26 @@ void Klaymen::stStartWalkingExt() { } } -void Klaymen::sub41CC40(int16 x1, int16 x2) { - if (_x > x1) { - if (_x == x1 + x2) { - _destX = x1 + x2; +void Klaymen::startWalkToXDistance(int16 destX, int16 distance) { + if (_x > destX) { + if (_x == destX + distance) { + _destX = destX + distance; gotoState(NULL); gotoNextStateExt(); - } else if (_x < x1 + x2) { - startWalkToXExt(x1 + x2); + } else if (_x < destX + distance) { + startWalkToXExt(destX + distance); } else { - startWalkToX(x1 + x2, false); + startWalkToX(destX + distance, false); } } else { - if (_x == x1 - x2) { - _destX = x1 - x2; + if (_x == destX - distance) { + _destX = destX - distance; gotoState(NULL); gotoNextStateExt(); - } else if (_x > x1 - x2) { - startWalkToXExt(x1 - x2); + } else if (_x > destX - distance) { + startWalkToXExt(destX - distance); } else { - startWalkToX(x1 - x2, false); + startWalkToX(destX - distance, false); } } } @@ -1360,7 +1360,7 @@ void Klaymen::startWalkToXExt(int16 x) { _destX = x; gotoState(NULL); gotoNextStateExt(); - } else if (xdiff <= 42 && _status3 != 3) { + } else if (xdiff <= 42 && _actionStatus != 3) { if (_isSneaking && ((!_doDeltaX && x - _x > 0) || (_doDeltaX && x - _x < 0)) && ABS(_destX - _x) > xdiff) { _destX = x; } else { @@ -1376,7 +1376,7 @@ void Klaymen::startWalkToXExt(int16 x) { } void Klaymen::stLargeStep() { - _status2 = 2; + _busyStatus = 2; _isLargeStep = true; _acceptInput = true; setDoDeltaX(_destX >= _x ? 1 : 0); @@ -1447,7 +1447,7 @@ uint32 Klaymen::hmLargeStep(int messageNum, const MessageParam ¶m, Entity *s } void Klaymen::stWonderAboutHalf() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0xD820A114, 0, 10); SetUpdateHandler(&Klaymen::update); @@ -1456,7 +1456,7 @@ void Klaymen::stWonderAboutHalf() { } void Klaymen::stWonderAboutAfter() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0xD820A114, 30, -1); SetUpdateHandler(&Klaymen::update); @@ -1465,7 +1465,7 @@ void Klaymen::stWonderAboutAfter() { } void Klaymen::stTurnToUseHalf() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x9B250AD2, 0, 7); SetUpdateHandler(&Klaymen::update); @@ -1488,7 +1488,7 @@ uint32 Klaymen::hmTurnToUse(int messageNum, const MessageParam ¶m, Entity *s } void Klaymen::stTurnAwayFromUse() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x98F88391, 4, -1); SetUpdateHandler(&Klaymen::update); @@ -1497,7 +1497,7 @@ void Klaymen::stTurnAwayFromUse() { } void Klaymen::stWonderAbout() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0xD820A114, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1506,7 +1506,7 @@ void Klaymen::stWonderAbout() { } void Klaymen::stPeekWall() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0xAC20C012, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1535,7 +1535,7 @@ uint32 Klaymen::hmPeekWall(int messageNum, const MessageParam ¶m, Entity *se void Klaymen::stJumpToRing1() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing1))) { - _status2 = 0; + _busyStatus = 0; startAnimation(0xD82890BA, 0, -1); setupJumpToRing(); } @@ -1575,7 +1575,7 @@ void Klaymen::suUpdateDestX() { } void Klaymen::stHangOnRing() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x4829E0B8, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1585,7 +1585,7 @@ void Klaymen::stHangOnRing() { void Klaymen::stJumpToRing2() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing2))) { - _status2 = 0; + _busyStatus = 0; startAnimation(0x900980B2, 0, -1); setupJumpToRing(); } @@ -1593,7 +1593,7 @@ void Klaymen::stJumpToRing2() { void Klaymen::stJumpToRing3() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing3))) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0xBA1910B2, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1623,7 +1623,7 @@ uint32 Klaymen::hmJumpToRing3(int messageNum, const MessageParam ¶m, Entity } void Klaymen::stHoldRing3() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x4A293FB0, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1640,7 +1640,7 @@ uint32 Klaymen::hmHoldRing3(int messageNum, const MessageParam ¶m, Entity *s } void Klaymen::stReleaseRing() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; sendMessage(_attachedSprite, 0x4807, 0); _attachedSprite = NULL; @@ -1652,18 +1652,18 @@ void Klaymen::stReleaseRing() { void Klaymen::stJumpToRing4() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRing4))) { - _status2 = 0; + _busyStatus = 0; startAnimation(0xB8699832, 0, -1); setupJumpToRing(); } } -void Klaymen::sub41CCE0(int16 x) { - sub41CC40(_attachedSprite->getX(), x); +void Klaymen::startWalkToAttachedSpriteXDistance(int16 distance) { + startWalkToXDistance(_attachedSprite->getX(), distance); } void Klaymen::stContinueClimbLadderUp() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; _ladderStatus = 3; startAnimationByHash(0x3A292504, 0x01084280, 0); @@ -1676,7 +1676,7 @@ void Klaymen::stContinueClimbLadderUp() { void Klaymen::stStartClimbLadderDown() { if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderDown))) { - _status2 = 0; + _busyStatus = 0; if (_destY < _y) { if (_ladderStatus == 1) { _ladderStatus = 2; @@ -1707,7 +1707,7 @@ void Klaymen::stStartClimbLadderDown() { } void Klaymen::stClimbLadderHalf() { - _status2 = 2; + _busyStatus = 2; if (_ladderStatus == 1) { _ladderStatus = 0; _acceptInput = false; @@ -1773,7 +1773,7 @@ uint32 Klaymen::hmClimbLadderUpDown(int messageNum, const MessageParam ¶m, E void Klaymen::stStartClimbLadderUp() { if (!stStartAction(AnimationCallback(&Klaymen::stStartClimbLadderUp))) { - _status2 = 0; + _busyStatus = 0; if (_destY >= _y - 30) { gotoNextStateExt(); } else if (_ladderStatus == 0) { @@ -1799,7 +1799,7 @@ void Klaymen::stStartClimbLadderUp() { } void Klaymen::stWalkToFrontNoStep() { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimationByHash(0xF229C003, 0x14884392, 0); SetUpdateHandler(&Klaymen::update); @@ -1827,7 +1827,7 @@ uint32 Klaymen::hmWalkToFront(int messageNum, const MessageParam ¶m, Entity void Klaymen::stWalkToFront() { if (!stStartAction(AnimationCallback(&Klaymen::stWalkToFront))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0xF229C003, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1838,7 +1838,7 @@ void Klaymen::stWalkToFront() { void Klaymen::stTurnToFront() { if (!stStartAction(AnimationCallback(&Klaymen::stTurnToFront))) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimationByHash(0xCA221107, 0, 0x8520108C); SetUpdateHandler(&Klaymen::update); @@ -1849,7 +1849,7 @@ void Klaymen::stTurnToFront() { void Klaymen::stTurnToBack() { if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBack))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0xCA221107, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1859,7 +1859,7 @@ void Klaymen::stTurnToBack() { } void Klaymen::stLandOnFeet() { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x18118554, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1881,7 +1881,7 @@ uint32 Klaymen::hmLandOnFeet(int messageNum, const MessageParam ¶m, Entity * void Klaymen::stTurnToBackToUse() { if (!stStartAction(AnimationCallback(&Klaymen::stTurnToBackToUse))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x91540140, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1908,7 +1908,7 @@ uint32 Klaymen::hmTurnToBackToUse(int messageNum, const MessageParam ¶m, Ent void Klaymen::stClayDoorOpen() { if (!stStartAction(AnimationCallback(&Klaymen::stClayDoorOpen))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x5CCCB330, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1931,7 +1931,7 @@ uint32 Klaymen::hmClayDoorOpen(int messageNum, const MessageParam ¶m, Entity void Klaymen::stTurnToUse() { if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUse))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x9B250AD2, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -1941,7 +1941,7 @@ void Klaymen::stTurnToUse() { } void Klaymen::stReturnFromUse() { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x98F88391, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2017,7 +2017,7 @@ void Klaymen::stMoveObjectSkipTurn() { void Klaymen::stMoveObjectFaceObject() { setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); if (!stStartAction(AnimationCallback(&Klaymen::stMoveObjectFaceObject))) { - _status2 = 2; + _busyStatus = 2; _isMoveObjectRequested = false; _acceptInput = true; startAnimation(0x0C1CA072, 0, -1); @@ -2029,7 +2029,7 @@ void Klaymen::stMoveObjectFaceObject() { void Klaymen::stUseLever() { if (!stStartAction(AnimationCallback(&Klaymen::stUseLever))) { - _status2 = 0; + _busyStatus = 0; if (_isLeverDown) { stUseLeverRelease(); } else { @@ -2072,7 +2072,7 @@ void Klaymen::stUseLeverRelease() { void Klaymen::stReleaseLever() { if (_isLeverDown) { - _status2 = 2; + _busyStatus = 2; startAnimation(0x09018068, 0, -1); SetUpdateHandler(&Klaymen::update); SetMessageHandler(&Klaymen::hmLever); @@ -2097,7 +2097,7 @@ void Klaymen::evLeverReleasedEvent() { void Klaymen::stInsertDisk() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertDisk))) { - _status2 = 2; + _busyStatus = 2; _tapesToInsert = 0; for (uint32 i = 0; i < 20; i++) { if (getSubVar(VA_HAS_TAPE, i)) { @@ -2178,7 +2178,7 @@ void Klaymen::walkAlongPathPoints() { } void Klaymen::stJumpToGrab() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimationByHash(0x00AB8C10, 0x01084280, 0); SetUpdateHandler(&Klaymen::update); @@ -2213,7 +2213,7 @@ uint32 Klaymen::hmJumpToGrab(int messageNum, const MessageParam ¶m, Entity * } void Klaymen::stFinishGrow() { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x38445000, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2234,7 +2234,7 @@ uint32 Klaymen::hmFinishGrow(int messageNum, const MessageParam ¶m, Entity * void Klaymen::stTurnToUseExt() { if (!stStartAction(AnimationCallback(&Klaymen::stTurnToUseExt))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x1B3D8216, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2245,7 +2245,7 @@ void Klaymen::stTurnToUseExt() { void Klaymen::stJumpToGrabFall() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpToGrabFall))) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x00AB8C10, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2256,7 +2256,7 @@ void Klaymen::stJumpToGrabFall() { } void Klaymen::stJumpToGrabRelease() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimationByHash(0x00AB8C10, 0x320AC306, 0); SetUpdateHandler(&Klaymen::update); @@ -2281,7 +2281,7 @@ void Klaymen::stDoIdleTeleporterHands() { } void Klaymen::stIdleTeleporterHands() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x90EF8D38, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2295,7 +2295,7 @@ void Klaymen::stDoIdleTeleporterHands2() { } void Klaymen::stIdleTeleporterHands2() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0x900F0930, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2305,7 +2305,7 @@ void Klaymen::stIdleTeleporterHands2() { } void Klaymen::teleporterAppear(uint32 fileHash) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(fileHash, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2314,7 +2314,7 @@ void Klaymen::teleporterAppear(uint32 fileHash) { } void Klaymen::teleporterDisappear(uint32 fileHash) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(fileHash, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2350,7 +2350,7 @@ uint32 Klaymen::hmShrink(int messageNum, const MessageParam ¶m, Entity *send } void Klaymen::stShrink() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; playSound(0, 0x4C69EA53); startAnimation(0x1AE88904, 0, -1); @@ -2362,7 +2362,7 @@ void Klaymen::stShrink() { void Klaymen::stStandWonderAbout() { if (_x > 260) setDoDeltaX(1); - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0xD820A114, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2457,7 +2457,7 @@ uint32 Klaymen::hmGrow(int messageNum, const MessageParam ¶m, Entity *sender } void Klaymen::stGrow() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x2838C010, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2466,7 +2466,7 @@ void Klaymen::stGrow() { } void Klaymen::stDrinkPotion() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; _potionFlag1 = false; _potionFlag2 = false; @@ -2503,7 +2503,7 @@ uint32 Klaymen::hmInsertKey(int messageNum, const MessageParam ¶m, Entity *s void Klaymen::stInsertKey() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stInsertKey))) { - _status2 = 2; + _busyStatus = 2; _keysToInsert = 0; for (uint32 i = 0; i < 3; i++) { if (getSubVar(VA_HAS_KEY, i)) { @@ -2551,7 +2551,7 @@ uint32 Klaymen::hmReadNote(int messageNum, const MessageParam ¶m, Entity *se } void Klaymen::stReadNote() { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x123E9C9F, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2583,7 +2583,7 @@ uint32 Klaymen::hmHitByDoor(int messageNum, const MessageParam ¶m, Entity *s } void Klaymen::stHitByDoor() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2618,7 +2618,7 @@ void Klaymen::upPeekWallBlink() { } void Klaymen::stPeekWall1() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0xAC20C012, 8, 37); SetUpdateHandler(&Klaymen::update); @@ -2628,7 +2628,7 @@ void Klaymen::stPeekWall1() { } void Klaymen::stPeekWall2() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0xAC20C012, 43, 49); SetUpdateHandler(&Klaymen::update); @@ -2638,7 +2638,7 @@ void Klaymen::stPeekWall2() { void Klaymen::stPeekWallBlink() { _blinkCounter = 0; - _status2 = 0; + _busyStatus = 0; _acceptInput = true; _blinkCounterMax = _vm->_rnd->getRandomNumber(64) + 24; startAnimation(0xAC20C012, 38, 42); @@ -2649,7 +2649,7 @@ void Klaymen::stPeekWallBlink() { } void Klaymen::stPeekWallReturn() { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x2426932E, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2659,7 +2659,7 @@ void Klaymen::stPeekWallReturn() { void Klaymen::stPullHammerLever() { if (!stStartAction(AnimationCallback(&Klaymen::stPullHammerLever))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x00648953, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2688,7 +2688,7 @@ void Klaymen::suRidePlatformDown() { void Klaymen::stRidePlatformDown() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatformDown))) { - _status2 = 1; + _busyStatus = 1; sendMessage(_parentScene, 0x4803, 0); _acceptInput = false; _platformDeltaY = 0; @@ -2702,7 +2702,7 @@ void Klaymen::stRidePlatformDown() { void Klaymen::stCrashDown() { playSound(0, 0x41648271); - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimationByHash(0x000BAB02, 0x88003000, 0); SetUpdateHandler(&Klaymen::update); @@ -2879,7 +2879,7 @@ void Klaymen::suFallDown() { void Klaymen::stJumpToRingVenusFlyTrap() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpToRingVenusFlyTrap))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x584984B4, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2892,7 +2892,7 @@ void Klaymen::stJumpToRingVenusFlyTrap() { void Klaymen::stStandIdleSpecial() { playSound(0, 0x56548280); - _status2 = 0; + _busyStatus = 0; _acceptInput = false; _surface->setVisible(false); startAnimation(0x5420E254, 0, -1); @@ -2903,7 +2903,7 @@ void Klaymen::stStandIdleSpecial() { void Klaymen::stSpitOutFall0() { _countdown1 = 1; - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x000BAB02, 0, -1); SetUpdateHandler(&Klaymen::upSpitOutFall); @@ -2915,7 +2915,7 @@ void Klaymen::stSpitOutFall0() { void Klaymen::stSpitOutFall2() { _countdown1 = 1; - _status2 = 0; + _busyStatus = 0; _acceptInput = false; startAnimation(0x9308C132, 0, -1); SetUpdateHandler(&Klaymen::upSpitOutFall); @@ -2928,7 +2928,7 @@ void Klaymen::stSpitOutFall2() { void Klaymen::stFalling() { sendMessage(_parentScene, 0x1024, 1); playSound(0, 0x41648271); - _status2 = 1; + _busyStatus = 1; _acceptInput = false; _isWalking = false; startAnimationByHash(0x000BAB02, 0x88003000, 0); @@ -2949,7 +2949,7 @@ void Klaymen::stFallTouchdown() { void Klaymen::stJumpAndFall() { if (!stStartAction(AnimationCallback(&Klaymen::stJumpAndFall))) { sendMessage(_parentScene, 0x1024, 3); - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0xB93AB151, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2965,7 +2965,7 @@ void Klaymen::stDropFromRing() { sendMessage(_attachedSprite, 0x4807, 0); _attachedSprite = NULL; } - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimation(0x586984B1, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -2975,7 +2975,7 @@ void Klaymen::stDropFromRing() { } void Klaymen::stPressDoorButton() { - _status2 = 2; + _busyStatus = 2; _acceptInput = true; setDoDeltaX(0); startAnimation(0x1CD89029, 0, -1); @@ -2985,7 +2985,7 @@ void Klaymen::stPressDoorButton() { } void Klaymen::stHitByBoxingGlove() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x35AA8059, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -3000,7 +3000,7 @@ void Klaymen::evHitByBoxingGloveDone() { void Klaymen::stMoveVenusFlyTrap() { if (!stStartAction(AnimationCallback(&Klaymen::stMoveVenusFlyTrap))) { - _status2 = 2; + _busyStatus = 2; _isMoveObjectRequested = false; _acceptInput = true; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); @@ -3037,7 +3037,7 @@ void Klaymen::suFallSkipJump() { } void Klaymen::stFallSkipJump() { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; startAnimationByHash(0xB93AB151, 0x40A100F8, 0); SetUpdateHandler(&Klaymen::update); @@ -3074,7 +3074,7 @@ uint32 Klaymen::hmMatch(int messageNum, const MessageParam ¶m, Entity *sende void Klaymen::stFetchMatch() { if (!stStartAction(AnimationCallback(&Klaymen::stFetchMatch))) { - _status2 = 0; + _busyStatus = 0; _acceptInput = false; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x9CAA0218, 0, -1); @@ -3086,7 +3086,7 @@ void Klaymen::stFetchMatch() { } void Klaymen::stLightMatch() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; setDoDeltaX(_attachedSprite->getX() < _x ? 1 : 0); startAnimation(0x1222A513, 0, -1); @@ -3128,7 +3128,7 @@ uint32 Klaymen::hmTumbleHeadless(int messageNum, const MessageParam ¶m, Enti void Klaymen::stMoveObject() { if (!stStartAction(AnimationCallback(&Klaymen::stMoveObject))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = false; _moveObjectCountdown = 8; setDoDeltaX(0); @@ -3149,7 +3149,7 @@ void Klaymen::stContinueMoveObject() { void Klaymen::stTumbleHeadless() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stTumbleHeadless))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; setDoDeltaX(0); startAnimation(0x2821C590, 0, -1); @@ -3164,7 +3164,7 @@ void Klaymen::stTumbleHeadless() { void Klaymen::stCloseEyes() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stCloseEyes))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -3200,7 +3200,7 @@ void Klaymen::stTrySpitIntoPipe() { if (_canSpitPipe) spitIntoPipe(); } else if (!stStartAction(AnimationCallback(&Klaymen::stTrySpitIntoPipe))) { - _status2 = 2; + _busyStatus = 2; _acceptInput = true; _spitDestPipeIndex = _spitPipeIndex; _readyToSpit = true; @@ -3242,7 +3242,7 @@ void Klaymen::suRidePlatform() { void Klaymen::stRidePlatform() { if (!stStartActionFromIdle(AnimationCallback(&Klaymen::stRidePlatform))) { - _status2 = 1; + _busyStatus = 1; _acceptInput = true; startAnimation(0x5420E254, 0, -1); SetUpdateHandler(&Klaymen::update); @@ -3253,7 +3253,7 @@ void Klaymen::stRidePlatform() { void Klaymen::stInteractLever() { if (!stStartAction(AnimationCallback(&Klaymen::stInteractLever))) { - _status2 = 0; + _busyStatus = 0; if (_isLeverDown) { stUseLeverRelease(); } else { @@ -3295,7 +3295,7 @@ void Klaymen::stStartWalkingResume() { int16 frameIndex = getGlobalVar(V_KLAYMEN_FRAMEINDEX) + _walkResumeFrameIncr; if (frameIndex < 0 || frameIndex > 13) frameIndex = 0; - _status2 = 0; + _busyStatus = 0; _isWalking = true; _acceptInput = true; startAnimation(0x1A249001, frameIndex, -1); @@ -3314,7 +3314,7 @@ void Klaymen::upPeekInsideBlink() { } void Klaymen::stPeekInside() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0xAC20C012, 8, 37); SetUpdateHandler(&Klaymen::update); @@ -3324,7 +3324,7 @@ void Klaymen::stPeekInside() { } void Klaymen::stPeekInsideReturn() { - _status2 = 1; + _busyStatus = 1; _acceptInput = false; startAnimation(0xAC20C012, 43, 49); SetUpdateHandler(&Klaymen::update); @@ -3333,7 +3333,7 @@ void Klaymen::stPeekInsideReturn() { } void Klaymen::stPeekInsideBlink() { - _status2 = 0; + _busyStatus = 0; _acceptInput = true; startAnimation(0xAC20C012, 38, 42); _newStickFrameIndex = 42; @@ -3382,11 +3382,10 @@ uint32 KmScene1001::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 0) @@ -3426,7 +3425,6 @@ KmScene1002::KmScene1002(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 : Klaymen(vm, parentScene, x, y) { setKlaymenIdleTable1(); - } void KmScene1002::xUpdate() { @@ -3496,7 +3494,7 @@ uint32 KmScene1002::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - sub41CCE0(param.asInteger()); + startWalkToAttachedSpriteXDistance(param.asInteger()); break; case 0x4820: sendMessage(_parentScene, 0x2005, 0); @@ -3677,8 +3675,7 @@ KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 : Klaymen(vm, parentScene, x, y) { setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); - _flagF6 = true; - + _doYHitIncr = true; } uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3714,11 +3711,10 @@ uint32 KmScene1201::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -3792,11 +3788,10 @@ uint32 KmScene1304::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 1) @@ -3845,6 +3840,7 @@ uint32 KmScene1305::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1306::KmScene1306(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -3888,11 +3884,10 @@ uint32 KmScene1306::xHandleMessage(int messageNum, const MessageParam ¶m) { GotoState(&Klaymen::stInsertDisk); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: if (_isSittingInTeleporter) @@ -4007,9 +4002,9 @@ uint32 KmScene1308::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4069,11 +4064,10 @@ uint32 KmScene1401::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 1) @@ -4131,11 +4125,10 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4186,11 +4179,10 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x4827: GotoState(&Klaymen::stReleaseLever); @@ -4209,7 +4201,7 @@ uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1404::KmScene1404(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { - + // Empty } @@ -4245,9 +4237,9 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4283,6 +4275,8 @@ uint32 KmScene1404::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1608::KmScene1608(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + + // Empty } uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4315,11 +4309,10 @@ uint32 KmScene1608::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: if (_isSittingInTeleporter) @@ -4410,9 +4403,9 @@ uint32 KmScene1705::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: if (_isSittingInTeleporter) { @@ -4610,9 +4603,9 @@ uint32 KmScene2101::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: if (_isSittingInTeleporter) @@ -4649,9 +4642,7 @@ KmScene2201::KmScene2201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); - _dataResource.load(0x04104242); - _flagF6 = false; } uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -4678,11 +4669,10 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { startWalkToX(_dataResource.getPoint(param.asInteger()).x, false); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4718,6 +4708,7 @@ uint32 KmScene2201::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2203::KmScene2203(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -4761,9 +4752,9 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -4787,6 +4778,7 @@ uint32 KmScene2203::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2205::KmScene2205(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -4884,11 +4876,10 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { gotoNextStateExt(); break; case 0x481B: - if (param.asPoint().y != 0) { - sub41CC40(param.asPoint().y, param.asPoint().x); - } else { - sub41CCE0(param.asPoint().x); - } + if (param.asPoint().y != 0) + startWalkToXDistance(param.asPoint().y, param.asPoint().x); + else + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 0) @@ -4933,6 +4924,7 @@ uint32 KmScene2206::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2207::KmScene2207(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -4972,9 +4964,9 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x4827: GotoState(&Klaymen::stReleaseLever); @@ -4995,6 +4987,7 @@ uint32 KmScene2207::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2242::KmScene2242(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5032,9 +5025,9 @@ uint32 KmScene2242::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 0) @@ -5113,6 +5106,7 @@ uint32 KmHallOfRecords::xHandleMessage(int messageNum, const MessageParam ¶m KmScene2247::KmScene2247(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5165,6 +5159,7 @@ uint32 KmScene2247::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2401::KmScene2401(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5192,9 +5187,9 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 1) @@ -5243,6 +5238,7 @@ uint32 KmScene2401::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2402::KmScene2402(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5283,9 +5279,9 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 0) @@ -5311,6 +5307,7 @@ uint32 KmScene2402::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2403::KmScene2403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5344,9 +5341,9 @@ uint32 KmScene2403::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 0) @@ -5396,7 +5393,6 @@ KmScene2406::KmScene2406(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); - } uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5433,9 +5429,9 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -5485,6 +5481,7 @@ uint32 KmScene2406::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2501::KmScene2501(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5536,6 +5533,7 @@ uint32 KmScene2501::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2732::KmScene2732(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5553,6 +5551,7 @@ uint32 KmScene2732::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2801::KmScene2801(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5574,9 +5573,9 @@ uint32 KmScene2801::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); @@ -5623,7 +5622,6 @@ KmScene2803::KmScene2803(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); - _dataResource.load(0x00900849); } @@ -5737,6 +5735,7 @@ uint32 KmScene2803Small::xHandleMessage(int messageNum, const MessageParam ¶ KmScene2805::KmScene2805(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5793,10 +5792,10 @@ uint32 KmScene2805::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount) + bool needsLargeSurface, NRect *clipRects, uint clipRectsCount) : Klaymen(vm, parentScene, x, y) { - if (flag) { + if (needsLargeSurface) { NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); delete _surface; createSurface(1000, dimensions.width, dimensions.height); @@ -5809,7 +5808,6 @@ KmScene2806::KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 _dataResource.load(0x98182003); _surface->setClipRects(clipRects, clipRectsCount); - } uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5852,10 +5850,10 @@ uint32 KmScene2806::xHandleMessage(int messageNum, const MessageParam ¶m) { } KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount) + bool needsLargeSurface, NRect *clipRects, uint clipRectsCount) : Klaymen(vm, parentScene, x, y) { - if (flag) { + if (needsLargeSurface) { NDimensions dimensions = _animResource.loadSpriteDimensions(0x2838C010); delete _surface; createSurface(1000, dimensions.width, dimensions.height); @@ -5868,7 +5866,6 @@ KmScene2809::KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 _dataResource.load(0x1830009A); _surface->setClipRects(clipRects, clipRectsCount); - } uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5912,6 +5909,7 @@ uint32 KmScene2809::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2810Small::KmScene2810Small(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -5962,7 +5960,6 @@ KmScene2810::KmScene2810(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 : Klaymen(vm, parentScene, x, y) { _surface->setClipRects(clipRects, clipRectsCount); - } uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { @@ -5994,9 +5991,9 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481F: if (param.asInteger() == 0) @@ -6053,6 +6050,7 @@ uint32 KmScene2810::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene2812::KmScene2812(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { + // Empty } @@ -6086,9 +6084,9 @@ uint32 KmScene2812::xHandleMessage(int messageNum, const MessageParam ¶m) { break; case 0x481B: if (param.asPoint().y != 0) - sub41CC40(param.asPoint().y, param.asPoint().x); + startWalkToXDistance(param.asPoint().y, param.asPoint().x); else - sub41CCE0(param.asPoint().x); + startWalkToAttachedSpriteXDistance(param.asPoint().x); break; case 0x481D: GotoState(&Klaymen::stTurnToUse); diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h index 31f8e5a700..4cf9e72390 100644 --- a/engines/neverhood/klaymen.h +++ b/engines/neverhood/klaymen.h @@ -399,12 +399,12 @@ protected: int16 _blinkCounter, _blinkCounterMax; int16 _countdown1; int16 _tapesToInsert, _keysToInsert; - bool _flagF6; + bool _doYHitIncr; bool _isLeverDown; bool _isWalkingOpenDoorNotified; - int _status2; - bool _flagFA; - int _status3; + int _busyStatus; + bool _actionStatusChanged; + int _actionStatus; const KlaymenIdleTableItem *_idleTable; int _idleTableCount; int _idleTableMaxValue; @@ -436,17 +436,17 @@ protected: // TODO Check if this can be turned into a void result virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); - void startWalkToX(int16 x, bool flag); + void startWalkToX(int16 x, bool walkExt); void startWalkToXExt(int16 x); void startWalkToXSmall(int16 x); void startSpecialWalkLeft(int16 x); void startSpecialWalkRight(int16 x); - void sub41CC40(int16 x1, int16 x2); - void sub41CCE0(int16 x); + void startWalkToXDistance(int16 destX, int16 distance); + void startWalkToAttachedSpriteXDistance(int16 distance); void gotoNextStateExt(); - void sub41C770(); - void sub41C790(); + void beginAction(); + void endAction(); void stStartWalkingSmall(); uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); @@ -724,7 +724,7 @@ protected: class KmScene2806 : public Klaymen { public: KmScene2806(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount); + bool needsLargeSurface, NRect *clipRects, uint clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; @@ -732,7 +732,7 @@ protected: class KmScene2809 : public Klaymen { public: KmScene2809(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, - bool flag, NRect *clipRects, uint clipRectsCount); + bool needsLargeSurface, NRect *clipRects, uint clipRectsCount); protected: uint32 xHandleMessage(int messageNum, const MessageParam ¶m); }; -- cgit v1.2.3 From 9ae1888593ae25680a53819a038e9123db30b038 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 25 Jan 2013 09:12:49 +0000 Subject: NEVERHOOD: Change Klaymen idle callbacks from method pointers to integers and evaluate these in a new method enterIdleAnimation --- engines/neverhood/klaymen.cpp | 138 +++++++++++++++++++++--------------------- engines/neverhood/klaymen.h | 29 +++++---- 2 files changed, 86 insertions(+), 81 deletions(-) diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp index 484d7aa3aa..2563ce000c 100644 --- a/engines/neverhood/klaymen.cpp +++ b/engines/neverhood/klaymen.cpp @@ -27,35 +27,35 @@ namespace Neverhood { -static const KlaymenIdleTableItem klaymenTable1[] = { - {1, &Klaymen::stDoIdlePickEar}, - {1, &Klaymen::stDoIdleSpinHead}, - {1, &Klaymen::stDoIdleArms}, - {1, &Klaymen::stDoIdleChest}, - {1, &Klaymen::stDoIdleHeadOff} +static const KlaymenIdleTableItem klaymenIdleTable1[] = { + {1, kIdlePickEar}, + {1, kIdleSpinHead}, + {1, kIdleArms}, + {1, kIdleChest}, + {1, kIdleHeadOff} }; -static const KlaymenIdleTableItem klaymenTable2[] = { - {1, &Klaymen::stDoIdlePickEar}, - {1, &Klaymen::stDoIdleSpinHead}, - {1, &Klaymen::stDoIdleChest}, - {1, &Klaymen::stDoIdleHeadOff} +static const KlaymenIdleTableItem klaymenIdleTable2[] = { + {1, kIdlePickEar}, + {1, kIdleSpinHead}, + {1, kIdleChest}, + {1, kIdleHeadOff} }; -static const KlaymenIdleTableItem klaymenTable3[] = { - {1, &Klaymen::stDoIdleTeleporterHands}, - {1, &Klaymen::stDoIdleTeleporterHands2} +static const KlaymenIdleTableItem klaymenIdleTable3[] = { + {1, kIdleTeleporterHands}, + {1, kIdleTeleporterHands2} }; -static const KlaymenIdleTableItem klaymenTable4[] = { - {1, &Klaymen::stDoIdleSpinHead}, - {1, &Klaymen::stDoIdleChest}, - {1, &Klaymen::stDoIdleHeadOff}, +static const KlaymenIdleTableItem klaymenIdleTable4[] = { + {1, kIdleSpinHead}, + {1, kIdleChest}, + {1, kIdleHeadOff}, }; static const KlaymenIdleTableItem klaymenIdleTable1002[] = { - {1, &Klaymen::stDoIdlePickEar}, - {2, &Klaymen::stIdleWonderAbout} + {1, kIdlePickEar}, + {2, kIdleWonderAbout} }; // Klaymen @@ -103,28 +103,24 @@ void Klaymen::update() { xUpdate(); } -void Klaymen::setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount) { +void Klaymen::setKlaymenIdleTable(const KlaymenIdleTableItem *table, uint tableCount) { _idleTable = table; _idleTableCount = tableCount; - _idleTableMaxValue = 0; - for (int i = 0; i < tableCount; i++) - _idleTableMaxValue += table[i].value; + _idleTableTotalWeight = 0; + for (uint i = 0; i < tableCount; i++) + _idleTableTotalWeight += table[i].weight; } void Klaymen::setKlaymenIdleTable1() { - setKlaymenIdleTable(klaymenTable1, ARRAYSIZE(klaymenTable1)); + setKlaymenIdleTable(klaymenIdleTable1, ARRAYSIZE(klaymenIdleTable1)); } void Klaymen::setKlaymenIdleTable2() { - setKlaymenIdleTable(klaymenTable2, ARRAYSIZE(klaymenTable2)); + setKlaymenIdleTable(klaymenIdleTable2, ARRAYSIZE(klaymenIdleTable2)); } void Klaymen::setKlaymenIdleTable3() { - setKlaymenIdleTable(klaymenTable3, ARRAYSIZE(klaymenTable3)); -} - -void Klaymen::stDoIdlePickEar() { - startIdleAnimation(0x5B20C814, AnimationCallback(&Klaymen::stIdlePickEar)); + setKlaymenIdleTable(klaymenIdleTable3, ARRAYSIZE(klaymenIdleTable3)); } void Klaymen::stIdlePickEar() { @@ -154,10 +150,6 @@ void Klaymen::evIdlePickEarDone() { stopSound(0); } -void Klaymen::stDoIdleSpinHead() { - startIdleAnimation(0xD122C137, AnimationCallback(&Klaymen::stIdleSpinHead)); -} - void Klaymen::stIdleSpinHead() { _busyStatus = 1; _acceptInput = true; @@ -180,10 +172,6 @@ uint32 Klaymen::hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity return messageResult; } -void Klaymen::stDoIdleArms() { - startIdleAnimation(0x543CD054, AnimationCallback(&Klaymen::stIdleArms)); -} - void Klaymen::stIdleArms() { _busyStatus = 1; _acceptInput = true; @@ -215,10 +203,6 @@ uint32 Klaymen::hmIdleArms(int messageNum, const MessageParam ¶m, Entity *se return messageResult; } -void Klaymen::stDoIdleChest() { - startIdleAnimation(0x40A0C034, AnimationCallback(&Klaymen::stIdleChest)); -} - void Klaymen::stIdleChest() { _busyStatus = 1; _acceptInput = true; @@ -241,10 +225,6 @@ uint32 Klaymen::hmIdleChest(int messageNum, const MessageParam ¶m, Entity *s return messageResult; } -void Klaymen::stDoIdleHeadOff() { - startIdleAnimation(0x5120E137, AnimationCallback(&Klaymen::stIdleHeadOff)); -} - void Klaymen::stIdleHeadOff() { _busyStatus = 1; _acceptInput = true; @@ -298,18 +278,17 @@ void Klaymen::stSitIdleTeleporter() { void Klaymen::upSitIdleTeleporter() { update(); - _idleCounter++; - if (_idleCounter >= _idleCounterMax) { + if (++_idleCounter >= _idleCounterMax) { _idleCounter = 0; if (_idleTable) { - int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue); - for (int i = 0; i < _idleTableCount; i++) { - if (randomValue < _idleTable[i].value) { - (this->*(_idleTable[i].callback))(); + int idleWeight = _vm->_rnd->getRandomNumber(_idleTableTotalWeight - 1); + for (uint i = 0; i < _idleTableCount; i++) { + if (idleWeight < _idleTable[i].weight) { + enterIdleAnimation(_idleTable[i].idleAnimation); _idleCounterMax = _vm->_rnd->getRandomNumber(128 - 1) + 24; break; } - randomValue -= _idleTable[i].value; + idleWeight -= _idleTable[i].weight; } } } else if (++_blinkCounter >= _blinkCounterMax) { @@ -524,13 +503,13 @@ void Klaymen::upStandIdle() { if (++_idleCounter >= 720) { _idleCounter = 0; if (_idleTable) { - int randomValue = _vm->_rnd->getRandomNumber(_idleTableMaxValue - 1); - for (int i = 0; i < _idleTableCount; i++) { - if (randomValue < _idleTable[i].value) { - (this->*(_idleTable[i].callback))(); + int idleWeight = _vm->_rnd->getRandomNumber(_idleTableTotalWeight - 1); + for (uint i = 0; i < _idleTableCount; i++) { + if (idleWeight < _idleTable[i].weight) { + enterIdleAnimation(_idleTable[i].idleAnimation); break; } - randomValue -= _idleTable[i].value; + idleWeight -= _idleTable[i].weight; } } } else if (++_blinkCounter >= _blinkCounterMax) { @@ -2177,6 +2156,35 @@ void Klaymen::walkAlongPathPoints() { } } +void Klaymen::enterIdleAnimation(uint idleAnimation) { + switch (idleAnimation) { + case kIdlePickEar: + startIdleAnimation(0x5B20C814, AnimationCallback(&Klaymen::stIdlePickEar)); + break; + case kIdleSpinHead: + startIdleAnimation(0xD122C137, AnimationCallback(&Klaymen::stIdleSpinHead)); + break; + case kIdleArms: + startIdleAnimation(0x543CD054, AnimationCallback(&Klaymen::stIdleArms)); + break; + case kIdleChest: + startIdleAnimation(0x40A0C034, AnimationCallback(&Klaymen::stIdleChest)); + break; + case kIdleHeadOff: + startIdleAnimation(0x5120E137, AnimationCallback(&Klaymen::stIdleHeadOff)); + break; + case kIdleTeleporterHands: + startIdleAnimation(0x90EF8D38, AnimationCallback(&Klaymen::stIdleTeleporterHands)); + break; + case kIdleTeleporterHands2: + startIdleAnimation(0x900F0930, AnimationCallback(&Klaymen::stIdleTeleporterHands2)); + break; + case kIdleWonderAbout: + stIdleWonderAbout(); + break; + } +} + void Klaymen::stJumpToGrab() { _busyStatus = 0; _acceptInput = false; @@ -2276,10 +2284,6 @@ uint32 Klaymen::hmJumpToGrabRelease(int messageNum, const MessageParam ¶m, E return messageResult; } -void Klaymen::stDoIdleTeleporterHands() { - startIdleAnimation(0x90EF8D38, AnimationCallback(&Klaymen::stIdleTeleporterHands)); -} - void Klaymen::stIdleTeleporterHands() { _busyStatus = 0; _acceptInput = true; @@ -2290,10 +2294,6 @@ void Klaymen::stIdleTeleporterHands() { NextState(&Klaymen::stSitIdleTeleporterBlinkSecond); } -void Klaymen::stDoIdleTeleporterHands2() { - startIdleAnimation(0x900F0930, AnimationCallback(&Klaymen::stIdleTeleporterHands2)); -} - void Klaymen::stIdleTeleporterHands2() { _busyStatus = 0; _acceptInput = true; @@ -3674,7 +3674,7 @@ uint32 KmScene1109::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1201::KmScene1201(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { - setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); + setKlaymenIdleTable(klaymenIdleTable4, ARRAYSIZE(klaymenIdleTable4)); _doYHitIncr = true; } @@ -4145,7 +4145,7 @@ uint32 KmScene1402::xHandleMessage(int messageNum, const MessageParam ¶m) { KmScene1403::KmScene1403(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) : Klaymen(vm, parentScene, x, y) { - setKlaymenIdleTable(klaymenTable4, ARRAYSIZE(klaymenTable4)); + setKlaymenIdleTable(klaymenIdleTable4, ARRAYSIZE(klaymenIdleTable4)); } uint32 KmScene1403::xHandleMessage(int messageNum, const MessageParam ¶m) { diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h index 4cf9e72390..d1b0b5974b 100644 --- a/engines/neverhood/klaymen.h +++ b/engines/neverhood/klaymen.h @@ -41,12 +41,23 @@ const uint32 kKlaymenSpeedUpHash = 0x004A2148; #include "common/pack-start.h" // START STRUCT PACKING struct KlaymenIdleTableItem { - int value; - void (Klaymen::*callback)(); + int weight; + uint idleAnimation; }; #include "common/pack-end.h" // END STRUCT PACKING +enum { + kIdlePickEar, + kIdleSpinHead, + kIdleArms, + kIdleChest, + kIdleHeadOff, + kIdleTeleporterHands, + kIdleTeleporterHands2, + kIdleWonderAbout +}; + class Klaymen : public AnimatedSprite { public: Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects = NULL); @@ -56,34 +67,27 @@ public: void startIdleAnimation(uint32 fileHash, AnimationCb callback); void upIdleAnimation(); - void stDoIdlePickEar(); void stIdlePickEar(); void evIdlePickEarDone(); uint32 hmIdlePickEar(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoIdleSpinHead(); void stIdleSpinHead(); uint32 hmIdleSpinHead(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoIdleArms(); void stIdleArms(); void evIdleArmsDone(); uint32 hmIdleArms(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoIdleChest(); void stIdleChest(); uint32 hmIdleChest(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoIdleHeadOff(); void stIdleHeadOff(); uint32 hmIdleHeadOff(int messageNum, const MessageParam ¶m, Entity *sender); void stIdleWonderAbout(); - void stDoIdleTeleporterHands(); void stIdleTeleporterHands(); - void stDoIdleTeleporterHands2(); void stIdleTeleporterHands2(); void stTryStandIdle(); @@ -367,7 +371,7 @@ public: uint32 hmLowLevel(int messageNum, const MessageParam ¶m, Entity *sender); uint32 hmLowLevelAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - void setKlaymenIdleTable(const KlaymenIdleTableItem *table, int tableCount); + void setKlaymenIdleTable(const KlaymenIdleTableItem *table, uint tableCount); void setKlaymenIdleTable1(); void setKlaymenIdleTable2(); void setKlaymenIdleTable3(); @@ -406,8 +410,8 @@ protected: bool _actionStatusChanged; int _actionStatus; const KlaymenIdleTableItem *_idleTable; - int _idleTableCount; - int _idleTableMaxValue; + uint _idleTableCount; + int _idleTableTotalWeight; NPointArray *_pathPoints; bool _soundFlag; @@ -451,6 +455,7 @@ protected: void stStartWalkingSmall(); uint32 hmWalkingSmall(int messageNum, const MessageParam ¶m, Entity *sender); + void enterIdleAnimation(uint idleAnimation); void walkAlongPathPoints(); }; -- cgit v1.2.3 From 65c6984635849f451d2137a37407813a3ada105e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Fri, 25 Jan 2013 13:47:06 +0000 Subject: NEVERHOOD: Implement game-internal savegame overwrite query screen - Rename and reorder fields in the Klaymen class --- engines/neverhood/klaymen.cpp | 8 ++-- engines/neverhood/klaymen.h | 8 ++-- engines/neverhood/menumodule.cpp | 84 ++++++++++++++++++++++++++++++++-------- engines/neverhood/menumodule.h | 9 ++++- 4 files changed, 85 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/klaymen.cpp b/engines/neverhood/klaymen.cpp index 2563ce000c..06d606e18d 100644 --- a/engines/neverhood/klaymen.cpp +++ b/engines/neverhood/klaymen.cpp @@ -62,7 +62,7 @@ static const KlaymenIdleTableItem klaymenIdleTable1002[] = { Klaymen::Klaymen(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, NRectArray *clipRects) : AnimatedSprite(vm, 1000), _idleCounterMax(0), _idleCounter(0), _isMoveObjectRequested(false), _blinkCounterMax(0), - _isWalkingOpenDoorNotified(false), _countdown1(0), _tapesToInsert(0), _keysToInsert(0), _busyStatus(0), _acceptInput(true), + _isWalkingOpenDoorNotified(false), _spitOutCountdown(0), _tapesToInsert(0), _keysToInsert(0), _busyStatus(0), _acceptInput(true), _attachedSprite(NULL), _isWalking(false), _actionStatus(1), _parentScene(parentScene), _isSneaking(false), _isLargeStep(false), _doYHitIncr(false), _isLeverDown(false), _isSittingInTeleporter(false), _actionStatusChanged(false), _ladderStatus(0), _pathPoints(NULL), _soundFlag(false), _idleTableNum(0), _otherSprite(NULL), _moveObjectCountdown(0), _readyToSpit(false), _walkResumeFrameIncr(0) { @@ -2718,7 +2718,7 @@ void Klaymen::stCrashDownFinished() { void Klaymen::upSpitOutFall() { Klaymen::update(); - if (_countdown1 != 0 && (--_countdown1 == 0)) { + if (_spitOutCountdown != 0 && (--_spitOutCountdown == 0)) { _surface->setVisible(true); SetUpdateHandler(&Klaymen::update); } @@ -2902,7 +2902,7 @@ void Klaymen::stStandIdleSpecial() { } void Klaymen::stSpitOutFall0() { - _countdown1 = 1; + _spitOutCountdown = 1; _busyStatus = 0; _acceptInput = false; startAnimation(0x000BAB02, 0, -1); @@ -2914,7 +2914,7 @@ void Klaymen::stSpitOutFall0() { } void Klaymen::stSpitOutFall2() { - _countdown1 = 1; + _spitOutCountdown = 1; _busyStatus = 0; _acceptInput = false; startAnimation(0x9308C132, 0, -1); diff --git a/engines/neverhood/klaymen.h b/engines/neverhood/klaymen.h index d1b0b5974b..25443b5a35 100644 --- a/engines/neverhood/klaymen.h +++ b/engines/neverhood/klaymen.h @@ -401,7 +401,6 @@ protected: int16 _destX, _destY; int16 _idleCounter, _idleCounterMax; int16 _blinkCounter, _blinkCounterMax; - int16 _countdown1; int16 _tapesToInsert, _keysToInsert; bool _doYHitIncr; bool _isLeverDown; @@ -409,12 +408,17 @@ protected: int _busyStatus; bool _actionStatusChanged; int _actionStatus; + const KlaymenIdleTableItem *_idleTable; uint _idleTableCount; int _idleTableTotalWeight; + int _idleTableNum; + NPointArray *_pathPoints; bool _soundFlag; + int16 _spitOutCountdown; + bool _isSittingInTeleporter; bool _potionFlag1; @@ -423,7 +427,6 @@ protected: int16 _platformDeltaY; Sprite *_otherSprite; - int _idleTableNum; int16 _walkResumeFrameIncr; @@ -437,7 +440,6 @@ protected: uint32 _spitContDestPipeIndex; virtual void xUpdate(); - // TODO Check if this can be turned into a void result virtual uint32 xHandleMessage(int messageNum, const MessageParam ¶m); void startWalkToX(int16 x, bool walkExt); diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 396d8cfb30..f1669a6213 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -32,7 +32,8 @@ enum { CREDITS_SCENE = 1, MAKING_OF = 2, LOAD_GAME_MENU = 3, - SAVE_GAME_MENU = 4 + SAVE_GAME_MENU = 4, + QUERY_OVR_MENU = 5 }; enum { @@ -109,6 +110,9 @@ void MenuModule::createScene(int sceneNum, int which) { case SAVE_GAME_MENU: createSaveGameMenu(); break; + case QUERY_OVR_MENU: + _childObject = new QueryOverwriteMenu(_vm, this, _savegameDescription); + break; } SetUpdateHandler(&MenuModule::updateScene); _childObject->handleUpdate(); @@ -162,7 +166,10 @@ void MenuModule::updateScene() { handleLoadGameMenuAction(_moduleResult != 1); break; case SAVE_GAME_MENU: - handleSaveGameMenuAction(_moduleResult != 1); + handleSaveGameMenuAction(_moduleResult != 1, true); + break; + case QUERY_OVR_MENU: + handleSaveGameMenuAction(_moduleResult != 1, false); break; default: break; @@ -199,16 +206,19 @@ void MenuModule::handleLoadGameMenuAction(bool doLoad) { _savegameList = NULL; } -void MenuModule::handleSaveGameMenuAction(bool doSave) { - createScene(MAIN_MENU, -1); - if (doSave && _savegameSlot >= 0) { +void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) { + if (doSave && doQuery && _savegameSlot >= 0 && _savegameSlot < (int)_savegameList->size()) { + createScene(QUERY_OVR_MENU, -1); + } else if (doSave && _savegameSlot >= 0) { // Restore the scene palette and background so that the correct thumbnail is saved byte *menuPaletteData = _vm->_screen->getPaletteData(); _vm->_screen->setPaletteData(_savedPaletteData); _vm->_gameModule->redrawPrevChildObject(); _vm->saveGameState(_savegameSlot, _savegameDescription); _vm->_screen->setPaletteData(menuPaletteData); - leaveModule(0); + createScene(MAIN_MENU, -1); + } else { + createScene(MAIN_MENU, -1); } delete _savegameList; _savegameList = NULL; @@ -1010,22 +1020,13 @@ void LoadGameMenu::handleEvent(int16 itemID, int eventType) { uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { -#if 0 - case 0x000A: - sendMessage(_textEditWidget, 0x000A, param.asInteger()); - setCurrWidget(_textEditWidget); - break; -#endif case 0x000B: if (param.asInteger() == Common::KEYCODE_RETURN) { ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); leaveScene(0); } else if (param.asInteger() == Common::KEYCODE_ESCAPE) { leaveScene(1); - }/* else { - sendMessage(_textEditWidget, 0x000B, param.asInteger()); - setCurrWidget(_textEditWidget); - }*/ + } break; case 0x2000: // Handle menu button click @@ -1056,4 +1057,55 @@ uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } +QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description) + : Scene(vm, parentModule) { + + static const uint32 kQueryOverwriteMenuButtonFileHashes[] = { + 0x90312400, + 0x94C22A22 + }; + + static const NRect kQueryOverwriteMenuCollisionBounds[] = { + NRect(145, 334, 260, 385), + NRect(365, 340, 477, 388) + }; + + setBackground(0x043692C4); + setPalette(0x043692C4); + insertScreenMouse(0x692C004B); + insertStaticSprite(0x08C0AC24, 200); + + for (uint buttonIndex = 0; buttonIndex < 2; ++buttonIndex) { + Sprite *menuButton = insertSprite(this, buttonIndex, + kQueryOverwriteMenuButtonFileHashes[buttonIndex], kQueryOverwriteMenuCollisionBounds[buttonIndex]); + addCollisionSprite(menuButton); + } + + // Draw the query text to the background, each text line is centered + // NOTE The original had this in its own class + FontSurface *fontSurface = new FontSurface(_vm, calcHash("bgQueryTinyAlphabet"), 32, 7, 32, 11, 17); + Common::StringArray textLines; + textLines.push_back(description); + textLines.push_back("Game exists."); + textLines.push_back("Overwrite it?"); + for (uint i = 0; i < textLines.size(); ++i) + fontSurface->drawString(_background->getSurface(), 106 + (423 - textLines[i].size() * 11) / 2, + 127 + 31 + i * 17, (const byte*)textLines[i].c_str()); + delete fontSurface; + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&QueryOverwriteMenu::handleMessage); +} + +uint32 QueryOverwriteMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + // Handle menu button click + leaveScene(param.asInteger()); + break; + } + return 0; +} + } // End of namespace Neverhood diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 083679571b..de25b69ac1 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -49,7 +49,7 @@ protected: void createLoadGameMenu(); void createSaveGameMenu(); void handleLoadGameMenuAction(bool doLoad); - void handleSaveGameMenuAction(bool doSave); + void handleSaveGameMenuAction(bool doSave, bool doQuery); void loadSavegameList(); }; @@ -235,6 +235,13 @@ protected: SavegameListBox *_listBox; TextEditWidget *_textEditWidget; Common::String _savegameDescription; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class QueryOverwriteMenu : public Scene { +public: + QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description); +protected: void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); }; -- cgit v1.2.3 From 53a81d11b8e5e34478e75a8797b094ec53976c68 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 11:00:49 +0000 Subject: NEVERHOOD: Don't allow main menu until _canRequestMainMenu is set - Clean up GameModule --- engines/neverhood/gamemodule.cpp | 27 +++++++-------------------- engines/neverhood/gamemodule.h | 5 +---- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 48462a2282..493d16d7dd 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -75,7 +75,8 @@ enum { GameModule::GameModule(NeverhoodEngine *vm) : Module(vm, NULL), _moduleNum(-1), _prevChildObject(NULL), _prevModuleNum(-1), - _restoreGameRequested(false), _restartGameRequested(false), _mainMenuRequested(false), _gameWasLoaded(false) { + _restoreGameRequested(false), _restartGameRequested(false), _canRequestMainMenu(true), + _mainMenuRequested(false) { // Other initializations moved to actual engine class _vm->_soundMan->playSoundThree(0x002D0031, 0x8861079); @@ -147,7 +148,7 @@ void GameModule::handleKeyDown(Common::KeyCode keyCode) { void GameModule::handleEscapeKey() { if (_vm->isDemo()) _vm->quitGame(); - else if (!_prevChildObject /* && _canRequestMainMenu TODO?*/) + else if (!_prevChildObject && _canRequestMainMenu) _mainMenuRequested = true; else if (_childObject) sendMessage(_childObject, 0x000C, 0); @@ -334,7 +335,7 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti uint32 messageResult = Module::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x0800: - _someFlag1 = true; + _canRequestMainMenu = true; break; case 0x1009: _moduleResult = param.asInteger(); @@ -344,15 +345,12 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti case 0x1023: // Unused resource preloading messages break; - case 0x101F: - _field2C = true; - break; } return messageResult; } void GameModule::startup() { -#if 0 +#if 1 createModule(1500, 0); // Logos and intro video // Real game start #else // DEBUG>>> @@ -524,7 +522,7 @@ void GameModule::createModule(int moduleNum, int which) { _childObject = new Module1400(_vm, this, which); break; case 1500: - _someFlag1 = false; + _canRequestMainMenu = false; setGlobalVar(V_MODULE_NAME, 0x00F10114); _childObject = new Module1500(_vm, this, which); break; @@ -876,21 +874,10 @@ void GameModule::updateMenuModule() { // TODO Restore FPS? _childObject = _prevChildObject; // TODO Restore Smacker handle, screen offsets - sendMessage(_childObject, 0x101E, 0); // TODO CHECKME Is this needed? + sendMessage(_childObject, 0x101E, 0); _prevChildObject = NULL; _moduleNum = _prevModuleNum; SetUpdateHandler(&GameModule::updateModule); - } else if (_gameWasLoaded) { -#if 0 // TODO Handle this in some other way... - _gameWasLoaded = false; - delete _childObject; - delete _prevChildObject; - _childObject = NULL; - _prevChildObject = NULL; - _prevModuleNum = 0; - // TODO Create module from savegame values... - // TODO createModuleByHash(...); -#endif } } diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index 04fc780b02..df8f015659 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -58,13 +58,10 @@ public: protected: Entity *_prevChildObject; int _prevModuleNum; - bool _gameWasLoaded; bool _restoreGameRequested; bool _restartGameRequested; + bool _canRequestMainMenu; bool _mainMenuRequested; - bool _someFlag1; - bool _field2C; - uint32 _counter; int _moduleNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createModule(int moduleNum, int which); -- cgit v1.2.3 From c96d2475b100610271c974043a8a9c4322b8e60b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 11:57:06 +0000 Subject: NEVERHOOD: Add Screen::saveParams and Screen::restoreParams, called when etnering/leaving the menu --- engines/neverhood/gamemodule.cpp | 14 ++++---------- engines/neverhood/gamemodule.h | 2 +- engines/neverhood/screen.cpp | 18 ++++++++++++++---- engines/neverhood/screen.h | 8 +++++--- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 493d16d7dd..5eaa7e2d64 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -286,8 +286,7 @@ void GameModule::initCubeSymbolsPuzzle() { } void GameModule::initCrystalColorsPuzzle() { - // TODO Maybe move this into the GameModule so all puzzle init code is together - if (getGlobalVar(V_CRYSTAL_COLORS_INIT) == 0) { + if (!getGlobalVar(V_CRYSTAL_COLORS_INIT)) { TextResource textResource(_vm); const char *textStart, *textEnd; textResource.load(0x46691611); @@ -341,10 +340,6 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti _moduleResult = param.asInteger(); _done = true; break; - case 0x100A: - case 0x1023: - // Unused resource preloading messages - break; } return messageResult; } @@ -829,7 +824,7 @@ void GameModule::updateModule() { break; case 3000: // NOTE _moduleResult 2 never used - // TODO Check if _moduleResult 4 is used + // NOTE Check if _moduleResult 4 is used if (_moduleResult == 1) createModule(1900, 0); else if (_moduleResult == 3) @@ -854,7 +849,7 @@ void GameModule::openMainMenu() { // If there's no module, create one so there's something to return to createModule(1000, 0); } - // TODO Save FPS, Smacker handle, screen offsets + _vm->_screen->saveParams(); _mainMenuRequested = false; createMenuModule(); } @@ -871,9 +866,8 @@ void GameModule::createMenuModule() { void GameModule::updateMenuModule() { if (!updateChild()) { - // TODO Restore FPS? + _vm->_screen->restoreParams(); _childObject = _prevChildObject; - // TODO Restore Smacker handle, screen offsets sendMessage(_childObject, 0x101E, 0); _prevChildObject = NULL; _moduleNum = _prevModuleNum; diff --git a/engines/neverhood/gamemodule.h b/engines/neverhood/gamemodule.h index df8f015659..8101d38009 100644 --- a/engines/neverhood/gamemodule.h +++ b/engines/neverhood/gamemodule.h @@ -56,13 +56,13 @@ public: void initCrystalColorsPuzzle(); uint32 getCurrRadioMusicFileHash(); protected: + int _moduleNum; Entity *_prevChildObject; int _prevModuleNum; bool _restoreGameRequested; bool _restartGameRequested; bool _canRequestMainMenu; bool _mainMenuRequested; - int _moduleNum; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createModule(int moduleNum, int which); void createModuleByHash(uint32 nameHash); diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 352e59e9b2..3e57422cea 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -114,6 +114,18 @@ uint32 Screen::getNextFrameTime() { return _vm->_system->getMillis() + waitTicks; } +void Screen::saveParams() { + _savedSmackerDecoder = _smackerDecoder; + _savedFrameDelay = _frameDelay; + _savedYOffset = _yOffset; +} + +void Screen::restoreParams() { + _smackerDecoder = _savedSmackerDecoder; + _frameDelay = _savedFrameDelay; + _yOffset = _savedYOffset; +} + void Screen::setFps(int fps) { _frameDelay = 1000 / fps; } @@ -270,16 +282,14 @@ void Screen::drawUnk(const Graphics::Surface *surface, NDrawRect &drawRect, NDra NDrawRect newDrawRect; x = sysRect.x; - if (sysRect.width <= x || -sysRect.width >= x) { + if (sysRect.width <= x || -sysRect.width >= x) x = x % sysRect.width; - } if (x < 0) x += sysRect.width; y = sysRect.y; - if (y >= sysRect.height || -sysRect.height >= y) { + if (y >= sysRect.height || -sysRect.height >= y) y = y % sysRect.height; - } if (y < 0) y += sysRect.height; diff --git a/engines/neverhood/screen.h b/engines/neverhood/screen.h index 33de141ec2..c778066152 100644 --- a/engines/neverhood/screen.h +++ b/engines/neverhood/screen.h @@ -63,6 +63,8 @@ public: ~Screen(); void update(); uint32 getNextFrameTime(); + void saveParams(); + void restoreParams(); void setFps(int fps); int getFps(); void setYOffset(int16 yOffset); @@ -89,12 +91,12 @@ protected: NeverhoodEngine *_vm; MicroTileArray *_microTiles; Graphics::Surface *_backScreen; - Video::SmackerDecoder *_smackerDecoder; + Video::SmackerDecoder *_smackerDecoder, *_savedSmackerDecoder; int32 _ticks; - int32 _frameDelay; + int32 _frameDelay, _savedFrameDelay; byte *_paletteData; bool _paletteChanged; - int16 _yOffset; + int16 _yOffset, _savedYOffset; bool _fullRefresh; RenderQueue *_renderQueue, *_prevRenderQueue; }; -- cgit v1.2.3 From 70fdfd9d572b4c395dfa4d3fbff791e064d4079d Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 12:03:05 +0000 Subject: NEVERHOOD: Delete all sound/music items on exit - Minor cleanup --- engines/neverhood/menumodule.cpp | 1 - engines/neverhood/sound.cpp | 22 +++++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index f1669a6213..f752ce6745 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -178,7 +178,6 @@ void MenuModule::updateScene() { } uint32 MenuModule::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - // TODO CHECKME Handles 0x101F, possibly just a debug/cache message which can be ignored? return Module::handleMessage(messageNum, param, sender);; } diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index 9e0e572ca0..a479bf26f9 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -233,21 +233,18 @@ void SoundItem::setVolume(int volume) { void SoundItem::update() { if (_playOnceAfterCountdown) { - if (_currCountdown == 0) { + if (_currCountdown == 0) _currCountdown = _initialCountdown; - } else if (--_currCountdown == 0) { + else if (--_currCountdown == 0) _soundResource->play(); - } } else if (_playOnceAfterRandomCountdown) { if (_currCountdown == 0) { if (_minCountdown > 0 && _maxCountdown > 0 && _minCountdown < _maxCountdown) _currCountdown = _vm->_rnd->getRandomNumberRng(_minCountdown, _maxCountdown); - } else if (--_currCountdown == 0) { + } else if (--_currCountdown == 0) _soundResource->play(); - } - } else if (_playLooping && !_soundResource->isPlaying()) { - _soundResource->play(); // TODO Looping parameter? - } + } else if (_playLooping && !_soundResource->isPlaying()) + _soundResource->play(); } // SoundMan @@ -257,7 +254,10 @@ SoundMan::SoundMan(NeverhoodEngine *vm) } SoundMan::~SoundMan() { - // TODO Clean up + for (uint i = 0; i < _soundItems.size(); ++i) + delete _soundItems[i]; + for (uint i = 0; i < _musicItems.size(); ++i) + delete _musicItems[i]; } void SoundMan::addMusic(uint32 groupNameHash, uint32 musicFileHash) { @@ -709,6 +709,10 @@ AudioResourceMan::AudioResourceMan(NeverhoodEngine *vm) } AudioResourceMan::~AudioResourceMan() { + for (uint i = 0; i < _soundItems.size(); ++i) + delete _soundItems[i]; + for (uint i = 0; i < _musicItems.size(); ++i) + delete _musicItems[i]; } int16 AudioResourceMan::addSound(uint32 fileHash) { -- cgit v1.2.3 From bdac28929f7ebcab6ae758e57c24c32493e46f76 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 12:07:38 +0000 Subject: NEVERHOOD: Add Y-flipping to unpackSpriteNormal --- engines/neverhood/graphics.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/engines/neverhood/graphics.cpp b/engines/neverhood/graphics.cpp index 913954532f..5099c7a00e 100644 --- a/engines/neverhood/graphics.cpp +++ b/engines/neverhood/graphics.cpp @@ -315,9 +315,12 @@ void unpackSpriteRle(const byte *source, int width, int height, byte *dest, int void unpackSpriteNormal(const byte *source, int width, int height, byte *dest, int destPitch, bool flipX, bool flipY) { - // TODO: Flip Y - - int sourcePitch = (width + 3) & 0xFFFC; + const int sourcePitch = (width + 3) & 0xFFFC; + + if (flipY) { + dest += destPitch * (height - 1); + destPitch = -destPitch; + } if (!flipX) { while (height-- > 0) { -- cgit v1.2.3 From dc459b5f673207a932ae07546ab29efd5b64727a Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 12:14:26 +0000 Subject: NEVERHOOD: Merge some code in the save/load menus --- engines/neverhood/menumodule.cpp | 45 +++++++++++++++++++--------------------- engines/neverhood/menumodule.h | 3 ++- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index f752ce6745..3093c4360e 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -542,11 +542,6 @@ void TextLabelWidget::clear() { updateBounds(); } -void TextLabelWidget::onClick() { - Widget::onClick(); - // TODO? Click handler -} - void TextLabelWidget::setString(const byte *string, int stringLen) { _string = string; _stringLen = stringLen; @@ -909,13 +904,11 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En setCurrWidget(_textEditWidget); break; case 0x000B: - if (param.asInteger() == Common::KEYCODE_RETURN) { - ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), - _listBox->getCurrIndex(), _textEditWidget->isModified()); - leaveScene(0); - } else if (param.asInteger() == Common::KEYCODE_ESCAPE) { + if (param.asInteger() == Common::KEYCODE_RETURN) + performSaveGame(); + else if (param.asInteger() == Common::KEYCODE_ESCAPE) leaveScene(1); - } else { + else { sendMessage(_textEditWidget, 0x000B, param.asInteger()); setCurrWidget(_textEditWidget); } @@ -924,10 +917,7 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En // Handle menu button click switch (param.asInteger()) { case 0: - // TODO Same handling as Return, merge - ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), - _listBox->getCurrIndex(), _textEditWidget->isModified()); - leaveScene(0); + performSaveGame(); break; case 1: leaveScene(1); @@ -950,6 +940,12 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } +void SaveGameMenu::performSaveGame() { + ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), + _listBox->getCurrIndex(), _textEditWidget->isModified()); + leaveScene(0); +} + LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList) : WidgetScene(vm, parentModule), _savegameList(savegameList) { @@ -1020,20 +1016,16 @@ uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x000B: - if (param.asInteger() == Common::KEYCODE_RETURN) { - ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); - leaveScene(0); - } else if (param.asInteger() == Common::KEYCODE_ESCAPE) { + if (param.asInteger() == Common::KEYCODE_RETURN) + performLoadGame(); + else if (param.asInteger() == Common::KEYCODE_ESCAPE) leaveScene(1); - } break; case 0x2000: // Handle menu button click switch (param.asInteger()) { case 0: - // TODO Same handling as Return, merge - ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); - leaveScene(0); + performLoadGame(); break; case 1: leaveScene(1); @@ -1056,6 +1048,11 @@ uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } +void LoadGameMenu::performLoadGame() { + ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); + leaveScene(0); +} + QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description) : Scene(vm, parentModule) { @@ -1081,7 +1078,7 @@ QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule } // Draw the query text to the background, each text line is centered - // NOTE The original had this in its own class + // NOTE The original had this text in its own class FontSurface *fontSurface = new FontSurface(_vm, calcHash("bgQueryTinyAlphabet"), 32, 7, 32, 11, 17); Common::StringArray textLines; textLines.push_back(description); diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index de25b69ac1..1b399820bf 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -126,7 +126,6 @@ public: TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface); - virtual void onClick(); virtual void addSprite(); virtual int16 getWidth(); virtual int16 getHeight(); @@ -222,6 +221,7 @@ protected: Common::String _savegameDescription; void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void performSaveGame(); }; class LoadGameMenu : public WidgetScene { @@ -236,6 +236,7 @@ protected: TextEditWidget *_textEditWidget; Common::String _savegameDescription; uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void performLoadGame(); }; class QueryOverwriteMenu : public Scene { -- cgit v1.2.3 From a80bafeb2eb67756fc5765468c4c7ac3e1c024d4 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 12:19:46 +0000 Subject: NEVERHOOD: Support game loading from launcher/command line --- engines/neverhood/detection.cpp | 2 +- engines/neverhood/neverhood.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index 043cf02723..1c88c34473 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -137,7 +137,7 @@ bool NeverhoodMetaEngine::hasFeature(MetaEngineFeature f) const { return (f == kSupportsListSaves) || (f == kSupportsLoadingDuringStartup) || -// (f == kSupportsDeleteSave) || + (f == kSupportsDeleteSave) || (f == kSavesSupportMetaInfo) || (f == kSavesSupportThumbnail) || (f == kSavesSupportCreationDate) || diff --git a/engines/neverhood/neverhood.cpp b/engines/neverhood/neverhood.cpp index 7b068bdf46..475a459df4 100644 --- a/engines/neverhood/neverhood.cpp +++ b/engines/neverhood/neverhood.cpp @@ -108,7 +108,10 @@ Common::Error NeverhoodEngine::run() { (*navigationList)[5].middleFlag = 1; } - _gameModule->startup(); + if (ConfMan.hasKey("save_slot")) + loadGameState(ConfMan.getInt("save_slot")); + else + _gameModule->startup(); mainLoop(); -- cgit v1.2.3 From 2a571d71b054b5dc90c7cee669f25766206fbb36 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 13:05:19 +0000 Subject: NEVERHOOD: Fix GUI options and game copyright --- engines/neverhood/detection.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index 1c88c34473..4224e08210 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -113,6 +113,7 @@ class NeverhoodMetaEngine : public AdvancedMetaEngine { public: NeverhoodMetaEngine() : AdvancedMetaEngine(Neverhood::gameDescriptions, sizeof(Neverhood::NeverhoodGameDescription), neverhoodGames) { _singleid = "neverhood"; + _guioptions = GUIO2(GUIO_NOSUBTITLES, GUIO_NOMIDI); } virtual const char *getName() const { @@ -120,7 +121,7 @@ public: } virtual const char *getOriginalCopyright() const { - return "Neverhood Engine (C) Infogrames"; + return "Neverhood (C) The Neverhood, Inc."; } virtual bool hasFeature(MetaEngineFeature f) const; @@ -257,3 +258,4 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, #else REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine); #endif + -- cgit v1.2.3 From a03879963f2e8adebd1f4bb90975ff0c43f286dc Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 14:59:09 +0000 Subject: NEVERHOOD: Changed the save/load menu to allow gaps in saved games to simplify game deletion --- engines/neverhood/detection.cpp | 23 --------------- engines/neverhood/gamemodule.cpp | 6 ++-- engines/neverhood/menumodule.cpp | 61 +++++++++++++++++++++------------------- engines/neverhood/menumodule.h | 29 +++++++++++-------- 4 files changed, 52 insertions(+), 67 deletions(-) diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index 4224e08210..e5bfd292ad 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -174,7 +174,6 @@ SaveStateList NeverhoodMetaEngine::listSaves(const char *target) const { for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); file++) { // Obtain the last 3 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 3); - if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); if (in) { @@ -194,31 +193,9 @@ int NeverhoodMetaEngine::getMaximumSaveSlot() const { } void NeverhoodMetaEngine::removeSaveState(const char *target, int slot) const { - Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, slot); - saveFileMan->removeSavefile(filename.c_str()); - - Common::StringArray filenames; - Common::String pattern = target; - pattern += ".???"; - filenames = saveFileMan->listSavefiles(pattern.c_str()); - Common::sort(filenames.begin(), filenames.end()); // Sort (hopefully ensuring we are sorted numerically..) - - for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { - // Obtain the last 3 digits of the filename, since they correspond to the save slot - int slotNum = atoi(file->c_str() + file->size() - 3); - - // Rename every slot greater than the deleted slot, - // Also do not rename quicksaves. - if (slotNum > slot && slotNum < 990) { - saveFileMan->renameSavefile(file->c_str(), filename.c_str()); - - filename = Neverhood::NeverhoodEngine::getSavegameFilename(target, ++slot); - } - } - } SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, int slot) const { diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 5eaa7e2d64..1246a5b962 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -345,7 +345,7 @@ uint32 GameModule::handleMessage(int messageNum, const MessageParam ¶m, Enti } void GameModule::startup() { -#if 1 +#if 0 createModule(1500, 0); // Logos and intro video // Real game start #else // DEBUG>>> @@ -394,8 +394,8 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; - _vm->gameState().sceneNum = 8; - createModule(1800, -1); + _vm->gameState().sceneNum = 0; + createModule(1000, -1); #endif #if 0 _vm->gameState().sceneNum = 5; diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 3093c4360e..0ba9bc03fa 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -81,15 +81,13 @@ MenuModule::~MenuModule() { _vm->_screen->setPaletteData(_savedPaletteData); } -void MenuModule::setLoadgameInfo(uint slot) { - _savegameSlot = slot; - debug("LOADGAME: slot = %d", slot); +void MenuModule::setLoadgameInfo(uint index) { + _savegameSlot = (*_savegameList)[index].slotNum; } -void MenuModule::setSavegameInfo(const Common::String &description, uint slot, bool newSavegame) { +void MenuModule::setSavegameInfo(const Common::String &description, uint index, bool newSavegame) { _savegameDescription = description; - _savegameSlot = newSavegame ? _savegameList->size() : slot; - debug("SAVEGAME: description = [%s]; slot = %d; new = %d", description.c_str(), slot, newSavegame); + _savegameSlot = newSavegame ? -1 : (*_savegameList)[index].slotNum; } void MenuModule::createScene(int sceneNum, int which) { @@ -183,14 +181,14 @@ uint32 MenuModule::handleMessage(int messageNum, const MessageParam ¶m, Enti void MenuModule::createLoadGameMenu() { _savegameSlot = -1; - _savegameList = new Common::StringArray(); + _savegameList = new SavegameList(); loadSavegameList(); _childObject = new LoadGameMenu(_vm, this, _savegameList); } void MenuModule::createSaveGameMenu() { _savegameSlot = -1; - _savegameList = new Common::StringArray(); + _savegameList = new SavegameList(); loadSavegameList(); _childObject = new SaveGameMenu(_vm, this, _savegameList); } @@ -206,9 +204,12 @@ void MenuModule::handleLoadGameMenuAction(bool doLoad) { } void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) { - if (doSave && doQuery && _savegameSlot >= 0 && _savegameSlot < (int)_savegameList->size()) { + if (doSave && doQuery && _savegameSlot >= 0) { createScene(QUERY_OVR_MENU, -1); - } else if (doSave && _savegameSlot >= 0) { + } else if (doSave) { + // Get a new slot number if it's a new savegame + if (_savegameSlot < 0) + _savegameSlot = _savegameList->size() > 0 ? _savegameList->back().slotNum + 1 : 0; // Restore the scene palette and background so that the correct thumbnail is saved byte *menuPaletteData = _vm->_screen->getPaletteData(); _vm->_screen->setPaletteData(_savedPaletteData); @@ -240,8 +241,12 @@ void MenuModule::loadSavegameList() { if (slotNum >= 0 && slotNum <= 999) { Common::InSaveFile *in = saveFileMan->openForLoading(file->c_str()); if (in) { - if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) - _savegameList->push_back(header.description); + if (Neverhood::NeverhoodEngine::readSaveHeader(in, false, header) == Neverhood::NeverhoodEngine::kRSHENoError) { + SavegameItem savegameItem; + savegameItem.slotNum = slotNum; + savegameItem.description = header.description; + _savegameList->push_back(savegameItem); + } delete in; } } @@ -548,9 +553,8 @@ void TextLabelWidget::setString(const byte *string, int stringLen) { } TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface, - uint32 fileHash, const NRect &rect) - : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), + int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect) + : Widget(vm, x, y, itemID, parentScene, 1000, 1000), _maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect), _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0), _modified(false), _readOnly(false) { @@ -728,9 +732,8 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam ¶m, } SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, - Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect) - : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), + SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect) + : Widget(vm, x, y, itemID, parentScene, 1000, 1000), _savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect), _maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) { @@ -768,11 +771,11 @@ void SavegameListBox::addSprite() { } void SavegameListBox::buildItems() { - Common::StringArray &savegameList = *_savegameList; + SavegameList &savegameList = *_savegameList; int16 itemX = _rect.x1, itemY = 0; for (uint i = 0; i < savegameList.size(); ++i) { - const byte *string = (const byte*)savegameList[i].c_str(); - int stringLen = (int)savegameList[i].size(); + const byte *string = (const byte*)savegameList[i].description.c_str(); + int stringLen = (int)savegameList[i].description.size(); TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface); label->addSprite(); @@ -831,7 +834,7 @@ void SavegameListBox::pageDown() { } } -SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList) +SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) : WidgetScene(vm, parentModule), _savegameList(savegameList) { static const uint32 kSaveGameMenuButtonFileHashes[] = { @@ -864,11 +867,11 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::St insertStaticSprite(0x1340A5C2, 200); insertStaticSprite(0x1301A7EA, 200); - _listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, 1000, 1000, + _listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, _savegameList, _fontSurface, 0x1115A223, kListBoxRect); _listBox->addSprite(); - _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 1000, 1000, 29, + _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 29, _fontSurface, 0x3510A868, kTextEditRect); _textEditWidget->setCursor(0x8290AC20, 2, 13); _textEditWidget->addSprite(); @@ -891,7 +894,7 @@ SaveGameMenu::~SaveGameMenu() { void SaveGameMenu::handleEvent(int16 itemID, int eventType) { if (itemID == 69 && eventType == 5) { uint currIndex = _listBox->getCurrIndex(); - _textEditWidget->setString((*_savegameList)[currIndex]); + _textEditWidget->setString((*_savegameList)[currIndex].description); setCurrWidget(_textEditWidget); } } @@ -946,7 +949,7 @@ void SaveGameMenu::performSaveGame() { leaveScene(0); } -LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList) +LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) : WidgetScene(vm, parentModule), _savegameList(savegameList) { static const uint32 kLoadGameMenuButtonFileHashes[] = { @@ -979,11 +982,11 @@ LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::St insertStaticSprite(0x0BC600A3, 200); insertStaticSprite(0x0F960021, 200); - _listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, 1000, 1000, + _listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, _savegameList, _fontSurface, 0x04040409, kListBoxRect); _listBox->addSprite(); - _textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 1000, 1000, 29, + _textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 29, _fontSurface, 0x10924C03, kTextEditRect); _textEditWidget->setCursor(0x18032303, 2, 13); _textEditWidget->setReadOnly(true); @@ -1007,7 +1010,7 @@ LoadGameMenu::~LoadGameMenu() { void LoadGameMenu::handleEvent(int16 itemID, int eventType) { if (itemID == 69 && eventType == 5) { uint currIndex = _listBox->getCurrIndex(); - _textEditWidget->setString((*_savegameList)[currIndex]); + _textEditWidget->setString((*_savegameList)[currIndex].description); setCurrWidget(_textEditWidget); } } diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 1b399820bf..2f91bdb40e 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -31,16 +31,23 @@ namespace Neverhood { +struct SavegameItem { + int slotNum; + Common::String description; +}; + +typedef Common::Array SavegameList; + class MenuModule : public Module { public: MenuModule(NeverhoodEngine *vm, Module *parentModule, int which); virtual ~MenuModule(); - void setLoadgameInfo(uint slot); - void setSavegameInfo(const Common::String &description, uint slot, bool newSavegame); + void setLoadgameInfo(uint index); + void setSavegameInfo(const Common::String &description, uint index, bool newSavegame); protected: int _sceneNum; byte *_savedPaletteData; - Common::StringArray *_savegameList; + SavegameList *_savegameList; Common::String _savegameDescription; int _savegameSlot; void createScene(int sceneNum, int which); @@ -144,8 +151,7 @@ protected: class TextEditWidget : public Widget { public: TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, int maxStringLength, FontSurface *fontSurface, - uint32 fileHash, const NRect &rect); + int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect); ~TextEditWidget(); virtual void onClick(); virtual void addSprite(); @@ -183,8 +189,7 @@ protected: class SavegameListBox : public Widget { public: SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, - int baseObjectPriority, int baseSurfacePriority, - Common::StringArray *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); + SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); virtual void onClick(); virtual void addSprite(); void buildItems(); @@ -202,7 +207,7 @@ protected: Common::Array _textLabelItems; int _firstVisibleItem; int _lastVisibleItem; - Common::StringArray *_savegameList; + SavegameList *_savegameList; FontSurface *_fontSurface; uint _currIndex; int _maxVisibleItemsCount; @@ -210,11 +215,11 @@ protected: class SaveGameMenu : public WidgetScene { public: - SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList); + SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); ~SaveGameMenu(); virtual void handleEvent(int16 itemID, int eventType); protected: - Common::StringArray *_savegameList; + SavegameList *_savegameList; FontSurface *_fontSurface; SavegameListBox *_listBox; TextEditWidget *_textEditWidget; @@ -226,11 +231,11 @@ protected: class LoadGameMenu : public WidgetScene { public: - LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, Common::StringArray *savegameList); + LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); ~LoadGameMenu(); virtual void handleEvent(int16 itemID, int eventType); protected: - Common::StringArray *_savegameList; + SavegameList *_savegameList; FontSurface *_fontSurface; SavegameListBox *_listBox; TextEditWidget *_textEditWidget; -- cgit v1.2.3 From 8749efdea821433cf355ae4fa543ef412f33c2fe Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Tue, 29 Jan 2013 15:40:41 +0000 Subject: NEVERHOOD: Add game-internal savegame delete menu - Rename Widget::addSprite to Widget::initialize --- engines/neverhood/menumodule.cpp | 167 ++++++++++++++++++++++++++++++++++----- engines/neverhood/menumodule.h | 26 +++++- engines/neverhood/neverhood.h | 1 + engines/neverhood/saveload.cpp | 7 ++ 4 files changed, 179 insertions(+), 22 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 0ba9bc03fa..8b0353287c 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -28,12 +28,13 @@ namespace Neverhood { enum { - MAIN_MENU = 0, - CREDITS_SCENE = 1, - MAKING_OF = 2, - LOAD_GAME_MENU = 3, - SAVE_GAME_MENU = 4, - QUERY_OVR_MENU = 5 + MAIN_MENU = 0, + CREDITS_SCENE = 1, + MAKING_OF = 2, + LOAD_GAME_MENU = 3, + SAVE_GAME_MENU = 4, + DELETE_GAME_MENU = 5, + QUERY_OVR_MENU = 6 }; enum { @@ -90,6 +91,10 @@ void MenuModule::setSavegameInfo(const Common::String &description, uint index, _savegameSlot = newSavegame ? -1 : (*_savegameList)[index].slotNum; } +void MenuModule::setDeletegameInfo(uint index) { + _savegameSlot = (*_savegameList)[index].slotNum; +} + void MenuModule::createScene(int sceneNum, int which) { _sceneNum = sceneNum; switch (_sceneNum) { @@ -108,6 +113,9 @@ void MenuModule::createScene(int sceneNum, int which) { case SAVE_GAME_MENU: createSaveGameMenu(); break; + case DELETE_GAME_MENU: + createDeleteGameMenu(); + break; case QUERY_OVR_MENU: _childObject = new QueryOverwriteMenu(_vm, this, _savegameDescription); break; @@ -149,7 +157,7 @@ void MenuModule::updateScene() { createScene(MAIN_MENU, -1); break; case kMainMenuDeleteGame: - // TODO createDeleteGameMenu(); + createScene(DELETE_GAME_MENU, -1); break; default: createScene(MAIN_MENU, -1); @@ -166,6 +174,9 @@ void MenuModule::updateScene() { case SAVE_GAME_MENU: handleSaveGameMenuAction(_moduleResult != 1, true); break; + case DELETE_GAME_MENU: + handleDeleteGameMenuAction(_moduleResult != 1); + break; case QUERY_OVR_MENU: handleSaveGameMenuAction(_moduleResult != 1, false); break; @@ -193,6 +204,13 @@ void MenuModule::createSaveGameMenu() { _childObject = new SaveGameMenu(_vm, this, _savegameList); } +void MenuModule::createDeleteGameMenu() { + _savegameSlot = -1; + _savegameList = new SavegameList(); + loadSavegameList(); + _childObject = new DeleteGameMenu(_vm, this, _savegameList); +} + void MenuModule::handleLoadGameMenuAction(bool doLoad) { createScene(MAIN_MENU, -1); if (doLoad && _savegameSlot >= 0) { @@ -224,6 +242,15 @@ void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) { _savegameList = NULL; } +void MenuModule::handleDeleteGameMenuAction(bool doDelete) { + if (doDelete && _savegameSlot >= 0) { + _vm->removeGameState(_savegameSlot); + createScene(MAIN_MENU, -1); + } + delete _savegameList; + _savegameList = NULL; +} + void MenuModule::loadSavegameList() { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); @@ -479,7 +506,7 @@ void Widget::refreshPosition() { updateBounds(); } -void Widget::addSprite() { +void Widget::initialize() { // Empty } @@ -523,7 +550,7 @@ TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 it } -void TextLabelWidget::addSprite() { +void TextLabelWidget::initialize() { _parentScene->addSprite(this); _parentScene->addCollisionSprite(this); } @@ -590,7 +617,7 @@ void TextEditWidget::onClick() { Widget::onClick(); } -void TextEditWidget::addSprite() { +void TextEditWidget::initialize() { SpriteResource cursorSpriteResource(_vm); _spriteResource.load(_fileHash, true); @@ -602,7 +629,7 @@ void TextEditWidget::addSprite() { _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _fontSurface->getCharHeight()) / 2, 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface); - _textLabelWidget->addSprite(); + _textLabelWidget->initialize(); cursorSpriteResource.load(_cursorFileHash, true); _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); _cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); @@ -757,7 +784,7 @@ void SavegameListBox::onClick() { } } -void SavegameListBox::addSprite() { +void SavegameListBox::initialize() { _spriteResource.load(_bgFileHash, true); createSurface(_baseSurfacePriority, _spriteResource.getDimensions().width, _spriteResource.getDimensions().height); refreshPosition(); @@ -778,7 +805,7 @@ void SavegameListBox::buildItems() { int stringLen = (int)savegameList[i].description.size(); TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface); - label->addSprite(); + label->initialize(); _textLabelItems.push_back(label); } } @@ -869,12 +896,12 @@ SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameLi _listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, _savegameList, _fontSurface, 0x1115A223, kListBoxRect); - _listBox->addSprite(); + _listBox->initialize(); _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 29, _fontSurface, 0x3510A868, kTextEditRect); _textEditWidget->setCursor(0x8290AC20, 2, 13); - _textEditWidget->addSprite(); + _textEditWidget->initialize(); setCurrWidget(_textEditWidget); for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { @@ -984,13 +1011,12 @@ LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameLi _listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, _savegameList, _fontSurface, 0x04040409, kListBoxRect); - _listBox->addSprite(); + _listBox->initialize(); _textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 29, _fontSurface, 0x10924C03, kTextEditRect); - _textEditWidget->setCursor(0x18032303, 2, 13); _textEditWidget->setReadOnly(true); - _textEditWidget->addSprite(); + _textEditWidget->initialize(); setCurrWidget(_textEditWidget); for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { @@ -1056,6 +1082,111 @@ void LoadGameMenu::performLoadGame() { leaveScene(0); } +DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) + : WidgetScene(vm, parentModule), _savegameList(savegameList) { + + static const uint32 kDeleteGameMenuButtonFileHashes[] = { + 0x8198E268, + 0xDD0C4620, + 0x81296520, + 0x8D284211, + 0x8C004621, + 0x07294020 + }; + + static const NRect kDeleteGameMenuButtonCollisionBounds[] = { + NRect(518, 46, 595, 91), + NRect(524, 322, 599, 369), + NRect(395, 40, 462, 127), + NRect(405, 126, 460, 185), + NRect(397, 205, 456, 273), + NRect(395, 278, 452, 372) + }; + + static const NRect kListBoxRect(0, 0, 320, 271); + static const NRect kTextEditRect(0, 0, 320, 17); + + _fontSurface = new FontSurface(_vm, calcHash("bgDeleteTinyAlphabet"), 32, 7, 32, 11, 17); + + setBackground(0x4080E01C); + setPalette(0x4080E01C); + insertScreenMouse(0x0E018400); + insertStaticSprite(0x80083C01, 200); + insertStaticSprite(0x84181E81, 200); + + _listBox = new SavegameListBox(_vm, 61, 64, 69/*ItemID*/, this, + _savegameList, _fontSurface, calcHash("mxDeleteListBox"), kListBoxRect); + _listBox->initialize(); + + _textEditWidget = new TextEditWidget(_vm, 49, 414, 70/*ItemID*/, this, 29, + _fontSurface, 0x250A3060, kTextEditRect); + _textEditWidget->setReadOnly(true); + _textEditWidget->initialize(); + setCurrWidget(_textEditWidget); + + for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { + Sprite *menuButton = insertSprite(this, buttonIndex, + kDeleteGameMenuButtonFileHashes[buttonIndex], kDeleteGameMenuButtonCollisionBounds[buttonIndex]); + addCollisionSprite(menuButton); + } + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&DeleteGameMenu::handleMessage); +} + +DeleteGameMenu::~DeleteGameMenu() { + delete _fontSurface; +} + +void DeleteGameMenu::handleEvent(int16 itemID, int eventType) { + if (itemID == 69 && eventType == 5) { + uint currIndex = _listBox->getCurrIndex(); + _textEditWidget->setString((*_savegameList)[currIndex].description); + setCurrWidget(_textEditWidget); + } +} + +uint32 DeleteGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x000B: + if (param.asInteger() == Common::KEYCODE_RETURN) + performDeleteGame(); + else if (param.asInteger() == Common::KEYCODE_ESCAPE) + leaveScene(1); + break; + case 0x2000: + // Handle menu button click + switch (param.asInteger()) { + case 0: + performDeleteGame(); + break; + case 1: + leaveScene(1); + break; + case 2: + _listBox->pageUp(); + break; + case 3: + _listBox->scrollUp(); + break; + case 4: + _listBox->scrollDown(); + break; + case 5: + _listBox->pageDown(); + break; + } + break; + } + return 0; +} + +void DeleteGameMenu::performDeleteGame() { + ((MenuModule*)_parentModule)->setDeletegameInfo(_listBox->getCurrIndex()); + leaveScene(0); +} + QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description) : Scene(vm, parentModule) { diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 2f91bdb40e..39cd36a7a2 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -44,6 +44,7 @@ public: virtual ~MenuModule(); void setLoadgameInfo(uint index); void setSavegameInfo(const Common::String &description, uint index, bool newSavegame); + void setDeletegameInfo(uint index); protected: int _sceneNum; byte *_savedPaletteData; @@ -55,8 +56,10 @@ protected: uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); void createLoadGameMenu(); void createSaveGameMenu(); + void createDeleteGameMenu(); void handleLoadGameMenuAction(bool doLoad); void handleSaveGameMenuAction(bool doSave, bool doQuery); + void handleDeleteGameMenuAction(bool doDelete); void loadSavegameList(); }; @@ -114,7 +117,7 @@ public: virtual void onClick(); virtual void setPosition(int16 x, int16 y); virtual void refreshPosition(); - virtual void addSprite(); + virtual void initialize(); virtual int16 getWidth(); virtual int16 getHeight(); virtual void enterWidget(); @@ -133,7 +136,7 @@ public: TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, int baseObjectPriority, int baseSurfacePriority, const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface); - virtual void addSprite(); + virtual void initialize(); virtual int16 getWidth(); virtual int16 getHeight(); void drawString(int maxStringLength); @@ -154,7 +157,7 @@ public: int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect); ~TextEditWidget(); virtual void onClick(); - virtual void addSprite(); + virtual void initialize(); virtual void enterWidget(); virtual void exitWidget(); void setCursor(uint32 cursorFileHash, int16 cursorWidth, int16 cursorHeight); @@ -191,7 +194,7 @@ public: SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); virtual void onClick(); - virtual void addSprite(); + virtual void initialize(); void buildItems(); void drawItems(); void refresh(); @@ -244,6 +247,21 @@ protected: void performLoadGame(); }; +class DeleteGameMenu : public WidgetScene { +public: + DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); + ~DeleteGameMenu(); + virtual void handleEvent(int16 itemID, int eventType); +protected: + SavegameList *_savegameList; + FontSurface *_fontSurface; + SavegameListBox *_listBox; + TextEditWidget *_textEditWidget; + Common::String _savegameDescription; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void performDeleteGame(); +}; + class QueryOverwriteMenu : public Scene { public: QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule, const Common::String &description); diff --git a/engines/neverhood/neverhood.h b/engines/neverhood/neverhood.h index 14c283bc12..577fbd7a66 100644 --- a/engines/neverhood/neverhood.h +++ b/engines/neverhood/neverhood.h @@ -119,6 +119,7 @@ public: Common::Error loadGameState(int slot); Common::Error saveGameState(int slot, const Common::String &description); + Common::Error removeGameState(int slot); void savegame(const char *filename, const char *description); void loadgame(const char *filename); const char *getSavegameFilename(int num); diff --git a/engines/neverhood/saveload.cpp b/engines/neverhood/saveload.cpp index 2f97adeeee..578d9858ff 100644 --- a/engines/neverhood/saveload.cpp +++ b/engines/neverhood/saveload.cpp @@ -143,6 +143,13 @@ Common::Error NeverhoodEngine::saveGameState(int slot, const Common::String &des return Common::kNoError; } +Common::Error NeverhoodEngine::removeGameState(int slot) { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::String filename = Neverhood::NeverhoodEngine::getSavegameFilename(_targetName, slot); + saveFileMan->removeSavefile(filename.c_str()); + return Common::kNoError; +} + const char *NeverhoodEngine::getSavegameFilename(int num) { static Common::String filename; filename = getSavegameFilename(_targetName, num); -- cgit v1.2.3 From 9ca3973e6fe6c191a504a2c9fb402f03fda738e7 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 30 Jan 2013 11:04:48 +0000 Subject: NEVERHOOD: Work on the save/load/delete menus - Rename WidgetScene to GameStateMenu - Merge common code from the save/load/delete into GameStateMenu --- engines/neverhood/menumodule.cpp | 424 +++++++++++++-------------------------- engines/neverhood/menumodule.h | 78 ++++--- 2 files changed, 179 insertions(+), 323 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 8b0353287c..619acadd8c 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -243,9 +243,9 @@ void MenuModule::handleSaveGameMenuAction(bool doSave, bool doQuery) { } void MenuModule::handleDeleteGameMenuAction(bool doDelete) { + createScene(MAIN_MENU, -1); if (doDelete && _savegameSlot >= 0) { _vm->removeGameState(_savegameSlot); - createScene(MAIN_MENU, -1); } delete _savegameList; _savegameList = NULL; @@ -453,33 +453,9 @@ uint32 CreditsScene::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } -WidgetScene::WidgetScene(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _currWidget(NULL) { -} - -NPoint WidgetScene::getMousePos() { - NPoint pt; - pt.x = _mouseCursor->getX(); - pt.y = _mouseCursor->getY(); - return pt; -} - -void WidgetScene::setCurrWidget(Widget *newWidget) { - if (newWidget && newWidget != _currWidget) { - if (_currWidget) - _currWidget->exitWidget(); - newWidget->enterWidget(); - _currWidget = newWidget; - } -} - -void WidgetScene::handleEvent(int16 itemID, int eventType) { - // Empty -} - -Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, +Widget::Widget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, int baseObjectPriority, int baseSurfacePriority) - : StaticSprite(vm, baseObjectPriority), _itemID(itemID), _parentScene(parentScene), + : StaticSprite(vm, baseObjectPriority), _parentScene(parentScene), _baseObjectPriority(baseObjectPriority), _baseSurfacePriority(baseSurfacePriority) { SetUpdateHandler(&Widget::update); @@ -542,10 +518,10 @@ uint32 Widget::handleMessage(int messageNum, const MessageParam ¶m, Entity * return messageResult; } -TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, +TextLabelWidget::TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, int baseObjectPriority, int baseSurfacePriority, const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface) - : Widget(vm, x, y, itemID, parentScene, baseObjectPriority, baseSurfacePriority), + : Widget(vm, x, y, parentScene, baseObjectPriority, baseSurfacePriority), _string(string), _stringLen(stringLen), _drawSurface(drawSurface), _tx(tx), _ty(ty), _fontSurface(fontSurface) { } @@ -579,9 +555,9 @@ void TextLabelWidget::setString(const byte *string, int stringLen) { _stringLen = stringLen; } -TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, +TextEditWidget::TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect) - : Widget(vm, x, y, itemID, parentScene, 1000, 1000), + : Widget(vm, x, y, parentScene, 1000, 1000), _maxStringLength(maxStringLength), _fontSurface(fontSurface), _fileHash(fileHash), _rect(rect), _cursorSurface(NULL), _cursorTicks(0), _cursorPos(0), _cursorFileHash(0), _cursorWidth(0), _cursorHeight(0), _modified(false), _readOnly(false) { @@ -627,7 +603,7 @@ void TextEditWidget::initialize() { _parentScene->addCollisionSprite(this); _surface->setVisible(true); _textLabelWidget = new TextLabelWidget(_vm, _rect.x1, _rect.y1 + (_rect.y2 - _rect.y1 + 1 - _fontSurface->getCharHeight()) / 2, - 0, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, + _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface); _textLabelWidget->initialize(); cursorSpriteResource.load(_cursorFileHash, true); @@ -758,9 +734,9 @@ uint32 TextEditWidget::handleMessage(int messageNum, const MessageParam ¶m, return messageResult; } -SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, +SavegameListBox::SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect) - : Widget(vm, x, y, itemID, parentScene, 1000, 1000), + : Widget(vm, x, y, parentScene, 1000, 1000), _savegameList(savegameList), _fontSurface(fontSurface), _bgFileHash(bgFileHash), _rect(rect), _maxStringLength(0), _firstVisibleItem(0), _lastVisibleItem(0), _currIndex(0) { @@ -779,7 +755,7 @@ void SavegameListBox::onClick() { _currIndex = newIndex; refresh(); _parentScene->setCurrWidget(this); - _parentScene->handleEvent(_itemID, 5); + _parentScene->refreshDescriptionEdit(); } } } @@ -803,7 +779,7 @@ void SavegameListBox::buildItems() { for (uint i = 0; i < savegameList.size(); ++i) { const byte *string = (const byte*)savegameList[i].description.c_str(); int stringLen = (int)savegameList[i].description.size(); - TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, i, _parentScene, _baseObjectPriority + 1, + TextLabelWidget *label = new TextLabelWidget(_vm, itemX, itemY, _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, string, MIN(stringLen, _maxStringLength), _surface, _x, _y, _fontSurface); label->initialize(); _textLabelItems.push_back(label); @@ -861,84 +837,92 @@ void SavegameListBox::pageDown() { } } -SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) - : WidgetScene(vm, parentModule), _savegameList(savegameList) { - - static const uint32 kSaveGameMenuButtonFileHashes[] = { - 0x8359A824, - 0x0690E260, - 0x0352B050, - 0x1392A223, - 0x13802260, - 0x0B32B200 - }; +GameStateMenu::GameStateMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList, + const uint32 *buttonFileHashes, const NRect *buttonCollisionBounds, + uint32 backgroundFileHash, uint32 fontFileHash, + uint32 mouseFileHash, const NRect *mouseRect, + uint32 listBoxBackgroundFileHash, int16 listBoxX, int16 listBoxY, const NRect &listBoxRect, + uint32 textEditBackgroundFileHash, uint32 textEditCursorFileHash, int16 textEditX, int16 textEditY, const NRect &textEditRect, + uint32 textFileHash1, uint32 textFileHash2) + : Scene(vm, parentModule), _currWidget(NULL), _savegameList(savegameList) { - static const NRect kSaveGameMenuButtonCollisionBounds[] = { - NRect(518, 106, 602, 160), - NRect(516, 378, 596, 434), - NRect(394, 108, 458, 206), - NRect(400, 204, 458, 276), - NRect(398, 292, 456, 352), - NRect(396, 352, 460, 444) - }; - - static const NRect kListBoxRect(0, 0, 320, 272); - static const NRect kTextEditRect(0, 0, 377, 17); - static const NRect kMouseRect(50, 47, 427, 64); - - _fontSurface = new FontSurface(_vm, 0x2328121A, 32, 7, 32, 11, 17); + _fontSurface = new FontSurface(_vm, fontFileHash, 32, 7, 32, 11, 17); - setBackground(0x30084E25); - setPalette(0x30084E25); - insertScreenMouse(0x84E21308, &kMouseRect); - insertStaticSprite(0x1340A5C2, 200); - insertStaticSprite(0x1301A7EA, 200); - - _listBox = new SavegameListBox(_vm, 60, 142, 69/*ItemID*/, this, - _savegameList, _fontSurface, 0x1115A223, kListBoxRect); + setBackground(backgroundFileHash); + setPalette(backgroundFileHash); + insertScreenMouse(mouseFileHash, mouseRect); + insertStaticSprite(textFileHash1, 200); + insertStaticSprite(textFileHash2, 200); + + _listBox = new SavegameListBox(_vm, listBoxX, listBoxY, this, + _savegameList, _fontSurface, listBoxBackgroundFileHash, listBoxRect); _listBox->initialize(); - _textEditWidget = new TextEditWidget(_vm, 50, 47, 70/*ItemID*/, this, 29, - _fontSurface, 0x3510A868, kTextEditRect); - _textEditWidget->setCursor(0x8290AC20, 2, 13); + _textEditWidget = new TextEditWidget(_vm, textEditX, textEditY, this, 29, + _fontSurface, textEditBackgroundFileHash, textEditRect); + if (textEditCursorFileHash != 0) + _textEditWidget->setCursor(textEditCursorFileHash, 2, 13); + else + _textEditWidget->setReadOnly(true); _textEditWidget->initialize(); setCurrWidget(_textEditWidget); for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { Sprite *menuButton = insertSprite(this, buttonIndex, - kSaveGameMenuButtonFileHashes[buttonIndex], kSaveGameMenuButtonCollisionBounds[buttonIndex]); + buttonFileHashes[buttonIndex], buttonCollisionBounds[buttonIndex]); addCollisionSprite(menuButton); } SetUpdateHandler(&Scene::update); - SetMessageHandler(&SaveGameMenu::handleMessage); + SetMessageHandler(&GameStateMenu::handleMessage); + } -SaveGameMenu::~SaveGameMenu() { +GameStateMenu::~GameStateMenu() { delete _fontSurface; } -void SaveGameMenu::handleEvent(int16 itemID, int eventType) { - if (itemID == 69 && eventType == 5) { - uint currIndex = _listBox->getCurrIndex(); - _textEditWidget->setString((*_savegameList)[currIndex].description); - setCurrWidget(_textEditWidget); +NPoint GameStateMenu::getMousePos() { + NPoint pt; + pt.x = _mouseCursor->getX(); + pt.y = _mouseCursor->getY(); + return pt; +} + +void GameStateMenu::setCurrWidget(Widget *newWidget) { + if (newWidget && newWidget != _currWidget) { + if (_currWidget) + _currWidget->exitWidget(); + newWidget->enterWidget(); + _currWidget = newWidget; } } -uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { +void GameStateMenu::refreshDescriptionEdit() { + uint currIndex = _listBox->getCurrIndex(); + _textEditWidget->setString((*_savegameList)[currIndex].description); + setCurrWidget(_textEditWidget); +} + +void GameStateMenu::performAction() { + // Empty +} + +uint32 GameStateMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { Scene::handleMessage(messageNum, param, sender); switch (messageNum) { case 0x000A: - sendMessage(_textEditWidget, 0x000A, param.asInteger()); - setCurrWidget(_textEditWidget); + if (!_textEditWidget->isReadOnly()) { + sendMessage(_textEditWidget, 0x000A, param.asInteger()); + setCurrWidget(_textEditWidget); + } break; case 0x000B: if (param.asInteger() == Common::KEYCODE_RETURN) - performSaveGame(); + performAction(); else if (param.asInteger() == Common::KEYCODE_ESCAPE) leaveScene(1); - else { + else if (!_textEditWidget->isReadOnly()) { sendMessage(_textEditWidget, 0x000B, param.asInteger()); setCurrWidget(_textEditWidget); } @@ -947,7 +931,7 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En // Handle menu button click switch (param.asInteger()) { case 0: - performSaveGame(); + performAction(); break; case 1: leaveScene(1); @@ -970,219 +954,101 @@ uint32 SaveGameMenu::handleMessage(int messageNum, const MessageParam ¶m, En return 0; } -void SaveGameMenu::performSaveGame() { - ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), - _listBox->getCurrIndex(), _textEditWidget->isModified()); - leaveScene(0); -} - -LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) - : WidgetScene(vm, parentModule), _savegameList(savegameList) { - - static const uint32 kLoadGameMenuButtonFileHashes[] = { - 0x100B2091, - 0x84822B03, - 0x20E22087, - 0x04040107, - 0x04820122, - 0x24423047 - }; - - static const NRect kLoadGameMenuButtonCollisionBounds[] = { - NRect( 44, 115, 108, 147), - NRect( 52, 396, 112, 426), - NRect(188, 116, 245, 196), - NRect(189, 209, 239, 269), - NRect(187, 301, 233, 349), - NRect(182, 358, 241, 433) - }; +static const uint32 kSaveGameMenuButtonFileHashes[] = { + 0x8359A824, 0x0690E260, 0x0352B050, + 0x1392A223, 0x13802260, 0x0B32B200 +}; - static const NRect kListBoxRect(0, 0, 320, 271); - static const NRect kTextEditRect(0, 0, 320, 17); - static const NRect kMouseRect(263, 48, 583, 65); +static const NRect kSaveGameMenuButtonCollisionBounds[] = { + NRect(518, 106, 602, 160), + NRect(516, 378, 596, 434), + NRect(394, 108, 458, 206), + NRect(400, 204, 458, 276), + NRect(398, 292, 456, 352), + NRect(396, 352, 460, 444) +}; - _fontSurface = new FontSurface(_vm, calcHash("bgLoadTinyAlphabet"), 32, 7, 32, 11, 17); - - setBackground(0x98620234); - setPalette(0x98620234); - insertScreenMouse(0x2023098E, &kMouseRect); - insertStaticSprite(0x0BC600A3, 200); - insertStaticSprite(0x0F960021, 200); - - _listBox = new SavegameListBox(_vm, 263, 142, 69/*ItemID*/, this, - _savegameList, _fontSurface, 0x04040409, kListBoxRect); - _listBox->initialize(); +static const NRect kSaveGameMenuListBoxRect(0, 0, 320, 272); +static const NRect kSaveGameMenuTextEditRect(0, 0, 377, 17); +static const NRect kSaveGameMenuMouseRect(50, 47, 427, 64); - _textEditWidget = new TextEditWidget(_vm, 263, 48, 70/*ItemID*/, this, 29, - _fontSurface, 0x10924C03, kTextEditRect); - _textEditWidget->setReadOnly(true); - _textEditWidget->initialize(); - setCurrWidget(_textEditWidget); - - for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { - Sprite *menuButton = insertSprite(this, buttonIndex, - kLoadGameMenuButtonFileHashes[buttonIndex], kLoadGameMenuButtonCollisionBounds[buttonIndex]); - addCollisionSprite(menuButton); - } +SaveGameMenu::SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) + : GameStateMenu(vm, parentModule, savegameList, kSaveGameMenuButtonFileHashes, kSaveGameMenuButtonCollisionBounds, + 0x30084E25, 0x2328121A, + 0x84E21308, &kSaveGameMenuMouseRect, + 0x1115A223, 60, 142, kSaveGameMenuListBoxRect, + 0x3510A868, 0x8290AC20, 50, 47, kSaveGameMenuTextEditRect, + 0x1340A5C2, 0x1301A7EA) { - SetUpdateHandler(&Scene::update); - SetMessageHandler(&LoadGameMenu::handleMessage); } -LoadGameMenu::~LoadGameMenu() { - delete _fontSurface; +void SaveGameMenu::performAction() { + ((MenuModule*)_parentModule)->setSavegameInfo(_textEditWidget->getString(), + _listBox->getCurrIndex(), _textEditWidget->isModified()); + leaveScene(0); } -void LoadGameMenu::handleEvent(int16 itemID, int eventType) { - if (itemID == 69 && eventType == 5) { - uint currIndex = _listBox->getCurrIndex(); - _textEditWidget->setString((*_savegameList)[currIndex].description); - setCurrWidget(_textEditWidget); - } -} +static const uint32 kLoadGameMenuButtonFileHashes[] = { + 0x100B2091, 0x84822B03, 0x20E22087, + 0x04040107, 0x04820122, 0x24423047 +}; + +static const NRect kLoadGameMenuButtonCollisionBounds[] = { + NRect( 44, 115, 108, 147), + NRect( 52, 396, 112, 426), + NRect(188, 116, 245, 196), + NRect(189, 209, 239, 269), + NRect(187, 301, 233, 349), + NRect(182, 358, 241, 433) +}; + +static const NRect kLoadGameMenuListBoxRect(0, 0, 320, 271); +static const NRect kLoadGameMenuTextEditRect(0, 0, 320, 17); +static const NRect kLoadGameMenuMouseRect(263, 48, 583, 65); + +LoadGameMenu::LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) + : GameStateMenu(vm, parentModule, savegameList, kLoadGameMenuButtonFileHashes, kLoadGameMenuButtonCollisionBounds, + 0x98620234, 0x201C2474, + 0x2023098E, &kLoadGameMenuMouseRect, + 0x04040409, 263, 142, kLoadGameMenuListBoxRect, + 0x10924C03, 0, 263, 48, kLoadGameMenuTextEditRect, + 0x0BC600A3, 0x0F960021) { -uint32 LoadGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x000B: - if (param.asInteger() == Common::KEYCODE_RETURN) - performLoadGame(); - else if (param.asInteger() == Common::KEYCODE_ESCAPE) - leaveScene(1); - break; - case 0x2000: - // Handle menu button click - switch (param.asInteger()) { - case 0: - performLoadGame(); - break; - case 1: - leaveScene(1); - break; - case 2: - _listBox->pageUp(); - break; - case 3: - _listBox->scrollUp(); - break; - case 4: - _listBox->scrollDown(); - break; - case 5: - _listBox->pageDown(); - break; - } - break; - } - return 0; } -void LoadGameMenu::performLoadGame() { +void LoadGameMenu::performAction() { ((MenuModule*)_parentModule)->setLoadgameInfo(_listBox->getCurrIndex()); leaveScene(0); } -DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) - : WidgetScene(vm, parentModule), _savegameList(savegameList) { - - static const uint32 kDeleteGameMenuButtonFileHashes[] = { - 0x8198E268, - 0xDD0C4620, - 0x81296520, - 0x8D284211, - 0x8C004621, - 0x07294020 - }; - - static const NRect kDeleteGameMenuButtonCollisionBounds[] = { - NRect(518, 46, 595, 91), - NRect(524, 322, 599, 369), - NRect(395, 40, 462, 127), - NRect(405, 126, 460, 185), - NRect(397, 205, 456, 273), - NRect(395, 278, 452, 372) - }; - - static const NRect kListBoxRect(0, 0, 320, 271); - static const NRect kTextEditRect(0, 0, 320, 17); - - _fontSurface = new FontSurface(_vm, calcHash("bgDeleteTinyAlphabet"), 32, 7, 32, 11, 17); - - setBackground(0x4080E01C); - setPalette(0x4080E01C); - insertScreenMouse(0x0E018400); - insertStaticSprite(0x80083C01, 200); - insertStaticSprite(0x84181E81, 200); - - _listBox = new SavegameListBox(_vm, 61, 64, 69/*ItemID*/, this, - _savegameList, _fontSurface, calcHash("mxDeleteListBox"), kListBoxRect); - _listBox->initialize(); - - _textEditWidget = new TextEditWidget(_vm, 49, 414, 70/*ItemID*/, this, 29, - _fontSurface, 0x250A3060, kTextEditRect); - _textEditWidget->setReadOnly(true); - _textEditWidget->initialize(); - setCurrWidget(_textEditWidget); - - for (uint buttonIndex = 0; buttonIndex < 6; ++buttonIndex) { - Sprite *menuButton = insertSprite(this, buttonIndex, - kDeleteGameMenuButtonFileHashes[buttonIndex], kDeleteGameMenuButtonCollisionBounds[buttonIndex]); - addCollisionSprite(menuButton); - } +static const uint32 kDeleteGameMenuButtonFileHashes[] = { + 0x8198E268, 0xDD0C4620, 0x81296520, + 0x8D284211, 0x8C004621, 0x07294020 +}; - SetUpdateHandler(&Scene::update); - SetMessageHandler(&DeleteGameMenu::handleMessage); -} +static const NRect kDeleteGameMenuButtonCollisionBounds[] = { + NRect(518, 46, 595, 91), + NRect(524, 322, 599, 369), + NRect(395, 40, 462, 127), + NRect(405, 126, 460, 185), + NRect(397, 205, 456, 273), + NRect(395, 278, 452, 372) +}; -DeleteGameMenu::~DeleteGameMenu() { - delete _fontSurface; -} +static const NRect kDeleteGameMenuListBoxRect(0, 0, 320, 271); +static const NRect kDeleteGameMenuTextEditRect(0, 0, 320, 17); -void DeleteGameMenu::handleEvent(int16 itemID, int eventType) { - if (itemID == 69 && eventType == 5) { - uint currIndex = _listBox->getCurrIndex(); - _textEditWidget->setString((*_savegameList)[currIndex].description); - setCurrWidget(_textEditWidget); - } -} +DeleteGameMenu::DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList) + : GameStateMenu(vm, parentModule, savegameList, kDeleteGameMenuButtonFileHashes, kDeleteGameMenuButtonCollisionBounds, + 0x4080E01C, 0x728523ED, + 0x0E018400, NULL, + 0xA5584211, 61, 64, kDeleteGameMenuListBoxRect, + 0x250A3060, 0, 49, 414, kDeleteGameMenuTextEditRect, + 0x80083C01, 0x84181E81) { -uint32 DeleteGameMenu::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x000B: - if (param.asInteger() == Common::KEYCODE_RETURN) - performDeleteGame(); - else if (param.asInteger() == Common::KEYCODE_ESCAPE) - leaveScene(1); - break; - case 0x2000: - // Handle menu button click - switch (param.asInteger()) { - case 0: - performDeleteGame(); - break; - case 1: - leaveScene(1); - break; - case 2: - _listBox->pageUp(); - break; - case 3: - _listBox->scrollUp(); - break; - case 4: - _listBox->scrollDown(); - break; - case 5: - _listBox->pageDown(); - break; - } - break; - } - return 0; } -void DeleteGameMenu::performDeleteGame() { +void DeleteGameMenu::performAction() { ((MenuModule*)_parentModule)->setDeletegameInfo(_listBox->getCurrIndex()); leaveScene(0); } @@ -1213,7 +1079,7 @@ QueryOverwriteMenu::QueryOverwriteMenu(NeverhoodEngine *vm, Module *parentModule // Draw the query text to the background, each text line is centered // NOTE The original had this text in its own class - FontSurface *fontSurface = new FontSurface(_vm, calcHash("bgQueryTinyAlphabet"), 32, 7, 32, 11, 17); + FontSurface *fontSurface = new FontSurface(_vm, 0x94188D4D, 32, 7, 32, 11, 17); Common::StringArray textLines; textLines.push_back(description); textLines.push_back("Game exists."); diff --git a/engines/neverhood/menumodule.h b/engines/neverhood/menumodule.h index 39cd36a7a2..08858ad204 100644 --- a/engines/neverhood/menumodule.h +++ b/engines/neverhood/menumodule.h @@ -98,21 +98,11 @@ protected: }; class Widget; - -class WidgetScene : public Scene { -public: - WidgetScene(NeverhoodEngine *vm, Module *parentModule); - NPoint getMousePos(); - virtual void setCurrWidget(Widget *newWidget); - virtual Widget *getCurrWidget() { return _currWidget; } - virtual void handleEvent(int16 itemID, int eventType); -protected: - Widget *_currWidget; -}; +class GameStateMenu; class Widget : public StaticSprite { public: - Widget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + Widget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, int baseObjectPriority, int baseSurfacePriority); virtual void onClick(); virtual void setPosition(int16 x, int16 y); @@ -123,8 +113,7 @@ public: virtual void enterWidget(); virtual void exitWidget(); protected: - int16 _itemID; - WidgetScene *_parentScene; + GameStateMenu *_parentScene; int _baseObjectPriority; int _baseSurfacePriority; void update(); @@ -133,7 +122,7 @@ protected: class TextLabelWidget : public Widget { public: - TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + TextLabelWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, int baseObjectPriority, int baseSurfacePriority, const byte *string, int stringLen, BaseSurface *drawSurface, int16 tx, int16 ty, FontSurface *fontSurface); virtual void initialize(); @@ -153,7 +142,7 @@ protected: class TextEditWidget : public Widget { public: - TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + TextEditWidget(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, int maxStringLength, FontSurface *fontSurface, uint32 fileHash, const NRect &rect); ~TextEditWidget(); virtual void onClick(); @@ -169,6 +158,7 @@ public: void handleKeyDown(Common::KeyCode keyCode); void refresh(); void setReadOnly(bool value) { _readOnly = value; } + bool isReadOnly() const { return _readOnly; } bool isModified() const { return _modified; } protected: NRect _rect; @@ -191,7 +181,7 @@ protected: class SavegameListBox : public Widget { public: - SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, int16 itemID, WidgetScene *parentScene, + SavegameListBox(NeverhoodEngine *vm, int16 x, int16 y, GameStateMenu *parentScene, SavegameList *savegameList, FontSurface *fontSurface, uint32 bgFileHash, const NRect &rect); virtual void onClick(); virtual void initialize(); @@ -215,51 +205,51 @@ protected: uint _currIndex; int _maxVisibleItemsCount; }; - -class SaveGameMenu : public WidgetScene { + +class GameStateMenu : public Scene { public: - SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); - ~SaveGameMenu(); - virtual void handleEvent(int16 itemID, int eventType); + GameStateMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList, + const uint32 *buttonFileHashes, const NRect *buttonCollisionBounds, + uint32 backgroundFileHash, uint32 fontFileHash, + uint32 mouseFileHash, const NRect *mouseRect, + uint32 listBoxBackgroundFileHash, int16 listBoxX, int16 listBoxY, const NRect &listBoxRect, + uint32 textEditBackgroundFileHash, uint32 textEditCursorFileHash, int16 textEditX, int16 textEditY, const NRect &textEditRect, + uint32 textFileHash1, uint32 textFileHash2); + virtual ~GameStateMenu(); + NPoint getMousePos(); + virtual void setCurrWidget(Widget *newWidget); + virtual Widget *getCurrWidget() { return _currWidget; } + virtual void refreshDescriptionEdit(); protected: + Widget *_currWidget; SavegameList *_savegameList; FontSurface *_fontSurface; SavegameListBox *_listBox; TextEditWidget *_textEditWidget; Common::String _savegameDescription; - void update(); uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void performSaveGame(); + virtual void performAction(); +}; + +class SaveGameMenu : public GameStateMenu { +public: + SaveGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); +protected: + virtual void performAction(); }; -class LoadGameMenu : public WidgetScene { +class LoadGameMenu : public GameStateMenu { public: LoadGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); - ~LoadGameMenu(); - virtual void handleEvent(int16 itemID, int eventType); protected: - SavegameList *_savegameList; - FontSurface *_fontSurface; - SavegameListBox *_listBox; - TextEditWidget *_textEditWidget; - Common::String _savegameDescription; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void performLoadGame(); + virtual void performAction(); }; -class DeleteGameMenu : public WidgetScene { +class DeleteGameMenu : public GameStateMenu { public: DeleteGameMenu(NeverhoodEngine *vm, Module *parentModule, SavegameList *savegameList); - ~DeleteGameMenu(); - virtual void handleEvent(int16 itemID, int eventType); protected: - SavegameList *_savegameList; - FontSurface *_fontSurface; - SavegameListBox *_listBox; - TextEditWidget *_textEditWidget; - Common::String _savegameDescription; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void performDeleteGame(); + virtual void performAction(); }; class QueryOverwriteMenu : public Scene { -- cgit v1.2.3 From 9b6d813d412a636b1c02511065ab1466e0f6c5e0 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Wed, 30 Jan 2013 11:06:33 +0000 Subject: NEVERHOOD: Update todo.txt --- engines/neverhood/todo.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engines/neverhood/todo.txt b/engines/neverhood/todo.txt index c13d3f13d5..9d781e06ec 100644 --- a/engines/neverhood/todo.txt +++ b/engines/neverhood/todo.txt @@ -13,13 +13,13 @@ TODOs which can be done any time: TODOs which should be done only after the game logic is finished: ------------------------------------------------------------------- -- Implement game menus - Maybe rework organization of files (e.g. put ALL Sprites into one separate file, same with Modules and Scenes) - This would solve the problem of how to organize stuff which is used several times, and less headers would have to be included - The move special scenes (SmackerScene) into the scenes file DONE: ------- +- Implement game menus - Rework sound system (I don't like that SoundResources need to be explicitly initialized in Scene constructors) - Should be just a handle object which initializes itself - Play routine should fill the handle so it can be stopped/queried later -- cgit v1.2.3 From 583f9abaf98f64895546b75573e9442ca47426e3 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sat, 2 Mar 2013 21:25:38 +0000 Subject: NEVERHOOD: Fix some logic bugs and minor changes - Fix video speed in the very last scene (Scene1317) - Fix back door not opening in Scene1401 - Fix projector not moving in Scene1402 - Fix projector not appearing in Scene1403 - Fix wrong Klaymen walking in Scene2205 - Fix wrong scene change in Module2300 - Fix symbols not appearing in Scene3011 - Define out some remaining logic debug code - Remove some obsolete comments - Reduce debug output - Use a List instead of an Array when building the microtiles rectangles --- engines/neverhood/blbarchive.cpp | 2 +- engines/neverhood/gamemodule.cpp | 70 +++++-------------------------------- engines/neverhood/menumodule.cpp | 2 +- engines/neverhood/microtiles.cpp | 4 +-- engines/neverhood/microtiles.h | 6 ++-- engines/neverhood/module1300.cpp | 1 + engines/neverhood/module1400.cpp | 8 ++--- engines/neverhood/module2200.cpp | 5 ++- engines/neverhood/module2300.cpp | 2 +- engines/neverhood/module2800.cpp | 1 - engines/neverhood/module3000.cpp | 12 ++++--- engines/neverhood/resource.cpp | 1 - engines/neverhood/resourceman.cpp | 1 - engines/neverhood/screen.cpp | 6 ++-- engines/neverhood/smackerplayer.cpp | 2 +- engines/neverhood/smackerscene.cpp | 8 ++--- engines/neverhood/sound.h | 8 ----- 17 files changed, 40 insertions(+), 99 deletions(-) diff --git a/engines/neverhood/blbarchive.cpp b/engines/neverhood/blbarchive.cpp index 748d04c7ca..9f5f46487c 100644 --- a/engines/neverhood/blbarchive.cpp +++ b/engines/neverhood/blbarchive.cpp @@ -153,7 +153,7 @@ Common::SeekableReadStream *BlbArchive::createStream(uint index) { Common::SeekableReadStream *BlbArchive::createStream(BlbArchiveEntry *entry) { return new SafeMutexedSeekableSubReadStream(&_fd, entry->offset, entry->offset + entry->diskSize, - DisposeAfterUse::NO,_mutex); + DisposeAfterUse::NO, _mutex); } } // End of namespace Neverhood diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 1246a5b962..99aea5d938 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -84,7 +84,6 @@ GameModule::GameModule(NeverhoodEngine *vm) } GameModule::~GameModule() { - _vm->_soundMan->deleteSoundGroup(0x002D0031); delete _childObject; _childObject = NULL; @@ -196,7 +195,8 @@ void GameModule::initMemoryPuzzle() { } setSubVar(VA_IS_PUZZLE_INIT, 0xC8606803, 1); - // DEBUG>>> Some debug code: Leave two matching tiles open + // DEBUG Enable to autosolve all tiles and leave only two matching tiles open +#if 0 for (int i = 0; i < 48; i++) setSubVar(VA_IS_TILE_MATCH, i, 1); int debugIndex = 0; @@ -207,7 +207,7 @@ void GameModule::initMemoryPuzzle() { break; } } - // <<>> /* @@ -395,63 +396,7 @@ void GameModule::startup() { #if 1 _vm->gameState().which = 0; _vm->gameState().sceneNum = 0; - createModule(1000, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 5; - _vm->gameState().which = 0; - createModule(2800, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 0; - createModule(2000, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 5; - createModule(2200, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 7; - createModule(2200, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 1; - createModule(1000, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 8; - _vm->gameState().which = 1; - createModule(1600, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 6; - createModule(1900, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 0; - createModule(2100, 3); -#endif -#if 0 - _vm->gameState().sceneNum = 8; - createModule(2600, -1); -#endif -#if 0 - _vm->gameState().which = 0; - _vm->gameState().sceneNum = 1; - createModule(2700, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 1; - createModule(2800, -1); -#endif -#if 0 - _vm->gameState().which = 0; - _vm->gameState().sceneNum = 0; - createModule(2500, -1); -#endif -#if 0 - _vm->gameState().sceneNum = 1; - createModule(2300, -1); + createModule(2400, 0); #endif #endif @@ -739,6 +684,7 @@ void GameModule::updateModule() { createModule(2300, 1); break; case 2300: + debug("module 23000 _moduleResult : %d", _moduleResult); if (_moduleResult == 2) createModule(1200, 0); else if (_moduleResult == 0) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index 619acadd8c..d4882c395a 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -583,7 +583,7 @@ void TextEditWidget::onClick() { _cursorPos = 0; else { int newCursorPos = mousePos.x / _fontSurface->getCharWidth(); - if (mousePos.x % _fontSurface->getCharWidth() > _fontSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size())//### + if (mousePos.x % _fontSurface->getCharWidth() > _fontSurface->getCharWidth() / 2 && newCursorPos <= (int)_entryString.size()) ++newCursorPos; _cursorPos = MIN((int)_entryString.size(), newCursorPos); } diff --git a/engines/neverhood/microtiles.cpp b/engines/neverhood/microtiles.cpp index ee64fdadc5..e19be52b5a 100644 --- a/engines/neverhood/microtiles.cpp +++ b/engines/neverhood/microtiles.cpp @@ -108,9 +108,9 @@ void MicroTileArray::updateBoundingBox(BoundingBox &boundingBox, byte x0, byte y setBoundingBox(boundingBox, x0, y0, x1, y1); } -RectArray *MicroTileArray::getRectangles() { +RectangleList *MicroTileArray::getRectangles() { - RectArray *rects = new RectArray(); + RectangleList *rects = new RectangleList(); int x, y; int x0, y0, x1, y1; diff --git a/engines/neverhood/microtiles.h b/engines/neverhood/microtiles.h index 2ad6796903..29af3d956a 100644 --- a/engines/neverhood/microtiles.h +++ b/engines/neverhood/microtiles.h @@ -25,7 +25,7 @@ #define NEVERHOOD_MICROTILES_H #include "common/scummsys.h" -#include "common/array.h" +#include "common/list.h" #include "common/util.h" #include "common/rect.h" @@ -37,7 +37,7 @@ const BoundingBox FullBoundingBox = 0x00001F1F; const BoundingBox EmptyBoundingBox = 0x00000000; const int TileSize = 32; -typedef Common::Array RectArray; +typedef Common::List RectangleList; class MicroTileArray { public: @@ -45,7 +45,7 @@ public: ~MicroTileArray(); void addRect(Common::Rect r); void clear(); - RectArray *getRectangles(); + RectangleList *getRectangles(); protected: BoundingBox *_tiles; int16 _tilesW, _tilesH; diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp index 94937c4c7f..162d710f46 100644 --- a/engines/neverhood/module1300.cpp +++ b/engines/neverhood/module1300.cpp @@ -1701,6 +1701,7 @@ Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule) SetMessageHandler(&Scene1317::handleMessage); _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); insertScreenMouse(0x08284011); showMouse(false); _smackerFileHash = 0; diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp index d96703b6f2..8aa0632e90 100644 --- a/engines/neverhood/module1400.cpp +++ b/engines/neverhood/module1400.cpp @@ -339,7 +339,7 @@ uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam &pa break; case 0x4808: _countdown = 168; - if (_isOpen) + if (!_isOpen) stOpenDoor(); break; } @@ -743,7 +743,7 @@ uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entit if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) sendMessage(_asProjector , 0x4839, 0); } else if (sender == _ssButton) - sendMessage(_ssButton, 0x4808, 0); + sendMessage(_asBackDoor, 0x4808, 0); break; case 0x4826: if (sender == _asProjector) { @@ -968,7 +968,7 @@ uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entit break; case 0x4826: if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x408C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { sendEntityMessage(_klaymen, 0x1014, _asProjector); setMessageList2(0x004B0BB8); } else @@ -1309,7 +1309,7 @@ Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) } _klaymen->setRepl(64, 0); - if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { + if (getGlobalVar(V_PROJECTOR_LOCATION) == 0) { _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); addCollisionSprite(_asProjector); if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp index 2e6549a230..ddcfb3685c 100644 --- a/engines/neverhood/module2200.cpp +++ b/engines/neverhood/module2200.cpp @@ -47,6 +47,7 @@ Module2200::~Module2200() { } void Module2200::createScene(int sceneNum, int which) { + debug("Module2200::createScene(%d, %d)", sceneNum, which); _sceneNum = sceneNum; switch (_sceneNum) { case 0: @@ -1221,7 +1222,6 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) SetUpdateHandler(&Scene2205::update); setHitRects(0x004B0620); - loadDataResource(0x00144822); if (getGlobalVar(V_LIGHTS_ON)) { _isLightOn = true; setBackground(0x0008028D); @@ -1263,6 +1263,9 @@ Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); _klaymen->setSoundFlag(true); + + loadDataResource(0x00144822); + } void Scene2205::update() { diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp index 937ba9a4f3..bf0e866b2f 100644 --- a/engines/neverhood/module2300.cpp +++ b/engines/neverhood/module2300.cpp @@ -140,7 +140,7 @@ void Module2300::updateScene() { break; case 2: if (_moduleResult == 1) - leaveModule(3); + leaveModule(1); else createScene(1, 5); break; diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp index 5fececd568..d81445cf50 100644 --- a/engines/neverhood/module2800.cpp +++ b/engines/neverhood/module2800.cpp @@ -284,7 +284,6 @@ void Module2800::updateScene() { createScene(9, 4); break; case 9: - debug("scene 9 _moduleResult = %d", _moduleResult); if (_moduleResult == 1) createScene(11, 0); else if (_moduleResult == 2) diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp index 6bf95e3c9a..d08ff9d6ae 100644 --- a/engines/neverhood/module3000.cpp +++ b/engines/neverhood/module3000.cpp @@ -756,7 +756,6 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) _isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { _cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS); - debug("_cannonTargetStatus = %d", _cannonTargetStatus); _vm->gameModule()->initCannonSymbolsPuzzle(); @@ -809,11 +808,12 @@ Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) SetMessageHandler(&Scene3009::handleMessage); SetUpdateHandler(&Scene3009::update); - // DEBUG: Set the correct code + // DEBUG Enable to set the correct code +#if 0 for (int i = 0; i < 6; i++) setSubVar(VA_CURR_CANNON_SYMBOLS, i, _correctSymbols[i]); sendMessage(this, 0x2003, 0); - //setGlobalVar(V_ROBOT_TARGET, 1); +#endif } @@ -1224,10 +1224,12 @@ Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) int initCountdown = 0; - // DEBUG: Enable all buttons + // DEBUG Enable to activate all buttons +#if 0 setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[0], 1); setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1); setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1); +#endif setBackground(0x80802626); setPalette(0x80802626); @@ -1448,7 +1450,7 @@ void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) { } Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0) { + : Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0), _countdown(0) { _vm->gameModule()->initCodeSymbolsPuzzle(); _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 2fce4ba18e..22a802807b 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -355,7 +355,6 @@ DataResource::~DataResource() { void DataResource::load(uint32 fileHash) { if (_resourceHandle.fileHash() == fileHash) return; - debug("DataResource::load(%08X)", fileHash); const byte *data = NULL; uint32 dataSize = 0; unload(); diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index 9e5f9ae52f..f662130ea8 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -58,7 +58,6 @@ void ResourceMan::addArchive(const Common::String &filename) { _entries[archiveEntry->fileHash] = newEntry; } } - debug("_entries.size() = %d", _entries.size()); } ResourceFileEntry *ResourceMan::findEntrySimple(uint32 fileHash) { diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 3e57422cea..25b4109980 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -86,18 +86,18 @@ void Screen::update() { renderItem._refresh = true; } - RectArray *updateRects = _microTiles->getRectangles(); + RectangleList *updateRects = _microTiles->getRectangles(); for (RenderQueue::iterator it = _renderQueue->begin(); it != _renderQueue->end(); ++it) { RenderItem &renderItem = (*it); - for (RectArray::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) + for (RectangleList::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) blitRenderItem(renderItem, *ri); } SWAP(_renderQueue, _prevRenderQueue); _renderQueue->clear(); - for (Common::Array::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) { + for (RectangleList::iterator ri = updateRects->begin(); ri != updateRects->end(); ++ri) { Common::Rect &r = *ri; _vm->_system->copyRectToScreen((const byte*)_backScreen->getBasePtr(r.left, r.top), _backScreen->pitch, r.left, r.top, r.width(), r.height()); } diff --git a/engines/neverhood/smackerplayer.cpp b/engines/neverhood/smackerplayer.cpp index 7c14edf48b..b67c8db9fc 100644 --- a/engines/neverhood/smackerplayer.cpp +++ b/engines/neverhood/smackerplayer.cpp @@ -100,7 +100,7 @@ SmackerPlayer::~SmackerPlayer() { } void SmackerPlayer::open(uint32 fileHash, bool keepLastFrame) { - debug("SmackerPlayer::open(%08X)", fileHash); + debug(0, "SmackerPlayer::open(%08X)", fileHash); _fileHash = fileHash; _keepLastFrame = keepLastFrame; diff --git a/engines/neverhood/smackerscene.cpp b/engines/neverhood/smackerscene.cpp index 20eebe2bc7..115aafe5be 100644 --- a/engines/neverhood/smackerscene.cpp +++ b/engines/neverhood/smackerscene.cpp @@ -28,7 +28,7 @@ SmackerScene::SmackerScene(NeverhoodEngine *vm, Module *parentModule, bool doubl : Scene(vm, parentModule), _doubleSurface(doubleSurface), _canSkip(canSkip), _canAbort(canAbort), _videoPlayedBefore(false), _fileHashListIndex(-1), _fileHashList(NULL), _playNextVideoFlag(false) { - debug("SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort); + debug(0, "SmackerScene::SmackerScene(%d, %d, %d)", doubleSurface, canSkip, canAbort); // NOTE: Merged from SmackerScene::init, maybe split again if needed (incl. parameter flags) @@ -53,18 +53,18 @@ SmackerScene::~SmackerScene() { } void SmackerScene::setFileHash(uint32 fileHash) { - debug("SmackerScene::setFileHash(%08X)", fileHash); + debug(0, "SmackerScene::setFileHash(%08X)", fileHash); _fileHash[0] = fileHash; _fileHashList = _fileHash; } void SmackerScene::setFileHashList(const uint32 *fileHashList) { - debug("SmackerScene::setFileHashList(...)"); + debug(0, "SmackerScene::setFileHashList(...)"); _fileHashList = fileHashList; } void SmackerScene::nextVideo() { - debug("SmackerScene::nextVideo()"); + debug(0, "SmackerScene::nextVideo()"); _fileHashListIndex++; diff --git a/engines/neverhood/sound.h b/engines/neverhood/sound.h index e0e45e9ad1..d3318998db 100644 --- a/engines/neverhood/sound.h +++ b/engines/neverhood/sound.h @@ -124,14 +124,6 @@ protected: SoundResource *_soundResource; }; -// TODO Give this a better name - -/* -template -class SoundManItems : public Common::Array { -}; -*/ - class SoundMan { public: SoundMan(NeverhoodEngine *vm); -- cgit v1.2.3 From 78e0d6a3f1bd0ee050e5cd0ca3599f86dcf25813 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 5 May 2013 00:12:33 +0200 Subject: NEVERHOOD: Move module files to own subdirectory --- engines/neverhood/detection.cpp | 1 - engines/neverhood/gamemodule.cpp | 42 +- engines/neverhood/module.cpp | 4 +- engines/neverhood/module.mk | 42 +- engines/neverhood/module1000.cpp | 1699 ---------------- engines/neverhood/module1000.h | 300 --- engines/neverhood/module1100.cpp | 707 ------- engines/neverhood/module1100.h | 130 -- engines/neverhood/module1200.cpp | 1102 ---------- engines/neverhood/module1200.h | 216 -- engines/neverhood/module1300.cpp | 1835 ----------------- engines/neverhood/module1300.h | 295 --- engines/neverhood/module1400.cpp | 1621 --------------- engines/neverhood/module1400.h | 281 --- engines/neverhood/module1500.cpp | 134 -- engines/neverhood/module1500.h | 58 - engines/neverhood/module1600.cpp | 1412 ------------- engines/neverhood/module1600.h | 183 -- engines/neverhood/module1700.cpp | 279 --- engines/neverhood/module1700.h | 72 - engines/neverhood/module1800.cpp | 181 -- engines/neverhood/module1800.h | 46 - engines/neverhood/module1900.cpp | 650 ------ engines/neverhood/module1900.h | 143 -- engines/neverhood/module2000.cpp | 160 -- engines/neverhood/module2000.h | 55 - engines/neverhood/module2100.cpp | 336 ---- engines/neverhood/module2100.h | 92 - engines/neverhood/module2200.cpp | 2564 ------------------------ engines/neverhood/module2200.h | 375 ---- engines/neverhood/module2300.cpp | 186 -- engines/neverhood/module2300.h | 48 - engines/neverhood/module2400.cpp | 992 --------- engines/neverhood/module2400.h | 182 -- engines/neverhood/module2500.cpp | 546 ----- engines/neverhood/module2500.h | 101 - engines/neverhood/module2600.cpp | 348 ---- engines/neverhood/module2600.h | 74 - engines/neverhood/module2700.cpp | 1211 ----------- engines/neverhood/module2700.h | 182 -- engines/neverhood/module2800.cpp | 3205 ------------------------------ engines/neverhood/module2800.h | 505 ----- engines/neverhood/module2900.cpp | 439 ---- engines/neverhood/module2900.h | 102 - engines/neverhood/module3000.cpp | 1548 --------------- engines/neverhood/module3000.h | 255 --- engines/neverhood/modules/module1000.cpp | 1699 ++++++++++++++++ engines/neverhood/modules/module1000.h | 300 +++ engines/neverhood/modules/module1100.cpp | 707 +++++++ engines/neverhood/modules/module1100.h | 130 ++ engines/neverhood/modules/module1200.cpp | 1102 ++++++++++ engines/neverhood/modules/module1200.h | 216 ++ engines/neverhood/modules/module1300.cpp | 1835 +++++++++++++++++ engines/neverhood/modules/module1300.h | 295 +++ engines/neverhood/modules/module1400.cpp | 1621 +++++++++++++++ engines/neverhood/modules/module1400.h | 281 +++ engines/neverhood/modules/module1500.cpp | 134 ++ engines/neverhood/modules/module1500.h | 58 + engines/neverhood/modules/module1600.cpp | 1412 +++++++++++++ engines/neverhood/modules/module1600.h | 183 ++ engines/neverhood/modules/module1700.cpp | 279 +++ engines/neverhood/modules/module1700.h | 72 + engines/neverhood/modules/module1800.cpp | 181 ++ engines/neverhood/modules/module1800.h | 46 + engines/neverhood/modules/module1900.cpp | 650 ++++++ engines/neverhood/modules/module1900.h | 143 ++ engines/neverhood/modules/module2000.cpp | 160 ++ engines/neverhood/modules/module2000.h | 55 + engines/neverhood/modules/module2100.cpp | 336 ++++ engines/neverhood/modules/module2100.h | 92 + engines/neverhood/modules/module2200.cpp | 2564 ++++++++++++++++++++++++ engines/neverhood/modules/module2200.h | 375 ++++ engines/neverhood/modules/module2300.cpp | 186 ++ engines/neverhood/modules/module2300.h | 48 + engines/neverhood/modules/module2400.cpp | 992 +++++++++ engines/neverhood/modules/module2400.h | 182 ++ engines/neverhood/modules/module2500.cpp | 546 +++++ engines/neverhood/modules/module2500.h | 101 + engines/neverhood/modules/module2600.cpp | 348 ++++ engines/neverhood/modules/module2600.h | 74 + engines/neverhood/modules/module2700.cpp | 1211 +++++++++++ engines/neverhood/modules/module2700.h | 182 ++ engines/neverhood/modules/module2800.cpp | 3205 ++++++++++++++++++++++++++++++ engines/neverhood/modules/module2800.h | 505 +++++ engines/neverhood/modules/module2900.cpp | 439 ++++ engines/neverhood/modules/module2900.h | 102 + engines/neverhood/modules/module3000.cpp | 1548 +++++++++++++++ engines/neverhood/modules/module3000.h | 255 +++ 88 files changed, 24894 insertions(+), 24895 deletions(-) delete mode 100644 engines/neverhood/module1000.cpp delete mode 100644 engines/neverhood/module1000.h delete mode 100644 engines/neverhood/module1100.cpp delete mode 100644 engines/neverhood/module1100.h delete mode 100644 engines/neverhood/module1200.cpp delete mode 100644 engines/neverhood/module1200.h delete mode 100644 engines/neverhood/module1300.cpp delete mode 100644 engines/neverhood/module1300.h delete mode 100644 engines/neverhood/module1400.cpp delete mode 100644 engines/neverhood/module1400.h delete mode 100644 engines/neverhood/module1500.cpp delete mode 100644 engines/neverhood/module1500.h delete mode 100644 engines/neverhood/module1600.cpp delete mode 100644 engines/neverhood/module1600.h delete mode 100644 engines/neverhood/module1700.cpp delete mode 100644 engines/neverhood/module1700.h delete mode 100644 engines/neverhood/module1800.cpp delete mode 100644 engines/neverhood/module1800.h delete mode 100644 engines/neverhood/module1900.cpp delete mode 100644 engines/neverhood/module1900.h delete mode 100644 engines/neverhood/module2000.cpp delete mode 100644 engines/neverhood/module2000.h delete mode 100644 engines/neverhood/module2100.cpp delete mode 100644 engines/neverhood/module2100.h delete mode 100644 engines/neverhood/module2200.cpp delete mode 100644 engines/neverhood/module2200.h delete mode 100644 engines/neverhood/module2300.cpp delete mode 100644 engines/neverhood/module2300.h delete mode 100644 engines/neverhood/module2400.cpp delete mode 100644 engines/neverhood/module2400.h delete mode 100644 engines/neverhood/module2500.cpp delete mode 100644 engines/neverhood/module2500.h delete mode 100644 engines/neverhood/module2600.cpp delete mode 100644 engines/neverhood/module2600.h delete mode 100644 engines/neverhood/module2700.cpp delete mode 100644 engines/neverhood/module2700.h delete mode 100644 engines/neverhood/module2800.cpp delete mode 100644 engines/neverhood/module2800.h delete mode 100644 engines/neverhood/module2900.cpp delete mode 100644 engines/neverhood/module2900.h delete mode 100644 engines/neverhood/module3000.cpp delete mode 100644 engines/neverhood/module3000.h create mode 100644 engines/neverhood/modules/module1000.cpp create mode 100644 engines/neverhood/modules/module1000.h create mode 100644 engines/neverhood/modules/module1100.cpp create mode 100644 engines/neverhood/modules/module1100.h create mode 100644 engines/neverhood/modules/module1200.cpp create mode 100644 engines/neverhood/modules/module1200.h create mode 100644 engines/neverhood/modules/module1300.cpp create mode 100644 engines/neverhood/modules/module1300.h create mode 100644 engines/neverhood/modules/module1400.cpp create mode 100644 engines/neverhood/modules/module1400.h create mode 100644 engines/neverhood/modules/module1500.cpp create mode 100644 engines/neverhood/modules/module1500.h create mode 100644 engines/neverhood/modules/module1600.cpp create mode 100644 engines/neverhood/modules/module1600.h create mode 100644 engines/neverhood/modules/module1700.cpp create mode 100644 engines/neverhood/modules/module1700.h create mode 100644 engines/neverhood/modules/module1800.cpp create mode 100644 engines/neverhood/modules/module1800.h create mode 100644 engines/neverhood/modules/module1900.cpp create mode 100644 engines/neverhood/modules/module1900.h create mode 100644 engines/neverhood/modules/module2000.cpp create mode 100644 engines/neverhood/modules/module2000.h create mode 100644 engines/neverhood/modules/module2100.cpp create mode 100644 engines/neverhood/modules/module2100.h create mode 100644 engines/neverhood/modules/module2200.cpp create mode 100644 engines/neverhood/modules/module2200.h create mode 100644 engines/neverhood/modules/module2300.cpp create mode 100644 engines/neverhood/modules/module2300.h create mode 100644 engines/neverhood/modules/module2400.cpp create mode 100644 engines/neverhood/modules/module2400.h create mode 100644 engines/neverhood/modules/module2500.cpp create mode 100644 engines/neverhood/modules/module2500.h create mode 100644 engines/neverhood/modules/module2600.cpp create mode 100644 engines/neverhood/modules/module2600.h create mode 100644 engines/neverhood/modules/module2700.cpp create mode 100644 engines/neverhood/modules/module2700.h create mode 100644 engines/neverhood/modules/module2800.cpp create mode 100644 engines/neverhood/modules/module2800.h create mode 100644 engines/neverhood/modules/module2900.cpp create mode 100644 engines/neverhood/modules/module2900.h create mode 100644 engines/neverhood/modules/module3000.cpp create mode 100644 engines/neverhood/modules/module3000.h diff --git a/engines/neverhood/detection.cpp b/engines/neverhood/detection.cpp index e5bfd292ad..4f70c63299 100644 --- a/engines/neverhood/detection.cpp +++ b/engines/neverhood/detection.cpp @@ -235,4 +235,3 @@ SaveStateDescriptor NeverhoodMetaEngine::querySaveMetaInfos(const char *target, #else REGISTER_PLUGIN_STATIC(NEVERHOOD, PLUGIN_TYPE_ENGINE, NeverhoodMetaEngine); #endif - diff --git a/engines/neverhood/gamemodule.cpp b/engines/neverhood/gamemodule.cpp index 99aea5d938..49682b0d29 100644 --- a/engines/neverhood/gamemodule.cpp +++ b/engines/neverhood/gamemodule.cpp @@ -24,27 +24,27 @@ #include "neverhood/graphics.h" #include "neverhood/menumodule.h" -#include "neverhood/module1000.h" -#include "neverhood/module1100.h" -#include "neverhood/module1200.h" -#include "neverhood/module1300.h" -#include "neverhood/module1400.h" -#include "neverhood/module1500.h" -#include "neverhood/module1600.h" -#include "neverhood/module1700.h" -#include "neverhood/module1800.h" -#include "neverhood/module1900.h" -#include "neverhood/module2000.h" -#include "neverhood/module2100.h" -#include "neverhood/module2200.h" -#include "neverhood/module2300.h" -#include "neverhood/module2400.h" -#include "neverhood/module2500.h" -#include "neverhood/module2600.h" -#include "neverhood/module2700.h" -#include "neverhood/module2800.h" -#include "neverhood/module2900.h" -#include "neverhood/module3000.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1100.h" +#include "neverhood/modules/module1200.h" +#include "neverhood/modules/module1300.h" +#include "neverhood/modules/module1400.h" +#include "neverhood/modules/module1500.h" +#include "neverhood/modules/module1600.h" +#include "neverhood/modules/module1700.h" +#include "neverhood/modules/module1800.h" +#include "neverhood/modules/module1900.h" +#include "neverhood/modules/module2000.h" +#include "neverhood/modules/module2100.h" +#include "neverhood/modules/module2200.h" +#include "neverhood/modules/module2300.h" +#include "neverhood/modules/module2400.h" +#include "neverhood/modules/module2500.h" +#include "neverhood/modules/module2600.h" +#include "neverhood/modules/module2700.h" +#include "neverhood/modules/module2800.h" +#include "neverhood/modules/module2900.h" +#include "neverhood/modules/module3000.h" namespace Neverhood { diff --git a/engines/neverhood/module.cpp b/engines/neverhood/module.cpp index 93b4134f6b..e384b5a4d2 100644 --- a/engines/neverhood/module.cpp +++ b/engines/neverhood/module.cpp @@ -23,8 +23,8 @@ #include "neverhood/module.h" #include "neverhood/navigationscene.h" #include "neverhood/smackerscene.h" -#include "neverhood/module1000.h" -#include "neverhood/module1500.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1500.h" namespace Neverhood { diff --git a/engines/neverhood/module.mk b/engines/neverhood/module.mk index 59effb593c..c7bfbb6460 100644 --- a/engines/neverhood/module.mk +++ b/engines/neverhood/module.mk @@ -13,27 +13,27 @@ MODULE_OBJS = \ menumodule.o \ microtiles.o \ module.o \ - module1000.o \ - module1100.o \ - module1200.o \ - module1300.o \ - module1400.o \ - module1500.o \ - module1600.o \ - module1700.o \ - module1800.o \ - module1900.o \ - module2000.o \ - module2100.o \ - module2200.o \ - module2300.o \ - module2400.o \ - module2500.o \ - module2600.o \ - module2700.o \ - module2800.o \ - module2900.o \ - module3000.o \ + modules/module1000.o \ + modules/module1100.o \ + modules/module1200.o \ + modules/module1300.o \ + modules/module1400.o \ + modules/module1500.o \ + modules/module1600.o \ + modules/module1700.o \ + modules/module1800.o \ + modules/module1900.o \ + modules/module2000.o \ + modules/module2100.o \ + modules/module2200.o \ + modules/module2300.o \ + modules/module2400.o \ + modules/module2500.o \ + modules/module2600.o \ + modules/module2700.o \ + modules/module2800.o \ + modules/module2900.o \ + modules/module3000.o \ mouse.o \ navigationscene.o \ neverhood.o \ diff --git a/engines/neverhood/module1000.cpp b/engines/neverhood/module1000.cpp deleted file mode 100644 index 096072b7b6..0000000000 --- a/engines/neverhood/module1000.cpp +++ /dev/null @@ -1,1699 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1000.h" - -namespace Neverhood { - -Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - debug("Create Module1000(%d)", which); - - _musicFileHash = getGlobalVar(V_ENTRANCE_OPEN) ? 0x81106480 : 0x00103144; - - _vm->_soundMan->addMusic(0x03294419, 0x061880C6); - _vm->_soundMan->addMusic(0x03294419, _musicFileHash); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 0) - createScene(0, 0); - else if (which == 1) - createScene(1, 1); - -} - -Module1000::~Module1000() { - _vm->_soundMan->deleteMusicGroup(0x03294419); -} - -void Module1000::createScene(int sceneNum, int which) { - debug("Module1000::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->_soundMan->startMusic(0x061880C6, 0, 0); - _childObject = new Scene1001(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->_soundMan->startMusic(0x061880C6, 0, 0); - _childObject = new Scene1002(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->startMusic(0x061880C6, 0, 0); - createStaticScene(0xC084110C, 0x41108C00); - break; - case 3: - _vm->gameState().sceneNum = 3; - _vm->_soundMan->stopMusic(0x061880C6, 0, 2); - _childObject = new Scene1004(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->stopMusic(0x061880C6, 0, 0); - _vm->_soundMan->startMusic(_musicFileHash, 0, 0); - _childObject = new Scene1005(_vm, this, which); - break; - } - SetUpdateHandler(&Module1000::updateScene); - _childObject->handleUpdate(); -} - -void Module1000::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 2) - createScene(2, 0); - else - createScene(1, 0); - break; - case 1: - if (_moduleResult == 1) - leaveModule(0); - else if (_moduleResult == 2) { - if (_vm->isDemo()) - // Demo version returns to the same scene - createScene(1, 2); - else - createScene(3, 0); - } else - createScene(0, 1); - break; - case 2: - createScene(0, 2); - break; - case 3: - if (_moduleResult == 1) - createScene(4, 0); - else - createScene(1, 2); - break; - case 4: - _vm->_soundMan->stopMusic(_musicFileHash, 0, 1); - createScene(3, 1); - break; - } - } -} - -// Scene1001 - -AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - createSurface(800, 137, 242); - _x = 726; - _y = 440; - stShowIdleDoor(); - loadSound(1, 0xED403E03); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1001Door::handleMessage); -} - -uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - hammerHitsDoor(); - break; - case 0x3002: - gotoNextState(); - break; - } - return 0; -} - -void AsScene1001Door::hammerHitsDoor() { - switch (getGlobalVar(V_DOOR_STATUS)) { - case 0: - case 1: - playSound(0, 0x65482F03); - startAnimation(0x624C0498, 1, 3); - NextState(&AsScene1001Door::stShowIdleDoor); - break; - case 2: - playSound(1); - startAnimation(0x624C0498, 6, 6); - NextState(&AsScene1001Door::stBustedDoorMove); - break; - default: - // Nothing - break; - } - incGlobalVar(V_DOOR_STATUS, 1); -} - -void AsScene1001Door::stShowIdleDoor() { - switch (getGlobalVar(V_DOOR_STATUS)) { - case 1: - startAnimation(0x624C0498, 4, -1); - _newStickFrameIndex = 4; - break; - case 2: - startAnimation(0x624C0498, 1, -1); - _newStickFrameIndex = 1; - break; - case 3: - stopAnimation(); - setVisible(false); - break; - default: - startAnimation(0x624C0498, 0, -1); - _newStickFrameIndex = 0; - break; - } -} - -void AsScene1001Door::stBustedDoorMove() { - setGlobalVar(V_DOOR_BUSTED, 1); - startAnimation(0x624C0498, 6, 6); - NextState(&AsScene1001Door::stBustedDoorGone); - _x = 30; -} - -void AsScene1001Door::stBustedDoorGone() { - playSound(0); - stopAnimation(); - setVisible(false); -} - -AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) - : AnimatedSprite(vm, 1100), _asDoor(asDoor) { - - _x = 547; - _y = 206; - createSurface(900, 177, 192); - startAnimation(0x022C90D4, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1001Hammer::handleMessage); -} - -uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x00352100) - sendMessage(_asDoor, 0x2000, 0); - else if (param.asInteger() == 0x0A1A0109) - playSound(0, 0x66410886); - break; - case 0x2000: - startAnimation(0x022C90D4, 1, -1); - playSound(0, 0xE741020A); - _newStickFrameIndex = STICK_LAST_FRAME; - break; - } - return 0; -} - -AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200) { - - _x = 320; - _y = 240; - createSurface(100, 66, 129); - startAnimation(0xC68C2299, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1001Window::handleMessage); -} - -uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x0E0A1410) - playSound(0, 0x60803F10); - break; - case 0x2001: - startAnimation(0xC68C2299, 0, -1); - break; - case 0x3002: - SetMessageHandler(NULL); - setGlobalVar(V_WINDOW_OPEN, 1); - setVisible(false); - break; - } - return 0; -} - -AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - createSurface(1010, 71, 73); - setDoDeltaX(deltaXType); - startAnimation(0x04A98C36, 0, -1); - _newStickFrameIndex = 0; - _x = x; - _y = y; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1001Lever::handleMessage); -} - -uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x00C0C444) - sendMessage(_parentScene, 0x480F, 0); - else if (param.asInteger() == 0xC41A02C0) - playSound(0, 0x40581882); - break; - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x3002: - startAnimation(0x04A98C36, 0, -1); - _newStickFrameIndex = 0; - break; - case 0x480F: - startAnimation(0x04A98C36, 0, -1); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash) - : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _countdown(0) { - - _priority = 1100; - _soundFileHash = soundFileHash ? soundFileHash : 0x44141000; - setVisible(false); - SetUpdateHandler(&SsCommonButtonSprite::update); - SetMessageHandler(&SsCommonButtonSprite::handleMessage); -} - -void SsCommonButtonSprite::update() { - if (_countdown != 0 && (--_countdown) == 0) - setVisible(false); -} - -uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x480B: - sendMessage(_parentScene, 0x480B, 0); - setVisible(true); - _countdown = 8; - playSound(0, _soundFileHash); - break; - } - return messageResult; -} - -Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _asDoor(NULL), _asWindow(NULL) { - - Sprite *tempSprite; - - SetMessageHandler(&Scene1001::handleMessage); - - setHitRects(0x004B4860); - setBackground(0x4086520E); - setPalette(0x4086520E); - insertScreenMouse(0x6520A400); - - if (which < 0) { - // Restoring game - setRectList(0x004B49F0); - insertKlaymen(200, 433); - setMessageList(0x004B4888); - } else if (which == 1) { - // Klaymen entering from the right - setRectList(0x004B49F0); - insertKlaymen(640, 433); - setMessageList(0x004B4898); - } else if (which == 2) { - // Klaymen returning from looking through the window - setRectList(0x004B49F0); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(390, 433); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen(300, 433); - } - setMessageList(0x004B4970); - } else { - // Klaymen sleeping - setRectList(0x004B4A00); - insertKlaymen(200, 433); - setMessageList(0x004B4890); - } - - tempSprite = insertStaticSprite(0x2080A3A8, 1300); - - _klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); - - if (!getGlobalVar(V_DOOR_BUSTED)) { - _asDoor = insertSprite(); - _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); - } - - _asLever = insertSprite(this, 150, 433, 1); - - insertStaticSprite(0x809861A6, 950); - insertStaticSprite(0x89C03848, 1100); - - _ssButton = insertSprite(this, 0x15288120, 100, 0); - - if (!getGlobalVar(V_WINDOW_OPEN)) { - tempSprite = insertStaticSprite(0x8C066150, 200); - _asWindow = insertSprite(); - _asWindow->setClipRect(tempSprite->getDrawRect()); - } - - _asHammer = insertSprite(_asDoor); - -} - -Scene1001::~Scene1001() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX()); -} - -uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x00342624) { - sendEntityMessage(_klaymen, 0x1014, _asLever); - setMessageList2(0x004B4910); - messageResult = 1; - } else if (param.asInteger() == 0x21E64A00) { - if (getGlobalVar(V_DOOR_BUSTED)) { - setMessageList(0x004B48A8); - } else { - setMessageList(0x004B48C8); - } - messageResult = 1; - } else if (param.asInteger() == 0x040424D0) { - sendEntityMessage(_klaymen, 0x1014, _ssButton); - } else if (param.asInteger() == 0x80006358) { - if (getGlobalVar(V_WINDOW_OPEN)) { - setMessageList(0x004B4938); - } else { - setMessageList(0x004B4960); - } - } - break; - case 0x2002: - setRectList(0x004B49F0); - break; - case 0x480B: - sendMessage(_asWindow, 0x2001, 0); - break; - case 0x480F: - sendMessage(_asHammer, 0x2000, 0); - break; - } - return messageResult; -} - -// Scene1002 - -AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isSpecial(isSpecial) { - - SetUpdateHandler(&AsScene1002Ring::update); - - if (_isSpecial) { - createSurface(990, 68, 314); - if (isRingLow) { - startAnimation(0x04103090, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); - } else { - startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); - SetMessageHandler(&AsScene1002Ring::hmRingIdle); - } - } else { - createSurface(990, 68, 138); - startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); - SetMessageHandler(&AsScene1002Ring::hmRingIdle); - } - - setClipRect(0, clipY1, 640, 480); - - _x = x; - _y = y; - - setDoDeltaX(_vm->_rnd->getRandomNumber(1)); - -} - -void AsScene1002Ring::update() { - updateAnim(); - updatePosition(); -} - -uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4806: - setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - sendMessage(_parentScene, 0x4806, 0); - SetMessageHandler(&AsScene1002Ring::hmRingPulled1); - startAnimation(_isSpecial ? 0x87502558 : 0x80DD4010, 0, -1); - break; - case 0x480F: - setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - sendMessage(_parentScene, 0x480F, 0); - SetMessageHandler(&AsScene1002Ring::hmRingPulled2); - startAnimation(0x861A2020, 0, -1); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - startAnimation(_isSpecial ? 0x78D0A812 : 0xB85D2A10, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); - break; - case 0x4807: - sendMessage(_parentScene, 0x4807, 0); - setDoDeltaX(_vm->_rnd->getRandomNumber(1)); - startAnimation(0x8258A030, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingReleased); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - startAnimation(0x04103090, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4807: - sendMessage(_parentScene, 0x4807, 0); - setDoDeltaX(_vm->_rnd->getRandomNumber(1)); - startAnimation(0x8258A030, 0, -1); - SetMessageHandler(&AsScene1002Ring::hmRingReleased); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmRingIdle(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x05410F72) - playSound(0, 0x21EE40A9); - break; - case 0x3002: - startAnimation(0xA85C4011, 0, -1); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) - : StaticSprite(vm, 1200) { - - loadSprite(0x1052370F, kSLFDefDrawOffset | kSLFSetPosition, 800, 526, getGlobalVar(V_FLYTRAP_RING_DOOR) ? 49 : 239); - setClipRect(clipRect); - SetUpdateHandler(&AsScene1002Door::update); - SetMessageHandler(&AsScene1002Door::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene1002Door::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4808: - setGlobalVar(V_FLYTRAP_RING_DOOR, 1); - SetSpriteUpdate(&AsScene1002Door::suOpenDoor); - break; - case 0x4809: - setGlobalVar(V_FLYTRAP_RING_DOOR, 0); - SetSpriteUpdate(&AsScene1002Door::suCloseDoor); - break; - } - return messageResult; -} - -void AsScene1002Door::suOpenDoor() { - if (_y > 49) { - _y -= 8; - if (_y < 49) { - SetSpriteUpdate(NULL); - _y = 49; - } - _needRefresh = true; - } -} - -void AsScene1002Door::suCloseDoor() { - if (_y < 239) { - _y += 8; - if (_y > 239) { - SetSpriteUpdate(NULL); - _y = 239; - } - _needRefresh = true; - } -} - -AsScene1002BoxingGloveHitEffect::AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1400) { - - createSurface(1025, 88, 165); - setVisible(false); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1002BoxingGloveHitEffect::handleMessage); -} - -uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2004: - _x = ((Sprite*)sender)->getX() - 98; - _y = ((Sprite*)sender)->getY() - 111; - startAnimation(0x0422255A, 0, -1); - setVisible(true); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect) - : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) { - - createSurface(800, 136, 147); - setClipRect(clipRect); - suDoorSpy(); - loadSound(0, 0xC0C40298); - startAnimation(0x586C1D48, 0, 0); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1002DoorSpy::handleMessage); - SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy); -} - -uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xA61CA1C2) - sendMessage(_asBoxingGloveHitEffect, 0x2004, 0); - else if (param.asInteger() == 0x14CE0620) - playSound(0); - break; - case 0x2003: - stDoorSpyBoxingGlove(); - break; - } - return messageResult; -} - -uint32 AsScene1002DoorSpy::hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1002DoorSpy::suDoorSpy() { - _x = _asDoor->getX() + 34; - _y = _asDoor->getY() + 175; -} - -void AsScene1002DoorSpy::stDoorSpyIdle() { - setClipRect(_clipRect); - _parentScene->setSurfacePriority(getSurface(), 800); - startAnimation(0x586C1D48, 0, 0); - SetMessageHandler(&AsScene1002DoorSpy::handleMessage); -} - -void AsScene1002DoorSpy::stDoorSpyBoxingGlove() { - setClipRect(0, 0, 640, 480); - _parentScene->setSurfacePriority(getSurface(), 1200); - startAnimation(0x586C1D48, 1, -1); - SetMessageHandler(&AsScene1002DoorSpy::hmDoorSpyAnimation); - NextState(&AsScene1002DoorSpy::stDoorSpyIdle); -} - -SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) - : StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) { - - _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; - _fileHashes[0] = fileHash1; - _fileHashes[1] = fileHash2; - createSurface(surfacePriority, 40, 40); - loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition); - setVisible(false); - SetUpdateHandler(&SsCommonPressButton::update); - SetMessageHandler(&SsCommonPressButton::handleMessage); -} - -void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { - _fileHashes[0] = fileHash1; - _fileHashes[1] = fileHash2; - loadSprite(_status == 2 ? fileHash2 : fileHash1, kSLFDefDrawOffset | kSLFDefPosition); -} - -void SsCommonPressButton::update() { - if (_countdown != 0 && (--_countdown) == 0) { - if (_status == 1) { - _status = 2; - loadSprite(_fileHashes[1], kSLFDefDrawOffset | kSLFDefPosition); - _countdown = 4; - } else if (_status == 2) { - _status = 3; - loadSprite(_fileHashes[0], kSLFDefDrawOffset | kSLFDefPosition); - _countdown = 4; - } else if (_status == 3) { - _status = 0; - setVisible(false); - } - } -} - -uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x480B: - sendMessage(_parentScene, 0x480B, 0); - _status = 1; - _countdown = 4; - setVisible(true); - playSound(0, _soundFileHash); - break; - } - return messageResult; -} - -AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _isSecond(isSecond), _countdown(0) { - - createSurface(995, 175, 195); - if (!_isSecond) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { - setDoDeltaX(1); - _x = 366; - _y = 435; - stRingGrabbed(); - } else { - _x = 174 + getGlobalVar(V_FLYTRAP_POSITION_1) * 32; - _y = 435; - stIdle(); - } - } else { - _x = 186 + getGlobalVar(V_FLYTRAP_POSITION_2) * 32; - _y = 364; - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) { - stRingGrabbed(); - } else { - stIdle(); - } - } - _flags = 4; - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -void AsScene1002VenusFlyTrap::update() { - if (_countdown != 0 && (--_countdown == 0)) - gotoNextState(); - AnimatedSprite::update(); -} - -void AsScene1002VenusFlyTrap::upIdle() { - if (_countdown == 0 && _klaymen->getX() - 20 > _x) - setDoDeltaX(1); - else if (_klaymen->getX() + 20 < _x) - setDoDeltaX(0); - update(); -} - -uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x000890C4) - playSound(0, 0xC21190D8); - else if (param.asInteger() == 0x522200A0) - playSound(0, 0x931080C8); - break; - case 0x1011: - if (_isSecond) { - if (_x >= 154 && _x <= 346) { - sendMessage(_parentScene, 0x2000, 0); - messageResult = 1; - } - } else { - if (_x >= 174 && _x <= 430) { - sendMessage(_parentScene, 0x2000, 0); - messageResult = 1; - } - } - break; - case 0x480B: - setDoDeltaX(param.asInteger() != 0 ? 1 : 0); - if (!_isSecond) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) - stRelease(); - else - stWalk(); - } else { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) - stRelease(); - else - stWalk(); - } - break; - case 0x480C: - if (_isSecond) { - if (_x >= 154 && _x <= 346) - messageResult = 1; - else - messageResult = 0; - } else { - if (_x >= 174 && _x <= 430) - messageResult = 1; - else - messageResult = 0; - } - break; - case 0x480E: - if (param.asInteger() == 1) - stGrabRing(); - break; - case 0x4810: - swallowKlaymen(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 995); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1015); - break; - } - return messageResult; -} - -uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x000890C4) - playSound(0, 0xC21190D8); - else if (param.asInteger() == 0x41881801) { - if (_isSecond) { - if (_x > 330) - sendMessage(_klaymen, 0x4811, 2); - else - sendMessage(_klaymen, 0x4811, 0); - } else { - sendMessage(_klaymen, 0x4811, 0); - } - } else if (param.asInteger() == 0x522200A0) - playSound(0, 0x931080C8); - break; - case 0x3002: - gotoNextState(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 995); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1015); - break; - } - return messageResult; -} - -void AsScene1002VenusFlyTrap::stWalkBack() { - setDoDeltaX(2); - startAnimation(0xC4080034, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); - NextState(&AsScene1002VenusFlyTrap::stIdle); -} - -void AsScene1002VenusFlyTrap::stWalk() { - startAnimation(0xC4080034, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); - NextState(&AsScene1002VenusFlyTrap::stIdle); -} - -void AsScene1002VenusFlyTrap::stRelease() { - sendMessage(_parentScene, 0x4807, 0); - startAnimation(0x82292851, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); - NextState(&AsScene1002VenusFlyTrap::stIdle); -} - -void AsScene1002VenusFlyTrap::stGrabRing() { - setDoDeltaX(1); - startAnimation(0x86A82A11, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); - NextState(&AsScene1002VenusFlyTrap::stRingGrabbed); -} - -void AsScene1002VenusFlyTrap::stRingGrabbed() { - startAnimation(0xB5A86034, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); -} - -void AsScene1002VenusFlyTrap::stKlaymenInside() { - startAnimation(0x31303094, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(NULL); - NextState(&AsScene1002VenusFlyTrap::stKlaymenInsideMoving); - _countdown = 24; -} - -void AsScene1002VenusFlyTrap::stIdle() { - startAnimation(0xC8204250, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle); - SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); - if (_isSecond) { - if (_x >= 154 && _x <= 346) - setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32); - else { - NextState(&AsScene1002VenusFlyTrap::stWalkBack); - _countdown = 12; - } - } else { - if (_x >= 174 && _x <= 430) - setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32); - else { - NextState(&AsScene1002VenusFlyTrap::stWalkBack); - _countdown = 12; - } - } -} - -void AsScene1002VenusFlyTrap::stKlaymenInsideMoving() { - startAnimation(0x152920C4, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); - NextState(&AsScene1002VenusFlyTrap::stSpitOutKlaymen); -} - -void AsScene1002VenusFlyTrap::stSpitOutKlaymen() { - startAnimation(0x84001117, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); - NextState(&AsScene1002VenusFlyTrap::stIdle); -} - -void AsScene1002VenusFlyTrap::swallowKlaymen() { - if (_x - 15 < _klaymen->getX() && _x + 15 > _klaymen->getX()) { - if (_isSecond) - setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); - else - setDoDeltaX(_x > 320 ? 1 : 0); - sendMessage(_klaymen, 0x2001, 0); - startAnimation(0x8C2C80D4, 0, -1); - SetUpdateHandler(&AsScene1002VenusFlyTrap::update); - SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); - NextState(&AsScene1002VenusFlyTrap::stKlaymenInside); - } -} - -AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _countdown(0) { - - createSurface(850, 186, 212); - _x = 320; - _y = 240; - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { - startAnimation(0x004A4495, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } else - setVisible(false); - SetUpdateHandler(&AsScene1002OutsideDoorBackground::update); - SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); -} - -void AsScene1002OutsideDoorBackground::update() { - if (_countdown != 0 && (--_countdown == 0)) { - if (_isDoorClosed) - stCloseDoor(); - else - stOpenDoor(); - } - AnimatedSprite::update(); -} - -uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageResult) { - case 0x4808: - _isDoorClosed = false; - _countdown = 2; - break; - case 0x4809: - _isDoorClosed = true; - _countdown = 2; - break; - } - return messageResult; -} - -uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage(messageNum, param, sender); - switch (messageResult) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1002OutsideDoorBackground::stOpenDoor() { - startAnimation(0x004A4495, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - setVisible(true); - SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); -} - -void AsScene1002OutsideDoorBackground::stCloseDoor() { - startAnimation(0x004A4495, -1, -1); - _playBackwards = true; - setVisible(true); - SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation); - NextState(&AsScene1002OutsideDoorBackground::stDoorClosed); -} - -void AsScene1002OutsideDoorBackground::stDoorClosed() { - setVisible(false); - stopAnimation(); -} - -AsScene1002KlaymenLadderHands::AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen) - : AnimatedSprite(vm, 1200), _klaymen(klaymen) { - - createSurface(1200, 40, 163); - setVisible(false); - SetUpdateHandler(&AsScene1002KlaymenLadderHands::update); - SetMessageHandler(&Sprite::handleMessage); -} - -void AsScene1002KlaymenLadderHands::update() { - if (_klaymen->getCurrAnimFileHash() == 0x3A292504) { - startAnimation(0xBA280522, _klaymen->getFrameIndex(), -1); - _newStickFrameIndex = _klaymen->getFrameIndex(); - setVisible(true); - _x = _klaymen->getX(); - _y = _klaymen->getY(); - setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); - } else if (_klaymen->getCurrAnimFileHash() == 0x122D1505) { - startAnimation(0x1319150C, _klaymen->getFrameIndex(), -1); - _newStickFrameIndex = _klaymen->getFrameIndex(); - setVisible(true); - _x = _klaymen->getX(); - _y = _klaymen->getY(); - setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); - } else - setVisible(false); - AnimatedSprite::update(); -} - -AsScene1002KlaymenPeekHand::AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen) - : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klaymen(klaymen), - _isClipRectSaved(false) { - - createSurface(1000, 33, 41); - setVisible(false); - SetUpdateHandler(&AsScene1002KlaymenPeekHand::update); - SetMessageHandler(&AsScene1002KlaymenPeekHand::handleMessage); -} - -void AsScene1002KlaymenPeekHand::update() { - if (_klaymen->getCurrAnimFileHash() == 0xAC20C012 && _klaymen->getFrameIndex() < 50) { - startAnimation(0x9820C913, _klaymen->getFrameIndex(), -1); - _newStickFrameIndex = _klaymen->getFrameIndex(); - setVisible(true); - _x = _klaymen->getX(); - _y = _klaymen->getY(); - setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); - } else - setVisible(false); - AnimatedSprite::update(); -} - -uint32 AsScene1002KlaymenPeekHand::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4AB28209) { - sendMessage(_parentScene, 0x1022, 1200); - _isClipRectSaved = true; - _savedClipRect = _surface->getClipRect(); - setClipRect(0, 0, 640, 480); - } else if (param.asInteger() == 0x88001184) { - sendMessage(_parentScene, 0x1022, 1000); - if (_isClipRectSaved) - setClipRect(_savedClipRect); - } - break; - } - return messageResult; -} - -Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isKlaymenFloor(false), _isClimbingLadder(false) { - - NRect tempClipRect; - Sprite *tempSprite; - - SetUpdateHandler(&Scene1002::update); - SetMessageHandler(&Scene1002::handleMessage); - - setHitRects(0x004B4138); - setBackground(0x12C23307); - setPalette(0x12C23307); - - insertStaticSprite(0x06149428, 1100); - insertStaticSprite(0x312C8774, 1100); - - _ssLadderArch = insertStaticSprite(0x152C1313, 1015); - _ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200); - _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); - _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); - - _ssCeiling = insertStaticSprite(0x316C4BB4, 1015); - - if (which < 0) { - // Restoring game - if (_vm->_gameState.which == 0) { - // Klaymen on top - insertKlaymen(90, 226); - _asKlaymenLadderHands = insertSprite(_klaymen); - setMessageList(0x004B4270); - _klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); - _asKlaymenLadderHands->getSurface()->getClipRect() = _klaymen->getSurface()->getClipRect(); - _klaymen->setRepl(64, 0); - } else { - // Klaymen on the floor - insertKlaymen(379, 435); - _asKlaymenLadderHands = insertSprite(_klaymen); - setMessageList(0x004B4270); - _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); - } - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(650, 435); - _asKlaymenLadderHands = insertSprite(_klaymen); - setMessageList(0x004B4478); - _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); - _vm->_gameState.which = 1; - } else if (which == 2) { - // Klaymen coming up the ladder - insertKlaymen(68, 645); - _asKlaymenLadderHands = insertSprite(_klaymen); - setMessageList(0x004B4298); - _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); - _vm->_gameState.which = 1; - sendMessage(_klaymen, 0x4820, 0); - } else { - // Klaymen entering from the left, peeking - insertKlaymen(90, 226); - _asKlaymenLadderHands = insertSprite(_klaymen); - setMessageList(0x004B4470); - _klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); - _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); - _asKlaymenPeekHand = insertSprite(this, _klaymen); - _asKlaymenPeekHand->setClipRect(_klaymen->getClipRect()); - _klaymen->setRepl(64, 0); - _vm->_gameState.which = 0; - } - - insertScreenMouse(0x23303124); - - tempSprite = insertStaticSprite(0xB3242310, 825); - tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, - _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2()); - - _asRing1 = insertSprite(this, false, 258, 191, _ssCeiling->getDrawRect().y, false); - _asRing2 = insertSprite(this, false, 297, 189, _ssCeiling->getDrawRect().y, false); - _asRing3 = insertSprite(this, true, 370, 201, _ssCeiling->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR)); - _asRing4 = insertSprite(this, false, 334, 191, _ssCeiling->getDrawRect().y, false); - _asRing5 = insertSprite(this, false, 425, 184, _ssCeiling->getDrawRect().y, false); - - _asDoor = insertSprite(tempClipRect); - tempSprite = insertSprite(); - _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); - _ssPressButton = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); - _asVenusFlyTrap = insertSprite(this, _klaymen, false); - addCollisionSprite(_asVenusFlyTrap); - - sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap); - - _asOutsideDoorBackground = insertSprite(); - - setRectList(0x004B43A0); - - loadSound(1, 0x60755842); - loadSound(2, 0x616D5821); - -} - -Scene1002::~Scene1002() { -} - -void Scene1002::update() { - Scene::update(); - if (!_isKlaymenFloor && _klaymen->getY() > 230) { - _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); - _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); - deleteSprite(&_ssLadderArchPart3); - _klaymen->clearRepl(); - _isKlaymenFloor = true; - _vm->_gameState.which = 1; - } -} - -uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xE6EE60E1) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) - setMessageList(0x004B4428); - else - setMessageList(0x004B4448); - messageResult = 1; - } else if (param.asInteger() == 0x4A845A00) - sendEntityMessage(_klaymen, 0x1014, _asRing1); - else if (param.asInteger() == 0x43807801) - sendEntityMessage(_klaymen, 0x1014, _asRing2); - else if (param.asInteger() == 0x46C26A01) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { - setMessageList(0x004B44B8); - } else { - sendEntityMessage(_klaymen, 0x1014, _asRing3); - if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) { - setGlobalVar(V_FLYTRAP_RING_EATEN, 1); - setMessageList(0x004B44A8); - } else { - setMessageList(0x004B44A0); - } - } - messageResult = 1; - } else if (param.asInteger() == 0x468C7B11) - sendEntityMessage(_klaymen, 0x1014, _asRing4); - else if (param.asInteger() == 0x42845B19) - sendEntityMessage(_klaymen, 0x1014, _asRing5); - else if (param.asInteger() == 0xC0A07458) - sendEntityMessage(_klaymen, 0x1014, _ssPressButton); - break; - case 0x1024: - sendMessage(_parentModule, 0x1024, param.asInteger()); - break; - case 0x2000: - if (_isClimbingLadder) { - setMessageList2(0x004B43D0); - } else { - if (_klaymen->getY() > 420) { - sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap); - setMessageList2(0x004B4480); - } else if (_klaymen->getY() > 227) { - setMessageList2(0x004B41E0); - } else { - setMessageList2(0x004B4148); - } - } - break; - case 0x2002: - _messageList = NULL; - break; - case 0x2005: - _isClimbingLadder = true; - setRectList(0x004B4418); - break; - case 0x2006: - _isClimbingLadder = false; - setRectList(0x004B43A0); - break; - case 0x4806: - if (sender == _asRing1) { - setGlobalVar(V_RADIO_ENABLED, 0); - playSound(0, 0x665198C0); - } else if (sender == _asRing2) { - setGlobalVar(V_RADIO_ENABLED, 0); - playSound(0, 0xE2D389C0); - } else if (sender == _asRing3) { - setGlobalVar(V_RADIO_ENABLED, 0); - playSound(1); - sendMessage(_asDoor, 0x4808, 0); - sendMessage(_asOutsideDoorBackground, 0x4808, 0); - } else if (sender == _asRing4) { - setGlobalVar(V_RADIO_ENABLED, 0); - playSound(0, 0xE0558848); - } else if (sender == _asRing5) { - setGlobalVar(V_RADIO_ENABLED, 1); - playSound(0, 0x44014282); - } - break; - case 0x4807: - if (sender == _asRing3) { - playSound(2); - sendMessage(_asDoor, 0x4809, 0); - sendMessage(_asOutsideDoorBackground, 0x4809, 0); - } else if (sender == _asVenusFlyTrap) { - if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { - sendMessage(_asRing3, 0x4807, 0); - } - } - break; - case 0x480B: - sendEntityMessage(_klaymen, 0x1014, _asDoorSpy); - break; - case 0x480F: - setGlobalVar(V_RADIO_ENABLED, 0); - playSound(1); - sendMessage(_asDoor, 0x4808, 0); - sendMessage(_asOutsideDoorBackground, 0x4808, 0); - break; - case 0x8000: - setSpriteSurfacePriority(_ssCeiling, 995); - setSpriteSurfacePriority(_ssLadderArch, 995); - break; - case 0x8001: - setSpriteSurfacePriority(_ssCeiling, 1015); - setSpriteSurfacePriority(_ssLadderArch, 1015); - break; - } - return messageResult; -} - -// StaticScene - -StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) - : Scene(vm, parentModule) { - - SetMessageHandler(&StaticScene::handleMessage); - - setBackground(backgroundFileHash); - setPalette(backgroundFileHash); - insertPuzzleMouse(cursorFileHash, 20, 620); -} - -uint32 StaticScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - } - return 0; -} - -// Scene1004 - -AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - _x = 330; - _y = 327; - createSurface(800, 56, 50); - setVisible(false); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1004TrashCan::handleMessage); -} - -uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x225A8587) - playSound(0, 0x109AFC4C); - break; - case 0x2002: - startAnimation(0xEB312C11, 0, -1); - setVisible(true); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return 0; -} - -Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _paletteAreaStatus(-1) { - - Sprite *tempSprite; - - SetUpdateHandler(&Scene1004::update); - SetMessageHandler(&Scene1004::handleMessage); - - setBackground(0x50C03005); - - if (getGlobalVar(V_ENTRANCE_OPEN)) { - setPalette(0xA30BA329); - _palette->addBasePalette(0xA30BA329, 0, 256, 0); - } else { - setPalette(0x50C03005); - _palette->addBasePalette(0x50C03005, 0, 256, 0); - } - addEntity(_palette); - - insertScreenMouse(0x03001504); - - if (which < 0) { - // Restoring game - setRectList(0x004B7C70); - insertKlaymen(330, 327); - setMessageList(0x004B7C18); - } else if (which == 1) { - // Klaymen returning from reading a note - setRectList(0x004B7C70); - insertKlaymen(330, 327); - setMessageList(0x004B7C08); - } else { - // Klaymen coming down the ladder - loadDataResource(0x01900A04); - insertKlaymen(_dataResource.getPoint(0x80052A29).x, 27); - setMessageList(0x004B7BF0); - } - - updatePaletteArea(); - - _asKlaymenLadderHands = insertSprite(_klaymen); - - insertStaticSprite(0x800034A0, 1100); - insertStaticSprite(0x64402020, 1100); - insertStaticSprite(0x3060222E, 1300); - tempSprite = insertStaticSprite(0x0E002004, 1300); - - _klaymen->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); - _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); - - _asTrashCan = insertSprite(); - -} - -void Scene1004::update() { - Scene::update(); - updatePaletteArea(); -} - -uint32 Scene1004::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x926500A1) { - setMessageList(0x004B7C20); - messageResult = 1; - } - break; - case 0x2000: - loadDataResource(0x01900A04); - break; - case 0x2001: - setRectList(0x004B7C70); - break; - case 0x2002: - sendMessage(_asTrashCan, 0x2002, 0); - break; - } - return messageResult; -} - -void Scene1004::updatePaletteArea() { - if (_klaymen->getY() < 150) { - if (_paletteAreaStatus != 0) { - _paletteAreaStatus = 0; - _palette->addBasePalette(0x406B0D10, 0, 64, 0); - _palette->startFadeToPalette(12); - } - } else { - if (_paletteAreaStatus != 1) { - _paletteAreaStatus = 1; - _palette->addBasePalette(0x24332243, 0, 64, 0); - _palette->startFadeToPalette(12); - } - } -} - -// Scene1005 - -Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene1005::handleMessage); - - if (getGlobalVar(V_ENTRANCE_OPEN)) { - setBackground(0x2800E011); - setPalette(0x2800E011); - insertStaticSprite(0x492D5AD7, 100); - insertPuzzleMouse(0x0E015288, 20, 620); - } else { - setBackground(0x8870A546); - setPalette(0x8870A546); - insertStaticSprite(0x40D1E0A9, 100); - insertStaticSprite(0x149C00A6, 100); - insertPuzzleMouse(0x0A54288F, 20, 620); - } - - drawTextToBackground(); - -} - -uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - } - return 0; -} - -void Scene1005::drawTextToBackground() { - TextResource textResource(_vm); - const char *textStart, *textEnd; - int16 y = 36; - uint32 textIndex = getTextIndex(); - FontSurface *fontSurface = FontSurface::createFontSurface(_vm, getGlobalVar(V_ENTRANCE_OPEN) ? 0x283CE401 : 0xC6604282); - textResource.load(0x80283101); - textStart = textResource.getString(textIndex, textEnd); - while (textStart < textEnd) { - fontSurface->drawString(_background->getSurface(), 188, y, (const byte*)textStart); - y += 36; - textStart += strlen(textStart) + 1; - } - delete fontSurface; -} - -uint32 Scene1005::getTextIndex() { - uint32 textIndex; - textIndex = getTextIndex1(); - if (getGlobalVar(V_ENTRANCE_OPEN)) { - textIndex = getTextIndex2(); - } - if (getGlobalVar(V_TEXT_FLAG1) && getGlobalVar(V_TEXT_INDEX) == textIndex) { - textIndex = getTextIndex3(); - } else { - setGlobalVar(V_TEXT_FLAG1, 1); - setGlobalVar(V_TEXT_INDEX, textIndex); - } - return textIndex; -} - -uint32 Scene1005::getTextIndex1() { - uint32 textIndex; - if (getGlobalVar(V_WORLDS_JOINED)) { - if (!getGlobalVar(V_DOOR_PASSED)) - textIndex = 18; - else if (!getGlobalVar(V_ROBOT_TARGET)) - textIndex = 19; - else if (getGlobalVar(V_ROBOT_HIT)) { - if (!getGlobalVar(V_ENTRANCE_OPEN)) - textIndex = 23; - else if (!getSubVar(VA_HAS_KEY, 0) && !getSubVar(VA_IS_KEY_INSERTED, 0)) - textIndex = 24; - else if (!getGlobalVar(V_HAS_FINAL_KEY)) - textIndex = 26; - else if (!getSubVar(VA_HAS_KEY, 1) && !getSubVar(VA_IS_KEY_INSERTED, 1)) - textIndex = 27; - else if (!getGlobalVar(V_HAS_FINAL_KEY)) - textIndex = 28; - else - textIndex = 29; - } else if (!getGlobalVar(V_FELL_DOWN_HOLE)) - textIndex = 20; - else if (!getGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT)) - textIndex = 21; - else - textIndex = 22; - } else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { - if (!getGlobalVar(V_WALL_BROKEN)) - textIndex = 12; - else if (!getGlobalVar(V_STAIRS_DOWN_ONCE)) - textIndex = 13; - else if (!getGlobalVar(V_RADIO_ENABLED)) - textIndex = 50; - else if (!getGlobalVar(V_UNUSED)) - textIndex = 14; - else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM)) - textIndex = 15; - else if (!getGlobalVar(V_BEEN_STATUE_ROOM)) - textIndex = 16; - else - textIndex = 17; - } else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) { - textIndex = 0; - } else if (getGlobalVar(V_CREATURE_EXPLODED)) { - if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) - textIndex = 4; - else if (!getGlobalVar(V_HAS_TEST_TUBE)) - textIndex = 5; - else if (!getSubVar(VA_LOCKS_DISABLED, 0x40119852)) - textIndex = 6; - else if (!getGlobalVar(V_WATER_RUNNING)) - textIndex = 7; - else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED)) - textIndex = 8; - else if (!getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) - textIndex = 9; - else if (!getSubVar(VA_LOCKS_DISABLED, 0x01180951)) - textIndex = 10; - else - textIndex = 11; - } else if (!getGlobalVar(V_CREATURE_ANGRY)) { - textIndex = 1; - } else if (getGlobalVar(V_TNT_DUMMY_BUILT)) { - textIndex = 3; - } else { - textIndex = 2; - } - return textIndex; -} - -uint32 Scene1005::getTextIndex2() { - uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX1); - if (textIndex + 1 >= 10) { - setGlobalVar(V_TEXT_COUNTING_INDEX1, 0); - textIndex = 0; - } else { - setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1); - } - return textIndex + 40; -} - -uint32 Scene1005::getTextIndex3() { - uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX2); - if (textIndex + 1 >= 10) { - setGlobalVar(V_TEXT_COUNTING_INDEX2, 0); - textIndex = 0; - } else { - setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1); - } - return textIndex + 30; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1000.h b/engines/neverhood/module1000.h deleted file mode 100644 index 897d026470..0000000000 --- a/engines/neverhood/module1000.h +++ /dev/null @@ -1,300 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1000_H -#define NEVERHOOD_MODULE1000_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module1000 - -class Module1000 : public Module { -public: - Module1000(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1000(); -protected: - int _sceneNum; - uint32 _musicFileHash; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene1001 - -class AsScene1001Door : public AnimatedSprite { -public: - AsScene1001Door(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void hammerHitsDoor(); - void stShowIdleDoor(); - void stBustedDoorMove(); - void stBustedDoorGone(); -}; - -class AsScene1001Hammer : public AnimatedSprite { -public: - AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor); -protected: - Sprite *_asDoor; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1001Window : public AnimatedSprite { -public: - AsScene1001Window(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1001Lever : public AnimatedSprite { -public: - AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsCommonButtonSprite : public StaticSprite { -public: - SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash); -protected: - Scene *_parentScene; - uint32 _soundFileHash; - int16 _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1001 : public Scene { -public: - Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene1001(); -protected: - Sprite *_asHammer; - Sprite *_asDoor; - Sprite *_asWindow; - Sprite *_asLever; - Sprite *_ssButton; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// TODO: Move this to some common file since it's used several times - -class StaticScene : public Scene { -public: - StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1002 - -class AsScene1002Ring : public AnimatedSprite { -public: - AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow); -protected: - Scene *_parentScene; - bool _isSpecial; - void update(); - uint32 hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRingPulled2(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRingHangingLow(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRingReleased(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1002Door : public StaticSprite { -public: - AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect); -protected: - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suOpenDoor(); - void suCloseDoor(); -}; - -class AsScene1002BoxingGloveHitEffect : public AnimatedSprite { -public: - AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1002DoorSpy : public AnimatedSprite { -public: - AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect); -protected: - Scene *_parentScene; - Sprite *_asDoor; - Sprite *_asBoxingGloveHitEffect; - NRect _clipRect; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - void suDoorSpy(); - void stDoorSpyIdle(); - void stDoorSpyBoxingGlove(); -}; - -class SsCommonPressButton : public StaticSprite { -public: - SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); - void setFileHashes(uint32 fileHash1, uint32 fileHash2); -protected: - Scene *_parentScene; - uint32 _soundFileHash; - uint32 _fileHashes[2]; - int _status; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1002VenusFlyTrap : public AnimatedSprite { -public: - AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond); -protected: - Scene *_parentScene; - Sprite *_klaymen; - int _countdown; - bool _isSecond; - void update(); - void upIdle(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmAnimationSimple(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmAnimationExt(int messageNum, const MessageParam ¶m, Entity *sender); - void stWalkBack(); - void stWalk(); - void stRelease(); - void stGrabRing(); - void stRingGrabbed(); - void stKlaymenInside(); - void stIdle(); - void stKlaymenInsideMoving(); - void stSpitOutKlaymen(); - void swallowKlaymen(); -}; - -class AsScene1002OutsideDoorBackground : public AnimatedSprite { -public: - AsScene1002OutsideDoorBackground(NeverhoodEngine *vm); -protected: - int _countdown; - bool _isDoorClosed; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stCloseDoor(); - void stDoorClosed(); -}; - -class AsScene1002KlaymenLadderHands : public AnimatedSprite { -public: - AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen); -protected: - Klaymen *_klaymen; - void update(); -}; - -class AsScene1002KlaymenPeekHand : public AnimatedSprite { -public: - AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen); -protected: - Scene *_parentScene; - Klaymen *_klaymen; - bool _isClipRectSaved; - NRect _savedClipRect; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1002 : public Scene { -public: - Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene1002(); -protected: - Sprite *_asRing1; - Sprite *_asRing2; - Sprite *_asRing3; - Sprite *_asRing4; - Sprite *_asRing5; - Sprite *_asDoor; - Sprite *_asDoorSpy; - Sprite *_asVenusFlyTrap; - Sprite *_ssLadderArch; - Sprite *_ssLadderArchPart1; - Sprite *_ssLadderArchPart2; - Sprite *_ssLadderArchPart3; - Sprite *_ssCeiling; - Sprite *_asKlaymenLadderHands; - Sprite *_asKlaymenPeekHand; - Sprite *_asOutsideDoorBackground; - Sprite *_ssPressButton; - bool _isKlaymenFloor; - bool _isClimbingLadder; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1004 - -class AsScene1004TrashCan : public AnimatedSprite { -public: - AsScene1004TrashCan(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1004 : public Scene { -public: - Scene1004(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_asKlaymenLadderHands; - Sprite *_asTrashCan; - int _paletteAreaStatus; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void updatePaletteArea(); -}; - -// Scene1005 - -class Scene1005 : public Scene { -public: - Scene1005(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void drawTextToBackground(); - uint32 getTextIndex(); - uint32 getTextIndex1(); - uint32 getTextIndex2(); - uint32 getTextIndex3(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1000_H */ diff --git a/engines/neverhood/module1100.cpp b/engines/neverhood/module1100.cpp deleted file mode 100644 index 067018dea0..0000000000 --- a/engines/neverhood/module1100.cpp +++ /dev/null @@ -1,707 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1100.h" -#include "neverhood/gamemodule.h" -#include "neverhood/navigationscene.h" - -namespace Neverhood { - -static const uint32 kModule1100SoundList[] = { - 0x90805C50, - 0xB288D450, - 0x98C05840, - 0x98A01500, - 0xB4005E50, - 0x92025040, - 0x90035066, - 0x74E01054, - 0 -}; - -Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - if (which < 0) { - createScene(_vm->gameState().sceneNum, -1); - } else if (which == 1) { - createScene(8, 1); - } else { - createScene(8, 3); - } - - _vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList); - _vm->_soundMan->setSoundListParams(kModule1100SoundList, true, 50, 600, 20, 250); - _vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20); - _vm->_soundMan->setSoundVolume(0x74E01054, 60); - _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); - -} - -Module1100::~Module1100() { - _vm->_soundMan->deleteGroup(0x0002C818); -} - -void Module1100::createScene(int sceneNum, int which) { - static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0}; - static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0}; - debug("Module1100::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _countdown = 65; - createNavigationScene(0x004B8430, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _countdown = 50; - createNavigationScene(0x004B8460, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - if (getGlobalVar(V_ROBOT_TARGET)) { - createNavigationScene(0x004B84F0, which); - } else { - createNavigationScene(0x004B8490, which); - } - break; - case 3: - _vm->gameState().sceneNum = 3; - if (getGlobalVar(V_ROBOT_TARGET)) { - createNavigationScene(0x004B8580, which); - } else { - createNavigationScene(0x004B8550, which); - } - break; - case 4: - _vm->gameState().sceneNum = 4; - _childObject = new Scene1105(_vm, this); - break; - case 5: - _vm->gameState().sceneNum = 5; - if (getGlobalVar(V_ROBOT_TARGET)) - createSmackerScene(0x04180001, true, false, false); - else - createSmackerScene(0x04180007, true, false, false); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->_soundMan->deleteSoundGroup(0x0002C818); - createSmackerScene(kSmackerFileHashList06, true, true, false); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); - createSmackerScene(kSmackerFileHashList07, true, true, false); - break; - case 8: - _vm->gameState().sceneNum = 8; - _childObject = new Scene1109(_vm, this, which); - break; - case 1002: - _vm->gameState().sceneNum = 2; - _countdown = 40; - _vm->_soundMan->setTwoSoundsPlayFlag(true); - createSmackerScene(0x00012211, true, true, false); - break; - } - SetUpdateHandler(&Module1100::updateScene); - _childObject->handleUpdate(); -} - -void Module1100::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - _countdown = 0; - _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 65); - _vm->_soundMan->setSoundVolume(0x50399F64, 65); - if (_moduleResult == 0) - createScene(1, 0); - else if (_moduleResult == 1) - createScene(8, 0); - break; - case 1: - _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); - if (getGlobalVar(V_ROBOT_HIT)) { - if (_moduleResult == 0) - createScene(6, -1); - else if (_moduleResult == 1) - createScene(0, 1); - } else { - if (_moduleResult == 0) - createScene(2, 0); - else if (_moduleResult == 1) - createScene(0, 1); - } - break; - case 2: - _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); - if (_navigationAreaType == 3) - createScene(7, -1); - else if (_moduleResult == 1) - createScene(3, 0); - else if (_moduleResult == 2) - createScene(1002, -1); - break; - case 3: - if (_moduleResult == 0) - createScene(4, 0); - else if (_moduleResult == 1) - createScene(2, 3); - break; - case 4: - if (_moduleResult == 0) - createScene(3, 0); - else if (_moduleResult == 1) - createScene(5, -1); - break; - case 5: - _vm->_soundMan->setTwoSoundsPlayFlag(false); - if (getGlobalVar(V_ROBOT_TARGET)) - createScene(3, 0); - else - createScene(4, 0); - break; - case 6: - _vm->_soundMan->setTwoSoundsPlayFlag(false); - leaveModule(1); - break; - case 7: - _vm->_soundMan->setTwoSoundsPlayFlag(false); - createScene(2, 2); - break; - case 8: - if (_moduleResult == 0) - createScene(0, 0); - else if (_moduleResult == 1) - leaveModule(0); - break; - case 1002: - _vm->_soundMan->setTwoSoundsPlayFlag(false); - _countdown = 0; - _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); - createScene(1, 1); - break; - } - } else { - switch (_sceneNum) { - case 0: - if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) { - _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 65); - _vm->_soundMan->setSoundVolume(0x50399F64, 65); - } - break; - case 1: - if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) - _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); - break; - case 2: - _vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0); - break; - case 5: - case 6: - case 7: - case 1002: - if (_countdown != 0 && (--_countdown == 0)) { - _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 65); - _vm->_soundMan->setSoundVolume(0x50399F64, 65); - } - break; - } - } -} - -static const uint32 kScene1105FileHashes[] = { - 0x00028006, - 0x0100A425, - 0x63090415, - 0x082100C4, - 0x0068C607, - 0x00018344, - 0x442090E4, - 0x0400E004, - 0x5020A054, - 0xB14A891E -}; - -static const uint32 kScene1105BackgroundFileHashes[] = { - 0x20018662, - 0x20014202, - 0x20012202, - 0x20010002 // CHECKME: This used ?? -}; - -static const uint32 kSsScene1105SymbolDieFileHashes[] = { - 0, - 0x90898414, - 0x91098414, - 0x92098414, - 0x94098414, - 0x98098414, - 0x80098414, - 0xB0098414, - 0xD0098414, - 0x10098414 -}; - -SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds) - : StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) { - - _collisionBounds = collisionBounds; - SetMessageHandler(&SsScene1105Button::handleMessage); - SetUpdateHandler(&SsScene1105Button::update); - setVisible(false); -} - -void SsScene1105Button::update() { - if (_countdown != 0 && (--_countdown == 0)) { - sendMessage(_parentScene, 0x4807, 0); - setVisible(false); - } -} - -uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0) { - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - } - break; - case 0x480B: - _countdown = 8; - setVisible(true); - playSound(0, 0x44141000); - break; - } - return messageResult; -} - -SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y) - : StaticSprite(vm, 0) { - - loadSprite(fileHash, kSLFCenteredDrawOffset | kSLFSetPosition, 200, x, y); -} - -void SsScene1105Symbol::hide() { - setVisible(false); - _needRefresh = true; - updatePosition(); -} - -SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y) - : StaticSprite(vm, 1100), _dieIndex(dieIndex) { - - _x = x; - _y = y; - createSurface(200, 50, 50); - loadSymbolSprite(); - SetMessageHandler(&SsScene1105SymbolDie::handleMessage); -} - -uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - loadSymbolSprite(); - break; - } - return messageResult; -} - -void SsScene1105SymbolDie::loadSymbolSprite() { - loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _dieIndex)], kSLFCenteredDrawOffset); -} - -void SsScene1105SymbolDie::hide() { - setVisible(false); - _needRefresh = true; - updatePosition(); -} - -AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - createSurface(100, 556, 328); - _x = 320; - _y = 240; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1105TeddyBear::handleMessage); - startAnimation(0x65084002, 0, -1); - _newStickFrameIndex = 0; - setVisible(false); - _needRefresh = true; - updatePosition(); - loadSound(0, 0xCE840261); - loadSound(1, 0xCCA41A62); -} - -uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2002: - if (getGlobalVar(V_ROBOT_TARGET)) { - startAnimation(0x6B0C0432, 0, -1); - playSound(0); - } else { - startAnimation(0x65084002, 0, -1); - playSound(1); - } - break; - case 0x3002: - sendMessage(_parentScene, 0x2003, 0); - stopAnimation(); - break; - } - return messageResult; -} - -void AsScene1105TeddyBear::show() { - setVisible(true); - _needRefresh = true; - updatePosition(); -} - -void AsScene1105TeddyBear::hide() { - setVisible(false); - _needRefresh = true; - updatePosition(); -} - -SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _isClicked(false) { - - loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - setVisible(false); - loadSound(0, 0x44045140); - SetUpdateHandler(&SsScene1105OpenButton::update); - SetMessageHandler(&SsScene1105OpenButton::handleMessage); -} - -void SsScene1105OpenButton::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) { - setVisible(false); - sendMessage(_parentScene, 0x2001, 0); - } -} - -uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0 && !_isClicked) { - playSound(0); - setVisible(true); - _isClicked = true; - _countdown = 4; - } - messageResult = 1; - break; - } - return messageResult; -} - -Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false), - _isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) { - - Sprite *ssOpenButton; - - _vm->gameModule()->initMemoryPuzzle(); - - SetUpdateHandler(&Scene1105::update); - SetMessageHandler(&Scene1105::handleMessage); - - setBackground(0x20010002); - setPalette(0x20010002); - - _asTeddyBear = insertSprite(this); - ssOpenButton = insertSprite(this); - addCollisionSprite(ssOpenButton); - insertPuzzleMouse(0x10006208, 20, 620); - - loadSound(0, 0x48442057); - loadSound(1, 0xC025014F); - loadSound(2, 0x68E25540); - -} - -uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - if (!_isActionButtonClicked && _backgroundIndex == 0) { - if (_isPanelOpen) { - _isPanelOpen = false; - _backgroundIndex = 15; - SetUpdateHandler(&Scene1105::upClosePanel); - } else - _isPanelOpen = true; - _leaveResult = 0; - } - } - break; - case 0x2001: - showMouse(false); - _backgroundIndex = 24; - SetUpdateHandler(&Scene1105::upOpenPanel); - break; - case 0x2003: - _backgroundIndex = 24; - _leaveResult = 1; - SetUpdateHandler(&Scene1105::upClosePanel); - break; - case 0x4807: - if (sender == _ssActionButton) { - if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) && - getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) && - getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) { - setGlobalVar(V_ROBOT_TARGET, 1); - playSound(2); - _doMoveTeddy = true; - } else { - sendMessage(_asTeddyBear, 0x2002, 0); - } - showMouse(false); - _isActionButtonClicked = true; - } - break; - case 0x4826: - if (_isPanelOpen) { - if (sender == _ssActionButton) { - sendMessage(_ssActionButton, 0x480B, 0); - _isPanelOpen = false; - } else if (!getGlobalVar(V_ROBOT_TARGET)) { - if (sender == _ssSymbol1UpButton) { - if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) { - incSubVar(VA_CURR_DICE_NUMBERS, 0, +1); - sendMessage(_ssSymbol1UpButton, 0x480B, 0); - sendMessage(_ssSymbolDice[0], 0x2000, 0); - } - } else if (sender == _ssSymbol1DownButton) { - if (getSubVar(VA_CURR_DICE_NUMBERS, 0) > 1) { - incSubVar(VA_CURR_DICE_NUMBERS, 0, -1); - sendMessage(_ssSymbol1DownButton, 0x480B, 0); - sendMessage(_ssSymbolDice[0], 0x2000, 0); - } - } else if (sender == _ssSymbol2UpButton) { - if (getSubVar(VA_CURR_DICE_NUMBERS, 1) < 9) { - incSubVar(VA_CURR_DICE_NUMBERS, 1, +1); - sendMessage(_ssSymbol2UpButton, 0x480B, 0); - sendMessage(_ssSymbolDice[1], 0x2000, 0); - } - } else if (sender == _ssSymbol2DownButton) { - if (getSubVar(VA_CURR_DICE_NUMBERS, 1) > 1) { - incSubVar(VA_CURR_DICE_NUMBERS, 1, -1); - sendMessage(_ssSymbol2DownButton, 0x480B, 0); - sendMessage(_ssSymbolDice[1], 0x2000, 0); - } - } else if (sender == _ssSymbol3UpButton) { - if (getSubVar(VA_CURR_DICE_NUMBERS, 2) < 9) { - incSubVar(VA_CURR_DICE_NUMBERS, 2, +1); - sendMessage(_ssSymbol3UpButton, 0x480B, 0); - sendMessage(_ssSymbolDice[2], 0x2000, 0); - } - } else if (sender == _ssSymbol3DownButton) { - if (getSubVar(VA_CURR_DICE_NUMBERS, 2) > 1) { - incSubVar(VA_CURR_DICE_NUMBERS, 2, -1); - sendMessage(_ssSymbol3DownButton, 0x480B, 0); - sendMessage(_ssSymbolDice[2], 0x2000, 0); - } - } - } - } - break; - } - return messageResult; -} - -void Scene1105::createObjects() { - _ssSymbols[0] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 0)], 161, 304); - _ssSymbols[1] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 1)], 294, 304); - _ssSymbols[2] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 2)], 440, 304); - - _ssSymbolDice[0] = insertSprite(0, 206, 304); - _ssSymbolDice[1] = insertSprite(1, 339, 304); - _ssSymbolDice[2] = insertSprite(2, 485, 304); - - _ssSymbol1UpButton = insertSprite(this, 0x08002860, NRect(146, 362, 192, 403)); - addCollisionSprite(_ssSymbol1UpButton); - _ssSymbol1DownButton = insertSprite(this, 0x42012460, NRect(147, 404, 191, 442)); - addCollisionSprite(_ssSymbol1DownButton); - _ssSymbol2UpButton = insertSprite(this, 0x100030A0, NRect(308, 361, 355, 402)); - addCollisionSprite(_ssSymbol2UpButton); - _ssSymbol2DownButton = insertSprite(this, 0x840228A0, NRect(306, 406, 352, 445)); - addCollisionSprite(_ssSymbol2DownButton); - _ssSymbol3UpButton = insertSprite(this, 0x20000120, NRect(476, 358, 509, 394)); - addCollisionSprite(_ssSymbol3UpButton); - _ssSymbol3DownButton = insertSprite(this, 0x08043121, NRect(463, 401, 508, 438)); - addCollisionSprite(_ssSymbol3DownButton); - _ssActionButton = insertSprite(this, 0x8248AD35, NRect(280, 170, 354, 245)); - addCollisionSprite(_ssActionButton); - - _isPanelOpen = true; - - _asTeddyBear->show(); - - insertPuzzleMouse(0x18666208, 20, 620); - -} - -void Scene1105::upOpenPanel() { - Scene::update(); - if (_backgroundIndex != 0) { - _backgroundIndex--; - if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { - uint32 backgroundFileHash = kScene1105BackgroundFileHashes[_backgroundIndex / 2]; - changeBackground(backgroundFileHash); - _palette->addPalette(backgroundFileHash, 0, 256, 0); - } - if (_backgroundIndex == 10) - playSound(0); - if (_backgroundIndex == 0) { - SetUpdateHandler(&Scene1105::update); - _countdown = 2; - } - } -} - -void Scene1105::upClosePanel() { - Scene::update(); - if (_backgroundIndex != 0) { - _backgroundIndex--; - if (_backgroundIndex == 14) { - showMouse(false); - _ssSymbols[0]->hide(); - _ssSymbols[1]->hide(); - _ssSymbols[2]->hide(); - _ssSymbolDice[0]->hide(); - _ssSymbolDice[1]->hide(); - _ssSymbolDice[2]->hide(); - } - if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { - uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME - if (_backgroundIndex == 4) { - playSound(1); - _asTeddyBear->hide(); - } - changeBackground(backgroundFileHash); - _palette->addPalette(backgroundFileHash, 0, 256, 0); - } - if (_backgroundIndex == 0) { - SetUpdateHandler(&Scene1105::update); - _isClosePanelDone = true; - } - } -} - -void Scene1105::update() { - - // DEBUG: Show the correct code - debug("(%d, %d) (%d, %d) (%d, %d)", - getSubVar(VA_GOOD_DICE_NUMBERS, 0), getSubVar(VA_CURR_DICE_NUMBERS, 0), - getSubVar(VA_GOOD_DICE_NUMBERS, 1), getSubVar(VA_CURR_DICE_NUMBERS, 1), - getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2)); - - Scene::update(); - if (_countdown != 0 && (--_countdown == 0)) - createObjects(); - if (_isClosePanelDone && !isSoundPlaying(1)) - leaveScene(_leaveResult); - if (_doMoveTeddy && !isSoundPlaying(2)) { - sendMessage(_asTeddyBear, 0x2002, 0); - _doMoveTeddy = false; - } -} - -Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene1109::handleMessage); - - setBackground(0x8449E02F); - setPalette(0x8449E02F); - insertScreenMouse(0x9E02B84C); - - _sprite1 = insertStaticSprite(0x600CEF01, 1100); - - if (which < 0) { - // Restoring game - insertKlaymen(140, 436); - setMessageList(0x004B6260); - sendMessage(this, 0x2000, 0); - } else if (which == 1) { - // Klaymen teleporting in - insertKlaymen(450, 436); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B6268, false); - sendMessage(this, 0x2000, 1); - } else if (which == 2) { - // Klaymen teleporting out - insertKlaymen(450, 436); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B6318, false); - sendMessage(this, 0x2000, 1); - } else if (which == 3) { - // Klaymen returning from teleporter console - insertKlaymen(450, 436); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B6278, false); - sendMessage(this, 0x2000, 1); - } else { - // Klaymen entering from the left - insertKlaymen(0, 436); - setMessageList(0x004B6258); - sendMessage(this, 0x2000, 0); - } - - _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); - -} - -uint32 Scene1109::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - if (param.asInteger()) { - setRectList(0x004B63A8); - _klaymen->setKlaymenIdleTable3(); - } else { - setRectList(0x004B6398); - _klaymen->setKlaymenIdleTable1(); - } - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1100.h b/engines/neverhood/module1100.h deleted file mode 100644 index e3fb7cba10..0000000000 --- a/engines/neverhood/module1100.h +++ /dev/null @@ -1,130 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1100_H -#define NEVERHOOD_MODULE1100_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module1100 - -class Module1100 : public Module { -public: - Module1100(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1100(); -protected: - int _sceneNum; - int _countdown; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -class SsScene1105Button : public StaticSprite { -public: - SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds); -protected: - Scene *_parentScene; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene1105Symbol : public StaticSprite { -public: - SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y); - void hide(); -}; - -class SsScene1105SymbolDie : public StaticSprite { -public: - SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y); - void hide(); -protected: - uint _dieIndex; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void loadSymbolSprite(); -}; - -class AsScene1105TeddyBear : public AnimatedSprite { -public: - AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene); - void show(); - void hide(); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene1105OpenButton : public StaticSprite { -public: - SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - int _countdown; - bool _isClicked; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1105 : public Scene { -public: - Scene1105(NeverhoodEngine *vm, Module *parentModule); -protected: - int _countdown; - int _backgroundIndex; - bool _isPanelOpen; - bool _isActionButtonClicked; - bool _doMoveTeddy; - bool _isClosePanelDone; - int _leaveResult; - AsScene1105TeddyBear *_asTeddyBear; - SsScene1105Symbol *_ssSymbols[3]; - SsScene1105SymbolDie *_ssSymbolDice[3]; - Sprite *_ssSymbol1UpButton; - Sprite *_ssSymbol1DownButton; - Sprite *_ssSymbol2UpButton; - Sprite *_ssSymbol2DownButton; - Sprite *_ssSymbol3UpButton; - Sprite *_ssSymbol3DownButton; - Sprite *_ssActionButton; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createObjects(); - void upOpenPanel(); - void upClosePanel(); - void update(); -}; - -class Scene1109 : public Scene { -public: - Scene1109(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_sprite1; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1100_H */ diff --git a/engines/neverhood/module1200.cpp b/engines/neverhood/module1200.cpp deleted file mode 100644 index 1536114df8..0000000000 --- a/engines/neverhood/module1200.cpp +++ /dev/null @@ -1,1102 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1200.h" - -namespace Neverhood { - -Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - SetMessageHandler(&Module1200::handleMessage); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 1) - createScene(0, 2); - else - createScene(0, 0); - - _vm->_soundMan->addMusic(0x00478311, 0x62222CAE); - _vm->_soundMan->startMusic(0x62222CAE, 0, 0); -} - -Module1200::~Module1200() { - _vm->_soundMan->deleteMusicGroup(0x00478311); -} - -void Module1200::createScene(int sceneNum, int which) { - debug("Module1200::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene1201(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _childObject = new Scene1202(_vm, this); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); - createSmackerScene(0x31890001, true, true, false); - setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1); - break; - } - SetUpdateHandler(&Module1200::updateScene); - _childObject->handleUpdate(); -} - -void Module1200::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(1, 0); - else if (_moduleResult == 2) { - if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) - createScene(2, -1); - else - leaveModule(1); - } else - leaveModule(0); - break; - case 1: - createScene(0, 1); - break; - case 2: - _vm->_soundMan->startMusic(0x62222CAE, 0, 0); - createScene(0, 3); - break; - } - } -} - -// Scene1201 - -static const uint32 kScene1201InitArray[] = { - 1, 0, 2, 4, 5, 3, 6, 7, 8, 10, 9, 11, 13, 14, 12, 16, 17, 15 -}; - -static const NPoint kScene1201PointArray[] = { - {218, 193}, {410, 225}, {368, 277}, - {194, 227}, {366, 174}, {458, 224}, - {242, 228}, {512, 228}, {458, 277}, - {217, 233}, {458, 173}, {410, 276}, - {203, 280}, {371, 226}, {508, 279}, - {230, 273}, {410, 171}, {493, 174} -}; - -static const uint32 kScene1201TntFileHashList1[] = { - 0x2098212D, 0x1600437E, 0x1600437E, - 0x00A840E3, 0x1A1830F6, 0x1A1830F6, - 0x00212062, 0x384010B6, 0x384010B6, - 0x07A01080, 0xD80C2837, 0xD80C2837, - 0x03A22092, 0xD8802CB6, 0xD8802CB6, - 0x03A93831, 0xDA460476, 0xDA460476 -}; - -static const uint32 kScene1201TntFileHashList2[] = { - 0x3040C676, 0x10914448, 0x10914448, - 0x3448A066, 0x1288C049, 0x1288C049, - 0x78C0E026, 0x3098D05A, 0x3098D05A, - 0x304890E6, 0x1284E048, 0x1284E048, - 0xB140A1E6, 0x5088A068, 0x5088A068, - 0x74C4C866, 0x3192C059, 0x3192C059 -}; - -SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2) - : StaticSprite(vm, 900) { - - int16 x = kScene1201PointArray[pointIndex].x; - int16 y = kScene1201PointArray[pointIndex].y; - if (x < 300) - loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50); - else - loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y); - setClipRect(0, 0, 640, clipY2); -} - -AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash) - : AnimatedSprite(vm, fileHash, surfacePriority, x, y), _parentScene(parentScene), _nameHash(nameHash) { - - if (!getSubVar(VA_HAS_TAPE, _nameHash) && !getSubVar(VA_IS_TAPE_INSERTED, _nameHash)) { - SetMessageHandler(&AsScene1201Tape::handleMessage); - } else { - setVisible(false); - SetMessageHandler(NULL); - } -} - -uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setSubVar(VA_HAS_TAPE, _nameHash, 1); - setVisible(false); - SetMessageHandler(NULL); - break; - } - return messageResult; -} - -AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging) - : AnimatedSprite(vm, 1200) { - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1201TntManRope::handleMessage); - createSurface(10, 34, 149); - _x = 202; - _y = -32; - if (isDummyHanging) { - startAnimation(0x928F0C10, 15, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - startAnimation(0x928F0C10, 0, -1); - _newStickFrameIndex = 0; - } -} - -uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02060018) - playSound(0, 0x47900E06); - break; - case 0x2006: - startAnimation(0x928F0C10, 1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - break; - } - return messageResult; -} - -AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen) - : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0) { - - createSurface1(0xD088AC30, 100); - _x = 320; - _y = 240; - SetUpdateHandler(&AsScene1201RightDoor::update); - SetMessageHandler(&AsScene1201RightDoor::handleMessage); - _newStickFrameIndex = STICK_LAST_FRAME; - if (isOpen) { - startAnimation(0xD088AC30, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - _countdown = 25; - } else { - stopAnimation(); - setVisible(false); - } -} - -void AsScene1201RightDoor::update() { - if (_countdown != 0 && (--_countdown == 0)) - stCloseDoor(); - AnimatedSprite::update(); -} - -uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - case 0x4829: - stOpenDoor(); - break; - } - return messageResult; -} - -void AsScene1201RightDoor::stOpenDoor() { - startAnimation(0xD088AC30, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - setVisible(true); - playSound(0, calcHash("fxDoorOpen20")); -} - -void AsScene1201RightDoor::stCloseDoor() { - startAnimation(0xD088AC30, -1, -1); - _playBackwards = true; - setVisible(true); - playSound(0, calcHash("fxDoorClose20")); - NextState(&AsScene1201RightDoor::stCloseDoorDone); -} - -void AsScene1201RightDoor::stCloseDoorDone() { - stopAnimation(); - setVisible(false); -} - -AsScene1201KlaymenHead::AsScene1201KlaymenHead(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200) { - - createSurface(1200, 69, 98); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1201KlaymenHead::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - setVisible(false); -} - -uint32 AsScene1201KlaymenHead::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2006: - _x = 436; - _y = 339; - startAnimation(0xA060C599, 0, -1); - setVisible(true); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - gotoNextState(); - break; - } - return messageResult; -} - -AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isComingDown) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _asTntManRope(asTntManRope), - _isMoving(false) { - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1201TntMan::handleMessage); - createSurface(990, 106, 181); - _x = 201; - if (isComingDown) { - _y = 297; - stComingDown(); - } else { - _y = 334; - stStanding(); - } -} - -AsScene1201TntMan::~AsScene1201TntMan() { - _vm->_soundMan->deleteSoundGroup(0x01D00560); -} - -uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x092870C0) - sendMessage(_asTntManRope, 0x2006, 0); - else if (param.asInteger() == 0x11CA0144) - playSound(0, 0x51800A04); - break; - case 0x1011: - sendMessage(_parentScene, 0x2002, 0); - messageResult = 1; - break; - case 0x480B: - if (!_isMoving) { - _sprite = (Sprite*)sender; - stMoving(); - } - break; - } - return messageResult; - -} - -uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1201TntMan::suMoving() { - _x = _sprite->getX() + 100; -} - -void AsScene1201TntMan::stStanding() { - startAnimation(0x654913D0, 0, -1); - SetMessageHandler(&AsScene1201TntMan::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene1201TntMan::stComingDown() { - startAnimation(0x356803D0, 0, -1); - SetMessageHandler(&AsScene1201TntMan::hmComingDown); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - NextState(&AsScene1201TntMan::stStanding); -} - -void AsScene1201TntMan::stMoving() { - _vm->_soundMan->addSound(0x01D00560, 0x4B044624); - _vm->_soundMan->playSoundLooping(0x4B044624); - _isMoving = true; - startAnimation(0x85084190, 0, -1); - SetMessageHandler(&AsScene1201TntMan::handleMessage); - SetSpriteUpdate(&AsScene1201TntMan::suMoving); - _newStickFrameIndex = STICK_LAST_FRAME; -} - -AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan) - : AnimatedSprite(vm, 1200), _asTntMan(asTntMan) { - - createSurface1(0x828C0411, 995); - SetUpdateHandler(&AsScene1201TntManFlame::update); - SetMessageHandler(&Sprite::handleMessage); - SetSpriteUpdate(&AsScene1201TntManFlame::suUpdate); - startAnimation(0x828C0411, 0, -1); - setVisible(false); -} - -AsScene1201TntManFlame::~AsScene1201TntManFlame() { - _vm->_soundMan->deleteSoundGroup(0x041080A4); -} - -void AsScene1201TntManFlame::update() { - AnimatedSprite::update(); - if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { - setVisible(true); - SetUpdateHandler(&AnimatedSprite::update); - _vm->_soundMan->addSound(0x041080A4, 0x460A1050); - _vm->_soundMan->playSoundLooping(0x460A1050); - } -} - -void AsScene1201TntManFlame::suUpdate() { - _x = _asTntMan->getX() - 18; - _y = _asTntMan->getY() - 158; -} - -AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _countdown(0) { - - createSurface(1100, 57, 60); - SetUpdateHandler(&AsScene1201Match::update); - SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - switch (getGlobalVar(V_MATCH_STATUS)) { - case 0: - _x = 521; - _y = 112; - _status = 0; - stIdleOnDoorFrame(); - break; - case 1: - _x = 521; - _y = 112; - _status = 2; - stOnDoorFrameAboutToMove(); - loadSound(0, 0xD00230CD); - break; - case 2: - setDoDeltaX(1); - _x = 403; - _y = 337; - _status = 0; - stIdleOnFloor(); - break; - } -} - -void AsScene1201Match::update() { - if (_countdown != 0 && (--_countdown == 0)) - gotoNextState(); - updateAnim(); - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x86668011) - playSound(0); - break; - } - return messageResult; -} - -uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x2001, 0); - messageResult = 1; - break; - case 0x4806: - setVisible(false); - setGlobalVar(V_MATCH_STATUS, 3); - break; - } - return messageResult; -} - -void AsScene1201Match::stOnDoorFrameMoving() { - startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving); - if (_status == 0) { - NextState(&AsScene1201Match::stFallingFromDoorFrame); - } else { - NextState(&AsScene1201Match::stOnDoorFrameAboutToMove); - } -} - -void AsScene1201Match::stFallingFromDoorFrame() { - setGlobalVar(V_MATCH_STATUS, 2); - _x -= 199; - _y += 119; - startAnimation(0x018D0240, 0, -1); - SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving); - NextState(&AsScene1201Match::stIdleOnFloor); -} - -void AsScene1201Match::stOnDoorFrameAboutToMove() { - startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); - _newStickFrameIndex = 0; - if (_status != 0) { - _countdown = 36; - _status--; - NextState(&AsScene1201Match::stOnDoorFrameMoving); - } -} - -void AsScene1201Match::stIdleOnDoorFrame() { - startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::hmIdle); - _newStickFrameIndex = 0; -} - -void AsScene1201Match::stIdleOnFloor() { - setDoDeltaX(1); - _x = 403; - _y = 337; - startAnimation(0x00842374, 0, -1); - SetMessageHandler(&AsScene1201Match::hmIdle); - _newStickFrameIndex = 0; -} - -AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _klaymen(klaymen), _klaymenTooClose(false) { - - // NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed - - createSurface(1100, 203, 199); - SetUpdateHandler(&AsScene1201Creature::update); - SetMessageHandler(&AsScene1201Creature::hmWaiting); - _x = 540; - _y = 320; - stWaiting(); -} - -void AsScene1201Creature::update() { - bool oldKlaymenTooClose = _klaymenTooClose; - _klaymenTooClose = _klaymen->getX() >= 385; - if (_klaymenTooClose != oldKlaymenTooClose) - stWaiting(); - if (_countdown != 0 && (--_countdown == 0)) - gotoNextState(); - updateAnim(); - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02060018) - playSound(0, 0xCD298116); - break; - case 0x2004: - GotoState(&AsScene1201Creature::stStartReachForTntDummy); - break; - case 0x2006: - GotoState(&AsScene1201Creature::stPincerSnapKlaymen); - break; - } - return messageResult; -} - -uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = hmWaiting(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -uint32 AsScene1201Creature::hmPincerSnapKlaymen(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02060018) { - playSound(0, 0xCD298116); - sendMessage(_parentScene, 0x4814, 0); - sendMessage(_klaymen, 0x4814, 0); - } - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1201Creature::stWaiting() { - startAnimation(0x08081513, 0, -1); - SetMessageHandler(&AsScene1201Creature::hmWaiting); - NextState(&AsScene1201Creature::stPincerSnap); - _countdown = 36; -} - -void AsScene1201Creature::stPincerSnap() { - if (!_klaymenTooClose) { - startAnimation(0xCA287133, 0, -1); - SetMessageHandler(&AsScene1201Creature::hmPincerSnap); - NextState(&AsScene1201Creature::stWaiting); - } -} - -void AsScene1201Creature::stStartReachForTntDummy() { - startAnimation(0x08081513, 0, -1); - SetMessageHandler(&AsScene1201Creature::hmWaiting); - NextState(&AsScene1201Creature::stReachForTntDummy); - _countdown = 48; -} - -void AsScene1201Creature::stReachForTntDummy() { - startAnimation(0x5A201453, 0, -1); - SetMessageHandler(&AsScene1201Creature::hmWaiting); - _countdown = 0; -} - -void AsScene1201Creature::stPincerSnapKlaymen() { - startAnimation(0xCA287133, 0, -1); - SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlaymen); - NextState(&AsScene1201Creature::stWaiting); - _countdown = 0; -} - -AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen) - : AnimatedSprite(vm, 1100), _klaymen(klaymen) { - - _x = 320; - _y = 240; - createSurface(800, 55, 199); - if (_klaymen->getX() < 100) { - startAnimation(0x508A111B, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - playSound(0, calcHash("fxDoorOpen03")); - } else { - startAnimation(0x508A111B, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1201LeftDoor::handleMessage); -} - -uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4809: - stCloseDoor(); - break; - } - return messageResult; -} - -void AsScene1201LeftDoor::stCloseDoor() { - startAnimation(0x508A111B, -1, -1); - _playBackwards = true; - _newStickFrameIndex = 0; -} - -Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL), - _asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { - - int16 topY1, topY2, topY3, topY4; - int16 x1, x2; - Sprite *tempSprite; - - SetUpdateHandler(&Scene1201::update); - SetMessageHandler(&Scene1201::handleMessage); - - setHitRects(0x004AEBD0); - - if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) { - setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1); - for (uint32 index = 0; index < 18; index++) - setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]); - } - - insertScreenMouse(0x9A2C0409); - - _asTape = insertSprite(this, 3, 1100, 243, 340, 0x9148A011); - addCollisionSprite(_asTape); - - tempSprite = insertStaticSprite(0x03C82530, 100); - topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; - - tempSprite = insertStaticSprite(0x88182069, 200); - topY2 = tempSprite->getY() + tempSprite->getDrawRect().height; - - tempSprite = insertStaticSprite(0x476014E0, 300); - topY3 = tempSprite->getY() + tempSprite->getDrawRect().height; - - tempSprite = insertStaticSprite(0x04063110, 500); - topY4 = tempSprite->getY() + 1; - - _asTntManRope = insertSprite(getGlobalVar(V_TNT_DUMMY_BUILT) && which != 1); - _asTntManRope->setClipRect(0, topY4, 640, 480); - - insertStaticSprite(0x400B04B0, 1200); - - tempSprite = insertStaticSprite(0x40295462, 1200); - x1 = tempSprite->getX(); - - tempSprite = insertStaticSprite(0xA29223FA, 1200); - x2 = tempSprite->getX() + tempSprite->getDrawRect().width; - - _asKlaymenHead = insertSprite(); - - if (which < 0) { - // Restoring game - insertKlaymen(364, 333); - setMessageList(0x004AEC08); - } else if (which == 3) { - // Klaymen standing after the weasel exploded - insertKlaymen(400, 329); - setMessageList(0x004AEC08); - } else if (which == 2) { - // Klaymen entering from the right - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { - insertKlaymen(374, 333); - setMessageList(0x004AEC08); - } else { - insertKlaymen(640, 329); - setMessageList(0x004AEC20); - } - } else if (which == 1) { - // Klaymen returning from the TNT console - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(364, 333); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen(246, 333); - } - setMessageList(0x004AEC30); - } else { - // Klaymen entering from the left - insertKlaymen(0, 336); - setMessageList(0x004AEC10); - } - - _klaymen->setClipRect(x1, 0, x2, 480); - _klaymen->setRepl(64, 0); - - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { - setBackground(0x4019A2C4); - setPalette(0x4019A2C4); - _asRightDoor = NULL; - } else { - setBackground(0x40206EC5); - setPalette(0x40206EC5); - _asRightDoor = insertSprite(_klaymen, which == 2); - } - - if (getGlobalVar(V_TNT_DUMMY_BUILT)) { - insertStaticSprite(0x10002ED8, 500); - if (!getGlobalVar(V_CREATURE_EXPLODED)) { - _asTntMan = insertSprite(this, _asTntManRope, which == 1); - _asTntMan->setClipRect(x1, 0, x2, 480); - _asTntMan->setRepl(64, 0); - addCollisionSprite(_asTntMan); - tempSprite = insertSprite(_asTntMan); - tempSprite->setClipRect(x1, 0, x2, 480); - } - - uint32 tntIndex = 1; - while (tntIndex < 18) { - uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); - int16 clipY2; - if (kScene1201PointArray[elemIndex].y < 175) - clipY2 = topY1; - else if (kScene1201PointArray[elemIndex].y < 230) - clipY2 = topY2; - else - clipY2 = topY3; - insertSprite(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); - elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex + 1); - if (kScene1201PointArray[elemIndex].y < 175) - clipY2 = topY1; - else if (kScene1201PointArray[elemIndex].y < 230) - clipY2 = topY2; - else - clipY2 = topY3; - insertSprite(tntIndex + 1, getSubVar(VA_TNT_POSITIONS, tntIndex + 1), clipY2); - tntIndex += 3; - } - - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { - setRectList(0x004AEE58); - } else { - setRectList(0x004AEDC8); - } - - } else { - - insertStaticSprite(0x8E8A1981, 900); - - uint32 tntIndex = 0; - while (tntIndex < 18) { - uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); - int16 clipY2; - if (kScene1201PointArray[elemIndex].x < 300) { - clipY2 = 480; - } else { - if (kScene1201PointArray[elemIndex].y < 175) - clipY2 = topY1; - else if (kScene1201PointArray[elemIndex].y < 230) - clipY2 = topY2; - else - clipY2 = topY3; - } - insertSprite(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); - tntIndex++; - } - - if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) - setRectList(0x004AEE18); - else - setRectList(0x004AED88); - - } - - tempSprite = insertStaticSprite(0x63D400BC, 900); - - _asLeftDoor = insertSprite(_klaymen); - _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); - - if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) - setGlobalVar(V_MATCH_STATUS, 1); - - _asMatch = NULL; - - if (getGlobalVar(V_MATCH_STATUS) < 3) { - _asMatch = insertSprite(this); - addCollisionSprite(_asMatch); - } - - if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { - _asCreature = insertSprite(this, _klaymen); - _asCreature->setClipRect(x1, 0, x2, 480); - } - -} - -Scene1201::~Scene1201() { - if (_creatureExploded) - setGlobalVar(V_CREATURE_EXPLODED, 1); - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -void Scene1201::update() { - Scene::update(); - if (_asMatch && getGlobalVar(V_MATCH_STATUS) == 3) - deleteSprite(&_asMatch); -} - -uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x07053000) { - _creatureExploded = true; - sendMessage(_asCreature, 0x2004, 0); - } else if (param.asInteger() == 0x140E5744) - sendMessage(_asCreature, 0x2005, 0); - else if (param.asInteger() == 0x40253C40) { - _canAcceptInput = false; - sendMessage(_asCreature, 0x2006, 0); - } else if (param.asInteger() == 0x090EB048) { - if (_klaymen->getX() < 572) - setMessageList2(0x004AEC90); - else - setMessageList2(0x004AEC20); - } - break; - case 0x2001: - if (getGlobalVar(V_MATCH_STATUS) == 0) - setMessageList2(0x004AECB0); - else { - sendEntityMessage(_klaymen, 0x1014, _asMatch); - setMessageList2(0x004AECC0); - } - break; - case 0x2002: - if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { - // Move the TNT dummy if the fuse is burning - sendEntityMessage(_klaymen, 0x1014, _asTntMan); - setMessageList2(0x004AECF0, false); - } else if (getGlobalVar(V_MATCH_STATUS) == 3) { - // Light the TNT dummy if we have the match - sendEntityMessage(_klaymen, 0x1014, _asTntMan); - if (_klaymen->getX() > _asTntMan->getX()) - setMessageList(0x004AECD0); - else - setMessageList(0x004AECE0); - } - break; - case 0x4814: - cancelMessageList(); - break; - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004AED38); - } - break; - case 0x4829: - sendMessage(_asRightDoor, 0x4829, 0); - break; - case 0x8000: - sendMessage(_asKlaymenHead, 0x2006, 0); - break; - } - return messageResult; -} - -// Scene1202 - -static const uint32 kScene1202Table[] = { - 1, 2, 0, 4, 5, 3, 7, 8, 6, 10, 11, 9, 13, 14, 12, 16, 17, 15 -}; - -static const NPoint kScene1202Points[] = { - {203, 140}, {316, 212}, {277, 264}, - {176, 196}, {275, 159}, {366, 212}, - {230, 195}, {412, 212}, {368, 263}, - {204, 192}, {365, 164}, {316, 262}, - {191, 255}, {280, 213}, {406, 266}, - {214, 254}, {316, 158}, {402, 161} -}; - -static const uint32 kScene1202FileHashes[] = { - 0x1AC00B8, 0x1AC14B8, 0x1AC14B8, - 0x1AC30B8, 0x1AC14B8, 0x1AC14B8, - 0x1AC00B8, 0x1AC14B8, 0x1AC14B8, - 0x1AC90B8, 0x1AC18B8, 0x1AC18B8, - 0x1AC30B8, 0x1AC14B8, 0x1AC14B8, - 0x1AC50B8, 0x1AC14B8, 0x1AC14B8 -}; - -AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _itemIndex(itemIndex) { - - int positionIndex; - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1202TntItem::hmShowIdle); - positionIndex = getSubVar(VA_TNT_POSITIONS, _itemIndex); - createSurface(900, 37, 67); - _x = kScene1202Points[positionIndex].x; - _y = kScene1202Points[positionIndex].y; - stShowIdle(); -} - -uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x2000, _itemIndex); - messageResult = 1; - break; - case 0x2001: - _newPosition = (int)param.asInteger(); - stChangePositionFadeOut(); - break; - } - return messageResult; -} - -uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1202TntItem::stShowIdle() { - startAnimation(kScene1202FileHashes[_itemIndex], 0, -1); - SetMessageHandler(&AsScene1202TntItem::hmShowIdle); - _newStickFrameIndex = 0; -} - -void AsScene1202TntItem::stChangePositionFadeOut() { - startAnimation(kScene1202FileHashes[_itemIndex], 0, -1); - SetMessageHandler(&AsScene1202TntItem::hmChangePosition); - NextState(&AsScene1202TntItem::stChangePositionFadeIn); -} - -void AsScene1202TntItem::stChangePositionFadeIn() { - _x = kScene1202Points[_newPosition].x; - _y = kScene1202Points[_newPosition].y; - startAnimation(kScene1202FileHashes[_itemIndex], 6, -1); - _playBackwards = true; - SetMessageHandler(&AsScene1202TntItem::hmChangePosition); - NextState(&AsScene1202TntItem::stChangePositionDone); -} - -void AsScene1202TntItem::stChangePositionDone() { - sendMessage(_parentScene, 0x2002, _itemIndex); - stShowIdle(); -} - -Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _paletteResource(vm), - _soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) { - - SetMessageHandler(&Scene1202::handleMessage); - SetUpdateHandler(&Scene1202::update); - - setBackground(0x60210ED5); - setPalette(0x60210ED5); - addEntity(_palette); - - _paletteResource.load(0x60250EB5); - _paletteResource.copyPalette(_paletteData); - - insertPuzzleMouse(0x10ED160A, 20, 620); - - for (int tntIndex = 0; tntIndex < 18; tntIndex++) { - _asTntItems[tntIndex] = insertSprite(this, tntIndex); - addCollisionSprite(_asTntItems[tntIndex]); - } - - insertStaticSprite(0x8E8419C1, 1100); - - if (getGlobalVar(V_TNT_DUMMY_BUILT)) - SetMessageHandler(&Scene1202::hmSolved); - - playSound(0, 0x40106542); - loadSound(1, 0x40005446); - loadSound(2, 0x40005446); // Same sound as slot 1 - loadSound(3, 0x68E25540); - -} - -Scene1202::~Scene1202() { - if (isSolved()) - setGlobalVar(V_TNT_DUMMY_BUILT, 1); -} - -void Scene1202::update() { - Scene::update(); - if (_isPuzzleSolved) { - if (!isSoundPlaying(3)) - leaveScene(0); - } else if (_counter == 0 && isSolved()) { - _clickedIndex = 0; - SetMessageHandler(&Scene1202::hmSolved); - setGlobalVar(V_TNT_DUMMY_BUILT, 1); - _palette->copyToBasePalette(_paletteData); - _palette->startFadeToPalette(24); - playSound(3); - _isPuzzleSolved = true; - } else if (_clickedIndex >= 0 && _counter == 0) { - // Swap TNT positions - int destIndex = kScene1202Table[_clickedIndex]; - sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex)); - sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); - int temp = getSubVar(VA_TNT_POSITIONS, destIndex); - setSubVar(VA_TNT_POSITIONS, destIndex, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); - setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp); - _counter = 2; - _clickedIndex = -1; - playSound(_soundToggle ? 1 : 2); - _soundToggle = !_soundToggle; - } -} - -uint32 Scene1202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isPuzzleSolved) - leaveScene(0); - break; - case 0x2000: - _clickedIndex = (int)param.asInteger(); - break; - case 0x2002: - _counter--; - break; - } - return messageResult; -} - -uint32 Scene1202::hmSolved(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - } - return 0; -} - -bool Scene1202::isSolved() { - return - getSubVar(VA_TNT_POSITIONS, 0) == 0 && getSubVar(VA_TNT_POSITIONS, 3) == 3 && - getSubVar(VA_TNT_POSITIONS, 6) == 6 && getSubVar(VA_TNT_POSITIONS, 9) == 9 && - getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1200.h b/engines/neverhood/module1200.h deleted file mode 100644 index f6f97b4131..0000000000 --- a/engines/neverhood/module1200.h +++ /dev/null @@ -1,216 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1200_H -#define NEVERHOOD_MODULE1200_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module1200 - -class Module1200 : public Module { -public: - Module1200(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1200(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene1201 - -class AsScene1201Tape : public AnimatedSprite { -public: - AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash); -protected: - Scene *_parentScene; - uint32 _nameHash; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1201TntManRope : public AnimatedSprite { -public: - AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1201RightDoor : public AnimatedSprite { -public: - AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen); -protected: - Sprite *_klaymen; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stCloseDoor(); - void stCloseDoorDone(); -}; - -class AsScene1201KlaymenHead : public AnimatedSprite { -public: - AsScene1201KlaymenHead(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1201TntMan : public AnimatedSprite { -public: - AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isDown); - virtual ~AsScene1201TntMan(); -protected: - Scene *_parentScene; - Sprite *_asTntManRope; - Sprite *_sprite; - bool _isMoving; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmComingDown(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoving(); - void stStanding(); - void stComingDown(); - void stMoving(); -}; - -class AsScene1201TntManFlame : public AnimatedSprite { -public: - AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan); - ~AsScene1201TntManFlame(); -protected: - Sprite *_asTntMan; - void update(); - void suUpdate(); -}; - -class AsScene1201Match : public AnimatedSprite { -public: - AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - int _countdown; - int _status; - void update(); - uint32 hmOnDoorFrameAboutToMove(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmOnDoorFrameMoving(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmIdle(int messageNum, const MessageParam ¶m, Entity *sender); - void stOnDoorFrameMoving(); - void stFallingFromDoorFrame(); - void stOnDoorFrameAboutToMove(); - void stIdleOnDoorFrame(); - void stIdleOnFloor(); -}; - -class AsScene1201Creature : public AnimatedSprite { -public: - AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen); -protected: - Scene *_parentScene; - Sprite *_klaymen; - int _countdown; - bool _klaymenTooClose; - void update(); - uint32 hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPincerSnapKlaymen(int messageNum, const MessageParam ¶m, Entity *sender); - void stWaiting(); - void stPincerSnap(); - void stStartReachForTntDummy(); - void stReachForTntDummy(); - void stPincerSnapKlaymen(); -}; - -class AsScene1201LeftDoor : public AnimatedSprite { -public: - AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen); -protected: - Sprite *_klaymen; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stCloseDoor(); -}; - -class SsScene1201Tnt : public StaticSprite { -public: - SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2); -protected: - uint32 _elemIndex; -}; - -class Scene1201 : public Scene { -public: - Scene1201(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene1201(); -protected: - Sprite *_asMatch; - AsScene1201TntMan *_asTntMan; - Sprite *_asCreature; - Sprite *_asTntManRope; - Sprite *_asLeftDoor; - Sprite *_asRightDoor; - Sprite *_asTape; - Sprite *_asKlaymenHead; - bool _creatureExploded; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1202 - -class AsScene1202TntItem : public AnimatedSprite { -public: - AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index); -protected: - Scene *_parentScene; - int _itemIndex, _newPosition; - uint32 hmShowIdle(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmChangePosition(int messageNum, const MessageParam ¶m, Entity *sender); - void stShowIdle(); - void stChangePositionFadeOut(); - void stChangePositionFadeIn(); - void stChangePositionDone(); -}; - -class Scene1202 : public Scene { -public: - Scene1202(NeverhoodEngine *vm, Module *parentModule); - virtual ~Scene1202(); -protected: - PaletteResource _paletteResource; - Sprite *_asTntItems[18]; - int _counter; - int _clickedIndex; - byte _paletteData[1024]; - bool _isPuzzleSolved; - bool _soundToggle; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmSolved(int messageNum, const MessageParam ¶m, Entity *sender); - bool isSolved(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1200_H */ diff --git a/engines/neverhood/module1300.cpp b/engines/neverhood/module1300.cpp deleted file mode 100644 index 162d710f46..0000000000 --- a/engines/neverhood/module1300.cpp +++ /dev/null @@ -1,1835 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1300.h" -#include "neverhood/module1000.h" -#include "neverhood/module1200.h" -#include "neverhood/module1400.h" -#include "neverhood/module2200.h" -#include "neverhood/gamemodule.h" -#include "neverhood/diskplayerscene.h" -#include "neverhood/menumodule.h" -#include "neverhood/navigationscene.h" -#include "neverhood/smackerscene.h" - -namespace Neverhood { - -static const uint32 kModule1300SoundList[] = { - 0x16805648, - 0x16805C48, - 0xB4964448, - 0x96A05481, - 0xD0E14441, - 0x90815450, - 0 -}; - -Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - _vm->_soundMan->addMusic(0x61C090, 0x00203197); - _vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList); - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150); - _vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 70); - _vm->_soundMan->setSoundVolume(0x50399F64, 70); - - if (which < 0) { - if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17) - createScene(_vm->gameState().sceneNum, -1); - else - createScene(11, 0); - } else { - switch (which) { - case 0: - createScene(11, 0); - break; - case 1: - createScene(13, 0); - break; - case 2: - createScene(14, 0); - break; - case 3: - createScene(15, 0); - break; - case 4: - createScene(7, 0); - break; - case 5: - createScene(5, 1); - break; - case 6: - createScene(5, 5); - break; - case 7: - createScene(3, 0); - break; - case 8: - createScene(1, 0); - break; - case 9: - createScene(2, 0); - break; - case 10: - createScene(6, 0); - break; - case 11: - createScene(4, 0); - break; - default: - createScene(12, 0); - break; - } - } - -} - -Module1300::~Module1300() { - _vm->_soundMan->deleteGroup(0x61C090); -} - -void Module1300::createScene(int sceneNum, int which) { - debug("Module1300::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 1: - _vm->gameState().sceneNum = 1; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x00203197, 0, 2); - _childObject = new Scene1302(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new Scene1303(_vm, this); - break; - case 3: - _vm->gameState().sceneNum = 3; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new Scene1304(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x00203197, 0, 2); - _childObject = new Scene1305(_vm, this, which); - break; - case 5: - _vm->gameState().sceneNum = 5; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x00203197, 0, 2); - _childObject = new Scene1306(_vm, this, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x00203197, 0, 2); - _childObject = new Scene1307(_vm, this); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x00203197, 0, 2); - _childObject = new Scene1308(_vm, this, which); - break; - case 8: - _vm->gameState().sceneNum = 8; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 1); - break; - case 9: - _vm->gameState().sceneNum = 9; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createSmackerScene(0x20082818, true, true, false); - break; - case 10: - _vm->gameState().sceneNum = 10; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createSmackerScene(0x20082828, true, true, false); - break; - case 11: - _vm->gameState().sceneNum = 11; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createNavigationScene(0x004B27A8, which); - break; - case 12: - _vm->gameState().sceneNum = 12; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createNavigationScene(0x004B2718, which); - break; - case 13: - _vm->gameState().sceneNum = 13; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createNavigationScene(0x004B27D8, which); - break; - case 14: - _vm->gameState().sceneNum = 14; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createNavigationScene(0x004B2808, which); - break; - case 15: - _vm->gameState().sceneNum = 15; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - createNavigationScene(0x004B2838, which); - break; - case 16: - _vm->gameState().sceneNum = 16; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new Scene1317(_vm, this); - break; - case 17: - _vm->gameState().sceneNum = 17; - _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->stopMusic(0x00203197, 0, 2); - _childObject = new CreditsScene(_vm, this, false); - break; - } - SetUpdateHandler(&Module1300::updateScene); - _childObject->handleUpdate(); -} - -void Module1300::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 1: - if (_moduleResult == 1) - createScene(4, 0); - else - createScene(7, 1); - break; - case 2: - createScene(5, 3); - break; - case 3: - createScene(15, 0); - break; - case 4: - createScene(16, -1); - break; - case 5: - if (_moduleResult == 2) - createScene(8, 0); - else if (_moduleResult == 3) - createScene(2, 0); - else if (_moduleResult == 0) - leaveModule(0); - else if (_moduleResult == 1) - createScene(10, -1); - break; - case 6: - createScene(7, 2); - break; - case 7: - if (_moduleResult == 0) - createScene(13, 0); - else if (_moduleResult == 1) - createScene(1, 0); - else if (_moduleResult == 2) - createScene(6, 0); - break; - case 8: - createScene(5, 2); - break; - case 9: - createScene(5, 0); - break; - case 10: - createScene(14, 0); - break; - case 11: - if (_moduleResult == 0) - createScene(12, 0); - else if (_moduleResult == 1) - createScene(11, 1); - break; - case 12: - if (_moduleResult == 0) - createScene(14, 1); - else if (_moduleResult == 1) - createScene(15, 1); - else if (_moduleResult == 3) - createScene(11, 1); - else if (_moduleResult == 5) - createScene(13, 1); - break; - case 13: - if (_moduleResult == 0) - createScene(12, 2); - else if (_moduleResult == 1) - createScene(7, 0); - break; - case 14: - if (_moduleResult == 0) - createScene(12, 3); - else if (_moduleResult == 1) - createScene(9, -1); - break; - case 15: - if (_moduleResult == 0) - createScene(12, 4); - else if (_moduleResult == 1) - createScene(3, 0); - break; - case 16: - createScene(17, -1); - break; - case 17: - leaveModule(1); - break; - } - } -} - -AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - _x = 320; - _y = 240; - createSurface1(0x88148150, 500); - if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { - startAnimation(0x88148150, 0, -1); - _newStickFrameIndex = 0; - } else { - startAnimation(0x88148150, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } - loadSound(0, 0x68895082); - loadSound(1, 0x689BD0C1); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1302Bridge::handleMessage); -} - -uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - case 0x4808: - stLowerBridge(); - break; - case 0x4809: - stRaiseBridge(); - break; - } - return messageResult; -} - -void AsScene1302Bridge::stLowerBridge() { - startAnimation(0x88148150, 0, -1); - playSound(1); - NextState(&AsScene1302Bridge::cbLowerBridgeEvent); -} - -void AsScene1302Bridge::stRaiseBridge() { - startAnimation(0x88148150, 7, -1); - _playBackwards = true; - _newStickFrameIndex = 0; - playSound(0); -} - -void AsScene1302Bridge::cbLowerBridgeEvent() { - sendMessage(_parentScene, 0x2032, 0); - startAnimation(0x88148150, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; -} - -SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) - : StaticSprite(vm, 0x11122122, 200) { - - _firstY = _y; - if (getGlobalVar(V_FLYTRAP_RING_FENCE)) - _y += 152; - loadSound(0, 0x7A00400C); - loadSound(1, 0x78184098); - SetUpdateHandler(&SsScene1302Fence::update); - SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteUpdate(NULL); -} - -void SsScene1302Fence::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4808: - playSound(0); - SetMessageHandler(NULL); - SetSpriteUpdate(&SsScene1302Fence::suMoveDown); - break; - case 0x4809: - playSound(1); - SetMessageHandler(NULL); - SetSpriteUpdate(&SsScene1302Fence::suMoveUp); - break; - } - return messageResult; -} - -void SsScene1302Fence::suMoveDown() { - if (_y < _firstY + 152) - _y += 8; - else { - SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteUpdate(NULL); - } -} - -void SsScene1302Fence::suMoveUp() { - if (_y > _firstY) - _y -= 8; - else { - SetMessageHandler(&SsScene1302Fence::handleMessage); - SetSpriteUpdate(NULL); - } -} - -Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene1302::handleMessage); - - setHitRects(0x004B0858); - setRectList(0x004B0A38); - setBackground(0x420643C4); - setPalette(0x420643C4); - insertScreenMouse(0x643C0428); - - _class595 = insertStaticSprite(0xB0420130, 1015); - _sprite1 = insertStaticSprite(0x942FC224, 300); - _sprite2 = insertStaticSprite(0x70430830, 1200); - _sprite2->setVisible(false); - _sprite3 = insertStaticSprite(0x16E01E20, 1100); - _asRing1 = insertSprite(this, false, 218, 122, _class595->getDrawRect().y, false); - _asRing2 = insertSprite(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE)); - _asRing3 = insertSprite(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false); - _asRing4 = insertSprite(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE)); - _asRing5 = insertSprite(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false); - _asBridge = insertSprite(this); - _ssFence = insertSprite(); - _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); - - if (which < 0) { - // Restoring game - insertKlaymen(380, 364); - setMessageList(0x004B0868); - } else { - // Klaymen entering from back - insertKlaymen(293, 330); - setMessageList(0x004B0870); - } - - _klaymen->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); - - _asVenusFlyTrap = insertSprite(this, _klaymen, true); - addCollisionSprite(_asVenusFlyTrap); - - sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap); - -} - -uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x4A845A00) - sendEntityMessage(_klaymen, 0x1014, _asRing1); - else if (param.asInteger() == 0x43807801) { - if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { - sendEntityMessage(_klaymen, 0x1014, _asRing2); - if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) - setMessageList(0x004B0940); - else - setMessageList(0x004B0938); - } else - setMessageList(0x004B0950); - messageResult = 1; - } else if (param.asInteger() == 0x46C26A01) - sendEntityMessage(_klaymen, 0x1014, _asRing3); - else if (param.asInteger() == 0x468C7B11) { - if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) { - sendEntityMessage(_klaymen, 0x1014, _asRing4); - if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) - setMessageList(0x004B0940); - else - setMessageList(0x004B0938); - } else - setMessageList(0x004B0950); - messageResult = 1; - } else if (param.asInteger() == 0x42845B19) - sendEntityMessage(_klaymen, 0x1014, _asRing5); - else if (param.asInteger() == 0x430A6060) { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) - setMessageList2(0x004B0910); - else - cancelMessageList(); - } else if (param.asInteger() == 0x012E2070) { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) - setMessageList2(0x004B0968); - else - cancelMessageList(); - } else if (param.asInteger() == 0x11C40840) { - if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) - setMessageList(0x004B0878); - else - setMessageList(0x004B0978); - } - break; - case 0x2000: - if (_klaymen->getY() > 360) { - sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap); - setMessageList2(0x004B08F0); - } else - setMessageList2(0x004B0920); - break; - case 0x2002: - if (_klaymen->getX() > 545) - leaveScene(1); - break; - case 0x2032: - _sprite2->setVisible(true); - break; - case 0x4806: - sendMessage(_parentModule, 0x1024, 2); - if (sender == _asRing1) - playSound(0, 0x665198C0); - else if (sender == _asRing2) { - sendMessage(_asBridge, 0x4808, 0); - setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); - } else if (sender == _asRing3) - playSound(0, 0xE2D389C0); - else if (sender == _asRing4) { - sendMessage(_ssFence, 0x4808, 0); - setGlobalVar(V_FLYTRAP_RING_FENCE, 1); - } else if (sender == _asRing5) - playSound(0, 0x40428A09); - break; - case 0x4807: - if (sender == _asRing2) { - sendMessage(_asBridge, 0x4809, 0); - setGlobalVar(V_FLYTRAP_RING_BRIDGE, 0); - _sprite2->setVisible(false); - } else if (sender == _asRing4) { - sendMessage(_ssFence, 0x4809, 0); - setGlobalVar(V_FLYTRAP_RING_FENCE, 0); - } else if (sender == _asVenusFlyTrap) { - if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) - sendMessage(_asRing2, 0x4807, 0); - else - sendMessage(_asRing4, 0x4807, 0); - } - break; - case 0x480F: - if (sender == _asRing2) { - playSound(0, 0x60755842); - sendMessage(_asBridge, 0x4808, 0); - setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); - } else if (sender == _asRing4) { - playSound(0, 0x60755842); - sendMessage(_ssFence, 0x4808, 0); - setGlobalVar(V_FLYTRAP_RING_FENCE, 1); - } - break; - case 0x482A: - sendMessage(_asVenusFlyTrap, 0x482B, 0); - break; - case 0x482B: - sendMessage(_asVenusFlyTrap, 0x482A, 0); - break; - case 0x8000: - setSpriteSurfacePriority(_class595, 995); - break; - case 0x8001: - setSpriteSurfacePriority(_class595, 1015); - break; - } - return messageResult; -} - -AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - createSurface(200, 128, 315); - _x = 289; - _y = 390; - startAnimation(0x800278D2, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1303Balloon::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x2000: - stPopBalloon(); - break; - } - return messageResult; -} - -uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x020B0003) - playSound(0, 0x742B0055); - break; - case 0x3002: - playSound(0, 0x470007EE); - stopAnimation(); - setVisible(false); - SetMessageHandler(NULL); - break; - } - return messageResult; -} - -void AsScene1303Balloon::stPopBalloon() { - startAnimation(0xAC004CD0, 0, -1); - SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped); -} - -Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene1303::handleMessage); - - setRectList(0x004AF9E8); - setBackground(0x01581A9C); - setPalette(0x01581A9C); - insertScreenMouse(0x81A9801D); - - if (!getGlobalVar(V_BALLOON_POPPED)) { - _asBalloon = insertSprite(this); - addCollisionSprite(_asBalloon); - } - - _sprite1 = insertStaticSprite(0xA014216B, 1100); - - insertKlaymen(207, 332); - setMessageList(0x004AF9A0); - - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - -} - -uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - setGlobalVar(V_BALLOON_POPPED, 1); - sendMessage(_asBalloon, 0x2000, 0); - break; - case 0x4826: - if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) - setMessageList(0x004AF9B8); - break; - } - return 0; -} - -AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) - : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { - - // NOTE: Skipped check if Klaymen already has the needle since that's done in the scene itself - SetMessageHandler(&AsScene1304Needle::handleMessage); -} - -uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setGlobalVar(V_HAS_NEEDLE, 1); - setVisible(false); - SetMessageHandler(NULL); - break; - } - return messageResult; -} - -Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _asNeedle(NULL) { - - SetMessageHandler(&Scene1304::handleMessage); - - setRectList(0x004B91A8); - setBackground(0x062C0214); - setPalette(0x062C0214); - insertScreenMouse(0xC021006A); - - if (getGlobalVar(V_BALLOON_POPPED)) { - _asKey = insertSprite(this, 0, 1100, 278, 347); - addCollisionSprite(_asKey); - } else { - _asKey = insertSprite(0x80106018, 100, 279, 48); - } - - if (!getGlobalVar(V_HAS_NEEDLE)) { - _asNeedle = insertSprite(this, 1100, 278, 347); - addCollisionSprite(_asNeedle); - } - - _sprite1 = insertStaticSprite(0x0562E621, 1100); - insertStaticSprite(0x012AE033, 1100); - insertStaticSprite(0x090AF033, 1100); - - if (which < 0) { - // Restoring game - insertKlaymen(217, 347); - setMessageList(0x004B90E8); - } else { - // Klaymen entering from the left - insertKlaymen(100, 347); - setMessageList(0x004B90F0); - } - - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - -} - -uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x415634A4) { - if (getGlobalVar(V_BALLOON_POPPED)) - cancelMessageList(); - else - setMessageList(0x004B9158); - } - break; - case 0x4826: - if (sender == _asNeedle) { - sendEntityMessage(_klaymen, 0x1014, _asNeedle); - setMessageList(0x004B9130); - } else if (sender == _asKey) { - sendEntityMessage(_klaymen, 0x1014, _asKey); - setMessageList(0x004B9140); - } - break; - } - return 0; -} - -Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene1305::handleMessage); - - setRectList(0x004B6E98); - setBackground(0x28801B64); - setPalette(0x28801B64); - insertScreenMouse(0x01B60280); - - if (which < 0) { - // Restoring game - insertKlaymen(212, 441); - setMessageList(0x004B6E40); - } else { - // Klaymen enters falling - insertKlaymen(212, 441); - setMessageList(0x004B6E48); - } - -} - -uint32 Scene1305::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - return Scene::handleMessage(messageNum, param, sender); -} - -AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true), - _countdown(0) { - - _x = 320; - _y = 240; - createSurface1(0x043B0270, 100); - startAnimation(0x043B0270, 0, -1); - _newStickFrameIndex = 0; - loadSound(0, 0x1C100E83); - loadSound(1, 0x1C08CEC5); - loadSound(2, 0x5D011E87); - SetMessageHandler(&AsScene1306Elevator::handleMessage); -} - -void AsScene1306Elevator::update() { - if (_isUp && _countdown != 0 && (--_countdown == 0)) - stGoingDown(); - AnimatedSprite::update(); - if (_currFrameIndex == 7) { - playSound(1); - _asElevatorDoor->setVisible(false); - } -} - -void AsScene1306Elevator::upGoingDown() { - AnimatedSprite::update(); - if (_currFrameIndex == 5) - _asElevatorDoor->setVisible(true); -} - -uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2001: - if (_isUp) - _countdown = 144; - messageResult = _isUp ? 1 : 0; - break; - case 0x3002: - gotoNextState(); - break; - case 0x4808: - if (_isDown) - stGoingUp(); - break; - } - return messageResult; -} - -void AsScene1306Elevator::stGoingUp() { - setVisible(true); - _isDown = false; - startAnimation(0x043B0270, 0, -1); - playSound(0); - SetUpdateHandler(&AsScene1306Elevator::update); - NextState(&AsScene1306Elevator::cbGoingUpEvent); -} - -void AsScene1306Elevator::cbGoingUpEvent() { - sendMessage(_parentScene, 0x4808, 0); - _isUp = true; - _countdown = 144; - stopAnimation(); - setVisible(false); - SetUpdateHandler(&AsScene1306Elevator::update); -} - -void AsScene1306Elevator::stGoingDown() { - _isUp = false; - setVisible(true); - startAnimation(0x043B0270, -1, -1); - _playBackwards = true; - playSound(1); - SetUpdateHandler(&AsScene1306Elevator::upGoingDown); - NextState(&AsScene1306Elevator::cbGoingDownEvent); -} - -void AsScene1306Elevator::cbGoingDownEvent() { - _isDown = true; - sendMessage(_parentScene, 0x4809, 0); - stopAnimation(); - SetUpdateHandler(&AsScene1306Elevator::update); -} - -Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) - setGlobalVar(V_KEY3_LOCATION, 4); - - SetMessageHandler(&Scene1306::handleMessage); - - setBackground(0x05303114); - setPalette(0x05303114); - insertScreenMouse(0x0311005B); - - if (getGlobalVar(V_KEY3_LOCATION) == 4) { - _asKey = insertSprite(this, 2, 1100, 435, 445); - addCollisionSprite(_asKey); - } - - _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); - _asTape = insertSprite(this, 19, 1100, 359, 445, 0x9148A011); - _asElevatorDoor = insertSprite(0x043B0270, 90, 320, 240); - _asElevatorDoor->startAnimation(0x043B0270, 6, -1); - _asElevatorDoor->setNewHashListIndex(6); - _asElevator = insertSprite(this, _asElevatorDoor); - _sprite1 = insertStaticSprite(0x036A1EE0, 80); - insertStaticSprite(0x00042313, 1100); - - if (which < 0) { - // Resoring game - insertKlaymen(380, 440); - setMessageList(0x004AFAD0); - sendMessage(this, 0x2000, 0); - addCollisionSprite(_asTape); - } else if (which == 1) { - // Klaymen teleporting in - insertKlaymen(136, 440); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004AFAF0); - sendMessage(this, 0x2000, 1); - addCollisionSprite(_asTape); - } else if (which == 2) { - // Klaymen returning from diskplayer - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(515, 440); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen(355, 440); - } - setMessageList(0x004AFBC8); - sendMessage(this, 0x2000, 0); - addCollisionSprite(_asTape); - } else if (which == 3) { - // Klaymen returning from window - insertKlaymen(534, 440); - setMessageList(0x004AFC30); - sendMessage(this, 0x2000, 0); - addCollisionSprite(_asTape); - } else if (which == 4) { - // Klaymen teleporting out - insertKlaymen(136, 440); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004AFC38); - sendMessage(this, 0x2000, 1); - addCollisionSprite(_asTape); - } else if (which == 5) { - // Klaymen returning from teleporter - insertKlaymen(136, 440); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004AFB00); - sendMessage(this, 0x2000, 1); - addCollisionSprite(_asTape); - } else { - // Klaymen coming up in elevator - insertKlaymen(286, 408); - setSurfacePriority(_asElevator->getSurface(), 1100); - setSurfacePriority(_asElevatorDoor->getSurface(), 1090); - setSurfacePriority(_sprite1->getSurface(), 1080); - sendMessage(this, 0x2000, 0); - SetMessageHandler(&Scene1306::handleMessage416EB0); - clearRectList(); - sendMessage(_asElevator, 0x4808, 0); - } - -} - -Scene1306::~Scene1306() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x01C66840) { - if (sendMessage(_asElevator, 0x2001, 0) != 0) - setMessageList(0x004AFBD8); - else - setMessageList(0x004AFAE0); - } else if (param.asInteger() == 0x8E646E00) { - setMessageList(0x004AFAD8); - clearRectList(); - SetMessageHandler(&Scene1306::handleMessage416EB0); - } - break; - case 0x2000: - if (param.asInteger() != 0) { - setRectList(0x004AFD28); - _klaymen->setKlaymenIdleTable3(); - } else { - setRectList(0x004AFD18); - _klaymen->setKlaymenIdleTable1(); - } - break; - case 0x480B: - if (sender == _ssButton) - sendMessage(_asElevator, 0x4808, 0); - break; - case 0x4826: - if (sender == _asKey) { - if (_klaymen->getX() >= 249) { - sendEntityMessage(_klaymen, 0x1014, _asKey); - setMessageList(0x004AFC58); - } - } else if (sender == _asTape) { - if (_klaymen->getX() >= 249) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004AFC68); - } - } - break; - case 0x482A: - setSurfacePriority(_asElevator->getSurface(), 1100); - setSurfacePriority(_asElevatorDoor->getSurface(), 1090); - setSurfacePriority(_sprite1->getSurface(), 1080); - break; - case 0x482B: - setSurfacePriority(_asElevator->getSurface(), 100); - setSurfacePriority(_asElevatorDoor->getSurface(), 90); - setSurfacePriority(_sprite1->getSurface(), 80); - sendMessage(this, 0x2000, 0); - addCollisionSprite(_asTape); - break; - } - return 0; -} - -uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4808: - setMessageList(0x004AFBD0); - SetMessageHandler(&Scene1306::handleMessage); - break; - case 0x4809: - leaveScene(1); - break; - case 0x482A: - setSurfacePriority(_asElevator->getSurface(), 1100); - setSurfacePriority(_asElevatorDoor->getSurface(), 1090); - setSurfacePriority(_sprite1->getSurface(), 1080); - break; - case 0x482B: - setSurfacePriority(_asElevator->getSurface(), 100); - setSurfacePriority(_asElevatorDoor->getSurface(), 90); - setSurfacePriority(_sprite1->getSurface(), 80); - sendMessage(this, 0x2000, 0); - addCollisionSprite(_asTape); - break; - } - return 0; -} - -static const uint32 kAsScene1307KeyResourceList1[] = { - 0x0438069C, 0x45B0023C, 0x05700217 -}; - -static const uint32 kAsScene1307KeyResourceList2[] = { - 0x04441334, 0x061433F0, 0x06019390 -}; - -static const uint32 kAsScene1307KeyResourceList3[] = { - 0x11A80030, 0x178812B1, 0x1488121C -}; - -static const uint32 *kAsScene1307KeyResourceLists[] = { - kAsScene1307KeyResourceList1, - kAsScene1307KeyResourceList2, - kAsScene1307KeyResourceList3 -}; - -static const int kAsScene1307KeySurfacePriorities[] = { - 700, 500, 300, 100 -}; - -const uint kAsScene1307KeyPointsCount = 12; - -static const NPoint kAsScene1307KeyPoints[] = { - {-2, 0}, {-5, 0}, { 5, 0}, - {12, 0}, {17, 0}, {25, 0}, - {16, -2}, {10, -6}, { 0, -7}, - {-7, -3}, {-3, 4}, { 2, 2} -}; - -const uint kAsScene1307KeyFrameIndicesCount = 20; - -static const int16 kAsScene1307KeyFrameIndices[] = { - 1, 4, 8, 11, 15, 16, 17, 17, 17, 16, - 15, 14, 12, 10, 9, 7, 5, 3, 2, 1 -}; - -const int kAsScene1307KeyDivValue = 200; -const int16 kAsScene1307KeyXDelta = 70; -const int16 kAsScene1307KeyYDelta = -12; - -AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _keyIndex(keyIndex), _clipRects(clipRects), - _isClickable(true) { - - NPoint pt; - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; - - _dataResource.load(0x22102142); - _pointList = _dataResource.getPointArray(0xAC849240); - pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; - _x = pt.x; - _y = pt.y; - createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4], 190, 148); - startAnimation(fileHashes[0], 0, -1); - loadSound(0, 0xDC4A1280); - loadSound(1, 0xCC021233); - loadSound(2, 0xC4C23844); - loadSound(3, 0xC4523208); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1307Key::handleMessage); -} - -uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_isClickable) { - sendMessage(_parentScene, 0x4826, 0); - stRemoveKey(); - messageResult = 1; - } - break; - case 0x2000: - _isClickable = param.asInteger() != 0; - break; - case 0x2001: - setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex, param.asInteger()); - stMoveKey(); - break; - case 0x2003: - playSound(3); - stUnlock(); - break; - case 0x2004: - playSound(2); - stInsert(); - break; - } - return messageResult; -} - -void AsScene1307Key::suRemoveKey() { - if (_pointIndex < kAsScene1307KeyPointsCount) { - _x += kAsScene1307KeyPoints[_pointIndex].x; - _y += kAsScene1307KeyPoints[_pointIndex].y; - updateBounds(); - _pointIndex++; - } else { - SetSpriteUpdate(NULL); - } -} - -void AsScene1307Key::suInsertKey() { - if (_pointIndex < kAsScene1307KeyPointsCount) { - _x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x; - _y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y; - updateBounds(); - _pointIndex++; - if (_pointIndex == 7) - playSound(0); - } else { - SetSpriteUpdate(NULL); - sendMessage(_parentScene, 0x2002, 0); - } -} - -void AsScene1307Key::suMoveKey() { - if (_pointIndex < kAsScene1307KeyFrameIndicesCount) { - _frameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; - _x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue; - _y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue; - updateBounds(); - _pointIndex++; - } else { - NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; - _x = pt.x + kAsScene1307KeyXDelta; - _y = pt.y + kAsScene1307KeyYDelta; - stInsertKey(); - } -} - -void AsScene1307Key::stRemoveKey() { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; - _pointIndex = 0; - startAnimation(fileHashes[0], 0, -1); - playSound(1); - SetSpriteUpdate(&AsScene1307Key::suRemoveKey); -} - -void AsScene1307Key::stInsertKey() { - _pointIndex = 0; - sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]); - setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]); - _newStickFrameIndex = STICK_LAST_FRAME; - SetSpriteUpdate(&AsScene1307Key::suInsertKey); -} - -void AsScene1307Key::stMoveKey() { - NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; - int16 newX = pt.x + kAsScene1307KeyXDelta; - int16 newY = pt.y + kAsScene1307KeyYDelta; - sendMessage(_parentScene, 0x1022, 1000); - setClipRect(0, 0, 640, 480); - _prevX = _x; - _prevY = _y; - if (newX == _x && newY == _y) { - stInsertKey(); - } else { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; - _pointIndex = 0; - _frameIndex = 0; - _deltaX = newX - _x; - _deltaY = newY - _y; - startAnimation(fileHashes[0], 0, -1); - SetSpriteUpdate(&AsScene1307Key::suMoveKey); - } -} - -void AsScene1307Key::stUnlock() { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; - startAnimation(fileHashes[1], 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; -} - -void AsScene1307Key::stInsert() { - const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; - startAnimation(fileHashes[2], 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; -} - -Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _countdown(0), _asCurrKey(NULL), - _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { - - Sprite *tempSprite; - - _vm->gameModule()->initKeySlotsPuzzle(); - - _dataResource.load(0x22102142); - _keyHolePoints = _dataResource.getPointArray(0xAC849240); - - for (uint i = 0; i < 16; i++) { - NPoint pt = (*_keyHolePoints)[i]; - _keyHoleRects[i].x1 = pt.x - 15; - _keyHoleRects[i].y1 = pt.y - 15; - _keyHoleRects[i].x2 = pt.x + 15; - _keyHoleRects[i].y2 = pt.y + 15; - } - - SetMessageHandler(&Scene1307::handleMessage); - SetUpdateHandler(&Scene1307::update); - - setBackground(0xA8006200); - setPalette(0xA8006200); - addEntity(_palette); - insertPuzzleMouse(0x06204A88, 20, 620); - - tempSprite = insertStaticSprite(0x00A3621C, 800); - _clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480); - tempSprite = insertStaticSprite(0x00A3641C, 600); - _clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480); - tempSprite = insertStaticSprite(0x00A3681C, 400); - _clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480); - tempSprite = insertStaticSprite(0x00A3701C, 200); - _clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480); - - for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { - if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) { - _asKeys[keyIndex] = insertSprite(this, keyIndex, _clipRects); - addCollisionSprite(_asKeys[keyIndex]); - } else { - _asKeys[keyIndex] = NULL; - } - } - - loadSound(0, 0x68E25540); - -} - -void Scene1307::update() { - Scene::update(); - if (_countdown && (--_countdown == 0)) - _doLeaveScene = true; - else if (_countdown == 20) - _palette->startFadeToWhite(40); - if (_doLeaveScene && !isSoundPlaying(0)) { - leaveScene(1); - setGlobalVar(V_KEYDOOR_UNLOCKED, 1); - } -} - -uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (!_isPuzzleSolved) { - if (param.asPoint().x > 20 && param.asPoint().x < 620) { - if (_asCurrKey && !_isInsertingKey) { - int16 mouseX = param.asPoint().x; - int16 mouseY = param.asPoint().y; - uint clickedKeyHoleIndex; - for (clickedKeyHoleIndex = 0; clickedKeyHoleIndex < 16; clickedKeyHoleIndex++) { - if (mouseX >= _keyHoleRects[clickedKeyHoleIndex].x1 && mouseX <= _keyHoleRects[clickedKeyHoleIndex].x2 && - mouseY >= _keyHoleRects[clickedKeyHoleIndex].y1 && mouseY <= _keyHoleRects[clickedKeyHoleIndex].y2) - break; - } - if (clickedKeyHoleIndex < 16) { - // Check if the clicked keyhole is already occupied with a key - bool occupied = false; - for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) { - if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex] != _asCurrKey) { - if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, keyIndex) == clickedKeyHoleIndex) - occupied = true; - } - } - if (!occupied) { - // If the keyhole is free, insert the current key - sendMessage(_asCurrKey, 0x2001, clickedKeyHoleIndex); - _isInsertingKey = true; - _mouseClicked = false; - } - } - } - } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) - leaveScene(0); - } - break; - case 0x2002: - // Check if all keys are in the correct keyholes - if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) && - getSubVar(VA_IS_KEY_INSERTED, 1) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 1) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1) && - getSubVar(VA_IS_KEY_INSERTED, 2) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 2) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)) { - // Play unlock animations for all keys - for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { - if (_asKeys[keyIndex]) - sendMessage(_asKeys[keyIndex], 0x2003, 1); - } - playSound(0); - _isPuzzleSolved = true; - _countdown = 47; - } else { - for (uint keyIndex = 0; keyIndex < 3; keyIndex++) - if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex]) - sendMessage(_asKeys[keyIndex], 0x2000, 1); - sendMessage(_asCurrKey, 0x2004, 1); - } - _asCurrKey = NULL; - _isInsertingKey = false; - break; - case 0x4826: - _asCurrKey = (Sprite*)sender; - for (uint keyIndex = 0; keyIndex < 3; keyIndex++) - if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex]) - sendMessage(_asKeys[keyIndex], 0x2000, 0); - break; - } - return messageResult; -} - -static const uint32 kScene1308NumberFileHashes[] = { - 0x08006320, 0x10006320, 0x20006320, - 0x40006320, 0x80006320, 0x00006321, - 0x00006322, 0x00006324, 0x00006328, - 0x08306320, 0x10306320, 0x20306320, - 0x40306320, 0x80306320, 0x00306321, - 0x00306322 -}; - -AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) { - - setVisible(false); - stopAnimation(); - SetMessageHandler(&AsScene1308JaggyDoor::handleMessage); -} - -uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - case 0x4808: - stOpenDoor(); - break; - case 0x4809: - stCloseDoor(); - break; - } - return messageResult; -} - -void AsScene1308JaggyDoor::stOpenDoor() { - startAnimation(0xBA0AE050, 0, -1); - setVisible(true); - playSound(0, calcHash("fxDoorOpen38")); - NextState(&AsScene1308JaggyDoor::stOpenDoorDone); -} - -void AsScene1308JaggyDoor::stOpenDoorDone() { - sendMessage(_parentScene, 0x2000, 0); - stopAnimation(); - setVisible(false); -} - -void AsScene1308JaggyDoor::stCloseDoor() { - startAnimation(0xBA0AE050, -1, -1); - _playBackwards = true; - setVisible(true); - playSound(0, calcHash("fxDoorClose38")); - NextState(&AsScene1308JaggyDoor::stCloseDoorDone); -} - -void AsScene1308JaggyDoor::stCloseDoorDone() { - sendMessage(_parentScene, 0x2001, 0); - stopAnimation(); -} - -AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) { - - playSound(0, 0x51456049); - SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage); - NextState(&AsScene1308KeyboardDoor::stFallingKeys); -} - -uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1308KeyboardDoor::stFallingKeys() { - startAnimation(0x6238B191, 0, -1); - _x = 580; - _y = 383; - NextState(&AsScene1308KeyboardDoor::stFallingKeysDone); -} - -void AsScene1308KeyboardDoor::stFallingKeysDone() { - sendMessage(_parentScene, 0x2004, 0); - stopAnimation(); - setVisible(false); -} - -AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) { - - setVisible(false); - stopAnimation(); - Entity::_priority = 1200; - SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage); -} - -uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2002: - stFadeIn(); - break; - case 0x2003: - stFadeOut(); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1308LightWallSymbols::stFadeIn() { - startAnimation(0x80180A10, 0, -1); - setVisible(true); - _newStickFrameIndex = STICK_LAST_FRAME; -} - -void AsScene1308LightWallSymbols::stFadeOut() { - startAnimation(0x80180A10, -1, -1); - _playBackwards = true; - NextState(&AsScene1308LightWallSymbols::stFadeOutDone); -} - -void AsScene1308LightWallSymbols::stFadeOutDone() { - sendMessage(_parentScene, 0x2003, 0); - stopAnimation(); - setVisible(false); -} - -SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index) - : StaticSprite(vm, fileHash, 100) { - - setVisible(false); - _x = _spriteResource.getPosition().x + index * 20; - updatePosition(); -} - -AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - _x = 286; - _y = 429; - createSurface1(0xA282C472, 100); - startAnimation(0xA282C472, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1308Mouse::handleMessage); -} - -uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x66382026) - playSound(0, 0x0CD84468); - else if (param.asInteger() == 0x6E28061C) - playSound(0, 0x78C8402C); - else if (param.asInteger() == 0x462F0410) - playSound(0, 0x60984E28); - break; - } - return messageResult; -} - -Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isProjecting(false), _asProjector(NULL) { - - _vm->gameModule()->initKeySlotsPuzzle(); - - SetMessageHandler(&Scene1308::handleMessage); - - setBackground(0x41024202); - setPalette(0x41024202); - insertScreenMouse(0x24206418); - - _asTape = insertSprite(this, 17, 1100, 502, 445, 0x9148A011); - addCollisionSprite(_asTape); - - if (getGlobalVar(V_MOUSE_SUCKED_IN)) { - insertSprite(); - insertSprite(0x461A1490, 200, 235, 429); - } - - _sprite1 = insertStaticSprite(0x0A042060, 1100); - _asJaggyDoor = insertSprite(this); - _asLightWallSymbols = insertSprite(this); - _ssNumber1 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0); - _ssNumber2 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1); - _ssNumber3 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2); - _sprite2 = insertStaticSprite(0x40043120, 995); - _sprite3 = insertStaticSprite(0x43003100, 995); - _sprite4 = NULL; - - if (which < 0) { - // Restoring game - insertKlaymen(380, 440); - setMessageList(0x004B57C0); - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { - _sprite4 = insertStaticSprite(0x0101A624, 1100); - setRectList(0x004B5990); - } else { - _sprite5 = insertStaticSprite(0x080811A0, 100); - setRectList(0x004B5980); - } - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 440); - setMessageList(0x004B57C8); - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { - _sprite4 = insertStaticSprite(0x0101A624, 1100); - setRectList(0x004B5990); - } else { - _sprite5 = insertStaticSprite(0x080811A0, 100); - setRectList(0x004B5980); - } - } else if (which == 2) { - // Klaymen returning from keyslots panel - insertKlaymen(475, 440); - setMessageList(0x004B58B0); - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { - _sprite5 = insertSprite(this); - _sprite4 = insertStaticSprite(0x0101A624, 1100); - _sprite4->setVisible(false); - } else { - _sprite5 = insertStaticSprite(0x080811A0, 100); - setRectList(0x004B5980); - } - } else { - // Klaymen entering from the left - insertKlaymen(41, 440); - setMessageList(0x004B57D0); - sendMessage(_asJaggyDoor, 0x4808, 0); - _sprite1->setVisible(false); - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { - _sprite4 = insertStaticSprite(0x0101A624, 1100); - _klaymen->setVisible(false); - } else { - _sprite5 = insertStaticSprite(0x080811A0, 100); - _klaymen->setVisible(false); - } - } - - if (_sprite4) - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480); - else - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - - if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { - _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); - addCollisionSprite(_asProjector); - _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); - _asProjector->setRepl(64, 0); - } - -} - -uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x88C11390) { - setRectList(0x004B59A0); - _isProjecting = true; - } else if (param.asInteger() == 0x08821382) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) - setRectList(0x004B5990); - else - setRectList(0x004B5980); - _isProjecting = false; - } else if (param.asInteger() == 0x4AC68808) { - clearRectList(); - sendMessage(_asJaggyDoor, 0x4809, 0); - _sprite1->setVisible(false); - _klaymen->setVisible(false); - } - break; - case 0x1022: - if (sender == _asProjector) { - if (param.asInteger() >= 1000) - setSurfacePriority(_sprite3->getSurface(), 1100); - else - setSurfacePriority(_sprite3->getSurface(), 995); - } - break; - case 0x2000: - if (getGlobalVar(V_KEYDOOR_UNLOCKED)) - setRectList(0x004B5990); - else - setRectList(0x004B5980); - setMessageList(0x004B57E8, false); - _sprite1->setVisible(true); - _klaymen->setVisible(true); - break; - case 0x2001: - leaveScene(0); - break; - case 0x2003: - _ssNumber1->setVisible(false); - _ssNumber2->setVisible(false); - _ssNumber3->setVisible(false); - break; - case 0x2004: - _sprite4->setVisible(true); - setRectList(0x004B5990); - break; - case 0x4807: - sendMessage(_asLightWallSymbols, 0x2003, 0); - break; - case 0x480F: - sendMessage(_asLightWallSymbols, 0x2002, 0); - _ssNumber1->setVisible(true); - _ssNumber2->setVisible(true); - _ssNumber3->setVisible(true); - break; - case 0x4826: - if (sender == _asProjector) { - if (_isProjecting) - setMessageList2(0x004B5868); - else { - if (param.asInteger() == 1) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B5848); - } else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() <= _asProjector->getX() ? 0 : 1) != 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B5830); - } else - setMessageList2(0x004B5800); - } - } else if (sender == _asTape) { - if (_isProjecting) - setMessageList2(0x004B5868); - else if (_messageListStatus != 2) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList2(0x004B58E0); - } - } - break; - } - return 0; -} - -Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene1317::handleMessage); - _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); - _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); - insertScreenMouse(0x08284011); - showMouse(false); - _smackerFileHash = 0; - _keepLastSmackerFrame = false; -} - -void Scene1317::update() { - if (_smackerFileHash) { - _smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame); - _smackerFileHash = 0; - } - Scene::update(); -} - -void Scene1317::upChooseKing() { - if (!_klaymenBlinks && _klaymenBlinkCountdown != 0 && (--_klaymenBlinkCountdown == 0)) - _klaymenBlinks = true; - - if (!_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) { - _smackerPlayer->rewind(); - } else if (_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) { - _smackerPlayer->rewind(); - _klaymenBlinks = false; - _klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; - } - - if (!_klaymenBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0)) - stNoDecisionYet(); - - if (_smackerFileHash) { - _smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame); - _smackerFileHash = 0; - } - - Scene::update(); - -} - -uint32 Scene1317::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - stChooseKing(); - break; - } - return messageResult; -} - -uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x >= 21 && param.asPoint().y >= 24 && - param.asPoint().x <= 261 && param.asPoint().y <= 280) { - stHoborgAsKing(); - } else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 && - param.asPoint().x <= 399 && param.asPoint().y <= 379) { - stKlaymenAsKing(); - } else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 && - param.asPoint().x <= 418 && param.asPoint().y <= 474) { - stKlaymenAsKing(); - } - break; - } - return messageResult; -} - -uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - stEndMovie(); - break; - } - return messageResult; -} - -uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - leaveScene(0); - break; - } - return messageResult; -} - -void Scene1317::stChooseKing() { - showMouse(true); - _smackerFileHash = 0x10982841; - _keepLastSmackerFrame = true; - _decisionCountdown = 450; - _klaymenBlinks = false; - _klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; - SetMessageHandler(&Scene1317::hmChooseKing); - SetUpdateHandler(&Scene1317::upChooseKing); -} - -void Scene1317::stNoDecisionYet() { - showMouse(false); - _smackerFileHash = 0x20982841; - _keepLastSmackerFrame = false; - SetMessageHandler(&Scene1317::handleMessage); - SetUpdateHandler(&Scene1317::update); -} - -void Scene1317::stHoborgAsKing() { - showMouse(false); - _smackerFileHash = 0x40982841; - _keepLastSmackerFrame = false; - SetMessageHandler(&Scene1317::hmHoborgAsKing); - SetUpdateHandler(&Scene1317::update); -} - -void Scene1317::stKlaymenAsKing() { - showMouse(false); - _smackerFileHash = 0x80982841; - _keepLastSmackerFrame = false; - SetMessageHandler(&Scene1317::hmEndMovie); - SetUpdateHandler(&Scene1317::update); -} - -void Scene1317::stEndMovie() { - showMouse(false); - _smackerFileHash = 0x40800711; - _keepLastSmackerFrame = false; - SetMessageHandler(&Scene1317::hmEndMovie); - SetUpdateHandler(&Scene1317::update); -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1300.h b/engines/neverhood/module1300.h deleted file mode 100644 index 147bfd0645..0000000000 --- a/engines/neverhood/module1300.h +++ /dev/null @@ -1,295 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1300_H -#define NEVERHOOD_MODULE1300_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/smackerplayer.h" - -namespace Neverhood { - -// Module1300 - -class Module1300 : public Module { -public: - Module1300(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1300(); -protected: - int _sceneNum; - uint32 _musicFileHash; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -class AsScene1302Bridge : public AnimatedSprite { -public: - AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stLowerBridge(); - void stRaiseBridge(); - void cbLowerBridgeEvent(); -}; - -class SsScene1302Fence : public StaticSprite { -public: - SsScene1302Fence(NeverhoodEngine *vm); -protected: - int16 _firstY; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoveDown(); - void suMoveUp(); -}; - -class Scene1302 : public Scene { -public: - Scene1302(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_asVenusFlyTrap; - Sprite *_asBridge; - Sprite *_ssFence; - Sprite *_asRing1; - Sprite *_asRing2; - Sprite *_asRing3; - Sprite *_asRing4; - Sprite *_asRing5; - Sprite *_class595; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1303Balloon : public AnimatedSprite { -public: - AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender); - void stPopBalloon(); -}; - -class Scene1303 : public Scene { -public: - Scene1303(NeverhoodEngine *vm, Module *parentModule); -protected: - Sprite *_sprite1; - Sprite *_asBalloon; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1304Needle : public AnimatedSprite { -public: - AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1304 : public Scene { -public: - Scene1304(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_sprite1; - Sprite *_asKey; - Sprite *_asNeedle; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1305 : public Scene { -public: - Scene1305(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1306Elevator : public AnimatedSprite { -public: - AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor); -protected: - Scene *_parentScene; - AnimatedSprite *_asElevatorDoor; - bool _isUp; - bool _isDown; - int _countdown; - void update(); - void upGoingDown(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stGoingUp(); - void cbGoingUpEvent(); - void stGoingDown(); - void cbGoingDownEvent(); -}; - -class Scene1306 : public Scene { -public: - Scene1306(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene1306(); -protected: - Sprite *_ssButton; - Sprite *_asTape; - AnimatedSprite *_asElevatorDoor; - Sprite *_asElevator; - Sprite *_sprite1; - Sprite *_asKey; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1307Key : public AnimatedSprite { -public: - AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects); -protected: - Scene *_parentScene; - NPointArray *_pointList; - uint _pointIndex; - int _frameIndex; - uint _keyIndex; - NRect *_clipRects; - bool _isClickable; - int16 _prevX, _prevY; - int16 _deltaX, _deltaY; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suRemoveKey(); - void suInsertKey(); - void suMoveKey(); - void stRemoveKey(); - void stInsertKey(); - void stMoveKey(); - void stUnlock(); - void stInsert(); -}; - -class Scene1307 : public Scene { -public: - Scene1307(NeverhoodEngine *vm, Module *parentModule); -protected: - NPointArray *_keyHolePoints; - NRect _keyHoleRects[16]; - NRect _clipRects[4]; - Sprite *_asKeys[3]; - int _countdown; - Sprite *_asCurrKey; - bool _isInsertingKey; - bool _doLeaveScene; - bool _isPuzzleSolved; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene1308JaggyDoor : public AnimatedSprite { -public: - AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stOpenDoorDone(); - void stCloseDoor(); - void stCloseDoorDone(); -}; - -class AsScene1308KeyboardDoor : public AnimatedSprite { -public: - AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stFallingKeys(); - void stFallingKeysDone(); -}; - -class AsScene1308LightWallSymbols : public AnimatedSprite { -public: - AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stFadeIn(); - void stFadeOut(); - void stFadeOutDone(); -}; - -class SsScene1308Number : public StaticSprite { -public: - SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index); -}; - -class AsScene1308Mouse : public AnimatedSprite { -public: - AsScene1308Mouse(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1308 : public Scene { -public: - Scene1308(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_asTape; - Sprite *_asJaggyDoor; - Sprite *_asLightWallSymbols; - Sprite *_ssNumber1; - Sprite *_ssNumber2; - Sprite *_ssNumber3; - AnimatedSprite *_asProjector; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_sprite4; - Sprite *_sprite5; - bool _isProjecting; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1317 : public Scene { -public: - Scene1317(NeverhoodEngine *vm, Module *parentModule); -protected: - SmackerPlayer *_smackerPlayer; - bool _klaymenBlinks; - int _klaymenBlinkCountdown; - int _decisionCountdown; - uint32 _smackerFileHash; - bool _keepLastSmackerFrame; - void update(); - void upChooseKing(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender); - void stChooseKing(); - void stNoDecisionYet(); - void stHoborgAsKing(); - void stKlaymenAsKing(); - void stEndMovie(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1300_H */ diff --git a/engines/neverhood/module1400.cpp b/engines/neverhood/module1400.cpp deleted file mode 100644 index 8aa0632e90..0000000000 --- a/engines/neverhood/module1400.cpp +++ /dev/null @@ -1,1621 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1400.h" -#include "neverhood/module1000.h" -#include "neverhood/module2100.h" -#include "neverhood/module2200.h" -#include "neverhood/diskplayerscene.h" -#include "neverhood/gamemodule.h" - -namespace Neverhood { - -Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - _vm->_soundMan->addMusic(0x00AD0012, 0x06333232); - _vm->_soundMan->addMusic(0x00AD0012, 0x624A220E); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else - createScene(0, 0); - -} - -Module1400::~Module1400() { - _vm->_soundMan->deleteMusicGroup(0x00AD0012); -} - -void Module1400::createScene(int sceneNum, int which) { - debug("Module1400::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->_soundMan->startMusic(0x06333232, 0, 2); - _childObject = new Scene1401(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->_soundMan->stopMusic(0x06333232, 0, 2); - _vm->_soundMan->stopMusic(0x624A220E, 0, 2); - _childObject = new Scene1402(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->stopMusic(0x06333232, 0, 2); - _vm->_soundMan->startMusic(0x624A220E, 0, 2); - _childObject = new Scene1403(_vm, this, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - _vm->_soundMan->startMusic(0x06333232, 0, 2); - _childObject = new Scene1404(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->startMusic(0x06333232, 0, 2); - _childObject = new Scene1405(_vm, this); - break; - case 5: - _vm->gameState().sceneNum = 5; - _vm->_soundMan->stopMusic(0x06333232, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 2); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->_soundMan->stopMusic(0x06333232, 0, 2); - _childObject = new Scene1407(_vm, this); - break; - } - SetUpdateHandler(&Module1400::updateScene); - _childObject->handleUpdate(); -} - -void Module1400::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(1, 0); - else if (_moduleResult == 2) - createScene(3, 0); - else - leaveModule(0); - break; - case 1: - if (_moduleResult == 1) - createScene(2, 0); - else if (_moduleResult == 2) - createScene(6, -1); - else - createScene(0, 1); - break; - case 2: - createScene(1, 1); - break; - case 3: - if (_moduleResult == 1) - createScene(4, 0); - else if (_moduleResult == 2) - createScene(5, -1); - else - createScene(0, 2); - break; - case 4: - createScene(3, 1); - break; - case 5: - createScene(3, 2); - break; - case 6: - createScene(1, 2); - break; - } - } -} - -// Scene1401 - -AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) { - - createSurface(900, 152, 147); - _x = 454; - _y = 217; - startAnimation(0x4C210500, 0, -1); - SetUpdateHandler(&AsScene1401Pipe::update); - SetMessageHandler(&AsScene1401Pipe::handleMessage); -} - -AsScene1401Pipe::~AsScene1401Pipe() { - _vm->_soundMan->deleteSoundGroup(0x01104C08); -} - -void AsScene1401Pipe::update() { - AnimatedSprite::update(); - if (_countdown1 != 0 && (--_countdown1 == 0)) - stDoneSucking(); - if (_countdown2 != 0 && (--_countdown2 == 0)) { - _vm->_soundMan->addSound(0x01104C08, 0x4A116437); - _vm->_soundMan->playSoundLooping(0x4A116437); - } -} - -void AsScene1401Pipe::upSuckInProjector() { - AnimatedSprite::update(); - if (_countdown1 != 0) - _countdown1--; -} - -uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x0A8A1490) - playSound(1, 0x6AB6666F); - break; - case 0x2000: - _countdown1 = 70; - _countdown2 = 8; - stStartSucking(); - break; - case 0x483A: - stSuckInProjector(); - break; - } - return messageResult; -} - -uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - if (_countdown1 != 0) - stStartSucking(); - else - stDoneSucking(); - SetMessageHandler(&AsScene1401Pipe::handleMessage); - SetUpdateHandler(&AsScene1401Pipe::update); - break; - } - return messageResult; -} - -void AsScene1401Pipe::stStartSucking() { - startAnimation(0x4C240100, 0, -1); - playSound(0, 0x4A30063F); -} - -void AsScene1401Pipe::stDoneSucking() { - _vm->_soundMan->deleteSound(0x4A116437); - playSound(0, 0x4A120435); - startAnimation(0x4C210500, 0, -1); -} - -void AsScene1401Pipe::stSuckInProjector() { - startAnimation(0x6C210810, 0, -1); - SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector); - SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector); -} - -AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - createSurface(100, 71, 41); - _x = 478; - _y = 433; - startAnimation(0xA282C472, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1401Mouse::handleMessage); -} - -uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x66382026) - playSound(0, 0x0CD84468); - else if (param.asInteger() == 0x6E28061C) - playSound(0, 0x78C8402C); - else if (param.asInteger() == 0x462F0410) - playSound(0, 0x60984E28); - break; - case 0x4839: - stSuckedIn(); - break; - } - return messageResult; -} - -void AsScene1401Mouse::suSuckedIn() { - AnimatedSprite::updateDeltaXY(); - if (_collisionBounds.y1 <= 150) { - playSound(0, 0x0E32247F); - stopAnimation(); - setVisible(false); - SetMessageHandler(NULL); - SetSpriteUpdate(NULL); - } -} - -void AsScene1401Mouse::stSuckedIn() { - startAnimation(0x34880040, 0, -1); - SetSpriteUpdate(&AsScene1401Mouse::suSuckedIn); -} - -AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - createSurface(200, 152, 147); - _x = 427; - _y = 433; - startAnimation(0x461A1490, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1401Cheese::handleMessage); -} - -uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4839: - stSuckedIn(); - break; - } - return messageResult; -} - -void AsScene1401Cheese::suSuckedIn() { - AnimatedSprite::updateDeltaXY(); - if (_collisionBounds.y1 <= 150) { - playSound(0, 0x18020439); - stopAnimation(); - setVisible(false); - SetMessageHandler(NULL); - SetSpriteUpdate(NULL); - } -} - -void AsScene1401Cheese::stSuckedIn() { - startAnimation(0x103B8020, 0, -1); - SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn); -} - -AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen) - : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0), _isOpen(isOpen) { - - _x = 320; - _y = 240; - createSurface1(0x04551900, 100); - if (isOpen) { - startAnimation(0x04551900, -1, -1); - _countdown = 48; - } else { - stopAnimation(); - setVisible(false); - } - _newStickFrameIndex = STICK_LAST_FRAME; - SetUpdateHandler(&AsScene1401BackDoor::update); - SetMessageHandler(&AsScene1401BackDoor::handleMessage); -} - -void AsScene1401BackDoor::update() { - if (_countdown != 0 && (--_countdown == 0)) - stCloseDoor(); - AnimatedSprite::update(); -} - - -uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2001: - if (_isOpen) - _countdown = 168; - messageResult = _isOpen ? 1 : 0; - break; - case 0x3002: - gotoNextState(); - break; - case 0x4808: - _countdown = 168; - if (!_isOpen) - stOpenDoor(); - break; - } - return messageResult; -} - -void AsScene1401BackDoor::stOpenDoor() { - _isOpen = true; - setVisible(true); - startAnimation(0x04551900, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - playSound(0, calcHash("fxDoorOpen24")); -} - -void AsScene1401BackDoor::stCloseDoor() { - _isOpen = false; - setVisible(true); - startAnimation(0x04551900, -1, -1); - playSound(0, calcHash("fxDoorClose24")); - _playBackwards = true; - NextState(&AsScene1401BackDoor::stCloseDoorDone); -} - -void AsScene1401BackDoor::stCloseDoorDone() { - stopAnimation(); - setVisible(false); -} - -static const AsCommonProjectorItem kAsCommonProjectorItems[] = { - {{154, 453}, 4, 2, 0, 0, 1}, - {{104, 391}, 4, -1, -1, 1, 1}, - {{ 22, 447}, 6, -1, -1, 1, 1}, - {{112, 406}, 2, -1, -1, 1, 0}, - {{262, 433}, 1, 1, 0, 0, 0} -}; - -AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _asPipe(asPipe) { - - _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)]; - createSurface(990, 101, 182); - startAnimation(0x10E3042B, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsCommonProjector::handleMessage); - _x = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; - _lockedInSlot = true; - moveProjector(); - setDoDeltaX(1); - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) - stStayLockedInSlot(); - loadSound(2, 0xC8C2507C); -} - -AsCommonProjector::~AsCommonProjector() { - _vm->_soundMan->deleteSoundGroup(0x05331081); -} - -uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4807: - setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108); - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) - stStartLockedInSlot(); - else - stIdle(); - break; - case 0x480B: - if (param.asInteger() != 1) { - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) - incGlobalVar(V_PROJECTOR_SLOT, 1); - } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) - incGlobalVar(V_PROJECTOR_SLOT, -1); - stMoving(); - break; - case 0x480C: - // Check if the projector can be moved - if (param.asInteger() != 1) - messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; - else - messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - case 0x4839: - stStartSuckedIn(); - break; - } - return messageResult; -} - -uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 && - param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) { - sendMessage(_parentScene, 0x4826, 1); - } else - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4807: - sendMessage(_parentScene, 0x4807, 0); - stStopProjecting(); - break; - case 0x480B: - if (param.asInteger() != 1) { - if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) - incGlobalVar(V_PROJECTOR_SLOT, 1); - } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) - incGlobalVar(V_PROJECTOR_SLOT, -1); - stTurnToFront(); - break; - case 0x480C: - // Check if the projector can be moved - if (param.asInteger() != 1) - messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; - else - messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; - break; - case 0x480F: - stStartProjecting(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsCommonProjector::suMoving() { - if (_x <= _klaymen->getX()) - _x = _klaymen->getX() - 100; - else - _x = _klaymen->getX() + 100; - moveProjector(); - if (_beforeMoveX == _x) { - if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) { - sendMessage(_parentScene, 0x1019, 0); - incGlobalVar(V_PROJECTOR_LOCATION, -1); - setGlobalVar(V_PROJECTOR_SLOT, kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)].maxSlotCount); - } else if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) { - sendMessage(_parentScene, 0x1019, 1); - incGlobalVar(V_PROJECTOR_LOCATION, +1); - setGlobalVar(V_PROJECTOR_SLOT, 0); - } - } - Sprite::updateBounds(); -} - -void AsCommonProjector::moveProjector() { - - bool nowLockedInSlot = false; - - _y = _asProjectorItem->point.y; - - if (_asProjectorItem->index1 != -1) { - int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x; - if (elX - 20 < _x && elX + 20 > _x) { - nowLockedInSlot = true; - _y = _asProjectorItem->point.y + 10; - } - } - - if (_asProjectorItem->lockSlotIndex != -1) { - int16 elX = _asProjectorItem->lockSlotIndex * 108 + _asProjectorItem->point.x; - if (elX - 20 < _x && elX + 20 > _x) { - nowLockedInSlot = true; - _y = _asProjectorItem->point.y + 10; - } - } - - if (_lockedInSlot && !nowLockedInSlot) - _lockedInSlot = false; - else if (!_lockedInSlot && nowLockedInSlot) { - playSound(1, 0x5440E474); - _lockedInSlot = true; - } - -} - -void AsCommonProjector::stSuckedIn() { - AnimatedSprite::updateDeltaXY(); - if (_collisionBounds.y1 <= 150) { - sendMessage(_asPipe, 0x483A, 0); - stopAnimation(); - setVisible(false); - SetMessageHandler(&Sprite::handleMessage); - SetSpriteUpdate(NULL); - } -} - -void AsCommonProjector::stIdle() { - startAnimation(0x10E3042B, 0, -1); - SetMessageHandler(&AsCommonProjector::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsCommonProjector::stMoving() { - _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; - startAnimation(0x14A10137, 0, -1); - playSound(1, 0xEC008474); - SetMessageHandler(&AsCommonProjector::handleMessage); - SetSpriteUpdate(&AsCommonProjector::suMoving); -} - -void AsCommonProjector::stStartLockedInSlot() { - startAnimation(0x80C32213, 0, -1); - SetMessageHandler(&AsCommonProjector::hmAnimation); - SetSpriteUpdate(NULL); - NextState(&AsCommonProjector::stStayLockedInSlot); -} - -void AsCommonProjector::stStayLockedInSlot() { - startAnimation(0xD23B207F, 0, -1); - SetMessageHandler(&AsCommonProjector::hmLockedInSlot); - SetSpriteUpdate(NULL); -} - -void AsCommonProjector::stStartProjecting() { - startAnimation(0x50A80517, 0, -1); - setGlobalVar(V_PROJECTOR_ACTIVE, 1); - playSound(0, 0xCC4A8456); - _vm->_soundMan->addSound(0x05331081, 0xCE428854); - _vm->_soundMan->playSoundLooping(0xCE428854); - SetMessageHandler(&AsCommonProjector::hmAnimation); - SetSpriteUpdate(NULL); - NextState(&AsCommonProjector::stLockedInSlot); -} - -void AsCommonProjector::stLockedInSlot() { - sendMessage(_parentScene, 0x480F, 0); - startAnimation(0xD833207F, 0, -1); - SetMessageHandler(&AsCommonProjector::hmLockedInSlot); - SetSpriteUpdate(NULL); -} - -void AsCommonProjector::stStopProjecting() { - startAnimation(0x50A94417, 0, -1); - setGlobalVar(V_PROJECTOR_ACTIVE, 0); - playSound(0, 0xCC4A8456); - _vm->_soundMan->deleteSound(0xCE428854); - SetMessageHandler(&AsCommonProjector::hmAnimation); - SetSpriteUpdate(NULL); - NextState(&AsCommonProjector::stStayLockedInSlot); -} - -void AsCommonProjector::stTurnToFront() { - _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; - startAnimation(0x22CB4A33, 0, -1); - SetMessageHandler(&AsCommonProjector::hmAnimation); - SetSpriteUpdate(&AsCommonProjector::suMoving); - NextState(&AsCommonProjector::stMoving); -} - -void AsCommonProjector::stStartSuckedIn() { - setGlobalVar(V_PROJECTOR_LOCATION, 4); - setGlobalVar(V_PROJECTOR_SLOT, 0); - startAnimation(0x708D4712, 0, -1); - playSound(2); - SetMessageHandler(&Sprite::handleMessage); - SetSpriteUpdate(&AsCommonProjector::stSuckedIn); -} - -Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), - _asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), - _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { - - SetMessageHandler(&Scene1401::handleMessage); - SetUpdateHandler(&Scene1401::update); - - setRectList(0x004B6758); - setBackground(0x08221FA5); - setPalette(0x08221FA5); - insertScreenMouse(0x21FA108A); - - _ssFloorButton = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); - _asPipe = insertSprite(); - - if (!getGlobalVar(V_MOUSE_SUCKED_IN)) { - _asMouse = insertSprite(); - _asCheese = insertSprite(); - } - - _sprite3 = insertStaticSprite(0xA82BA811, 1100); - insertStaticSprite(0x0A116C60, 1100); - _ssButton = insertSprite(this, 0xB84B1100, 100, 0); - _sprite1 = insertStaticSprite(0x38EA100C, 1005); - _sprite2 = insertStaticSprite(0x98D0223C, 1200); - _sprite2->setVisible(false); - - if (which < 0) { - // Restoring game - insertKlaymen(380, 447); - setMessageList(0x004B65C8); - _sprite1->setVisible(false); - } else if (which == 1) { - // Klaymen entering from the left - insertKlaymen(0, 447); - setMessageList(0x004B65D0); - _sprite1->setVisible(false); - } else if (which == 2) { - // Klaymen entering from the right - insertKlaymen(660, 447); - setMessageList(0x004B65D8); - _sprite1->setVisible(false); - } else { - // Klaymen entering from the back - insertKlaymen(290, 413); - setMessageList(0x004B65E8); - _sprite1->setVisible(false); - } - - if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) { - _asProjector = insertSprite(this, _klaymen, _asPipe); - addCollisionSprite(_asProjector); - if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - _klaymen->setX(_asProjector->getX() + 100); - _klaymen->updateBounds(); - setMessageList(0x004B6670); - } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - _klaymen->setX(_asProjector->getX() - 100); - _klaymen->updateBounds(); - setMessageList(0x004B6670); - } - _asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); - } - - _klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); - - if (which == 0 && _asProjector) - sendMessage(_asProjector, 0x482B, 0); - - _asBackDoor = insertSprite(_klaymen, which == 0); - -} - -void Scene1401::update() { - Scene::update(); - if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) { - _sprite2->setVisible(true); - _projectorBorderFlag = true; - } else - _sprite2->setVisible(false); -} - -uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02144CB1) - sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); - else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x01C66840) { - if (sendMessage(_asBackDoor, 0x2001, 0) != 0) - setMessageList(0x004B6690); - else - setMessageList(0x004B66B0); - } - break; - case 0x1019: - if (param.asInteger() != 0) - leaveScene(2); - else - leaveScene(1); - break; - case 0x480B: - if (sender == _ssFloorButton) { - sendMessage(_asPipe, 0x2000, 0); - if (!getGlobalVar(V_MOUSE_SUCKED_IN)) { - sendMessage(_asMouse, 0x4839, 0); - sendMessage(_asCheese, 0x4839, 0); - setGlobalVar(V_MOUSE_SUCKED_IN, 1); - } - if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) - sendMessage(_asProjector , 0x4839, 0); - } else if (sender == _ssButton) - sendMessage(_asBackDoor, 0x4808, 0); - break; - case 0x4826: - if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B6658); - } else - setMessageList2(0x004B65F0); - } - break; - case 0x482A: - _sprite1->setVisible(true); - if (_asProjector) - sendMessage(_asProjector, 0x482B, 0); - break; - case 0x482B: - _sprite1->setVisible(false); - if (_asProjector) - sendMessage(_asProjector, 0x482A, 0); - break; - } - return 0; -} - -// Scene1402 - -SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) - : StaticSprite(vm, fileHash, surfacePriority) { - - SetFilterY(&Sprite::defFilterY); - SetUpdateHandler(&StaticSprite::updatePosition); -} - -AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - createSurface(900, 347, 230); - - SetFilterY(&Sprite::defFilterY); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1402PuzzleBox::handleMessage); - _x = 279; - _y = 270; - if (status == 2) { - // Puzzle box after the puzzle was solved - startAnimation(0x20060259, 0, -1); - playSound(0, 0x419014AC); - loadSound(1, 0x61901C29); - NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone); - } else if (status == 1) { - // Puzzle box appears - startAnimation(0x210A0213, 0, -1); - playSound(0, 0x41809C6C); - NextState(&AsScene1402PuzzleBox::stMoveUpDone); - } else { - // Puzzle box is here - startAnimation(0x20060259, -1, -1); - loadSound(1, 0x61901C29); - _newStickFrameIndex = STICK_LAST_FRAME; - } -} - -uint32 AsScene1402PuzzleBox::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2002: - playSound(1); - startAnimation(0x20060259, -1, -1); - _playBackwards = true; - NextState(&AsScene1402PuzzleBox::stMoveDownDone); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1402PuzzleBox::stMoveUpDone() { - sendMessage(_parentScene, 0x2000, 0); - stopAnimation(); - setVisible(false); -} - -void AsScene1402PuzzleBox::stMoveDownDone() { - sendMessage(_parentScene, 0x2001, 0); - stopAnimation(); - setVisible(false); -} - -void AsScene1402PuzzleBox::stMoveDownSolvedDone() { - sendMessage(_parentScene, 0x2003, 0); - stopAnimation(); -} - -Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) { - - SetMessageHandler(&Scene1402::handleMessage); - - _vm->_screen->setYOffset(0); - - setBackground(0x231482F0); - setBackgroundY(-10); - setPalette(0x231482F0); - _palette->addPalette(0x91D3A391, 0, 64, 0); - insertScreenMouse(0x482F4239); - - _ssBridgePart1 = insertSprite(0x15402D64, 1100); - _ssBridgePart2 = insertSprite(0x10A02120, 1100); - _ssBridgePart3 = insertSprite(0x60882BE0, 1100); - - if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) - setRectList(0x004B0C48); - else - setRectList(0x004B0C98); - - if (which < 0) { - // Restoring game - insertKlaymen(377, 391); - setMessageList(0x004B0B48); - if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) - _asPuzzleBox = insertSprite(this, 0); - } else if (which == 1) { - // Klaymen entering from the left - insertKlaymen(42, 391); - setMessageList(0x004B0B50); - } else if (which == 2) { - // Klaymen returning from the puzzle box - insertKlaymen(377, 391); - setMessageList(0x004B0B60); - _klaymen->setDoDeltaX(1); - if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { - _asPuzzleBox = insertSprite(this, 1); - clearRectList(); - showMouse(false); - startShaking(); - } else - _asPuzzleBox = insertSprite(this, 0); - } else { - // Klaymen entering from the right - insertKlaymen(513, 391); - setMessageList(0x004B0B58); - if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { - _asPuzzleBox = insertSprite(this, 2); - startShaking(); - } - } - - if (_asPuzzleBox) - _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); - - if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) { - _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); - addCollisionSprite(_asProjector); - if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - _klaymen->setX(_asProjector->getX() + 100); - _klaymen->updateBounds(); - setMessageList(0x004B0BD0); - } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - _klaymen->setX(_asProjector->getX() - 100); - _klaymen->updateBounds(); - setMessageList(0x004B0BD0); - } - _asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2()); - } - - _klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); - -} - -void Scene1402::upShaking() { - if (_isShaking) { - setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10); - _vm->_screen->setYOffset(-10 - getBackgroundY()); - } else { - setBackgroundY(-10); - _vm->_screen->setYOffset(0); - SetUpdateHandler(&Scene::update); - } - Scene::update(); - if (_asPuzzleBox) - _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); - _klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); -} - -uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x00F43389) { - if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) - leaveScene(0); - else { - clearRectList(); - _klaymen->setVisible(false); - showMouse(false); - sendMessage(_asPuzzleBox, 0x2002, 0); - startShaking(); - } - } - break; - case 0x1019: - if (param.asInteger()) - leaveScene(0); - else - leaveScene(1); - break; - case 0x2000: - stopShaking(); - showMouse(true); - setRectList(0x004B0C48); - break; - case 0x2001: - stopShaking(); - leaveScene(0); - break; - case 0x2003: - stopShaking(); - break; - case 0x4826: - if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B0BB8); - } else - setMessageList2(0x004B0B68); - } - break; - } - return 0; -} - -void Scene1402::startShaking() { - _isShaking = true; - SetUpdateHandler(&Scene1402::upShaking); -} - -void Scene1402::stopShaking() { - _isShaking = false; -} - -// Scene1407 - -static const int16 kScene1407MouseFloorY[] = { - 106, 150, 191, 230, 267, 308, 350, 395 -}; - -static const struct { - int16 x; - int16 floorIndex; - int16 sectionIndex; - int16 nextHoleIndex; -} kScene1407MouseHoles[] = { - {125, 0, 0, 7}, - {452, 7, 21, 0}, - {337, 4, 11, 4}, - {286, 6, 17, 6}, - {348, 6, 17, 39}, - {536, 6, 18, 42}, - {111, 1, 3, 18}, - {203, 1, 3, 38}, - {270, 1, 3, 9}, - {197, 5, 14, 3}, - {252, 5, 14, 35}, - {297, 5, 14, 7}, - {359, 5, 14, 8}, - {422, 4, 12, 26}, - {467, 4, 12, 2}, - {539, 4, 12, 40}, - {111, 5, 13, 17}, - {211, 0, 1, 20}, - {258, 0, 1, 11}, - {322, 0, 1, 16}, - { 99, 6, 16, 31}, - {142, 6, 16, 27}, - {194, 6, 16, 12}, - {205, 2, 6, 45}, - {264, 2, 6, 10}, - { 98, 4, 10, 2}, - {152, 4, 10, 37}, - {199, 4, 10, 13}, - {258, 4, 10, 16}, - {100, 7, 19, 43}, - {168, 7, 19, 23}, - {123, 3, 8, 14}, - {181, 3, 8, 39}, - {230, 3, 8, 28}, - {292, 3, 8, 22}, - {358, 3, 8, 36}, - {505, 3, 9, 44}, - {400, 2, 7, 34}, - {454, 2, 7, 32}, - {532, 2, 7, 46}, - {484, 5, 15, 25}, - {529, 5, 15, 30}, - {251, 7, 20, 48}, - {303, 7, 20, 21}, - {360, 7, 20, 33}, - {503, 0, 2, 5}, - {459, 1, 4, 19}, - {530, 1, 4, 42}, - {111, 2, 5, 47}, - {442, 6, 18, 1} -}; - -static const struct { - int16 x1, x2; - int16 goodHoleIndex; -} kScene1407MouseSections[] = { - {100, 149, 0}, - {182, 351, 17}, - {430, 524, 45}, - { 89, 293, 7}, - {407, 555, 47}, - { 89, 132, 48}, - {178, 303, 23}, - {367, 551, 38}, - {105, 398, 31}, - {480, 537, 36}, - { 84, 275, 27}, - {318, 359, 2}, - {402, 560, 15}, - { 91, 132, 16}, - {179, 400, 10}, - {461, 552, 41}, - { 86, 218, 21}, - {267, 376, 4}, - {420, 560, 49}, - { 77, 188, 30}, - {237, 394, 44}, - {438, 515, 5} -}; - -AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) { - - createSurface(100, 117, 45); - _x = 108; - _y = 106; - stIdleLookAtGoodHole(); - SetUpdateHandler(&AnimatedSprite::update); -} - -void AsScene1407Mouse::suWalkTo() { - int16 xdelta = _walkDestX - _x; - if (xdelta > _deltaX) - xdelta = _deltaX; - else if (xdelta < -_deltaX) - xdelta = -_deltaX; - _deltaX = 0; - if (_walkDestX == _x) - sendMessage(this, 0x1019, 0); - else { - _x += xdelta; - updateBounds(); - } -} - -void AsScene1407Mouse::upGoThroughHole() { - if (_countdown != 0 && (--_countdown == 0)) { - SetUpdateHandler(&AnimatedSprite::update); - gotoNextState(); - } - AnimatedSprite::update(); -} - -uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - { - int16 mouseX = param.asPoint().x; - int16 mouseY = param.asPoint().y; - int holeIndex; - for (holeIndex = 0; holeIndex < 50; holeIndex++) { - int16 holeX = kScene1407MouseHoles[holeIndex].x; - int16 holeY = kScene1407MouseFloorY[kScene1407MouseHoles[holeIndex].floorIndex]; - if (mouseX >= holeX - 14 && mouseX <= holeX + 14 && mouseY >= holeY - 36 && mouseY <= holeY) - break; - } - if (holeIndex < 50 && kScene1407MouseHoles[holeIndex].sectionIndex == _currSectionIndex) { - _nextHoleIndex = kScene1407MouseHoles[holeIndex].nextHoleIndex; - _walkDestX = kScene1407MouseHoles[holeIndex].x; - stWalkToHole(); - } else { - if (mouseX < kScene1407MouseSections[_currSectionIndex].x1) - _walkDestX = kScene1407MouseSections[_currSectionIndex].x1; - else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2) - _walkDestX = kScene1407MouseSections[_currSectionIndex].x2; - else - _walkDestX = mouseX; - stWalkToDest(); - } - } - break; - case 0x1019: - gotoNextState(); - break; - case 0x2001: - { - // Reset the position - // Find the nearest hole and go through it, and exit at the first hole - int16 distance = 640; - int matchIndex = 50; - for (int index = 0; index < 50; index++) - if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex && - ABS(kScene1407MouseHoles[index].x - _x) < distance) { - matchIndex = index; - distance = ABS(kScene1407MouseHoles[index].x - _x); - } - if (matchIndex < 50) { - _nextHoleIndex = 0; - _walkDestX = kScene1407MouseHoles[matchIndex].x; - stWalkToHole(); - } - } - break; - } - return messageResult; -} - -void AsScene1407Mouse::stIdleLookAtGoodHole() { - setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0); - startAnimation(0x72215194, 0, -1); - SetMessageHandler(&AsScene1407Mouse::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene1407Mouse::stWalkToDest() { - if (_walkDestX != _x) { - setDoDeltaX(_walkDestX < _x ? 1 : 0); - startAnimation(0x22291510, 0, -1); - SetMessageHandler(&AsScene1407Mouse::handleMessage); - SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); - NextState(&AsScene1407Mouse::stIdleLookAtGoodHole); - } -} - -void AsScene1407Mouse::stWalkToHole() { - setDoDeltaX(_walkDestX < _x ? 1 : 0); - startAnimation(0x22291510, 0, -1); - SetMessageHandler(&AsScene1407Mouse::handleMessage); - SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); - NextState(&AsScene1407Mouse::stGoThroughHole); -} - -void AsScene1407Mouse::stGoThroughHole() { - startAnimation(0x72215194, 0, -1); - setVisible(false); - _countdown = 12; - SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); - SetMessageHandler(NULL); - SetSpriteUpdate(NULL); - NextState(&AsScene1407Mouse::stArriveAtHole); -} - -void AsScene1407Mouse::stArriveAtHole() { - _currSectionIndex = kScene1407MouseHoles[_nextHoleIndex].sectionIndex; - _x = kScene1407MouseHoles[_nextHoleIndex].x; - _y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex]; - if (_nextHoleIndex == 1) { - sendMessage(_parentScene, 0x2000, 0); - _walkDestX = 512; - stWalkToDest(); - setVisible(true); - } else { - _walkDestX = _x + 14; - stWalkToDest(); - setVisible(true); - } -} - -Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { - - SetMessageHandler(&Scene1407::handleMessage); - SetUpdateHandler(&Scene1407::update); - - setBackground(0x00442225); - setPalette(0x00442225); - insertPuzzleMouse(0x4222100C, 20, 620); - - _asMouse = insertSprite(this); - _ssResetButton = insertStaticSprite(0x12006600, 100); - _ssResetButton->setVisible(false); - -} - -void Scene1407::update() { - Scene::update(); - if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) - leaveScene(1); - else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) - _ssResetButton->setVisible(false); -} - -uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (_puzzleSolvedCountdown == 0) { - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - // Exit scene - leaveScene(0); - } else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 && - param.asPoint().y >= 62 && param.asPoint().y <= 90) { - // The reset button was clicked - sendMessage(_asMouse, 0x2001, 0); - _ssResetButton->setVisible(true); - playSound(0, 0x44045000); - _resetButtonCountdown = 12; - } else { - // Handle the mouse - sendMessage(_asMouse, messageNum, param); - } - } - break; - case 0x2000: - // The mouse got the cheese (nomnom) - setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1); - playSound(0, 0x68E25540); - showMouse(false); - _puzzleSolvedCountdown = 72; - break; - } - return 0; -} - -// Scene1403 - -Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _asProjector(NULL), _isProjecting(false) { - - SetMessageHandler(&Scene1403::handleMessage); - - setRectList(0x004B1FF8); - setBackground(0x2110A234); - setPalette(0x2110A234); - insertScreenMouse(0x0A230219); - - _sprite1 = insertStaticSprite(0x01102A33, 100); - _sprite1->setVisible(false); - _sprite2 = insertStaticSprite(0x04442520, 995); - _sprite3 = insertStaticSprite(0x08742271, 995); - _asTape1 = insertSprite(this, 12, 1100, 201, 468, 0x9148A011); - addCollisionSprite(_asTape1); - _asTape1->setRepl(64, 0); - _asTape2 = insertSprite(this, 16, 1100, 498, 468, 0x9048A093); - addCollisionSprite(_asTape2); - _asTape2->setRepl(64, 0); - - if (which < 0) { - // Restoring game - insertKlaymen(380, 463); - setMessageList(0x004B1F18); - } else { - // Klaymen entering from the right - insertKlaymen(640, 463); - setMessageList(0x004B1F20); - } - _klaymen->setRepl(64, 0); - - if (getGlobalVar(V_PROJECTOR_LOCATION) == 0) { - _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); - addCollisionSprite(_asProjector); - if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - _klaymen->setX(_asProjector->getX() + 100); - _klaymen->updateBounds(); - setMessageList(0x004B1F70); - } - _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); - _asProjector->setRepl(64, 0); - } - -} - -uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x88C11390) { - setRectList(0x004B2008); - _isProjecting = true; - } else if (param.asInteger() == 0x08821382) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setRectList(0x004B1FF8); - _isProjecting = false; - } - break; - case 0x1019: - leaveScene(0); - break; - case 0x1022: - if (sender == _asProjector) { - if (param.asInteger() >= 1000) - setSurfacePriority(_sprite3->getSurface(), 1100); - else - setSurfacePriority(_sprite3->getSurface(), 995); - } - break; - case 0x4807: - _sprite1->setVisible(false); - break; - case 0x480F: - _sprite1->setVisible(true); - break; - case 0x4826: - if (sender == _asProjector) { - if (_isProjecting) - setMessageList2(0x004B1FA8); - else if (param.asInteger() == 1) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B1F88); - } else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B1F58); - } else - setMessageList2(0x004B1F28); - } else if (sender == _asTape1 || sender == _asTape2) { - if (_isProjecting) - setMessageList2(0x004B1FA8); - else if (_messageListStatus != 2) { - sendEntityMessage(_klaymen, 0x1014, sender); - setMessageList2(0x004B1FB8); - } - } - break; - } - return 0; -} - -// Scene1404 - -Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _asProjector(NULL), _asKey(NULL) { - - if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) - setGlobalVar(V_KEY3_LOCATION, 5); - - SetMessageHandler(&Scene1404::handleMessage); - - setRectList(0x004B8D80); - setBackground(0xAC0B006F); - setPalette(0xAC0B006F); - _palette->addPalette(0x00801510, 0, 65, 0); - insertScreenMouse(0xB006BAC8); - - if (getGlobalVar(V_KEY3_LOCATION) == 5) { - _asKey = insertSprite(this, 2, 1100, 267, 411); - addCollisionSprite(_asKey); - } - - _sprite1 = insertStaticSprite(0x1900A1F8, 1100); - _asTape = insertSprite(this, 14, 1100, 281, 411, 0x9148A011); - addCollisionSprite(_asTape); - - if (which < 0) { - // Restoring game - insertKlaymen(376, 406); - setMessageList(0x004B8C28); - } else if (which == 1) { - // Klaymen returning from the tiles puzzle - insertKlaymen(376, 406); - setMessageList(0x004B8C30); - } else if (which == 2) { - // Klaymen returning from the diskplayer - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(347, 406); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen(187, 406); - } - setMessageList(0x004B8D28); - } else { - // Klaymen entering from the left - insertKlaymen(30, 406); - setMessageList(0x004B8C38); - } - - if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) { - _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); - addCollisionSprite(_asProjector); - if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - _klaymen->setX(_asProjector->getX() - 100); - _klaymen->updateBounds(); - setMessageList(0x004B8CB8); - } - _asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - } - - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - -} - -Scene1404::~Scene1404() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x410650C2) { - if (_asProjector && _asProjector->getX() == 220) - setMessageList(0x004B8C40); - else - setMessageList(0x004B8CE8); - } - break; - case 0x1019: - leaveScene(0); - break; - case 0x4826: - if (sender == _asProjector) { - if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { - sendEntityMessage(_klaymen, 0x1014, _asProjector); - setMessageList2(0x004B8CA0); - } else - setMessageList2(0x004B8C40); - } else if (sender == _asTape && _messageListStatus != 2) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B8CD0); - } else if (sender == _asKey && _messageListStatus != 2) { - sendEntityMessage(_klaymen, 0x1014, _asKey); - setMessageList(0x004B8D18); - } - break; - } - return 0; -} - -// Scene1405 - -static const NPoint kAsScene1405TileItemPositions[] = { - {100, 80}, {162, 78}, {222, 76}, {292, 76}, - {356, 82}, {422, 84}, {488, 86}, {550, 90}, - {102, 134}, {164, 132}, {224, 136}, {294, 136}, - {360, 136}, {422, 138}, {484, 144}, {548, 146}, - { 98, 196}, {160, 200}, {228, 200}, {294, 202}, - {360, 198}, {424, 200}, {482, 202}, {548, 206}, - { 98, 260}, {160, 264}, {226, 260}, {296, 262}, - {358, 260}, {424, 262}, {486, 264}, {550, 266}, - { 94, 322}, {160, 316}, {226, 316}, {296, 320}, - {358, 322}, {422, 324}, {488, 322}, {550, 322}, - { 98, 380}, {160, 376}, {226, 376}, {294, 378}, - {356, 380}, {420, 380}, {490, 378}, {552, 376} -}; - -AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) { - - loadSound(0, 0x05308101); - setSoundPan(0, (tileIndex % 8 * 4 + 4) * 25 / 8); - _x = kAsScene1405TileItemPositions[_tileIndex].x; - _y = kAsScene1405TileItemPositions[_tileIndex].y; - createSurface1(0x844B805C, 1100); - setVisible(false); - if (getSubVar(VA_IS_TILE_MATCH, _tileIndex)) - _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; - startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1); - _newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex); - SetUpdateHandler(&AsScene1405Tile::update); - SetMessageHandler(&AsScene1405Tile::handleMessage); -} - -void AsScene1405Tile::update() { - updateAnim(); - updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) - show(); -} - -uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (getSubVar(VA_IS_TILE_MATCH, _tileIndex) == 0 && _parentScene->getCountdown() == 0) { - show(); - sendMessage(_parentScene, 0x2000, _tileIndex); - } - messageResult = 1; - break; - } - return messageResult; -} - -void AsScene1405Tile::show() { - if (!_isShowing) { - _isShowing = true; - playSound(0); - setVisible(true); - } -} - -void AsScene1405Tile::hide() { - if (_isShowing) { - _isShowing = false; - playSound(0); - setVisible(false); - } -} - -Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { - - _vm->gameModule()->initMemoryPuzzle(); - - SetUpdateHandler(&Scene1405::update); - SetMessageHandler(&Scene1405::handleMessage); - - setBackground(0x0C0C007D); - setPalette(0x0C0C007D); - insertPuzzleMouse(0xC00790C8, 20, 620); - - for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) { - _tiles[tileIndex] = insertSprite(this, tileIndex); - addCollisionSprite(_tiles[tileIndex]); - if (getSubVar(VA_IS_TILE_MATCH, tileIndex)) - _tilesLeft--; - } - - loadSound(0, 0x68E25540); -} - -void Scene1405::update() { - Scene::update(); - if (_countdown != 0 && (--_countdown == 0)) { - _tilesLeft = 48; - _tiles[_firstTileIndex]->hide(); - _tiles[_secondTileIndex]->hide(); - for (uint32 i = 0; i < 48; i++) { - if (getSubVar(VA_IS_TILE_MATCH, i)) { - _tiles[i]->hide(); - setSubVar(VA_IS_TILE_MATCH, i, 0); - } - } - } -} - -uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - case 0x2000: - if (_selectFirstTile) { - _firstTileIndex = param.asInteger(); - _selectFirstTile = false; - } else { - _secondTileIndex = param.asInteger(); - if (_firstTileIndex != _secondTileIndex) { - _selectFirstTile = true; - if (getSubVar(VA_TILE_SYMBOLS, _secondTileIndex) == getSubVar(VA_TILE_SYMBOLS, _firstTileIndex)) { - setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1); - setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1); - _tilesLeft -= 2; - if (_tilesLeft == 0) - playSound(0); - } else - _countdown = 10; - } - } - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1400.h b/engines/neverhood/module1400.h deleted file mode 100644 index 14857062c1..0000000000 --- a/engines/neverhood/module1400.h +++ /dev/null @@ -1,281 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1400_H -#define NEVERHOOD_MODULE1400_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1200.h" - -namespace Neverhood { - -class Module1400 : public Module { -public: - Module1400(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1400(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene1401 - -class AsScene1401Pipe : public AnimatedSprite { -public: - AsScene1401Pipe(NeverhoodEngine *vm); - virtual ~AsScene1401Pipe(); -protected: - int _countdown1; - int _countdown2; - void update(); - void upSuckInProjector(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmSuckInProjector(int messageNum, const MessageParam ¶m, Entity *sender); - void stStartSucking(); - void stDoneSucking(); - void stSuckInProjector(); -}; - -class AsScene1401Mouse : public AnimatedSprite { -public: - AsScene1401Mouse(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suSuckedIn(); - void stSuckedIn(); -}; - -class AsScene1401Cheese : public AnimatedSprite { -public: - AsScene1401Cheese(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suSuckedIn(); - void stSuckedIn(); -}; - -class AsScene1401BackDoor : public AnimatedSprite { -public: - AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen); -protected: - Sprite *_klaymen; - int _countdown; - bool _isOpen; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stCloseDoor(); - void stCloseDoorDone(); -}; - -struct AsCommonProjectorItem { - NPoint point; - int8 maxSlotCount; - int8 lockSlotIndex; - int8 index1; - int8 leftBorderLeaves; - int8 rightBorderLeaves; -}; - -class AsCommonProjector : public AnimatedSprite { -public: - AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe); - virtual ~AsCommonProjector(); -protected: - Scene *_parentScene; - Sprite *_klaymen; - Sprite *_asPipe; - const AsCommonProjectorItem *_asProjectorItem; - int16 _beforeMoveX; - bool _lockedInSlot; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLockedInSlot(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoving(); - void moveProjector(); - void stSuckedIn(); - void stIdle(); - void stMoving(); - void stStartLockedInSlot(); - void stStayLockedInSlot(); - void stStartProjecting(); - void stLockedInSlot(); - void stStopProjecting(); - void stTurnToFront(); - void stStartSuckedIn(); -}; - -class Scene1401 : public Scene { -public: - Scene1401(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - bool _projectorBorderFlag; - Sprite *_ssFloorButton; - AsCommonProjector *_asProjector; - Sprite *_asPipe; - Sprite *_asMouse; - Sprite *_asCheese; - Sprite *_asBackDoor; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_ssButton; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1402 - -class SsScene1402BridgePart : public StaticSprite { -public: - SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority); -}; - -class AsScene1402PuzzleBox : public AnimatedSprite { -public: - AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stMoveUpDone(); - void stMoveDownDone(); - void stMoveDownSolvedDone(); -}; - -class Scene1402 : public Scene { -public: - Scene1402(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_ssBridgePart1; - Sprite *_ssBridgePart2; - Sprite *_ssBridgePart3; - Sprite *_asPuzzleBox; - AsCommonProjector *_asProjector; - bool _isShaking; - void upShaking(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void startShaking(); - void stopShaking(); -}; - -// Scene1407 - -class AsScene1407Mouse : public AnimatedSprite { -public: - AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - int16 _walkDestX; - int16 _currSectionIndex; - int16 _nextHoleIndex; - int _countdown; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suWalkTo(); - void upGoThroughHole(); - void stIdleLookAtGoodHole(); - void stWalkToDest(); - void stWalkToHole(); - void stGoThroughHole(); - void stArriveAtHole(); -}; - -class Scene1407 : public Scene { -public: - Scene1407(NeverhoodEngine *vm, Module *parentModule); -protected: - Sprite *_asMouse; - Sprite *_ssResetButton; - int _puzzleSolvedCountdown; - int _resetButtonCountdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1403 - -class Scene1403 : public Scene { -public: - Scene1403(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - AsScene1201Tape *_asTape1; - AsScene1201Tape *_asTape2; - AsCommonProjector *_asProjector; - bool _isProjecting; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1404 - -class Scene1404 : public Scene { -public: - Scene1404(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene1404(); -protected: - Sprite *_sprite1; - Sprite *_asTape; - AsCommonProjector *_asProjector; - Sprite *_asKey; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene1405 - -class Scene1405; - -class AsScene1405Tile : public AnimatedSprite { -public: - AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex); - void show(); - void hide(); -protected: - Scene1405 *_parentScene; - bool _isShowing; - uint32 _tileIndex; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1405 : public Scene { -public: - Scene1405(NeverhoodEngine *vm, Module *parentModule); - int getCountdown() const { return _countdown; } -protected: - bool _selectFirstTile; - int _firstTileIndex; - int _secondTileIndex; - int _tilesLeft; - int _countdown; - AsScene1405Tile *_tiles[48]; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1400_H */ diff --git a/engines/neverhood/module1500.cpp b/engines/neverhood/module1500.cpp deleted file mode 100644 index c49e968dca..0000000000 --- a/engines/neverhood/module1500.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1500.h" - -namespace Neverhood { - -Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else - createScene(3, -1); - -} - -void Module1500::createScene(int sceneNum, int which) { - debug("Module1500::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); - break; - case 1: - _vm->gameState().sceneNum = 1; - _childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48); - break; - case 2: - _vm->gameState().sceneNum = 2; - sendMessage(_parentModule, 0x0800, 0); - createSmackerScene(0x001A0005, true, true, true); - break; - case 3: - _vm->gameState().sceneNum = 3; - _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); - break; - } - SetUpdateHandler(&Module1500::updateScene); - _childObject->handleUpdate(); -} - -void Module1500::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - createScene(1, -1); - break; - case 1: - createScene(2, -1); - break; - case 3: - createScene(0, -1); - break; - default: - leaveModule(0); - break; - } - } -} - -// Scene1501 - -Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) - : Scene(vm, parentModule), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) { - - SetUpdateHandler(&Scene1501::update); - SetMessageHandler(&Scene1501::handleMessage); - - setBackground(backgroundFileHash); - setPalette(); - addEntity(_palette); - _palette->addBasePalette(backgroundFileHash, 0, 256, 0); - _palette->startFadeToPalette(12); - - if (soundFileHash != 0) - playSound(0, soundFileHash); - -} - -void Scene1501::update() { - Scene::update(); - if (_countdown1 != 0) { - _countdown1--; - if (_countdown1 == 0) { - _vm->_screen->clear(); - leaveScene(0); - } - } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0))) { - _countdown1 = 12; - _palette->startFadeToBlack(11); - } - - if (_countdown3 != 0) - _countdown3--; - - if (_countdown3 == 0 && _skip && _countdown1 == 0) { - _countdown1 = 12; - _palette->startFadeToBlack(11); - } - -} - -uint32 Scene1501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0009: - _skip = true; - break; - } - return messageResult; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1500.h b/engines/neverhood/module1500.h deleted file mode 100644 index c17cb4516c..0000000000 --- a/engines/neverhood/module1500.h +++ /dev/null @@ -1,58 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -// TODO: I couldn't come up with a better name than 'Module' so far - -#ifndef NEVERHOOD_MODULE1500_H -#define NEVERHOOD_MODULE1500_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/smackerscene.h" - -namespace Neverhood { - -class Module1500 : public Module { -public: - Module1500(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -class Scene1501 : public Scene { -public: - Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3); -protected: - int _countdown1; - int _countdown2; - int _countdown3; - bool _skip; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1500_H */ diff --git a/engines/neverhood/module1600.cpp b/engines/neverhood/module1600.cpp deleted file mode 100644 index cc1aa2c3de..0000000000 --- a/engines/neverhood/module1600.cpp +++ /dev/null @@ -1,1412 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1600.h" -#include "neverhood/gamemodule.h" -#include "neverhood/module1200.h" -#include "neverhood/module2200.h" - -namespace Neverhood { - -static const uint32 kModule1600SoundList[] = { - 0x90805C50, 0x90804450, 0xB4005E60, - 0x91835066, 0x90E14440, 0 -}; - -Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 1) - createScene(4, 1); - else if (which == 2) - createScene(5, 0); - else if (which == 3) - createScene(6, 1); - else if (which == 4) - createScene(1, 0); - else - createScene(0, 0); - - _vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList); - _vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150); - _vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0); - -} - -Module1600::~Module1600() { - _vm->_soundMan->deleteGroup(0x1A008D8); -} - -void Module1600::createScene(int sceneNum, int which) { - debug("Module1600::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - createNavigationScene(0x004B39D0, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004B3A30, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - createNavigationScene(0x004B3A60, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - createNavigationScene(0x004B3A90, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - createNavigationScene(0x004B3B20, which); - break; - case 5: - _vm->gameState().sceneNum = 5; - createNavigationScene(0x004B3B50, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - createNavigationScene(0x004B3B80, which); - break; - case 7: - _vm->gameState().sceneNum = 7; - _childObject = new Scene1608(_vm, this, which); - break; - case 8: - _vm->gameState().sceneNum = 8; - _childObject = new Scene1609(_vm, this); - break; - case 1001: - _vm->gameState().sceneNum = 1; - if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) - createSmackerScene(0x80050200, true, true, false); - else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) - createSmackerScene(0x80090200, true, true, false); - else - createSmackerScene(0x80000200, true, true, false); - if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2) - setGlobalVar(V_TALK_COUNTING_INDEX, 0); - else - incGlobalVar(V_TALK_COUNTING_INDEX, +1); - break; - } - SetUpdateHandler(&Module1600::updateScene); - _childObject->handleUpdate(); -} - -void Module1600::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 0) - createScene(2, 0); - else if (_moduleResult == 1) - createScene(1, 0); - else if (_moduleResult == 2) - leaveModule(4); - break; - case 1: - if (_moduleResult == 0) - createScene(1001, -1); - else if (_moduleResult == 1) - createScene(0, 3); - break; - case 2: - if (_moduleResult == 0) - createScene(3, 0); - else if (_moduleResult == 1) - createScene(0, 2); - break; - case 3: - if (_moduleResult == 0) - createScene(5, 0); - else if (_moduleResult == 2) - createScene(6, 0); - else if (_moduleResult == 3) - createScene(2, 1); - else if (_moduleResult == 4) - createScene(4, 0); - break; - case 4: - if (_moduleResult == 0) - leaveModule(1); - else if (_moduleResult == 1) - createScene(3, 1); - break; - case 5: - if (_moduleResult == 0) - leaveModule(2); - else if (_moduleResult == 1) - createScene(3, 3); - break; - case 6: - if (_moduleResult == 0) - createScene(8, -1); - else if (_moduleResult == 1) - createScene(3, 5); - break; - case 7: - createScene(6, 1); - break; - case 8: - if (_moduleResult == 0) - createScene(6, 0); - else - createScene(7, 0); - break; - case 1001: - createScene(1, 0); - break; - } - } -} - -AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) - : AnimatedSprite(vm, 1000), _parentScene(parentScene) { - - createSurface(200, 556, 328); - _x = x; - _y = y; - - _inMainArea = false; - _exitDirection = 0; - _currPointIndex = 0; - _hasAgainDestPoint = false; - _stepError = 0; - _hasAgainDestPointIndex = false; - _steps = 0; - _isBraking = false; - _yMoveTotalSteps = 0; - _isBusy = false; - _isIdle = false; - _isMoving = true; - _rectFlag = false; - _newDeltaXType = -1; - _soundCounter = 0; - _pathPoints = NULL; - _currMoveDirection = 0; - - startAnimation(0xD4220027, 0, -1); - setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); - - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::handleMessage); - SetSpriteUpdate(NULL); -} - -AsCommonCar::~AsCommonCar() { - if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) - setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X)); -} - -void AsCommonCar::setPathPoints(NPointArray *pathPoints) { - _pathPoints = pathPoints; -} - -void AsCommonCar::update() { - if (_newDeltaXType >= 0) { - setDoDeltaX(_newDeltaXType); - _newDeltaXType = -1; - } - AnimatedSprite::update(); - if (_hasAgainDestPoint && _yMoveTotalSteps == 0 && !_isBusy) { - _hasAgainDestPoint = false; - _hasAgainDestPointIndex = false; - sendPointMessage(this, 0x2004, _againDestPoint); - } else if (_hasAgainDestPointIndex && _yMoveTotalSteps == 0 && !_isBusy) { - _hasAgainDestPointIndex = false; - sendMessage(this, 0x2003, _againDestPointIndex); - } - updateMovement(); - updateSound(); -} - -void AsCommonCar::upIdle() { - update(); - if (++_idleCounter >= _idleCounterMax) - stIdleBlink(); - updateSound(); -} - -uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1019: - SetSpriteUpdate(NULL); - break; - case 0x2002: - // Set the current position without moving - _currPointIndex = param.asInteger(); - _stepError = 0; - _x = pathPoint(_currPointIndex).x; - _y = pathPoint(_currPointIndex).y; - break; - case 0x2003: - // Move to a point by its index - { - int newPointIndex = param.asInteger(); - if (_yMoveTotalSteps <= 0 && !_isBusy) { - _destX = pathPoint(newPointIndex).x; - _destY = pathPoint(newPointIndex).y; - if (_currPointIndex < newPointIndex) { - moveToNextPoint(); - } else if (_currPointIndex == newPointIndex && _stepError == 0) { - if (_currPointIndex == 0) { - _yMoveTotalSteps = 0; - sendMessage(_parentScene, 0x2005, 0); - } else if (_currPointIndex == (int)_pathPoints->size()) { - _yMoveTotalSteps = 0; - sendMessage(_parentScene, 0x2006, 0); - } - } else { - moveToPrevPoint(); - } - } else { - _hasAgainDestPointIndex = true; - _againDestPointIndex = newPointIndex; - } - } - break; - case 0x2004: - // Move to the point closest to the parameter point - { - int minMatchIndex = -1; - int minMatchDistance, distance; - NPoint pt = param.asPoint(); - if (_yMoveTotalSteps <= 0 && !_isBusy) { - // Check if we're already exiting (or something) - if ((pt.x <= 20 && _exitDirection == 1) || - (pt.x >= 620 && _exitDirection == 3) || - (pt.y <= 20 && _exitDirection == 2) || - (pt.y >= 460 && _exitDirection == 4)) - break; - _destX = pt.x; - _destY = pt.y; - minMatchDistance = calcDistance(_destX, _destY, _x, _y) + 1; - for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) { - distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y); - if (distance >= minMatchDistance) - break; - minMatchDistance = distance; - minMatchIndex = i; - } - for (int i = _currPointIndex; i >= 0; i--) { - distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y); - if (distance >= minMatchDistance) - break; - minMatchDistance = distance; - minMatchIndex = i; - } - if (minMatchIndex == -1) { - if (_currPointIndex == 0) - moveToPrevPoint(); - else - SetSpriteUpdate(NULL); - } else { - if (minMatchIndex > _currPointIndex) - moveToNextPoint(); - else - moveToPrevPoint(); - } - } else { - _hasAgainDestPoint = true; - _againDestPoint = pt; - } - } - break; - case 0x2007: - _yMoveTotalSteps = param.asInteger(); - _steps = 0; - _isBraking = false; - _lastDistance = 640; - SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); - break; - case 0x2008: - _yMoveTotalSteps = param.asInteger(); - _steps = 0; - _isBraking = false; - _lastDistance = 640; - SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); - break; - case 0x2009: - stEnterCar(); - break; - case 0x200A: - stLeaveCar(); - break; - case 0x200E: - stTurnCar(); - break; - case 0x200F: - stCarAtHome(); - _newDeltaXType = param.asInteger(); - break; - } - return messageResult; -} - -uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (_isBusy && param.asInteger() == 0x025424A2) - gotoNextState(); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -uint32 AsCommonCar::hmLeaveCar(int messageNum, const MessageParam ¶m, Entity *sender) { - switch (messageNum) { - case 0x2009: - stEnterCar(); - break; - case 0x3002: - sendMessage(_parentScene, 0x200A, 0); - SetMessageHandler(&AsCommonCar::handleMessage); - break; - } - return 0; -} - -void AsCommonCar::stCarAtHome() { - bool doDeltaX = _doDeltaX; - SetSpriteUpdate(NULL); - _hasAgainDestPoint = false; - _hasAgainDestPointIndex = false; - _isBraking = false; - _isBusy = false; - _isIdle = false; - _isMoving = false; - _rectFlag = false; - NextState(&AsCommonCar::stLeanForwardIdle); - startAnimation(0x35698F78, 0, -1); - setDoDeltaX(doDeltaX ? 1 : 0); - _currMoveDirection = 0; - _newMoveDirection = 0; - _steps = 0; - _idleCounter = 0; - _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; - SetUpdateHandler(&AsCommonCar::upIdle); - SetMessageHandler(&AsCommonCar::handleMessage); - FinalizeState(&AsCommonCar::evIdleDone); -} - -void AsCommonCar::updateTurnMovement() { - if (_turnMoveStatus == 1) { - _lastDistance = 640; - _isIdle = false; - _isBraking = false; - SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); - } else if (_turnMoveStatus == 2) { - _lastDistance = 640; - _isIdle = false; - _isBraking = false; - SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); - } -} - -void AsCommonCar::updateMovement() { - if (_isBraking && !_isIdle && !_isBusy) { - gotoNextState(); - _isMoving = false; - _isIdle = true; - startAnimation(0x192ADD30, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - NextState(&AsCommonCar::stLeanForwardIdle); - } else if (!_isBraking && _steps && _isIdle) { - gotoNextState(); - _isIdle = false; - startAnimation(0x9966B138, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - NextState(&AsCommonCar::stUpdateMoveDirection); - } else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) { - gotoNextState(); - _currMoveDirection = _newMoveDirection; - stUpdateMoveDirection(); - } -} - -void AsCommonCar::stEnterCar() { - startAnimation(0xA86A9538, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - NextState(&AsCommonCar::stLeanForwardIdle); -} - -void AsCommonCar::stLeaveCar() { - startAnimation(0xA86A9538, -1, -1); - _playBackwards = true; - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmLeaveCar); -} - -void AsCommonCar::stLeanForwardIdle() { - startAnimation(0x35698F78, 0, -1); - _currMoveDirection = 0; - _newMoveDirection = 0; - _steps = 0; - _idleCounter = 0; - _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; - SetUpdateHandler(&AsCommonCar::upIdle); - SetMessageHandler(&AsCommonCar::handleMessage); - FinalizeState(&AsCommonCar::evIdleDone); -} - -void AsCommonCar::evIdleDone() { - SetUpdateHandler(&AsCommonCar::update); -} - -void AsCommonCar::stIdleBlink() { - startAnimation(0xB579A77C, 0, -1); - _idleCounter = 0; - _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - NextState(&AsCommonCar::stLeanForwardIdle); -} - -void AsCommonCar::stUpdateMoveDirection() { - _isMoving = true; - if (_currMoveDirection == 1) - startAnimation(0xD4AA03A4, 0, -1); - else if (_currMoveDirection == 3) - startAnimation(0xD00A1364, 0, -1); - else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) - stTurnCar(); - else - startAnimation(0xD4220027, 0, -1); - setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0); -} - -void AsCommonCar::moveToNextPoint() { - if (_currPointIndex >= (int)_pathPoints->size() - 1) { - _yMoveTotalSteps = 0; - sendMessage(this, 0x1019, 0); - sendMessage(_parentScene, 0x2006, 0); - } else { - NPoint nextPt = pathPoint(_currPointIndex + 1); - NPoint currPt = pathPoint(_currPointIndex); - if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && - ((_currMoveDirection == 2 && nextPt.x < currPt.x) || - (_currMoveDirection == 4 && nextPt.x >= currPt.x))) { - if (_currMoveDirection == 2) - _currMoveDirection = 4; - else if (_currMoveDirection == 4) - _currMoveDirection = 2; - if (_isIdle) - stTurnCarMoveToNextPoint(); - else - stBrakeMoveToNextPoint(); - } else { - if (_steps == 0) { - gotoNextState(); - _isIdle = false; - startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); - SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::stUpdateMoveDirection); - } - _isBraking = false; - SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); - _lastDistance = 640; - } - } -} - -void AsCommonCar::stBrakeMoveToNextPoint() { - gotoNextState(); - _isBusy = true; - _isBraking = true; - startAnimation(0x192ADD30, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - NextState(&AsCommonCar::stTurnCarMoveToNextPoint); -} - -void AsCommonCar::stTurnCar() { - // Turn to left/right #1 - gotoNextState(); - _isBusy = true; - startAnimation(0xF46A0324, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - FinalizeState(&AsCommonCar::evTurnCarDone); - _turnMoveStatus = 0; - updateTurnMovement(); -} - -void AsCommonCar::stTurnCarMoveToNextPoint() { - // Turn to left/right #2 - gotoNextState(); - _isBusy = true; - startAnimation(0xF46A0324, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - FinalizeState(&AsCommonCar::evTurnCarDone); - _turnMoveStatus = 1; - updateTurnMovement(); -} - -void AsCommonCar::stTurnCarMoveToPrevPoint() { - // Turn to left/right #3 - FinalizeState(NULL); - _isBusy = true; - startAnimation(0xF46A0324, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - FinalizeState(&AsCommonCar::evTurnCarDone); - _turnMoveStatus = 2; - updateTurnMovement(); -} - -void AsCommonCar::moveToPrevPoint() { - if (_currPointIndex == 0 && _stepError == 0) { - _yMoveTotalSteps = 0; - sendMessage(this, 0x1019, 0); - sendMessage(_parentScene, 0x2005, 0); - } else { - NPoint prevPt; - NPoint currPt; - if (_stepError == 0) { - prevPt = pathPoint(_currPointIndex - 1); - currPt = pathPoint(_currPointIndex); - } else { - prevPt = pathPoint(_currPointIndex); - currPt = pathPoint(_currPointIndex + 1); - } - if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && - ((_currMoveDirection == 2 && prevPt.x < currPt.x) || - (_currMoveDirection == 4 && prevPt.x >= currPt.x))) { - if (_currMoveDirection == 2) - _currMoveDirection = 4; - else if (_currMoveDirection == 4) - _currMoveDirection = 2; - if (_isIdle) - stTurnCarMoveToPrevPoint(); - else - stBrakeMoveToPrevPoint(); - } else { - if (_steps == 0) { - gotoNextState(); - _isIdle = false; - startAnimation(0x9966B138, 0, -1); - SetMessageHandler(&AsCommonCar::hmAnimation); - SetUpdateHandler(&AsCommonCar::update); - NextState(&AsCommonCar::stUpdateMoveDirection); - } - _isBraking = false; - SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); - _lastDistance = 640; - } - } -} - -void AsCommonCar::stBrakeMoveToPrevPoint() { - FinalizeState(NULL); - _isBusy = true; - _isBraking = true; - startAnimation(0x192ADD30, 0, -1); - SetUpdateHandler(&AsCommonCar::update); - SetMessageHandler(&AsCommonCar::hmAnimation); - NextState(&AsCommonCar::stTurnCarMoveToPrevPoint); -} - -void AsCommonCar::evTurnCarDone() { - _isBusy = false; - setDoDeltaX(2); - _newMoveDirection = 0; - stUpdateMoveDirection(); -} - -void AsCommonCar::suMoveToNextPoint() { - int16 newX = _x, newY = _y; - - if (_currPointIndex >= (int)_pathPoints->size()) { - _yMoveTotalSteps = 0; - sendMessage(this, 0x1019, 0); - sendMessage(_parentScene, 0x2006, 0); - return; - } - - if (_isBraking) { - if (_steps <= 0) { - sendMessage(this, 0x1019, 0); - return; - } else - _steps--; - } else if (_steps < 11) - _steps++; - - bool firstTime = true; - _ySteps = _steps; - int stepsCtr = _steps; - - while (stepsCtr > 0) { - NPoint pt1; - NPoint pt2 = pathPoint(_currPointIndex); - if (_currPointIndex + 1 >= (int)_pathPoints->size()) - pt1 = pathPoint(0); - else - pt1 = pathPoint(_currPointIndex + 1); - int16 deltaX = ABS(pt1.x - pt2.x); - int16 deltaY = ABS(pt1.y - pt2.y); - if (deltaX >= deltaY) { - _newMoveDirection = 2; - if (pt1.x < pt2.x) - _newMoveDirection = 4; - if (stepsCtr + _stepError >= deltaX) { - stepsCtr -= deltaX; - stepsCtr += _stepError; - _stepError = 0; - _currPointIndex++; - if (_currPointIndex == (int)_pathPoints->size() - 1) - stepsCtr = 0; - newX = pathPoint(_currPointIndex).x; - newY = pathPoint(_currPointIndex).y; - } else { - _stepError += stepsCtr; - if (pt1.x >= pt2.x) - newX += stepsCtr; - else - newX -= stepsCtr; - if (pt1.y >= pt2.y) - newY = pt2.y + (deltaY * _stepError) / deltaX; - else - newY = pt2.y - (deltaY * _stepError) / deltaX; - stepsCtr = 0; - } - } else { - _newMoveDirection = 3; - if (pt1.y < pt2.y) - _newMoveDirection = 1; - if (firstTime) { - if (pt1.y >= pt2.y) - stepsCtr += 7; - else { - stepsCtr -= 4; - if (stepsCtr < 0) - stepsCtr = 0; - } - _ySteps = stepsCtr; - } - if (stepsCtr + _stepError >= deltaY) { - stepsCtr -= deltaY; - stepsCtr += _stepError; - _stepError = 0; - _currPointIndex++; - if (_currPointIndex == (int)_pathPoints->size() - 1) - stepsCtr = 0; - newX = pathPoint(_currPointIndex).x; - newY = pathPoint(_currPointIndex).y; - } else { - _stepError += stepsCtr; - if (pt1.x >= pt2.x) - newX = pt2.x + (deltaX * _stepError) / deltaY; - else - newX = pt2.x - (deltaX * _stepError) / deltaY; - if (pt1.y >= pt2.y) - newY += stepsCtr; - else - newY -= stepsCtr; - stepsCtr = 0; - } - } - firstTime = false; - } - - if (_yMoveTotalSteps != 0) { - _x = newX; - _y = newY; - _yMoveTotalSteps -= _ySteps; - if (_yMoveTotalSteps <= 0) { - _isBraking = true; - _yMoveTotalSteps = 0; - } - } else { - int distance = calcDistance(_destX, _destY, _x, _y); - _x = newX; - _y = newY; - if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { - _exitDirection = 0; - _inMainArea = true; - } else if (_inMainArea) { - _destX = pathPoint(_pathPoints->size() - 1).x; - _destY = pathPoint(_pathPoints->size() - 1).y; - _inMainArea = false; - if (_x <= 20) - _exitDirection = 1; - else if (_x >= 620) - _exitDirection = 3; - else if (_y <= 20) - _exitDirection = 2; - else if (_y >= 460) - _exitDirection = 4; - if (_exitDirection != 0 && _isBraking) { - _isBraking = false; - _steps = 11; - } - } - if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || - (_exitDirection == 0 && _lastDistance + 20 < distance)) - _isBraking = true; - if (distance < _lastDistance) - _lastDistance = distance; - if (_currPointIndex == (int)_pathPoints->size() - 1) { - _isBraking = true; - _yMoveTotalSteps = 0; - sendMessage(this, 0x1019, 0); - sendMessage(_parentScene, 0x2006, 0); - } - } - -} - -void AsCommonCar::suMoveToPrevPoint() { - int16 newX = _x, newY = _y; - - if (_currPointIndex == 0 && _stepError == 0) { - _yMoveTotalSteps = 0; - sendMessage(this, 0x1019, 0); - sendMessage(_parentScene, 0x2005, 0); - return; - } - - if (_isBraking) { - if (_steps <= 0) { - sendMessage(this, 0x1019, 0); - return; - } else - _steps--; - } else if (_steps < 11) - _steps++; - - bool firstTime = true; - _ySteps = _steps; - int stepsCtr = _steps; - - while (stepsCtr > 0) { - if (_stepError == 0) - _currPointIndex--; - NPoint pt1; - NPoint pt2 = pathPoint(_currPointIndex); - if (_currPointIndex + 1 >= (int)_pathPoints->size()) - pt1 = pathPoint(0); - else - pt1 = pathPoint(_currPointIndex + 1); - int16 deltaX = ABS(pt1.x - pt2.x); - int16 deltaY = ABS(pt1.y - pt2.y); - if (deltaX >= deltaY) { - _newMoveDirection = 4; - if (pt1.x < pt2.x) - _newMoveDirection = 2; - if (_stepError == 0) - _stepError = deltaX; - if (stepsCtr > _stepError) { - stepsCtr -= _stepError; - _stepError = 0; - if (_currPointIndex == 0) - stepsCtr = 0; - newX = pathPoint(_currPointIndex).x; - newY = pathPoint(_currPointIndex).y; - } else { - _stepError -= stepsCtr; - if (pt1.x >= pt2.x) - newX -= stepsCtr; - else - newX += stepsCtr; - if (pt1.y >= pt2.y) - newY = pt2.y + (deltaY * _stepError) / deltaX; - else - newY = pt2.y - (deltaY * _stepError) / deltaX; - stepsCtr = 0; - } - } else { - _newMoveDirection = 1; - if (pt1.y < pt2.y) - _newMoveDirection = 3; - if (firstTime) { - if (pt1.y >= pt2.y) { - stepsCtr -= 4; - if (stepsCtr < 0) - stepsCtr = 0; - } else { - stepsCtr += 7; - } - _ySteps = stepsCtr; - } - if (_stepError == 0) - _stepError = deltaY; - if (stepsCtr > _stepError) { - stepsCtr -= _stepError; - _stepError = 0; - if (_currPointIndex == 0) - stepsCtr = 0; - newX = pathPoint(_currPointIndex).x; - newY = pathPoint(_currPointIndex).y; - } else { - _stepError -= stepsCtr; - if (pt1.x >= pt2.x) - newX = pt2.x + (deltaX * _stepError) / deltaY; - else - newX = pt2.x - (deltaX * _stepError) / deltaY; - if (pt1.y >= pt2.y) - newY -= stepsCtr; - else - newY += stepsCtr; - stepsCtr = 0; - } - } - firstTime = false; - } - - if (_yMoveTotalSteps != 0) { - _x = newX; - _y = newY; - _yMoveTotalSteps -= _ySteps; - if (_yMoveTotalSteps <= 0) { - _isBraking = true; - _yMoveTotalSteps = 0; - } - } else { - int distance = calcDistance(_destX, _destY, _x, _y); - _x = newX; - _y = newY; - if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { - _exitDirection = 0; - _inMainArea = true; - } else if (_inMainArea) { - _destX = pathPoint(0).x; - _destY = pathPoint(0).y; - _inMainArea = false; - if (_x <= 20) - _exitDirection = 1; - else if (_x >= 620) - _exitDirection = 3; - else if (_y <= 20) - _exitDirection = 2; - else if (_y >= 460) - _exitDirection = 4; - if (_exitDirection != 0 && _isBraking) { - _isBraking = false; - _steps = 11; - } - } - if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || - (_exitDirection == 0 && _lastDistance + 20 < distance)) - _isBraking = true; - if (distance < _lastDistance) - _lastDistance = distance; - if (_currPointIndex == 0 && _stepError == 0) { - _isBraking = true; - _yMoveTotalSteps = 0; - sendMessage(this, 0x1019, 0); - sendMessage(_parentScene, 0x2005, 0); - } - } - -} - -void AsCommonCar::updateSound() { - int maxSoundCounter = 0; - _soundCounter++; - if (_steps != 0 && !_isIdle) { - if (_currMoveDirection == 1) - maxSoundCounter = 18 - _steps; - else if (_currMoveDirection == 3) { - maxSoundCounter = 5 - _steps; - if (maxSoundCounter < 1) - maxSoundCounter = 1; - } else - maxSoundCounter = 14 - _steps; - } else - maxSoundCounter = 21; - if (_soundCounter >= maxSoundCounter) { - sendMessage(_parentScene, 0x200D, 0); - _soundCounter = 0; - } -} - -AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y) - : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { - - setDoDeltaX(1); - startAnimation(0x1209E09F, 1, -1); - _newStickFrameIndex = 1; -} - -AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y) - : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { - - setDoDeltaX(1); - _newStickFrameIndex = 0; -} - -AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar) - : AnimatedSprite(vm, 1100), _asCar(asCar) { - - createSurface1(0x60281C10, 150); - startAnimation(0x60281C10, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - SetUpdateHandler(&AsCommonCarConnector::update); -} - -void AsCommonCarConnector::update() { - _x = _asCar->getX(); - _y = _asCar->getY(); - AnimatedSprite::update(); -} - -void Tracks::findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, - DataResource &dataResource) { - const uint trackCount = size(); - minMatchTrackIndex = -1; - minMatchDistance = 640; - for (uint trackIndex = 0; trackIndex < trackCount; trackIndex++) { - NPointArray *pointList = dataResource.getPointArray((*this)[trackIndex]->trackPointsName); - for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { - NPoint testPt = (*pointList)[pointIndex]; - int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); - if (distance < minMatchDistance) { - minMatchTrackIndex = trackIndex; - minMatchDistance = distance; - } - } - } -} - -Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _asCar(NULL), _countdown1(0) { - - setGlobalVar(V_CAR_DELTA_X, 1); - - SetMessageHandler(&Scene1608::hmLowerFloor); - - _asKey = insertSprite(this, 1, 1100, 198, 220); - addCollisionSprite(_asKey); - - if (which < 0) { - // Restoring game - if (_vm->gameState().which == 1) - // Klaymen is in the car - which = 1; - else { - // Klaymen is standing around - setRectList(0x004B47D0); - insertKlaymen(380, 438); - _kmScene1608 = _klaymen; - _klaymenInCar = false; - _sprite1 = insertStaticSprite(0x7D0404E8, 1100); - setMessageList(0x004B46A8); - setBackground(0x10080E01); - setPalette(0x10080E01); - _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - addCollisionSprite(_asTape); - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - SetUpdateHandler(&Scene1608::upLowerFloor); - insertScreenMouse(0x80E05108); - insertStaticSprite(0x4B18F868, 1200); - } - } else if (which == 0) { - // Klaymen entering from the left - _vm->gameState().which = 0; - setRectList(0x004B47D0); - insertKlaymen(0, 438); - _kmScene1608 = _klaymen; - _klaymenInCar = false; - setMessageList(0x004B46B0); - setBackground(0x10080E01); - setPalette(0x10080E01); - _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - addCollisionSprite(_asTape); - insertScreenMouse(0x80E05108); - _sprite1 = insertStaticSprite(0x7D0404E8, 1100); - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); - SetUpdateHandler(&Scene1608::upLowerFloor); - insertStaticSprite(0x4B18F868, 1200); - } else if (which == 2) { - // Klaymen returning from looking through the upper window - _vm->gameState().which = 1; - _dataResource.load(0x003C0492); - _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); - setBackground(0x98001604); - setPalette(0x98001604); - _palette->addPalette("paPodRed", 65, 31, 65); - insertScreenMouse(0x01600988); - _sprite2 = insertStaticSprite(0x491F38A8, 1100); - _asCar = createSprite(this, 375, 227); // Create but don't add to the sprite list yet - _asIdleCarLower = insertSprite(375, 227); - _asIdleCarFull = insertSprite(375, 227); - _asCar->setVisible(false); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(373, 220); - _klaymen->setDoDeltaX(1); - } else - insertKlaymen(283, 220); - _kmScene1608 = _klaymen; - setMessageList(0x004B47A8); - SetMessageHandler(&Scene1608::hmUpperFloor); - SetUpdateHandler(&Scene1608::upUpperFloor); - _asCar->setPathPoints(_roomPathPoints); - sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1); - _sprite3 = insertStaticSprite(0xB47026B0, 1100); - _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _clipRect2 = _clipRect1; - _clipRect2.y2 = 215; - _klaymen->setClipRect(_clipRect1); - _asCar->setClipRect(_clipRect1); - _asIdleCarLower->setClipRect(_clipRect1); - _asIdleCarFull->setClipRect(_clipRect1); - _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - addCollisionSprite(_asTape); - insertSprite(_asCar)->setClipRect(_clipRect1); - _klaymenInCar = false; - _carClipFlag = false; - _carStatus = 0; - setRectList(0x004B4810); - } - - // NOTE: Not in the else because 'which' is set to 1 in the true branch - if (which == 1) { - // Klaymen riding the car - _vm->gameState().which = 1; - _dataResource.load(0x003C0492); - _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); - setBackground(0x98001604); - setPalette(0x98001604); - _palette->addPalette("paPodRed", 65, 31, 65); - insertScreenMouse(0x01600988); - _asCar = insertSprite(this, 375, 227); - _asIdleCarLower = insertSprite(375, 227); - _asIdleCarFull = insertSprite(375, 227); - _sprite2 = insertStaticSprite(0x491F38A8, 1100); - _kmScene1608 = createSprite(this, 439, 220); - sendMessage(_kmScene1608, 0x2032, 1); - _kmScene1608->setDoDeltaX(1); - SetMessageHandler(&Scene1608::hmRidingCar); - SetUpdateHandler(&Scene1608::upRidingCar); - _asIdleCarLower->setVisible(false); - _asIdleCarFull->setVisible(false); - _asCar->setPathPoints(_roomPathPoints); - sendMessage(_asCar, 0x2002, 0); - sendMessage(_asCar, 0x2008, 90); - _sprite3 = insertStaticSprite(0xB47026B0, 1100); - _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); - _clipRect2 = _clipRect1; - _clipRect2.y2 = 215; - _kmScene1608->setClipRect(_clipRect1); - _asCar->setClipRect(_clipRect1); - _asIdleCarLower->setClipRect(_clipRect1); - _asIdleCarFull->setClipRect(_clipRect1); - _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); - // ... addCollisionSprite(_asTape); - insertSprite(_asCar)->setClipRect(_clipRect1); - _klaymenInCar = true; - _carClipFlag = true; - _carStatus = 0; - } - - _palette->addPalette("paKlayRed", 0, 64, 0); - -} - -Scene1608::~Scene1608() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); - if (_klaymenInCar) - delete _kmScene1608; - else - delete _asCar; -} - -void Scene1608::upLowerFloor() { - Scene::update(); - if (_countdown1 != 0 && (--_countdown1 == 0)) - leaveScene(0); -} - -void Scene1608::upUpperFloor() { - Scene::update(); - if (_carStatus == 1) { - removeSurface(_klaymen->getSurface()); - removeEntity(_klaymen); - addSprite(_asCar); - _klaymenInCar = true; - clearRectList(); - SetUpdateHandler(&Scene1608::upCarAtHome); - SetMessageHandler(&Scene1608::hmCarAtHome); - _asIdleCarLower->setVisible(false); - _asIdleCarFull->setVisible(false); - _asCar->setVisible(true); - sendMessage(_asCar, 0x2009, 0); - _asCar->handleUpdate(); - _klaymen = NULL; - _carStatus = 0; - } - updateKlaymenCliprect(); -} - -void Scene1608::upCarAtHome() { - Scene::update(); - if (_mouseClicked) { - if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) { - sendMessage(_asCar, 0x200A, 0); - SetUpdateHandler(&Scene1608::upGettingOutOfCar); - } else { - sendPointMessage(_asCar, 0x2004, _mouseClickPos); - SetMessageHandler(&Scene1608::hmRidingCar); - SetUpdateHandler(&Scene1608::upRidingCar); - } - _mouseClicked = false; - } - updateKlaymenCliprect(); -} - -void Scene1608::upGettingOutOfCar() { - Scene::update(); - if (_carStatus == 2) { - _klaymen = _kmScene1608; - removeSurface(_asCar->getSurface()); - removeEntity(_asCar); - addSprite(_klaymen); - _klaymenInCar = false; - SetMessageHandler(&Scene1608::hmUpperFloor); - SetUpdateHandler(&Scene1608::upUpperFloor); - setRectList(0x004B4810); - _asIdleCarLower->setVisible(true); - _asIdleCarFull->setVisible(true); - _asCar->setVisible(false); - setMessageList(0x004B4748); - processMessageList(); - _klaymen->handleUpdate(); - _carStatus = 0; - } - updateKlaymenCliprect(); -} - -void Scene1608::upRidingCar() { - Scene::update(); - if (_mouseClicked) { - sendPointMessage(_asCar, 0x2004, _mouseClickPos); - _mouseClicked = false; - } - if (_asCar->getX() < 300) { - if (_carClipFlag) { - _carClipFlag = false; - _asCar->setClipRect(_clipRect1); - if (!_asCar->isDoDeltaX()) - sendMessage(_asCar, 0x200E, 0); - } - } else if (!_carClipFlag) { - _carClipFlag = true; - _asCar->setClipRect(_clipRect3); - } -} - -uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x20250B1A) { - clearRectList(); - _klaymen->setVisible(false); - showMouse(false); - _sprite1->setVisible(false); - //sendMessage(_asDoor, 0x4809, 0); // Play sound? - _countdown1 = 28; - } - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_kmScene1608, 0x1014, _asTape); - setMessageList(0x004B4770); - } else if (sender == _asKey) - setMessageList(0x004B46C8); - break; - } - return 0; -} - -uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x60842040) - _carStatus = 1; - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - case 0x4826: - if (sender == _asKey) { - sendEntityMessage(_kmScene1608, 0x1014, _asKey); - setMessageList(0x004B4760); - } - break; - } - return 0; -} - -uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2005: - leaveScene(1); - break; - case 0x2006: - SetMessageHandler(&Scene1608::hmCarAtHome); - SetUpdateHandler(&Scene1608::upCarAtHome); - sendMessage(_asCar, 0x200F, 1); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x200A: - _carStatus = 2; - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -void Scene1608::updateKlaymenCliprect() { - if (_kmScene1608->getX() <= 375) - _kmScene1608->setClipRect(_clipRect1); - else - _kmScene1608->setClipRect(_clipRect2); -} - -Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { - - _vm->gameModule()->initCodeSymbolsPuzzle(); - _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); - - SetMessageHandler(&Scene1609::handleMessage); - SetUpdateHandler(&Scene1609::update); - - setBackground(0x92124A14); - setPalette(0x92124A14); - insertPuzzleMouse(0x24A10929, 20, 620); - - for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++) - _asSymbols[symbolPosition] = insertSprite(symbolPosition, false); - - _ssButton = insertSprite(this, true); - addCollisionSprite(_ssButton); - loadSound(0, 0x68E25540); - -} - -void Scene1609::update() { - if (!_isSolved && _countdown1 != 0 && (--_countdown1 == 0)) { - if (_changeCurrentSymbol) { - _currentSymbolIndex++; - if (_currentSymbolIndex >= 12) - _currentSymbolIndex = 0; - _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(VA_CODE_SYMBOLS, _noisySymbolIndex)); - _changeCurrentSymbol = false; - _countdown1 = 36; - } else { - _asSymbols[_symbolPosition]->hide(); - _changeCurrentSymbol = true; - _countdown1 = 12; - } - } - if (_isSolved && !isSoundPlaying(0)) - leaveScene(1); - Scene::update(); -} - -uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - case 0x2000: - if (!_isSolved) { - if (_changeCurrentSymbol) - _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false); - _asSymbols[_symbolPosition]->stopSymbolSound(); - _symbolPosition++; - if (_symbolPosition >= 12) { - if (testVars()) { - playSound(0); - setGlobalVar(V_CODE_SYMBOLS_SOLVED, 1); - _isSolved = true; - } else { - _symbolPosition = 0; - for (int i = 0; i < 12; i++) - _asSymbols[i]->hide(); - } - } - _changeCurrentSymbol = true; - _countdown1 = 1; - } - break; - } - return 0; -} - -bool Scene1609::testVars() { - int cmpSymbolIndex = 0; - - // Find the position of the first symbol - while ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex()) - cmpSymbolIndex++; - - // Check if the entered symbols match - for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) { - if ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex()) - return false; - cmpSymbolIndex++; - if (cmpSymbolIndex >= 12) - cmpSymbolIndex = 0; - } - - return true; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1600.h b/engines/neverhood/module1600.h deleted file mode 100644 index 0743767244..0000000000 --- a/engines/neverhood/module1600.h +++ /dev/null @@ -1,183 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1600_H -#define NEVERHOOD_MODULE1600_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module3000.h" - -namespace Neverhood { - -// Module1600 - -class Module1600 : public Module { -public: - Module1600(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1600(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -class AsCommonCar : public AnimatedSprite { -public: - AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); - ~AsCommonCar(); - void setPathPoints(NPointArray *pathPoints); -protected: - Scene *_parentScene; - NPointArray *_pathPoints; - int _newMoveDirection; - int _currMoveDirection; - int _exitDirection; - int _currPointIndex; - bool _hasAgainDestPoint; - NPoint _againDestPoint; - bool _hasAgainDestPointIndex; - int _againDestPointIndex; - bool _inMainArea; - bool _isBraking; - bool _isBusy; - bool _isIdle; - bool _isMoving; - bool _rectFlag; - int _idleCounter; - int _idleCounterMax; - int _steps; - int _stepError; - int _lastDistance; - int _yMoveTotalSteps; - int _ySteps; - int _newDeltaXType; - int _soundCounter; - int _turnMoveStatus; - int16 _destX, _destY; - NPoint pathPoint(uint index) { return (*_pathPoints)[index]; } - void update(); - void upIdle(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmLeaveCar(int messageNum, const MessageParam ¶m, Entity *sender); - void stCarAtHome(); - void updateTurnMovement(); - void updateMovement(); - void stEnterCar(); - void stLeaveCar(); - void stLeanForwardIdle(); - void evIdleDone(); - void stIdleBlink(); - void stUpdateMoveDirection(); - void stTurnCar(); - void moveToNextPoint(); - void stBrakeMoveToNextPoint(); - void stTurnCarMoveToNextPoint(); - void moveToPrevPoint(); - void stBrakeMoveToPrevPoint(); - void stTurnCarMoveToPrevPoint(); - void evTurnCarDone(); - void suMoveToNextPoint(); - void suMoveToPrevPoint(); - void updateSound(); -}; - -class AsCommonIdleCarLower : public AnimatedSprite { -public: - AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y); -}; - -class AsCommonIdleCarFull : public AnimatedSprite { -public: - AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y); -}; - -class AsCommonCarConnector : public AnimatedSprite { -public: - AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar); -protected: - AsCommonCar *_asCar; - void update(); -}; - -class Tracks : public Common::Array { -public: - void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, - DataResource &dataResource); -}; - -class Scene1608 : public Scene { -public: - Scene1608(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene1608(); -protected: - AsCommonCar *_asCar; - Sprite *_asKey; - Sprite *_asIdleCarLower; - Sprite *_asIdleCarFull; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_asTape; - Klaymen *_kmScene1608; - NRect _clipRect1; - NRect _clipRect2; - NRect _clipRect3; - int _carStatus; - bool _carClipFlag; - bool _klaymenInCar; - int _countdown1; - NPointArray *_roomPathPoints; - void upLowerFloor(); - void upUpperFloor(); - void upCarAtHome(); - void upGettingOutOfCar(); - void upRidingCar(); - uint32 hmLowerFloor(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); - void updateKlaymenCliprect(); -}; - -class Scene1609 : public Scene { -public: - Scene1609(NeverhoodEngine *vm, Module *parentModule); -protected: - Sprite *_ssButton; - AsScene3011Symbol *_asSymbols[12]; - int _currentSymbolIndex; - int _noisySymbolIndex; - int _symbolPosition; - int _countdown1; - bool _changeCurrentSymbol; - bool _isSolved; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - bool testVars(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1600_H */ diff --git a/engines/neverhood/module1700.cpp b/engines/neverhood/module1700.cpp deleted file mode 100644 index 183b0b8e75..0000000000 --- a/engines/neverhood/module1700.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1700.h" -#include "neverhood/gamemodule.h" - -namespace Neverhood { - -static const uint32 kModule1700SoundList[] = { - 0xB288D450, - 0x90804450, - 0x99801500, - 0xB288D455, - 0x93825040, - 0 -}; - -Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - _vm->_soundMan->addMusic(0x04212331, 0x31114225); - _vm->_soundMan->addSoundList(0x04212331, kModule1700SoundList); - _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 50, 600, 5, 150); - _vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 0) - createScene(0, -1); - else if (which == 1) - createScene(4, 1); - else - createScene(4, 3); - -} - -Module1700::~Module1700() { - _vm->_soundMan->deleteGroup(0x04212331); -} - -void Module1700::createScene(int sceneNum, int which) { - debug("Module1700::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); - createSmackerScene(0x3028A005, true, true, false); - break; - case 1: - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004AE8B8, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - createNavigationScene(0x004AE8E8, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); - createSmackerScene(0x01190041, true, true, false); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); - _vm->_soundMan->startMusic(0x31114225, 0, 2); - _childObject = new Scene1705(_vm, this, which); - break; - } - SetUpdateHandler(&Module1700::updateScene); - _childObject->handleUpdate(); -} - -void Module1700::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 0, 0, 0, 0); - createScene(1, 0); - break; - case 1: - if (_moduleResult == 0) - createScene(2, 0); - else if (_moduleResult == 1) - createScene(1, 1); - break; - case 2: - if (_moduleResult == 0) - createScene(3, -1); - else if (_moduleResult == 1) - createScene(1, 1); - else if (_moduleResult == 2) { - if (!isSoundPlaying(0)) { - setSoundVolume(0, 60); - playSound(0, 0x58B45E58); - } - createScene(2, 2); - } - break; - case 3: - createScene(4, 0); - break; - case 4: - leaveModule(1); - break; - } - } -} - -// Scene1705 - -static const uint32 kScene1705FileHashes[] = { - 0x910EA801, 0x920EA801, 0x940EA801, - 0x980EA801, 0x800EA801, 0xB00EA801, - 0xD00EA801, 0x100EA801, 0x900EA800, - 0xD10EA801, 0x110EA801, 0x910EA800 -}; - -SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex) - : StaticSprite(vm, fileHash, 100) { - - _x = _spriteResource.getPosition().x + symbolIndex * 30; - _y = _spriteResource.getPosition().y + 160; - updatePosition(); -} - -SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash) - : StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _tapeIndex(tapeIndex) { - - if (!getSubVar(VA_HAS_TAPE, _tapeIndex) && !getSubVar(VA_IS_TAPE_INSERTED, _tapeIndex)) { - SetMessageHandler(&SsScene1705Tape::handleMessage); - } else { - setVisible(false); - SetMessageHandler(NULL); - } - _collisionBoundsOffset = _drawOffset; - _collisionBoundsOffset.x -= 4; - _collisionBoundsOffset.y -= 8; - _collisionBoundsOffset.width += 8; - _collisionBoundsOffset.height += 16; - Sprite::updateBounds(); -} - -uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setSubVar(VA_HAS_TAPE, _tapeIndex, 1); - setVisible(false); - SetMessageHandler(NULL); - break; - } - return messageResult; -} - -Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _paletteArea(1) { - - Sprite *tempSprite; - - setGlobalVar(V_FELL_DOWN_HOLE, 1); - _vm->gameModule()->initCannonSymbolsPuzzle(); - - SetMessageHandler(&Scene1705::handleMessage); - SetUpdateHandler(&Scene1705::update); - - setHitRects(0x004B69D8); - setBackground(0x03118226); - setPalette(0x03118226); - _palette->addBasePalette(0x91D3A391, 0, 64, 0); - _palette->copyBasePalette(0, 256, 0); - addEntity(_palette); - insertScreenMouse(0x18222039); - - insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0); - insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1); - insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2); - _sprite = insertStaticSprite(0x31313A22, 1100); - _ssTape = insertSprite(this, 15, 1100, 238, 439, 0x02363852); - addCollisionSprite(_ssTape); - - if (which < 0) { - // Restoring game - insertKlaymen(231, 434); - setMessageList(0x004B69E8); - sendMessage(this, 0x2000, 0); - _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); - } else if (which == 1) { - // Klaymen teleporting in - insertKlaymen(431, 434); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B6A08, false); - sendMessage(this, 0x2000, 1); - _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); - } else if (which == 2) { - // Klaymen teleporting out - insertKlaymen(431, 434); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B6AA0, false); - sendMessage(this, 0x2000, 1); - _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); - } else if (which == 3) { - // Klaymen returning from teleporter console - insertKlaymen(431, 434); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B6A18, false); - sendMessage(this, 0x2000, 1); - _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); - } else { - // Klaymen falling through the hole - insertKlaymen(231, 74); - sendMessage(_klaymen, 0x2000, 0); - setMessageList(0x004B69F0); - sendMessage(this, 0x2000, 0); - tempSprite = insertStaticSprite(0x30303822, 1100); - _klaymen->setClipRect(0, tempSprite->getDrawRect().y, _sprite->getDrawRect().x2(), 480); - } - -} - -void Scene1705::update() { - Scene::update(); - if (_klaymen->getX() < 224 && _paletteArea != 0) { - _palette->addBasePalette(0xF2210C15, 0, 64, 0); - _palette->startFadeToPalette(12); - _paletteArea = 0; - } else if (_klaymen->getX() >= 224 && _paletteArea == 0) { - _palette->addBasePalette(0x91D3A391, 0, 64, 0); - _palette->startFadeToPalette(12); - _paletteArea = 1; - } -} - -uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - if (param.asInteger()) { - setRectList(0x004B6B40); - _klaymen->setKlaymenIdleTable3(); - } else { - setRectList(0x004B6B30); - _klaymen->setKlaymenIdleTable1(); - } - break; - case 0x4826: - if (sender == _ssTape && _klaymen->getX() <= 318) { - sendEntityMessage(_klaymen, 0x1014, sender); - setMessageList(0x004B6AC0); - } - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1700.h b/engines/neverhood/module1700.h deleted file mode 100644 index 26e1a5e0b0..0000000000 --- a/engines/neverhood/module1700.h +++ /dev/null @@ -1,72 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1700_H -#define NEVERHOOD_MODULE1700_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/smackerscene.h" - -namespace Neverhood { - -class Module1700 : public Module { -public: - Module1700(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1700(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene1705 - -class SsScene1705WallSymbol : public StaticSprite { -public: - SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex); -}; - -class SsScene1705Tape : public StaticSprite { -public: - SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash); -protected: - Scene *_parentScene; - uint32 _tapeIndex; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1705 : public Scene { -public: - Scene1705(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_sprite; - Sprite *_ssTape; - int _paletteArea; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1700_H */ diff --git a/engines/neverhood/module1800.cpp b/engines/neverhood/module1800.cpp deleted file mode 100644 index 99b51295b7..0000000000 --- a/engines/neverhood/module1800.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1800.h" -#include "neverhood/navigationscene.h" -#include "neverhood/menumodule.h" - -namespace Neverhood { - -static const uint32 kModule1800SoundList[] = { - 0x16805548, - 0x16805048, - 0xD0E14441, - 0x90E090C2, - 0x90E1D0C2, - 0x90E2D0C2, - 0 -}; - -Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - _vm->_soundMan->addSoundList(0x04A14718, kModule1800SoundList); - _vm->_soundMan->setSoundListParams(kModule1800SoundList, true, 50, 600, 10, 150); - _vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 2) - createScene(5, 0); - else if (which == 3) - createScene(0, 0); - else - createScene(3, 1); - -} - -Module1800::~Module1800() { - _vm->_soundMan->deleteGroup(0x04A14718); -} - -void Module1800::createScene(int sceneNum, int which) { - static const byte kNavigationTypes00[] = {1, 0, 2, 0}; - static const byte kNavigationTypes01[] = {5}; - debug("Module1800::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - createNavigationScene(0x004AFD38, which, kNavigationTypes00); - break; - case 1: - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004AFD98, which, kNavigationTypes01); - break; - case 2: - _vm->gameState().sceneNum = 2; - createSmackerScene(0x006C0085, true, true, false); - break; - case 3: - _vm->gameState().sceneNum = 3; - createNavigationScene(0x004AFDB0, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - createNavigationScene(0x004AFDE0, which); - break; - case 5: - _vm->gameState().sceneNum = 5; - createNavigationScene(0x004AFE40, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->_soundMan->deleteGroup(0x04A14718); - createSmackerScene(0x08D84010, true, true, false); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->_soundMan->setSoundListParams(kModule1800SoundList, false, 0, 0, 0, 0); - createSmackerScene(0x0168B121, true, true, false); - break; - case 8: - _vm->gameState().sceneNum = 8; - _childObject = new CreditsScene(_vm, this, false); - break; - case 1009: - _vm->gameState().sceneNum = 3; - // NOTE: Newly introduced sceneNum 1009 (was duplicate 3 with own update handler) - createSmackerScene(0x0A840C01, true, true, false); - break; - } - SetUpdateHandler(&Module1800::updateScene); - _childObject->handleUpdate(); -} - -void Module1800::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(4, 0); - else if (_moduleResult == 2) - createScene(1, -1); - else if (_moduleResult == 3) - createScene(3, 0); - break; - case 1: - if (_navigationAreaType == 3) - createScene(7, -1); - else - createScene(2, -1); - break; - case 2: - createScene(0, 2); - break; - case 3: - if (_moduleResult == 0) - createScene(1009, -1); - else if (_moduleResult == 1) - createScene(0, 1); - break; - case 4: - if (_moduleResult == 0) - createScene(6, -1); - else if (_moduleResult == 1) - createScene(5, 0); - else if (_moduleResult == 2) - createScene(0, 3); - else if (_moduleResult == 3) - createScene(4, 3); - break; - case 5: - if (_moduleResult == 0) - leaveModule(2); - else if (_moduleResult == 1) - createScene(4, 3); - break; - case 6: - createScene(8, -1); - break; - case 7: - leaveModule(3); - break; - case 8: - // NOTE: After Klaymen jumped into the hole and died... - leaveModule(1); - break; - case 1009: - leaveModule(0); - break; - } - } else { - switch (_sceneNum) { - case 0: - if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) - _vm->_soundMan->setTwoSoundsPlayFlag(false); - break; - } - } -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1800.h b/engines/neverhood/module1800.h deleted file mode 100644 index 3c1d02e09c..0000000000 --- a/engines/neverhood/module1800.h +++ /dev/null @@ -1,46 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1800_H -#define NEVERHOOD_MODULE1800_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module1800 - -class Module1800 : public Module { -public: - Module1800(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1800(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1800_H */ diff --git a/engines/neverhood/module1900.cpp b/engines/neverhood/module1900.cpp deleted file mode 100644 index 348306f39b..0000000000 --- a/engines/neverhood/module1900.cpp +++ /dev/null @@ -1,650 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module1900.h" -#include "neverhood/gamemodule.h" - -namespace Neverhood { - -static const uint32 kModule1900SoundList[] = { - 0xB4005E60, - 0x91835066, - 0x90E14440, - 0 -}; - -Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - // NOTE: The original has a Scene1908 here as well but it's not used here but in another module... - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else - createScene(0, 0); - - _vm->_soundMan->addSoundList(0x04E1C09C, kModule1900SoundList); - _vm->_soundMan->setSoundListParams(kModule1900SoundList, true, 50, 600, 5, 150); - -} - -Module1900::~Module1900() { - _vm->_soundMan->deleteGroup(0x04E1C09C); -} - -void Module1900::createScene(int sceneNum, int which) { - debug("Module1900::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene1901(_vm, this, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - _childObject = new Scene1907(_vm, this); - break; - } - SetUpdateHandler(&Module1900::updateScene); - _childObject->handleUpdate(); -} - -void Module1900::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(6, 0); - else - leaveModule(0); - break; - case 6: - createScene(0, 1); - break; - } - } -} - -// Scene1901 - -Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - setRectList(0x004B34C8); - - setBackground(0x01303227); - setPalette(0x01303227); - insertScreenMouse(0x0322301B); - - insertStaticSprite(0x42213133, 1100); - - if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) - insertStaticSprite(0x40A40168, 100); - else if (getGlobalVar(V_STAIRS_DOWN)) { - insertStaticSprite(0x124404C4, 100); - setGlobalVar(V_STAIRS_DOWN_ONCE, 1); - } else - insertStaticSprite(0x02840064, 100); - - if (which < 0) { - // Restoring game - insertKlaymen(120, 380); - setMessageList(0x004B3408); - } else if (which == 1) { - // Klaymen returning from the puzzle - insertKlaymen(372, 380); - setMessageList(0x004B3410); - } else { - // Klaymen entering from the left - insertKlaymen(0, 380); - setMessageList(0x004B3400); - } - - tempSprite = insertStaticSprite(0x4830A402, 1100); - _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); - -} - -static const NPoint kAsScene1907SymbolGroundPositions[] = { - {160, 310}, { 90, 340}, {210, 335}, - {210, 380}, {310, 340}, {290, 400}, - {400, 375}, {370, 435}, {475, 415} -}; - -static const NPoint kAsScene1907SymbolPluggedInPositions[] = { - {275, 125}, {244, 125}, {238, 131}, - {221, 135}, {199, 136}, {168, 149}, - {145, 152}, {123, 154}, {103, 157} -}; - -static const NPoint kAsScene1907SymbolGroundHitPositions[] = { - {275, 299}, {244, 299}, {238, 305}, - {221, 309}, {199, 310}, {168, 323}, - {145, 326}, {123, 328}, {103, 331} -}; - -static const NPoint kAsScene1907SymbolPluggedInDownPositions[] = { - {275, 136}, {244, 156}, {238, 183}, - {221, 207}, {199, 228}, {168, 262}, - {145, 285}, {123, 307}, {103, 331} -}; - -static const uint32 kAsScene1907SymbolFileHashes[] = { - 0x006A1034, 0x006A1010, 0x006A1814, - 0x006A1016, 0x006A0014, 0x002A1014, - 0x00EA1014, 0x206A1014, 0x046A1414 -}; - -bool AsScene1907Symbol::_plugInFailed = false; -int AsScene1907Symbol::_plugInTryCount = 0; - -AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex) - : AnimatedSprite(vm, 1000 - positionIndex), _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) { - - _plugInFailed = false; - _plugInTryCount = 0; - - if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { - _isPluggedIn = true; - _currPositionIndex = elementIndex; - if (!getGlobalVar(V_STAIRS_DOWN)) { - _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; - _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; - } else { - _x = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].x; - _y = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].y; - } - createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - _isPluggedIn = false; - _currPositionIndex = positionIndex; - loadSound(0, 0x74231924); - loadSound(1, 0x36691914); - loadSound(2, 0x5421D806); - _parentScene->setPositionFree(_currPositionIndex, false); - _x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x; - _y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y; - createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); - _newStickFrameIndex = 0; - } - _collisionBoundsOffset.set(0, 0, 80, 80); - Sprite::updateBounds(); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1907Symbol::handleMessage); - -} - -void AsScene1907Symbol::update() { - updateAnim(); - handleSpriteUpdate(); - updatePosition(); - if (_plugInFailed && _plugInTryCount == 0) - _plugInFailed = false; -} - -uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (!_isPluggedIn && !_plugInFailed) { - tryToPlugIn(); - messageResult = 1; - } else - messageResult = 0; - break; - } - return messageResult; -} - -uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1907Symbol::suTryToPlugIn() { - _currStep++; - _x -= _deltaX; - _y -= _deltaY; - if (_currStep == 16) { - _x -= _smallDeltaX; - _y -= _smallDeltaY; - SetSpriteUpdate(NULL); - } -} - -void AsScene1907Symbol::suFallOff() { - if (_fallOffDelay != 0) { - _fallOffDelay--; - } else { - _y += _yAccel; - _yAccel += 8; - if (_y >= kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) { - _y = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y; - stFallOffHitGround(); - } - } -} - -void AsScene1907Symbol::suFallOffHitGround() { - - if (_x == _someX - _xBreak) - _x -= _smallDeltaX; - else - _x -= _deltaX; - - if (_y == kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) { - _y -= _someY; - } - - if (_currStep < 8) { - _y -= _yAccel; - _yAccel -= 4; - if (_yAccel < 0) - _yAccel = 0; - } else if (_currStep < 15) { - _y += _yAccel; - _yAccel += 4; - } else { - _y = kAsScene1907SymbolGroundPositions[_newPositionIndex].y; - cbFallOffHitGroundEvent(); - } - - _currStep++; -} - -void AsScene1907Symbol::suMoveDown() { - _y += _yIncr; - if (_yIncr < 11) - _yIncr++; - if (_y >= kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y) { - _y = kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y; - _isMoving = false; - SetSpriteUpdate(NULL); - } -} - -void AsScene1907Symbol::suMoveUp() { - _y -= _yIncr; - if (getGlobalVar(V_WALL_BROKEN)) { - if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) - _yIncr--; - else - _yIncr++; - } else - _yIncr = 2; - if (_yIncr > 9) - _yIncr = 9; - else if (_yIncr < 1) - _yIncr = 1; - if (_y < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { - _y = kAsScene1907SymbolPluggedInPositions[_elementIndex].y; - _isMoving = false; - SetSpriteUpdate(NULL); - } -} - -void AsScene1907Symbol::tryToPlugIn() { - _isPluggedIn = true; - _plugInTryCount++; - _newPositionIndex = _parentScene->getNextPosition(); - _parentScene->setPositionFree(_currPositionIndex, true); - sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex); - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); - SetUpdateHandler(&AsScene1907Symbol::update); - SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn); - SetSpriteUpdate(&AsScene1907Symbol::suTryToPlugIn); - _currStep = 0; - _deltaX = (_x - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x) / 16; - _smallDeltaX = _x - _deltaX * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x; - _deltaY = (_y - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y) / 16; - _smallDeltaY = _y - _deltaY * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y; - if (_elementIndex == _newPositionIndex) { - NextState(&AsScene1907Symbol::stPlugIn); - } else { - _plugInFailed = true; - NextState(&AsScene1907Symbol::stPlugInFail); - } -} - -void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { - _isPluggedIn = false; - _newPositionIndex = newPositionIndex; - _fallOffDelay = fallOffDelay; - _parentScene->setPositionFree(_newPositionIndex, false); - _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; - _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; - _someX = _x; - _someY = _y; - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0); - _playBackwards = true; - _newStickFrameIndex = STICK_LAST_FRAME; - _currStep = 0; - _yAccel = 1; - SetUpdateHandler(&AsScene1907Symbol::update); - SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteUpdate(&AsScene1907Symbol::suFallOff); -} - -void AsScene1907Symbol::stFallOffHitGround() { - playSound(1); - sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); - Entity::_priority = 1000 - _newPositionIndex; - _parentScene->removeCollisionSprite(this); - _parentScene->addCollisionSprite(this); - SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround); - NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); - _newStickFrameIndex = 0; - _currStep = 0; - _yAccel = 30; - _deltaX = (_x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x) / 15; - _xBreak = _deltaX * 15; - _smallDeltaX = _x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x - _xBreak; - _someY = 0; - if (kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y > kAsScene1907SymbolGroundPositions[_newPositionIndex].y) - _someY = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y - kAsScene1907SymbolGroundPositions[_newPositionIndex].y; -} - -void AsScene1907Symbol::cbFallOffHitGroundEvent() { - _currPositionIndex = _newPositionIndex; - if (_plugInTryCount > 0) - _plugInTryCount--; - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteUpdate(NULL); - updateBounds(); - playSound(2); -} - -void AsScene1907Symbol::stPlugIn() { - playSound(0); - _currPositionIndex = _newPositionIndex; - stopAnimation(); - SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteUpdate(NULL); - if (_elementIndex == 8) - sendMessage(_parentScene, 0x2001, 0); -} - -void AsScene1907Symbol::stPlugInFail() { - _currPositionIndex = _newPositionIndex; - stopAnimation(); - _parentScene->plugInFailed(); -} - -void AsScene1907Symbol::moveUp() { - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); - stopAnimation(); - SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteUpdate(&AsScene1907Symbol::suMoveUp); - _yIncr = 1; - _isMoving = true; -} - -void AsScene1907Symbol::moveDown() { - startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); - stopAnimation(); - SetMessageHandler(&AsScene1907Symbol::handleMessage); - SetSpriteUpdate(&AsScene1907Symbol::suMoveDown); - _yIncr = 4; - _isMoving = true; -} - -SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol) - : StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol), - _countdown1(0) { - - loadSprite(0x64516424, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1400); - setVisible(false); - loadSound(0, 0x44061000); - SetUpdateHandler(&SsScene1907UpDownButton::update); - SetMessageHandler(&SsScene1907UpDownButton::handleMessage); - if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { - if (getGlobalVar(V_STAIRS_DOWN)) - setToDownPosition(); - else - setToUpPosition(); - } -} - -void SsScene1907UpDownButton::update() { - updatePosition(); - if (_countdown1 != 0 && (--_countdown1 == 0)) { - setVisible(false); - sendMessage(_parentScene, 0x2000, 0); - } -} - -uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { - setVisible(true); - _countdown1 = 4; - updatePosition(); - playSound(0); - } - messageResult = 1; - } - return messageResult; -} - -void SsScene1907UpDownButton::setToUpPosition() { - _y = _spriteResource.getPosition().y; - updateBounds(); - updatePosition(); -} - -void SsScene1907UpDownButton::setToDownPosition() { - _y = _spriteResource.getPosition().y + 174; - updateBounds(); - updatePosition(); -} - -AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1400) { - - createSurface1(0x110A1061, 1500); - _x = 320; - _y = 240; - startAnimation(0x110A1061, 0, -1); - _newStickFrameIndex = 0; - setVisible(false); - _needRefresh = true; - AnimatedSprite::updatePosition(); - SetUpdateHandler(&AsScene1907WaterHint::update); - SetMessageHandler(&Sprite::handleMessage); -} - -void AsScene1907WaterHint::update() { - updateAnim(); - updatePosition(); -} - -uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene1907WaterHint::show() { - setVisible(true); - startAnimation(0x110A1061, 0, -1); - SetMessageHandler(&AsScene1907WaterHint::hmShowing); - NextState(&AsScene1907WaterHint::hide); -} - -void AsScene1907WaterHint::hide() { - stopAnimation(); - setVisible(false); - SetMessageHandler(&Sprite::handleMessage); -} - -Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _currMovingSymbolIndex(0), _pluggedInCount(0), - _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { - - setBackground(0x20628E05); - setPalette(0x20628E05); - - for (int i = 0; i < 9; i++) - _positionFree[i] = true; - - for (int i = 0; i < 9; i++) { - _asSymbols[i] = insertSprite(this, i, getRandomPositionIndex()); - addCollisionSprite(_asSymbols[i]); - } - - _ssUpDownButton = insertSprite(this, _asSymbols[8]); - addCollisionSprite(_ssUpDownButton); - - _asWaterHint = insertSprite(); - - insertPuzzleMouse(0x28E0120E, 20, 620); - - SetMessageHandler(&Scene1907::handleMessage); - SetUpdateHandler(&Scene1907::update); - - if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) - _pluggedInCount = 9; - - loadSound(0, 0x72004A10); - loadSound(1, 0x22082A12); - loadSound(2, 0x21100A10); - loadSound(3, 0x68E25540); - -} - -void Scene1907::update() { - Scene::update(); - - if (_hasPlugInFailed) { - int fallOffDelay = 0; - _hasPlugInFailed = false; - for (int i = 0; i < 9; i++) { - AsScene1907Symbol *asSymbol = _asSymbols[8 - i]; - if (asSymbol->isPluggedIn()) { - asSymbol->fallOff(getRandomPositionIndex(), fallOffDelay); - fallOffDelay += _vm->_rnd->getRandomNumber(10 - 1) + 4; - } - } - } - - if (_moveDownCountdown != 0 && (--_moveDownCountdown == 0)) { - _asSymbols[_currMovingSymbolIndex]->moveDown(); - if (_currMovingSymbolIndex > 0) { - _moveDownCountdown = 2; - _currMovingSymbolIndex--; - } - } - - if (_moveUpCountdown != 0 && (--_moveUpCountdown == 0)) { - _moveDownCountdown = 0; - for (int i = 0; i < 9; i++) - _asSymbols[i]->moveUp(); - } - - if (_countdown3 != 0 && (--_countdown3 == 0)) { - _asWaterHint->show(); - _moveUpCountdown = 4; - } - -} - -uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && - !_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) { - leaveScene(0); - } - break; - case 0x2000: - if (getGlobalVar(V_STAIRS_DOWN)) { - playSound(0); - for (int i = 0; i < 9; i++) - _asSymbols[i]->moveUp(); - _ssUpDownButton->setToUpPosition(); - setGlobalVar(V_STAIRS_DOWN, 0); - } else { - if (!getGlobalVar(V_WALL_BROKEN)) { - playSound(2); - _countdown3 = 5; - } else { - playSound(1); - _ssUpDownButton->setToDownPosition(); - setGlobalVar(V_STAIRS_DOWN, 1); - } - _moveDownCountdown = 1; - _currMovingSymbolIndex = 8; - } - break; - case 0x2001: - playSound(3); - setGlobalVar(V_STAIRS_PUZZLE_SOLVED, 1); - break; - } - return 0; -} - -void Scene1907::plugInFailed() { - _pluggedInCount = 0; - _hasPlugInFailed = true; -} - -int Scene1907::getRandomPositionIndex() { - bool found = false; - int index = 0; - // Check if any position is free - for (int i = 0; i < 9; i++) - if (_positionFree[i]) - found = true; - if (found) { - // Get a random free position - found = false; - while (!found) { - index = _vm->_rnd->getRandomNumber(9 - 1); - if (_positionFree[index]) - found = true; - } - } - return index; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module1900.h b/engines/neverhood/module1900.h deleted file mode 100644 index 72dbf63a51..0000000000 --- a/engines/neverhood/module1900.h +++ /dev/null @@ -1,143 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE1900_H -#define NEVERHOOD_MODULE1900_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1200.h" - -namespace Neverhood { - -class Module1900 : public Module { -public: - Module1900(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module1900(); -protected: - int _sceneNum; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene1901 - -class Scene1901 : public Scene { -public: - Scene1901(NeverhoodEngine *vm, Module *parentModule, int which); -}; - -// Scene1907 - -class Scene1907; - -class AsScene1907Symbol : public AnimatedSprite { -public: - AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex); - void moveUp(); - void moveDown(); - void fallOff(int newPositionIndex, int fallOffDelay); - bool isPluggedIn() { return _isPluggedIn; } - bool isMoving() { return _isMoving; } -protected: - Scene1907 *_parentScene; - int _elementIndex; - int _currPositionIndex; - int _newPositionIndex; - bool _isPluggedIn; - bool _isMoving; - int _someX, _someY; - int _xBreak; - int _currStep; - int _yAccel; - int _yIncr; - int _fallOffDelay; - int _deltaX, _smallDeltaX; - int _deltaY, _smallDeltaY; - // Dumb, change if possible - static bool _plugInFailed; - static int _plugInTryCount; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender); - void suTryToPlugIn(); - void suFallOff(); - void suFallOffHitGround(); - void suMoveDown(); - void suMoveUp(); - void tryToPlugIn(); - void stFallOffHitGround(); - void cbFallOffHitGroundEvent(); - void stPlugIn(); - void stPlugInFail(); -}; - -class AsScene1907WaterHint : public AnimatedSprite { -public: - AsScene1907WaterHint(NeverhoodEngine *vm); - void show(); -protected: - void update(); - uint32 hmShowing(int messageNum, const MessageParam ¶m, Entity *sender); - void hide(); -}; - -class SsScene1907UpDownButton : public StaticSprite { -public: - SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol); - void setToUpPosition(); - void setToDownPosition(); -protected: - Scene1907 *_parentScene; - AsScene1907Symbol *_asScene1907Symbol; - int _countdown1; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene1907 : public Scene { -public: - Scene1907(NeverhoodEngine *vm, Module *parentModule); - void plugInFailed(); - void setPositionFree(int index, bool value) { _positionFree[index] = value; } - int getNextPosition() { return _pluggedInCount++; } -protected: - AsScene1907Symbol *_asSymbols[9]; - SsScene1907UpDownButton *_ssUpDownButton; - AsScene1907WaterHint *_asWaterHint; - int _currMovingSymbolIndex; - int _pluggedInCount; - int _moveDownCountdown; - int _moveUpCountdown; - int _countdown3; - bool _hasPlugInFailed; - bool _positionFree[9]; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - int getRandomPositionIndex(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE1900_H */ diff --git a/engines/neverhood/module2000.cpp b/engines/neverhood/module2000.cpp deleted file mode 100644 index 71bcdc7e58..0000000000 --- a/engines/neverhood/module2000.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2000.h" -#include "neverhood/gamemodule.h" -#include "neverhood/navigationscene.h" - -namespace Neverhood { - -Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 0) - createScene(0, 1); - else if (which == 1) - createScene(0, 3); - -} - -Module2000::~Module2000() { - _vm->_soundMan->deleteGroup(0x81293110); -} - -void Module2000::createScene(int sceneNum, int which) { - debug("Module2000::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2001(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - setGlobalVar(V_WORLDS_JOINED, 1); - setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1); - createSmackerScene(0x204B2031, true, true, false); - break; - } - SetUpdateHandler(&Module2000::updateScene); - _childObject->handleUpdate(); -} - -void Module2000::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - leaveModule(0); - else - createScene(1, 0); - break; - case 1: - if (_moduleResult == 0) { - if (getGlobalVar(V_WORLDS_JOINED)) - createScene(1, 0); - else - createScene(2, -1); - } else if (_moduleResult == 1) - createScene(1, 1); - else if (_moduleResult == 2) - createScene(0, 0); - break; - case 2: - createScene(1, 0); - break; - } - } -} - -// Scene2001 - -Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - SetMessageHandler(&Scene2001::handleMessage); - - setBackground(0xA6417244); - setPalette(0xA6417244); - insertScreenMouse(0x17240A6C); - - tempSprite = insertStaticSprite(0x0D641724, 1100); - - if (which < 0) { - // Restoring game - insertKlaymen(300, 345); - setMessageList(0x004B3538); - sendMessage(this, 0x2000, 0); - } else if (which == 1) { - // Klaymen teleporting in - insertKlaymen(116, 345); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B3540, false); - sendMessage(this, 0x2000, 1); - } else if (which == 2) { - // Klaymen teleporting out - insertKlaymen(116, 345); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B35F0, false); - sendMessage(this, 0x2000, 1); - } else if (which == 3) { - // Klaymen returning from teleporter console - insertKlaymen(116, 345); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B3550, false); - sendMessage(this, 0x2000, 1); - } else { - // Klaymen standing around - insertKlaymen(390, 345); - setMessageList(0x004B3530); - sendMessage(this, 0x2000, 0); - _klaymen->setDoDeltaX(1); - } - - _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); - -} - -uint32 Scene2001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - if (param.asInteger()) { - setRectList(0x004B3680); - _klaymen->setKlaymenIdleTable3(); - } else { - setRectList(0x004B3670); - _klaymen->setKlaymenIdleTable1(); - } - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2000.h b/engines/neverhood/module2000.h deleted file mode 100644 index 9859c73006..0000000000 --- a/engines/neverhood/module2000.h +++ /dev/null @@ -1,55 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2000_H -#define NEVERHOOD_MODULE2000_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1200.h" - -namespace Neverhood { - -class Module2000 : public Module { -public: - Module2000(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2000(); -protected: - int _sceneNum; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene2001 - -class Scene2001 : public Scene { -public: - Scene2001(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2000_H */ diff --git a/engines/neverhood/module2100.cpp b/engines/neverhood/module2100.cpp deleted file mode 100644 index cd7a3d5e24..0000000000 --- a/engines/neverhood/module2100.cpp +++ /dev/null @@ -1,336 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2100.h" -#include "neverhood/gamemodule.h" -#include "neverhood/module1200.h" - -namespace Neverhood { - -Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - _vm->_soundMan->addMusic(0x10A10C14, 0x11482B95); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 1) - createScene(0, 0); - else if (which == 2) - createScene(0, 3); - else - createScene(0, 1); - -} - -Module2100::~Module2100() { - _vm->_soundMan->deleteMusicGroup(0x10A10C14); -} - -void Module2100::createScene(int sceneNum, int which) { - debug("Module2100::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->_soundMan->startMusic(0x11482B95, 0, 1); - _childObject = new Scene2101(_vm, this, which); - break; - } - SetUpdateHandler(&Module2100::updateScene); - _childObject->handleUpdate(); -} - -void Module2100::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) { - setGlobalVar(V_DOOR_PASSED, 1); - leaveModule(0); - } else - leaveModule(1); - break; - } - } -} - -// Scene2101 - -AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool isOpen) - : AnimatedSprite(vm, 1100) { - - createSurface(100, 328, 347); - _x = 320; - _y = 240; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2101Door::handleMessage); - if (isOpen) { - startAnimation(0x0C202B9C, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } else - setVisible(false); -} - -uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - case 0x4808: - stOpenDoor(); - break; - case 0x4809: - stCloseDoor(); - break; - } - return messageResult; -} - -void AsScene2101Door::stOpenDoor() { - startAnimation(0x0C202B9C, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - setVisible(true); - playSound(0, calcHash("fxDoorOpen32")); -} - -void AsScene2101Door::stCloseDoor() { - startAnimation(0xC222A8D4, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - setVisible(true); - playSound(0, calcHash("fxDoorClose32")); - NextState(&AsScene2101Door::stCloseDoorDone); -} - -void AsScene2101Door::stCloseDoorDone() { - stopAnimation(); - setVisible(false); -} - -AsScene2101HitByDoorEffect::AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klaymen) - : AnimatedSprite(vm, 1400), _klaymen(klaymen) { - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2101HitByDoorEffect::handleMessage); - createSurface(1200, 88, 165); - setVisible(false); -} - -uint32 AsScene2101HitByDoorEffect::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2001: - _x = _klaymen->getX(); - _y = _klaymen->getY() - 132; - startAnimation(0x0422255A, 0, -1); - setVisible(true); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) - : StaticSprite(vm, 1100), _parentScene(parentScene), _countdown(0), - _fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) { - - SetUpdateHandler(&SsCommonFloorButton::update); - SetMessageHandler(&SsCommonFloorButton::handleMessage); - if (_soundFileHash == 0) - _soundFileHash = 0x44141000; - createSurface(1010, 61, 30); - if (_fileHash1) - loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); - else - setVisible(false); -} - -void SsCommonFloorButton::update() { - if (_countdown != 0 && (--_countdown == 0)) { - sendMessage(_parentScene, 0x1022, 1010); - if (_fileHash1) - loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); - else - setVisible(false); - } -} - -uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x480B: - sendMessage(_parentScene, 0x480B, 0); - setVisible(true); - sendMessage(_parentScene, 0x1022, 990); - loadSprite(_fileHash2, kSLFDefDrawOffset | kSLFDefPosition); - _countdown = 16; - playSound(0, _soundFileHash); - break; - } - return messageResult; -} - -Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - SetMessageHandler(&Scene2101::handleMessage); - SetUpdateHandler(&Scene2101::update); - - setBackground(0x44242305); - setPalette(0x44242305); - insertScreenMouse(0x4230144A); - - insertStaticSprite(0x00502330, 1100); - tempSprite = insertStaticSprite(0x78492010, 1100); - _ssFloorButton = insertSprite(this, 0x72427010, 0x32423010, 200, 0); - _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); - addCollisionSprite(_asTape1); - _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); - addCollisionSprite(_asTape2); - - if (which < 0) { - insertKlaymen(380, 438); - setMessageList(0x004B8E48); - sendMessage(this, 0x2000, 0); - _asDoor = insertSprite(false); - _doorStatus = 1; - _countdown1 = 0; - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 438); - setMessageList(0x004B8E50); - sendMessage(this, 0x2000, 0); - _asDoor = insertSprite(true); - _doorStatus = 2; - _countdown1 = 48; - } else if (which == 2) { - // Klaymen teleporting out - insertKlaymen(115, 438); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B8F58); - sendMessage(this, 0x2000, 1); - _asDoor = insertSprite(false); - _doorStatus = 1; - _countdown1 = 0; - } else if (which == 3) { - // Klaymen returning from the teleporter console - insertKlaymen(115, 438); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B8EB0); - sendMessage(this, 0x2000, 1); - _asDoor = insertSprite(false); - _doorStatus = 1; - _countdown1 = 0; - } else { - // Klaymen teleporting in - insertKlaymen(115, 438); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004B8EA0); - sendMessage(this, 0x2000, 1); - _asDoor = insertSprite(false); - _doorStatus = 1; - _countdown1 = 0; - } - - _asHitByDoorEffect = insertSprite(_klaymen); - _klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); - -} - -void Scene2101::update() { - if (_countdown1 != 0) { - if (_doorStatus == 2) { - if (--_countdown1 == 0) { - sendMessage(_asDoor, 0x4809, 0); - _doorStatus = 1; - } - } else { - if (_klaymen->getX() > 575) - _canAcceptInput = false; - if (--_countdown1 == 0) { - if (_klaymen->getX() < 480) { - sendMessage(_asDoor, 0x4809, 0); - _doorStatus = 1; - } else if (_klaymen->getX() >= 480 && _klaymen->getX() <= 575) { - _klaymen->setDoDeltaX(0); - setMessageList2(0x004B8F48); - sendMessage(_asDoor, 0x4809, 0); - sendMessage(_asHitByDoorEffect, 0x2001, 0); - _doorStatus = 1; - } - } - } - } else if (_doorStatus == 1 && _messageValue >= 0 && _klaymen->getX() > 470 && !isMessageList2(0x004B8F48)) - setMessageList2(0x004B8F50); - Scene::update(); -} - -uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x02144CB1) - sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); - else if (param.asInteger() == 0x21E64A00) { - if (_doorStatus == 0) - setMessageList(0x004B8E80); - else - setMessageList(0x004B8EC8); - } else if (param.asInteger() == 0x41442820) - cancelMessageList(); - break; - case 0x2000: - if (param.asInteger() != 0) { - setRectList(0x004B9008); - _klaymen->setKlaymenIdleTable3(); - } else { - setRectList(0x004B8FF8); - _klaymen->setKlaymenIdleTable1(); - } - break; - case 0x480B: - if (sender == _ssFloorButton && _doorStatus == 1) { - sendMessage(_asDoor, 0x4808, 0); - _doorStatus = 0; - _countdown1 = 90; - } - break; - case 0x4826: - if (sender == _asTape1 || sender == _asTape2) { - if (_klaymen->getX() >= 228 && _klaymen->getX() <= 500) { - sendEntityMessage(_klaymen, 0x1014, sender); - setMessageList(0x004B8F78); - } else if (_klaymen->getX() < 228) - setMessageList2(0x004B8F00); - } - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2100.h b/engines/neverhood/module2100.h deleted file mode 100644 index c2e7d09ff4..0000000000 --- a/engines/neverhood/module2100.h +++ /dev/null @@ -1,92 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2100_H -#define NEVERHOOD_MODULE2100_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -class Module2100 : public Module { -public: - Module2100(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2100(); -protected: - int _sceneNum; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene1901 - -class AsScene2101Door : public AnimatedSprite { -public: - AsScene2101Door(NeverhoodEngine *vm, bool isOpen); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stCloseDoor(); - void stCloseDoorDone(); -}; - -class AsScene2101HitByDoorEffect : public AnimatedSprite { -public: - AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klaymen); -protected: - Sprite *_klaymen; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsCommonFloorButton : public StaticSprite { -public: - SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); -protected: - Scene *_parentScene; - uint32 _soundFileHash; - uint32 _fileHash1, _fileHash2; - int16 _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2101 : public Scene { -public: - Scene2101(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_ssFloorButton; - Sprite *_asTape1; - Sprite *_asTape2; - Sprite *_asDoor; - Sprite *_asHitByDoorEffect; - int _countdown1; - int _doorStatus; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2100_H */ diff --git a/engines/neverhood/module2200.cpp b/engines/neverhood/module2200.cpp deleted file mode 100644 index ddcfb3685c..0000000000 --- a/engines/neverhood/module2200.cpp +++ /dev/null @@ -1,2564 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2200.h" -#include "neverhood/module1000.h" -#include "neverhood/module1200.h" -#include "neverhood/gamemodule.h" -#include "neverhood/diskplayerscene.h" - -namespace Neverhood { - -Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - debug("Create Module2200(%d)", which); - - _vm->_soundMan->addMusic(0x11391412, 0x601C908C); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else - createScene(0, 0); - -} - -Module2200::~Module2200() { - _vm->_soundMan->deleteGroup(0x11391412); -} - -void Module2200::createScene(int sceneNum, int which) { - debug("Module2200::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2201(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->_soundMan->startMusic(0x601C908C, 0, 2); - _childObject = new Scene2202(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->startMusic(0x601C908C, 0, 2); - _childObject = new Scene2203(_vm, this, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - _vm->_soundMan->stopMusic(0x601C908C, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 3); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->stopMusic(0x601C908C, 0, 2); - _childObject = new Scene2205(_vm, this, which); - break; - case 5: - _vm->gameState().sceneNum = 5; - _vm->_soundMan->stopMusic(0x601C908C, 0, 2); - _childObject = new Scene2206(_vm, this, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - _childObject = new Scene2207(_vm, this); - break; - case 7: - if (which >= 0) - _vm->gameState().which = _vm->gameState().sceneNum; - _vm->gameState().sceneNum = 7; - _childObject = new Scene2208(_vm, this, which); - break; - case 8: - _vm->gameState().sceneNum = 8; - _childObject = new Scene2208(_vm, this, which); - break; - case 9: - _vm->gameState().sceneNum = 9; - createHallOfRecordsScene(which, 0x004B7180); - break; - case 10: - _vm->gameState().sceneNum = 10; - createHallOfRecordsScene(which, 0x004B7198); - break; - case 11: - _vm->gameState().sceneNum = 11; - createHallOfRecordsScene(which, 0x004B71B0); - break; - case 12: - _vm->gameState().sceneNum = 12; - createHallOfRecordsScene(which, 0x004B71C8); - break; - case 13: - _vm->gameState().sceneNum = 13; - createHallOfRecordsScene(which, 0x004B71E0); - break; - case 14: - _vm->gameState().sceneNum = 14; - createHallOfRecordsScene(which, 0x004B71F8); - break; - case 15: - _vm->gameState().sceneNum = 15; - createHallOfRecordsScene(which, 0x004B7210); - break; - case 16: - _vm->gameState().sceneNum = 16; - createHallOfRecordsScene(which, 0x004B7228); - break; - case 17: - _vm->gameState().sceneNum = 17; - createHallOfRecordsScene(which, 0x004B7240); - break; - case 18: - _vm->gameState().sceneNum = 18; - createHallOfRecordsScene(which, 0x004B7258); - break; - case 19: - _vm->gameState().sceneNum = 19; - createHallOfRecordsScene(which, 0x004B7270); - break; - case 20: - _vm->gameState().sceneNum = 20; - createHallOfRecordsScene(which, 0x004B7288); - break; - case 21: - _vm->gameState().sceneNum = 21; - createHallOfRecordsScene(which, 0x004B72A0); - break; - case 22: - _vm->gameState().sceneNum = 22; - createHallOfRecordsScene(which, 0x004B72B8); - break; - case 23: - _vm->gameState().sceneNum = 23; - createHallOfRecordsScene(which, 0x004B72D0); - break; - case 24: - _vm->gameState().sceneNum = 24; - createHallOfRecordsScene(which, 0x004B72E8); - break; - case 25: - _vm->gameState().sceneNum = 25; - createHallOfRecordsScene(which, 0x004B7300); - break; - case 26: - _vm->gameState().sceneNum = 26; - createHallOfRecordsScene(which, 0x004B7318); - break; - case 27: - _vm->gameState().sceneNum = 27; - createHallOfRecordsScene(which, 0x004B7330); - break; - case 28: - _vm->gameState().sceneNum = 28; - createHallOfRecordsScene(which, 0x004B7348); - break; - case 29: - _vm->gameState().sceneNum = 29; - createHallOfRecordsScene(which, 0x004B7360); - break; - case 30: - _vm->gameState().sceneNum = 30; - createHallOfRecordsScene(which, 0x004B7378); - break; - case 31: - _vm->gameState().sceneNum = 31; - createHallOfRecordsScene(which, 0x004B7390); - break; - case 32: - _vm->gameState().sceneNum = 32; - createHallOfRecordsScene(which, 0x004B73A8); - break; - case 33: - _vm->gameState().sceneNum = 33; - createHallOfRecordsScene(which, 0x004B73C0); - break; - case 34: - _vm->gameState().sceneNum = 34; - createHallOfRecordsScene(which, 0x004B73D8); - break; - case 35: - _vm->gameState().sceneNum = 35; - createHallOfRecordsScene(which, 0x004B73F0); - break; - case 36: - _vm->gameState().sceneNum = 36; - createHallOfRecordsScene(which, 0x004B7408); - break; - case 37: - _vm->gameState().sceneNum = 37; - createHallOfRecordsScene(which, 0x004B7420); - break; - case 38: - _vm->gameState().sceneNum = 38; - createHallOfRecordsScene(which, 0x004B7438); - break; - case 39: - _vm->gameState().sceneNum = 39; - createHallOfRecordsScene(which, 0x004B7450); - break; - case 40: - _vm->gameState().sceneNum = 40; - createHallOfRecordsScene(which, 0x004B7468); - break; - case 41: - _vm->gameState().sceneNum = 41; - _childObject = new Scene2242(_vm, this, which); - break; - case 42: - _vm->gameState().sceneNum = 42; - createHallOfRecordsScene(which, 0x004B7480); - break; - case 43: - _vm->gameState().sceneNum = 43; - createHallOfRecordsScene(which, 0x004B7498); - break; - case 44: - _vm->gameState().sceneNum = 44; - createHallOfRecordsScene(which, 0x004B74B0); - break; - case 45: - _vm->gameState().sceneNum = 45; - createHallOfRecordsScene(which, 0x004B74C8); - break; - case 46: - _vm->gameState().sceneNum = 46; - _childObject = new Scene2247(_vm, this, which); - break; - case 47: - _vm->gameState().sceneNum = 47; - if (!getGlobalVar(V_WORLDS_JOINED)) { - if (getGlobalVar(V_LIGHTS_ON)) - createStaticScene(0x83110287, 0x10283839); - else - createStaticScene(0x83412B9D, 0x12B9983C); - } else { - if (getGlobalVar(V_LIGHTS_ON)) - createStaticScene(0x48632087, 0x3208348E); - else - createStaticScene(0x08C74886, 0x74882084); - } - break; - } - SetUpdateHandler(&Module2200::updateScene); - _childObject->handleUpdate(); -} - -#define HallOfRecordsSceneLink(nextSceneNum, prevSceneNum) \ - if (_moduleResult == 1) createScene(nextSceneNum, 0); else if (_moduleResult == 2) createScene(7, 0); else createScene(prevSceneNum, 1) - -void Module2200::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(2, 0); - else if (_moduleResult == 2) - createScene(1, 0); - else - leaveModule(0); - break; - case 1: - createScene(0, 2); - break; - case 2: - if (_moduleResult == 1) - createScene(4, 0); - else if (_moduleResult == 2) - createScene(3, 0); - else - createScene(0, 1); - break; - case 3: - createScene(2, 2); - break; - case 4: - if (_moduleResult == 1) - createScene(5, 0); - else if (_moduleResult == 2) - createScene(4, 2); - else - createScene(2, 1); - break; - case 5: - if (_moduleResult == 1) - createScene(46, 0); - else if (_moduleResult == 2) - createScene(6, 0); - else if (_moduleResult == 3) - createScene(8, 0); - else - createScene(4, 1); - break; - case 6: - createScene(5, 2); - break; - case 7: - createScene(_vm->gameState().which, 2); - break; - case 8: - createScene(5, 3); - break; - case 9: - HallOfRecordsSceneLink(10, 46); - break; - case 10: - HallOfRecordsSceneLink(11, 9); - break; - case 11: - HallOfRecordsSceneLink(12, 10); - break; - case 12: - HallOfRecordsSceneLink(13, 11); - break; - case 13: - HallOfRecordsSceneLink(14, 12); - break; - case 14: - HallOfRecordsSceneLink(15, 13); - break; - case 15: - HallOfRecordsSceneLink(16, 14); - break; - case 16: - HallOfRecordsSceneLink(17, 15); - break; - case 17: - HallOfRecordsSceneLink(18, 16); - break; - case 18: - HallOfRecordsSceneLink(19, 17); - break; - case 19: - HallOfRecordsSceneLink(20, 18); - break; - case 20: - HallOfRecordsSceneLink(21, 19); - break; - case 21: - HallOfRecordsSceneLink(22, 20); - break; - case 22: - HallOfRecordsSceneLink(23, 21); - break; - case 23: - HallOfRecordsSceneLink(24, 22); - break; - case 24: - HallOfRecordsSceneLink(25, 23); - break; - case 25: - HallOfRecordsSceneLink(26, 24); - break; - case 26: - HallOfRecordsSceneLink(27, 25); - break; - case 27: - HallOfRecordsSceneLink(28, 26); - break; - case 28: - HallOfRecordsSceneLink(29, 27); - break; - case 29: - HallOfRecordsSceneLink(30, 28); - break; - case 30: - HallOfRecordsSceneLink(31, 29); - break; - case 31: - HallOfRecordsSceneLink(32, 30); - break; - case 32: - HallOfRecordsSceneLink(33, 31); - break; - case 33: - HallOfRecordsSceneLink(34, 32); - break; - case 34: - HallOfRecordsSceneLink(42, 33); - break; - case 35: - HallOfRecordsSceneLink(36, 45); - break; - case 36: - HallOfRecordsSceneLink(37, 35); - break; - case 37: - HallOfRecordsSceneLink(38, 36); - break; - case 38: - HallOfRecordsSceneLink(39, 37); - break; - case 39: - HallOfRecordsSceneLink(40, 38); - break; - case 40: - HallOfRecordsSceneLink(41, 39); - break; - case 41: - HallOfRecordsSceneLink(47, 40); - break; - case 42: - HallOfRecordsSceneLink(43, 34); - break; - case 43: - HallOfRecordsSceneLink(44, 42); - break; - case 44: - HallOfRecordsSceneLink(45, 43); - break; - case 45: - HallOfRecordsSceneLink(35, 44); - break; - case 46: - HallOfRecordsSceneLink(9, 5); - break; - case 47: - createScene(41, 1); - break; - } - } -} - -#undef HallOfRecordsSceneLink - -void Module2200::createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId) { - _childObject = new HallOfRecordsScene(_vm, this, which, hallOfRecordsInfoId); -} - -// Scene2201 - -AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - _x = 403; - _y = 259; - createSurface(100, 233, 96); - startAnimation(0x8600866, 0, -1); - SetUpdateHandler(&AnimatedSprite::update); -} - -AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen) - : AnimatedSprite(vm, 1100), _klaymen(klaymen), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) { - - _x = 408; - _y = 290; - createSurface(900, 63, 266); - SetUpdateHandler(&AsScene2201Door::update); - SetMessageHandler(&AsScene2201Door::handleMessage); - if (_isOpen) { - startAnimation(0xE2CB0412, -1, -1); - _countdown = 48; - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - startAnimation(0xE2CB0412, 0, -1); - _newStickFrameIndex = 0; - _ssDoorLight->setVisible(false); - } -} - -void AsScene2201Door::update() { - if (_countdown != 0 && _isOpen && (--_countdown == 0)) - stCloseDoor(); - AnimatedSprite::update(); -} - -uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x11001090) { - if (_isOpen) - _ssDoorLight->setVisible(true); - } else if (param.asInteger() == 0x11283090) { - if (!_isOpen) - _ssDoorLight->setVisible(false); - } - break; - case 0x2000: - if (_isOpen) - _countdown = 144; - messageResult = _isOpen ? 1 : 0; - break; - case 0x3002: - gotoNextState(); - break; - case 0x4808: - _countdown = 144; - if (!_isOpen) - stOpenDoor(); - break; - } - return messageResult; -} - -void AsScene2201Door::stOpenDoor() { - _isOpen = true; - startAnimation(0xE2CB0412, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - playSound(0, calcHash("fxDoorOpen33")); -} - -void AsScene2201Door::stCloseDoor() { - _isOpen = false; - startAnimation(0xE2CB0412, -1, -1); - _playBackwards = true; - _newStickFrameIndex = 0; - playSound(0, calcHash("fxDoorClose33")); -} - -SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex) - : StaticSprite(vm, 900) { - - createSurface(100, 16, 16); - loadSprite(kSsScene2201PuzzleCubeFileHashes[cubeIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 0, - kSsScene2201PuzzleCubePoints[positionIndex].x, kSsScene2201PuzzleCubePoints[positionIndex].y); -} - -Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isSoundPlaying(false) { - - Sprite *tempSprite; - - _vm->gameModule()->initCubeSymbolsPuzzle(); - - SetMessageHandler(&Scene2201::handleMessage); - SetUpdateHandler(&Scene2201::update); - - loadDataResource(0x04104242); - loadHitRectList(); - setBackground(0x40008208); - setPalette(0x40008208); - insertScreenMouse(0x0820C408); - - _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); - addCollisionSprite(_asTape); - _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); - - for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) - if ((int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex) >= 0) - insertSprite(cubeIndex, (int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex)); - - _clipRects[0].y1 = 0; - _clipRects[0].x2 = 640; - _clipRects[1].x2 = 640; - _clipRects[1].y2 = 480; - - if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) - insertStaticSprite(0x00026027, 900); - - tempSprite = insertStaticSprite(0x030326A0, 1100); - _clipRects[0].x1 = tempSprite->getDrawRect().x; - insertStaticSprite(0x811DA061, 1100); - tempSprite = insertStaticSprite(0x11180022, 1100); - _clipRects[1].x1 = tempSprite->getDrawRect().x; - tempSprite = insertStaticSprite(0x0D411130, 1100); - _clipRects[0].y2 = tempSprite->getDrawRect().y2(); - _clipRects[1].y1 = tempSprite->getDrawRect().y2(); - _ssDoorLight = insertStaticSprite(0xA4062212, 900); - - if (which < 0) { - // Restoring game - insertKlaymen(300, 427, _clipRects, 2); - setMessageList(0x004B8118); - _asDoor = insertSprite(_klaymen, _ssDoorLight, false); - } else if (which == 1) { - // Klaymen entering from the back - insertKlaymen(412, 393, _clipRects, 2); - setMessageList(0x004B8130); - _asDoor = insertSprite(_klaymen, _ssDoorLight, false); - } else if (which == 2) { - // Klaymen returning from the puzzle - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(379, 427, _clipRects, 2); - _klaymen->setDoDeltaX(1); - } else - insertKlaymen(261, 427, _clipRects, 2); - setMessageList(0x004B8178); - _asDoor = insertSprite(_klaymen, _ssDoorLight, false); - } else { - // Klaymen entering from the left - NPoint pt = _dataResource.getPoint(0x0304D8DC); - insertKlaymen(pt.x, pt.y, _clipRects, 2); - setMessageList(0x004B8120); - _asDoor = insertSprite(_klaymen, _ssDoorLight, true); - } - - insertSprite(); - - _vm->_soundMan->addSound(0x04106220, 0x81212040); - -} - -Scene2201::~Scene2201() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); - _vm->_soundMan->deleteSoundGroup(0x04106220); -} - -void Scene2201::update() { - Scene::update(); - if (!_isSoundPlaying) { - _vm->_soundMan->playSoundLooping(0x81212040); - _isSoundPlaying = true; - } -} - -uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssDoorButton); - else if (param.asInteger() == 0x35803198) { - if (sendMessage(_asDoor, 0x2000, 0)) - setMessageList(0x004B81A0); - else - setMessageList(0x004B81B8); - } else if (param.asInteger() == 0x51445010) { - if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) - setMessageList(0x004B8108); - else - setMessageList(0x004B8150); - } else if (param.asInteger() == 0x1D203082) - setMessageList(0x004B8180); - else if (param.asInteger() == 0x00049091) { - if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) - setMessageList(0x004B8138); - else - setMessageList(0x004B8108); - } - break; - case 0x480B: - if (sender == _ssDoorButton) - sendMessage(_asDoor, 0x4808, 0); - break; - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B81C8); - } - break; - } - return 0; -} - -static const NPoint kSsScene2202PuzzleCubePoints[] = { - {196, 105}, {323, 102}, {445, 106}, - {192, 216}, {319, 220}, {446, 216}, - {188, 320}, {319, 319}, {443, 322} -}; - -static const uint32 kSsScene2202PuzzleCubeFileHashes1[] = { - 0xA500800C, 0x2182910C, 0x2323980C, - 0x23049084, 0x21008080, 0x2303900C, - 0x6120980C, 0x2504D808 -}; - -static const uint32 kSsScene2202PuzzleCubeFileHashes2[] = { - 0x0AAD8080, 0x0A290291, 0x0A2BA398, - 0x822B8490, 0x86298080, 0x0A2B8390, - 0x0A69A098, 0x0E2D84D8 -}; - -SsScene2202PuzzleCube::SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol) - : StaticSprite(vm, 900), _parentScene(parentScene), _cubeSymbol(cubeSymbol), _cubePosition(cubePosition), _isMoving(false) { - - int surfacePriority; - - SetUpdateHandler(&SsScene2202PuzzleCube::update); - SetMessageHandler(&SsScene2202PuzzleCube::handleMessage); - if (_cubePosition >= 0 && _cubePosition <= 2) - surfacePriority = 100; - else if (_cubePosition >= 3 && _cubePosition <= 5) - surfacePriority = 300; - else - surfacePriority = 500; - loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0, - kSsScene2202PuzzleCubePoints[_cubePosition].x, kSsScene2202PuzzleCubePoints[_cubePosition].y); - loadSound(0, 0x40958621); - loadSound(1, 0x51108241); -} - -void SsScene2202PuzzleCube::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 SsScene2202PuzzleCube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) - sendMessage(_parentScene, 0x2000, _cubePosition); - messageResult = 1; - break; - case 0x2001: - _isMoving = true; - moveCube(param.asInteger()); - break; - } - return messageResult; -} - -void SsScene2202PuzzleCube::suMoveCubeX() { - - bool done = false; - - if (_counterDirection) { - if (_counter > 2) - _counter -= 2; - } else { - if (_counter < 20) - _counter += 2; - } - - for (int16 i = 0; i < _counter; i++) { - _x += _xIncr; - _errValue += _yDelta; - if (_errValue >= _xDelta) { - _errValue -= _xDelta; - _y += _yIncr; - } - if (_x == _newX && _y == _newY) { - done = true; - break; - } - if (_x == _xFlagPos) - _counterDirection = true; - } - - if (done) - stopMoving(); - - updateBounds(); - -} - -void SsScene2202PuzzleCube::suMoveCubeY() { - - bool done = false; - - if (_counterDirection) { - if (_counter > 2) - _counter -= 2; - } else { - if (_counter < 20) - _counter += 2; - } - - for (int16 i = 0; i < _counter; i++) { - _y += _yIncr; - _errValue += _xDelta; - if (_errValue >= _yDelta) { - _errValue -= _yDelta; - _x += _xIncr; - } - if (_x == _newX && _y == _newY) { - done = true; - break; - } - if (_x == _xFlagPos) - _counterDirection = true; - } - - if (done) - stopMoving(); - - updateBounds(); - -} - -void SsScene2202PuzzleCube::moveCube(int16 newCubePosition) { - - loadSprite(kSsScene2202PuzzleCubeFileHashes1[_cubeSymbol], kSLFCenteredDrawOffset); - - setSubVar(VA_CUBE_POSITIONS, _cubePosition, (uint32)-1); - setSubVar(VA_CUBE_POSITIONS, newCubePosition, (uint32)_cubeSymbol); - - _cubePosition = newCubePosition; - _errValue = 0; - _counterDirection = false; - _counter = 0; - _newX = kSsScene2202PuzzleCubePoints[newCubePosition].x; - _newY = kSsScene2202PuzzleCubePoints[newCubePosition].y; - - if (_x == _newX && _y == _newY) - return; - - if (_x <= _newX) { - if (_y <= _newY) { - _xDelta = _newX - _x; - _yDelta = _newY - _y; - _xIncr = 1; - _yIncr = 1; - } else { - _xDelta = _newX - _x; - _yDelta = _y - _newY; - _xIncr = 1; - _yIncr = -1; - } - } else { - if (_y <= _newY) { - _xDelta = _x - _newX; - _yDelta = _newY - _y; - _xIncr = -1; - _yIncr = 1; - } else { - _xDelta = _x - _newX; - _yDelta = _y - _newY; - _xIncr = -1; - _yIncr = -1; - } - } - - if (_xDelta > _yDelta) { - SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeX); - if (_xIncr > 0) { - if (_newX - _x >= 180) - _xFlagPos = _newX - 90; - else - _xFlagPos = _x + _newX / 2; - } else { - if (_x - _newX >= 180) - _xFlagPos = _x + 90; - else - _xFlagPos = _x / 2 + _newX; - } - playSound(0); - } else { - SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeY); - if (_yIncr > 0) { - if (_newY - _y >= 180) - _xFlagPos = _newY - 90; - else - _xFlagPos = _y + _newY / 2; - } else { - if (_y - _newY >= 180) - _xFlagPos = _y + 90; - else - _xFlagPos = _y / 2 + _newY; - } - playSound(1); - } - -} - -void SsScene2202PuzzleCube::stopMoving() { - loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset); - SetSpriteUpdate(NULL); - _isMoving = false; - sendMessage(_parentScene, 0x2002, _cubePosition); -} - -Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isSolved(false), _leaveScene(false), _isCubeMoving(false), - _ssMovingCube(NULL), _ssDoneMovingCube(NULL) { - - _vm->gameModule()->initCubeSymbolsPuzzle(); - - SetMessageHandler(&Scene2202::handleMessage); - SetUpdateHandler(&Scene2202::update); - - setBackground(0x08100A0C); - setPalette(0x08100A0C); - addEntity(_palette); - insertPuzzleMouse(0x00A08089, 20, 620); - - for (uint32 cubePosition = 0; cubePosition < 9; cubePosition++) { - int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition); - if (cubeSymbol >= 0) { - Sprite *puzzleCubeSprite = insertSprite(this, cubePosition, cubeSymbol); - addCollisionSprite(puzzleCubeSprite); - } - } - - insertStaticSprite(0x55C043B8, 200); - insertStaticSprite(0x85500158, 400); - insertStaticSprite(0x25547028, 600); - - loadSound(0, 0x68E25540); - loadSound(1, 0x40400457); - - _vm->_soundMan->addSound(0x60400854, 0x8101A241); - _vm->_soundMan->playSoundLooping(0x8101A241); - -} - -Scene2202::~Scene2202() { - _vm->_soundMan->deleteSoundGroup(0x60400854); -} - -void Scene2202::update() { - Scene::update(); - - if (_leaveScene && !isSoundPlaying(1)) - leaveScene(0); - - if (_isSolved && !isSoundPlaying(0)) { - playSound(1); - _isSolved = false; - _leaveScene = true; - } - - if (_ssMovingCube && !_isCubeMoving) { - int16 freeCubePosition = getFreeCubePosition(_movingCubePosition); - if (freeCubePosition != -1) { - setSurfacePriority(_ssMovingCube->getSurface(), 700); - sendMessage(_ssMovingCube, 0x2001, freeCubePosition); - _ssMovingCube = NULL; - _isCubeMoving = true; - } - } - - if (_ssDoneMovingCube) { - setSurfacePriority(_ssDoneMovingCube->getSurface(), _surfacePriority); - _ssDoneMovingCube = NULL; - if (testIsSolved()) { - playSound(0); - setGlobalVar(V_TILE_PUZZLE_SOLVED, 1); - _isSolved = true; - } - } - -} - -uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - case 0x2000: - _movingCubePosition = (int16)param.asInteger(); - _ssMovingCube = (Sprite*)sender; - break; - case 0x2002: - _isCubeMoving = false; - _ssDoneMovingCube = (Sprite*)sender; - if (param.asInteger() <= 2) - _surfacePriority = 100; - else if (param.asInteger() >= 3 && param.asInteger() <= 5) - _surfacePriority = 300; - else - _surfacePriority = 500; - break; - } - return 0; -} - -int16 Scene2202::getFreeCubePosition(int16 cubePosition) { - if (cubePosition >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 3) == -1) - return cubePosition - 3; - else if (cubePosition <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 3) == -1) - return cubePosition + 3; - else if (cubePosition != 0 && cubePosition != 3 && cubePosition != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 1) == -1) - return cubePosition - 1; - else if (cubePosition != 2 && cubePosition != 5 && cubePosition != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 1) == -1) - return cubePosition + 1; - else - return -1; -} - -bool Scene2202::testIsSolved() { - return - getSubVar(VA_CUBE_POSITIONS, 0) == 0 && - getSubVar(VA_CUBE_POSITIONS, 2) == 2 && - getSubVar(VA_CUBE_POSITIONS, 3) == 3 && - getSubVar(VA_CUBE_POSITIONS, 4) == 4 && - getSubVar(VA_CUBE_POSITIONS, 5) == 5 && - getSubVar(VA_CUBE_POSITIONS, 6) == 6 && - getSubVar(VA_CUBE_POSITIONS, 8) == 7; -} - -static const uint32 kAsCommonKeyFileHashes[] = { - 0x2450D850, 0x0C9CE8D0, 0x2C58A152 -}; - -AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y) - : AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) { - - if (!getSubVar(VA_HAS_KEY, _keyIndex) && !getSubVar(VA_IS_KEY_INSERTED, _keyIndex)) { - SetMessageHandler(&AsCommonKey::handleMessage); - } else { - // If Klaymen already has the key or it's already inserted then don't show it - setVisible(false); - SetMessageHandler(NULL); - } -} - -uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setSubVar(VA_HAS_KEY, _keyIndex, 1); - setVisible(false); - SetMessageHandler(NULL); - } - return messageResult; -} - -static const uint32 kAsScene2203DoorFileHashes[] = { - 0x7868AE10, 0x1A488110 -}; - -AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _doorIndex(doorIndex) { - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2203Door::handleMessage); - _x = 320; - _y = 240; - createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900); - if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) { - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1); - _newStickFrameIndex = 0; - } -} - -uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) - sendMessage(_parentScene, 0x2002, 0); - else - sendMessage(_parentScene, 0x2001, 0); - messageResult = 1; - break; - case 0x2000: - _otherDoor = (Sprite*)param.asEntity(); - break; - case 0x3002: - if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) - sendMessage(_parentScene, 0x4808, 0); - stopAnimation(); - break; - case 0x4808: - setGlobalVar(V_LARGE_DOOR_NUMBER, _doorIndex); - sendMessage(_otherDoor, 0x4809, 0); - openDoor(); - break; - case 0x4809: - closeDoor(); - sendMessage(_parentScene, 0x2003, 0); - break; - } - return messageResult; -} - -void AsScene2203Door::openDoor() { - playSound(0, 0x341014C4); - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 1, -1); -} - -void AsScene2203Door::closeDoor() { - startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); - _playBackwards = true; - _newStickFrameIndex = 0; -} - -Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) - setGlobalVar(V_KEY3_LOCATION, 1); - - SetMessageHandler(&Scene2203::handleMessage); - - setBackground(0x82C80334); - setPalette(0x82C80334); - insertScreenMouse(0x80330824); - setHitRects(0x004B8320); - setRectList(0x004B8420); - - if (getGlobalVar(V_KEY3_LOCATION) == 1) { - _asKey = insertSprite(this, 2, 1100, 282, 432); - addCollisionSprite(_asKey); - } - - _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); - addCollisionSprite(_asTape); - _asLeftDoor = insertSprite(this, 0); - _asRightDoor = insertSprite(this, 1); - _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); - _ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100); - _leftDoorClipRect.set(_ssSmallLeftDoor->getDrawRect().x, 0, 640, 480); - _rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480); - sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); - sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); - addCollisionSprite(_asLeftDoor); - addCollisionSprite(_asRightDoor); - - if (which < 0) { - // Restoring game - insertKlaymen(200, 427); - setMessageList(0x004B8340); - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 427); - setMessageList(0x004B8350); - } else if (which == 2) { - // Klaymen returning from the displayer - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(362, 427); - _klaymen->setDoDeltaX(1); - } else - insertKlaymen(202, 427); - setMessageList(0x004B8358); - } else { - // Klaymen entering from the left - insertKlaymen(0, 427); - setMessageList(0x004B8348); - } - - if (getGlobalVar(V_LARGE_DOOR_NUMBER)) { - _ssSmallLeftDoor->setVisible(false); - _klaymen->setClipRect(_rightDoorClipRect); - } else { - _ssSmallRightDoor->setVisible(false); - _klaymen->setClipRect(_leftDoorClipRect); - } - -} - -Scene2203::~Scene2203() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2001: - sendEntityMessage(_klaymen, 0x1014, sender); - if (sender == _asLeftDoor) - setMessageList2(0x004B83B0); - else - setMessageList2(0x004B83C8); - break; - case 0x2002: - if (sender == _asLeftDoor) - setMessageList2(0x004B8370); - else - setMessageList2(0x004B8360); - break; - case 0x2003: - if (sender == _asLeftDoor) - _ssSmallLeftDoor->setVisible(false); - else - _ssSmallRightDoor->setVisible(false); - break; - case 0x4808: - if (sender == _asLeftDoor) { - _ssSmallLeftDoor->setVisible(true); - _klaymen->setClipRect(_leftDoorClipRect); - } else { - _ssSmallRightDoor->setVisible(true); - _klaymen->setClipRect(_rightDoorClipRect); - } - break; - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B83E0); - } else if (sender == _asKey) { - sendEntityMessage(_klaymen, 0x1014, _asKey); - setMessageList(0x004B83F0); - } - break; - } - return messageResult; -} - -SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) - : StaticSprite(vm, 900) { - - SetMessageHandler(&SsScene2205DoorFrame::handleMessage); - createSurface(1100, 45, 206); - loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); -} - -uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); - break; - } - return messageResult; -} - -Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene2205::handleMessage); - SetUpdateHandler(&Scene2205::update); - - setHitRects(0x004B0620); - if (getGlobalVar(V_LIGHTS_ON)) { - _isLightOn = true; - setBackground(0x0008028D); - setPalette(0x0008028D); - addEntity(_palette); - insertScreenMouse(0x80289008); - _ssLightSwitch = insertSprite(this, 0x2D339030, 0x2D309030, 100, 0); - } else { - _isLightOn = false; - setBackground(0xD00A028D); - setPalette(0xD00A028D); - addEntity(_palette); - insertScreenMouse(0xA0289D08); - _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); - } - _palette->addBasePalette(0xD00A028D, 0, 256, 0); - _ssDoorFrame = insertSprite(); - - if (which < 0) { - // Restoring game - insertKlaymen(320, 417); - setMessageList(0x004B0658); - if (!getGlobalVar(V_LIGHTS_ON)) - _palette->addPalette(0x68033B1C, 0, 65, 0); - _isKlaymenInLight = false; - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 417); - setMessageList(0x004B0648); - if (!getGlobalVar(V_LIGHTS_ON)) - _palette->addPalette(0x68033B1C, 0, 65, 0); - _isKlaymenInLight = false; - } else { - // Klaymen entering from the left - insertKlaymen(0, 417); - setMessageList(0x004B0640); - _isKlaymenInLight = true; - } - - _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); - _klaymen->setSoundFlag(true); - - loadDataResource(0x00144822); - -} - -void Scene2205::update() { - Scene::update(); - if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) { - _palette->addPalette(0x0008028D, 0, 256, 0); - changeBackground(0x0008028D); - _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); - sendMessage(_ssDoorFrame, 0x2000, 0); - changeMouseCursor(0x80289008); - _isLightOn = true; - } else if (_isLightOn && !getGlobalVar(V_LIGHTS_ON)) { - _palette->addPalette(0xD00A028D, 0, 256, 0); - changeBackground(0xD00A028D); - _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); - sendMessage(_ssDoorFrame, 0x2000, 0); - changeMouseCursor(0xA0289D08); - _isKlaymenInLight = true; - if (_klaymen->getX() > 85) { - _palette->addPalette(0x68033B1C, 0, 65, 0); - _isKlaymenInLight = false; - } - _isLightOn = false; - } - if (!getGlobalVar(V_LIGHTS_ON)) { - if (_isKlaymenInLight && _klaymen->getX() > 85) { - _palette->addBasePalette(0x68033B1C, 0, 65, 0); - _palette->startFadeToPalette(12); - _isKlaymenInLight = false; - } else if (!_isKlaymenInLight && _klaymen->getX() <= 85) { - _palette->addBasePalette(0xD00A028D, 0, 65, 0); - _palette->startFadeToPalette(12); - _isKlaymenInLight = true; - } - } -} - -uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x6449569A) - setMessageList(0x004B0690); - else if (param.asInteger() == 0x2841369C) - setMessageList(0x004B0630); - else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssLightSwitch); - break; - case 0x480B: - setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1); - break; - } - return 0; -} - -static const int16 kScene2206XPositions[] = { - 384, 480, 572 -}; - -static const uint32 kScene2206MessageIds1[] = { - 0x004B8998, 0x004B89B8, 0x004B89D8 -}; - -static const uint32 kScene2206MessageIds2[] = { - 0x004B89F8, 0x004B8A20, 0x004B8A48 -}; - -static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = { - -24, -28, -18, 6, 9, -8 -}; - -static const int16 kAsScene2206DoorSpikesXDeltasClose[] = { - -8, 7, 11, 26, 13, 14 -}; - -AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash) - : StaticSprite(vm, fileHash, 200) { - - if (getGlobalVar(V_SPIKES_RETRACTED)) - _x -= 63; - SetUpdateHandler(&AsScene2206DoorSpikes::update); - SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene2206DoorSpikes::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4808: - _deltaIndex = 0; - playSound(0, 0x032746E0); - SetMessageHandler(NULL); - SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen); - break; - case 0x4809: - _deltaIndex = 0; - playSound(0, 0x002642C0); - SetMessageHandler(NULL); - SetSpriteUpdate(&AsScene2206DoorSpikes::suClose); - break; - } - return messageResult; -} - -void AsScene2206DoorSpikes::suOpen() { - if (_deltaIndex < 6) { - _x += kAsScene2206DoorSpikesXDeltasOpen[_deltaIndex]; - _deltaIndex++; - } else { - SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); - SetSpriteUpdate(NULL); - } -} - -void AsScene2206DoorSpikes::suClose() { - if (_deltaIndex < 6) { - _x += kAsScene2206DoorSpikesXDeltasClose[_deltaIndex]; - _deltaIndex++; - } else { - SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); - SetSpriteUpdate(NULL); - } -} - -AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash) - : StaticSprite(vm, fileHash, 50) { - - SetUpdateHandler(&AsScene2206Platform::update); - SetMessageHandler(&AsScene2206Platform::handleMessage); - SetSpriteUpdate(NULL); -} - -void AsScene2206Platform::update() { - handleSpriteUpdate(); - updatePosition(); -} - -uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4803: - _yDelta = 0; - SetMessageHandler(NULL); - SetSpriteUpdate(&AsScene2206Platform::suMoveDown); - break; - } - return messageResult; -} - -void AsScene2206Platform::suMoveDown() { - _yDelta++; - _y += _yDelta; -} - -SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) - : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { - - if (getGlobalVar(V_HAS_TEST_TUBE)) { - setVisible(false); - SetMessageHandler(NULL); - } else - SetMessageHandler(&SsScene2206TestTube::handleMessage); - _collisionBoundsOffset = _drawOffset; - updateBounds(); -} - -uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x4806: - setGlobalVar(V_HAS_TEST_TUBE, 1); - setVisible(false); - SetMessageHandler(NULL); - break; - } - return messageResult; -} - -Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - uint32 fileHash; - - SetUpdateHandler(&Scene::update); - SetMessageHandler(&Scene2206::handleMessage); - - if (getGlobalVar(V_LIGHTS_ON)) { - fileHash = 0x41983216; - _sprite1 = insertStaticSprite(0x2201266A, 100); - _sprite2 = insertStaticSprite(0x3406A333, 300); - _sprite3 = insertStaticSprite(0x24A223A2, 100); - _asDoorSpikes = insertSprite(0x26133023); - _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); - setRectList(0x004B8AF8); - _ssButton = insertSprite(this, 0x0E038022, 100, 0); - insertScreenMouse(0x83212411); - _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x5E00E262); - _asPlatform = insertSprite(0x085E25E0); - } else { - fileHash = 0xE0102A45; - _sprite1 = insertStaticSprite(0x1C1106B8, 100); - _sprite2 = insertStaticSprite(0x020462E0, 300); - _sprite3 = insertStaticSprite(0x900626A2, 100); - _asDoorSpikes = insertSprite(0x544822A8); - _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); - setRectList(0x004B8B58); - _ssButton = insertSprite(this, 0x16882608, 100, 0); - insertScreenMouse(0x02A41E09); - _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x52032563); - _asPlatform = insertSprite(0x317831A0); - } - - _asPlatform->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); - setBackground(fileHash); - setPalette(fileHash); - addEntity(_palette); - _palette->addBasePalette(fileHash, 0, 256, 0); - if (!getGlobalVar(V_LIGHTS_ON)) - _palette->addPalette(0x0263D144, 0, 65, 0); - addCollisionSprite(_ssTestTube); - - if (which < 0) { - // Restoring game - insertKlaymen(200, 430); - setMessageList(0x004B88A8); - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 430); - setMessageList(0x004B88B8); - } else if (which == 2) { - // Klaymen entering from the back - insertKlaymen(205, 396); - setMessageList(0x004B88C8); - _palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0); - klaymenBehindSpikes(); - playSound(0, 0x53B8284A); - } else if (which == 3) { - // Klaymen entering from reading a text column - insertKlaymen(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) - _klaymen->setDoDeltaX(1); - setMessageList(0x004B8A70); - } else { - // Klaymen entering from the left - insertKlaymen(0, 430); - setMessageList(0x004B88B0); - } - - _klaymen->setSoundFlag(true); - _klaymen->setKlaymenIdleTable2(); - -} - -Scene2206::~Scene2206() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x800C6694) - readClickedColumn(); - else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x11C40840) { - if (getGlobalVar(V_SPIKES_RETRACTED)) - setMessageList(0x004B8948); - else - setMessageList(0x004B8970); - } - break; - case 0x4803: - sendMessage(_asPlatform, 0x4803, 0); - break; - case 0x480B: - if (sender == _ssButton) { - setGlobalVar(V_SPIKES_RETRACTED, getGlobalVar(V_SPIKES_RETRACTED) ? 0 : 1); - if (getGlobalVar(V_SPIKES_RETRACTED)) - sendMessage(_asDoorSpikes, 0x4808, 0); - else - sendMessage(_asDoorSpikes, 0x4809, 0); - } - break; - case 0x4826: - sendEntityMessage(_klaymen, 0x1014, _ssTestTube); - setMessageList(0x004B8988); - break; - case 0x482A: - klaymenBehindSpikes(); - break; - case 0x482B: - klaymenInFrontSpikes(); - break; - } - return messageResult; -} - -void Scene2206::klaymenInFrontSpikes() { - if (getGlobalVar(V_LIGHTS_ON)) { - _palette->addBasePalette(0x41983216, 0, 65, 0); - _palette->startFadeToPalette(12); - } - setSurfacePriority(_sprite1->getSurface(), 100); - setSurfacePriority(_sprite2->getSurface(), 300); - setSurfacePriority(_sprite3->getSurface(), 100); - setSurfacePriority(_asDoorSpikes->getSurface(), 200); - _klaymen->setClipRect(0, 0, 640, 480); -} - -void Scene2206::klaymenBehindSpikes() { - if (!getGlobalVar(V_LIGHTS_ON)) { - _palette->addBasePalette(0xB103B604, 0, 65, 0); - _palette->startFadeToPalette(12); - } - setSurfacePriority(_sprite1->getSurface(), 1100); - setSurfacePriority(_sprite2->getSurface(), 1300); - setSurfacePriority(_sprite3->getSurface(), 1100); - setSurfacePriority(_asDoorSpikes->getSurface(), 1200); - _klaymen->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); -} - -void Scene2206::readClickedColumn() { - setGlobalVar(V_CLICKED_COLUMN_INDEX, (_mouseClickPos.x - 354) / 96); - if (getGlobalVar(V_CLICKED_COLUMN_INDEX) > 2) - setGlobalVar(V_CLICKED_COLUMN_INDEX, 2); - setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7); - setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); - setGlobalVar(V_COLUMN_BACK_NAME, 0); - if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klaymen->getX()) >= 144) - setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); - else - setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); -} - -static const uint32 kScene2207FileHashes[] = { - 0x33B1E12E, 0x33D1E12E, 0x3311E12E, - 0x3291E12E, 0x3191E12E, 0x3791E12E, - 0x3B91E12E, 0x2391E12E, 0x1391E12E, - 0x3BB1E12E, 0x23B1E12E, 0x13B1E12E -}; - -AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 900), _parentScene(parentScene), _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) { - - NPoint pt; - - _dataResource.load(0x00524846); - _pointArray = _dataResource.getPointArray(0x005B02B7); - pt = _dataResource.getPoint(0x403A82B1); - _x = pt.x; - _y = pt.y; - createSurface(1100, 129, 103); - startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0); - _newStickFrameIndex = 0; - SetUpdateHandler(&AsScene2207Elevator::update); - SetMessageHandler(&AsScene2207Elevator::handleMessage); - SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); -} - -AsScene2207Elevator::~AsScene2207Elevator() { - _vm->_soundMan->deleteSoundGroup(0x02700413); -} - -void AsScene2207Elevator::update() { - - if (_destPointIndex + _destPointIndexDelta > _pointIndex) { - _pointIndex++; - startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); - _newStickFrameIndex = _pointIndex; - if (_destPointIndex + _destPointIndexDelta == _pointIndex) { - if (_destPointIndexDelta != 0) - _destPointIndexDelta = 0; - else { - _vm->_soundMan->deleteSound(0xD3B02847); - playSound(0, 0x53B8284A); - } - } - } - - if (_destPointIndex + _destPointIndexDelta < _pointIndex) { - _pointIndex--; - if (_pointIndex == 0) - sendMessage(_parentScene, 0x2003, 0); - startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); - _newStickFrameIndex = _pointIndex; - if (_destPointIndex + _destPointIndexDelta == _pointIndex) { - if (_destPointIndexDelta != 0) - _destPointIndexDelta = 0; - else { - _vm->_soundMan->deleteSound(0xD3B02847); - playSound(0, 0x53B8284A); - } - } - } - - if (_pointIndex > 20 && _surface->getPriority() != 900) - sendMessage(_parentScene, 0x2002, 900); - else if (_pointIndex < 20 && _surface->getPriority() != 1100) - sendMessage(_parentScene, 0x2002, 1100); - - AnimatedSprite::update(); - - if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) { - sendMessage(_parentScene, 0x2004, 0); - _isMoving = false; - } - -} - -void AsScene2207Elevator::suSetPosition() { - _x = (*_pointArray)[_pointIndex].x; - _y = (*_pointArray)[_pointIndex].y - 60; - updateBounds(); -} - -uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - moveToY(param.asInteger()); - break; - } - return messageResult; -} - -void AsScene2207Elevator::moveToY(int16 y) { - int16 minDistance = 480; - - if (!_pointArray || _pointArray->size() == 0) - return; - - for (uint i = 0; i < _pointArray->size(); i++) { - int16 distance = ABS(y - (*_pointArray)[i].y); - if (distance < minDistance) { - minDistance = distance; - _destPointIndex = i; - } - } - - if (_destPointIndex != _pointIndex) { - if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) - _destPointIndexDelta = 0; - else if (_destPointIndex < _pointIndex) - _destPointIndexDelta = -2; - else - _destPointIndexDelta = 2; - _vm->_soundMan->addSound(0x02700413, 0xD3B02847); - _vm->_soundMan->playSoundLooping(0xD3B02847); - } - - _isMoving = true; - -} - -AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - _x = x; - _y = y; - createSurface(1010, 71, 73); - setDoDeltaX(doDeltaX); - startAnimation(0x80880090, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207Lever::handleMessage); -} - -uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x4826, 0); - messageResult = 1; - break; - case 0x3002: - gotoNextState(); - stopAnimation(); - break; - case 0x4807: - stLeverUp(); - break; - case 0x480F: - stLeverDown(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -void AsScene2207Lever::stLeverDown() { - startAnimation(0x80880090, 1, -1); - playSound(0, 0x40581882); - FinalizeState(&AsScene2207Lever::stLeverDownEvent); -} - -void AsScene2207Lever::stLeverDownEvent() { - sendMessage(_parentScene, 0x480F, 0); -} - -void AsScene2207Lever::stLeverUp() { - startAnimation(0x80880090, 6, -1); - _playBackwards = true; - playSound(0, 0x40581882); - FinalizeState(&AsScene2207Lever::stLeverUpEvent); -} - -void AsScene2207Lever::stLeverUpEvent() { - sendMessage(_parentScene, 0x4807, 0); -} - -AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1200), _idle(true) { - - _x = 309; - _y = 320; - createSurface1(0xCCFD6090, 100); - startAnimation(0xCCFD6090, 0, -1); - _newStickFrameIndex = 0; - loadSound(1, 0x40330872); - loadSound(2, 0x72A2914A); - loadSound(3, 0xD4226080); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); -} - -AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { - _vm->_soundMan->deleteSoundGroup(0x80D00820); -} - -uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (!_idle) { - if (param.asInteger() == 0x3423093) { - _vm->_soundMan->addSound(0x80D00820, 0x12121943); - _vm->_soundMan->playSoundLooping(0x12121943); - } else if (param.asInteger() == 0x834AB011) { - stopSound(0); - stopSound(1); - stopSound(2); - stopSound(3); - _vm->_soundMan->deleteSound(0x12121943); - } else if (param.asInteger() == 0x3A980501) - playSound(1); - else if (param.asInteger() == 0x2A2AD498) - playSound(2); - else if (param.asInteger() == 0xC4980008) - playSound(3); - else if (param.asInteger() == 0x06B84228) - playSound(0, 0xE0702146); - } - break; - case 0x2006: - stStartAnimation(); - break; - case 0x2007: - stStopAnimation(); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2207WallRobotAnimation::stStartAnimation() { - if (!_idle) { - NextState(NULL); - } else { - startAnimation(0xCCFD6090, 0, -1); - _idle = false; - setVisible(true); - } -} - -void AsScene2207WallRobotAnimation::stStopAnimation() { - NextState(&AsScene2207WallRobotAnimation::cbStopAnimation); -} - -void AsScene2207WallRobotAnimation::cbStopAnimation() { - stopAnimation(); - stopSound(0); - stopSound(1); - stopSound(2); - stopSound(3); - _vm->_soundMan->deleteSound(0x12121943); - _idle = true; - setVisible(false); -} - -AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _idle(true) { - - _x = 309; - _y = 320; - createSurface1(0x8CAA0099, 100); - startAnimation(0x8CAA0099, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage); -} - -uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2006: - stStartAnimation(); - break; - case 0x2007: - stStopAnimation(); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2207WallCannonAnimation::stStartAnimation() { - if (!_idle) { - NextState(NULL); - } else { - setVisible(true); - startAnimation(0x8CAA0099, 0, -1); - _idle = false; - } -} - -void AsScene2207WallCannonAnimation::stStopAnimation() { - NextState(&AsScene2207WallCannonAnimation::cbStopAnimation); -} - -void AsScene2207WallCannonAnimation::cbStopAnimation() { - stopAnimation(); - setVisible(false); - _idle = true; -} - -SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index) - : StaticSprite(vm, fileHash, 100) { - - _x = 330; - _y = 246 + index * 50; - updatePosition(); -} - -Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule), _klaymenAtElevator(true), _elevatorSurfacePriority(0) { - - _vm->gameModule()->initCannonSymbolsPuzzle(); - - if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852)) - setSubVar(VA_IS_PUZZLE_INIT, 0x88460852, 1); - - SetMessageHandler(&Scene2207::handleMessage); - SetUpdateHandler(&Scene2207::update); - - insertKlaymen(0, 0); - _klaymen->setRepl(64, 0); - setMessageList(0x004B38E8); - _asElevator = insertSprite(this); - - if (getGlobalVar(V_LIGHTS_ON)) { - setBackground(0x88C00241); - setPalette(0x88C00241); - insertScreenMouse(0x00245884); - _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); - _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); - _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); - _asTape = insertSprite(this, 4, 1100, 277, 428, 0x9148A011); - addCollisionSprite(_asTape); - _asLever = insertSprite(this, 527, 333, 0); - addCollisionSprite(_asLever); - _asWallRobotAnimation = insertSprite(this); - _asWallCannonAnimation = insertSprite(); - _asWallRobotAnimation->setVisible(false); - _asWallCannonAnimation->setVisible(false); - _ssButton = insertSprite(this, 0x2C4061C4, 100, 0); - _asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480); - _klaymen->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); - _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); - } else { - setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1); - setBackground(0x05C02A55); - setPalette(0x05C02A55); - insertScreenMouse(0x02A51054); - _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); - insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0); - insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1); - insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 2)], 2); - _asTape = NULL; - _asLever = NULL; - _asWallRobotAnimation = NULL; - _asWallCannonAnimation = NULL; - _ssButton = NULL; - _klaymen->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); - _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); - } - - _dataResource.load(0x00524846); - setRectList(0x004B38B8); - - sendEntityMessage(_klaymen, 0x1014, _asElevator); - sendMessage(_klaymen, 0x2001, 0); - sendMessage(_asElevator, 0x2000, 480); - - loadSound(1, calcHash("fxFogHornSoft")); - -} - -void Scene2207::update() { - Scene::update(); - if (_elevatorSurfacePriority != 0) { - setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority); - _elevatorSurfacePriority = 0; - } - if (_klaymen->getY() == 423) - _klaymenAtElevator = _klaymen->getX() > 459 && _klaymen->getX() < 525; -} - -uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x0014F275) { - if (_klaymenAtElevator) { - sendMessage(_asElevator, 0x2000, _mouseClickPos.y); - sendEntityMessage(_klaymen, 0x1014, _asElevator); - sendMessage(_klaymen, 0x2001, 0); - } else - cancelMessageList(); - } else if (param.asInteger() == 0x34569073) { - if (_klaymenAtElevator) { - _isKlaymenBusy = true; - sendMessage(_asElevator, 0x2000, 0); - sendEntityMessage(_klaymen, 0x1014, _asElevator); - sendMessage(_klaymen, 0x2001, 0); - } else - cancelMessageList(); - } else if (param.asInteger() == 0x4054C877) { - if (_klaymenAtElevator) { - sendMessage(_asElevator, 0x2000, 480); - sendEntityMessage(_klaymen, 0x1014, _asElevator); - sendMessage(_klaymen, 0x2001, 0); - } else - cancelMessageList(); - } else if (param.asInteger() == 0x0CBC6211) { - sendEntityMessage(_klaymen, 0x1014, _asElevator); - sendMessage(_klaymen, 0x2001, 0); - setRectList(0x004B38B8); - } else if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x231DA241) { - if (_ssButton) - setMessageList(0x004B38F0); - else - setMessageList(0x004B37D8); - } - break; - case 0x2002: - _elevatorSurfacePriority = param.asInteger(); - break; - case 0x2003: - _isKlaymenBusy = false; - break; - case 0x4807: - sendMessage(_asWallRobotAnimation, 0x2007, 0); - sendMessage(_asWallCannonAnimation, 0x2007, 0); - break; - case 0x480B: - if (sender == _ssButton) { - if (getSubVar(VA_LOCKS_DISABLED, 0x40119852)) { - setSubVar(VA_LOCKS_DISABLED, 0x40119852, 0); - playSound(0, calcHash("fx3LocksDisable")); - } else { - setSubVar(VA_LOCKS_DISABLED, 0x40119852, 1); - playSound(1); - } - } - break; - case 0x480F: - sendMessage(_asWallRobotAnimation, 0x2006, 0); - sendMessage(_asWallCannonAnimation, 0x2006, 0); - _asWallRobotAnimation->setVisible(true); - _asWallCannonAnimation->setVisible(true); - break; - case 0x4826: - if (sender == _asTape) { - if (_klaymen->getY() == 423) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B3958); - } - } else if (_klaymenAtElevator) { - SetMessageHandler(&Scene2207::handleMessage2); - sendMessage(_asElevator, 0x2000, 347); - sendEntityMessage(_klaymen, 0x1014, _asElevator); - sendMessage(_klaymen, 0x2001, 0); - } - break; - } - return messageResult; -} - -uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2002: - _elevatorSurfacePriority = param.asInteger(); - break; - case 0x2004: - SetMessageHandler(&Scene2207::handleMessage); - sendMessage(_klaymen, 0x2005, 0); - sendEntityMessage(_klaymen, 0x1014, _asLever); - setMessageList(0x004B3920); - setRectList(0x004B3948); - break; - } - return messageResult; -} - -static const uint32 kScene2208FileHashes1[] = { - 0x041023CB, 0x041020CB, 0x041026CB, 0x04102ACB, - 0x041032CB, 0x041002CB -}; - -static const uint32 kScene2208FileHashes2[] = { - 0x091206C9, 0x091406C9, 0x091806C9, 0x090006C9, - 0x093006C9, 0x095006C9 -}; - -Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _textResource(vm) { - - SpriteResource spriteResource(_vm); - const char *textStart, *textEnd; - - if (!getGlobalVar(V_COLUMN_TEXT_NAME)) - setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); - - _textResource.load(getGlobalVar(V_COLUMN_TEXT_NAME)); - - textStart = _textResource.getString(getGlobalVar(V_CLICKED_COLUMN_INDEX), textEnd); - while (textStart < textEnd) { - _strings.push_back(textStart); - textStart += strlen(textStart) + 1; - } - - _maxRowIndex = 8 + 10 * (3 - (getGlobalVar(V_COLUMN_TEXT_NAME) == calcHash("stLineagex") ? 1 : 0)); - - _background = new Background(_vm, 0); - _background->createSurface(0, 640, 528); - _background->getSpriteResource().getPosition().y = 480; - addBackground(_background); - setPalette(0x08100289); - addEntity(_palette); - insertPuzzleMouse(0x0028D089, 40, 600); - - _fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C); - - _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); - spriteResource.load(0x08100289, true); - _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); - - _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); - spriteResource.load(!getGlobalVar(V_COLUMN_BACK_NAME) - ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] - : getGlobalVar(V_COLUMN_BACK_NAME), true); - _topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); - - _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); - spriteResource.load(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6], true); - _bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); - - SetUpdateHandler(&Scene2208::update); - SetMessageHandler(&Scene2208::handleMessage); - - _visibleRowsCount = 10; - _newRowIndex = (int16)getGlobalVar(V_CLICKED_COLUMN_ROW); - if (_newRowIndex + _visibleRowsCount > _maxRowIndex) - _newRowIndex = _maxRowIndex - _visibleRowsCount; - if (_newRowIndex < 6) - _newRowIndex = 0; - _rowScrollY = 0; - _backgroundScrollY = 48 * _newRowIndex; - _currRowIndex = _newRowIndex; - - for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++) - drawRow(_newRowIndex + rowIndex); - - _background->getSurface()->getSysRect().y = _backgroundScrollY; - -} - -Scene2208::~Scene2208() { - delete _fontSurface; - delete _backgroundSurface; - delete _topBackgroundSurface; - delete _bottomBackgroundSurface; -} - -void Scene2208::update() { - - int16 mouseY = _vm->getMouseY(); - - if (mouseY < 48) { - if (_currRowIndex > 0) - _newRowIndex = _currRowIndex - 1; - } else if (mouseY > 432) { - if (_currRowIndex < _maxRowIndex - _visibleRowsCount) - _newRowIndex = _currRowIndex + 1; - } else { - if (_currRowIndex > _newRowIndex) - _newRowIndex = _currRowIndex; - } - - if (_currRowIndex < _newRowIndex) { - if (_rowScrollY == 0) - drawRow(_currRowIndex + _visibleRowsCount); - _backgroundScrollY += 4; - _rowScrollY += 4; - if (_rowScrollY == 48) { - _rowScrollY = 0; - _currRowIndex++; - } - _background->getSurface()->getSysRect().y = _backgroundScrollY; - } else if (_currRowIndex > _newRowIndex || _rowScrollY > 0) { - if (_rowScrollY == 0) { - drawRow(_currRowIndex - 1); - _currRowIndex--; - } - _backgroundScrollY -= 4; - if (_rowScrollY == 0) - _rowScrollY = 48; - _rowScrollY -= 4; - _background->getSurface()->getSysRect().y = _backgroundScrollY; - } - - Scene::update(); - -} - -uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 40 || param.asPoint().x >= 600) - leaveScene(0); - break; - } - return messageResult; -} - -void Scene2208::drawRow(int16 rowIndex) { - NDrawRect sourceRect; - int16 y = (rowIndex * 48) % 528; - if (rowIndex < 4) { - sourceRect.x = 0; - sourceRect.y = y; - sourceRect.width = 640; - sourceRect.height = 48; - _background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect); - } else if (rowIndex > _maxRowIndex - 5) { - sourceRect.x = 0; - sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48; - sourceRect.width = 640; - sourceRect.height = 48; - _background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect); - } else { - rowIndex -= 4; - sourceRect.x = 0; - sourceRect.y = (rowIndex * 48) % 480; - sourceRect.width = 640; - sourceRect.height = 48; - _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect); - if (rowIndex < (int)_strings.size()) { - const char *text = _strings[rowIndex]; - _fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text); - } - } -} - -static const int16 kScene2242XPositions[] = { - 68, 158 -}; - -static const uint32 kScene2242MessageListIds2[] = { - 0x004B3CB8, 0x004B3CD8 -}; - -static const uint32 kScene2242MessageListIds1[] = { - 0x004B3CF8, 0x004B3D20 -}; - -Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isKlaymenInLight(false) { - - SetMessageHandler(&Scene2242::handleMessage); - SetUpdateHandler(&Scene2242::update); - - if (getGlobalVar(V_LIGHTS_ON)) { - setBackground(0x11840E24); - setPalette(0x11840E24); - insertScreenMouse(0x40E20110); - setRectList(0x004B3DC8); - } else { - setBackground(0x25848E24); - setPalette(0x25848E24); - addEntity(_palette); - _palette->copyBasePalette(0, 256, 0); - _palette->addPalette(0x68033B1C, 0, 65, 0); - insertScreenMouse(0x48E20250); - setRectList(0x004B3E18); - } - - _asTape = insertSprite(this, 10, 1100, 464, 435, 0x9148A011); - addCollisionSprite(_asTape); - - if (which < 0) { - // Restoring game - insertKlaymen(200, 430); - setMessageList(0x004B3C18); - } else if (which == 1) { - // Klaymen entering from looking through the window - insertKlaymen(530, 430); - setMessageList(0x004B3D60); - } else if (which == 2) { - // Klaymen returning from reading a text column - insertKlaymen(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430); - setMessageList(0x004B3D48); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) - _klaymen->setDoDeltaX(1); - } else { - // Klaymen entering from the left - insertKlaymen(0, 430); - setMessageList(0x004B3C20); - } - - _klaymen->setSoundFlag(true); - -} - -Scene2242::~Scene2242() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -void Scene2242::update() { - if (!getGlobalVar(V_LIGHTS_ON)) { - if (_isKlaymenInLight && _klaymen->getX() < 440) { - _palette->addBasePalette(0x68033B1C, 0, 65, 0); - _palette->startFadeToPalette(12); - _isKlaymenInLight = false; - } else if (!_isKlaymenInLight && _klaymen->getX() >= 440) { - _palette->addBasePalette(0x25848E24, 0, 65, 0); - _palette->startFadeToPalette(12); - _isKlaymenInLight = true; - } - } - Scene::update(); -} - -uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x800C6694) - readClickedColumn(); - break; - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B3D50); - } - break; - } - return messageResult; -} - -void Scene2242::readClickedColumn() { - int index; - if (_mouseClickPos.x < 108) { - setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188); - setGlobalVar(V_CLICKED_COLUMN_INDEX, 42); - setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart1")); - index = 0; - } else { - setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188); - setGlobalVar(V_CLICKED_COLUMN_INDEX, 43); - setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart2")); - index = 1; - } - setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - if (ABS(_klaymen->getX() - kScene2242XPositions[index]) < 133) - setMessageList2(kScene2242MessageListIds1[index]); - else - setMessageList2(kScene2242MessageListIds2[index]); -} - -static const int16 kHallOfRecordsKlaymenXPos[] = { - 68, 157, 246, 335, - 424, 513, 602 -}; - -static const uint32 kHallOfRecordsSceneMessageListIds2[] = { - 0x004B2978, 0x004B2998, 0x004B29B8, 0x004B29D8, - 0x004B29F8, 0x004B2A18, 0x004B2A38 -}; - -static const uint32 kHallOfRecordsSceneMessageListIds1[] = { - 0x004B2A58, 0x004B2A80, 0x004B2AA8, 0x004B2AD0, - 0x004B2AF8, 0x004B2B20, 0x004B2B48 -}; - -HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId) - : Scene(vm, parentModule) { - - _hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId); - - SetMessageHandler(&HallOfRecordsScene::handleMessage); - SetUpdateHandler(&Scene::update); - - if (!getGlobalVar(V_LIGHTS_ON) && _hallOfRecordsInfo->bgFilename2) { - setRectList(0x004B2BF8); - setBackground(_hallOfRecordsInfo->bgFilename2); - setPalette(_hallOfRecordsInfo->bgFilename2); - insertScreenMouse(0x14320138); - } else { - setRectList(0x004B2BB8); - setBackground(_hallOfRecordsInfo->bgFilename1); - setPalette(_hallOfRecordsInfo->bgFilename1); - insertScreenMouse(0x63A40028); - } - - if (which < 0) { - // Restoring game - insertKlaymen(200, 430); - setMessageList(0x004B2900); - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 430); - setMessageList(0x004B2910); - } else if (which == 2) { - // Klaymen returning from reading a text column - insertKlaymen(kHallOfRecordsKlaymenXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _hallOfRecordsInfo->xPosIndex], 430); - setMessageList(0x004B2B70); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) - _klaymen->setDoDeltaX(1); - } else { - // Klaymen entering from the left - insertKlaymen(0, 430); - setMessageList(0x004B2908); - } - - _klaymen->setSoundFlag(true); - _klaymen->setKlaymenIdleTable2(); - -} - -HallOfRecordsScene::~HallOfRecordsScene() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x800C6694) - readClickedColumn(); - break; - } - return messageResult; -} - -void HallOfRecordsScene::readClickedColumn() { - int16 index = (_mouseClickPos.x - 23) / 89; - if (index >= _hallOfRecordsInfo->count) - setMessageList2(0x004B2920); - else { - setGlobalVar(V_CLICKED_COLUMN_INDEX, _hallOfRecordsInfo->xPosIndex + index); - setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - setGlobalVar(V_COLUMN_TEXT_NAME, _hallOfRecordsInfo->txFilename); - if (index == 0 && _hallOfRecordsInfo->bgFilename3) - setGlobalVar(V_COLUMN_BACK_NAME, _hallOfRecordsInfo->bgFilename3); - else - setGlobalVar(V_COLUMN_BACK_NAME, 0); - if (ABS(_klaymen->getX() - kHallOfRecordsKlaymenXPos[index]) < 133) - setMessageList2(kHallOfRecordsSceneMessageListIds1[index]); - else - setMessageList2(kHallOfRecordsSceneMessageListIds2[index]); - } -} - -static const int16 kScene2247XPositions[] = { - 513, 602 -}; - -static const uint32 kScene2247MessageListIds2[] = { - 0x004B54A0, 0x004B54C0 -}; - -static const uint32 kScene2247MessageListIds1[] = { - 0x004B54E0, 0x004B5508 -}; - -Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene2247::handleMessage); - SetUpdateHandler(&Scene::update); - - if (getGlobalVar(V_LIGHTS_ON)) { - setRectList(0x004B5588); - setBackground(0x40339414); - setPalette(0x40339414); - insertScreenMouse(0x3941040B); - } else { - setRectList(0x004B55C8); - setBackground(0x071963E5); - setPalette(0x071963E5); - insertScreenMouse(0x14320138); - } - - if (which < 0) { - // Restoring game - insertKlaymen(200, 430); - setMessageList(0x004B5428); - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(640, 430); - setMessageList(0x004B5438); - } else if (which == 2) { - // Klaymen returning from reading a text column - insertKlaymen(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) - _klaymen->setDoDeltaX(1); - setMessageList(0x004B5530); - } else { - // Klaymen entering from the left - insertKlaymen(0, 430); - setMessageList(0x004B5430); - } - - _klaymen->setSoundFlag(true); - -} - -Scene2247::~Scene2247() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x800C6694) - readClickedColumn(); - break; - } - return messageResult; -} - -void Scene2247::readClickedColumn() { - int index; - if (_mouseClickPos.x < 553) { - setGlobalVar(V_COLUMN_TEXT_NAME, 0x0008E486); - setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgFatherHeader")); - index = 0; - } else { - setGlobalVar(V_COLUMN_TEXT_NAME, 0x03086004); - setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgQuaterHeader")); - index = 1; - } - setGlobalVar(V_CLICKED_COLUMN_INDEX, 0); - setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); - if (ABS(_klaymen->getX() - kScene2247XPositions[index]) < 133) - setMessageList2(kScene2247MessageListIds1[index]); - else - setMessageList2(kScene2247MessageListIds2[index]); -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2200.h b/engines/neverhood/module2200.h deleted file mode 100644 index f198871613..0000000000 --- a/engines/neverhood/module2200.h +++ /dev/null @@ -1,375 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2200_H -#define NEVERHOOD_MODULE2200_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1000.h" -#include "neverhood/graphics.h" - -namespace Neverhood { - -// Module2200 - -class Module2200 : public Module { -public: - Module2200(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2200(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); - void createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId); -}; - -// Scene2201 - -static const NPoint kSsScene2201PuzzleCubePoints[] = { - {305, 305}, {321, 305}, {336, 305}, {305, 319}, - {321, 319}, {336, 319}, {305, 332}, {321, 332}, - {336, 333} -}; - -static const uint32 kSsScene2201PuzzleCubeFileHashes[] = { - 0x88134A44, 0xAA124340, 0xB8124602, 0xA902464C, - 0x890A4244, 0xA8124642, 0xB812C204, 0x381A4A4C -}; - -class AsScene2201CeilingFan : public AnimatedSprite { -public: - AsScene2201CeilingFan(NeverhoodEngine *vm); -}; - -class AsScene2201Door : public AnimatedSprite { -public: - AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen); -protected: - Klaymen *_klaymen; - Sprite *_ssDoorLight; - bool _isOpen; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stOpenDoor(); - void stCloseDoor(); -}; - -class SsScene2201PuzzleCube : public StaticSprite { -public: - SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex); -}; - -class Scene2201 : public Scene { -public: - Scene2201(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2201(); -protected: - NRect _clipRects[2]; - Sprite *_ssDoorLight; - Sprite *_asDoor; - Sprite *_ssDoorButton; - Sprite *_asTape; - bool _isSoundPlaying; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2202PuzzleCube : public StaticSprite { -public: - SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol); -protected: - Scene *_parentScene; - int16 _cubeSymbol; - int16 _cubePosition; - int16 _newX, _newY; - int16 _xDelta, _yDelta; - int16 _xIncr; - int16 _yIncr; - int16 _errValue; - int16 _counter; - int16 _xFlagPos; - bool _counterDirection; - bool _isMoving; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoveCubeX(); - void suMoveCubeY(); - void moveCube(int16 newCubePosition); - void stopMoving(); -}; - -class Scene2202 : public Scene { -public: - Scene2202(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2202(); -protected: - Sprite *_ssMovingCube; - Sprite *_ssDoneMovingCube; - bool _isCubeMoving; - int16 _movingCubePosition; - int _surfacePriority; - bool _leaveScene; - bool _isSolved; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - int16 getFreeCubePosition(int16 index); - bool testIsSolved(); -}; - -class AsCommonKey : public AnimatedSprite { -public: - AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y); -protected: - Scene *_parentScene; - int _keyIndex; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2203Door : public AnimatedSprite { -public: - AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex); -protected: - Scene *_parentScene; - Sprite *_otherDoor; - uint _doorIndex; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void openDoor(); - void closeDoor(); -}; - -class Scene2203 : public Scene { -public: - Scene2203(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2203(); -protected: - Sprite *_asLeftDoor; - Sprite *_asRightDoor; - Sprite *_ssSmallLeftDoor; - Sprite *_ssSmallRightDoor; - Sprite *_asTape; - Sprite *_asKey; - NRect _leftDoorClipRect; - NRect _rightDoorClipRect; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2205DoorFrame : public StaticSprite { -public: - SsScene2205DoorFrame(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2205 : public Scene { -public: - Scene2205(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - SsCommonPressButton *_ssLightSwitch; - Sprite *_ssDoorFrame; - bool _isKlaymenInLight; - bool _isLightOn; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2206DoorSpikes : public StaticSprite { -public: - AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash); -protected: - int _deltaIndex; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suOpen(); - void suClose(); -}; - -class AsScene2206Platform : public StaticSprite { -public: - AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash); -protected: - int16 _yDelta; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoveDown(); -}; - -class SsScene2206TestTube : public StaticSprite { -public: - SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2206 : public Scene { -public: - Scene2206(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2206(); -protected: - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_asDoorSpikes; - Sprite *_ssButton; - Sprite *_asPlatform; - Sprite *_ssTestTube; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void klaymenInFrontSpikes(); - void klaymenBehindSpikes(); - void readClickedColumn(); -}; - -class AsScene2207Elevator : public AnimatedSprite { -public: - AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene); - ~AsScene2207Elevator(); -protected: - Scene *_parentScene; - NPointArray *_pointArray; - int16 _pointIndex; - int16 _destPointIndex, _destPointIndexDelta; - bool _isMoving; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suSetPosition(); - void moveToY(int16 y); -}; - -class AsScene2207Lever : public AnimatedSprite { -public: - AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stLeverDown(); - void stLeverDownEvent(); - void stLeverUp(); - void stLeverUpEvent(); -}; - -class AsScene2207WallRobotAnimation : public AnimatedSprite { -public: - AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene); - ~AsScene2207WallRobotAnimation(); -protected: - bool _idle; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stStartAnimation(); - void stStopAnimation(); - void cbStopAnimation(); -}; - -class AsScene2207WallCannonAnimation : public AnimatedSprite { -public: - AsScene2207WallCannonAnimation(NeverhoodEngine *vm); -protected: - bool _idle; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stStartAnimation(); - void stStopAnimation(); - void cbStopAnimation(); -}; - -class SsScene2207Symbol : public StaticSprite { -public: - SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index); -}; - -class Scene2207 : public Scene { -public: - Scene2207(NeverhoodEngine *vm, Module *parentModule); -protected: - Sprite *_asElevator; - Sprite *_ssMaskPart1; - Sprite *_ssMaskPart2; - Sprite *_ssMaskPart3; - Sprite *_asTape; - Sprite *_asLever; - Sprite *_asWallRobotAnimation; - Sprite *_asWallCannonAnimation; - Sprite *_ssButton; - int _elevatorSurfacePriority; - bool _klaymenAtElevator; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2208 : public Scene { -public: - Scene2208(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2208(); -protected: - FontSurface *_fontSurface; - BaseSurface *_backgroundSurface; - BaseSurface *_topBackgroundSurface; - BaseSurface *_bottomBackgroundSurface; - TextResource _textResource; - int16 _backgroundScrollY; - int16 _newRowIndex; - int16 _currRowIndex; - int16 _rowScrollY; - int16 _maxRowIndex; - int16 _visibleRowsCount; - Common::Array _strings; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void drawRow(int16 rowIndex); -}; - -class Scene2242 : public Scene { -public: - Scene2242(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2242(); -protected: - Sprite *_asTape; - bool _isKlaymenInLight; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void readClickedColumn(); -}; - -class HallOfRecordsScene : public Scene { -public: - HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId); - ~HallOfRecordsScene(); -protected: - HallOfRecordsInfo *_hallOfRecordsInfo; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void readClickedColumn(); -}; - -class Scene2247 : public Scene { -public: - Scene2247(NeverhoodEngine *vm, Module *parentModule, int which); - ~Scene2247(); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void readClickedColumn(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2200_H */ diff --git a/engines/neverhood/module2300.cpp b/engines/neverhood/module2300.cpp deleted file mode 100644 index bf0e866b2f..0000000000 --- a/engines/neverhood/module2300.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2300.h" -#include "neverhood/navigationscene.h" - -namespace Neverhood { - -static const uint32 kModule2300SoundList[] = { - 0x90805C50, 0x90804450, 0xB4005E60, 0x91835066, - 0x90E14440, 0x90F0D1C3, 0 -}; - -Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundVolume(0) { - - _vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList); - _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); - - _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; - - if (_isWallBroken) { - _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); - _vm->_soundMan->playSoundLooping(0x90F0D1C3); - } else { - _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0); - } - - _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0); - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 1) - createScene(2, 0); - else if (which == 2) - createScene(3, 0); - else if (which == 3) - createScene(4, -1); - else if (which == 4) - createScene(1, 3); - else - createScene(0, 1); - -} - -Module2300::~Module2300() { - _vm->_soundMan->deleteGroup(0x1A214010); -} - -void Module2300::createScene(int sceneNum, int which) { - debug("Module2300::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - createNavigationScene(0x004B67B8, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004B67E8, which); - if (_isWallBroken) { - _soundVolume = 15; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, 15); - } - break; - case 2: - _vm->gameState().sceneNum = 2; - createNavigationScene(0x004B6878, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - if (getGlobalVar(V_WALL_BROKEN)) - createNavigationScene(0x004B68F0, which); - else { - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); - createNavigationScene(0x004B68A8, which); - if (_isWallBroken) { - _soundVolume = 87; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, 87); - } - } - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->setTwoSoundsPlayFlag(true); - createSmackerScene(0x20080A0B, true, true, false); - break; - case 9999: - createDemoScene(); - break; - } - SetUpdateHandler(&Module2300::updateScene); - _childObject->handleUpdate(); -} - -void Module2300::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(1, 4); - else - leaveModule(0); - break; - case 1: - if (_moduleResult == 1) - createScene(0, 0); - else if (_vm->isDemo()) - createScene(9999, 0); - else if (_moduleResult == 2) - createScene(2, 1); - else if (_moduleResult == 3) - createScene(1, 3); - else if (_moduleResult == 4) - createScene(3, 1); - else if (_moduleResult == 5) - leaveModule(3); - else - leaveModule(4); - break; - case 2: - if (_moduleResult == 1) - leaveModule(1); - else - createScene(1, 5); - break; - case 3: - if (_moduleResult == 1) - leaveModule(2); - else - createScene(1, 1); - break; - case 4: - _vm->_soundMan->setTwoSoundsPlayFlag(false); - createScene(1, 2); - break; - case 9999: - createScene(1, -1); - break; - } - } else { - switch (_sceneNum) { - case 1: - if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && - navigationScene()->getFrameNumber() % 2) { - _soundVolume++; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); - } - if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0 && - navigationScene()->getFrameNumber() == 50) { - _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 70); - _vm->_soundMan->setSoundVolume(0x50399F64, 70); - } - break; - case 3: - if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) { - _soundVolume--; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); - } - break; - } - } -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2300.h b/engines/neverhood/module2300.h deleted file mode 100644 index 64f6c6d937..0000000000 --- a/engines/neverhood/module2300.h +++ /dev/null @@ -1,48 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2300_H -#define NEVERHOOD_MODULE2300_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module2300 - -class Module2300 : public Module { -public: - Module2300(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2300(); -protected: - int _sceneNum; - bool _isWallBroken; - int _soundVolume; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2300_H */ diff --git a/engines/neverhood/module2400.cpp b/engines/neverhood/module2400.cpp deleted file mode 100644 index 369132187d..0000000000 --- a/engines/neverhood/module2400.cpp +++ /dev/null @@ -1,992 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2400.h" - -namespace Neverhood { - -Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - _vm->_soundMan->addMusic(0x202D1010, 0xB110382D); - - if (which < 0) - createScene(_vm->gameState().sceneNum, _vm->gameState().which); - else - createScene(0, 0); - -} - -Module2400::~Module2400() { - _vm->_soundMan->deleteMusicGroup(0x202D1010); -} - -void Module2400::createScene(int sceneNum, int which) { - debug("Module2400::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->_soundMan->stopMusic(0xB110382D, 0, 0); - _childObject = new Scene2401(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->_soundMan->startMusic(0xB110382D, 0, 2); - _childObject = new Scene2402(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->startMusic(0xB110382D, 0, 0); - _childObject = new Scene2403(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->stopMusic(0xB110382D, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 0); - break; - case 5: - _vm->gameState().sceneNum = 5; - _vm->_soundMan->startMusic(0xB110382D, 0, 2); - _childObject = new Scene2406(_vm, this, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->_soundMan->stopMusic(0xB110382D, 0, 2); - createSmackerScene(0x20D80001, true, true, false); - break; - case 7: - _vm->gameState().sceneNum = 7; - createStaticScene(0x81523218, 0x2321C81D); - break; - case 8: - _vm->gameState().sceneNum = 8; - createStaticScene(0x08100210, 0x00214089); - break; - case 9: - _vm->gameState().sceneNum = 9; - createStaticScene(0x8C020505, 0x205018C8); - break; - } - SetUpdateHandler(&Module2400::updateScene); - _childObject->handleUpdate(); -} - -void Module2400::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(1, 0); - else - leaveModule(0); - break; - case 1: - if (_moduleResult == 1) - createScene(5, 0); - else if (_moduleResult == 2) - createScene(7, -1); - else - createScene(0, 1); - break; - case 2: - if (_moduleResult == 1) - createScene(9, -1); - else if (_moduleResult == 2) - createScene(6, -1); - else - createScene(5, 1); - break; - case 4: - createScene(5, 2); - break; - case 5: - if (_moduleResult == 1) - createScene(2, 0); - else if (_moduleResult == 2) - createScene(4, 0); - else if (_moduleResult == 3) - createScene(8, -1); - else - createScene(1, 1); - break; - case 6: - createScene(2, 2); - break; - case 7: - createScene(1, 2); - break; - case 8: - createScene(5, 3); - break; - case 9: - createScene(2, 1); - break; - } - } -} - -static const NPoint kScene2401Points[] = { - {384, 389}, {406, 389}, {429, 389}, - {453, 389}, {477, 389} -}; - -static const uint32 kScene2401FileHashes1[] = { - 0x02842920, 0x02882920, 0x02902920, - 0x02A02920, 0x02C02920, 0x02002920, - 0x03802920, 0x00802920, 0x06802920, - 0x03842920 -}; - -static const uint32 kScene2401FileHashes2[] = { - 0xD0910020, 0xD0910038, 0xD0910008, - 0xD0910068, 0xD09100A8, 0 -}; - -static const uint32 kScene2401FileHashes3[] = { - 0xD0910020, 0xD0910038, 0xD0910008, - 0xD0910068, 0xD09100A8, 0 -}; - -static const NRect kScene2401Rects[] = { - NRect(369, 331, 394, 389), - NRect(395, 331, 419, 389), - NRect(420, 331, 441, 389), - NRect(442, 331, 464, 389), - NRect(465, 331, 491, 389) -}; - -static const uint32 kAsScene2401WaterSpitFileHashes2[] = { - 0x5C044690, 0x5C644690, 0x5CA44690, - 0x5D244690, 0x5E244690 -}; - -static const uint32 kAsScene2401WaterSpitFileHashes1[] = { - 0xF4418408, 0xF4418808, 0xF4419008, - 0xF441A008, 0xCD4F8411 -}; - -AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200) { - - _x = 240; - _y = 447; - createSurface(100, 146, 74); - setVisible(false); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2401WaterSpit::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); -} - -uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x120A0013) - playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]); - break; - case 0x2000: - _x = 240; - _y = 447; - _soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()); - startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1); - setVisible(true); - playSound(0, 0x48640244); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200), _isWaterFlowing(false) { - - _x = 88; - _y = 421; - createSurface1(0x10203116, 100); - setVisible(false); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2401FlowingWater::handleMessage); -} - -AsScene2401FlowingWater::~AsScene2401FlowingWater() { - _vm->_soundMan->deleteSoundGroup(0x40F11C09); -} - -uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (_isWaterFlowing && param.asInteger() == 0x02421405) - startAnimationByHash(0x10203116, 0x01084280, 0); - break; - case 0x2002: - if (!_isWaterFlowing) { - _vm->_soundMan->addSound(0x40F11C09, 0x980C1420); - _vm->_soundMan->playSoundLooping(0x980C1420); - startAnimation(0x10203116, 0, -1); - setVisible(true); - _isWaterFlowing = true; - } - break; - case 0x2003: - _vm->_soundMan->deleteSound(0x980C1420); - _isWaterFlowing = false; - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y) - : AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) { - - _x = x; - _y = y; - createSurface1(0xB8596884, 100); - setVisible(false); - SetUpdateHandler(&AsScene2401WaterFlushing::update); - SetMessageHandler(&AsScene2401WaterFlushing::handleMessage); -} - -void AsScene2401WaterFlushing::update() { - if (_countdown != 0 && (--_countdown) == 0) { - setDoDeltaX(_vm->_rnd->getRandomNumber(1)); - startAnimation(0xB8596884, 0, -1); - setVisible(true); - } - AnimatedSprite::update(); -} - -uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) { - startAnimationByHash(0xB8596884, 0x01084280, 0); - _flushLoopCount--; - } - break; - case 0x2002: - if (param.asInteger() > 0) { - _flushLoopCount = param.asInteger() - 1; - _countdown = _vm->_rnd->getRandomNumber(3) + 1; - } - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) - : AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) { - - _x = 320; - _y = 240; - createSurface1(0x44687810, 100); - _newStickFrameIndex = STICK_LAST_FRAME; - if (_isOpen) { - stopAnimation(); - setVisible(false); - _countdown = 48; - } else { - startAnimation(0x44687810, 0, -1); - _newStickFrameIndex = 0; - } - SetUpdateHandler(&AsScene2401Door::update); - SetMessageHandler(&AsScene2401Door::handleMessage); -} - -void AsScene2401Door::update() { - if (_isOpen && _countdown != 0 && (--_countdown) == 0) { - _isOpen = false; - setVisible(true); - startAnimation(0x44687810, -1, -1); - _newStickFrameIndex = 0; - _playBackwards = true; - playSound(0, calcHash("fxDoorClose38")); - } - AnimatedSprite::update(); -} - -uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2004: - if (_isOpen) - _countdown = 168; - messageResult = _isOpen ? 1 : 0; - break; - case 0x3002: - gotoNextState(); - break; - case 0x4808: - if (!_isOpen) { - _countdown = 168; - _isOpen = true; - setVisible(true); - startAnimation(0x44687810, 0, -1); - playSound(0, calcHash("fxDoorOpen38")); - NextState(&AsScene2401Door::stDoorOpenFinished); - } - break; - } - return messageResult; -} - -void AsScene2401Door::stDoorOpenFinished() { - stopAnimation(); - setVisible(false); -} - -Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _unkFlag(false), - _soundToggle(false), _asWaterSpitIndex(0) { - - _vm->gameModule()->initWaterPipesPuzzle(); - - SetMessageHandler(&Scene2401::handleMessage); - SetUpdateHandler(&Scene2401::update); - - setRectList(0x004B3140); - setBackground(0x8C030206); - setPalette(0x8C030206); - addEntity(_palette); - _palette->addBasePalette(0x8C030206, 0, 256, 0); - _palette->addPalette(0x91D3A391, 0, 65, 0); - insertScreenMouse(0x302028C8); - - _sprite1 = insertStaticSprite(0x2E068A23, 200); - insertStaticSprite(0x401410A6, 200); - _asFlowingWater = insertSprite(); - insertStaticSprite(0x90C0A4B4, 200); - _ssButton = insertSprite(this, 0x0092916A, 100, 0); - _ssFloorButton = insertSprite(this, 0x28001120, 0x00911068, 100, 0); - - for (uint i = 0; i < 5; i++) - _asWaterFlushing[i] = insertSprite(kScene2401Points[i].x, kScene2401Points[i].y); - - for (uint i = 0; i < 10; i++) { - _ssWaterPipes[i] = insertStaticSprite(kScene2401FileHashes1[i], 300); - _ssWaterPipes[i]->setVisible(false); - } - - _asWaterSpit[0] = insertSprite(); - _asWaterSpit[1] = insertSprite(); - - if (which < 0) { - // Restoring game - insertKlaymen(200, 447); - setMessageList(0x004B2F70); - _asDoor = insertSprite(false); - } else if (which == 1) { - // Klaymen entering from the back - insertKlaymen(280, 413); - setMessageList(0x004B2F80); - _palette->addBasePalette(0xB103B604, 0, 65, 0); - _palette->addPalette(0xB103B604, 0, 65, 0); - _asDoor = insertSprite(true); - } else { - // Klaymen entering from the left - insertKlaymen(-20, 447); - setMessageList(0x004B2F78); - _asDoor = insertSprite(false); - } - -} - -void Scene2401::update() { - - if (_countdown1 != 0 && (--_countdown1) == 0) { - if (_pipeStatus > 0 && _pipeStatus <= 10) - _ssWaterPipes[_pipeStatus - 1]->setVisible(false); - if (_pipeStatus >= 10) { - bool puzzleSolved = true, waterInside = false; - for (uint pipeIndex = 0; pipeIndex < 5; pipeIndex++) { - if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, pipeIndex)) - puzzleSolved = false; - if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != 0) - waterInside = true; - } - if (puzzleSolved) { - setGlobalVar(V_NOTES_DOOR_UNLOCKED, 1); - setGlobalVar(V_NOTES_PUZZLE_SOLVED, 1); - sendMessage(_asDoor, 0x4808, 0); - } else if (waterInside) { - playPipeSound(0xD0431020); - for (uint i = 0; i < 5; i++) { - sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(VA_CURR_WATER_PIPES_LEVEL, i)); - setSubVar(VA_CURR_WATER_PIPES_LEVEL, i, 0); - } - } - } else if (_pipeStatus >= 5) { - _ssWaterPipes[_pipeStatus]->setVisible(true); - _countdown1 = 8; - playPipeSound(kScene2401FileHashes3[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); - } else { - _ssWaterPipes[_pipeStatus]->setVisible(true); - _countdown1 = _pipeStatus == 4 ? 16 : 8; - playPipeSound(kScene2401FileHashes3[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]); - } - _pipeStatus++; - } - - if (_countdown2 != 0 && (--_countdown2) == 0) - sendMessage(_asFlowingWater, 0x2003, 0); - - Scene::update(); - -} - -uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x02144CB1) - sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); - else if (param.asInteger() == 0x11C40840) { - if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) - setMessageList(0x004B3090); - else - setMessageList(0x004B30B0); - } else if (param.asInteger() == 0x412722C0) { - if (_countdown2 > 0 && getGlobalVar(V_HAS_TEST_TUBE)) { - _countdown2 = 144; - setMessageList(0x004B3020); - } else - setMessageList(0x004B3050); - } else if (param.asInteger() == 0x21142050) { - if (_unkFlag && _countdown1 == 0 && !getGlobalVar(V_NOTES_PUZZLE_SOLVED)) - setMessageList(0x004B2FA8); - else - setMessageList(0x004B2FC8); - } else if (param.asInteger() == 0x87441031) - setSurfacePriority(_sprite1->getSurface(), 1100); - else if (param.asInteger() == 0x80C40322) { - setSurfacePriority(_sprite1->getSurface(), 200); - cancelMessageList(); - _unkFlag = true; - } else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) - _countdown2 = 12; - break; - case 0x2000: - messageResult = 0; - for (uint32 i = 0; i < 5; i++) - if (kScene2401Rects[i].contains(_mouseClickPos.x, _mouseClickPos.y)) { - messageResult = i; - break; - } - break; - case 0x2001: - sendMessage(_asWaterSpit[_asWaterSpitIndex], 0x2000, param.asInteger()); - _asWaterSpitIndex = (_asWaterSpitIndex + 1) & 1; - incSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 1); - if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()) >= 5) - setSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 4); - break; - case 0x480B: - if (sender == _ssButton) { - _pipeStatus = 0; - _countdown1 = 8; - } else if (sender == _ssFloorButton && getGlobalVar(V_WATER_RUNNING)) { - _countdown2 = 144; - sendMessage(_asFlowingWater, 0x2002, 0); - playSound(0, 0xE1130324); - } - break; - case 0x482A: - _palette->addBasePalette(0xB103B604, 0, 65, 0); - _palette->startFadeToPalette(12); - break; - case 0x482B: - _palette->addBasePalette(0x91D3A391, 0, 65, 0); - _palette->startFadeToPalette(12); - break; - } - return messageResult; -} - -void Scene2401::playPipeSound(uint32 fileHash) { - playSound(_soundToggle ? 0 : 1, fileHash); - _soundToggle = !_soundToggle; -} - -static const uint32 kScene2402FileHashes[] = { - 0xD0910020, 0xD0910038, 0xD0910008, - 0xD0910068, 0xD09100A8 -}; - -AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) { - - _x = 320; - _y = 240; - createSurface1(0x80495831, 100); - if (_isOpen) { - startAnimation(0x80495831, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - _countdown = 48; - } else { - stopAnimation(); - setVisible(false); - } - SetUpdateHandler(&AsScene2402Door::update); - SetMessageHandler(&AsScene2402Door::handleMessage); -} - -void AsScene2402Door::update() { - if (_isOpen && _countdown != 0 && (--_countdown) == 0) { - _isOpen = false; - setVisible(true); - startAnimation(0x80495831, -1, -1); - _playBackwards = true; - playSound(0, calcHash("fxDoorClose38")); - NextState(&AsScene2402Door::stDoorClosingFinished); - } - AnimatedSprite::update(); -} - -uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - if (_isOpen) - _countdown = 144; - messageResult = _isOpen ? 1 : 0; - break; - case 0x3002: - gotoNextState(); - break; - case 0x4808: - _countdown = 144; - _isOpen = true; - setVisible(true); - startAnimation(0x80495831, 0, -1); - _newStickFrameIndex = STICK_LAST_FRAME; - playSound(0, calcHash("fxDoorOpen38")); - break; - } - return messageResult; -} - -void AsScene2402Door::stDoorClosingFinished() { - sendMessage(_parentScene, 0x2001, 0); - setVisible(false); -} - -AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen) - : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown1(0), _countdown2(0) { - - _x = 260; - _y = 210; - createSurface(100, 127, 90); - setDoDeltaX(1); - SetMessageHandler(&Sprite::handleMessage); - if (!getGlobalVar(V_TV_JOKE_TOLD)) { - loadSound(0, 0x58208810); - _countdown1 = 48; - startAnimation(0x4919397A, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AsScene2402TV::upWait); - } else { - int16 frameIndex; - if (_klaymen->getX() > 320) - _currFrameIndex = 29; - frameIndex = CLIP((_klaymen->getX() - _x + 150) / 10, 0, 29); - startAnimation(0x050A0103, frameIndex, -1); - _newStickFrameIndex = frameIndex; - _countdown1 = 0; - SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); - } -} - -AsScene2402TV::~AsScene2402TV() { - _vm->_soundMan->deleteSoundGroup(0x01520123); -} - -void AsScene2402TV::upWait() { - if (_countdown1 != 0 && (--_countdown1) == 0) { - startAnimation(0x4919397A, 0, -1); - SetMessageHandler(&AsScene2402TV::hmJoke); - NextState(&AsScene2402TV::stJokeFinished); - } - AnimatedSprite::update(); -} - -void AsScene2402TV::upFocusKlaymen() { - int16 frameIndex = CLIP((_klaymen->getX() - _x + 150) / 10, 0, 29); - if (frameIndex != _currFrameIndex) { - if (frameIndex > _currFrameIndex) - _currFrameIndex++; - else if (frameIndex < _currFrameIndex) - _currFrameIndex--; - startAnimation(0x050A0103, _currFrameIndex, -1); - _newStickFrameIndex = _currFrameIndex; - if (_countdown2 == 0) { - _vm->_soundMan->addSound(0x01520123, 0xC42D4528); - _vm->_soundMan->playSoundLooping(0xC42D4528); - } - _countdown2 = 5; - } else if (_countdown2 != 0 && (--_countdown2 == 0)) - _vm->_soundMan->deleteSound(0xC42D4528); - AnimatedSprite::update(); -} - -void AsScene2402TV::stJokeFinished() { - setGlobalVar(V_TV_JOKE_TOLD, 1); - startAnimation(0x050A0103, 0, -1); - _newStickFrameIndex = 0; - SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); -} - -uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x431EA0B0) - playSound(0); - break; - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _countdown(0), _soundToggle(false) { - - Sprite *tempSprite; - - SetMessageHandler(&Scene2402::handleMessage); - SetUpdateHandler(&Scene2402::update); - - setRectList(0x004AF900); - setBackground(0x81660220); - setPalette(0x81660220); - insertScreenMouse(0x6022481E); - _asTape = insertSprite(this, 9, 1100, 286, 409, 0x9148A011); - addCollisionSprite(_asTape); - _ssButton = insertSprite(this, 0x15288120, 100, 0); - - if (which < 0) { - // Restoring game - insertKlaymen(198, 404); - setMessageList(0x004AF7C8); - } else if (which == 1) { - // Klaymen entering from the right - insertKlaymen(660, 404); - setMessageList(0x004AF7D8); - } else if (which == 2) { - // Klaymen returning from looking through the window - insertKlaymen(409, 404); - _klaymen->setDoDeltaX(getGlobalVar(V_KLAYMEN_IS_DELTA_X) ? 1 : 0); - setMessageList(0x004AF888); - } else { - // Klaymen entering from the left - insertKlaymen(0, 404); - setMessageList(0x004AF7D0); - } - - tempSprite = insertStaticSprite(0x081A60A8, 1100); - _ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100); - _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2()); - _asDoor = insertSprite(this, which == 0); - insertSprite(_klaymen); - insertStaticSprite(0x3A01A020, 200); - -} - -Scene2402::~Scene2402() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -void Scene2402::update() { - if (_countdown != 0 && (--_countdown) == 0) { - if (_pipeStatus >= 10) { - sendMessage(_asDoor, 0x4808, 0); - _ssDoorFrame->loadSprite(0x00B415E0, kSLFDefDrawOffset | kSLFDefPosition); - } else if (_pipeStatus >= 5) { - _countdown = 8; - playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); - } else { - _countdown = _pipeStatus == 4 ? 16 : 8; - playPipeSound(kScene2402FileHashes[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]); - } - _pipeStatus++; - } - Scene::update(); -} - -uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x402064D8) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x01C66840) { - if (sendMessage(_asDoor, 0x2000, 0)) - setMessageList(0x004AF800); - else - setMessageList(0x004AF818); - } - break; - case 0x2001: - _ssDoorFrame->loadSprite(0x406C0AE0, kSLFDefDrawOffset | kSLFDefPosition); - break; - case 0x480B: - if (sender == _ssButton) { - _pipeStatus = 0; - _countdown = 8; - } - break; - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004AF890); - } - break; - } - return messageResult; -} - -void Scene2402::playPipeSound(uint32 fileHash) { - playSound(_soundToggle ? 0 : 1, fileHash); - _soundToggle = !_soundToggle; -} - -Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite1, *tempSprite2, *tempSprite3; - - SetMessageHandler(&Scene2403::handleMessage); - setBackground(0x0C05060C); - setPalette(0x0C05060C); - _palette->addPalette(0x414364B0, 0, 65, 0); - insertScreenMouse(0x506080C8); - _asTape = insertSprite(this, 2, 1100, 480, 454, 0x9148A011); - addCollisionSprite(_asTape); - _asLightCord = insertSprite(this, 0xA1095A10, 0x836D3813, 368, 200); - _asLightCord->setClipRect(0, 25, 640, 480); - - if (which < 0) { - // Restoring game - _isClimbingLadder = false; - insertKlaymen(220, 449); - setMessageList(0x004B5C98); - setRectList(0x004B5E18); - } else if (which == 1) { - // Klaymen returning from looking through the window - _isClimbingLadder = false; - insertKlaymen(433, 449); - setMessageList(0x004B5D70); - setRectList(0x004B5E18); - } else if (which == 2) { - // Klaymen standing around after the critter video - _isClimbingLadder = false; - insertKlaymen(440, 449); - _klaymen->setDoDeltaX(1); - setMessageList(0x004B5C98); - setRectList(0x004B5E18); - } else { - // Klaymen coming up from ladder - _isClimbingLadder = true; - insertKlaymen(122, 599); - setMessageList(0x004B5CA0); - setRectList(0x004B5E28); - } - - _ssButton = insertSprite(this, 0x3130B0EB, 100, 0); - tempSprite1 = insertStaticSprite(0x20C24220, 1100); - tempSprite2 = insertStaticSprite(0x03080900, 1300); - tempSprite3 = insertSprite(_klaymen); - tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); - _klaymen->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); - loadSound(1, calcHash("fxFogHornSoft")); -} - -uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x040424D0) - sendEntityMessage(_klaymen, 0x1014, _ssButton); - else if (param.asInteger() == 0x180CE614) - sendEntityMessage(_klaymen, 0x1014, _asLightCord); - break; - case 0x2000: - _isClimbingLadder = true; - setRectList(0x004B5E28); - break; - case 0x2001: - _isClimbingLadder = false; - setRectList(0x004B5E18); - break; - case 0x480B: - if (sender == _ssButton) { - if (getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) { - setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 0); - playSound(0, calcHash("fx3LocksDisable")); - } else { - setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 1); - playSound(1); - } - } - break; - case 0x480F: - if (sender == _asLightCord) - leaveScene(2); - break; - case 0x4826: - if (sender == _asTape && !_isClimbingLadder) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B5D98); - } - break; - } - return messageResult; -} - -Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite1, *tempSprite2; - - if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) - setGlobalVar(V_KEY3_LOCATION, 2); - - SetMessageHandler(&Scene2406::handleMessage); - - setRectList(0x004B78C8); - insertScreenMouse(0xB03001A8); - - if (getGlobalVar(V_KEY3_LOCATION) == 2) { - _asKey = insertSprite(this, 2, 1100, 560, 409); - addCollisionSprite(_asKey); - } - - _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); - addCollisionSprite(_asTape); - tempSprite2 = insertStaticSprite(0x19625293, 1100); - _clipRects[0].x1 = 0; - _clipRects[0].y1 = 0; - _clipRects[0].x2 = tempSprite2->getDrawRect().x2(); - _clipRects[0].y2 = 480; - - if (getGlobalVar(V_SPIKES_RETRACTED)) { - setBackground(0x1A0B0304); - setPalette(0x1A0B0304); - tempSprite1 = insertStaticSprite(0x32923922, 1100); - } else { - setBackground(0x0A038595); - setPalette(0x0A038595); - tempSprite1 = insertStaticSprite(0x1712112A, 1100); - } - - tempSprite2 = insertStaticSprite(0x22300924, 1300); - _clipRects[1].x1 = tempSprite1->getDrawRect().x; - _clipRects[1].y1 = tempSprite2->getDrawRect().y; - _clipRects[1].x2 = 640; - _clipRects[1].y2 = 480; - - if (which < 0) { - // Restoring game - _isClimbingLadder = false; - insertKlaymen(307, 404, _clipRects, 2); - setMessageList(0x004B76C8); - setRectList(0x004B78C8); - } else if (which == 1) { - // Klaymen coming down the ladder - _isClimbingLadder = true; - insertKlaymen(253, -16, _clipRects, 2); - setMessageList(0x004B76D8); - setRectList(0x004B78D8); - } else if (which == 2) { - // Klaymen returning from the diskplayer - _isClimbingLadder = false; - insertKlaymen(480, 404, _clipRects, 2); - setMessageList(0x004B77C0); - setRectList(0x004B78C8); - } else if (which == 3) { - // Klaymen returning from looking through the window - _isClimbingLadder = false; - insertKlaymen(387, 404, _clipRects, 2); - setMessageList(0x004B7810); - setRectList(0x004B78C8); - } else { - // Klaymen entering from the left - _isClimbingLadder = false; - insertKlaymen(0, 404, _clipRects, 2); - setMessageList(0x004B76D0); - setRectList(0x004B78C8); - } - - tempSprite2 = insertSprite(_klaymen); - tempSprite2->setClipRect(_clipRects[1]); - -} - -uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x41062804) { - if (getGlobalVar(V_SPIKES_RETRACTED)) - setMessageList(0x004B7758); - else - setMessageList(0x004B7738); - } - break; - case 0x2000: - _isClimbingLadder = true; - setRectList(0x004B78D8); - break; - case 0x2001: - _isClimbingLadder = false; - setRectList(0x004B78C8); - break; - case 0x4826: - if (sender == _asTape && !_isClimbingLadder) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B77C8); - } else if (sender == _asKey && !_isClimbingLadder) { - sendEntityMessage(_klaymen, 0x1014, _asKey); - setMessageList(0x004B77D8); - } - break; - } - return messageResult; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2400.h b/engines/neverhood/module2400.h deleted file mode 100644 index 38664658ce..0000000000 --- a/engines/neverhood/module2400.h +++ /dev/null @@ -1,182 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2400_H -#define NEVERHOOD_MODULE2400_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/gamemodule.h" -#include "neverhood/module1000.h" -#include "neverhood/module1100.h" -#include "neverhood/module1200.h" -#include "neverhood/module2100.h" -#include "neverhood/module2200.h" -#include "neverhood/module2800.h" -#include "neverhood/diskplayerscene.h" - -namespace Neverhood { - -// Module2400 - -class Module2400 : public Module { -public: - Module2400(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2400(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2401WaterSpit : public AnimatedSprite { -public: - AsScene2401WaterSpit(NeverhoodEngine *vm); -protected: - int _soundIndex; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2401FlowingWater : public AnimatedSprite { -public: - AsScene2401FlowingWater(NeverhoodEngine *vm); - virtual ~AsScene2401FlowingWater(); -protected: - bool _isWaterFlowing; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2401WaterFlushing : public AnimatedSprite { -public: - AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y); -protected: - int _countdown; - int _flushLoopCount; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2401Door : public AnimatedSprite { -public: - AsScene2401Door(NeverhoodEngine *vm, bool isOpen); -protected: - int _countdown; - bool _isOpen; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoorOpenFinished(); -}; - -class Scene2401 : public Scene { -public: - Scene2401(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_sprite1; - Sprite *_asFlowingWater; - Sprite *_ssButton; - Sprite *_ssFloorButton; - Sprite *_asWaterSpit[2]; - Sprite *_ssWaterPipes[10]; - Sprite *_asWaterFlushing[5]; - Sprite *_asDoor; - bool _soundToggle; - bool _unkFlag; - int _countdown1; - int _countdown2; - int _pipeStatus; - int _asWaterSpitIndex; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void playPipeSound(uint32 fileHash); -}; - -class AsScene2402Door : public AnimatedSprite { -public: - AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen); -protected: - Scene *_parentScene; - int _countdown; - bool _isOpen; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void stDoorClosingFinished(); -}; - -class AsScene2402TV : public AnimatedSprite { -public: - AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen); - virtual ~AsScene2402TV(); -protected: - Klaymen *_klaymen; - int _countdown1; - int _countdown2; - void upWait(); - void upFocusKlaymen(); - void stJokeFinished(); - uint32 hmJoke(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2402 : public Scene { -public: - Scene2402(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene2402(); -protected: - Sprite *_asDoor; - Sprite *_ssButton; - Sprite *_asTape; - StaticSprite *_ssDoorFrame; - int _pipeStatus; - int _countdown; - bool _soundToggle; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void playPipeSound(uint32 fileHash); -}; - -class Scene2403 : public Scene { -public: - Scene2403(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_ssButton; - Sprite *_asTape; - Sprite *_asKey; - Sprite *_asLightCord; - bool _isClimbingLadder; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2406 : public Scene { -public: - Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_asTape; - Sprite *_asKey; - NRect _clipRects[2]; - bool _isClimbingLadder; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2400_H */ diff --git a/engines/neverhood/module2500.cpp b/engines/neverhood/module2500.cpp deleted file mode 100644 index 1623e4ca90..0000000000 --- a/engines/neverhood/module2500.cpp +++ /dev/null @@ -1,546 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2500.h" -#include "neverhood/module1600.h" - -namespace Neverhood { - -static const uint32 kScene2505StaticSprites[] = { - 0x4000A226, 0 -}; - -static const NRect kScene2505ClipRect = NRect(0, 0, 564, 480); - -static const uint32 kScene2506StaticSprites[] = { - 0x4027AF02, 0 -}; - -static const NRect kScene2506ClipRect = NRect(0, 0, 640, 441); - -static const uint32 kScene2508StaticSprites1[] = { - 0x2F08E610, 0xD844E6A0, 0 -}; - -static const NRect kScene2508ClipRect1 = NRect(0, 0, 594, 448); - -static const uint32 kScene2508StaticSprites2[] = { - 0x2F08E610, 0 -}; - -static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448); - -Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundIndex(0) { - - _vm->_soundMan->addMusic(0x29220120, 0x05343184); - _vm->_soundMan->startMusic(0x05343184, 0, 0); - SetMessageHandler(&Module2500::handleMessage); - - if (which < 0) - createScene(_vm->gameState().sceneNum, _vm->gameState().which); - else - createScene(0, 0); - - loadSound(0, 0x00880CCC); - loadSound(1, 0x00880CC0); - loadSound(2, 0x00880CCC); - loadSound(3, 0x00880CC0); - -} - -Module2500::~Module2500() { - _vm->_soundMan->deleteMusicGroup(0x29220120); -} - -void Module2500::createScene(int sceneNum, int which) { - debug("Module2500::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2501(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->gameState().which = which; - createScene2704(which, 0x004B01B8, 220); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->gameState().which = which; - if (getGlobalVar(V_WORLDS_JOINED)) - createScene2704(which, 0x004B01E0, 150); - else - createScene2704(which, 0x004B0208, 150); - break; - case 3: - _vm->gameState().sceneNum = 3; - _childObject = new Scene2504(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->gameState().which = which; - createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect); - break; - case 5: - setGlobalVar(V_CAR_DELTA_X, 1); - _vm->gameState().sceneNum = 5; - _vm->gameState().which = which; - createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->gameState().which = which; - createScene2704(which, 0x004B02A0, 150); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->gameState().which = which; - if (getGlobalVar(V_ENTRANCE_OPEN)) - createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1); - else - createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2); - break; - case 8: - _vm->gameState().sceneNum = 8; - _childObject = new Scene1608(_vm, this, which); - break; - case 9: - _vm->gameState().sceneNum = 9; - if (getGlobalVar(V_ENTRANCE_OPEN)) - createStaticScene(0xC62A0645, 0xA0641C6A); - else - createStaticScene(0x7A343546, 0x435427AB); - break; - } - SetUpdateHandler(&Module2500::updateScene); - _childObject->handleUpdate(); -} - -void Module2500::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(2, 0); - else if (_moduleResult == 2) - createScene(1, 0); - else - leaveModule(0); - break; - case 1: - if (_moduleResult == 1) - createScene(3, -1); - else - createScene(0, 2); - break; - case 2: - if (_moduleResult == 1) - createScene(4, 0); - else - createScene(0, 1); - break; - case 3: - createScene(1, 1); - break; - case 4: - if (_moduleResult == 1) - createScene(5, 0); - else - createScene(2, 1); - break; - case 5: - if (_moduleResult == 1) - createScene(6, 0); - else - createScene(4, 1); - break; - case 6: - if (_moduleResult == 1) - createScene(7, 0); - else - createScene(5, 1); - break; - case 7: - if (_moduleResult == 1) - createScene(8, 1); - else - createScene(6, 1); - break; - case 8: - if (_moduleResult == 2) - createScene(9, -1); - else - createScene(7, 1); - break; - case 9: - createScene(8, 2); - break; - } - } -} - -uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Module::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x200D: - playSound(_soundIndex); - _soundIndex++; - if (_soundIndex >= 4) - _soundIndex = 0; - break; - } - return messageResult; -} - -void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { - _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); -} - -Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2628)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B264C)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2670)); - - setGlobalVar(V_CAR_DELTA_X, 1); - SetUpdateHandler(&Scene2501::update); - setBackground(0x1B8E8115); - setPalette(0x1B8E8115); - _palette->addPalette(0x00128842, 65, 31, 65); - _palette->addPalette("paKlayRed", 0, 64, 0); - insertScreenMouse(0xE81111B0); - - _ssTrackShadowBackground = createSprite(0x99BE9015); // Don't add this to the sprite list - addEntity(_ssTrackShadowBackground); - _asCar = createSprite(this, 211, 400); // Create but don't add to the sprite list yet - _asIdleCarLower = insertSprite(211, 400); - _asIdleCarFull = insertSprite(211, 400); - insertStaticSprite(0xC42AC521, 1500); - - if (which < 0) { - // Restoring game - insertKlaymen(162, 393); - _kmScene2501 = _klaymen; - _klaymenInCar = false; - setMessageList(0x004B2538); - setRectList(0x004B2608); - SetMessageHandler(&Scene2501::handleMessage); - SetUpdateHandler(&Scene2501::update); - sendMessage(_asCar, 0x2009, 0); - _asCar->setVisible(false); - _currTrackIndex = 0; - } else if (which == 1 || which == 2) { - // 1: Klaymen entering riding the car on the left track - // 2: Klaymen entering riding the car on the bottom track - addSprite(_asCar); - _kmScene2501 = (Klaymen*)new KmScene2501(_vm, this, 275, 393); - _klaymenInCar = true; - sendMessage(_kmScene2501, 0x2000, 1); - _kmScene2501->setDoDeltaX(1); - SetMessageHandler(&Scene2501::hmRidingCar); - SetUpdateHandler(&Scene2501::upRidingCar); - _asIdleCarLower->setVisible(false); - _asIdleCarFull->setVisible(false); - _currTrackIndex = which; - } else { - // Klaymen entering the car - insertKlaymen(162, 393); - _kmScene2501 = _klaymen; - _klaymenInCar = false; - setMessageList(0x004B2538); - setRectList(0x004B2608); - SetMessageHandler(&Scene2501::handleMessage); - SetUpdateHandler(&Scene2501::update); - sendMessage(_asCar, 0x2009, 0); - _asCar->setVisible(false); - _currTrackIndex = 0; - } - - _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - insertSprite(_asCar); - - _newTrackIndex = -1; - _dataResource.load(calcHash("Ashooded")); - - _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); - _asCar->setPathPoints(_trackPoints); - - if (which >= 0 && _tracks[_currTrackIndex]->which2 == which) { - NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_asCar, 0x2007, 150); - } else { - NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_asCar, 0x2002, 0); - if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_asCar, 0x2008, 150); - } - - _carStatus = 0; - -} - -Scene2501::~Scene2501() { - // Free sprites not currently in the sprite list - if (_klaymenInCar) - delete _kmScene2501; - else - delete _asCar; -} - -void Scene2501::update() { - Scene::update(); - if (_carStatus == 1) { - removeSprite(_klaymen); - addSprite(_asCar); - clearRectList(); - _klaymenInCar = true; - SetMessageHandler(&Scene2501::hmCarAtHome); - SetUpdateHandler(&Scene2501::upCarAtHome); - _asIdleCarLower->setVisible(false); - _asIdleCarFull->setVisible(false); - _asCar->setVisible(true); - sendMessage(_asCar, 0x2009, 0); - _asCar->handleUpdate(); - _klaymen = NULL; - _carStatus = 0; - } - updateKlaymenClipRect(); -} - -void Scene2501::upCarAtHome() { - Scene::update(); - if (_mouseClicked) { - if (_mouseClickPos.x <= 210 && _asCar->getX() == 211 && _asCar->getY() == 400) { - sendMessage(_asCar, 0x200A, 0); - SetUpdateHandler(&Scene2501::upGettingOutOfCar); - } else { - moveCarToPoint(_mouseClickPos); - SetMessageHandler(&Scene2501::hmRidingCar); - SetUpdateHandler(&Scene2501::upRidingCar); - } - _mouseClicked = false; - } - updateKlaymenClipRect(); -} - -void Scene2501::upGettingOutOfCar() { - Scene::update(); - if (_carStatus == 2) { - _klaymen = _kmScene2501; - removeSprite(_asCar); - addSprite(_klaymen); - _klaymenInCar = false; - SetMessageHandler(&Scene2501::handleMessage); - SetUpdateHandler(&Scene2501::update); - setRectList(0x004B2608); - _asIdleCarLower->setVisible(true); - _asIdleCarFull->setVisible(true); - _asCar->setVisible(false); - setMessageList(0x004B2570); - processMessageList(); - _klaymen->handleUpdate(); - _carStatus = 0; - } - updateKlaymenClipRect(); -} - -void Scene2501::upRidingCar() { - Scene::update(); - if (_mouseClicked) { - moveCarToPoint(_mouseClickPos); - _mouseClicked = false; - } -} - -uint32 Scene2501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x60842040) - _carStatus = 1; - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return messageResult; -} - -uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2005: - if (_tracks[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) - changeTrack(); - else if (_tracks[_currTrackIndex]->which1 == 0) { - SetMessageHandler(&Scene2501::hmCarAtHome); - SetUpdateHandler(&Scene2501::upCarAtHome); - sendMessage(_asCar, 0x200F, 1); - } else if (_tracks[_currTrackIndex]->which1 > 0) - leaveScene(_tracks[_currTrackIndex]->which1); - break; - case 0x2006: - if (_tracks[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) - changeTrack(); - else if (_tracks[_currTrackIndex]->which2 == 0) { - SetMessageHandler(&Scene2501::hmCarAtHome); - SetUpdateHandler(&Scene2501::upCarAtHome); - sendMessage(_asCar, 0x200F, 1); - } else if (_tracks[_currTrackIndex]->which2 > 0) - leaveScene(_tracks[_currTrackIndex]->which2); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return messageResult; -} - -uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x200A: - _carStatus = 2; - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return messageResult; -} - -void Scene2501::moveCarToPoint(NPoint &pt) { - int minMatchTrackIndex, minMatchDistance; - _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); - if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { - _newTrackIndex = minMatchTrackIndex; - _clickPoint = pt; - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2003, 0); - } else { - _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt); - } -} - -void Scene2501::changeTrack() { - _currTrackIndex = _newTrackIndex; - _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); - _asCar->setPathPoints(_trackPoints); - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2002, 0); - sendPointMessage(_asCar, 0x2004, _clickPoint); - _newTrackIndex = -1; -} - -void Scene2501::updateKlaymenClipRect() { - if (_kmScene2501->getX() <= 211) - _kmScene2501->setClipRect(0, 0, 640, 480); - else - _kmScene2501->setClipRect(0, 0, 640, 388); -} - -SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) - : StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) { - - loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - setVisible(false); - loadSound(0, 0x4600204C); - loadSound(1, 0x408C0034); - loadSound(2, 0x44043000); - loadSound(3, 0x44045000); - SetMessageHandler(&SsScene2504Button::handleMessage); - SetUpdateHandler(&SsScene2504Button::update); -} - -void SsScene2504Button::update() { - updatePosition(); - if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) { - playSound(3); - setVisible(false); - _isSoundPlaying = false; - } - if (_countdown != 0 && (--_countdown) == 0) { - if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) - playSound(0); - else - playSound(1); - _isSoundPlaying = true; - } -} - -uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0 && !_isSoundPlaying) { - setVisible(true); - _countdown = 2; - if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) - setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0); - else - setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1); - playSound(2); - } - messageResult = 1; - break; - } - return messageResult; -} - -Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *ssButton; - - setBackground(0x90791B80); - setPalette(0x90791B80); - ssButton = insertSprite(); - addCollisionSprite(ssButton); - insertPuzzleMouse(0x91B8490F, 20, 620); - SetMessageHandler(&Scene2504::handleMessage); - SetUpdateHandler(&Scene::update); -} - -uint32 Scene2504::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene(0); - break; - } - return messageResult; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2500.h b/engines/neverhood/module2500.h deleted file mode 100644 index 10301b089d..0000000000 --- a/engines/neverhood/module2500.h +++ /dev/null @@ -1,101 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2500_H -#define NEVERHOOD_MODULE2500_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1000.h" -#include "neverhood/module1600.h" -#include "neverhood/module2700.h" - -namespace Neverhood { - -// Module2500 - -class Module2500 : public Module { -public: - Module2500(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2500(); -protected: - int _sceneNum; - int _soundIndex; - void createScene(int sceneNum, int which); - void updateScene(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); -}; - -class Scene2501 : public Scene { -public: - Scene2501(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene2501(); -protected: - AsCommonCar *_asCar; - Sprite *_ssTrackShadowBackground; - Sprite *_asCarShadow; - Sprite *_asCarConnectorShadow; - Sprite *_asCarTrackShadow; - Sprite *_asIdleCarLower; - Sprite *_asIdleCarFull; - Klaymen *_kmScene2501; - Tracks _tracks; - NPointArray *_trackPoints; - int _currTrackIndex; - NPoint _clickPoint; - int _newTrackIndex; - int _carStatus; - bool _klaymenInCar; - void update(); - void upCarAtHome(); - void upGettingOutOfCar(); - void upRidingCar(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); - void moveCarToPoint(NPoint &pt); - void changeTrack(); - void updateKlaymenClipRect(); -}; - -class SsScene2504Button : public StaticSprite { -public: - SsScene2504Button(NeverhoodEngine *vm); -protected: - int _countdown; - bool _isSoundPlaying; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2504 : public Scene { -public: - Scene2504(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2500_H */ diff --git a/engines/neverhood/module2600.cpp b/engines/neverhood/module2600.cpp deleted file mode 100644 index 04a91475a1..0000000000 --- a/engines/neverhood/module2600.cpp +++ /dev/null @@ -1,348 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2600.h" - -namespace Neverhood { - -static const uint32 kModule2600SoundList[] = { - 0xB288D450, - 0x90804450, - 0x99801500, - 0xB288D455, - 0x93825040, - 0 -}; - -Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - if (which < 0) - createScene(_vm->gameState().sceneNum, -1); - else if (which == 1) - createScene(4, 1); - else - createScene(0, 1); - - _vm->_soundMan->addSoundList(0x40271018, kModule2600SoundList); - _vm->_soundMan->setSoundListParams(kModule2600SoundList, true, 50, 600, 5, 150); - _vm->_soundMan->playTwoSounds(0x40271018, 0x41861371, 0x43A2507F, 0); - -} - -Module2600::~Module2600() { - _vm->_soundMan->deleteGroup(0x40271018); -} - -void Module2600::createScene(int sceneNum, int which) { - debug("Module2600::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - createNavigationScene(0x004B8608, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - createNavigationScene(0x004B8638, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - createNavigationScene(0x004B86C8, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - if (getGlobalVar(V_CREATURE_ANGRY)) - createNavigationScene(0x004B8758, which); - else - createNavigationScene(0x004B86F8, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - createNavigationScene(0x004B87B8, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - createNavigationScene(0x004B8698, which); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->_soundMan->deleteGroup(0x40271018); - createSmackerScene(0x30090001, true, true, false); - break; - case 8: - _vm->gameState().sceneNum = 8; - _childObject = new Scene2609(_vm, this, which); - break; - case 1002: - _vm->gameState().sceneNum = 2; - if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) - createSmackerScene(0x018C0404, true, true, false); - else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) - createSmackerScene(0x018C0407, true, true, false); - else - createSmackerScene(0x818C0405, true, true, false); - if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) - setGlobalVar(V_FRUIT_COUNTING_INDEX, 0); - else - incGlobalVar(V_FRUIT_COUNTING_INDEX, +1); - break; - case 1003: - _vm->gameState().sceneNum = 3; - createSmackerScene(0x001C0007, true, true, false); - break; - case 1006: - _vm->gameState().sceneNum = 6; - if (getGlobalVar(V_WATER_RUNNING)) - createSmackerScene(0x049A1181, true, true, false); - else - createSmackerScene(0x04981181, true, true, false); - break; - case 1008: - _vm->gameState().sceneNum = 8; - if (getGlobalVar(V_WATER_RUNNING)) - createSmackerScene(0x42B80941, true, true, false); - else - createSmackerScene(0x42980941, true, true, false); - break; - case 9999: - createDemoScene(); - break; - } - SetUpdateHandler(&Module2600::updateScene); - _childObject->handleUpdate(); -} - -void Module2600::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == 1) - createScene(1, 3); - else - leaveModule(0); - break; - case 1: - if (_moduleResult == 0) - createScene(6, 0); - else if (_moduleResult == 1) - createScene(0, 0); - else if (_moduleResult == 2) - createScene(2, 1); - else if (_moduleResult == 3) - createScene(3, 0); - break; - case 2: - if (_moduleResult == 0) - createScene(1, 0); - else if (_moduleResult == 1) { - if (_vm->isDemo()) - createScene(9999, -1); - else - createScene(1002, -1); - } - break; - case 3: - if (_moduleResult == 0) { - if (getGlobalVar(V_CREATURE_ANGRY)) - createScene(4, 0); - else - createScene(1003, -1); - } else if (_moduleResult == 2) - createScene(1, 1); - else if (_moduleResult == 3) { - if (getGlobalVar(V_CREATURE_ANGRY)) - createScene(4, 0); - else { - setGlobalVar(V_CREATURE_ANGRY, 1); - createScene(7, -1); - } - } - break; - case 4: - if (_moduleResult == 0) - leaveModule(1); - else - createScene(3, 1); - break; - case 6: - if (_moduleResult == 0) { - if (_vm->isDemo()) - createScene(9999, -1); - else - createScene(1006, -1); - } - else if (_moduleResult == 1) - createScene(1, 2); - break; - case 7: - leaveModule(0); - break; - case 8: - createScene(1008, -1); - break; - case 1002: - createScene(2, 1); - break; - case 1003: - createScene(3, 0); - break; - case 1006: - createScene(8, -1); - break; - case 1008: - createScene(6, 0); - break; - case 9999: - createScene(_vm->gameState().sceneNum, -1); - break; - } - } -} - -SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) - : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { - - SetUpdateHandler(&SsScene2609Button::update); - SetMessageHandler(&SsScene2609Button::handleMessage); - - loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - if (!getGlobalVar(V_WATER_RUNNING)) - setVisible(false); - loadSound(0, 0x10267160); - loadSound(1, 0x7027FD64); - loadSound(2, 0x44043000); - loadSound(3, 0x44045000); -} - -void SsScene2609Button::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) { - if (getGlobalVar(V_WATER_RUNNING)) { - setGlobalVar(V_WATER_RUNNING, 0); - sendMessage(_parentScene, 0x2001, 0); - } else { - setGlobalVar(V_WATER_RUNNING, 1); - sendMessage(_parentScene, 0x2002, 0); - } - } -} - -uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0) { - sendMessage(_parentScene, 0x2000, 0); - if (getGlobalVar(V_WATER_RUNNING)) { - setVisible(false); - playSound(3); - playSound(1); - _countdown = 12; - } else { - setVisible(true); - playSound(2); - playSound(0); - _countdown = 96; - } - } - messageResult = 1; - break; - } - return messageResult; -} - -AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1000) { - - _x = 240; - _y = 420; - setDoDeltaX(1); - createSurface1(0x9C210C90, 1200); - setClipRect(260, 260, 400, 368); - _vm->_soundMan->addSound(0x08526C36, 0xDC2769B0); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2609Water::handleMessage); - if (getGlobalVar(V_WATER_RUNNING)) - sendMessage(this, 0x2002, 0); -} - -AsScene2609Water::~AsScene2609Water() { - _vm->_soundMan->deleteSoundGroup(0x08526C36); -} - -uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2001: - stopAnimation(); - setVisible(false); - _vm->_soundMan->stopSound(0xDC2769B0); - break; - case 0x2002: - startAnimation(0x9C210C90, 0, -1); - setVisible(true); - _vm->_soundMan->playSoundLooping(0xDC2769B0); - break; - } - return messageResult; -} - -Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isBusy(false) { - - SetUpdateHandler(&Scene::update); - SetMessageHandler(&Scene2609::handleMessage); - - setBackground(0x51409A16); - setPalette(0x51409A16); - _asWater = insertSprite(); - _ssButton = insertSprite(this); - addCollisionSprite(_ssButton); - insertPuzzleMouse(0x09A1251C, 20, 620); - insertStaticSprite(0x02138002, 1200); - insertStaticSprite(0x825E2827, 1200); -} - -uint32 Scene2609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isBusy) - leaveScene(0); - break; - case 0x2000: - _isBusy = true; - break; - case 0x2001: - _isBusy = false; - sendMessage(_asWater, 0x2001, 0); - break; - case 0x2002: - _isBusy = false; - sendMessage(_asWater, 0x2002, 0); - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2600.h b/engines/neverhood/module2600.h deleted file mode 100644 index 8f2f3779fe..0000000000 --- a/engines/neverhood/module2600.h +++ /dev/null @@ -1,74 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2600_H -#define NEVERHOOD_MODULE2600_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module2600 - -class Module2600 : public Module { -public: - Module2600(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2600(); -protected: - int _sceneNum; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -class SsScene2609Button : public StaticSprite { -public: - SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2609Water : public AnimatedSprite { -public: - AsScene2609Water(NeverhoodEngine *vm); - virtual ~AsScene2609Water(); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2609 : public Scene { -public: - Scene2609(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - bool _isBusy; - Sprite *_asWater; - Sprite *_ssButton; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2600_H */ diff --git a/engines/neverhood/module2700.cpp b/engines/neverhood/module2700.cpp deleted file mode 100644 index 53e73af179..0000000000 --- a/engines/neverhood/module2700.cpp +++ /dev/null @@ -1,1211 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2700.h" -#include "neverhood/gamemodule.h" -#include "neverhood/module1000.h" - -namespace Neverhood { - -static const NRect kScene2710ClipRect = NRect(0, 0, 626, 480); - -static const uint32 kScene2710StaticSprites[] = { - 0x0D2016C0, - 0 -}; - -static const NRect kScene2711ClipRect = NRect(0, 0, 521, 480); - -static const uint32 kScene2711FileHashes1[] = { - 0, - 0x100801A1, - 0x201081A0, - 0x006800A4, - 0x40390120, - 0x000001B1, - 0x001000A1, - 0 -}; - -static const uint32 kScene2711FileHashes2[] = { - 0, - 0x40403308, - 0x71403168, - 0x80423928, - 0x224131A8, - 0x50401328, - 0x70423328, - 0 -}; - -static const uint32 kScene2711FileHashes3[] = { - 0, - 0x1088A021, - 0x108120E5, - 0x18A02321, - 0x148221A9, - 0x10082061, - 0x188820E1, - 0 -}; - -static const NRect kScene2724ClipRect = NRect(0, 141, 640, 480); - -static const uint32 kScene2724StaticSprites[] = { - 0xC20D00A5, - 0 -}; - -static const NRect kScene2725ClipRect = NRect(0, 0, 640, 413); - -static const uint32 kScene2725StaticSprites[] = { - 0xC20E00A5, - 0 -}; - -Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundIndex(0), _raidoMusicInitialized(false) { - - _vm->_soundMan->addMusic(0x42212411, 0x04020210); - _vm->_soundMan->startMusic(0x04020210, 24, 2); - SetMessageHandler(&Module2700::handleMessage); - - if (which < 0) { - which = _vm->gameState().which; - // Scenes 0, 30 and 31 are "normal" scenes, whereas the other scenes are tracks. - // "gameState().which" indicates which track the car is at. - if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31) - which = -1; - createScene(_vm->gameState().sceneNum, which); - } else - createScene(0, 0); - - loadSound(0, 0x00880CCC); - loadSound(1, 0x00880CC0); - loadSound(2, 0x00880CCC); - loadSound(3, 0x00880CC0); - -} - -Module2700::~Module2700() { - _vm->_soundMan->deleteGroup(0x42212411); -} - -void Module2700::createScene(int sceneNum, int which) { - debug("Module2700::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->gameState().which = which; - _childObject = new Scene2701(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->gameState().which = which; - _childObject = new Scene2702(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->gameState().which = which; - if (which == 6 || which == 7) - createScene2703(which, 0x004B1710); - else if (which == 4 || which == 5) - createScene2703(which, 0x004B1738); - else if (which == 2 || which == 3) - createScene2703(which, 0x004B1760); - else - createScene2703(which, 0x004B1788); - break; - case 3: - _vm->gameState().sceneNum = 3; - _vm->gameState().which = which; - createScene2704(which, 0x004B17B0, 150); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->gameState().which = which; - createScene2704(which, 0x004B17D8, 150); - break; - case 5: - _vm->gameState().sceneNum = 5; - _vm->gameState().which = which; - if (which >= 4) - _childObject = new Scene2706(_vm, this, which); - else if (which == 2 || which == 3) - createScene2704(which, 0x004B1828, 150); - else - createScene2704(which, 0x004B1800, 150); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->gameState().which = which; - createScene2704(which, 0x004B1850, 150); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->gameState().which = which; - if (which == 2 || which == 3) - createScene2704(which, 0x004B1878, 150); - else - createScene2704(which, 0x004B18A0, 150); - break; - case 8: - _vm->gameState().sceneNum = 8; - _vm->gameState().which = which; - if (which == 2 || which == 3) - createScene2704(which, 0x004B18C8, 150); - else - createScene2704(which, 0x004B18F0, 150); - break; - case 9: - _vm->gameState().sceneNum = 9; - _vm->gameState().which = which; - createScene2704(which, 0x004B1918, 150, kScene2710StaticSprites, &kScene2710ClipRect); - break; - case 10: - _vm->gameState().sceneNum = 10; - _vm->gameState().which = which; - _vm->gameModule()->initTestTubes2Puzzle(); - _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)]; - _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)]; - _scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0)]; - _scene2711StaticSprites[3] = 0x0261282E; - _scene2711StaticSprites[4] = 0x9608E5A0; - _scene2711StaticSprites[5] = 0; - createScene2704(which, 0x004B1950, 150, _scene2711StaticSprites, &kScene2711ClipRect); - break; - case 11: - _vm->gameState().sceneNum = 11; - _vm->gameState().which = which; - createScene2704(which, 0x004B19E0, 150); - break; - case 12: - _vm->gameState().sceneNum = 12; - _vm->gameState().which = which; - createScene2704(which, 0x004B1A08, 150); - break; - case 13: - _vm->gameState().sceneNum = 13; - _vm->gameState().which = which; - createScene2704(which, 0x004B1A30, 150); - break; - case 14: - _vm->gameState().sceneNum = 14; - _vm->gameState().which = which; - if (which == 4 || which == 5) - createScene2704(which, 0x004B1A58, 150); - else if (which == 2 || which == 3) - createScene2704(which, 0x004B1A80, 150); - else - createScene2704(which, 0x004B1AA8, 150); - break; - case 15: - _vm->gameState().sceneNum = 15; - _vm->gameState().which = which; - if (which == 4 || which == 5) - createScene2704(which, 0x004B1AD0, 150); - else if (which == 2 || which == 3) - createScene2704(which, 0x004B1AF8, 150); - else - createScene2704(which, 0x004B1B20, 150); - break; - case 16: - _vm->gameState().sceneNum = 16; - _vm->gameState().which = which; - if (which == 4 || which == 5) - createScene2704(which, 0x004B1B48, 150); - else if (which == 2 || which == 3) - createScene2704(which, 0x004B1B70, 150); - else - createScene2704(which, 0x004B1B98, 150); - break; - case 17: - _vm->gameState().sceneNum = 17; - _vm->gameState().which = which; - if (which == 4 || which == 5) - createScene2704(which, 0x004B1BC0, 150); - else if (which == 2 || which == 3) - createScene2704(which, 0x004B1BE8, 150); - else - createScene2704(which, 0x004B1C10, 150); - break; - case 18: - _vm->gameState().sceneNum = 18; - _vm->gameState().which = which; - if (which == 2 || which == 3) - createScene2704(which, 0x004B1C38, 150); - else - createScene2704(which, 0x004B1C60, 150); - break; - case 19: - _vm->gameState().sceneNum = 19; - _vm->gameState().which = which; - if (which == 2 || which == 3) - createScene2704(which, 0x004B1CB0, 150); - else - createScene2704(which, 0x004B1C88, 150); - break; - case 20: - _vm->gameState().sceneNum = 20; - _vm->gameState().which = which; - if (which == 2 || which == 3) - createScene2704(which, 0x004B1CD8, 150); - else - createScene2704(which, 0x004B1D00, 150); - break; - case 21: - _vm->gameState().sceneNum = 21; - _vm->gameState().which = which; - createScene2704(which, 0x004B1D28, 150); - break; - case 22: - _vm->gameState().sceneNum = 22; - _vm->gameState().which = which; - createScene2704(which, 0x004B1D50, 150); - break; - case 23: - _vm->gameState().sceneNum = 23; - _vm->gameState().which = which; - createScene2704(which, 0x004B1D78, 150, kScene2724StaticSprites, &kScene2724ClipRect); - break; - case 24: - _vm->gameState().sceneNum = 24; - _vm->gameState().which = which; - createScene2704(which, 0x004B1DB0, 150, kScene2725StaticSprites, &kScene2725ClipRect); - break; - case 25: - _vm->gameState().sceneNum = 25; - _vm->gameState().which = which; - createScene2704(which, 0x004B1DE8, 150); - break; - case 26: - _vm->gameState().sceneNum = 26; - _vm->gameState().which = which; - createScene2704(which, 0x004B1E10, 150); - break; - case 27: - _vm->gameState().sceneNum = 27; - _vm->gameState().which = which; - createScene2704(which, 0x004B1E38, 150); - break; - case 28: - _vm->gameState().sceneNum = 28; - _vm->gameState().which = which; - createScene2704(which, 0x004B1E60, 150); - break; - case 30: - _vm->gameState().sceneNum = 30; - createStaticScene(0x09507248, 0x0724C09D); - break; - case 31: - _vm->gameState().sceneNum = 31; - _childObject = new Scene2732(_vm, this); - break; - } - SetUpdateHandler(&Module2700::updateScene); - _childObject->handleUpdate(); -} - -#define SceneLinkIf(moduleResult, sceneNum, which) \ - if (_moduleResult == moduleResult) { createScene(sceneNum, which); break; } - -void Module2700::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - SceneLinkIf(1, 1, 0); - leaveModule(0); - break; - case 1: - SceneLinkIf(1, 14, 1); - SceneLinkIf(2, 2, 2); - SceneLinkIf(3, 14, 3); - SceneLinkIf(4, 2, 6); - SceneLinkIf(5, 2, 4); - createScene(0, 1); - break; - case 2: - SceneLinkIf(1, 5, 0); - SceneLinkIf(2, 1, 2); - SceneLinkIf(3, 5, 2); - SceneLinkIf(4, 1, 5); - SceneLinkIf(5, 5, 4); - SceneLinkIf(6, 1, 4); - SceneLinkIf(7, 11, 0); - createScene(3, 0); - break; - case 3: - createScene(2, 0); - break; - case 4: - SceneLinkIf(1, 7, 2); - createScene(5, 5); - break; - case 5: - SceneLinkIf(1, 6, 0); - SceneLinkIf(2, 2, 3); - SceneLinkIf(3, 8, 2); - SceneLinkIf(4, 2, 5); - SceneLinkIf(5, 4, 0); - SceneLinkIf(6, 7, 0); - createScene(2, 1); - break; - case 6: - SceneLinkIf(1, 8, 0); - createScene(5, 1); - break; - case 7: - SceneLinkIf(1, 8, 3); - SceneLinkIf(2, 4, 1); - SceneLinkIf(3, 9, 0); - createScene(5, 6); - break; - case 8: - SceneLinkIf(1, 10, 0); - SceneLinkIf(2, 5, 3); - SceneLinkIf(3, 7, 1); - createScene(6, 1); - break; - case 9: - SceneLinkIf(1, 10, 1); - createScene(7, 3); - break; - case 10: - SceneLinkIf(1, 9, 1); - createScene(8, 1); - break; - case 11: - SceneLinkIf(1, 12, 0); - createScene(2, 7); - break; - case 12: - SceneLinkIf(1, 13, 0); - createScene(11, 1); - break; - case 13: - SceneLinkIf(1, 30, 0); - createScene(12, 1); - break; - case 14: - SceneLinkIf(1, 1, 1); - SceneLinkIf(2, 15, 3); - SceneLinkIf(3, 1, 3); - SceneLinkIf(4, 15, 5); - SceneLinkIf(5, 22, 0); - createScene(15, 1); - break; - case 15: - SceneLinkIf(1, 14, 0); - SceneLinkIf(2, 16, 3); - SceneLinkIf(3, 14, 2); - SceneLinkIf(4, 16, 5); - SceneLinkIf(5, 14, 4); - createScene(16, 1); - break; - case 16: - SceneLinkIf(1, 15, 0); - SceneLinkIf(2, 17, 3); - SceneLinkIf(3, 15, 2); - SceneLinkIf(4, 17, 5); - SceneLinkIf(5, 15, 4); - createScene(17, 1); - break; - case 17: - SceneLinkIf(1, 16, 0); - SceneLinkIf(2, 18, 3); - SceneLinkIf(3, 16, 2); - SceneLinkIf(4, 20, 1); - SceneLinkIf(5, 16, 4); - createScene(18, 1); - break; - case 18: - SceneLinkIf(1, 17, 0); - SceneLinkIf(2, 19, 2); - SceneLinkIf(3, 17, 2); - createScene(19, 0); - break; - case 19: - SceneLinkIf(1, 20, 2); - SceneLinkIf(2, 18, 2); - SceneLinkIf(3, 20, 0); - createScene(18, 0); - break; - case 20: - SceneLinkIf(1, 17, 4); - SceneLinkIf(2, 19, 1); - SceneLinkIf(3, 21, 0); - createScene(19, 3); - break; - case 21: - _vm->_soundMan->deleteMusic(_musicFileHash); - _vm->_soundMan->startMusic(0x04020210, 0, 2); - _vm->_soundMan->deleteSoundGroup(0x42212411); - createScene(20, 3); - break; - case 22: - SceneLinkIf(1, 23, 0); - createScene(14, 5); - break; - case 23: - SceneLinkIf(1, 24, 0); - createScene(22, 1); - break; - case 24: - SceneLinkIf(1, 25, 0); - createScene(23, 1); - break; - case 25: - SceneLinkIf(1, 26, 0); - createScene(24, 1); - break; - case 26: - SceneLinkIf(1, 27, 0); - createScene(25, 1); - break; - case 27: - SceneLinkIf(1, 28, 0); - createScene(26, 1); - break; - case 28: - SceneLinkIf(1, 31, 0); - createScene(27, 1); - break; - case 30: - createScene(13, 1); - break; - case 31: - createScene(28, 1); - break; - } - } else { - switch (_sceneNum) { - case 21: - if (!_raidoMusicInitialized) { - _vm->_soundMan->stopMusic(0x04020210, 0, 1); - _vm->gameModule()->initRadioPuzzle(); - _musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME); - _vm->_soundMan->addMusic(0x42212411, _musicFileHash); - _vm->_soundMan->startMusic(_musicFileHash, 0, 2); - _vm->_soundMan->addSound(0x42212411, 0x44014282); - _vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0); - _raidoMusicInitialized = true; - } - break; - } - } -} - -uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Module::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x200D: - playSound(_soundIndex); - _soundIndex++; - if (_soundIndex >= 4) - _soundIndex = 0; - break; - } - return messageResult; -} - -void Module2700::createScene2703(int which, uint32 trackInfoId) { - _childObject = new Scene2703(_vm, this, which, trackInfoId); -} - -void Module2700::createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { - _childObject = new Scene2704(_vm, this, which, trackInfoId, value, staticSprites, clipRect); -} - -static const NPoint kCarShadowOffsets[] = { - {-63, 3}, {-48, 40}, {-33, 58}, - { 0, 65}, { 40, 53}, { 56, 27}, - { 63, 0}, {-30, 26}, { 0, 30}, - { 26, 25} -}; - -SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash) - : StaticSprite(vm, 0) { - - loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 0); -} - -AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index) - : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) { - - SetUpdateHandler(&AsCommonCarShadow::update); - createShadowSurface(shadowSurface, 211, 147, 100); - updateShadow(); -} - -void AsCommonCarShadow::update() { - updateShadow(); - AnimatedSprite::update(); -} - -void AsCommonCarShadow::updateShadow() { - if (_asCar->getFrameIndex() != _currFrameIndex || _asCar->getCurrAnimFileHash() != _animFileHash) { - uint32 fileHash = _asCar->getCurrAnimFileHash(); - if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 || - fileHash == 0x9966B138 || fileHash == 0xB579A77C || fileHash == 0xA86A9538 || - fileHash == 0xD4220027 || fileHash == 0xD00A1364 || fileHash == 0xD4AA03A4 || - fileHash == 0xF46A0324) { - startAnimation(fileHash, _asCar->getFrameIndex(), -1); - _newStickFrameIndex = _asCar->getFrameIndex(); - } - _animFileHash = fileHash; - } - _x = _asCar->getX() + kCarShadowOffsets[_index].x; - _y = _asCar->getY() + kCarShadowOffsets[_index].y; - if (!_asCar->getVisible()) { - startAnimation(0x1209E09F, 0, -1); - _newStickFrameIndex = 0; - } - setDoDeltaX(_asCar->isDoDeltaX() ? 1 : 0); -} - -AsCommonCarConnectorShadow::AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index) - : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index) { - - SetUpdateHandler(&AsCommonCarConnectorShadow::update); - createShadowSurface1(shadowSurface, 0x60281C10, 150); - startAnimation(0x60281C10, -1, -1); - _newStickFrameIndex = STICK_LAST_FRAME; -} - -void AsCommonCarConnectorShadow::update() { - _x = _asCar->getX() + kCarShadowOffsets[_index].x; - _y = _asCar->getY() + kCarShadowOffsets[_index].y; - AnimatedSprite::update(); -} - -AsCommonCarTrackShadow::AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex) - : AnimatedSprite(vm, 1100), _asCar(asCar) { - - SetUpdateHandler(&AsCommonCarTrackShadow::update); - createShadowSurface1(shadowSurface, 0x0759129C, 100); - startAnimation(0x0759129C, frameIndex, -1); - _newStickFrameIndex = frameIndex; -} - -void AsCommonCarTrackShadow::update() { - _x = _asCar->getX(); - _y = _asCar->getY(); - AnimatedSprite::update(); -} - -Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - NRect clipRect; - TrackInfo *tracks = _vm->_staticData->getTrackInfo(0x004B2240); - setGlobalVar(V_CAR_DELTA_X, 1); - - setBackground(tracks->bgFilename); - setPalette(tracks->bgFilename); - _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); - insertScreenMouse(0x08B08180); - - tempSprite = insertStaticSprite(0x1E086325, 1200); - clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); - - if (tracks->bgShadowFilename) { - _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); - addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); - _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - } else { - _ssTrackShadowBackground = NULL; - _asCar = insertSprite(this, 320, 240); - } - - _asCarConnector = insertSprite(_asCar); - _which1 = tracks->which1; - _which2 = tracks->which2; - _dataResource.load(tracks->dataResourceFilename); - _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); - _asCar->setPathPoints(_trackPoints); - - if (which == _which2) { - NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_asCar, 0x2007, 150); - } else { - NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_asCar, 0x2002, 0); - if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) - sendMessage(_asCar, 0x2008, 150); - } - - _asCar->setClipRect(clipRect); - _asCarConnector->setClipRect(clipRect); - - if (which == 1) { - SetMessageHandler(&Scene2701::hmRidingCar); - } else { - sendMessage(_asCar, 0x2009, 0); - SetMessageHandler(&Scene2701::hmCarAtHome); - } - -} - -uint32 Scene2701::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - sendPointMessage(_asCar, 0x2004, param.asPoint()); - break; - case 0x2005: - if (_which1 >= 0) - SetMessageHandler(&Scene2701::hmCarAtHome); - break; - case 0x2006: - if (_which2 >= 0) - leaveScene(_which2); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x >= 385) - leaveScene(0); - else { - sendPointMessage(_asCar, 0x2004, param.asPoint()); - SetMessageHandler(&Scene2701::hmRidingCar); - } - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1) { - - SetMessageHandler(&Scene2702::handleMessage); - SetUpdateHandler(&Scene2702::update); - - setBackground(0x18808B00); - setPalette(0x18808B00); - _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); - addEntity(_palette); - insertScreenMouse(0x08B04180); - - _ssTrackShadowBackground = createSprite(0x12002035); - addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); - _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - insertSprite(_asCar); - _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _dataResource.load(0x04310014); - - if (which == 1) { - _isUpperTrack = false; - _currTrackIndex = 1; - } else if (which == 2) { - _isUpperTrack = false; - _currTrackIndex = 2; - _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _isInLight = false; - } else if (which == 3) { - _isUpperTrack = true; - _currTrackIndex = 0; - } else if (which == 4) { - _isUpperTrack = true; - _currTrackIndex = 2; - _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _isInLight = false; - } else if (which == 5) { - _isUpperTrack = true; - _currTrackIndex = 1; - _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _isInLight = false; - } else { - _isUpperTrack = false; - _currTrackIndex = 0; - } - - if (_isUpperTrack) { - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F68)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F8C)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FB0)); - } else { - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FD8)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FFC)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B6020)); - } - - _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); - _asCar->setPathPoints(_trackPoints); - - if (which == _tracks[_currTrackIndex]->which2) { - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - sendMessage(_asCar, 0x2007, 150); - } else { - sendMessage(_asCar, 0x2002, 0); - sendMessage(_asCar, 0x2008, 150); - } - - _palette->copyBasePalette(0, 256, 0); - -} - -void Scene2702::update() { - Scene::update(); - if (_isInLight && _asCar->getX() > 422) { - _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); - _palette->startFadeToPalette(12); - _isInLight = false; - } else if (!_isInLight && _asCar->getX() <= 422) { - _palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65); - _palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0); - _palette->startFadeToPalette(12); - _isInLight = true; - } -} - -uint32 Scene2702::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - moveCarToPoint(param.asPoint()); - break; - case 0x2005: - if (_newTrackIndex >= 0) { - if (_tracks[_currTrackIndex]->which1 < 0) - changeTrack(); - } else if (_tracks[_currTrackIndex]->which1 >= 0) - leaveScene(_tracks[_currTrackIndex]->which1); - break; - case 0x2006: - if (_newTrackIndex >= 0) { - if (_tracks[_currTrackIndex]->which2 < 0) - changeTrack(); - } else if (_tracks[_currTrackIndex]->which2 >= 0) - leaveScene(_tracks[_currTrackIndex]->which2); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -void Scene2702::moveCarToPoint(NPoint pt) { - int minMatchTrackIndex, minMatchDistance; - _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); - if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { - _newTrackIndex = minMatchTrackIndex; - _newTrackDestX = pt.x; - if (_isUpperTrack) { - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2003, 0); - } else if (_currTrackIndex == 2) - sendMessage(_asCar, 0x2003, 0); - else - sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); - } else { - _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt.x); - } -} - -void Scene2702::changeTrack() { - _currTrackIndex = _newTrackIndex; - _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); - _asCar->setPathPoints(_trackPoints); - if (_isUpperTrack) { - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2002, 0); - } else if (_currTrackIndex == 2) - sendMessage(_asCar, 0x2002, 0); - else - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - sendMessage(_asCar, 0x2004, _newTrackDestX); - _newTrackIndex = -1; -} - -Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId) - : Scene(vm, parentModule) { - - TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId); - - SetMessageHandler(&Scene2703::handleMessage); - SetUpdateHandler(&Scene2703::update); - - setBackground(tracks->bgFilename); - setPalette(tracks->bgFilename); - _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - addEntity(_palette); - insertScreenMouse(tracks->mouseCursorFilename); - - _palStatus = 2; - - if (tracks->bgShadowFilename) { - _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); - addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); - _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - } else { - _ssTrackShadowBackground = NULL; - _asCarShadow = NULL; - _asCar = insertSprite(this, 320, 240); - } - - _asCarConnector = insertSprite(_asCar); - _which1 = tracks->which1; - _which2 = tracks->which2; - _dataResource.load(tracks->dataResourceFilename); - _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); - _asCar->setPathPoints(_trackPoints); - - if (which == _which2) { - NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) - sendMessage(_asCar, 0x2009, 0); - else - sendMessage(_asCar, 0x2007, 150); - } else { - NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_asCar, 0x2002, 0); - if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) - sendMessage(_asCar, 0x2009, 0); - else - sendMessage(_asCar, 0x2008, 150); - } - - if (which == 0) { - _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - _palStatus = 1; - } else if (which == 2 || which == 4 || which == 6) { - _palette->addPalette(calcHash("paPodBlack"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayBlack"), 0, 65, 0); - _palStatus = 0; - } - - _palette->copyBasePalette(0, 256, 0); - -} - -void Scene2703::update() { - Scene::update(); - if (_mouseClicked) { - sendPointMessage(_asCar, 0x2004, _mouseClickPos); - _mouseClicked = false; - } - if (_asCar->getX() > 469) { - if (_palStatus != 2) { - _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); - _palette->startFadeToPalette(12); - _palStatus = 2; - } - } else if (_asCar->getX() > 181) { - if (_palStatus != 1) { - _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); - _palette->startFadeToPalette(12); - _palStatus = 1; - } - } else if (_palStatus != 0) { - _palette->addBasePalette(calcHash("paPodBlack"), 65, 31, 65); - _palette->addBasePalette(calcHash("paKlayBlack"), 0, 65, 0); - _palette->startFadeToPalette(12); - _palStatus = 0; - } -} - -uint32 Scene2703::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2005: - if (_which1 >= 0) - leaveScene(_which1); - break; - case 0x2006: - if (_which2 >= 0) - leaveScene(_which2); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value, - const uint32 *staticSprites, const NRect *clipRect) - : Scene(vm, parentModule) { - - TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId); - - SetMessageHandler(&Scene2704::handleMessage); - SetUpdateHandler(&Scene2704::update); - - setBackground(tracks->bgFilename); - setPalette(tracks->bgFilename); - - if (tracks->exPaletteFilename1) - _palette->addPalette(tracks->exPaletteFilename1, 0, 65, 0); - - if (tracks->exPaletteFilename2) - _palette->addPalette(tracks->exPaletteFilename2, 65, 31, 65); - - while (staticSprites && *staticSprites) - insertStaticSprite(*staticSprites++, 1100); - - insertScreenMouse(tracks->mouseCursorFilename); - - if (tracks->bgShadowFilename) { - _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); - addEntity(_ssTrackShadowBackground); - _asCar = insertSprite(this, 320, 240); - _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - } else { - _ssTrackShadowBackground = NULL; - _asCarShadow = NULL; - _asCar = insertSprite(this, 320, 240); - } - - _asCarConnector = insertSprite(_asCar); - _which1 = tracks->which1; - _which2 = tracks->which2; - _dataResource.load(tracks->dataResourceFilename); - _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); - _asCar->setPathPoints(_trackPoints); - - if (which == _which2) { - NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) - sendMessage(_asCar, 0x2009, 0); - else - sendMessage(_asCar, 0x2007, 0); - } else { - NPoint testPoint = (*_trackPoints)[0]; - sendMessage(_asCar, 0x2002, 0); - if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) - sendMessage(_asCar, 0x2009, 0); - else - sendMessage(_asCar, 0x2008, 0); - } - - if (clipRect) { - _asCar->getClipRect() = *clipRect; - if (_asCarShadow) - _asCarShadow->getClipRect() = *clipRect; - if (_asCarTrackShadow) - _asCarTrackShadow->getClipRect() = *clipRect; - if (_asCarConnectorShadow) - _asCarConnectorShadow->getClipRect() = *clipRect; - if (_asCarConnector) - _asCarConnector->getClipRect() = *clipRect; - } - -} - -void Scene2704::update() { - Scene::update(); - if (_mouseClicked) { - sendPointMessage(_asCar, 0x2004, _mouseClickPos); - _mouseClicked = false; - } -} - -uint32 Scene2704::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2005: - if (_which1 >= 0) - leaveScene(_which1); - break; - case 0x2006: - if (_which2 >= 0) - leaveScene(_which2); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _newTrackIndex(-1) { - - SetMessageHandler(&Scene2706::handleMessage); - - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22A0)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22C4)); - _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22E8)); - - setBackground(0x18808B88); - setPalette(0x18808B88); - - _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); - _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); - - insertScreenMouse(0x08B8C180); - - _ssTrackShadowBackground = createSprite(0x18808B88); - addEntity(_ssTrackShadowBackground); - - _asCar = insertSprite(this, 320, 240); - _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnector = insertSprite(_asCar); - _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); - - _dataResource.load(0x06000162); - - if (which == 5) - _currTrackIndex = 2; - else if (which == 6) - _currTrackIndex = 1; - else - _currTrackIndex = 0; - - _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); - _asCar->setPathPoints(_trackPoints); - - if (which == _tracks[_currTrackIndex]->which2) { - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - if (which == 5) - sendMessage(_asCar, 0x2007, 50); - else - sendMessage(_asCar, 0x2007, 150); - } else { - sendMessage(_asCar, 0x2002, 0); - if (which == 5) - sendMessage(_asCar, 0x2008, 50); - else - sendMessage(_asCar, 0x2008, 150); - } - -} - -uint32 Scene2706::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - moveCarToPoint(param.asPoint()); - break; - case 0x2005: - if (_newTrackIndex >= 0) { - if (_tracks[_currTrackIndex]->which1 < 0) - changeTrack(); - } else if (_tracks[_currTrackIndex]->which1 >= 0) - leaveScene(_tracks[_currTrackIndex]->which1); - break; - case 0x2006: - if (_newTrackIndex >= 0) { - if (_tracks[_currTrackIndex]->which2 < 0) - changeTrack(); - } else if (_tracks[_currTrackIndex]->which2 >= 0) - leaveScene(_tracks[_currTrackIndex]->which2); - break; - case 0x200D: - sendMessage(_parentModule, 0x200D, 0); - break; - } - return 0; -} - -void Scene2706::moveCarToPoint(NPoint pt) { - int minMatchTrackIndex, minMatchDistance; - _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); - if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { - _newTrackIndex = minMatchTrackIndex; - _newTrackDestX = pt.x; - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2003, 0); - } else { - _newTrackIndex = -1; - sendMessage(_asCar, 0x2004, pt.x); - } -} - -void Scene2706::changeTrack() { - _currTrackIndex = _newTrackIndex; - _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); - _asCar->setPathPoints(_trackPoints); - if (_currTrackIndex == 0) - sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); - else - sendMessage(_asCar, 0x2002, 0); - sendMessage(_asCar, 0x2004, _newTrackDestX); - _newTrackIndex = -1; -} - -Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - setBackground(0x0220C041); - setPalette(0x0220C041); - insertScreenMouse(0x0C04502A); - setRectList(0x004AE360); - - insertKlaymen(108, 331); - setMessageList(0x004AE328); - - tempSprite = insertStaticSprite(0x50C22C48, 1100); - _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); - -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2700.h b/engines/neverhood/module2700.h deleted file mode 100644 index 5861c2e4b5..0000000000 --- a/engines/neverhood/module2700.h +++ /dev/null @@ -1,182 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2700_H -#define NEVERHOOD_MODULE2700_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1600.h" - -namespace Neverhood { - -// Module2700 - -class Module2700 : public Module { -public: - Module2700(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2700(); -protected: - int _sceneNum; - int _soundIndex; - bool _raidoMusicInitialized; - uint32 _scene2711StaticSprites[6]; - uint32 _musicFileHash; - void createScene(int sceneNum, int which); - void updateScene(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void createScene2703(int which, uint32 trackInfoId); - void createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); -}; - -class SsCommonTrackShadowBackground : public StaticSprite { -public: - SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash); -}; - -class AsCommonCarShadow : public AnimatedSprite { -public: - AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index); -protected: - uint _index; - AnimatedSprite *_asCar; - uint32 _animFileHash; - void update(); - void updateShadow(); -}; - -class AsCommonCarConnectorShadow : public AnimatedSprite { -public: - AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index); -protected: - uint _index; - Sprite *_asCar; - void update(); -}; - -class AsCommonCarTrackShadow : public AnimatedSprite { -public: - AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex); -protected: - Sprite *_asCar; - void update(); -}; - -class Scene2701 : public Scene { -public: - Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - AsCommonCar *_asCar; - Sprite *_ssTrackShadowBackground; - Sprite *_asCarShadow; - Sprite *_asCarTrackShadow; - Sprite *_asCarConnectorShadow; - Sprite *_asCarConnector; - int _which1, _which2; - NPointArray *_trackPoints; - uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2702 : public Scene { -public: - Scene2702(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - AsCommonCar *_asCar; - Sprite *_ssTrackShadowBackground; - Sprite *_asCarShadow; - Sprite *_asCarTrackShadow; - Sprite *_asCarConnectorShadow; - int16 _newTrackDestX; - bool _isInLight; - int _currTrackIndex, _newTrackIndex; - bool _isUpperTrack; - Tracks _tracks; - NPointArray *_trackPoints; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void moveCarToPoint(NPoint pt); - void changeTrack(); -}; - -class Scene2703 : public Scene { -public: - Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId); -protected: - AsCommonCar *_asCar; - Sprite *_ssTrackShadowBackground; - Sprite *_asCarShadow; - Sprite *_asCarConnector; - Sprite *_asCarTrackShadow; - Sprite *_asCarConnectorShadow; - int _palStatus; - int _which1, _which2; - NPointArray *_trackPoints; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2704 : public Scene { -public: - Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value, - const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); -protected: - AsCommonCar *_asCar; - Sprite *_ssTrackShadowBackground; - Sprite *_asCarShadow; - Sprite *_asCarConnector; - Sprite *_asCarTrackShadow; - Sprite *_asCarConnectorShadow; - int _which1, _which2; - NPointArray *_trackPoints; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2706 : public Scene { -public: - Scene2706(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - AsCommonCar *_asCar; - Sprite *_ssTrackShadowBackground; - Sprite *_asCarShadow; - Sprite *_asCarConnector; - Sprite *_asCarTrackShadow; - Sprite *_asCarConnectorShadow; - int16 _newTrackDestX; - int _currTrackIndex, _newTrackIndex; - Tracks _tracks; - NPointArray *_trackPoints; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void moveCarToPoint(NPoint pt); - void changeTrack(); -}; - -class Scene2732 : public Scene { -public: - Scene2732(NeverhoodEngine *vm, Module *parentModule); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2700_H */ diff --git a/engines/neverhood/module2800.cpp b/engines/neverhood/module2800.cpp deleted file mode 100644 index d81445cf50..0000000000 --- a/engines/neverhood/module2800.cpp +++ /dev/null @@ -1,3205 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2800.h" -#include "neverhood/gamemodule.h" -#include "neverhood/module1000.h" -#include "neverhood/module1200.h" -#include "neverhood/module1700.h" -#include "neverhood/module2200.h" -#include "neverhood/diskplayerscene.h" - -namespace Neverhood { - -Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _musicResource(NULL) { - - _currentMusicFileHash = 0; - _vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14); - setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 1); - - if (which < 0) { - createScene(_vm->gameState().sceneNum, which); - } else if (which == 2) { - createScene(4, 3); - } else if (which == 1) { - createScene(4, 1); - } else { - createScene(0, 0); - } - -} - -Module2800::~Module2800() { - if (_musicResource) { - _musicResource->unload(); - delete _musicResource; - } - _vm->_soundMan->deleteGroup(0x64210814); -} - -void Module2800::createScene(int sceneNum, int which) { - debug("Module2800::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); - _childObject = new Scene2801(_vm, this, which); - break; - case 1: - _vm->gameState().sceneNum = 1; - _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); - if (getGlobalVar(V_RADIO_ENABLED)) - _childObject = new Scene2802(_vm, this, which); - else - createStaticScene(0x000C6444, 0xC6440008); - break; - case 2: - _vm->gameState().sceneNum = 2; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - if (getGlobalVar(V_KLAYMEN_SMALL)) - _childObject = new Scene2803Small(_vm, this, which); - else - _childObject = new Scene2803(_vm, this, which); - break; - case 3: - _vm->gameState().sceneNum = 3; - _childObject = new Scene2804(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 4; - _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2805(_vm, this, which); - break; - case 5: - _vm->gameState().sceneNum = 5; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2806(_vm, this, which); - break; - case 6: - _vm->gameState().sceneNum = 6; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2807(_vm, this, which); - break; - case 7: - _vm->gameState().sceneNum = 7; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2808(_vm, this, 0); - break; - case 8: - _vm->gameState().sceneNum = 8; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2809(_vm, this, which); - break; - case 9: - _vm->gameState().sceneNum = 9; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2810(_vm, this, which); - break; - case 10: - _vm->gameState().sceneNum = 10; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2808(_vm, this, 1); - break; - case 11: - _vm->gameState().sceneNum = 11; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2812(_vm, this, which); - break; - case 12: - _vm->gameState().sceneNum = 12; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x0000A245, 0x0A241008); - break; - case 13: - _vm->gameState().sceneNum = 13; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x81C60635, 0x60631814); - break; - case 14: - _vm->gameState().sceneNum = 14; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0xCA811204, 0x11200CA0); - break; - case 15: - _vm->gameState().sceneNum = 15; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x2D438A00, 0x38A042DC); - break; - case 16: - _vm->gameState().sceneNum = 16; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x0A806204, 0x062000A0); - break; - case 17: - _vm->gameState().sceneNum = 17; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x010F9284, 0xF9280018); - break; - case 18: - _vm->gameState().sceneNum = 18; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x0100022B, 0x0022F018); - break; - case 19: - _vm->gameState().sceneNum = 19; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x10866205, 0x66201100); - break; - case 20: - _vm->gameState().sceneNum = 20; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x01C58000, 0x58004014); - break; - case 21: - _vm->gameState().sceneNum = 21; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new Scene2822(_vm, this, which); - break; - case 22: - _vm->gameState().sceneNum = 22; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x9408121E, 0x8121A948); - break; - case 23: - _vm->gameState().sceneNum = 23; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x048C0600, 0xC0604040); - break; - case 24: - _vm->gameState().sceneNum = 24; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - createStaticScene(0x04270A94, 0x70A9004A); - break; - case 25: - _vm->gameState().sceneNum = 25; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) - createStaticScene(0x01600204, 0x0020001E); - else - createStaticScene(0x08611204, 0x1120008E); - break; - case 26: - _vm->gameState().sceneNum = 26; - _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); - _childObject = new DiskplayerScene(_vm, this, 4); - break; - case 1001: - _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); - createSmackerScene(0x00800801, true, true, false); - break; - } - SetUpdateHandler(&Module2800::updateScene); - _childObject->handleUpdate(); -} - -void Module2800::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult != 2) { - if (_musicResource) { - _musicResource->unload(); - delete _musicResource; - _musicResource = NULL; - } - _currentMusicFileHash = 0; - } - if (_moduleResult == 1) { - createScene(2, 0); - } else if (_moduleResult == 2) { - createScene(1, 0); - } else { - leaveModule(0); - } - break; - case 1: - if (_moduleResult == 0) { - createScene(0, 2); - } else { - createScene(1001, -1); - } - break; - case 2: - if (_moduleResult == 1) - createScene(3, 0); - else if (_moduleResult == 2) - createScene(5, 0); - else if (_moduleResult == 3) - createScene(6, 0); - else if (_moduleResult == 4) - createScene(9, 0); - else if (_moduleResult == 5) - createScene(25, 0); - else - createScene(0, 1); - break; - case 3: - createScene(2, 1); - break; - case 4: - if (_moduleResult == 1) { - leaveModule(1); - } else { - createScene(11, 1); - } - break; - case 5: - if (_moduleResult == 1) { - createScene(7, 0); - } else { - createScene(2, 2); - } - break; - case 6: - createScene(2, 3); - break; - case 7: - createScene(5, _moduleResult); - break; - case 8: - if (_moduleResult == 1) - createScene(10, 0); - else - createScene(9, 4); - break; - case 9: - if (_moduleResult == 1) - createScene(11, 0); - else if (_moduleResult == 2) - createScene(2, 0); - else if (_moduleResult == 3) - createScene(24, 0); - else if (_moduleResult == 4) - createScene(8, 0); - else if (_moduleResult == 6) - createScene(2, 6); - else if (_moduleResult == 11) - createScene(12, 0); - else if (_moduleResult == 12) - createScene(13, 0); - else if (_moduleResult == 13) - createScene(14, 0); - else if (_moduleResult == 14) - createScene(15, 0); - else if (_moduleResult == 15) - createScene(16, 0); - else if (_moduleResult == 16) - createScene(17, 0); - else if (_moduleResult == 17) - createScene(18, 0); - else if (_moduleResult == 18) - createScene(19, 0); - else if (_moduleResult == 19) - createScene(20, 0); - else if (_moduleResult == 20) - createScene(21, 0); - else if (_moduleResult == 21) - createScene(22, 0); - else if (_moduleResult == 22) - createScene(23, 0); - else - createScene(2, 4); - break; - case 10: - createScene(8, _moduleResult); - break; - case 11: - if (_moduleResult == 1) - createScene(4, 0); - else if (_moduleResult == 2) - createScene(26, 0); - else if (_moduleResult == 3) - createScene(9, 5); - else - createScene(9, 1); - break; - case 12: - createScene(9, 11); - break; - case 13: - createScene(9, 12); - break; - case 14: - createScene(9, 13); - break; - case 15: - createScene(9, 14); - break; - case 16: - createScene(9, 15); - break; - case 17: - createScene(9, 16); - break; - case 18: - createScene(9, 17); - break; - case 19: - createScene(9, 18); - break; - case 20: - createScene(9, 19); - break; - case 21: - createScene(9, 20); - break; - case 22: - createScene(9, 21); - break; - case 23: - createScene(9, 22); - break; - case 24: - createScene(9, 3); - break; - case 25: - createScene(2, 5); - break; - case 26: - createScene(11, 2); - break; - case 1001: - createScene(1, -1); - break; - } - } else { - switch (_sceneNum) { - case 0: - updateMusic(true); - break; - case 1: - updateMusic(false); - break; - } - } -} - -void Module2800::updateMusic(bool halfVolume) { - - uint32 newMusicFileHash = _vm->_gameModule->getCurrRadioMusicFileHash(); - - if (!_musicResource) - _musicResource = new MusicResource(_vm); - - if (newMusicFileHash != _currentMusicFileHash) { - _currentMusicFileHash = newMusicFileHash; - if (_currentMusicFileHash != 0) { - _musicResource->load(_currentMusicFileHash); - _musicResource->setVolume(halfVolume ? 60 : 100); - _musicResource->play(0); - } else { - _musicResource->stop(0); - } - } else if (_currentMusicFileHash != 0) { - if (!_musicResource->isPlaying()) { - _musicResource->setVolume(halfVolume ? 60 : 100); - _musicResource->play(0); - } else { - _musicResource->setVolume(halfVolume ? 60 : 100); - } - } else { - _musicResource->stop(0); - } - -} - -Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *_sprite1; - Sprite *_sprite2; - - _vm->gameModule()->initRadioPuzzle(); - - SetMessageHandler(&Scene2801::handleMessage); - SetUpdateHandler(&Scene::update); - - // Display the disabled radio; only possible when the left door is open - if (!getGlobalVar(V_RADIO_ENABLED)) - insertStaticSprite(0x0001264C, 100); - - if (which < 0) { - insertKlaymen(194, 430); - setMessageList(0x004B6BB8); - } else if (which == 1) { - insertKlaymen(443, 398); - setMessageList(0x004B6BC0); - } else if (which == 2) { - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(312, 432); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen(194, 432); - } - setMessageList(0x004B6C10); - } else { - insertKlaymen(0, 432); - setMessageList(0x004B6BB0); - } - - if (getGlobalVar(V_RADIO_ROOM_LEFT_DOOR)) { - setRectList(0x004B6CE0); - setBackground(0x01400666); - setPalette(0x01400666); - _paletteHash = 0x15021024; - _palette->addBasePalette(0x01400666, 0, 256, 0); - _sprite1 = insertStaticSprite(0x100CA0A8, 1100); - _sprite2 = insertStaticSprite(0x287C21A4, 1100); - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); - insertScreenMouse(0x0066201C); - _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); - addCollisionSprite(_asTape); - } else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) { - setRectList(0x004B6CD0); - setBackground(0x11E00684); - setPalette(0x11E00684); - _paletteHash = 0x15021024; - _palette->addBasePalette(0x11E00684, 0, 256, 0); - _sprite2 = insertStaticSprite(0x061601C8, 1100); - _klaymen->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); - insertScreenMouse(0x00680116); - _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); - addCollisionSprite(_asTape); - } else { - setRectList(0x004B6CF0); - setBackground(0x030006E6); - setPalette(0x030006E6); - _paletteHash = 0x15021024; - _palette->addBasePalette(0x030006E6, 0, 256, 0); - _sprite2 = insertStaticSprite(0x273801CE, 1100); - _klaymen->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); - insertScreenMouse(0x006E2038); - _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); - addCollisionSprite(_asTape); - } - - addEntity(_palette); - - if (which == 1) { - _palette->addPalette(0xB103B604, 0, 65, 0); - _palette->addBasePalette(0xB103B604, 0, 65, 0); - } else { - _palette->addPalette(_paletteHash, 0, 65, 0); - _palette->addBasePalette(_paletteHash, 0, 65, 0); - } - -} - -Scene2801::~Scene2801() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); -} - -uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4826: - if (sender == _asTape) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004B6C40); - } - break; - case 0x482A: - _palette->addBasePalette(0xB103B604, 0, 65, 0); - _palette->startFadeToPalette(12); - break; - case 0x482B: - _palette->addBasePalette(_paletteHash, 0, 65, 0); - _palette->startFadeToPalette(12); - break; - } - return messageResult; -} - -Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _currTuneStatus(0), _countdown1(0), _countdown2(0) { - - SetMessageHandler(&Scene2802::handleMessage); - SetUpdateHandler(&Scene2802::update); - insertPuzzleMouse(0x008810A8, 20, 620); - _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true)); - _currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); - // Need to go to the first frame first to load up the palette - _smackerPlayer->gotoFrame(0); - // Now we can actually set the current radio frame - _smackerPlayer->gotoFrame(_currRadioMusicIndex); - _vm->_soundMan->addSound(0x04360A18, 0x422630C2); - _vm->_soundMan->addSound(0x04360A18, 0x00632252); - _vm->_soundMan->addSound(0x04360A18, 0x00372241); - _vm->_soundMan->setSoundVolume(0x00372241, 60); - changeTuneStatus(0, 0); - _vm->_soundMan->playSoundLooping(0x00372241); -} - -Scene2802::~Scene2802() { - _vm->_soundMan->deleteSoundGroup(0x04360A18); - if (_currRadioMusicIndex == 0) { - setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1); - setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); - } else if (_currRadioMusicIndex == getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)) { - setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0); - setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 1); - } else { - setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0); - setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); - } - setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex); -} - -void Scene2802::update() { - int prevTuneStatus = _currTuneStatus; - uint prevRadioMusicIndex = _currRadioMusicIndex; - - Scene::update(); - if (_countdown1 > 0) - --_countdown1; - else if (_currTuneStatus == 1) - _currTuneStatus = 3; - else if (_currTuneStatus == 4) - _currTuneStatus = 6; - - switch (_currTuneStatus) { - case 2: - if (_currRadioMusicIndex < 90) - incRadioMusicIndex(+1); - _currTuneStatus = 0; - break; - case 3: - if (_countdown2 > 0) - --_countdown2; - else if (_currRadioMusicIndex < 90) { - incRadioMusicIndex(+1); - _countdown2 = 1; - } else - _currTuneStatus = 0; - break; - case 5: - if (_currRadioMusicIndex > 0) - incRadioMusicIndex(-1); - _currTuneStatus = 0; - break; - case 6: - if (_countdown2 > 0) - --_countdown2; - else if (_currRadioMusicIndex > 0) { - incRadioMusicIndex(-1); - _countdown2 = 1; - } else - _currTuneStatus = 0; - break; - - } - - if (prevRadioMusicIndex != _currRadioMusicIndex) - _smackerPlayer->gotoFrame(_currRadioMusicIndex); - - if (prevTuneStatus != _currTuneStatus) - changeTuneStatus(prevTuneStatus, _currTuneStatus); - - //DEBUG>>> - //debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)); - //DEBUG<<< - - if (getGlobalVar(V_RADIO_MOVE_DISH_VIDEO) && prevTuneStatus != _currTuneStatus && _currRadioMusicIndex != 0) { - setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0); - leaveScene(1); - } - -} - -uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - int prevTuneStatus = _currTuneStatus; - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - leaveScene(0); - } else if (_currTuneStatus == 0) { - if (param.asPoint().x > 180 && param.asPoint().x < 300 && - param.asPoint().y > 130 && param.asPoint().y < 310) { - _currTuneStatus = 4; - } else if (param.asPoint().x > 300 && param.asPoint().x < 400 && - param.asPoint().y > 130 && param.asPoint().y < 310) { - _currTuneStatus = 1; - } - if (_currTuneStatus == 1 || _currTuneStatus == 4) { - _countdown1 = 8; - changeTuneStatus(0, _currTuneStatus); - } - } - break; - case 0x0002: - if (_countdown1 == 0) - _currTuneStatus = 0; - else { - if (_currTuneStatus == 1) - _currTuneStatus = 2; - else if (_currTuneStatus == 4) - _currTuneStatus = 5; - else - _currTuneStatus = 0; - _countdown1 = 0; - } - if (prevTuneStatus != _currTuneStatus) - changeTuneStatus(prevTuneStatus, _currTuneStatus); - break; - } - return 0; -} - -void Scene2802::incRadioMusicIndex(int delta) { - _currRadioMusicIndex += delta; - setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex); -} - -void Scene2802::changeTuneStatus(int prevTuneStatus, int newTuneStatus) { - - if (prevTuneStatus == 3 || prevTuneStatus == 6) { - _vm->_soundMan->stopSound(0x422630C2); - _vm->_soundMan->stopSound(0x00632252); - } - - if (newTuneStatus == 0) { - if (_vm->_gameModule->getCurrRadioMusicFileHash() != 0) - _vm->_soundMan->stopSound(0x00632252); - else - _vm->_soundMan->playSoundLooping(0x00632252); - } else if (newTuneStatus == 3 || newTuneStatus == 6) { - _vm->_soundMan->playSoundLooping(0x422630C2); - _vm->_soundMan->playSoundLooping(0x00632252); - } - -} - -AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), - _isPulled(false), _isBusy(false) { - - createSurface(1010, 28, 379); - SetUpdateHandler(&AnimatedSprite::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - _x = x; - _y = y; - stIdle(); -} - -uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (!_isBusy && param.asInteger() == calcHash("ClickSwitch")) { - sendMessage(_parentScene, 0x480F, 0); - playSound(0, 0x4E1CA4A0); - } - break; - case 0x480F: - stPulled(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene2803LightCord::hmPulled(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2803LightCord::stPulled() { - _isBusy = false; - _isPulled = true; - startAnimation(_fileHash2, 0, -1); - SetMessageHandler(&AsScene2803LightCord::hmPulled); - NextState(&AsScene2803LightCord::stIdle); -} - -void AsScene2803LightCord::stIdle() { - _isPulled = false; - startAnimation(_fileHash1, 0, -1); - SetMessageHandler(&AsScene2803LightCord::handleMessage); -} - -void AsScene2803LightCord::setFileHashes(uint32 fileHash1, uint32 fileHash2) { - _fileHash1 = fileHash1; - _fileHash2 = fileHash2; - if (_isPulled) { - startAnimation(_fileHash2, _currFrameIndex, -1); - _isBusy = true; - } else { - startAnimation(_fileHash1, 0, -1); - } -} - -AsScene2803TestTubeOne::AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2) - : AnimatedSprite(vm, 1200), _fileHash1(fileHash1), _fileHash2(fileHash2) { - - createSurface1(fileHash1, 100); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2803TestTubeOne::handleMessage); - _x = 529; - _y = 326; -} - -uint32 AsScene2803TestTubeOne::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - if (param.asInteger()) - startAnimation(_fileHash2, 0, -1); - else - startAnimation(_fileHash1, 0, -1); - break; - } - return messageResult; -} - -AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - createSurface(990, 68, 476); - SetUpdateHandler(&AnimatedSprite::update); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - SetMessageHandler(&AsScene2803Rope::handleMessage); - startAnimation(0x9D098C23, 35, 53); - NextState(&AsScene2803Rope::stReleased); - _x = x; - _y = -276; -} - -uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - startAnimation(0x9D098C23, 50, -1); - SetMessageHandler(&AsScene2803Rope::hmReleased); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene2803Rope::hmReleased(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -void AsScene2803Rope::stReleased() { - startAnimation(0x8258A030, 0, 1); - NextState(&AsScene2803Rope::stHide); -} - -void AsScene2803Rope::stHide() { - stopAnimation(); - setVisible(false); -} - -Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _paletteArea(0) { - - static const uint32 kScene2803FileHashes1[] = { - 0, - 0x081000F1, - 0x08100171, - 0x08100271 - }; - - static const uint32 kScene2803FileHashes2[] = { - 0, - 0x286800D4, - 0x286806D4, - 0x28680AD4 - }; - - setGlobalVar(V_BEEN_SHRINKING_ROOM, 1); - _vm->gameModule()->initTestTubes1Puzzle(); - - SetMessageHandler(&Scene2803::handleMessage); - - loadDataResource(0x00900849); - - _background = new Background(_vm, 0); - _background->createSurface(0, 640, 480); - addBackground(_background); - - setPalette(0x412A423E); - addEntity(_palette); - - insertScreenMouse(0xA423A41A); - - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { - _asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100); - } else { - _asTestTubeOne = (StaticSprite*)insertSprite( - kScene2803FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], - kScene2803FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)]); - } - - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) - _asTestTubeTwo = (StaticSprite*)insertStaticSprite(0x64330236, 100); - - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) - _asTestTubeThree = (StaticSprite*)insertStaticSprite(0x2E4A22A2, 100); - - _asLightCord = insertSprite(this, 0x8FAD5932, 0x276E1A3D, 578, 200); - _sprite3 = (StaticSprite*)insertStaticSprite(0xA40EF2FB, 1100); - _sprite4 = (StaticSprite*)insertStaticSprite(0x0C03AA23, 1100); - _sprite5 = (StaticSprite*)insertStaticSprite(0x2A822E2E, 1100); - _sprite6 = (StaticSprite*)insertStaticSprite(0x2603A202, 1100); - _sprite7 = (StaticSprite*)insertStaticSprite(0x24320220, 1100); - _sprite8 = (StaticSprite*)insertStaticSprite(0x3C42022F, 1100); - _sprite9 = (StaticSprite*)insertStaticSprite(0x341A0237, 1100); - _sprite10 = insertStaticSprite(0x855820A3, 1200); - - _clipRectsFloor[0].x1 = 0; - _clipRectsFloor[0].y1 = 0; - _clipRectsFloor[0].x2 = 640; - _clipRectsFloor[0].y2 = _sprite8->getDrawRect().y2(); - - _clipRectsFloor[1].x1 = _sprite8->getDrawRect().x2(); - _clipRectsFloor[1].y1 = _sprite8->getDrawRect().y2(); - _clipRectsFloor[1].x2 = 640; - _clipRectsFloor[1].y2 = 480; - - _clipRectsStairs[0].x1 = _sprite5->getDrawRect().x; - _clipRectsStairs[0].y1 = 0; - _clipRectsStairs[0].x2 = _sprite5->getDrawRect().x2(); - _clipRectsStairs[0].y2 = _sprite5->getDrawRect().y2(); - - _clipRectsStairs[1].x1 = _sprite6->getDrawRect().x; - _clipRectsStairs[1].y1 = 0; - _clipRectsStairs[1].x2 = _sprite3->getDrawRect().x; - _clipRectsStairs[1].y2 = _sprite6->getDrawRect().y2(); - - _clipRectsStairs[2].x1 = _sprite3->getDrawRect().x; - _clipRectsStairs[2].y1 = 0; - _clipRectsStairs[2].x2 = _sprite4->getDrawRect().x2(); - _clipRectsStairs[2].y2 = 480; - - if (which < 0) { - insertKlaymen(302, 445, _clipRectsFloor, 2); - setMessageList(0x004B79F0); - klaymenFloor(); - } else if (which == 1) { - insertKlaymen(200, 445, _clipRectsFloor, 2); - setMessageList(0x004B79C8); - klaymenFloor(); - } else if (which == 3) { - NPoint pt = _dataResource.getPoint(0xC2A08694); - insertKlaymen(pt.x, pt.y, _clipRectsStairs, 3); - setMessageList(0x004B7A00); - klaymenStairs(); - } else if (which == 5) { - insertKlaymen(253, 298, _clipRectsStairs, 3); - setMessageList(0x004B7A00); - klaymenStairs(); - } else if (which == 6) { - _asRope = insertSprite(this, 384); - _asRope->setClipRect(0, 25, 640, 480); - insertKlaymen(384, 0, _clipRectsFloor, 2); - sendEntityMessage(_klaymen, 0x1014, _asRope); - _klaymen->setClipRect(0, 25, 640, 480); - setMessageList(0x004B7A78); - klaymenFloor(); - } else if (which == 2) { - insertKlaymen(400, 445, _clipRectsFloor, 2); - setMessageList(0x004B79F8); - klaymenFloor(); - } else { - insertKlaymen(50, 231, _clipRectsStairs, 3); - setMessageList(0x004B79C0); - klaymenStairs(); - } - - changeBackground(); - -} - -void Scene2803::upKlaymenStairs() { - if (_klaymen->getX() < 350) { - setPaletteArea0(); - } else { - setPaletteArea1(); - } - Scene::update(); -} - -uint32 Scene2803::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x480F: - toggleBackground(); - // NOTE Intentional fall-through - case 0x100D: - if (param.asInteger() == 0x84251F82) - setMessageList(0x004B7A50); - else if (param.asInteger() == 0x4254A2D2) - setMessageList(0x004B7A58); - else if (param.asInteger() == 0xE90A40A0) - setMessageList(0x004B7A08); - else if (param.asInteger() == 0x482D1210) - setMessageList(0x004B7A30); - else if (param.asInteger() == 0x802402B2) { - sendEntityMessage(_klaymen, 0x1014, _asLightCord); - setMessageList(0x004B7A68); - } else if (param.asInteger() == 0x9626F390) - setMessageList(0x004B7A88); - break; - case 0x482A: - klaymenStairs(); - setPaletteArea1(); - break; - case 0x482B: - klaymenFloor(); - setPaletteArea0(); - break; - } - return messageResult; -} - -void Scene2803::klaymenStairs() { - SetUpdateHandler(&Scene2803::upKlaymenStairs); - _klaymen->getSurface()->setClipRects(_clipRectsStairs, 3); - sendMessage(_klaymen, 0x482C, 0xE5A48297); - _sprite3->setVisible(true); - _sprite4->setVisible(true); - _sprite5->setVisible(true); - _sprite6->setVisible(true); - _sprite7->setVisible(true); - _sprite8->setVisible(false); - _sprite9->setVisible(false); -} - -void Scene2803::klaymenFloor() { - SetUpdateHandler(&Scene::update); - _klaymen->getSurface()->setClipRects(_clipRectsFloor, 2); - sendMessage(_klaymen, 0x482C, 0); - _sprite3->setVisible(false); - _sprite4->setVisible(false); - _sprite5->setVisible(false); - _sprite6->setVisible(false); - _sprite7->setVisible(false); - _sprite8->setVisible(true); - _sprite9->setVisible(true); -} - -void Scene2803::toggleBackground() { - setGlobalVar(V_SHRINK_LIGHTS_ON, getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0 : 1); - changeBackground(); -} - -void Scene2803::changeBackground() { - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { - _asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D); - _background->load(0x412A423E); - _palette->addPalette(0x412A423E, 0, 256, 0); - _palette->addBasePalette(0x412A423E, 0, 256, 0); - _sprite3->loadSprite(0xA40EF2FB); - _sprite4->loadSprite(0x0C03AA23); - _sprite5->loadSprite(0x2A822E2E); - _sprite6->loadSprite(0x2603A202); - _sprite7->loadSprite(0x24320220); - _mouseCursor->load(0xA423A41A); - _mouseCursor->updateCursor(); - _sprite8->loadSprite(0x3C42022F); - _sprite9->loadSprite(0x341A0237); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) - _asTestTubeOne->loadSprite(0x66121222); - else - sendMessage(_asTestTubeOne, 0x2000, 0); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) - _asTestTubeTwo->loadSprite(0x64330236); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) - _asTestTubeThree->loadSprite(0x2E4A22A2); - _sprite10->setVisible(true); - } else { - _asLightCord->setFileHashes(0xAFAD591A, 0x276E321D); - _background->load(0x29800A01); - _palette->addPalette(0x29800A01, 0, 256, 0); - _palette->addBasePalette(0x29800A01, 0, 256, 0); - _sprite3->loadSprite(0x234340A0); - _sprite4->loadSprite(0x16202200); - _sprite5->loadSprite(0x1030169A); - _sprite6->loadSprite(0x1600A6A8); - _sprite7->loadSprite(0xD0802EA0); - _mouseCursor->load(0x00A05290); - _mouseCursor->updateCursor(); - _sprite8->loadSprite(0x108012C1); - _sprite9->loadSprite(0x708072E0); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0) - sendMessage(_asTestTubeOne, 0x2000, 1); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) - _asTestTubeTwo->loadSprite(0xD48077A0); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) - _asTestTubeThree->loadSprite(0x30022689); - _sprite10->setVisible(false); - } - updatePaletteArea(); -} - -void Scene2803::setPaletteArea0() { - if (_paletteArea != 0) { - _paletteArea = 0; - updatePaletteArea(); - } -} - -void Scene2803::setPaletteArea1() { - if (_paletteArea != 1) { - _paletteArea = 1; - updatePaletteArea(); - } -} - -void Scene2803::updatePaletteArea() { - uint32 fadePaletteHash; - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) - fadePaletteHash = (_paletteArea == 1) ? 0xB103B604 : 0x412A423E; - else - fadePaletteHash = (_paletteArea == 1) ? 0x0263D144 : 0x29800A01; - _palette->addBasePalette(fadePaletteHash, 0, 64, 0); - _palette->startFadeToPalette(12); -} - -Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _paletteArea(0) { - - static const uint32 kScene2803SmallFileHashes1[] = { - 0, 0x081000F1, 0x08100171, 0x08100271 - }; - - static const uint32 kScene2803SmallFileHashes2[] = { - 0, 0x286800D4, 0x286806D4, 0x28680AD4 - }; - - SetMessageHandler(&Scene2803Small::handleMessage); - - loadDataResource(0x81120132); - insertScreenMouse(0x00A05290); - - insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); - - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { - setBackground(0x412A423E); - setPalette(0x412A423E); - _palette->addBasePalette(0x412A423E, 0, 256, 0); - addEntity(_palette); - _sprite1 = insertStaticSprite(0x0C03AA23, 1100); - _sprite2 = insertStaticSprite(0x24320220, 1100); - _sprite3 = insertStaticSprite(0x1A032204, 1100); - _sprite4 = insertStaticSprite(0x18032204, 1100); - _sprite5 = insertStaticSprite(0x34422912, 1100); - _sprite6 = insertStaticSprite(0x3C42022F, 1100); - _sprite7 = insertStaticSprite(0x341A0237, 1100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) - insertStaticSprite(0x66121222, 100); - else - insertSprite(kScene2803SmallFileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) - insertStaticSprite(0x64330236, 100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) - insertStaticSprite(0x2E4A22A2, 100); - } else { - setBackground(0x29800A01); - setPalette(0x29800A01); - _palette->addBasePalette(0x29800A01, 0, 256, 0); - addEntity(_palette); - _sprite1 = insertStaticSprite(0x16202200, 1100); - _sprite2 = insertStaticSprite(0xD0802EA0, 1100); - _sprite3 = insertStaticSprite(0x780C2E30, 1100); - _sprite4 = insertStaticSprite(0x700C2E30, 1100); - _sprite5 = insertStaticSprite(0x102CE6E1, 900); - _sprite6 = insertStaticSprite(0x108012C1, 1100); - _sprite7 = insertStaticSprite(0x708072E0, 1100); - insertStaticSprite(0x90582EA4, 100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0) - insertSprite(kScene2803SmallFileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) - insertStaticSprite(0xD48077A0, 100); - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) - insertStaticSprite(0x30022689, 100); - } - - _sprite6->setVisible(false); - _sprite7->setVisible(false); - - if (which < 0) { - insertKlaymen(479, 435); - klaymenFloor(); - setMessageList(0x004B60D8); - } else if (which == 3) { - NPoint pt = _dataResource.getPoint(0x096520ED); - insertKlaymen(pt.x, pt.y); - klaymenSlope(); - setMessageList(0x004B6100); - _klaymen->setRepl(64, 0); - } else if (which == 4) { - NPoint pt = _dataResource.getPoint(0x20C6238D); - insertKlaymen(pt.x, pt.y); - klaymenSlope(); - setMessageList(0x004B60F8); - _klaymen->setRepl(64, 0); - } else if (which == 5) { - NPoint pt = _dataResource.getPoint(0x2146690D); - insertKlaymen(pt.x, pt.y); - klaymenSlope(); - setMessageList(0x004B6100); - _klaymen->setRepl(64, 0); - } else if (which == 2) { - NPoint pt = _dataResource.getPoint(0x104C03ED); - insertKlaymen(pt.x, pt.y); - klaymenFloor(); - setMessageList(0x004B6138); - } else { - insertKlaymen(135, 444); - klaymenFloor(); - setMessageList(0x004B60E0, false); - _sprite6->setVisible(true); - _sprite7->setVisible(true); - } - -} - -uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xB4E4884C) { - setMessageList(0x004B6180); - } else if (param.asInteger() == 0xB1FDAB2E) { - NPoint pt = _dataResource.getPoint(0x0D84A1AD); - _klaymen->setX(pt.x); - _klaymen->setY(pt.y); - _klaymen->updateBounds(); - klaymenFloor(); - _klaymen->setClipRect(517, 401, 536, 480); - setMessageList(0x004B6198); - } else if (param.asInteger() == 0xB00C7C48) { - setMessageList(0x004B6108); - } else if (param.asInteger() == 0x61F64346) { - setMessageList(0x004B6150); - } else if (param.asInteger() == 0xAC69A28D) { - setMessageList(0x004B6168); - } else if (param.asInteger() == 0x00086212) { - _klaymen->setClipRect(0, 0, 560, 315); - _klaymen->setX(560); - _klaymen->setY(315); - _klaymen->updateBounds(); - klaymenSlope(); - setMessageList(0x004B61A0); - } else if (param.asInteger() == 0x002CAA68) { - setMessageList(0x004B61A8); - } - break; - case 0x482A: - if (_klaymen->getX() < 200) { - setPaletteArea3(); - } else if (_klaymen->getX() < 500) { - setSurfacePriority(_sprite5->getSurface(), 1100); - sendMessage(_klaymen, 0x482C, 0); - setPaletteArea2(); - } else { - _klaymen->setClipRect(517, 401, 536, 480); - setPaletteArea2(); - } - break; - case 0x482B: - _sprite6->setVisible(false); - _sprite7->setVisible(false); - _klaymen->setClipRect(0, 0, 640, 480); - setSurfacePriority(_sprite5->getSurface(), 900); - sendMessage(_klaymen, 0x482C, 0x2086222D); - break; - } - return 0; -} - -void Scene2803Small::upKlaymenSlope() { - if (_klaymen->getX() < 388) { - _klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - setPaletteArea0(); - } else if (_klaymen->getX() < 500) { - _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); - setPaletteArea1(); - } - Scene::update(); -} - -void Scene2803Small::upKlaymenFloor() { - if (_klaymen->getX() > 194 && _klaymen->getX() < 273) - setPaletteArea2(); - else if (_klaymen->getX() > 155 && _klaymen->getX() < 300) - setPaletteArea0(); - Scene::update(); -} - -void Scene2803Small::klaymenSlope() { - SetUpdateHandler(&Scene2803Small::upKlaymenSlope); - sendMessage(_klaymen, 0x482C, 0x23C630D9); - _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); - _klaymen->setRepl(64, 0); - _sprite1->setVisible(true); -} - -void Scene2803Small::klaymenFloor() { - SetUpdateHandler(&Scene2803Small::upKlaymenFloor); - sendMessage(_klaymen, 0x482C, 0x2086222D); - _klaymen->setClipRect(0, 0, 640, 480); - _klaymen->clearRepl(); - _sprite1->setVisible(false); -} - -void Scene2803Small::setPaletteArea0() { - if (_paletteArea != 0) { - _paletteArea = 0; - updatePaletteArea(false); - } -} - -void Scene2803Small::setPaletteArea1() { - if (_paletteArea != 1) { - _paletteArea = 1; - updatePaletteArea(false); - } -} - -void Scene2803Small::setPaletteArea2() { - if (_paletteArea != 2) { - _paletteArea = 2; - updatePaletteArea(false); - } -} - -void Scene2803Small::setPaletteArea3() { - if (_paletteArea != 3) { - _paletteArea = 3; - updatePaletteArea(true); - } -} - -void Scene2803Small::updatePaletteArea(bool instantly) { - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { - switch (_paletteArea) { - case 1: - _palette->addBasePalette(0x0A938204, 0, 64, 0); - break; - case 2: - _palette->addBasePalette(0xB103B604, 0, 64, 0); - break; - case 3: - _palette->fillBaseBlack(0, 64); - break; - default: - _palette->addBasePalette(0x412A423E, 0, 64, 0); - break; - } - } else { - switch (_paletteArea) { - case 2: - _palette->addBasePalette(0x0263D144, 0, 64, 0); - break; - case 3: - _palette->fillBaseBlack(0, 64); - break; - default: - _palette->addBasePalette(0x29800A01, 0, 64, 0); - break; - } - } - _palette->startFadeToPalette(instantly ? 0 : 12); -} - -SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) - : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) { - - loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0x51A10202 : 0x11814A21, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - setVisible(false); - SetUpdateHandler(&SsScene2804RedButton::update); - SetMessageHandler(&SsScene2804RedButton::handleMessage); - loadSound(0, 0x44241240); -} - -void SsScene2804RedButton::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown) == 0) { - setVisible(false); - } -} - -uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0 && !_parentScene->isWorking()) { - playSound(0); - setVisible(true); - _countdown = 4; - sendMessage(_parentScene, 0x2000, 0); - } - messageResult = 1; - break; - } - return messageResult; -} - -SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm) - : StaticSprite(vm, 900) { - - loadSprite(0x8889B008, kSLFDefDrawOffset | kSLFDefPosition, 400); - setVisible(false); - SetMessageHandler(&SsScene2804LightCoil::handleMessage); -} - -uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2002: - setVisible(true); - updatePosition(); - messageResult = 1; - break; - case 0x2003: - setVisible(false); - updatePosition(); - messageResult = 1; - break; - } - return messageResult; -} - -SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm) - : StaticSprite(vm, 900) { - - loadSprite(0x06092132, kSLFDefDrawOffset | kSLFDefPosition, 400); - setVisible(false); - SetMessageHandler(&SsScene2804LightTarget::handleMessage); -} - -uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2004: - setVisible(true); - updatePosition(); - messageResult = 1; - break; - case 0x2005: - setVisible(false); - updatePosition(); - messageResult = 1; - break; - } - return messageResult; -} - -SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) - : StaticSprite(vm, 900) { - - loadSprite(0x211003A0, kSLFDefDrawOffset | kSLFDefPosition, 400); - setVisible(false); - loadSound(0, 0xCB36BA54); -} - -void SsScene2804Flash::show() { - setVisible(true); - updatePosition(); - playSound(0); -} - -SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) - : StaticSprite(vm, 900) { - - loadSprite(0x9A816000, kSLFDefDrawOffset | kSLFDefPosition, 400); - setVisible(false); -} - -AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex) - : AnimatedSprite(vm, 1100), _crystalIndex(crystalIndex) { - - static const NPoint kAsScene2804CrystalWavesPoints[] = { - {323, 245}, - {387, 76}, - {454, 260}, - {527, 70} - }; - - _x = kAsScene2804CrystalWavesPoints[crystalIndex].x; - _y = kAsScene2804CrystalWavesPoints[crystalIndex].y; - createSurface1(0x840C41F0, 1200); - if (crystalIndex & 1) - setDoDeltaY(1); - setVisible(false); - _needRefresh = true; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&Sprite::handleMessage); -} - -void AsScene2804CrystalWaves::show() { - setVisible(true); - startAnimation(0x840C41F0, 0, -1); -} - -void AsScene2804CrystalWaves::hide() { - setVisible(false); - stopAnimation(); -} - -static const int16 kAsScene2804CrystalFrameNums[] = { - 0, 6, 2, 8, 1, 10, 0, 0 -}; - -static const uint32 kAsScene2804CrystalFileHashes[] = { - 0x000540B0, - 0x001280D0, - 0x003D0010, - 0x00620190, - 0x00DC0290 -}; - -AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex) - : AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex), _isShowing(false) { - - static const NPoint kAsScene2804CrystalPoints[] = { - {204, 196}, - {272, 316}, - {334, 206}, - {410, 334}, - {470, 180} - }; - - _colorNum = (int16)getSubVar(VA_CURR_CRYSTAL_COLORS, crystalIndex); - _isLightOn = getGlobalVar(V_SHRINK_LIGHTS_ON) != 0; - if (_isLightOn) { - _x = kAsScene2804CrystalPoints[crystalIndex].x; - _y = kAsScene2804CrystalPoints[crystalIndex].y; - createSurface1(0x108DFB12, 1200); - startAnimation(0x108DFB12, kAsScene2804CrystalFrameNums[_colorNum], -1); - _needRefresh = true; - _newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum]; - } else { - _x = 320; - _y = 240; - createSurface1(kAsScene2804CrystalFileHashes[crystalIndex], 1200); - startAnimation(kAsScene2804CrystalFileHashes[crystalIndex], _colorNum, -1); - setVisible(false); - _needRefresh = true; - _newStickFrameIndex = _colorNum; - } - loadSound(0, 0x725294D4); - SetUpdateHandler(&AnimatedSprite::update); -} - -void AsScene2804Crystal::show() { - if (!_isLightOn) { - setVisible(true); - _isShowing = true; - if (_asCrystalWaves) - _asCrystalWaves->show(); - playSound(0); - } -} - -void AsScene2804Crystal::hide() { - if (!_isLightOn) { - setVisible(false); - _isShowing = false; - if (_asCrystalWaves) - _asCrystalWaves->hide(); - } -} - -void AsScene2804Crystal::activate() { - if (!_isShowing) { - int16 frameNum = kAsScene2804CrystalFrameNums[_colorNum]; - _colorNum++; - if (_colorNum >= 6) - _colorNum = 0; - if (_isLightOn) { - startAnimation(0x108DFB12, frameNum, kAsScene2804CrystalFrameNums[_colorNum]); - _playBackwards = kAsScene2804CrystalFrameNums[_colorNum] < _colorNum; - _newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum]; - } else { - startAnimation(kAsScene2804CrystalFileHashes[_crystalIndex], _colorNum, -1); - _newStickFrameIndex = _colorNum; - } - setSubVar(VA_CURR_CRYSTAL_COLORS, _crystalIndex, _colorNum); - } -} - -SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex) - : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal), _crystalIndex(crystalIndex) { - - static const uint32 kSsScene2804CrystalButtonFileHashes1[] = { - 0x911101B0, - 0x22226001, - 0x4444A362, - 0x888925A4, - 0x11122829 - }; - - static const uint32 kSsScene2804CrystalButtonFileHashes2[] = { - 0xB500A1A0, - 0x6A012021, - 0xD4022322, - 0xA8042525, - 0x5008292B - }; - - loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? kSsScene2804CrystalButtonFileHashes1[crystalIndex] : kSsScene2804CrystalButtonFileHashes2[crystalIndex], - kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - setVisible(false); - loadSound(0, 0x44045140); - SetUpdateHandler(&SsScene2804CrystalButton::update); - SetMessageHandler(&SsScene2804CrystalButton::handleMessage); -} - -void SsScene2804CrystalButton::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown) == 0) { - setVisible(false); - } -} - -uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0 && !_parentScene->isWorking()) { - playSound(0); - setVisible(true); - _countdown = 4; - _asCrystal->activate(); - } - messageResult = 1; - break; - } - return messageResult; -} - -AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody) - : AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), _countdown(0) { - - createSurface1(0x00494891, 1000); - _x = 125; - _y = 184; - setVisible(false); - _needRefresh = true; - AnimatedSprite::updatePosition(); - loadSound(0, 0x6352F051); - _vm->_soundMan->addSound(0xC5EA0B28, 0xEF56B094); - SetUpdateHandler(&AsScene2804BeamCoil::update); - SetMessageHandler(&AsScene2804BeamCoil::handleMessage); -} - -AsScene2804BeamCoil::~AsScene2804BeamCoil() { - _vm->_soundMan->deleteSoundGroup(0xC5EA0B28); -} - -void AsScene2804BeamCoil::update() { - updateAnim(); - updatePosition(); - if (_countdown != 0 && (--_countdown) == 0) { - sendMessage(_parentScene, 0x2001, 0); - } -} - -uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2002: - show(); - _countdown = 92; - messageResult = 1; - break; - case 0x2003: - hide(); - messageResult = 1; - break; - } - return messageResult; -} - -void AsScene2804BeamCoil::show() { - _ssBeamCoilBody->setVisible(true); - setVisible(true); - startAnimation(0x00494891, 0, -1); - playSound(0); - SetMessageHandler(&AsScene2804BeamCoil::hmBeaming); - NextState(&AsScene2804BeamCoil::stBeaming); -} - -void AsScene2804BeamCoil::hide() { - stopAnimation(); - SetMessageHandler(&AsScene2804BeamCoil::handleMessage); - setVisible(false); - _ssBeamCoilBody->setVisible(false); - _vm->_soundMan->stopSound(0xEF56B094); -} - -void AsScene2804BeamCoil::stBeaming() { - startAnimation(0x00494891, 93, -1); - NextState(&AsScene2804BeamCoil::stBeaming); - _vm->_soundMan->playSoundLooping(0xEF56B094); -} - -uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -AsScene2804BeamTarget::AsScene2804BeamTarget(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1400) { - - createSurface1(0x03842000, 1000); - _x = 475; - _y = 278; - setVisible(false); - _needRefresh = true; - updatePosition(); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2804BeamTarget::handleMessage); -} - -uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2004: - setVisible(true); - startAnimation(0x03842000, 0, -1); - messageResult = 1; - break; - case 0x2005: - setVisible(false); - stopAnimation(); - messageResult = 1; - break; - } - return messageResult; -} - -Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _countdown3(0), - _beamStatus(0), _isSolved(false), _isWorking(false) { - - _vm->gameModule()->initCrystalColorsPuzzle(); - - SetMessageHandler(&Scene2804::handleMessage); - SetUpdateHandler(&Scene2804::update); - - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { - setBackground(0xA1D03005); - setPalette(0xA1D03005); - addEntity(_palette); - insertPuzzleMouse(0x03001A15, 20, 620); - _asCoil = insertSprite(); - _asTarget = insertSprite(); - } else { - SsScene2804BeamCoilBody *ssBeamCoilBody; - setBackground(0x01C01414); - setPalette(0x01C01414); - addEntity(_palette); - insertPuzzleMouse(0x01410014, 20, 620); - ssBeamCoilBody = insertSprite(); - _asCoil = insertSprite(this, ssBeamCoilBody); - _asTarget = insertSprite(); - _ssFlash = insertSprite(); - } - - _ssRedButton = insertSprite(this); - addCollisionSprite(_ssRedButton); - - for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) { - AsScene2804CrystalWaves *asCrystalWaves = NULL; - if (crystalIndex < 4 && getGlobalVar(V_SHRINK_LIGHTS_ON) == 0) - asCrystalWaves = insertSprite(crystalIndex); - _asCrystals[crystalIndex] = insertSprite(asCrystalWaves, crystalIndex); - _ssCrystalButtons[crystalIndex] = insertSprite(this, _asCrystals[crystalIndex], crystalIndex); - addCollisionSprite(_ssCrystalButtons[crystalIndex]); - } - -} - -uint32 Scene2804::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - leaveScene(0); - } - break; - case 0x2000: - _isWorking = true; - sendMessage(_asCoil, 0x2002, 0); - if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { - sendMessage(_asTarget, 0x2004, 0); - _countdown2 = 48; - } - break; - case 0x2001: - _countdown3 = 2; - _isSolved = true; - _beamStatus = 0; - for (uint index = 0; index < 5; index++) - if (_asCrystals[index]->getColorNum() != (int16)getSubVar(VA_GOOD_CRYSTAL_COLORS, index)) - _isSolved = false; - _countdown2 = 48; - break; - } - return 0; -} - -void Scene2804::update() { - - Scene::update(); - - if (_countdown1 != 0 && (--_countdown1) == 0) { - leaveScene(0); - } - - if (_countdown2 != 0 && (--_countdown2) == 0) { - _isWorking = false; - sendMessage(_asCoil, 0x2003, 0); - sendMessage(_asTarget, 0x2005, 0); - for (uint index = 0; index < 5; index++) - _asCrystals[index]->hide(); - } - - if (_countdown3 != 0 && (--_countdown3) == 0) { - if (_beamStatus == 5) { - sendMessage(_asTarget, 0x2004, 0); - if (_isSolved) { - _palette->fillBaseWhite(0, 256); - _palette->startFadeToPalette(18); - setGlobalVar(V_KLAYMEN_SMALL, 1); - _countdown1 = 48; - } - } else if (_beamStatus == 6) { - if (_isSolved) - _ssFlash->show(); - } else { - _asCrystals[_beamStatus]->show(); - } - _beamStatus++; - if (_beamStatus < 6) - _countdown3 = 2; - else if (_beamStatus < 7) - _countdown3 = 4; - } - -} - -Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene2805::handleMessage); - - setBackground(0x08021E04); - setPalette(0x08021E04); - _palette->addPalette(0x8A6B1F91, 0, 65, 0); - insertScreenMouse(0x21E00088); - - _sprite1 = insertStaticSprite(0x008261E7, 1100); - _sprite2 = insertStaticSprite(0x020CE421, 1100); - - if (which < 0) { - insertKlaymen(380, 338); - setMessageList(0x004AE1C8); - sendMessage(this, 0x2000, 0); - } else if (which == 1) { - insertKlaymen(493, 338); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004AE1D0, false); - sendMessage(this, 0x2000, 1); - } else if (which == 2) { - insertKlaymen(493, 338); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004AE288, false); - sendMessage(this, 0x2000, 1); - } else if (which == 3) { - insertKlaymen(493, 338); - sendMessage(_klaymen, 0x2000, 1); - setMessageList(0x004AE1E0, false); - sendMessage(this, 0x2000, 1); - } else { - insertKlaymen(340, 338); - setMessageList(0x004AE1C0); - sendMessage(this, 0x2000, 0); - } - - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); - -} - -uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - if (param.asInteger()) { - setRectList(0x004AE318); - _klaymen->setKlaymenIdleTable3(); - } else { - setRectList(0x004AE308); - _klaymen->setKlaymenIdleTable1(); - } - break; - } - return 0; -} - -AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200) { - - createSurface1(0x04211490, 1200); - _x = 378; - _y = 423; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2806Spew::handleMessage); - setDoDeltaX(1); - setVisible(false); -} - -uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - playSound(0, 0x48640244); - startAnimation(0x04211490, 0, -1); - setVisible(true); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - which = 3; - - SetMessageHandler(&Scene2806::handleMessage); - SetUpdateHandler(&Scene2806::update); - - loadDataResource(0x98182003); - loadHitRectList(); - - _pointList = _dataResource.getPointArray(0x3606A422); - - insertScreenMouse(0x22114C13); - setBackground(0xC1B22110); - setPalette(0xC1B22110); - - _sprite1 = insertStaticSprite(0xA21F82CB, 1100); - _clipRects[0].x1 = _sprite1->getDrawRect().x; - _clipRects[0].y1 = _sprite1->getDrawRect().y; - _clipRects[0].x2 = _sprite1->getDrawRect().x2(); - _clipRects[0].y2 = _sprite1->getDrawRect().y2(); - - _sprite2 = insertStaticSprite(0x92035301, 1100); - _clipRects[1].y2 = _sprite2->getDrawRect().y2(); - - _sprite3 = insertStaticSprite(0x3182220E, 1100); - - _sprite4 = insertStaticSprite(0x72090342, 1100); - _clipRects[1].x1 = _sprite4->getDrawRect().x; - _clipRects[1].y1 = _sprite4->getDrawRect().y; - - tempSprite = insertStaticSprite(0xD2012C02, 1100); - _clipRects[2].x1 = tempSprite->getDrawRect().x; - _clipRects[2].y2 = tempSprite->getDrawRect().y2(); - _clipRects[3].y1 = tempSprite->getDrawRect().y2(); - _clipRects[1].x2 = tempSprite->getDrawRect().x; - - tempSprite = insertStaticSprite(0x72875F42, 1100); - _clipRects[3].x1 = tempSprite->getDrawRect().x; - - insertStaticSprite(0x0201410A, 1100); - insertStaticSprite(0x72875F42, 1100); - - _asSpew = insertSprite(); - - _clipRects[2].y1 = 0; - _clipRects[3].y2 = 480; - _clipRects[2].x2 = 640; - _clipRects[3].x2 = 640; - - if (which < 0) { - insertKlaymen(441, 423, false, _clipRects, 4); - setMessageList(0x004AF098); - } else if (which == 1) { - insertKlaymen(378, 423, false, _clipRects, 4); - setMessageList(0x004AF098); - } else if (which == 2) { - insertKlaymen(378, 423, false, _clipRects, 4); - setMessageList(0x004AF0C8, false); - } else if (which == 3) { - insertKlaymen(378, 423, true, _clipRects, 4); - setMessageList(0x004AF0A0, false); - setGlobalVar(V_KLAYMEN_SMALL, 0); - } else { - insertKlaymen(670, 423, false, _clipRects, 4); - setMessageList(0x004AF090); - } - - _pointIndex = -1; - findClosestPoint(); - -} - -uint32 Scene2806::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x44262B12) { - setMessageList(0x004AF0E0); - } - break; - case 0x2000: - sendMessage(_asSpew, 0x2000, 0); - break; - } - return 0; -} - -void Scene2806::update() { - Scene::update(); - findClosestPoint(); -} - -void Scene2806::findClosestPoint() { - - static const uint32 kScene2806PaletteFileHashes[] = { - 0x48052508, - 0x01139404, - 0x01138C04, - 0x01138004, - 0x01138604, - 0x086B8890 - }; - - int16 x = MIN(_klaymen->getX(), 639); - int index = 1; - - while (index < (int)_pointList->size() && (*_pointList)[index].x < x) - ++index; - --index; - - if (_pointIndex != index) { - _pointIndex = index; - _palette->addPalette(kScene2806PaletteFileHashes[index], 0, 64, 0); - } - -} - -Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - SetMessageHandler(&Scene2807::handleMessage); - - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 1) { - insertStaticSprite(0x103021E2, 300); - } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 2) { - insertStaticSprite(0x103022E2, 300); - } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 3) { - insertStaticSprite(0x103024E2, 300); - } - - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 1) { - insertStaticSprite(0x4800A52A, 200); - } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 2) { - insertStaticSprite(0x4800A62A, 200); - } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { - insertStaticSprite(0x4800A02A, 200); - } - - if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 1) { - insertStaticSprite(0x31203430, 100); - } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 2) { - insertStaticSprite(0x31203400, 100); - } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { - insertStaticSprite(0x31203460, 100); - } - - setBackground(0x3E049A95); - setPalette(0x3E049A95); - insertPuzzleMouse(0x49A913E8, 20, 620); - -} - -uint32 Scene2807::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - leaveScene(0); - } - break; - } - return 0; -} - -static const uint32 kScene2808FileHashes1[] = { - 0x90B0392, - 0x90B0192 -}; - -static const uint32 kScene2808FileHashes2[] = { - 0xB0396098, - 0xB0196098 -}; - -static const uint32 kClass428FileHashes[] = { - 0x140022CA, - 0x4C30A602, - 0xB1633402, - 0x12982135, - 0x0540B728, - 0x002A81E3, - 0x08982841, - 0x10982841, - 0x20982841, - 0x40982841, - 0x80982841, - 0x40800711 -}; - -static const int kClass428Countdowns1[] = { - 18, 16, 10, 0 -}; - -static const int kClass428Countdowns2[] = { - 9, 9, 8, 8, 5, 5, 0, 0 -}; - -static const uint32 kClass490FileHashes[] = { - 0x08100071, - 0x24084215, - 0x18980A10 -}; - -static const int16 kClass490FrameIndices1[] = { - 0, 8, 15, 19 -}; - -static const int16 kClass490FrameIndices2[] = { - 0, 4, 8, 11, 15, 17, 19, 0 -}; - -SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex) - : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum), - _testTubeIndex(testTubeIndex) { - - loadSprite(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex], kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1500); - setVisible(false); - SetUpdateHandler(&SsScene2808Dispenser::update); - SetMessageHandler(&SsScene2808Dispenser::handleMessage); -} - -void SsScene2808Dispenser::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown) == 0) { - setVisible(false); - } -} - -uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - sendMessage(_parentScene, 0x2000, _testTubeIndex); - messageResult = 1; - break; - } - return messageResult; -} - -void SsScene2808Dispenser::startCountdown(int index) { - setVisible(true); - updatePosition(); - if (_testTubeSetNum == 0) { - _countdown = kClass428Countdowns1[index]; - } else { - _countdown = kClass428Countdowns2[index]; - } -} - -AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser) - : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser), _fillLevel(0) { - - if (testTubeSetNum == 0) { - _x = 504; - _y = 278; - } else { - setDoDeltaX(1); - _x = 136; - _y = 278; - } - - createSurface1(kClass490FileHashes[testTubeIndex], 1100); - - if (testTubeSetNum == 0) { - loadSound(0, 0x30809E2D); - loadSound(1, 0x72811E2D); - loadSound(2, 0x78B01625); - } else { - loadSound(3, 0x70A41E0C); - loadSound(4, 0x50205E2D); - loadSound(5, 0xF8621E2D); - loadSound(6, 0xF1A03C2D); - loadSound(7, 0x70A43D2D); - loadSound(8, 0xF0601E2D); - } - - startAnimation(kClass490FileHashes[testTubeIndex], 0, -1); - _newStickFrameIndex = 0; - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2808TestTube::handleMessage); - - if (_fillLevel == 0) - setVisible(false); - -} - -uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - fill(); - messageResult = 1; - break; - } - return messageResult; -} - -void AsScene2808TestTube::fill() { - if ((int)_fillLevel < _testTubeSetNum * 3 + 3) { - if (_testTubeSetNum == 0) { - playSound(_fillLevel); - setVisible(true); - startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]); - _newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1]; - } else { - playSound(3 + _fillLevel); - setVisible(true); - startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); - _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; - } - _ssDispenser->startCountdown(_fillLevel); - _fillLevel++; - } -} - -void AsScene2808TestTube::flush() { - if (_fillLevel != 0) { - if (_testTubeSetNum == 0) { - startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], -1); - } else { - startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], -1); - } - _newStickFrameIndex = 0; - _playBackwards = true; - setVisible(true); - } -} - -AsScene2808Handle::AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) - : AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false) { - - loadSound(0, 0xE18D1F30); - _x = 320; - _y = 240; - if (_testTubeSetNum == 1) - setDoDeltaX(1); - createSurface1(0x040900D0, 1300); - startAnimation(0x040900D0, 0, -1); - _needRefresh = true; - _newStickFrameIndex = 0; - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2808Handle::handleMessage); - AnimatedSprite::updatePosition(); -} - -uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (!_isActivated) { - sendMessage(_parentScene, 0x2001, 0); - playSound(0); - activate(); - } - messageResult = 1; - break; - } - return messageResult; -} - -uint32 AsScene2808Handle::hmActivating(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2808Handle::activate() { - startAnimation(0x040900D0, 0, -1); - SetMessageHandler(&AsScene2808Handle::hmActivating); - NextState(&AsScene2808Handle::stActivated); - _isActivated = true; - _newStickFrameIndex = -1; -} - -void AsScene2808Handle::stActivated() { - stopAnimation(); - sendMessage(_parentScene, 0x2002, 0); -} - -AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum) { - - if (testTubeSetNum == 0) { - _x = 312; - _y = 444; - } else { - _x = 328; - _y = 444; - } - createSurface1(0xB8414818, 1200); - startAnimation(0xB8414818, 0, -1); - setVisible(false); - _newStickFrameIndex = 0; - _needRefresh = true; - loadSound(0, 0x6389B652); - SetUpdateHandler(&AnimatedSprite::update); - AnimatedSprite::updatePosition(); -} - -uint32 AsScene2808Flow::hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2808Flow::start() { - startAnimation(0xB8414818, 0, -1); - setVisible(true); - SetMessageHandler(&AsScene2808Flow::hmFlowing); - NextState(&AsScene2808Flow::stKeepFlowing); - playSound(0); -} - -void AsScene2808Flow::stKeepFlowing() { - startAnimation(0xB8414818, 1, -1); - NextState(&AsScene2808Flow::stKeepFlowing); -} - -AsScene2808LightEffect::AsScene2808LightEffect(NeverhoodEngine *vm, int testTubeSetNum) - : AnimatedSprite(vm, 800), _countdown(1) { - - _x = 320; - _y = 240; - if (testTubeSetNum == 1) - setDoDeltaX(1); - createSurface1(0x804C2404, 800); - SetUpdateHandler(&AsScene2808LightEffect::update); - _needRefresh = true; - AnimatedSprite::updatePosition(); -} - -void AsScene2808LightEffect::update() { - if (_countdown != 0 && (--_countdown) == 0) { - int16 frameIndex = _vm->_rnd->getRandomNumber(3 - 1); - startAnimation(0x804C2404, frameIndex, frameIndex); - updateAnim(); - updatePosition(); - _countdown = _vm->_rnd->getRandomNumber(3 - 1) + 1; - } -} - -Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) { - - Sprite *asHandle; - - if (which == 0) - _vm->gameModule()->initTestTubes1Puzzle(); - else - _vm->gameModule()->initTestTubes2Puzzle(); - - SetMessageHandler(&Scene2808::handleMessage); - SetUpdateHandler(&Scene2808::update); - - setBackground(kScene2808FileHashes1[which]); - setPalette(kScene2808FileHashes1[which]); - - asHandle = insertSprite(this, which); - addCollisionSprite(asHandle); - - _asFlow = insertSprite(this, which); - insertSprite(which); - - for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) { - SsScene2808Dispenser *ssDispenser = insertSprite(this, which, testTubeIndex); - addCollisionSprite(ssDispenser); - _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, ssDispenser); - addCollisionSprite(_asTestTubes[testTubeIndex]); - } - - insertScreenMouse(kScene2808FileHashes2[which]); - -} - -uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) { - leaveScene(1); - } - break; - case 0x2000: - if (!_isFlowing) - _asTestTubes[param.asInteger()]->fill(); - break; - case 0x2001: - _isFlowing = true; - break; - case 0x2002: - if (isAnyTestTubeFilled()) { - _leaveResult = 3; - if (!isMixtureGood()) - _leaveResult = 2; - _asFlow->start(); - for (int i = 0; i < 3; i++) - _asTestTubes[i]->flush(); - _mouseCursor->setVisible(false); - _countdown = 16; - } else { - leaveScene(1); - } - break; - } - return 0; -} - -void Scene2808::update() { - - // DEBUG>>> Show correct values - #if 1 - debug("---------------"); - if (_testTubeSetNum == 0) - debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2)); - else - debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)); - debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); - #endif - // DEBUG<<< - - Scene::update(); - if (_countdown != 0 && (--_countdown) == 0) { - leaveScene(_leaveResult); - } -} - -bool Scene2808::isMixtureGood() { - if (_testTubeSetNum == 0) { - return - _asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) && - _asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) && - _asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2); - } else { - return - _asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0) && - _asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1) && - _asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2); - } -} - -bool Scene2808::isAnyTestTubeFilled() { - return - _asTestTubes[0]->getFillLevel() > 0 || - _asTestTubes[1]->getFillLevel() > 0 || - _asTestTubes[2]->getFillLevel() > 0; -} - -AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1200) { - - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2809Spew::handleMessage); - createSurface1(0x04211490, 1200); - _x = 262; - _y = 423; - setDoDeltaX(0); - setVisible(false); -} - -uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - playSound(0, 0x48640244); - startAnimation(0x04211490, 0, -1); - setVisible(true); - break; - case 0x3002: - stopAnimation(); - setVisible(false); - break; - } - return messageResult; -} - -Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - SetMessageHandler(&Scene2809::handleMessage); - SetUpdateHandler(&Scene2809::update); - - loadDataResource(0x1830009A); - loadHitRectList(); - - _pointList = _dataResource.getPointArray(0x064A310E); - - setBackground(0xB22116C5); - setPalette(0xB22116C5); - insertScreenMouse(0x116C1B2A); - - _sprite1 = insertStaticSprite(0x1FA2EB82, 1100); - - _clipRects[0].x1 = _sprite1->getDrawRect().x; - _clipRects[0].y1 = _sprite1->getDrawRect().y; - _clipRects[0].x2 = _sprite1->getDrawRect().x2(); - _clipRects[0].y2 = _sprite1->getDrawRect().y2(); - - _sprite2 = insertStaticSprite(0x037321B2, 1100); - _clipRects[1].y2 = _sprite2->getDrawRect().y2(); - - _sprite3 = insertStaticSprite(0x82022E11, 1100); - - _sprite4 = insertStaticSprite(0x09236252, 1100); - _clipRects[1].x2 = _sprite4->getDrawRect().x2(); - _clipRects[1].y1 = _sprite4->getDrawRect().y; - - tempSprite = insertStaticSprite(0x010C22F2, 1100); - _clipRects[2].x2 = tempSprite->getDrawRect().x2(); - _clipRects[2].y2 = tempSprite->getDrawRect().y2(); - _clipRects[3].y1 = tempSprite->getDrawRect().y2(); - _clipRects[1].x1 = tempSprite->getDrawRect().x2(); - - tempSprite = insertStaticSprite(0x877F6252, 1100); - _clipRects[3].x2 = tempSprite->getDrawRect().x2(); - - insertStaticSprite(0x01612A22, 1100); - insertStaticSprite(0x877F6252, 1100); - - _asSpew = insertSprite(); - _clipRects[2].y1 = 0; - _clipRects[3].y2 = 480; - _clipRects[2].x1 = 0; - _clipRects[3].x1 = 0; - - if (which < 0) { - insertKlaymen(226, 423, false, _clipRects, 4); - setMessageList(0x004B5B90); - } else if (which == 1) { - insertKlaymen(262, 423, false, _clipRects, 4); - setMessageList(0x004B5B90); - } else if (which == 2) { - insertKlaymen(262, 423, false, _clipRects, 4); - setMessageList(0x004B5BD0); - } else if (which == 3) { - insertKlaymen(262, 423, true, _clipRects, 4); - setMessageList(0x004B5BA8, false); - setGlobalVar(V_KLAYMEN_SMALL, 0); - } else { - insertKlaymen(-30, 423, false, _clipRects, 4); - setMessageList(0x004B5B88); - } - - _pointIndex = -1; - findClosestPoint(); - -} - -void Scene2809::update() { - Scene::update(); - findClosestPoint(); -} - -uint32 Scene2809::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x160DA937) { - setMessageList(0x004B5B98); - } - break; - case 0x2000: - sendMessage(_asSpew, 0x2000, 0); - break; - } - return 0; -} - -void Scene2809::findClosestPoint() { - - static const uint32 kScene2809PaletteFileHashes[] = { - 0x04260848, - 0x12970401, - 0x128F0401, - 0x12830401, - 0x12850401, - 0x6A8B9008 - }; - - int16 x = MAX(_klaymen->getX(), 2); - int index = 1; - - while (index < (int)_pointList->size() && (*_pointList)[index].x >= x) - ++index; - --index; - - if (_pointIndex != index) { - _pointIndex = index; - _palette->addPalette(kScene2809PaletteFileHashes[index], 0, 64, 0); - } - -} - -AsScene2810Rope::AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x) - : AnimatedSprite(vm, 1100) { - - createSurface(990, 68, 476); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2810Rope::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - _x = x; - _y = -276; - startAnimation(0x9D098C23, 35, 53); -} - -uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - startAnimation(0x9D098C23, 35, 53); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule) { - - Sprite *tempSprite; - - SetMessageHandler(&Scene2810::handleMessage); - - setBackground(0x26508804); - setPalette(0x26508804); - insertScreenMouse(0x0880026D); - - _sprite6 = insertStaticSprite(0x03615227, 1100); - _sprite5 = insertStaticSprite(0xE059A224, 1100); - - _clipRects[0].x1 = 0; - _clipRects[0].y1 = 0; - _clipRects[0].x2 = 640; - _clipRects[0].y2 = 400; - _clipRects[1].x1 = _sprite5->getDrawRect().x; - _clipRects[1].y1 = 400; - _clipRects[1].x2 = _sprite6->getDrawRect().x2(); - _clipRects[1].y2 = 480; - - if (getGlobalVar(V_KLAYMEN_SMALL)) { - _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); - addCollisionSprite(_asTape); - } else { - _asTape = insertSprite(this, 0, 1100, 245, 429, 0x9148A011); - addCollisionSprite(_asTape); - } - - _sprite1 = insertStaticSprite(0x430001C4, 1200); - - if (getGlobalVar(V_LADDER_DOWN)) { - setGlobalVar(V_BEEN_STATUE_ROOM, 1); - if (getGlobalVar(V_KLAYMEN_SMALL)) { - _sprite4 = insertStaticSprite(0x82653808, 100); - } else { - _sprite4 = insertStaticSprite(0x82653808, 1100); - } - _sprite4->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); - } - - if (which < 0) { - if (getGlobalVar(V_KLAYMEN_SMALL)) { - insertKlaymen(240, 448); - _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); - setMessageList(0x004AE438); - setRectList(0x004AE810); - _isRopingDown = false; - removeCollisionSprite(_asTape); - } else { - insertKlaymen(300, 424, _clipRects, 2); - setMessageList(0x004AE438); - if (getGlobalVar(V_LADDER_DOWN)) - loadDataResource(0x84130112); - else - loadDataResource(0x84500132); - tempSprite = insertSprite(_klaymen); - tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); - _clipRects[0].y1 = _sprite1->getDrawRect().y; - _isRopingDown = false; - } - } else if (which == 1) { - insertKlaymen(186, 64, _clipRects, 2); - setMessageList(0x004AE440); - loadDataResource(0x84130112); - tempSprite = insertSprite(_klaymen); - tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); - _isRopingDown = true; - _clipRects[0].y1 = _sprite1->getDrawRect().y; - } else if (which == 5) { - insertStaticSprite(0xC3007EA0, 100); - _sprite2 = insertStaticSprite(0x02780936, 1100); - _sprite3 = insertStaticSprite(0x1CA02160, 1100); - _asRope = insertSprite(this, 384); - insertKlaymen(384, 0, _clipRects, 0); - sendEntityMessage(_klaymen, 0x1014, _asRope); - setMessageList(0x004AE738); - _klaymen->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); - _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); - _vm->_soundMan->addSound(0x84400112, 0xC874EE6C); - _vm->_soundMan->playSoundLooping(0xC874EE6C); - _vm->_soundMan->setSoundVolume(0xC874EE6C, 50); - _isRopingDown = false; - } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { - if (getGlobalVar(V_KLAYMEN_SMALL)) { - insertKlaymen((int16)getGlobalVar(V_KLAYMEN_SAVED_X), 448); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) - _klaymen->setDoDeltaX(1); - _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); - setMessageList(0x004AE6D8); - setRectList(0x004AE810); - _isRopingDown = false; - removeCollisionSprite(_asTape); - } else { - insertKlaymenLadder(); - if (getGlobalVar(V_LADDER_DOWN_ACTION)) { - setMessageList(0x004AE6E8); - setGlobalVar(V_LADDER_DOWN_ACTION, 0); - _isRopingDown = false; - } else { - setMessageList(0x004AE6D8); - _isRopingDown = false; - } - } - } else if (which >= 15 && which <= 18) { - insertKlaymenLadder(); - setMessageList(0x004AE6E0); - _isRopingDown = false; - } else if (which == 4) { - if (getGlobalVar(V_KLAYMEN_SMALL)) { - insertKlaymen(473, 448); - _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); - setMessageList(0x004AE428); - setRectList(0x004AE810); - _isRopingDown = false; - removeCollisionSprite(_asTape); - } else { - insertKlaymen(450, 424, _clipRects, 2); - setMessageList(0x004AE418); - if (getGlobalVar(V_LADDER_DOWN)) - loadDataResource(0x84130112); - else - loadDataResource(0x84500132); - tempSprite = insertSprite(_klaymen); - tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); - _clipRects[0].y1 = _sprite1->getDrawRect().y; - _isRopingDown = false; - } - } else { - insertKlaymen(120, 448); - _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); - setMessageList(0x004AE410); - setRectList(0x004AE810); - _isRopingDown = false; - removeCollisionSprite(_asTape); - } - -} - -Scene2810::~Scene2810() { - setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); - setGlobalVar(V_KLAYMEN_SAVED_X, _klaymen->getX()); - _vm->_soundMan->deleteSoundGroup(0x84400112); -} - -void Scene2810::insertKlaymenLadder() { - Sprite *tempSprite; - - if (getGlobalVar(V_LADDER_DOWN_ACTION)) { - insertKlaymen(430, 424, _clipRects, 2); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen((int16)getGlobalVar(V_KLAYMEN_SAVED_X), 424, _clipRects, 2); - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) - _klaymen->setDoDeltaX(1); - } - if (getGlobalVar(V_LADDER_DOWN)) - loadDataResource(0x84130112); - else - loadDataResource(0x84500132); - tempSprite = insertSprite(_klaymen); - tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); - _clipRects[0].y1 = _sprite1->getDrawRect().y; -} - -uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0xE574F14C) - setMessageList(0x004AE458); - else if (param.asInteger() == 0x7214A05C || param.asInteger() == 0x2905E574) - setMessageList(0x004AE4A8); - else if (param.asInteger() == 0x7274E24C || param.asInteger() == 0x2D24E572) - setMessageList(0x004AE4D0); - else if (param.asInteger() == 0x4A07A040 || param.asInteger() == 0x190426F5) - setMessageList(0x004AE4F8); - else if (param.asInteger() == 0x6604200C || param.asInteger() == 0x2100E435) - setMessageList(0x004AE520); - else if (param.asInteger() == 0xE216A05C || param.asInteger() == 0x0905EC74) - setMessageList(0x004AE548); - else if (param.asInteger() == 0x721DA05C || param.asInteger() == 0xB905E574) - setMessageList(0x004AE570); - else if (param.asInteger() == 0x6214E09C || param.asInteger() == 0x2D09E474) - setMessageList(0x004AE598); - else if (param.asInteger() == 0x6276A04C || param.asInteger() == 0x0904E472) - setMessageList(0x004AE5C0); - else if (param.asInteger() == 0x6E14A00C || param.asInteger() == 0x2900E4B4) - setMessageList(0x004AE5E8); - else if (param.asInteger() == 0x6014A04D || param.asInteger() == 0x2904F454) - setMessageList(0x004AE610); - else if (param.asInteger() == 0x6215A3C4 || param.asInteger() == 0x393C6474) - setMessageList(0x004AE638); - else if (param.asInteger() == 0x6A54E24D || param.asInteger() == 0x2D24F4F0) - setMessageList(0x004AE660); - else if (param.asInteger() == 0x2064294C || param.asInteger() == 0x2194E053) - setMessageList(0x004AE688); - break; - case 0x2000: - setRectList(0x004AE800); - _isRopingDown = true; - break; - case 0x2001: - if (getGlobalVar(V_LADDER_DOWN)) - loadDataResource(0x84130112); - else - loadDataResource(0x84500132); - _isRopingDown = false; - break; - case 0x4826: - if (sender == _asTape && getGlobalVar(V_KLAYMEN_SMALL) == 0 && !_isRopingDown) { - sendEntityMessage(_klaymen, 0x1014, _asTape); - setMessageList(0x004AE750); - } - break; - } - return messageResult; -} - -AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm) - : AnimatedSprite(vm, 1100) { - - createSurface1(0x20DA08A0, 1200); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2812Winch::handleMessage); - setVisible(false); - _x = 280; - _y = 184; -} - -AsScene2812Winch::~AsScene2812Winch() { - _vm->_soundMan->deleteSoundGroup(0x00B000E2); -} - -uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - startAnimation(0x20DA08A0, 0, -1); - setVisible(true); - _vm->_soundMan->addSound(0x00B000E2, 0xC874EE6C); - _vm->_soundMan->playSoundLooping(0xC874EE6C); - break; - case 0x3002: - startAnimation(0x20DA08A0, 7, -1); - break; - } - return messageResult; -} - -AsScene2812Rope::AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene) - : AnimatedSprite(vm, 1100), _parentScene(parentScene) { - - createSurface(990, 68, 476); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene2812Rope::handleMessage); - SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); - startAnimation(0xAE080551, 0, -1); - _x = 334; - _y = 201; -} - -uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x4806: - setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); - stRopingDown(); - break; - case 0x482A: - sendMessage(_parentScene, 0x1022, 990); - break; - case 0x482B: - sendMessage(_parentScene, 0x1022, 1010); - break; - } - return messageResult; -} - -uint32 AsScene2812Rope::hmRopingDown(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene2812Rope::stRopingDown() { - sendMessage(_parentScene, 0x4806, 0); - startAnimation(0x9D098C23, 0, -1); - SetMessageHandler(&AsScene2812Rope::hmRopingDown); -} - -AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm) - : AnimatedSprite(vm, 0x805D0029, 100, 320, 240) { - - SetMessageHandler(&AsScene2812TrapDoor::handleMessage); - _newStickFrameIndex = 0; -} - -uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2000: - startAnimation(0x805D0029, 0, -1); - playSound(0, 0xEA005F40); - _newStickFrameIndex = STICK_LAST_FRAME; - break; - } - return messageResult; -} - -Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _paletteArea(0) { - - if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) - setGlobalVar(V_KEY3_LOCATION, 3); - - SetMessageHandler(&Scene2812::handleMessage); - SetUpdateHandler(&Scene2812::update); - - setRectList(0x004AF700); - - setBackground(0x03600606); - setPalette(0x03600606); - addEntity(_palette); - _palette->addBasePalette(0x03600606, 0, 256, 0); - - _sprite1 = insertStaticSprite(0x0C06C860, 1100); - insertScreenMouse(0x0060203E); - - if (getGlobalVar(V_KEY3_LOCATION) == 3) { - _asKey = insertSprite(this, 2, 1100, 474, 437); - addCollisionSprite(_asKey); - } - - _ssTape = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); - addCollisionSprite(_ssTape); - - _asWinch = insertSprite(); - _asTrapDoor = insertSprite(); - _asRope = insertSprite(this); - - _sprite2 = insertStaticSprite(0x08478078, 1100); - _sprite3 = insertStaticSprite(0x2203B821, 1100); - _sprite4 = insertStaticSprite(0x08592134, 1100); - - if (which < 0) { - _isRopingDown = false; - insertKlaymen(272, 432); - setMessageList(0x004AF560); - _sprite1->setVisible(false); - _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - } else if (which == 1) { - _isRopingDown = false; - insertKlaymen(338, 398); - setMessageList(0x004AF588); - setPaletteArea1(true); - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); - } else if (which == 2) { - _isRopingDown = false; - if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { - insertKlaymen(554, 432); - _klaymen->setDoDeltaX(1); - } else { - insertKlaymen(394, 432); - } - setMessageList(0x004AF5F0); - _sprite1->setVisible(false); - _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - } else { - _isRopingDown = true; - insertKlaymen(150, 582); - setMessageList(0x004AF568); - setPaletteArea2(true); - _sprite1->setVisible(false); - _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - } - - _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); - -} - -void Scene2812::update() { - if (_klaymen->getX() < 220) - setPaletteArea2(false); - else if (_klaymen->getX() < 240) - setPaletteArea0(false); - Scene::update(); -} - -uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x100D: - if (param.asInteger() == 0x0004269B) - sendEntityMessage(_klaymen, 0x1014, _asRope); - break; - case 0x2001: - _isRopingDown = true; - setRectList(0x004AF710); - _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2()); - break; - case 0x2002: - _isRopingDown = false; - setRectList(0x004AF700); - _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - break; - case 0x4806: - sendMessage(_asWinch, 0x2000, 0); - sendMessage(_asTrapDoor, 0x2000, 0); - break; - case 0x4826: - if (sender == _ssTape && !_isRopingDown) { - sendEntityMessage(_klaymen, 0x1014, _ssTape); - setMessageList(0x004AF658); - } else if (sender == _asKey && !_isRopingDown) { - sendEntityMessage(_klaymen, 0x1014, _asKey); - setMessageList(0x004AF668); - } - break; - case 0x482A: - setPaletteArea1(false); - _sprite1->setVisible(true); - _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); - break; - case 0x482B: - setPaletteArea0(false); - _sprite1->setVisible(false); - _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); - break; - } - return messageResult; -} - -void Scene2812::setPaletteArea0(bool instantly) { - if (_paletteArea != 0) { - _paletteArea = 0; - updatePaletteArea(instantly); - } -} - -void Scene2812::setPaletteArea1(bool instantly) { - if (_paletteArea != 1) { - _paletteArea = 1; - updatePaletteArea(instantly); - } -} - -void Scene2812::setPaletteArea2(bool instantly) { - if (_paletteArea != 2) { - _paletteArea = 2; - updatePaletteArea(instantly); - } -} - -void Scene2812::updatePaletteArea(bool instantly) { - if (_paletteArea == 0) - _palette->addBasePalette(0x05D30F11, 0, 64, 0); - else if (_paletteArea == 1) - _palette->addBasePalette(0x92CA2C9B, 0, 64, 0); - else if (_paletteArea == 2) - _palette->addBasePalette(0x381F92C5, 0, 64, 0); - _palette->startFadeToPalette(instantly ? 0 : 12); -} - -Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _countdown(0), _scrollIndex(0) { - - SetMessageHandler(&Scene2822::handleMessage); - SetUpdateHandler(&Scene2822::update); - _background = new Background(_vm, 0xD542022E, 0, 0); - addBackground(_background); - _background->getSurface()->getDrawRect().y = -10; - setPalette(0xD542022E); - insertPuzzleMouse(0x0028D089, 20, 620); - _ssButton = insertStaticSprite(0x1A4D4120, 1100); - _ssButton->setVisible(false); - loadSound(2, 0x19044E72); -} - -void Scene2822::update() { - - static const int16 kScene2822BackgroundYPositions[] = { - 0, -20, -5, -15, -8, -12, -9, -11, -10, 0 - }; - - Scene::update(); - - if (_countdown != 0) { - if ((--_countdown) == 0) { - if (_countdownStatus == 0) { - _ssButton->setVisible(false); - _countdownStatus = 1; - _countdown = 48; - } else if (_countdownStatus == 1) { - playSound(0, 0x1384CB60); - _countdownStatus = 2; - _countdown = 12; - } else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) { - leaveScene(0); - } - } else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) { - if (_scrollIndex < 9) { - _background->getSurface()->getDrawRect().y = kScene2822BackgroundYPositions[_scrollIndex]; - _scrollIndex++; - } else { - _background->getSurface()->getDrawRect().y = -10; - } - } - } - -} - -uint32 Scene2822::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - leaveScene(0); - } else if (param.asPoint().x >= 257 && param.asPoint().y >= 235 && - param.asPoint().x <= 293 && param.asPoint().y <= 273) { - _ssButton->setVisible(true); - _countdownStatus = 0; - _countdown = 12; - playSound(1, 0x44061000); - if (getGlobalVar(V_LADDER_DOWN) == 0) { - setGlobalVar(V_LADDER_DOWN, 1); - setGlobalVar(V_LADDER_DOWN_ACTION, 1); - SetMessageHandler(NULL); - playSound(2); - _mouseCursor->setVisible(false); - } - } - break; - } - return messageResult; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2800.h b/engines/neverhood/module2800.h deleted file mode 100644 index 970de3cbdf..0000000000 --- a/engines/neverhood/module2800.h +++ /dev/null @@ -1,505 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2800_H -#define NEVERHOOD_MODULE2800_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module2800 - -class Module2800 : public Module { -public: - Module2800(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module2800(); -protected: - int _sceneNum; - uint32 _currentMusicFileHash; - MusicResource *_musicResource; - void createScene(int sceneNum, int which); - void updateScene(); - void updateMusic(bool halfVolume); -}; - -class Scene2801 : public Scene { -public: - Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene2801(); -protected: - Sprite *_asTape; - uint32 _paletteHash; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2802 : public Scene { -public: - Scene2802(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene2802(); -protected: - SmackerPlayer *_smackerPlayer; - uint _currRadioMusicIndex; - int _currTuneStatus; - int _countdown1; - int _countdown2; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void incRadioMusicIndex(int delta); - void changeTuneStatus(int prevTuneStatus, int newTuneStatus); -}; - -class AsScene2803LightCord : public AnimatedSprite { -public: - AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); - void stPulled(); - void stIdle(); - void setFileHashes(uint32 fileHash1, uint32 fileHash2); -protected: - Scene *_parentScene; - uint32 _fileHash1, _fileHash2; - bool _isPulled, _isBusy; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmPulled(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2803TestTubeOne : public AnimatedSprite { -public: - AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2); -protected: - uint32 _fileHash1, _fileHash2; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2803Rope : public AnimatedSprite { -public: - AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmReleased(int messageNum, const MessageParam ¶m, Entity *sender); - void stReleased(); - void stHide(); -}; - -class Scene2803 : public Scene { -public: - Scene2803(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - StaticSprite *_asTestTubeOne; - StaticSprite *_asTestTubeTwo; - StaticSprite *_asTestTubeThree; - Sprite *_asRope; - AsScene2803LightCord *_asLightCord; - StaticSprite *_sprite3; - StaticSprite *_sprite4; - StaticSprite *_sprite5; - StaticSprite *_sprite6; - StaticSprite *_sprite7; - StaticSprite *_sprite8; - StaticSprite *_sprite9; - Sprite *_sprite10; - NRect _clipRectsFloor[2]; - NRect _clipRectsStairs[3]; - int _paletteArea; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void upKlaymenStairs(); - void klaymenStairs(); - void klaymenFloor(); - void toggleBackground(); - void changeBackground(); - void setPaletteArea0(); - void setPaletteArea1(); - void updatePaletteArea(); -}; - -class Scene2803Small : public Scene { -public: - Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - int _paletteArea; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_sprite4; - Sprite *_sprite5; - Sprite *_sprite6; - Sprite *_sprite7; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void upKlaymenSlope(); - void upKlaymenFloor(); - void klaymenSlope(); - void klaymenFloor(); - void setPaletteArea0(); - void setPaletteArea1(); - void setPaletteArea2(); - void setPaletteArea3(); - void updatePaletteArea(bool instantly); -}; - -class Scene2804; - -class SsScene2804RedButton : public StaticSprite { -public: - SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene); -protected: - Scene2804 *_parentScene; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2804LightCoil : public StaticSprite { -public: - SsScene2804LightCoil(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2804BeamCoilBody : public StaticSprite { -public: - SsScene2804BeamCoilBody(NeverhoodEngine *vm); -}; - -class SsScene2804LightTarget : public StaticSprite { -public: - SsScene2804LightTarget(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2804Flash : public StaticSprite { -public: - SsScene2804Flash(NeverhoodEngine *vm); - void show(); -}; - -class AsScene2804CrystalWaves : public AnimatedSprite { -public: - AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex); - void show(); - void hide(); -protected: - uint _crystalIndex; -}; - -class AsScene2804Crystal : public AnimatedSprite { -public: - AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex); - void show(); - void hide(); - void activate(); - int16 getColorNum() const { return _colorNum; } -protected: - AsScene2804CrystalWaves *_asCrystalWaves; - uint _crystalIndex; - int16 _colorNum; - bool _isLightOn; - bool _isShowing; -}; - -class SsScene2804CrystalButton : public StaticSprite { -public: - SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex); -protected: - Scene2804 *_parentScene; - AsScene2804Crystal *_asCrystal; - uint _crystalIndex; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2804BeamCoil : public AnimatedSprite { -public: - AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody); - virtual ~AsScene2804BeamCoil(); -protected: - Scene *_parentScene; - SsScene2804BeamCoilBody *_ssBeamCoilBody; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void show(); - void hide(); - void stBeaming(); - uint32 hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2804BeamTarget : public AnimatedSprite { -public: - AsScene2804BeamTarget(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2804 : public Scene { -public: - Scene2804(NeverhoodEngine *vm, Module *parentModule, int which); - bool isWorking() const { return _isWorking; } -protected: - int _countdown1; - int _countdown2; - int _countdown3; - int _beamStatus; - bool _isSolved; - bool _isWorking; - Sprite *_ssRedButton; - Sprite *_asCoil; - Sprite *_asTarget; - SsScene2804Flash *_ssFlash; - AsScene2804Crystal *_asCrystals[5]; - Sprite *_ssCrystalButtons[5]; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2805 : public Scene { -public: - Scene2805(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_sprite1; - Sprite *_sprite2; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2806Spew : public AnimatedSprite { -public: - AsScene2806Spew(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2806 : public Scene { -public: - Scene2806(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - NPointArray *_pointList; - int _pointIndex; - NRect _clipRects[4]; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_sprite4; - Sprite *_asSpew; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void update(); - void findClosestPoint(); -}; - -class Scene2807 : public Scene { -public: - Scene2807(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2808Dispenser : public StaticSprite { -public: - SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex); - void startCountdown(int index); -protected: - Scene *_parentScene; - int _countdown; - int _testTubeSetNum, _testTubeIndex; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2808TestTube : public AnimatedSprite { -public: - AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser); - void fill(); - void flush(); - uint32 getFillLevel() const { return _fillLevel; } -protected: - SsScene2808Dispenser *_ssDispenser; - int _testTubeSetNum; - uint32 _fillLevel; - int _testTubeIndex; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2808Handle : public AnimatedSprite { -public: - AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum); - void activate(); - void stActivated(); -protected: - Scene *_parentScene; - int _testTubeSetNum; - bool _isActivated; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmActivating(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2808Flow : public AnimatedSprite { -public: - AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum); - void start(); - void stKeepFlowing(); -protected: - Scene *_parentScene; - int _testTubeSetNum; - uint32 hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2808LightEffect : public AnimatedSprite { -public: - AsScene2808LightEffect(NeverhoodEngine *vm, int which); -protected: - int _countdown; - void update(); -}; - -class Scene2808 : public Scene { -public: - Scene2808(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - int _countdown; - int _testTubeSetNum; - AsScene2808Flow *_asFlow; - int _leaveResult; - bool _isFlowing; - AsScene2808TestTube *_asTestTubes[3]; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void update(); - bool isMixtureGood(); - bool isAnyTestTubeFilled(); -}; - -class AsScene2809Spew : public AnimatedSprite { -public: - AsScene2809Spew(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2809 : public Scene { -public: - Scene2809(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - NPointArray *_pointList; - int _pointIndex; - NRect _clipRects[4]; - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_sprite4; - Sprite *_asSpew; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void findClosestPoint(); -}; - -class AsScene2810Rope : public AnimatedSprite { -public: - AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2810 : public Scene { -public: - Scene2810(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Scene2810(); -protected: - Sprite *_sprite1; - Sprite *_sprite2; - Sprite *_sprite3; - Sprite *_asRope; - Sprite *_sprite4; - Sprite *_asTape; - Sprite *_sprite5; - Sprite *_sprite6; - bool _isRopingDown; - NRect _clipRects[2]; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void insertKlaymenLadder(); -}; - -class AsScene2812Winch : public AnimatedSprite { -public: - AsScene2812Winch(NeverhoodEngine *vm); - virtual ~AsScene2812Winch(); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene2812Rope : public AnimatedSprite { -public: - AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene); -protected: - Scene *_parentScene; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - uint32 hmRopingDown(int messageNum, const MessageParam ¶m, Entity *sender); - void stRopingDown(); -}; - -class AsScene2812TrapDoor : public AnimatedSprite { -public: - AsScene2812TrapDoor(NeverhoodEngine *vm); -protected: - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2812 : public Scene { -public: - Scene2812(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_asWinch; - Sprite *_asTrapDoor; - Sprite *_asRope; - Sprite *_sprite3; - Sprite *_sprite2; - Sprite *_sprite4; - Sprite *_ssTape; - Sprite *_asKey; - Sprite *_sprite1; - bool _isRopingDown; - int _paletteArea; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void setPaletteArea0(bool instantly); - void setPaletteArea1(bool instantly); - void setPaletteArea2(bool instantly); - void updatePaletteArea(bool instantly); -}; - -class Scene2822 : public Scene { -public: - Scene2822(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_ssButton; - int _scrollIndex; - int _countdown; - int _countdownStatus; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2800_H */ diff --git a/engines/neverhood/module2900.cpp b/engines/neverhood/module2900.cpp deleted file mode 100644 index 1e14d37fd5..0000000000 --- a/engines/neverhood/module2900.cpp +++ /dev/null @@ -1,439 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module2900.h" -#include "neverhood/gamemodule.h" -#include "neverhood/module1100.h" -#include "neverhood/module1300.h" -#include "neverhood/module1700.h" -#include "neverhood/module2000.h" -#include "neverhood/module2100.h" -#include "neverhood/module2800.h" - -namespace Neverhood { - -Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule) { - - if (which >= 0) - setGlobalVar(V_TELEPORTER_WHICH, which); - - createScene(0, 0); - -} - -void Module2900::createScene(int sceneNum, int which) { - debug("Module2900::createScene(%d, %d)", sceneNum, which); - _sceneNum = sceneNum; - switch (_sceneNum) { - case 0: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2901(_vm, this, getGlobalVar(V_TELEPORTER_WHICH)); - break; - case 1: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2805(_vm, this, which); - break; - case 2: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2101(_vm, this, which); - break; - case 3: - _vm->gameState().sceneNum = 0; - _childObject = new Scene1306(_vm, this, which); - break; - case 4: - _vm->gameState().sceneNum = 0; - _childObject = new Scene1705(_vm, this, which); - break; - case 5: - _vm->gameState().sceneNum = 0; - _childObject = new Scene1109(_vm, this, which); - break; - case 6: - _vm->gameState().sceneNum = 0; - _childObject = new Scene2001(_vm, this, which); - break; - } - SetUpdateHandler(&Module2900::updateScene); - _childObject->handleUpdate(); -} - -void Module2900::updateScene() { - if (!updateChild()) { - switch (_sceneNum) { - case 0: - if (_moduleResult == (uint32)-1) { - leaveModule((uint32)-1); - } else { - _teleporterModuleResult = _moduleResult; - switch (getGlobalVar(V_TELEPORTER_WHICH)) { - case 0: - createScene(3, 4); - break; - case 1: - createScene(2, 2); - break; - case 2: - createScene(5, 2); - break; - case 3: - createScene(4, 2); - break; - case 4: - createScene(6, 2); - break; - case 5: - createScene(1, 2); - break; - default: - leaveModule(_moduleResult); - break; - } - } - break; - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - leaveModule(_teleporterModuleResult); - break; - } - } -} - -static const uint32 kScene2901FileHashes1[] = { - 0x023023B4, - 0x36204507, - 0x046CF08E, - 0x9313A237, - 0xA651F246, - 0x02108034 -}; - -static const uint32 kScene2901FileHashes2[] = { - 0x023B002B, - 0x0450336A, - 0xCF08A04E, - 0x3A233939, - 0x1F242A6D, - 0x08030029 -}; - -static const uint32 kSsScene2901LocationButtonFileHashes[] = { - 0x2311326A, - 0x212323AC, - 0x10098138, - 0x25213167, - 0x1119A363, - 0x94452612, - 0x39464212, - 0x01860450, - 0x53002104, - 0x58E68412, - 0x18600300, - 0xB650A890, - 0x2452A7C4, - 0xA0232748, - 0x08862B02, - 0x2491E648, - 0x0010EB46, - 0x214C8A11, - 0x16A31921, - 0x0AC33A00, - 0x238028AA, - 0x26737A21, - 0x063039A8, - 0x51286C60, - 0x464006B4, - 0x42242538, - 0x20716010, - 0x4A2000AE, - 0x225124A6, - 0x28E82E45, - 0x58652C04, - 0xC82210A4, - 0x62A84060, - 0xC0693CB4, - 0x22212C64, - 0x5034EA71 -}; - -static const NPoint kSsScene2901LocationButtonPoints[] = { - {525, 120}, {576, 149}, {587, 205}, - {538, 232}, {484, 205}, {479, 153} -}; - -static const uint32 kSsScene2901LocationButtonLightFileHashes1[] = { - 0x03136246, - 0x2106216E, - 0x4025A13A, - 0x21816927, - 0x110B2202, - 0xCC0522B2, - 0x3CC24258, - 0x59C600F0, - 0x534A2480, - 0x50E61019, - 0x34400150, - 0x225BA090, - 0xB059AFC4, - 0xE093A741, - 0x0086BF09, - 0x3281E760, - 0xA048AB42, - 0x20649C01, - 0x14611904, - 0x26E33850, - 0x23A52A68, - 0xA2733024, - 0x10203880, - 0x1B2DE860, - 0x0644A6EC, - 0x426E20BC, - 0x80292014, - 0x4360B02E, - 0x22742664, - 0x98682705, - 0x0925B82C, - 0x5C2918A4, - 0xD2284920, - 0x41083CA6, - 0x6824A864, - 0x50266B10 -}; - -static const uint32 kSsScene2901LocationButtonLightFileHashes2[] = { - 0x43C46D4C, - 0x43C4AD4C, - 0x43C52D4C, - 0x43C62D4C, - 0x43C02D4C, - 0x43CC2D4C -}; - -static const uint32 kSsScene2901BrokenButtonFileHashes[] = { - 0x3081BD3A, - 0xD3443003, - 0x0786A320, - 0xE3A22029, - 0x61611814, - 0x425848E2 -}; - -static const uint32 kSsScene2901BigButtonFileHashes[] = { - 0x010D7748, - 0x9D02019A, - 0x351A2F43, - 0x448138E5, - 0x02788CF0, - 0x71718024 -}; - -SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index) - : StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) { - - const NPoint &pt = kSsScene2901LocationButtonPoints[_index]; - - loadSprite(kSsScene2901LocationButtonFileHashes[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 800); - _collisionBounds.set(pt.x - 25, pt.y - 25, pt.x + 25, pt.y + 25); - setVisible(false); - loadSound(0, 0x440430C0); - SetUpdateHandler(&SsScene2901LocationButton::update); - SetMessageHandler(&SsScene2901LocationButton::handleMessage); -} - -void SsScene2901LocationButton::update() { - updatePosition(); - if (_countdown1 != 0 && (--_countdown1) == 0) { - setVisible(false); - } -} - -uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown1 == 0) { - playSound(0); - setVisible(true); - _countdown1 = 4; - sendMessage(_parentScene, 0x2001, _index); - } - messageResult = 1; - break; - } - return messageResult; -} - -SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index) - : StaticSprite(vm, 900), _index(index) { - - loadSprite(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 900); - setVisible(false); - loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]); -} - -void SsScene2901LocationButtonLight::show() { - playSound(0); - setVisible(true); - updatePosition(); -} - -void SsScene2901LocationButtonLight::hide() { - setVisible(false); - updatePosition(); -} - -SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which) - : StaticSprite(vm, 900) { - - loadSprite(kSsScene2901BrokenButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 900); -} - -SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which) - : StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) { - - loadSprite(kSsScene2901BigButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 400); - _collisionBounds.set(62, 94, 322, 350); - setVisible(false); - loadSound(0, 0xF3D420C8); - SetUpdateHandler(&SsScene2901BigButton::update); - SetMessageHandler(&SsScene2901BigButton::handleMessage); -} - -void SsScene2901BigButton::update() { - updatePosition(); - if (_countdown1 != 0 && (--_countdown1) == 0) { - setVisible(false); - sendMessage(_parentScene, 0x2000, 0); - } -} - -uint32 SsScene2901BigButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown1 == 0) { - playSound(0); - setVisible(true); - _countdown1 = 4; - } - messageResult = 1; - break; - } - return messageResult; -} - -Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _currLocationButtonNum(which), _selectedButtonNum(which), - _currWhirlButtonNum(0), _prevWhirlButtonNum(0), _countdown1(1), _skipCountdown(0), _blinkOn(0) { - - _isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0; - - setSubVar(V_TELEPORTER_DEST_AVAILABLE, which, 1); - setSubVar(V_TELEPORTER_DEST_AVAILABLE, 5, 1); - setSubVar(V_TELEPORTER_DEST_AVAILABLE, 4, 1); - - if (_currLocationButtonNum == 3) - setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1); - - setBackground(kScene2901FileHashes1[_currLocationButtonNum]); - setPalette(kScene2901FileHashes1[_currLocationButtonNum]); - - for (uint i = 0; i < 6; ++i) { - if (i != 2 || !_isButton2Broken) { - _ssLocationButtons[i] = insertSprite(this, _currLocationButtonNum, i); - addCollisionSprite(_ssLocationButtons[i]); - _ssLocationButtonLights[i] = insertSprite(_currLocationButtonNum, i); - } - } - - if (_isButton2Broken) - insertSprite(_currLocationButtonNum); - - _ssBigButton = insertSprite(this, _currLocationButtonNum); - addCollisionSprite(_ssBigButton); - - insertPuzzleMouse(kScene2901FileHashes2[_currLocationButtonNum], 20, 620); - - SetUpdateHandler(&Scene2901::update); - SetMessageHandler(&Scene2901::handleMessage); - -} - -void Scene2901::update() { - Scene::update(); - if (_countdown1 != 0 && (--_countdown1) == 0) { - if (_currLocationButtonNum == _selectedButtonNum) { - _ssLocationButtonLights[_currWhirlButtonNum]->hide(); - ++_currWhirlButtonNum; - while (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) { - ++_currWhirlButtonNum; - if (_currWhirlButtonNum >= 6) - _currWhirlButtonNum = 0; - } - if (_currWhirlButtonNum != _prevWhirlButtonNum || _skipCountdown == 0) { - _ssLocationButtonLights[_currWhirlButtonNum]->show(); - _skipCountdown = 4; - } - _countdown1 = 2; - --_skipCountdown; - _prevWhirlButtonNum = _currWhirlButtonNum; - } else if (_blinkOn) { - _blinkOn = false; - _ssLocationButtonLights[_selectedButtonNum]->hide(); - _countdown1 = 16; - } else { - _blinkOn = true; - _ssLocationButtonLights[_selectedButtonNum]->show(); - _countdown1 = 4; - } - } -} - -uint32 Scene2901::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) - leaveScene((uint32)-1); - break; - case 0x2000: - if (_currLocationButtonNum != _selectedButtonNum) - leaveScene(_selectedButtonNum); - break; - case 0x2001: - if (_currLocationButtonNum == _selectedButtonNum) - _selectedButtonNum = _currWhirlButtonNum; - _ssLocationButtonLights[_selectedButtonNum]->hide(); - _selectedButtonNum = param.asInteger(); - if (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _selectedButtonNum)) - _selectedButtonNum = _currLocationButtonNum; - break; - } - return 0; -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module2900.h b/engines/neverhood/module2900.h deleted file mode 100644 index 19514399e5..0000000000 --- a/engines/neverhood/module2900.h +++ /dev/null @@ -1,102 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE2900_H -#define NEVERHOOD_MODULE2900_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" - -namespace Neverhood { - -// Module2900 - -class Module2900 : public Module { -public: - Module2900(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - int _sceneNum; - int _teleporterModuleResult; - void createScene(int sceneNum, int which); - void updateScene(); - void updateMusic(bool halfVolume); -}; - -class SsScene2901LocationButton : public StaticSprite { -public: - SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index); -protected: - Scene *_parentScene; - uint _index; - int _countdown1; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene2901LocationButtonLight : public StaticSprite { -public: - SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index); - void show(); - void hide(); -protected: - uint _index; -}; - -class SsScene2901BrokenButton : public StaticSprite { -public: - SsScene2901BrokenButton(NeverhoodEngine *vm, int which); -}; - -class SsScene2901BigButton : public StaticSprite { -public: - SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which); -protected: - Scene *_parentScene; - int _which; - int _countdown1; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene2901 : public Scene { -public: - Scene2901(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_ssLocationButtons[6]; - SsScene2901LocationButtonLight *_ssLocationButtonLights[6]; - Sprite *_ssBigButton; - int _currWhirlButtonNum; - int _prevWhirlButtonNum; - int _countdown1; - int _currLocationButtonNum; - int _selectedButtonNum; - int _skipCountdown; - int _blinkOn; - bool _isButton2Broken; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE2900_H */ diff --git a/engines/neverhood/module3000.cpp b/engines/neverhood/module3000.cpp deleted file mode 100644 index d08ff9d6ae..0000000000 --- a/engines/neverhood/module3000.cpp +++ /dev/null @@ -1,1548 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#include "neverhood/module3000.h" -#include "neverhood/gamemodule.h" -#include "neverhood/navigationscene.h" - -namespace Neverhood { - -static const uint32 kModule3000SoundList[] = { - 0x92025040, - 0x90035066, - 0x90815450, - 0x99801500, - 0x90E14440, - 0x16805048, - 0x90F0D1C3, - 0 -}; - -Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) - : Module(vm, parentModule), _soundVolume(0) { - - _vm->_soundMan->addSoundList(0x81293110, kModule3000SoundList); - _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 50, 600, 5, 150); - _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000); - _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); - _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - - _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; - - if (_isWallBroken) { - _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); - _vm->_soundMan->playSoundLooping(0x90F0D1C3); - } - - if (which < 0) { - createScene(_vm->gameState().sceneNum, -1); - } else if (which == 0) { - createScene(1, 0); - } else if (which == 1) { - createScene(4, 2); - } else if (which == 2) { - createScene(4, 1); - } else if (which == 3) { - createScene(5, 1); - } - -} - -Module3000::~Module3000() { - _vm->_soundMan->deleteGroup(0x81293110); -} - -void Module3000::createScene(int sceneNum, int which) { - static const byte kNavigationTypes05[] = {3, 0}; - static const byte kNavigationTypes06[] = {5}; - debug("Module3000::createScene(%d, %d)", sceneNum, which); - _vm->gameState().sceneNum = sceneNum; - switch (_vm->gameState().sceneNum) { - case 1: - if (!getGlobalVar(V_BOLT_DOOR_OPEN)) { - createNavigationScene(0x004B7C80, which); - } else if (getGlobalVar(V_WALL_BROKEN)) { - createNavigationScene(0x004B7CE0, which); - } else { - createNavigationScene(0x004B7CB0, which); - } - break; - case 2: - _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); - if (_isWallBroken) { - _soundVolume = 90; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, 90); - } - if (getGlobalVar(V_WALL_BROKEN)) { - createNavigationScene(0x004B7D58, which); - } else { - createNavigationScene(0x004B7D10, which); - } - break; - case 3: - if (getGlobalVar(V_STAIRS_DOWN)) - createNavigationScene(0x004B7E60, which); - else if (getGlobalVar(V_WALL_BROKEN)) - createNavigationScene(0x004B7DA0, which); - else - createNavigationScene(0x004B7E00, which); - break; - case 4: - if (getGlobalVar(V_STAIRS_DOWN)) - createNavigationScene(0x004B7F20, which); - else - createNavigationScene(0x004B7EC0, which); - break; - case 5: - createNavigationScene(0x004B7F80, which, kNavigationTypes05); - break; - case 6: - createNavigationScene(0x004B7FB0, which, kNavigationTypes06); - break; - case 7: - _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); - if (!getSubVar(VA_IS_PUZZLE_INIT, 0x089809C2)) { - setSubVar(VA_IS_PUZZLE_INIT, 0x089809C2, 1); - createSmackerScene(0x90022001, true, true, false); - } else - createSmackerScene(0x98022001, true, true, false); - break; - case 8: - _childObject = new Scene3009(_vm, this, which); - break; - case 9: - _childObject = new Scene3010(_vm, this, 0); - break; - case 10: - _childObject = new Scene3011(_vm, this, 0); - break; - case 11: - _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); - if (!getSubVar(VA_IS_PUZZLE_INIT, 0x10130993)) { - setSubVar(VA_IS_PUZZLE_INIT, 0x10130993, 1); - createSmackerScene(0x31093019, true, true, false); - } else - createSmackerScene(0x20093019, true, true, false); - break; - case 12: - _childObject = new Scene3010(_vm, this, 1); - break; - // NOTE: Newly introduced sceneNums - case 1001: - if (!getGlobalVar(V_BOLT_DOOR_OPEN)) - if (getGlobalVar(V_WALL_BROKEN)) - createSmackerScene(0x00940021, true, true, false); - else - createSmackerScene(0x01140021, true, true, false); - else - if (getGlobalVar(V_WALL_BROKEN)) - createSmackerScene(0x001011B1, true, true, false); - else - createSmackerScene(0x001021B1, true, true, false); - setGlobalVar(V_BOLT_DOOR_OPEN, getGlobalVar(V_BOLT_DOOR_OPEN) ? 0 : 1); - break; - case 1006: - createSmackerScene(0x080810C5, true, true, false); - break; - case 1008: - createSmackerScene(getGlobalVar(V_CANNON_SMACKER_NAME), true, true, false); - break; - } - SetUpdateHandler(&Module3000::updateScene); - _childObject->handleUpdate(); -} - -void Module3000::updateScene() { - if (!updateChild()) { - switch (_vm->gameState().sceneNum) { - case 1: - if (!getGlobalVar(V_BOLT_DOOR_OPEN)) { - if (_moduleResult == 0) - createScene(9, -1); - else if (_moduleResult == 1) - leaveModule(0); - } else { - if (_moduleResult == 0) - if (_navigationAreaType == 2) - createScene(2, 0); - else - createScene(1001, -1); - else if (_moduleResult == 1) - leaveModule(0); - } - break; - case 2: - _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - if (_isWallBroken) { - _soundVolume = 0; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); - } - if (_moduleResult == 0) { - createScene(3, 0); - } else if (_moduleResult == 1) { - setGlobalVar(V_BOLT_DOOR_OPEN, 0); - createScene(1, 1); - } - break; - case 3: - if (_moduleResult == 1) - createScene(4, 0); - else if (_moduleResult == 3) - createScene(10, -1); - else if (getGlobalVar(V_STAIRS_DOWN)) - createScene(5, 0); - else - createScene(2, 1); - break; - case 4: - if (_moduleResult == 0) - leaveModule(1); - else if (_moduleResult == 1) - createScene(7, -1); - else if (_moduleResult == 2) - createScene(3, 3); - break; - case 5: - if (_moduleResult == 0) - createScene(6, 0); - else if (_moduleResult == 1) - createScene(3, 0); - break; - case 6: - if (_navigationAreaType == 4) - createScene(11, -1); - else - createScene(1006, -1); - break; - case 7: - createScene(8, -1); - break; - case 8: - _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; - if (_moduleResult != 1) { - _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); - createScene(4, 1); - } else if (getGlobalVar(V_CANNON_SMACKER_NAME)) { - createScene(1008, -1); - } else { - _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); - createScene(4, 1); - } - break; - case 9: - if (_moduleResult == 0 || _moduleResult == 2) - createScene(1, 0); - else if (_moduleResult == 1) - createScene(1001, -1); - break; - case 10: - createScene(3, 3); - break; - case 11: - leaveModule(3); - break; - case 12: - createScene(1, 0); - break; - case 1001: - if (getGlobalVar(V_BOLT_DOOR_OPEN)) - createScene(1, 0); - else - createScene(12, -1); - break; - case 1006: - createScene(5, 0); - break; - case 1008: - createScene(8, -1); - break; - } - } else { - switch (_vm->gameState().sceneNum) { - case 1: - if (navigationScene()->isWalkingForward()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getNavigationIndex(); - if (navigationIndex == 1) { - if (frameNumber == 0) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 70); - _vm->_soundMan->setSoundVolume(0x50399F64, 70); - } else if (frameNumber == 100) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - } - } else if (navigationIndex == 0) { - if (frameNumber == 0) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 70); - _vm->_soundMan->setSoundVolume(0x50399F64, 70); - } else if (frameNumber == 10) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); - } - if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) { - if (frameNumber == 0) - _soundVolume = 40; - else - _soundVolume++; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); - } - } - } - break; - case 2: - if (navigationScene()->isWalkingForward()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getNavigationIndex(); - if (_isWallBroken && _soundVolume > 1 && frameNumber % 2) { - _soundVolume--; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); - } - if (navigationIndex == 0) { - if (frameNumber == 35) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); - } - } else if (navigationIndex == 1) { - if (frameNumber == 55) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); - _vm->_soundMan->setSoundVolume(0x48498E46, 70); - _vm->_soundMan->setSoundVolume(0x50399F64, 70); - } - } - } - break; - case 3: - if (navigationScene()->isWalkingForward()) { - uint32 frameNumber = navigationScene()->getFrameNumber(); - int navigationIndex = navigationScene()->getNavigationIndex(); - if (navigationIndex == 2) { - if (frameNumber == 40) { - _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); - } - if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) { - if (frameNumber == 0) - _soundVolume = 40; - else - _soundVolume++; - _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); - } - } - } - break; - case 5: - if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0) { - _vm->_soundMan->setTwoSoundsPlayFlag(false); - } - break; - } - } -} - -// Scene3009 - -enum { - kCTSNull = 0, - kCTSBreakWall = 1, - kCTSWall = 2, - kCTSEmptyness = 3, - kCTSFireRobotNoTarget = 4, - kCTSFireRobotIsTarget = 5, - kCTSFireNoRobot = 6, - kCTSRaiseCannon = 7, - kCTSRightRobotNoTarget = 8, - kCTSRightRobotIsTarget = 9, - kCTSRightNoRobot = 10, - kCTSLeftRobotNoTarget = 11, - kCTSLeftRobotIsTarget = 12, - kCTSLeftNoRobot = 13, - kCTSLowerCannon = 14, - kCTSCount = 14 -}; - -static const uint32 kScene3009CannonScopeVideos[] = { - 0x1010000D, - 0x340A0049, - 0x340A0049, - 0x0282081D, - 0x0082080D, - 0x0882080D, - 0x0882080D, - 0x0282081D, - 0x004B000B, - 0x014B000B, - 0x044B000B, - 0x0282081D, - 0x0282081D, - 0x0282081D, - 0x340A0049 -}; - -static const uint32 kScene3009CannonActionVideos[] = { - 0x00000000, - 0x8004001B, // 1 Fire cannon at wall, it breaks (lowered) - 0x0004001A, // 2 Fire cannon at wall, nothing happens (lowered) - 0x1048404B, // 3 Fire cannon at emptyness (raised) - 0x50200109, // 4 Fire cannon, robot missed (raised) - 0x12032109, // 5 Fire cannon, robot hit (raised) - 0x10201109, // 6 Fire cannon, no robot (raised) - 0x000A2030, // 7 Raise the cannon - 0x000A0028, // 8 - 0x000A0028, // 9 - 0x000A0028, // 10 - 0x040A1069, // 11 - 0x040A1069, // 12 - 0x040A1069, // 13 - 0x240A1101 // 14 Lower the cannon -}; - -static const uint32 kSsScene3009SymbolEdgesFileHashes[] = { - 0x618827A0, - 0xB1A92322 -}; - -static const uint32 kSsScene3009TargetLineFileHashes[] = { - 0x4011018C, - 0x15086623 -}; - -static const NPoint kAsScene3009SymbolPoints[] = { - {289, 338}, - {285, 375}, - {284, 419}, - {456, 372}, - {498, 372}, - {541, 372} -}; - -static const uint32 kAsScene3009SymbolFileHashes[] = { - 0x24542582, - 0x1CD61D96 -}; - -static const uint32 kSsScene3009SymbolArrowFileHashes1[] = { - 0x24016060, - 0x21216221, - 0x486160A0, - 0x42216422, - 0x90A16120, - 0x84216824, - 0x08017029, - 0x08217029, - 0x10014032, - 0x10214032, - 0x20012004, - 0x20212004 -}; - -static const uint32 kSsScene3009SymbolArrowFileHashes2[] = { - 0x40092024, - 0x01636002, - 0x8071E028, - 0x02A56064, - 0x00806031, - 0x052960A8, - 0x0A116130, - 0x0A316130, - 0x14216200, - 0x14016200, - 0x28416460, - 0x28616460 -}; - -SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene) - : StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) { - - loadSprite(0x120B24B0, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - setVisible(false); - SetUpdateHandler(&SsScene3009FireCannonButton::update); - SetMessageHandler(&SsScene3009FireCannonButton::handleMessage); - loadSound(0, 0x3901B44F); -} - -void SsScene3009FireCannonButton::update() { - updatePosition(); - if (_isClicked && !isSoundPlaying(0)) { - sendMessage(_parentScene, 0x2000, 0); - setVisible(false); - } -} - -uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (!_isClicked && !_parentScene->isTurning()) { - _isClicked = true; - setVisible(true); - playSound(0); - } - messageResult = 1; - break; - } - return messageResult; -} - -SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) - : StaticSprite(vm, 1400), _blinkCountdown(0) { - - loadSprite(kSsScene3009SymbolEdgesFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600); - if (getGlobalVar(V_ROBOT_HIT)) - hide(); - else - startBlinking(); - SetUpdateHandler(&SsScene3009SymbolEdges::update); -} - -void SsScene3009SymbolEdges::update() { - if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) { - if (_blinkToggle) { - setVisible(true); - } else { - setVisible(false); - } - updatePosition(); - _blinkCountdown = 3; - _blinkToggle = !_blinkToggle; - } -} - -void SsScene3009SymbolEdges::show() { - setVisible(true); - updatePosition(); - _blinkCountdown = 0; -} - -void SsScene3009SymbolEdges::hide() { - setVisible(false); - updatePosition(); - _blinkCountdown = 0; -} - -void SsScene3009SymbolEdges::startBlinking() { - setVisible(true); - updatePosition(); - _blinkCountdown = 3; - _blinkToggle = true; -} - -SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) - : StaticSprite(vm, 1400) { - - loadSprite(kSsScene3009TargetLineFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600); - setVisible(false); -} - -void SsScene3009TargetLine::show() { - setVisible(true); - updatePosition(); -} - -SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index) - : StaticSprite(vm, 1400), _asSymbol(asSymbol), _index(index), _enabled(true), _countdown(0) { - - _incrDecr = _index % 2; - - createSurface(1200, 33, 31); - loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefPosition); - _drawOffset.set(0, 0, 33, 31); - _collisionBoundsOffset = _drawOffset; - updateBounds(); - _needRefresh = true; - - SetUpdateHandler(&SsScene3009SymbolArrow::update); - SetMessageHandler(&SsScene3009SymbolArrow::handleMessage); - loadSound(0, 0x2C852206); -} - -void SsScene3009SymbolArrow::hide() { - _enabled = false; - setVisible(false); -} - -void SsScene3009SymbolArrow::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) { - loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefDrawOffset); - } -} - -uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_enabled && _countdown == 0) { - _countdown = 2; - loadSprite(kSsScene3009SymbolArrowFileHashes1[_index], kSLFDefDrawOffset); - playSound(0); - sendMessage(_asSymbol, 0x2005, _incrDecr); - } - messageResult = 1; - break; - } - return messageResult; -} - -AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index) - : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { - - _x = 300; - _y = getGlobalVar(V_CANNON_RAISED) ? 52 : 266; - createSurface1(0xC2463913, 1200); - _needRefresh = true; - updatePosition(); - setVisible(false); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage); -} - -void AsScene3009VerticalIndicator::show() { - startAnimation(0xC2463913, 0, -1); - setVisible(true); - updatePosition(); - _enabled = true; -} - -uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_enabled) { - sendMessage(_parentScene, 0x2002, 0); - } - messageResult = 1; - break; - } - return messageResult; -} - -AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus) - : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { - - _x = getGlobalVar(V_CANNON_TURNED) ? 533 : 92; - _y = 150; - createSurface1(0xC0C12954, 1200); - _needRefresh = true; - updatePosition(); - setVisible(false); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage); - if (cannonTargetStatus == kCTSRightRobotNoTarget || cannonTargetStatus == kCTSRightRobotIsTarget || cannonTargetStatus == kCTSRightNoRobot) { - SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); - _x = 280; - } -} - -uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_enabled) { - sendMessage(_parentScene, 0x2004, 0); - } - messageResult = 1; - break; - } - return messageResult; -} - -void AsScene3009HorizontalIndicator::suMoveLeft() { - _x -= 6; - if (_x < 92) { - SetSpriteUpdate(NULL); - _x = 92; - } -} - -void AsScene3009HorizontalIndicator::suMoveRight() { - _x += 6; - if (_x > 533) { - SetSpriteUpdate(NULL); - _x = 533; - } -} - -void AsScene3009HorizontalIndicator::show() { - startAnimation(0xC0C12954, 0, -1); - setVisible(true); - updatePosition(); - _enabled = true; -} - -void AsScene3009HorizontalIndicator::stMoveLeft() { - _x = 533; - SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveLeft); -} - -void AsScene3009HorizontalIndicator::stMoveRight() { - _x = 330; - SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); -} - -AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _symbolPosition(symbolPosition) { - - _symbolIndex = getSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition); - - _x = kAsScene3009SymbolPoints[_symbolPosition].x; - _y = kAsScene3009SymbolPoints[_symbolPosition].y; - createSurface1(kAsScene3009SymbolFileHashes[_symbolPosition / 3], 1200); - startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); - _newStickFrameIndex = _symbolIndex; - _needRefresh = true; - updatePosition(); - SetUpdateHandler(&AnimatedSprite::update); - SetMessageHandler(&AsScene3009Symbol::handleMessage); - _ssArrowPrev = _parentScene->insertSprite(this, _symbolPosition * 2 + 0); - _parentScene->addCollisionSprite(_ssArrowPrev); - _ssArrowNext = _parentScene->insertSprite(this, _symbolPosition * 2 + 1); - _parentScene->addCollisionSprite(_ssArrowNext); -} - -uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x2005: - if (param.asInteger()) { - if (_symbolIndex == 11) - _symbolIndex = 0; - else - _symbolIndex++; - } else { - if (_symbolIndex == 0) - _symbolIndex = 11; - else - _symbolIndex--; - } - startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); - _newStickFrameIndex = _symbolIndex; - setSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition, _symbolIndex); - if (_symbolPosition / 3 == 0) { - sendMessage(_parentScene, 0x2001, 0); - } else { - sendMessage(_parentScene, 0x2003, 0); - } - messageResult = 1; - break; - } - return messageResult; -} - -void AsScene3009Symbol::hide() { - _ssArrowPrev->hide(); - _ssArrowNext->hide(); -} - -Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _keepVideo(false), _moveCannonLeftFirst(false), - _isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { - - _cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS); - - _vm->gameModule()->initCannonSymbolsPuzzle(); - - setGlobalVar(V_CANNON_SMACKER_NAME, 0); - - _vm->_screen->clear(); - - setBackground(0xD000420C); - setPalette(0xD000420C); - insertPuzzleMouse(0x04208D08, 20, 620); - - _ssFireCannonButton = insertSprite(this); - addCollisionSprite(_ssFireCannonButton); - - _asVerticalIndicator = insertSprite(this, _cannonTargetStatus); - addCollisionSprite(_asVerticalIndicator); - - _asHorizontalIndicator = insertSprite(this, _cannonTargetStatus); - addCollisionSprite(_asHorizontalIndicator); - - if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) { - _keepVideo = true; - } else { - _keepVideo = false; - if (_cannonTargetStatus != kCTSNull) { - _asHorizontalIndicator->stMoveRight(); - _isTurning = true; - } - } - - _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009CannonScopeVideos[_cannonTargetStatus], false, _keepVideo)); - _smackerPlayer->setDrawPos(89, 37); - _palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage - - insertStaticSprite(0x8540252C, 400); - - for (int i = 0; i < 2; i++) { - _ssSymbolEdges[i] = insertSprite(i); - _ssTargetLines[i] = insertSprite(i); - } - - for (int symbolPosition = 0; symbolPosition < 6; symbolPosition++) { - _asSymbols[symbolPosition] = insertSprite(this, symbolPosition); - if (symbolPosition < 3) - _correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_1, symbolPosition); - else - _correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_2, symbolPosition - 3); - } - - SetMessageHandler(&Scene3009::handleMessage); - SetUpdateHandler(&Scene3009::update); - - // DEBUG Enable to set the correct code -#if 0 - for (int i = 0; i < 6; i++) - setSubVar(VA_CURR_CANNON_SYMBOLS, i, _correctSymbols[i]); - sendMessage(this, 0x2003, 0); -#endif - -} - -void Scene3009::update() { - Scene::update(); - - if (!_keepVideo && _smackerPlayer->isDone() && _cannonTargetStatus <= kCTSCount) { - switch (_cannonTargetStatus) { - case kCTSNull: - case kCTSLowerCannon: - _smackerPlayer->open(0x340A0049, true); - _palette->usePalette(); - _keepVideo = true; - break; - case kCTSRightRobotNoTarget: - _smackerPlayer->open(0x0082080D, true); - _palette->usePalette(); - _keepVideo = true; - _isTurning = false; - break; - case kCTSRightRobotIsTarget: - _smackerPlayer->open(0x0282080D, true); - _palette->usePalette(); - _keepVideo = true; - _isTurning = false; - break; - case kCTSRightNoRobot: - _smackerPlayer->open(0x0882080D, true); - _palette->usePalette(); - _keepVideo = true; - _isTurning = false; - break; - case kCTSLeftRobotNoTarget: - case kCTSLeftRobotIsTarget: - case kCTSLeftNoRobot: - if (_moveCannonLeftFirst) { - if (_cannonTargetStatus == kCTSLeftRobotNoTarget) - _smackerPlayer->open(0x110A000F, false); - else if (_cannonTargetStatus == kCTSLeftRobotIsTarget) - _smackerPlayer->open(0x500B004F, false); - else if (_cannonTargetStatus == kCTSLeftNoRobot) - _smackerPlayer->open(0x100B010E, false); - _palette->usePalette(); - _moveCannonLeftFirst = false; - _asHorizontalIndicator->stMoveLeft(); - } else { - playActionVideo(); - } - break; - } - } - - if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) { - for (int i = 0; i < 3; i++) - _asSymbols[i]->hide(); - if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) { - _ssSymbolEdges[0]->show(); - _ssTargetLines[0]->show(); - _asVerticalIndicator->show(); - } - } - - if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) { - for (int i = 3; i < 6; i++) - _asSymbols[i]->hide(); - if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) { - _ssSymbolEdges[1]->show(); - _ssTargetLines[1]->show(); - _asHorizontalIndicator->show(); - } - } - -} - -uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) { - setGlobalVar(V_CANNON_TARGET_STATUS, 0); - leaveScene(0); - } - break; - case 0x2000: - if (!getGlobalVar(V_CANNON_RAISED)) { - if (!getGlobalVar(V_WALL_BROKEN)) { - _cannonTargetStatus = kCTSBreakWall; - setGlobalVar(V_WALL_BROKEN, 1); - } else { - _cannonTargetStatus = kCTSWall; - } - } else if (!getGlobalVar(V_CANNON_TURNED)) { - _cannonTargetStatus = kCTSEmptyness; - } else if (!getGlobalVar(V_ROBOT_TARGET)) { - _cannonTargetStatus = kCTSFireRobotNoTarget; - } else if (!getGlobalVar(V_ROBOT_HIT)) { - setGlobalVar(V_ROBOT_HIT, 1); - _cannonTargetStatus = kCTSFireRobotIsTarget; - } else { - _cannonTargetStatus = kCTSFireNoRobot; - } - playActionVideo(); - break; - case 0x2001: - _lockSymbolsPart1Countdown = 24; - break; - case 0x2002: - // Raise/lower the cannon - if (!getGlobalVar(V_CANNON_TURNED) && !_isTurning) { - if (getGlobalVar(V_CANNON_RAISED)) { - _cannonTargetStatus = kCTSLowerCannon; - setGlobalVar(V_CANNON_RAISED, 0); - } else { - _cannonTargetStatus = kCTSRaiseCannon; - setGlobalVar(V_CANNON_RAISED, 1); - } - playActionVideo(); - } - break; - case 0x2003: - _lockSymbolsPart2Countdown = 24; - break; - case 0x2004: - // Turn the cannon if it's raised - if (getGlobalVar(V_CANNON_RAISED)) { - if (!getGlobalVar(V_CANNON_TURNED)) { - // Cannon is at the left position - if (!getGlobalVar(V_ROBOT_TARGET)) { - _cannonTargetStatus = kCTSRightRobotNoTarget; - } else if (!getGlobalVar(V_ROBOT_HIT)) { - _cannonTargetStatus = kCTSRightRobotIsTarget; - } else { - _cannonTargetStatus = kCTSRightNoRobot; - } - setGlobalVar(V_CANNON_TURNED, 1); - _isTurning = true; - playActionVideo(); - } else { - // Cannon is at the right position - if (!getGlobalVar(V_ROBOT_TARGET)) { - _cannonTargetStatus = kCTSLeftRobotNoTarget; - _smackerPlayer->open(0x108A000F, false); - } else if (!getGlobalVar(V_ROBOT_HIT)) { - _cannonTargetStatus = kCTSLeftRobotIsTarget; - _smackerPlayer->open(0x500B002F, false); - } else { - _cannonTargetStatus = kCTSLeftNoRobot; - _smackerPlayer->open(0x100B008E, false); - } - _palette->usePalette(); - _moveCannonLeftFirst = true; - _isTurning = true; - _keepVideo = false; - setGlobalVar(V_CANNON_TURNED, 0); - } - } - break; - } - return 0; -} - -void Scene3009::playActionVideo() { - setGlobalVar(V_CANNON_TARGET_STATUS, _cannonTargetStatus); - setGlobalVar(V_CANNON_SMACKER_NAME, kScene3009CannonActionVideos[_cannonTargetStatus]); - leaveScene(1); -} - -bool Scene3009::isSymbolsPart1Solved() { - for (int i = 0; i < 3; i++) - if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i)) - return false; - return true; -} - -bool Scene3009::isSymbolsPart2Solved() { - for (int i = 3; i < 6; i++) - if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i)) - return false; - return true; -} - -bool Scene3009::isTurning() { - return _isTurning; -} - -// Scene3010 - -static const uint32 kScene3010ButtonNameHashes[] = { - 0x304008D2, - 0x40119852, - 0x01180951 -}; - -static const uint32 kScene3010DeadBoltButtonFileHashes1[] = { - 0x301024C2, - 0x20280580, - 0x30200452 -}; - -static const uint32 kScene3010DeadBoltButtonFileHashes2[] = { - 0x50C025A8, - 0x1020A0A0, - 0x5000A7E8 -}; - -static const NPoint kAsScene3010DeadBoltPoints[] = { - {550, 307}, - {564, 415}, - {560, 514} -}; - -static const uint32 kAsScene3010DeadBoltFileHashes2[] = { - 0x181A0042, - 0x580A08F2, - 0x18420076 -}; - -static const uint32 kAsScene3010DeadBoltFileHashes1[] = { - 0x300E105A, - 0x804E0052, - 0x040E485A -}; - -SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled) - : StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) { - - _buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0; - createSurface(400, 88, 95); - setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); - if (initDisabled) - disableButton(); - else if (_buttonEnabled) - _countdown1 = initCountdown * 12 + 1; - loadSound(0, 0xF4217243); - loadSound(1, 0x44049000); - loadSound(2, 0x6408107E); - SetUpdateHandler(&SsScene3010DeadBoltButton::update); - SetMessageHandler(&SsScene3010DeadBoltButton::handleMessage); -} - -void SsScene3010DeadBoltButton::update() { - - if (_countdown1 != 0 && (--_countdown1 == 0)) { - playSound(0); - setVisible(false); - setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); - } - - if (_countdown2 != 0 && (--_countdown2 == 0)) { - setVisible(true); - setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); - } - -} - -uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (!_buttonLocked && _countdown1 == 0) { - if (_buttonEnabled) { - playSound(1); - playSound(2); - setVisible(true); - _buttonLocked = true; - sendMessage(_parentScene, 0x2000, _buttonIndex); - } else { - sendMessage(_parentScene, 0x2002, _buttonIndex); - } - _needRefresh = true; - updatePosition(); - } - messageResult = 1; - break; - } - return messageResult; -} - -void SsScene3010DeadBoltButton::disableButton() { - _buttonLocked = true; - setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); - setVisible(true); -} - -void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { - loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset); -} - -void SsScene3010DeadBoltButton::setCountdown(int count) { - _countdown2 = count * 18 + 1; -} - -AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked) - : AnimatedSprite(vm, 1100), _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), - _unlocked(false), _locked(false), _countdown(0) { - - _x = kAsScene3010DeadBoltPoints[_boltIndex].x; - _y = kAsScene3010DeadBoltPoints[_boltIndex].y; - - if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_boltIndex])) { - createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); - startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); - loadSound(0, 0x46005BC4); - } else { - createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200); - startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); - loadSound(0, 0x420073DC); - loadSound(1, 0x420073DC); - } - - setVisible(false); - stIdle(); - if (initUnlocked) - unlock(true); - - _needRefresh = true; - AnimatedSprite::updatePosition(); - -} - -void AsScene3010DeadBolt::update() { - updateAnim(); - updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) { - stDisabled(); - } -} - -uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x3002: - gotoNextState(); - break; - } - return messageResult; -} - -void AsScene3010DeadBolt::stIdle() { - stopAnimation(); - SetUpdateHandler(&AsScene3010DeadBolt::update); - SetMessageHandler(&Sprite::handleMessage); - _locked = false; -} - -void AsScene3010DeadBolt::unlock(bool skipAnim) { - if (!_unlocked) { - setVisible(true); - if (skipAnim) { - startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); - _newStickFrameIndex = STICK_LAST_FRAME; - } else { - startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); - SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); - FinalizeState(&AsScene3010DeadBolt::stIdleMessage); - NextState(&AsScene3010DeadBolt::stIdle); - playSound(0); - } - _unlocked = true; - loadSound(2, 0x4010C345); - } -} - -void AsScene3010DeadBolt::stIdleMessage() { - stopAnimation(); - SetMessageHandler(&Sprite::handleMessage); - sendMessage(_parentScene, 0x2001, _boltIndex); -} - -void AsScene3010DeadBolt::lock() { - if (!_locked) { - _locked = true; - setVisible(true); - startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); - SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); - FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); - NextState(&AsScene3010DeadBolt::stIdle); - if (_soundToggle) { - playSound(0); - } else { - playSound(1); - } - _soundToggle = !_soundToggle; - } -} - -void AsScene3010DeadBolt::setCountdown(int count) { - _countdown = count * 18 + 1; -} - -void AsScene3010DeadBolt::stDisabled() { - setVisible(true); - startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); - SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); - FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); - NextState(&AsScene3010DeadBolt::stIdle); - _playBackwards = true; - playSound(2); -} - -void AsScene3010DeadBolt::stDisabledMessage() { - setVisible(false); - sendMessage(_parentScene, 0x2003, _boltIndex); -} - -Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) { - - int initCountdown = 0; - - // DEBUG Enable to activate all buttons -#if 0 - setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[0], 1); - setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1); - setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1); -#endif - - setBackground(0x80802626); - setPalette(0x80802626); - - for (int i = 0; i < 3; i++) { - _asDeadBolts[i] = insertSprite(this, i, which == 1);//CHECKME - _ssDeadBoltButtons[i] = insertSprite(this, i, initCountdown, which == 1);//CHECKME - addCollisionSprite(_ssDeadBoltButtons[i]); - if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i])) - initCountdown++; - _boltUnlocking[i] = false; - _boltUnlocked[i] = false; - } - - if (which == 0) { - insertPuzzleMouse(0x02622800, 20, 620); - } - - loadSound(0, 0x68E25540); - - SetMessageHandler(&Scene3010::handleMessage); - SetUpdateHandler(&Scene3010::update); - - if (which == 1) { - _checkUnlocked = true; - for (int i = 0; i < 3; i++) { - _boltUnlocked[i] = true; - _ssDeadBoltButtons[i]->setCountdown(i + 1); - _asDeadBolts[i]->setCountdown(i + 1); - } - } - -} - -void Scene3010::update() { - Scene::update(); - if (_checkUnlocked && !_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { - _countdown = 24; - _checkUnlocked = false; - } - if (_countdown != 0 && (--_countdown == 0)) { - leaveScene(_doorUnlocked ? 1 : 0); - } -} - -uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) { - if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) { - showMouse(false); - if (!_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { - _countdown = 1; - } else { - _checkUnlocked = true; - for (int i = 0; i < 3; i++) { - _ssDeadBoltButtons[i]->setCountdown(i); - if (_boltUnlocked[i]) { - _asDeadBolts[i]->setCountdown(i); - } - } - } - } - } - break; - case 0x2000: - if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) { - _asDeadBolts[param.asInteger()]->unlock(false); - _boltUnlocking[param.asInteger()] = true; - } - break; - case 0x2001: - _boltUnlocked[param.asInteger()] = true; - _boltUnlocking[param.asInteger()] = false; - if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) { - if (!getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { - setGlobalVar(V_BOLT_DOOR_UNLOCKED, 1); - playSound(0); - _countdown = 60; - } else { - _countdown = 48; - } - _doorUnlocked = true; - } - break; - case 0x2002: - if (!_checkUnlocked && _countdown == 0) { - _asDeadBolts[param.asInteger()]->lock(); - } - break; - case 0x2003: - _boltUnlocked[param.asInteger()] = false; - break; - } - return 0; -} - -// Scene3011 - -static const uint32 kAsScene3011SymbolFileHashes[] = { - 0x00C88050, - 0x01488050, - 0x02488050, - 0x04488050, - 0x08488050, - 0x10488050, - 0x20488050, - 0x40488050, - 0x80488050, - 0x00488051, - 0x00488052, - 0x00488054, - 0x008B0000, - 0x008D0000, - 0x00810000, - 0x00990000, - 0x00A90000, - 0x00C90000, - 0x00090000, - 0x01890000, - 0x02890000, - 0x04890000, - 0x08890000, - 0x10890000 -}; - -SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag) - : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { - - loadSprite(flag ? 0x11282020 : 0x994D0433, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); - setVisible(false); - loadSound(0, 0x44061000); - SetUpdateHandler(&SsScene3011Button::update); - SetMessageHandler(&SsScene3011Button::handleMessage); -} - -void SsScene3011Button::update() { - updatePosition(); - if (_countdown != 0 && (--_countdown == 0)) { - setVisible(false); - } -} - -uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - uint32 messageResult = 0; - StaticSprite::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x1011: - if (_countdown == 0) { - setVisible(true); - _countdown = 4; - sendMessage(_parentScene, 0x2000, 0); - playSound(0); - } - messageResult = 1; - break; - } - return messageResult; -} - -AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol) - : AnimatedSprite(vm, 1000), _symbolIndex(symbolIndex), _largeSymbol(largeSymbol), _isNoisy(false) { - - if (_largeSymbol) { - _x = 310; - _y = 200; - createSurface1(kAsScene3011SymbolFileHashes[_symbolIndex], 1200); - loadSound(0, 0x6052C60F); - loadSound(1, 0x6890433B); - } else { - _symbolIndex = 12; - _x = symbolIndex * 39 + 96; - _y = 225; - createSurface(1200, 41, 48); - loadSound(0, 0x64428609); - loadSound(1, 0x7080023B); - } - setVisible(false); - _needRefresh = true; - SetUpdateHandler(&AnimatedSprite::update); -} - -void AsScene3011Symbol::show(bool isNoisy) { - _isNoisy = isNoisy; - startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1); - setVisible(true); - if (_isNoisy) { - playSound(1); - } else { - playSound(0); - } -} - -void AsScene3011Symbol::hide() { - stopAnimation(); - setVisible(false); -} - -void AsScene3011Symbol::stopSymbolSound() { - if (_isNoisy) { - stopSound(1); - } else { - stopSound(0); - } -} - -void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) { - _symbolIndex = symbolIndex; - _isNoisy = isNoisy; - startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1); - setVisible(true); - if (_isNoisy) { - playSound(1); - } else { - playSound(0); - } -} - -Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) - : Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0), _countdown(0) { - - _vm->gameModule()->initCodeSymbolsPuzzle(); - _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); - - SetMessageHandler(&Scene3011::handleMessage); - SetUpdateHandler(&Scene3011::update); - - setBackground(0x92124A04); - setPalette(0xA4070114); - addEntity(_palette); - - insertPuzzleMouse(0x24A00929, 20, 620); - - for (int symbolIndex = 0; symbolIndex < 12; symbolIndex++) - _asSymbols[symbolIndex] = insertSprite(symbolIndex, true); - - _ssButton = insertSprite(this, true); - addCollisionSprite(_ssButton); - -} - -void Scene3011::update() { - Scene::update(); - - if (_countdown != 0 && (--_countdown == 0)) { - switch (_updateStatus) { - case 0: - if (_buttonClicked) { - if (_noisySymbolIndex == _currentSymbolIndex) { - do { - _noisyRandomSymbolIndex = _vm->_rnd->getRandomNumber(12 - 1); - } while (_noisySymbolIndex == _noisyRandomSymbolIndex); - _asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->show(true); - } else { - _asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->show(false); - } - _updateStatus = 1; - _countdown = 24; - fadeIn(); - _buttonClicked = false; - } - break; - case 1: - _updateStatus = 2; - _countdown = 24; - break; - case 2: - fadeOut(); - _updateStatus = 3; - _countdown = 24; - break; - case 3: - _updateStatus = 0; - _countdown = 1; - if (_noisySymbolIndex == _currentSymbolIndex) { - _asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->hide(); - } else { - _asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->hide(); - } - _currentSymbolIndex++; - if (_currentSymbolIndex >= 12) - _currentSymbolIndex = 0; - break; - } - } -} - -uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { - Scene::handleMessage(messageNum, param, sender); - switch (messageNum) { - case 0x0001: - if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { - leaveScene(0); - } - break; - case 0x2000: - _buttonClicked = true; - if (_countdown == 0) - _countdown = 1; - break; - } - return 0; -} - -void Scene3011::fadeIn() { - _palette->addBasePalette(0x92124A04, 0, 256, 0); - _palette->startFadeToPalette(24); -} - -void Scene3011::fadeOut() { - _palette->addBasePalette(0xA4070114, 0, 256, 0); - _palette->startFadeToPalette(24); -} - -} // End of namespace Neverhood diff --git a/engines/neverhood/module3000.h b/engines/neverhood/module3000.h deleted file mode 100644 index 0fd1a1ed70..0000000000 --- a/engines/neverhood/module3000.h +++ /dev/null @@ -1,255 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef NEVERHOOD_MODULE3000_H -#define NEVERHOOD_MODULE3000_H - -#include "neverhood/neverhood.h" -#include "neverhood/module.h" -#include "neverhood/scene.h" -#include "neverhood/module1200.h" - -namespace Neverhood { - -class Module3000 : public Module { -public: - Module3000(NeverhoodEngine *vm, Module *parentModule, int which); - virtual ~Module3000(); -protected: - int _soundVolume; - bool _isWallBroken; - void createScene(int sceneNum, int which); - void updateScene(); -}; - -// Scene3009 - -class Scene3009; - -class SsScene3009FireCannonButton : public StaticSprite { -public: - SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene); -protected: - Scene3009 *_parentScene; - bool _isClicked; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene3009SymbolEdges : public StaticSprite { -public: - SsScene3009SymbolEdges(NeverhoodEngine *vm, int index); - void show(); - void hide(); - void startBlinking(); -protected: - int _blinkCountdown; - bool _blinkToggle; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class SsScene3009TargetLine : public StaticSprite { -public: - SsScene3009TargetLine(NeverhoodEngine *vm, int index); - void show(); -}; - -class SsScene3009SymbolArrow : public StaticSprite { -public: - SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index); - void hide(); -protected: - Sprite *_asSymbol; - int _index; - int _incrDecr; - bool _enabled; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene3009VerticalIndicator : public AnimatedSprite { -public: - AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index); - void show(); -protected: - Scene3009 *_parentScene; - bool _enabled; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene3009HorizontalIndicator : public AnimatedSprite { -public: - AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus); - void show(); - void stMoveLeft(); - void stMoveRight(); -protected: - Scene3009 *_parentScene; - bool _enabled; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void suMoveLeft(); - void suMoveRight(); -}; - -class AsScene3009Symbol : public AnimatedSprite { -public: - AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition); - void hide(); -protected: - Scene3009 *_parentScene; - int _symbolPosition; - uint32 _symbolIndex; - SsScene3009SymbolArrow *_ssArrowPrev; - SsScene3009SymbolArrow *_ssArrowNext; - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class Scene3009 : public Scene { -public: - Scene3009(NeverhoodEngine *vm, Module *parentModule, int which); - bool isTurning(); -protected: - int _lockSymbolsPart1Countdown; - int _lockSymbolsPart2Countdown; - SmackerPlayer *_smackerPlayer; - Sprite *_ssFireCannonButton; - SsScene3009SymbolEdges *_ssSymbolEdges[2]; - SsScene3009TargetLine *_ssTargetLines[2]; - AsScene3009VerticalIndicator *_asVerticalIndicator; - AsScene3009HorizontalIndicator *_asHorizontalIndicator; - AsScene3009Symbol *_asSymbols[6]; - uint32 _cannonTargetStatus; - uint32 _correctSymbols[6]; - bool _keepVideo; - bool _moveCannonLeftFirst; - bool _isTurning; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void playActionVideo(); - bool isSymbolsPart1Solved(); - bool isSymbolsPart2Solved(); -}; - -// Scene3010 - -class SsScene3010DeadBoltButton : public StaticSprite { -public: - SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled); - void setCountdown(int count); -protected: - Scene *_parentScene; - int _buttonIndex; - bool _buttonEnabled; - bool _buttonLocked; - int _countdown1; - int _countdown2; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void disableButton(); - void setSprite(uint32 fileHash); -}; - -class AsScene3010DeadBolt : public AnimatedSprite { -public: - AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked); - void setCountdown(int count); - void lock(); - void unlock(bool skipAnim); -protected: - Scene *_parentScene; - int _boltIndex; - int _countdown; - bool _soundToggle; - bool _unlocked; - bool _locked; - void update(); - uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); - void stIdle(); - void stIdleMessage(); - void stDisabled(); - void stDisabledMessage(); -}; - -class Scene3010 : public Scene { -public: - Scene3010(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - int _countdown; - bool _doorUnlocked; - bool _checkUnlocked; - SsScene3010DeadBoltButton *_ssDeadBoltButtons[3]; - AsScene3010DeadBolt *_asDeadBolts[3]; - bool _boltUnlocked[3]; - bool _boltUnlocking[3]; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -// Scene3011 - -class SsScene3011Button : public StaticSprite { -public: - SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag); -protected: - Scene *_parentScene; - int _countdown; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); -}; - -class AsScene3011Symbol : public AnimatedSprite { -public: - AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol); - void show(bool isNoisy); - void hide(); - void stopSymbolSound(); - void change(int symbolIndex, bool isNoisy); - int getSymbolIndex() { return _largeSymbol ? _symbolIndex : _symbolIndex - 12; } -protected: - bool _largeSymbol; - bool _isNoisy; - int _symbolIndex; -}; - -class Scene3011 : public Scene { -public: - Scene3011(NeverhoodEngine *vm, Module *parentModule, int which); -protected: - Sprite *_ssButton; - AsScene3011Symbol *_asSymbols[12]; - int _updateStatus; - bool _buttonClicked; - int _countdown; - int _noisySymbolIndex; - int _currentSymbolIndex; - int _noisyRandomSymbolIndex; - void update(); - uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); - void fadeIn(); - void fadeOut(); -}; - -} // End of namespace Neverhood - -#endif /* NEVERHOOD_MODULE3000_H */ diff --git a/engines/neverhood/modules/module1000.cpp b/engines/neverhood/modules/module1000.cpp new file mode 100644 index 0000000000..ef2872ba2e --- /dev/null +++ b/engines/neverhood/modules/module1000.cpp @@ -0,0 +1,1699 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1000.h" + +namespace Neverhood { + +Module1000::Module1000(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module1000(%d)", which); + + _musicFileHash = getGlobalVar(V_ENTRANCE_OPEN) ? 0x81106480 : 0x00103144; + + _vm->_soundMan->addMusic(0x03294419, 0x061880C6); + _vm->_soundMan->addMusic(0x03294419, _musicFileHash); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 0) + createScene(0, 0); + else if (which == 1) + createScene(1, 1); + +} + +Module1000::~Module1000() { + _vm->_soundMan->deleteMusicGroup(0x03294419); +} + +void Module1000::createScene(int sceneNum, int which) { + debug("Module1000::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->_soundMan->startMusic(0x061880C6, 0, 0); + _childObject = new Scene1001(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->_soundMan->startMusic(0x061880C6, 0, 0); + _childObject = new Scene1002(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->startMusic(0x061880C6, 0, 0); + createStaticScene(0xC084110C, 0x41108C00); + break; + case 3: + _vm->gameState().sceneNum = 3; + _vm->_soundMan->stopMusic(0x061880C6, 0, 2); + _childObject = new Scene1004(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->stopMusic(0x061880C6, 0, 0); + _vm->_soundMan->startMusic(_musicFileHash, 0, 0); + _childObject = new Scene1005(_vm, this, which); + break; + } + SetUpdateHandler(&Module1000::updateScene); + _childObject->handleUpdate(); +} + +void Module1000::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 2) + createScene(2, 0); + else + createScene(1, 0); + break; + case 1: + if (_moduleResult == 1) + leaveModule(0); + else if (_moduleResult == 2) { + if (_vm->isDemo()) + // Demo version returns to the same scene + createScene(1, 2); + else + createScene(3, 0); + } else + createScene(0, 1); + break; + case 2: + createScene(0, 2); + break; + case 3: + if (_moduleResult == 1) + createScene(4, 0); + else + createScene(1, 2); + break; + case 4: + _vm->_soundMan->stopMusic(_musicFileHash, 0, 1); + createScene(3, 1); + break; + } + } +} + +// Scene1001 + +AsScene1001Door::AsScene1001Door(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + createSurface(800, 137, 242); + _x = 726; + _y = 440; + stShowIdleDoor(); + loadSound(1, 0xED403E03); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1001Door::handleMessage); +} + +uint32 AsScene1001Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + hammerHitsDoor(); + break; + case 0x3002: + gotoNextState(); + break; + } + return 0; +} + +void AsScene1001Door::hammerHitsDoor() { + switch (getGlobalVar(V_DOOR_STATUS)) { + case 0: + case 1: + playSound(0, 0x65482F03); + startAnimation(0x624C0498, 1, 3); + NextState(&AsScene1001Door::stShowIdleDoor); + break; + case 2: + playSound(1); + startAnimation(0x624C0498, 6, 6); + NextState(&AsScene1001Door::stBustedDoorMove); + break; + default: + // Nothing + break; + } + incGlobalVar(V_DOOR_STATUS, 1); +} + +void AsScene1001Door::stShowIdleDoor() { + switch (getGlobalVar(V_DOOR_STATUS)) { + case 1: + startAnimation(0x624C0498, 4, -1); + _newStickFrameIndex = 4; + break; + case 2: + startAnimation(0x624C0498, 1, -1); + _newStickFrameIndex = 1; + break; + case 3: + stopAnimation(); + setVisible(false); + break; + default: + startAnimation(0x624C0498, 0, -1); + _newStickFrameIndex = 0; + break; + } +} + +void AsScene1001Door::stBustedDoorMove() { + setGlobalVar(V_DOOR_BUSTED, 1); + startAnimation(0x624C0498, 6, 6); + NextState(&AsScene1001Door::stBustedDoorGone); + _x = 30; +} + +void AsScene1001Door::stBustedDoorGone() { + playSound(0); + stopAnimation(); + setVisible(false); +} + +AsScene1001Hammer::AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor) + : AnimatedSprite(vm, 1100), _asDoor(asDoor) { + + _x = 547; + _y = 206; + createSurface(900, 177, 192); + startAnimation(0x022C90D4, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1001Hammer::handleMessage); +} + +uint32 AsScene1001Hammer::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x00352100) + sendMessage(_asDoor, 0x2000, 0); + else if (param.asInteger() == 0x0A1A0109) + playSound(0, 0x66410886); + break; + case 0x2000: + startAnimation(0x022C90D4, 1, -1); + playSound(0, 0xE741020A); + _newStickFrameIndex = STICK_LAST_FRAME; + break; + } + return 0; +} + +AsScene1001Window::AsScene1001Window(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200) { + + _x = 320; + _y = 240; + createSurface(100, 66, 129); + startAnimation(0xC68C2299, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1001Window::handleMessage); +} + +uint32 AsScene1001Window::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0E0A1410) + playSound(0, 0x60803F10); + break; + case 0x2001: + startAnimation(0xC68C2299, 0, -1); + break; + case 0x3002: + SetMessageHandler(NULL); + setGlobalVar(V_WINDOW_OPEN, 1); + setVisible(false); + break; + } + return 0; +} + +AsScene1001Lever::AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(1010, 71, 73); + setDoDeltaX(deltaXType); + startAnimation(0x04A98C36, 0, -1); + _newStickFrameIndex = 0; + _x = x; + _y = y; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1001Lever::handleMessage); +} + +uint32 AsScene1001Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x00C0C444) + sendMessage(_parentScene, 0x480F, 0); + else if (param.asInteger() == 0xC41A02C0) + playSound(0, 0x40581882); + break; + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x3002: + startAnimation(0x04A98C36, 0, -1); + _newStickFrameIndex = 0; + break; + case 0x480F: + startAnimation(0x04A98C36, 0, -1); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +SsCommonButtonSprite::SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash) + : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene), _countdown(0) { + + _priority = 1100; + _soundFileHash = soundFileHash ? soundFileHash : 0x44141000; + setVisible(false); + SetUpdateHandler(&SsCommonButtonSprite::update); + SetMessageHandler(&SsCommonButtonSprite::handleMessage); +} + +void SsCommonButtonSprite::update() { + if (_countdown != 0 && (--_countdown) == 0) + setVisible(false); +} + +uint32 SsCommonButtonSprite::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480B: + sendMessage(_parentScene, 0x480B, 0); + setVisible(true); + _countdown = 8; + playSound(0, _soundFileHash); + break; + } + return messageResult; +} + +Scene1001::Scene1001(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _asDoor(NULL), _asWindow(NULL) { + + Sprite *tempSprite; + + SetMessageHandler(&Scene1001::handleMessage); + + setHitRects(0x004B4860); + setBackground(0x4086520E); + setPalette(0x4086520E); + insertScreenMouse(0x6520A400); + + if (which < 0) { + // Restoring game + setRectList(0x004B49F0); + insertKlaymen(200, 433); + setMessageList(0x004B4888); + } else if (which == 1) { + // Klaymen entering from the right + setRectList(0x004B49F0); + insertKlaymen(640, 433); + setMessageList(0x004B4898); + } else if (which == 2) { + // Klaymen returning from looking through the window + setRectList(0x004B49F0); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(390, 433); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen(300, 433); + } + setMessageList(0x004B4970); + } else { + // Klaymen sleeping + setRectList(0x004B4A00); + insertKlaymen(200, 433); + setMessageList(0x004B4890); + } + + tempSprite = insertStaticSprite(0x2080A3A8, 1300); + + _klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); + + if (!getGlobalVar(V_DOOR_BUSTED)) { + _asDoor = insertSprite(); + _asDoor->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); + } + + _asLever = insertSprite(this, 150, 433, 1); + + insertStaticSprite(0x809861A6, 950); + insertStaticSprite(0x89C03848, 1100); + + _ssButton = insertSprite(this, 0x15288120, 100, 0); + + if (!getGlobalVar(V_WINDOW_OPEN)) { + tempSprite = insertStaticSprite(0x8C066150, 200); + _asWindow = insertSprite(); + _asWindow->setClipRect(tempSprite->getDrawRect()); + } + + _asHammer = insertSprite(_asDoor); + +} + +Scene1001::~Scene1001() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX()); +} + +uint32 Scene1001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x00342624) { + sendEntityMessage(_klaymen, 0x1014, _asLever); + setMessageList2(0x004B4910); + messageResult = 1; + } else if (param.asInteger() == 0x21E64A00) { + if (getGlobalVar(V_DOOR_BUSTED)) { + setMessageList(0x004B48A8); + } else { + setMessageList(0x004B48C8); + } + messageResult = 1; + } else if (param.asInteger() == 0x040424D0) { + sendEntityMessage(_klaymen, 0x1014, _ssButton); + } else if (param.asInteger() == 0x80006358) { + if (getGlobalVar(V_WINDOW_OPEN)) { + setMessageList(0x004B4938); + } else { + setMessageList(0x004B4960); + } + } + break; + case 0x2002: + setRectList(0x004B49F0); + break; + case 0x480B: + sendMessage(_asWindow, 0x2001, 0); + break; + case 0x480F: + sendMessage(_asHammer, 0x2000, 0); + break; + } + return messageResult; +} + +// Scene1002 + +AsScene1002Ring::AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isSpecial(isSpecial) { + + SetUpdateHandler(&AsScene1002Ring::update); + + if (_isSpecial) { + createSurface(990, 68, 314); + if (isRingLow) { + startAnimation(0x04103090, 0, -1); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); + } else { + startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); + SetMessageHandler(&AsScene1002Ring::hmRingIdle); + } + } else { + createSurface(990, 68, 138); + startAnimation(0xA85C4011, _vm->_rnd->getRandomNumber(15), -1); + SetMessageHandler(&AsScene1002Ring::hmRingIdle); + } + + setClipRect(0, clipY1, 640, 480); + + _x = x; + _y = y; + + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + +} + +void AsScene1002Ring::update() { + updateAnim(); + updatePosition(); +} + +uint32 AsScene1002Ring::hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4806: + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + sendMessage(_parentScene, 0x4806, 0); + SetMessageHandler(&AsScene1002Ring::hmRingPulled1); + startAnimation(_isSpecial ? 0x87502558 : 0x80DD4010, 0, -1); + break; + case 0x480F: + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + sendMessage(_parentScene, 0x480F, 0); + SetMessageHandler(&AsScene1002Ring::hmRingPulled2); + startAnimation(0x861A2020, 0, -1); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + startAnimation(_isSpecial ? 0x78D0A812 : 0xB85D2A10, 0, -1); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); + break; + case 0x4807: + sendMessage(_parentScene, 0x4807, 0); + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + startAnimation(0x8258A030, 0, -1); + SetMessageHandler(&AsScene1002Ring::hmRingReleased); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::hmRingPulled2(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + startAnimation(0x04103090, 0, -1); + SetMessageHandler(&AsScene1002Ring::hmRingHangingLow); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::hmRingHangingLow(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4807: + sendMessage(_parentScene, 0x4807, 0); + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + startAnimation(0x8258A030, 0, -1); + SetMessageHandler(&AsScene1002Ring::hmRingReleased); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene1002Ring::hmRingReleased(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmRingIdle(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x05410F72) + playSound(0, 0x21EE40A9); + break; + case 0x3002: + startAnimation(0xA85C4011, 0, -1); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +AsScene1002Door::AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect) + : StaticSprite(vm, 1200) { + + loadSprite(0x1052370F, kSLFDefDrawOffset | kSLFSetPosition, 800, 526, getGlobalVar(V_FLYTRAP_RING_DOOR) ? 49 : 239); + setClipRect(clipRect); + SetUpdateHandler(&AsScene1002Door::update); + SetMessageHandler(&AsScene1002Door::handleMessage); + SetSpriteUpdate(NULL); +} + +void AsScene1002Door::update() { + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene1002Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + setGlobalVar(V_FLYTRAP_RING_DOOR, 1); + SetSpriteUpdate(&AsScene1002Door::suOpenDoor); + break; + case 0x4809: + setGlobalVar(V_FLYTRAP_RING_DOOR, 0); + SetSpriteUpdate(&AsScene1002Door::suCloseDoor); + break; + } + return messageResult; +} + +void AsScene1002Door::suOpenDoor() { + if (_y > 49) { + _y -= 8; + if (_y < 49) { + SetSpriteUpdate(NULL); + _y = 49; + } + _needRefresh = true; + } +} + +void AsScene1002Door::suCloseDoor() { + if (_y < 239) { + _y += 8; + if (_y > 239) { + SetSpriteUpdate(NULL); + _y = 239; + } + _needRefresh = true; + } +} + +AsScene1002BoxingGloveHitEffect::AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1400) { + + createSurface(1025, 88, 165); + setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1002BoxingGloveHitEffect::handleMessage); +} + +uint32 AsScene1002BoxingGloveHitEffect::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + _x = ((Sprite*)sender)->getX() - 98; + _y = ((Sprite*)sender)->getY() - 111; + startAnimation(0x0422255A, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene1002DoorSpy::AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect) + : AnimatedSprite(vm, 1300), _clipRect(clipRect), _parentScene(parentScene), _asDoor(asDoor), _asBoxingGloveHitEffect(asScene1002BoxingGloveHitEffect) { + + createSurface(800, 136, 147); + setClipRect(clipRect); + suDoorSpy(); + loadSound(0, 0xC0C40298); + startAnimation(0x586C1D48, 0, 0); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage); + SetSpriteUpdate(&AsScene1002DoorSpy::suDoorSpy); +} + +uint32 AsScene1002DoorSpy::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xA61CA1C2) + sendMessage(_asBoxingGloveHitEffect, 0x2004, 0); + else if (param.asInteger() == 0x14CE0620) + playSound(0); + break; + case 0x2003: + stDoorSpyBoxingGlove(); + break; + } + return messageResult; +} + +uint32 AsScene1002DoorSpy::hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1002DoorSpy::suDoorSpy() { + _x = _asDoor->getX() + 34; + _y = _asDoor->getY() + 175; +} + +void AsScene1002DoorSpy::stDoorSpyIdle() { + setClipRect(_clipRect); + _parentScene->setSurfacePriority(getSurface(), 800); + startAnimation(0x586C1D48, 0, 0); + SetMessageHandler(&AsScene1002DoorSpy::handleMessage); +} + +void AsScene1002DoorSpy::stDoorSpyBoxingGlove() { + setClipRect(0, 0, 640, 480); + _parentScene->setSurfacePriority(getSurface(), 1200); + startAnimation(0x586C1D48, 1, -1); + SetMessageHandler(&AsScene1002DoorSpy::hmDoorSpyAnimation); + NextState(&AsScene1002DoorSpy::stDoorSpyIdle); +} + +SsCommonPressButton::SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) + : StaticSprite(vm, 1100), _parentScene(parentScene), _status(0) { + + _soundFileHash = soundFileHash != 0 ? soundFileHash : 0x44141000; + _fileHashes[0] = fileHash1; + _fileHashes[1] = fileHash2; + createSurface(surfacePriority, 40, 40); + loadSprite(fileHash1, kSLFDefDrawOffset | kSLFDefPosition); + setVisible(false); + SetUpdateHandler(&SsCommonPressButton::update); + SetMessageHandler(&SsCommonPressButton::handleMessage); +} + +void SsCommonPressButton::setFileHashes(uint32 fileHash1, uint32 fileHash2) { + _fileHashes[0] = fileHash1; + _fileHashes[1] = fileHash2; + loadSprite(_status == 2 ? fileHash2 : fileHash1, kSLFDefDrawOffset | kSLFDefPosition); +} + +void SsCommonPressButton::update() { + if (_countdown != 0 && (--_countdown) == 0) { + if (_status == 1) { + _status = 2; + loadSprite(_fileHashes[1], kSLFDefDrawOffset | kSLFDefPosition); + _countdown = 4; + } else if (_status == 2) { + _status = 3; + loadSprite(_fileHashes[0], kSLFDefDrawOffset | kSLFDefPosition); + _countdown = 4; + } else if (_status == 3) { + _status = 0; + setVisible(false); + } + } +} + +uint32 SsCommonPressButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480B: + sendMessage(_parentScene, 0x480B, 0); + _status = 1; + _countdown = 4; + setVisible(true); + playSound(0, _soundFileHash); + break; + } + return messageResult; +} + +AsScene1002VenusFlyTrap::AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _isSecond(isSecond), _countdown(0) { + + createSurface(995, 175, 195); + if (!_isSecond) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { + setDoDeltaX(1); + _x = 366; + _y = 435; + stRingGrabbed(); + } else { + _x = 174 + getGlobalVar(V_FLYTRAP_POSITION_1) * 32; + _y = 435; + stIdle(); + } + } else { + _x = 186 + getGlobalVar(V_FLYTRAP_POSITION_2) * 32; + _y = 364; + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) { + stRingGrabbed(); + } else { + stIdle(); + } + } + _flags = 4; + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +void AsScene1002VenusFlyTrap::update() { + if (_countdown != 0 && (--_countdown == 0)) + gotoNextState(); + AnimatedSprite::update(); +} + +void AsScene1002VenusFlyTrap::upIdle() { + if (_countdown == 0 && _klaymen->getX() - 20 > _x) + setDoDeltaX(1); + else if (_klaymen->getX() + 20 < _x) + setDoDeltaX(0); + update(); +} + +uint32 AsScene1002VenusFlyTrap::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000890C4) + playSound(0, 0xC21190D8); + else if (param.asInteger() == 0x522200A0) + playSound(0, 0x931080C8); + break; + case 0x1011: + if (_isSecond) { + if (_x >= 154 && _x <= 346) { + sendMessage(_parentScene, 0x2000, 0); + messageResult = 1; + } + } else { + if (_x >= 174 && _x <= 430) { + sendMessage(_parentScene, 0x2000, 0); + messageResult = 1; + } + } + break; + case 0x480B: + setDoDeltaX(param.asInteger() != 0 ? 1 : 0); + if (!_isSecond) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) + stRelease(); + else + stWalk(); + } else { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE) || getGlobalVar(V_FLYTRAP_RING_FENCE)) + stRelease(); + else + stWalk(); + } + break; + case 0x480C: + if (_isSecond) { + if (_x >= 154 && _x <= 346) + messageResult = 1; + else + messageResult = 0; + } else { + if (_x >= 174 && _x <= 430) + messageResult = 1; + else + messageResult = 0; + } + break; + case 0x480E: + if (param.asInteger() == 1) + stGrabRing(); + break; + case 0x4810: + swallowKlaymen(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 995); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1015); + break; + } + return messageResult; +} + +uint32 AsScene1002VenusFlyTrap::hmAnimationSimple(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +uint32 AsScene1002VenusFlyTrap::hmAnimationExt(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x000890C4) + playSound(0, 0xC21190D8); + else if (param.asInteger() == 0x41881801) { + if (_isSecond) { + if (_x > 330) + sendMessage(_klaymen, 0x4811, 2); + else + sendMessage(_klaymen, 0x4811, 0); + } else { + sendMessage(_klaymen, 0x4811, 0); + } + } else if (param.asInteger() == 0x522200A0) + playSound(0, 0x931080C8); + break; + case 0x3002: + gotoNextState(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 995); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1015); + break; + } + return messageResult; +} + +void AsScene1002VenusFlyTrap::stWalkBack() { + setDoDeltaX(2); + startAnimation(0xC4080034, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stIdle); +} + +void AsScene1002VenusFlyTrap::stWalk() { + startAnimation(0xC4080034, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); + NextState(&AsScene1002VenusFlyTrap::stIdle); +} + +void AsScene1002VenusFlyTrap::stRelease() { + sendMessage(_parentScene, 0x4807, 0); + startAnimation(0x82292851, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); + NextState(&AsScene1002VenusFlyTrap::stIdle); +} + +void AsScene1002VenusFlyTrap::stGrabRing() { + setDoDeltaX(1); + startAnimation(0x86A82A11, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationSimple); + NextState(&AsScene1002VenusFlyTrap::stRingGrabbed); +} + +void AsScene1002VenusFlyTrap::stRingGrabbed() { + startAnimation(0xB5A86034, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); +} + +void AsScene1002VenusFlyTrap::stKlaymenInside() { + startAnimation(0x31303094, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(NULL); + NextState(&AsScene1002VenusFlyTrap::stKlaymenInsideMoving); + _countdown = 24; +} + +void AsScene1002VenusFlyTrap::stIdle() { + startAnimation(0xC8204250, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::upIdle); + SetMessageHandler(&AsScene1002VenusFlyTrap::handleMessage); + if (_isSecond) { + if (_x >= 154 && _x <= 346) + setGlobalVar(V_FLYTRAP_POSITION_2, (_x - 186) / 32); + else { + NextState(&AsScene1002VenusFlyTrap::stWalkBack); + _countdown = 12; + } + } else { + if (_x >= 174 && _x <= 430) + setGlobalVar(V_FLYTRAP_POSITION_1, (_x - 174) / 32); + else { + NextState(&AsScene1002VenusFlyTrap::stWalkBack); + _countdown = 12; + } + } +} + +void AsScene1002VenusFlyTrap::stKlaymenInsideMoving() { + startAnimation(0x152920C4, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stSpitOutKlaymen); +} + +void AsScene1002VenusFlyTrap::stSpitOutKlaymen() { + startAnimation(0x84001117, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stIdle); +} + +void AsScene1002VenusFlyTrap::swallowKlaymen() { + if (_x - 15 < _klaymen->getX() && _x + 15 > _klaymen->getX()) { + if (_isSecond) + setDoDeltaX(_x > 265 && _x < 330 ? 1 : 0); + else + setDoDeltaX(_x > 320 ? 1 : 0); + sendMessage(_klaymen, 0x2001, 0); + startAnimation(0x8C2C80D4, 0, -1); + SetUpdateHandler(&AsScene1002VenusFlyTrap::update); + SetMessageHandler(&AsScene1002VenusFlyTrap::hmAnimationExt); + NextState(&AsScene1002VenusFlyTrap::stKlaymenInside); + } +} + +AsScene1002OutsideDoorBackground::AsScene1002OutsideDoorBackground(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _countdown(0) { + + createSurface(850, 186, 212); + _x = 320; + _y = 240; + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { + startAnimation(0x004A4495, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } else + setVisible(false); + SetUpdateHandler(&AsScene1002OutsideDoorBackground::update); + SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); +} + +void AsScene1002OutsideDoorBackground::update() { + if (_countdown != 0 && (--_countdown == 0)) { + if (_isDoorClosed) + stCloseDoor(); + else + stOpenDoor(); + } + AnimatedSprite::update(); +} + +uint32 AsScene1002OutsideDoorBackground::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageResult) { + case 0x4808: + _isDoorClosed = false; + _countdown = 2; + break; + case 0x4809: + _isDoorClosed = true; + _countdown = 2; + break; + } + return messageResult; +} + +uint32 AsScene1002OutsideDoorBackground::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageResult) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1002OutsideDoorBackground::stOpenDoor() { + startAnimation(0x004A4495, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + setVisible(true); + SetMessageHandler(&AsScene1002OutsideDoorBackground::handleMessage); +} + +void AsScene1002OutsideDoorBackground::stCloseDoor() { + startAnimation(0x004A4495, -1, -1); + _playBackwards = true; + setVisible(true); + SetMessageHandler(&AsScene1002OutsideDoorBackground::hmAnimation); + NextState(&AsScene1002OutsideDoorBackground::stDoorClosed); +} + +void AsScene1002OutsideDoorBackground::stDoorClosed() { + setVisible(false); + stopAnimation(); +} + +AsScene1002KlaymenLadderHands::AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen) + : AnimatedSprite(vm, 1200), _klaymen(klaymen) { + + createSurface(1200, 40, 163); + setVisible(false); + SetUpdateHandler(&AsScene1002KlaymenLadderHands::update); + SetMessageHandler(&Sprite::handleMessage); +} + +void AsScene1002KlaymenLadderHands::update() { + if (_klaymen->getCurrAnimFileHash() == 0x3A292504) { + startAnimation(0xBA280522, _klaymen->getFrameIndex(), -1); + _newStickFrameIndex = _klaymen->getFrameIndex(); + setVisible(true); + _x = _klaymen->getX(); + _y = _klaymen->getY(); + setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); + } else if (_klaymen->getCurrAnimFileHash() == 0x122D1505) { + startAnimation(0x1319150C, _klaymen->getFrameIndex(), -1); + _newStickFrameIndex = _klaymen->getFrameIndex(); + setVisible(true); + _x = _klaymen->getX(); + _y = _klaymen->getY(); + setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); + } else + setVisible(false); + AnimatedSprite::update(); +} + +AsScene1002KlaymenPeekHand::AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen) + : AnimatedSprite(vm, 1200), _parentScene(parentScene), _klaymen(klaymen), + _isClipRectSaved(false) { + + createSurface(1000, 33, 41); + setVisible(false); + SetUpdateHandler(&AsScene1002KlaymenPeekHand::update); + SetMessageHandler(&AsScene1002KlaymenPeekHand::handleMessage); +} + +void AsScene1002KlaymenPeekHand::update() { + if (_klaymen->getCurrAnimFileHash() == 0xAC20C012 && _klaymen->getFrameIndex() < 50) { + startAnimation(0x9820C913, _klaymen->getFrameIndex(), -1); + _newStickFrameIndex = _klaymen->getFrameIndex(); + setVisible(true); + _x = _klaymen->getX(); + _y = _klaymen->getY(); + setDoDeltaX(_klaymen->isDoDeltaX() ? 1 : 0); + } else + setVisible(false); + AnimatedSprite::update(); +} + +uint32 AsScene1002KlaymenPeekHand::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4AB28209) { + sendMessage(_parentScene, 0x1022, 1200); + _isClipRectSaved = true; + _savedClipRect = _surface->getClipRect(); + setClipRect(0, 0, 640, 480); + } else if (param.asInteger() == 0x88001184) { + sendMessage(_parentScene, 0x1022, 1000); + if (_isClipRectSaved) + setClipRect(_savedClipRect); + } + break; + } + return messageResult; +} + +Scene1002::Scene1002(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isKlaymenFloor(false), _isClimbingLadder(false) { + + NRect tempClipRect; + Sprite *tempSprite; + + SetUpdateHandler(&Scene1002::update); + SetMessageHandler(&Scene1002::handleMessage); + + setHitRects(0x004B4138); + setBackground(0x12C23307); + setPalette(0x12C23307); + + insertStaticSprite(0x06149428, 1100); + insertStaticSprite(0x312C8774, 1100); + + _ssLadderArch = insertStaticSprite(0x152C1313, 1015); + _ssLadderArchPart1 = insertStaticSprite(0x060000A0, 1200); + _ssLadderArchPart2 = insertStaticSprite(0xB2A423B0, 1100); + _ssLadderArchPart3 = insertStaticSprite(0x316E0772, 1100); + + _ssCeiling = insertStaticSprite(0x316C4BB4, 1015); + + if (which < 0) { + // Restoring game + if (_vm->_gameState.which == 0) { + // Klaymen on top + insertKlaymen(90, 226); + _asKlaymenLadderHands = insertSprite(_klaymen); + setMessageList(0x004B4270); + _klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); + _asKlaymenLadderHands->getSurface()->getClipRect() = _klaymen->getSurface()->getClipRect(); + _klaymen->setRepl(64, 0); + } else { + // Klaymen on the floor + insertKlaymen(379, 435); + _asKlaymenLadderHands = insertSprite(_klaymen); + setMessageList(0x004B4270); + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + } + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(650, 435); + _asKlaymenLadderHands = insertSprite(_klaymen); + setMessageList(0x004B4478); + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + _vm->_gameState.which = 1; + } else if (which == 2) { + // Klaymen coming up the ladder + insertKlaymen(68, 645); + _asKlaymenLadderHands = insertSprite(_klaymen); + setMessageList(0x004B4298); + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + _vm->_gameState.which = 1; + sendMessage(_klaymen, 0x4820, 0); + } else { + // Klaymen entering from the left, peeking + insertKlaymen(90, 226); + _asKlaymenLadderHands = insertSprite(_klaymen); + setMessageList(0x004B4470); + _klaymen->setClipRect(31, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart3->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + _asKlaymenPeekHand = insertSprite(this, _klaymen); + _asKlaymenPeekHand->setClipRect(_klaymen->getClipRect()); + _klaymen->setRepl(64, 0); + _vm->_gameState.which = 0; + } + + insertScreenMouse(0x23303124); + + tempSprite = insertStaticSprite(0xB3242310, 825); + tempClipRect.set(tempSprite->getDrawRect().x, tempSprite->getDrawRect().y, + _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart2->getDrawRect().y2()); + + _asRing1 = insertSprite(this, false, 258, 191, _ssCeiling->getDrawRect().y, false); + _asRing2 = insertSprite(this, false, 297, 189, _ssCeiling->getDrawRect().y, false); + _asRing3 = insertSprite(this, true, 370, 201, _ssCeiling->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_DOOR)); + _asRing4 = insertSprite(this, false, 334, 191, _ssCeiling->getDrawRect().y, false); + _asRing5 = insertSprite(this, false, 425, 184, _ssCeiling->getDrawRect().y, false); + + _asDoor = insertSprite(tempClipRect); + tempSprite = insertSprite(); + _asDoorSpy = insertSprite(tempClipRect, this, _asDoor, tempSprite); + _ssPressButton = insertSprite(this, 0x00412692, 0x140B60BE, 800, 0); + _asVenusFlyTrap = insertSprite(this, _klaymen, false); + addCollisionSprite(_asVenusFlyTrap); + + sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap); + + _asOutsideDoorBackground = insertSprite(); + + setRectList(0x004B43A0); + + loadSound(1, 0x60755842); + loadSound(2, 0x616D5821); + +} + +Scene1002::~Scene1002() { +} + +void Scene1002::update() { + Scene::update(); + if (!_isKlaymenFloor && _klaymen->getY() > 230) { + _klaymen->setClipRect(_ssLadderArch->getDrawRect().x, 0, _ssLadderArchPart2->getDrawRect().x2(), _ssLadderArchPart1->getDrawRect().y2()); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + deleteSprite(&_ssLadderArchPart3); + _klaymen->clearRepl(); + _isKlaymenFloor = true; + _vm->_gameState.which = 1; + } +} + +uint32 Scene1002::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xE6EE60E1) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) + setMessageList(0x004B4428); + else + setMessageList(0x004B4448); + messageResult = 1; + } else if (param.asInteger() == 0x4A845A00) + sendEntityMessage(_klaymen, 0x1014, _asRing1); + else if (param.asInteger() == 0x43807801) + sendEntityMessage(_klaymen, 0x1014, _asRing2); + else if (param.asInteger() == 0x46C26A01) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { + setMessageList(0x004B44B8); + } else { + sendEntityMessage(_klaymen, 0x1014, _asRing3); + if (_asVenusFlyTrap->getX() - 10 < 366 && _asVenusFlyTrap->getX() + 10 > 366) { + setGlobalVar(V_FLYTRAP_RING_EATEN, 1); + setMessageList(0x004B44A8); + } else { + setMessageList(0x004B44A0); + } + } + messageResult = 1; + } else if (param.asInteger() == 0x468C7B11) + sendEntityMessage(_klaymen, 0x1014, _asRing4); + else if (param.asInteger() == 0x42845B19) + sendEntityMessage(_klaymen, 0x1014, _asRing5); + else if (param.asInteger() == 0xC0A07458) + sendEntityMessage(_klaymen, 0x1014, _ssPressButton); + break; + case 0x1024: + sendMessage(_parentModule, 0x1024, param.asInteger()); + break; + case 0x2000: + if (_isClimbingLadder) { + setMessageList2(0x004B43D0); + } else { + if (_klaymen->getY() > 420) { + sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap); + setMessageList2(0x004B4480); + } else if (_klaymen->getY() > 227) { + setMessageList2(0x004B41E0); + } else { + setMessageList2(0x004B4148); + } + } + break; + case 0x2002: + _messageList = NULL; + break; + case 0x2005: + _isClimbingLadder = true; + setRectList(0x004B4418); + break; + case 0x2006: + _isClimbingLadder = false; + setRectList(0x004B43A0); + break; + case 0x4806: + if (sender == _asRing1) { + setGlobalVar(V_RADIO_ENABLED, 0); + playSound(0, 0x665198C0); + } else if (sender == _asRing2) { + setGlobalVar(V_RADIO_ENABLED, 0); + playSound(0, 0xE2D389C0); + } else if (sender == _asRing3) { + setGlobalVar(V_RADIO_ENABLED, 0); + playSound(1); + sendMessage(_asDoor, 0x4808, 0); + sendMessage(_asOutsideDoorBackground, 0x4808, 0); + } else if (sender == _asRing4) { + setGlobalVar(V_RADIO_ENABLED, 0); + playSound(0, 0xE0558848); + } else if (sender == _asRing5) { + setGlobalVar(V_RADIO_ENABLED, 1); + playSound(0, 0x44014282); + } + break; + case 0x4807: + if (sender == _asRing3) { + playSound(2); + sendMessage(_asDoor, 0x4809, 0); + sendMessage(_asOutsideDoorBackground, 0x4809, 0); + } else if (sender == _asVenusFlyTrap) { + if (getGlobalVar(V_FLYTRAP_RING_DOOR)) { + sendMessage(_asRing3, 0x4807, 0); + } + } + break; + case 0x480B: + sendEntityMessage(_klaymen, 0x1014, _asDoorSpy); + break; + case 0x480F: + setGlobalVar(V_RADIO_ENABLED, 0); + playSound(1); + sendMessage(_asDoor, 0x4808, 0); + sendMessage(_asOutsideDoorBackground, 0x4808, 0); + break; + case 0x8000: + setSpriteSurfacePriority(_ssCeiling, 995); + setSpriteSurfacePriority(_ssLadderArch, 995); + break; + case 0x8001: + setSpriteSurfacePriority(_ssCeiling, 1015); + setSpriteSurfacePriority(_ssLadderArch, 1015); + break; + } + return messageResult; +} + +// StaticScene + +StaticScene::StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash) + : Scene(vm, parentModule) { + + SetMessageHandler(&StaticScene::handleMessage); + + setBackground(backgroundFileHash); + setPalette(backgroundFileHash); + insertPuzzleMouse(cursorFileHash, 20, 620); +} + +uint32 StaticScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + } + return 0; +} + +// Scene1004 + +AsScene1004TrashCan::AsScene1004TrashCan(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + _x = 330; + _y = 327; + createSurface(800, 56, 50); + setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1004TrashCan::handleMessage); +} + +uint32 AsScene1004TrashCan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x225A8587) + playSound(0, 0x109AFC4C); + break; + case 0x2002: + startAnimation(0xEB312C11, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return 0; +} + +Scene1004::Scene1004(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _paletteAreaStatus(-1) { + + Sprite *tempSprite; + + SetUpdateHandler(&Scene1004::update); + SetMessageHandler(&Scene1004::handleMessage); + + setBackground(0x50C03005); + + if (getGlobalVar(V_ENTRANCE_OPEN)) { + setPalette(0xA30BA329); + _palette->addBasePalette(0xA30BA329, 0, 256, 0); + } else { + setPalette(0x50C03005); + _palette->addBasePalette(0x50C03005, 0, 256, 0); + } + addEntity(_palette); + + insertScreenMouse(0x03001504); + + if (which < 0) { + // Restoring game + setRectList(0x004B7C70); + insertKlaymen(330, 327); + setMessageList(0x004B7C18); + } else if (which == 1) { + // Klaymen returning from reading a note + setRectList(0x004B7C70); + insertKlaymen(330, 327); + setMessageList(0x004B7C08); + } else { + // Klaymen coming down the ladder + loadDataResource(0x01900A04); + insertKlaymen(_dataResource.getPoint(0x80052A29).x, 27); + setMessageList(0x004B7BF0); + } + + updatePaletteArea(); + + _asKlaymenLadderHands = insertSprite(_klaymen); + + insertStaticSprite(0x800034A0, 1100); + insertStaticSprite(0x64402020, 1100); + insertStaticSprite(0x3060222E, 1300); + tempSprite = insertStaticSprite(0x0E002004, 1300); + + _klaymen->setClipRect(0, tempSprite->getDrawRect().y, 640, 480); + _asKlaymenLadderHands->setClipRect(_klaymen->getClipRect()); + + _asTrashCan = insertSprite(); + +} + +void Scene1004::update() { + Scene::update(); + updatePaletteArea(); +} + +uint32 Scene1004::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x926500A1) { + setMessageList(0x004B7C20); + messageResult = 1; + } + break; + case 0x2000: + loadDataResource(0x01900A04); + break; + case 0x2001: + setRectList(0x004B7C70); + break; + case 0x2002: + sendMessage(_asTrashCan, 0x2002, 0); + break; + } + return messageResult; +} + +void Scene1004::updatePaletteArea() { + if (_klaymen->getY() < 150) { + if (_paletteAreaStatus != 0) { + _paletteAreaStatus = 0; + _palette->addBasePalette(0x406B0D10, 0, 64, 0); + _palette->startFadeToPalette(12); + } + } else { + if (_paletteAreaStatus != 1) { + _paletteAreaStatus = 1; + _palette->addBasePalette(0x24332243, 0, 64, 0); + _palette->startFadeToPalette(12); + } + } +} + +// Scene1005 + +Scene1005::Scene1005(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene1005::handleMessage); + + if (getGlobalVar(V_ENTRANCE_OPEN)) { + setBackground(0x2800E011); + setPalette(0x2800E011); + insertStaticSprite(0x492D5AD7, 100); + insertPuzzleMouse(0x0E015288, 20, 620); + } else { + setBackground(0x8870A546); + setPalette(0x8870A546); + insertStaticSprite(0x40D1E0A9, 100); + insertStaticSprite(0x149C00A6, 100); + insertPuzzleMouse(0x0A54288F, 20, 620); + } + + drawTextToBackground(); + +} + +uint32 Scene1005::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + } + return 0; +} + +void Scene1005::drawTextToBackground() { + TextResource textResource(_vm); + const char *textStart, *textEnd; + int16 y = 36; + uint32 textIndex = getTextIndex(); + FontSurface *fontSurface = FontSurface::createFontSurface(_vm, getGlobalVar(V_ENTRANCE_OPEN) ? 0x283CE401 : 0xC6604282); + textResource.load(0x80283101); + textStart = textResource.getString(textIndex, textEnd); + while (textStart < textEnd) { + fontSurface->drawString(_background->getSurface(), 188, y, (const byte*)textStart); + y += 36; + textStart += strlen(textStart) + 1; + } + delete fontSurface; +} + +uint32 Scene1005::getTextIndex() { + uint32 textIndex; + textIndex = getTextIndex1(); + if (getGlobalVar(V_ENTRANCE_OPEN)) { + textIndex = getTextIndex2(); + } + if (getGlobalVar(V_TEXT_FLAG1) && getGlobalVar(V_TEXT_INDEX) == textIndex) { + textIndex = getTextIndex3(); + } else { + setGlobalVar(V_TEXT_FLAG1, 1); + setGlobalVar(V_TEXT_INDEX, textIndex); + } + return textIndex; +} + +uint32 Scene1005::getTextIndex1() { + uint32 textIndex; + if (getGlobalVar(V_WORLDS_JOINED)) { + if (!getGlobalVar(V_DOOR_PASSED)) + textIndex = 18; + else if (!getGlobalVar(V_ROBOT_TARGET)) + textIndex = 19; + else if (getGlobalVar(V_ROBOT_HIT)) { + if (!getGlobalVar(V_ENTRANCE_OPEN)) + textIndex = 23; + else if (!getSubVar(VA_HAS_KEY, 0) && !getSubVar(VA_IS_KEY_INSERTED, 0)) + textIndex = 24; + else if (!getGlobalVar(V_HAS_FINAL_KEY)) + textIndex = 26; + else if (!getSubVar(VA_HAS_KEY, 1) && !getSubVar(VA_IS_KEY_INSERTED, 1)) + textIndex = 27; + else if (!getGlobalVar(V_HAS_FINAL_KEY)) + textIndex = 28; + else + textIndex = 29; + } else if (!getGlobalVar(V_FELL_DOWN_HOLE)) + textIndex = 20; + else if (!getGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT)) + textIndex = 21; + else + textIndex = 22; + } else if (getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { + if (!getGlobalVar(V_WALL_BROKEN)) + textIndex = 12; + else if (!getGlobalVar(V_STAIRS_DOWN_ONCE)) + textIndex = 13; + else if (!getGlobalVar(V_RADIO_ENABLED)) + textIndex = 50; + else if (!getGlobalVar(V_UNUSED)) + textIndex = 14; + else if (!getGlobalVar(V_BEEN_SHRINKING_ROOM)) + textIndex = 15; + else if (!getGlobalVar(V_BEEN_STATUE_ROOM)) + textIndex = 16; + else + textIndex = 17; + } else if (!getGlobalVar(V_FLYTRAP_RING_EATEN)) { + textIndex = 0; + } else if (getGlobalVar(V_CREATURE_EXPLODED)) { + if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) + textIndex = 4; + else if (!getGlobalVar(V_HAS_TEST_TUBE)) + textIndex = 5; + else if (!getSubVar(VA_LOCKS_DISABLED, 0x40119852)) + textIndex = 6; + else if (!getGlobalVar(V_WATER_RUNNING)) + textIndex = 7; + else if (!getGlobalVar(V_NOTES_PUZZLE_SOLVED)) + textIndex = 8; + else if (!getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) + textIndex = 9; + else if (!getSubVar(VA_LOCKS_DISABLED, 0x01180951)) + textIndex = 10; + else + textIndex = 11; + } else if (!getGlobalVar(V_CREATURE_ANGRY)) { + textIndex = 1; + } else if (getGlobalVar(V_TNT_DUMMY_BUILT)) { + textIndex = 3; + } else { + textIndex = 2; + } + return textIndex; +} + +uint32 Scene1005::getTextIndex2() { + uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX1); + if (textIndex + 1 >= 10) { + setGlobalVar(V_TEXT_COUNTING_INDEX1, 0); + textIndex = 0; + } else { + setGlobalVar(V_TEXT_COUNTING_INDEX1, textIndex + 1); + } + return textIndex + 40; +} + +uint32 Scene1005::getTextIndex3() { + uint32 textIndex = getGlobalVar(V_TEXT_COUNTING_INDEX2); + if (textIndex + 1 >= 10) { + setGlobalVar(V_TEXT_COUNTING_INDEX2, 0); + textIndex = 0; + } else { + setGlobalVar(V_TEXT_COUNTING_INDEX2, textIndex + 1); + } + return textIndex + 30; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1000.h b/engines/neverhood/modules/module1000.h new file mode 100644 index 0000000000..9977590a6a --- /dev/null +++ b/engines/neverhood/modules/module1000.h @@ -0,0 +1,300 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1000_H +#define NEVERHOOD_MODULES_MODULE1000_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1000 + +class Module1000 : public Module { +public: + Module1000(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1000(); +protected: + int _sceneNum; + uint32 _musicFileHash; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1001 + +class AsScene1001Door : public AnimatedSprite { +public: + AsScene1001Door(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void hammerHitsDoor(); + void stShowIdleDoor(); + void stBustedDoorMove(); + void stBustedDoorGone(); +}; + +class AsScene1001Hammer : public AnimatedSprite { +public: + AsScene1001Hammer(NeverhoodEngine *vm, Sprite *asDoor); +protected: + Sprite *_asDoor; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1001Window : public AnimatedSprite { +public: + AsScene1001Window(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1001Lever : public AnimatedSprite { +public: + AsScene1001Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int deltaXType); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsCommonButtonSprite : public StaticSprite { +public: + SsCommonButtonSprite(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, int surfacePriority, uint32 soundFileHash); +protected: + Scene *_parentScene; + uint32 _soundFileHash; + int16 _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1001 : public Scene { +public: + Scene1001(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1001(); +protected: + Sprite *_asHammer; + Sprite *_asDoor; + Sprite *_asWindow; + Sprite *_asLever; + Sprite *_ssButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// TODO: Move this to some common file since it's used several times + +class StaticScene : public Scene { +public: + StaticScene(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 cursorFileHash); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1002 + +class AsScene1002Ring : public AnimatedSprite { +public: + AsScene1002Ring(NeverhoodEngine *vm, Scene *parentScene, bool isSpecial, int16 x, int16 y, int16 clipY1, bool isRingLow); +protected: + Scene *_parentScene; + bool _isSpecial; + void update(); + uint32 hmRingIdle(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingPulled1(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingPulled2(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingHangingLow(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRingReleased(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1002Door : public StaticSprite { +public: + AsScene1002Door(NeverhoodEngine *vm, NRect &clipRect); +protected: + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suOpenDoor(); + void suCloseDoor(); +}; + +class AsScene1002BoxingGloveHitEffect : public AnimatedSprite { +public: + AsScene1002BoxingGloveHitEffect(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1002DoorSpy : public AnimatedSprite { +public: + AsScene1002DoorSpy(NeverhoodEngine *vm, NRect &clipRect, Scene *parentScene, Sprite *asDoor, Sprite *asScene1002BoxingGloveHitEffect); +protected: + Scene *_parentScene; + Sprite *_asDoor; + Sprite *_asBoxingGloveHitEffect; + NRect _clipRect; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmDoorSpyAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void suDoorSpy(); + void stDoorSpyIdle(); + void stDoorSpyBoxingGlove(); +}; + +class SsCommonPressButton : public StaticSprite { +public: + SsCommonPressButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); + void setFileHashes(uint32 fileHash1, uint32 fileHash2); +protected: + Scene *_parentScene; + uint32 _soundFileHash; + uint32 _fileHashes[2]; + int _status; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1002VenusFlyTrap : public AnimatedSprite { +public: + AsScene1002VenusFlyTrap(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, bool isSecond); +protected: + Scene *_parentScene; + Sprite *_klaymen; + int _countdown; + bool _isSecond; + void update(); + void upIdle(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimationSimple(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimationExt(int messageNum, const MessageParam ¶m, Entity *sender); + void stWalkBack(); + void stWalk(); + void stRelease(); + void stGrabRing(); + void stRingGrabbed(); + void stKlaymenInside(); + void stIdle(); + void stKlaymenInsideMoving(); + void stSpitOutKlaymen(); + void swallowKlaymen(); +}; + +class AsScene1002OutsideDoorBackground : public AnimatedSprite { +public: + AsScene1002OutsideDoorBackground(NeverhoodEngine *vm); +protected: + int _countdown; + bool _isDoorClosed; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); + void stDoorClosed(); +}; + +class AsScene1002KlaymenLadderHands : public AnimatedSprite { +public: + AsScene1002KlaymenLadderHands(NeverhoodEngine *vm, Klaymen *klaymen); +protected: + Klaymen *_klaymen; + void update(); +}; + +class AsScene1002KlaymenPeekHand : public AnimatedSprite { +public: + AsScene1002KlaymenPeekHand(NeverhoodEngine *vm, Scene *parentScene, Klaymen *klaymen); +protected: + Scene *_parentScene; + Klaymen *_klaymen; + bool _isClipRectSaved; + NRect _savedClipRect; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1002 : public Scene { +public: + Scene1002(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1002(); +protected: + Sprite *_asRing1; + Sprite *_asRing2; + Sprite *_asRing3; + Sprite *_asRing4; + Sprite *_asRing5; + Sprite *_asDoor; + Sprite *_asDoorSpy; + Sprite *_asVenusFlyTrap; + Sprite *_ssLadderArch; + Sprite *_ssLadderArchPart1; + Sprite *_ssLadderArchPart2; + Sprite *_ssLadderArchPart3; + Sprite *_ssCeiling; + Sprite *_asKlaymenLadderHands; + Sprite *_asKlaymenPeekHand; + Sprite *_asOutsideDoorBackground; + Sprite *_ssPressButton; + bool _isKlaymenFloor; + bool _isClimbingLadder; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1004 + +class AsScene1004TrashCan : public AnimatedSprite { +public: + AsScene1004TrashCan(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1004 : public Scene { +public: + Scene1004(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asKlaymenLadderHands; + Sprite *_asTrashCan; + int _paletteAreaStatus; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void updatePaletteArea(); +}; + +// Scene1005 + +class Scene1005 : public Scene { +public: + Scene1005(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void drawTextToBackground(); + uint32 getTextIndex(); + uint32 getTextIndex1(); + uint32 getTextIndex2(); + uint32 getTextIndex3(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1000_H */ diff --git a/engines/neverhood/modules/module1100.cpp b/engines/neverhood/modules/module1100.cpp new file mode 100644 index 0000000000..5a5e52e5b0 --- /dev/null +++ b/engines/neverhood/modules/module1100.cpp @@ -0,0 +1,707 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1100.h" +#include "neverhood/gamemodule.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +static const uint32 kModule1100SoundList[] = { + 0x90805C50, + 0xB288D450, + 0x98C05840, + 0x98A01500, + 0xB4005E50, + 0x92025040, + 0x90035066, + 0x74E01054, + 0 +}; + +Module1100::Module1100(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 1) { + createScene(8, 1); + } else { + createScene(8, 3); + } + + _vm->_soundMan->addSoundList(0x0002C818, kModule1100SoundList); + _vm->_soundMan->setSoundListParams(kModule1100SoundList, true, 50, 600, 20, 250); + _vm->_soundMan->setSoundParams(0x74E01054, false, 100, 200, 10, 20); + _vm->_soundMan->setSoundVolume(0x74E01054, 60); + _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); + +} + +Module1100::~Module1100() { + _vm->_soundMan->deleteGroup(0x0002C818); +} + +void Module1100::createScene(int sceneNum, int which) { + static const uint32 kSmackerFileHashList06[] = {0x10880805, 0x1088081D, 0}; + static const uint32 kSmackerFileHashList07[] = {0x00290321, 0x01881000, 0}; + debug("Module1100::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _countdown = 65; + createNavigationScene(0x004B8430, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _countdown = 50; + createNavigationScene(0x004B8460, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + if (getGlobalVar(V_ROBOT_TARGET)) { + createNavigationScene(0x004B84F0, which); + } else { + createNavigationScene(0x004B8490, which); + } + break; + case 3: + _vm->gameState().sceneNum = 3; + if (getGlobalVar(V_ROBOT_TARGET)) { + createNavigationScene(0x004B8580, which); + } else { + createNavigationScene(0x004B8550, which); + } + break; + case 4: + _vm->gameState().sceneNum = 4; + _childObject = new Scene1105(_vm, this); + break; + case 5: + _vm->gameState().sceneNum = 5; + if (getGlobalVar(V_ROBOT_TARGET)) + createSmackerScene(0x04180001, true, false, false); + else + createSmackerScene(0x04180007, true, false, false); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->_soundMan->deleteSoundGroup(0x0002C818); + createSmackerScene(kSmackerFileHashList06, true, true, false); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); + createSmackerScene(kSmackerFileHashList07, true, true, false); + break; + case 8: + _vm->gameState().sceneNum = 8; + _childObject = new Scene1109(_vm, this, which); + break; + case 1002: + _vm->gameState().sceneNum = 2; + _countdown = 40; + _vm->_soundMan->setTwoSoundsPlayFlag(true); + createSmackerScene(0x00012211, true, true, false); + break; + } + SetUpdateHandler(&Module1100::updateScene); + _childObject->handleUpdate(); +} + +void Module1100::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + _countdown = 0; + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 65); + _vm->_soundMan->setSoundVolume(0x50399F64, 65); + if (_moduleResult == 0) + createScene(1, 0); + else if (_moduleResult == 1) + createScene(8, 0); + break; + case 1: + _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); + if (getGlobalVar(V_ROBOT_HIT)) { + if (_moduleResult == 0) + createScene(6, -1); + else if (_moduleResult == 1) + createScene(0, 1); + } else { + if (_moduleResult == 0) + createScene(2, 0); + else if (_moduleResult == 1) + createScene(0, 1); + } + break; + case 2: + _vm->_soundMan->setSoundParams(0x74E01054, false, 0, 0, 0, 0); + if (_navigationAreaType == 3) + createScene(7, -1); + else if (_moduleResult == 1) + createScene(3, 0); + else if (_moduleResult == 2) + createScene(1002, -1); + break; + case 3: + if (_moduleResult == 0) + createScene(4, 0); + else if (_moduleResult == 1) + createScene(2, 3); + break; + case 4: + if (_moduleResult == 0) + createScene(3, 0); + else if (_moduleResult == 1) + createScene(5, -1); + break; + case 5: + _vm->_soundMan->setTwoSoundsPlayFlag(false); + if (getGlobalVar(V_ROBOT_TARGET)) + createScene(3, 0); + else + createScene(4, 0); + break; + case 6: + _vm->_soundMan->setTwoSoundsPlayFlag(false); + leaveModule(1); + break; + case 7: + _vm->_soundMan->setTwoSoundsPlayFlag(false); + createScene(2, 2); + break; + case 8: + if (_moduleResult == 0) + createScene(0, 0); + else if (_moduleResult == 1) + leaveModule(0); + break; + case 1002: + _vm->_soundMan->setTwoSoundsPlayFlag(false); + _countdown = 0; + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + createScene(1, 1); + break; + } + } else { + switch (_sceneNum) { + case 0: + if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) { + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 65); + _vm->_soundMan->setSoundVolume(0x50399F64, 65); + } + break; + case 1: + if (navigationScene()->isWalkingForward() && _countdown != 0 && (--_countdown == 0)) + _vm->_soundMan->playTwoSounds(0x0002C818, 0x41861371, 0x43A2507F, 0); + break; + case 2: + _vm->_soundMan->setSoundParams(0x74E01054, !navigationScene()->isWalkingForward(), 0, 0, 0, 0); + break; + case 5: + case 6: + case 7: + case 1002: + if (_countdown != 0 && (--_countdown == 0)) { + _vm->_soundMan->playTwoSounds(0x0002C818, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 65); + _vm->_soundMan->setSoundVolume(0x50399F64, 65); + } + break; + } + } +} + +static const uint32 kScene1105FileHashes[] = { + 0x00028006, + 0x0100A425, + 0x63090415, + 0x082100C4, + 0x0068C607, + 0x00018344, + 0x442090E4, + 0x0400E004, + 0x5020A054, + 0xB14A891E +}; + +static const uint32 kScene1105BackgroundFileHashes[] = { + 0x20018662, + 0x20014202, + 0x20012202, + 0x20010002 // CHECKME: This used ?? +}; + +static const uint32 kSsScene1105SymbolDieFileHashes[] = { + 0, + 0x90898414, + 0x91098414, + 0x92098414, + 0x94098414, + 0x98098414, + 0x80098414, + 0xB0098414, + 0xD0098414, + 0x10098414 +}; + +SsScene1105Button::SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds) + : StaticSprite(vm, fileHash, 200), _parentScene(parentScene), _countdown(0) { + + _collisionBounds = collisionBounds; + SetMessageHandler(&SsScene1105Button::handleMessage); + SetUpdateHandler(&SsScene1105Button::update); + setVisible(false); +} + +void SsScene1105Button::update() { + if (_countdown != 0 && (--_countdown == 0)) { + sendMessage(_parentScene, 0x4807, 0); + setVisible(false); + } +} + +uint32 SsScene1105Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + } + break; + case 0x480B: + _countdown = 8; + setVisible(true); + playSound(0, 0x44141000); + break; + } + return messageResult; +} + +SsScene1105Symbol::SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y) + : StaticSprite(vm, 0) { + + loadSprite(fileHash, kSLFCenteredDrawOffset | kSLFSetPosition, 200, x, y); +} + +void SsScene1105Symbol::hide() { + setVisible(false); + _needRefresh = true; + updatePosition(); +} + +SsScene1105SymbolDie::SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y) + : StaticSprite(vm, 1100), _dieIndex(dieIndex) { + + _x = x; + _y = y; + createSurface(200, 50, 50); + loadSymbolSprite(); + SetMessageHandler(&SsScene1105SymbolDie::handleMessage); +} + +uint32 SsScene1105SymbolDie::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + loadSymbolSprite(); + break; + } + return messageResult; +} + +void SsScene1105SymbolDie::loadSymbolSprite() { + loadSprite(kSsScene1105SymbolDieFileHashes[getSubVar(VA_CURR_DICE_NUMBERS, _dieIndex)], kSLFCenteredDrawOffset); +} + +void SsScene1105SymbolDie::hide() { + setVisible(false); + _needRefresh = true; + updatePosition(); +} + +AsScene1105TeddyBear::AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(100, 556, 328); + _x = 320; + _y = 240; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1105TeddyBear::handleMessage); + startAnimation(0x65084002, 0, -1); + _newStickFrameIndex = 0; + setVisible(false); + _needRefresh = true; + updatePosition(); + loadSound(0, 0xCE840261); + loadSound(1, 0xCCA41A62); +} + +uint32 AsScene1105TeddyBear::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + if (getGlobalVar(V_ROBOT_TARGET)) { + startAnimation(0x6B0C0432, 0, -1); + playSound(0); + } else { + startAnimation(0x65084002, 0, -1); + playSound(1); + } + break; + case 0x3002: + sendMessage(_parentScene, 0x2003, 0); + stopAnimation(); + break; + } + return messageResult; +} + +void AsScene1105TeddyBear::show() { + setVisible(true); + _needRefresh = true; + updatePosition(); +} + +void AsScene1105TeddyBear::hide() { + setVisible(false); + _needRefresh = true; + updatePosition(); +} + +SsScene1105OpenButton::SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _isClicked(false) { + + loadSprite(0x8228A46C, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); + loadSound(0, 0x44045140); + SetUpdateHandler(&SsScene1105OpenButton::update); + SetMessageHandler(&SsScene1105OpenButton::handleMessage); +} + +void SsScene1105OpenButton::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + setVisible(false); + sendMessage(_parentScene, 0x2001, 0); + } +} + +uint32 SsScene1105OpenButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_isClicked) { + playSound(0); + setVisible(true); + _isClicked = true; + _countdown = 4; + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene1105::Scene1105(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _countdown(0), _isPanelOpen(false), _isActionButtonClicked(false), _doMoveTeddy(false), + _isClosePanelDone(false), _leaveResult(0), _backgroundIndex(0) { + + Sprite *ssOpenButton; + + _vm->gameModule()->initMemoryPuzzle(); + + SetUpdateHandler(&Scene1105::update); + SetMessageHandler(&Scene1105::handleMessage); + + setBackground(0x20010002); + setPalette(0x20010002); + + _asTeddyBear = insertSprite(this); + ssOpenButton = insertSprite(this); + addCollisionSprite(ssOpenButton); + insertPuzzleMouse(0x10006208, 20, 620); + + loadSound(0, 0x48442057); + loadSound(1, 0xC025014F); + loadSound(2, 0x68E25540); + +} + +uint32 Scene1105::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + if (!_isActionButtonClicked && _backgroundIndex == 0) { + if (_isPanelOpen) { + _isPanelOpen = false; + _backgroundIndex = 15; + SetUpdateHandler(&Scene1105::upClosePanel); + } else + _isPanelOpen = true; + _leaveResult = 0; + } + } + break; + case 0x2001: + showMouse(false); + _backgroundIndex = 24; + SetUpdateHandler(&Scene1105::upOpenPanel); + break; + case 0x2003: + _backgroundIndex = 24; + _leaveResult = 1; + SetUpdateHandler(&Scene1105::upClosePanel); + break; + case 0x4807: + if (sender == _ssActionButton) { + if (getSubVar(VA_GOOD_DICE_NUMBERS, 0) == getSubVar(VA_CURR_DICE_NUMBERS, 0) && + getSubVar(VA_GOOD_DICE_NUMBERS, 1) == getSubVar(VA_CURR_DICE_NUMBERS, 1) && + getSubVar(VA_GOOD_DICE_NUMBERS, 2) == getSubVar(VA_CURR_DICE_NUMBERS, 2)) { + setGlobalVar(V_ROBOT_TARGET, 1); + playSound(2); + _doMoveTeddy = true; + } else { + sendMessage(_asTeddyBear, 0x2002, 0); + } + showMouse(false); + _isActionButtonClicked = true; + } + break; + case 0x4826: + if (_isPanelOpen) { + if (sender == _ssActionButton) { + sendMessage(_ssActionButton, 0x480B, 0); + _isPanelOpen = false; + } else if (!getGlobalVar(V_ROBOT_TARGET)) { + if (sender == _ssSymbol1UpButton) { + if (getSubVar(VA_CURR_DICE_NUMBERS, 0) < 9) { + incSubVar(VA_CURR_DICE_NUMBERS, 0, +1); + sendMessage(_ssSymbol1UpButton, 0x480B, 0); + sendMessage(_ssSymbolDice[0], 0x2000, 0); + } + } else if (sender == _ssSymbol1DownButton) { + if (getSubVar(VA_CURR_DICE_NUMBERS, 0) > 1) { + incSubVar(VA_CURR_DICE_NUMBERS, 0, -1); + sendMessage(_ssSymbol1DownButton, 0x480B, 0); + sendMessage(_ssSymbolDice[0], 0x2000, 0); + } + } else if (sender == _ssSymbol2UpButton) { + if (getSubVar(VA_CURR_DICE_NUMBERS, 1) < 9) { + incSubVar(VA_CURR_DICE_NUMBERS, 1, +1); + sendMessage(_ssSymbol2UpButton, 0x480B, 0); + sendMessage(_ssSymbolDice[1], 0x2000, 0); + } + } else if (sender == _ssSymbol2DownButton) { + if (getSubVar(VA_CURR_DICE_NUMBERS, 1) > 1) { + incSubVar(VA_CURR_DICE_NUMBERS, 1, -1); + sendMessage(_ssSymbol2DownButton, 0x480B, 0); + sendMessage(_ssSymbolDice[1], 0x2000, 0); + } + } else if (sender == _ssSymbol3UpButton) { + if (getSubVar(VA_CURR_DICE_NUMBERS, 2) < 9) { + incSubVar(VA_CURR_DICE_NUMBERS, 2, +1); + sendMessage(_ssSymbol3UpButton, 0x480B, 0); + sendMessage(_ssSymbolDice[2], 0x2000, 0); + } + } else if (sender == _ssSymbol3DownButton) { + if (getSubVar(VA_CURR_DICE_NUMBERS, 2) > 1) { + incSubVar(VA_CURR_DICE_NUMBERS, 2, -1); + sendMessage(_ssSymbol3DownButton, 0x480B, 0); + sendMessage(_ssSymbolDice[2], 0x2000, 0); + } + } + } + } + break; + } + return messageResult; +} + +void Scene1105::createObjects() { + _ssSymbols[0] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 0)], 161, 304); + _ssSymbols[1] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 1)], 294, 304); + _ssSymbols[2] = insertSprite(kScene1105FileHashes[getSubVar(VA_DICE_MEMORY_SYMBOLS, 2)], 440, 304); + + _ssSymbolDice[0] = insertSprite(0, 206, 304); + _ssSymbolDice[1] = insertSprite(1, 339, 304); + _ssSymbolDice[2] = insertSprite(2, 485, 304); + + _ssSymbol1UpButton = insertSprite(this, 0x08002860, NRect(146, 362, 192, 403)); + addCollisionSprite(_ssSymbol1UpButton); + _ssSymbol1DownButton = insertSprite(this, 0x42012460, NRect(147, 404, 191, 442)); + addCollisionSprite(_ssSymbol1DownButton); + _ssSymbol2UpButton = insertSprite(this, 0x100030A0, NRect(308, 361, 355, 402)); + addCollisionSprite(_ssSymbol2UpButton); + _ssSymbol2DownButton = insertSprite(this, 0x840228A0, NRect(306, 406, 352, 445)); + addCollisionSprite(_ssSymbol2DownButton); + _ssSymbol3UpButton = insertSprite(this, 0x20000120, NRect(476, 358, 509, 394)); + addCollisionSprite(_ssSymbol3UpButton); + _ssSymbol3DownButton = insertSprite(this, 0x08043121, NRect(463, 401, 508, 438)); + addCollisionSprite(_ssSymbol3DownButton); + _ssActionButton = insertSprite(this, 0x8248AD35, NRect(280, 170, 354, 245)); + addCollisionSprite(_ssActionButton); + + _isPanelOpen = true; + + _asTeddyBear->show(); + + insertPuzzleMouse(0x18666208, 20, 620); + +} + +void Scene1105::upOpenPanel() { + Scene::update(); + if (_backgroundIndex != 0) { + _backgroundIndex--; + if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { + uint32 backgroundFileHash = kScene1105BackgroundFileHashes[_backgroundIndex / 2]; + changeBackground(backgroundFileHash); + _palette->addPalette(backgroundFileHash, 0, 256, 0); + } + if (_backgroundIndex == 10) + playSound(0); + if (_backgroundIndex == 0) { + SetUpdateHandler(&Scene1105::update); + _countdown = 2; + } + } +} + +void Scene1105::upClosePanel() { + Scene::update(); + if (_backgroundIndex != 0) { + _backgroundIndex--; + if (_backgroundIndex == 14) { + showMouse(false); + _ssSymbols[0]->hide(); + _ssSymbols[1]->hide(); + _ssSymbols[2]->hide(); + _ssSymbolDice[0]->hide(); + _ssSymbolDice[1]->hide(); + _ssSymbolDice[2]->hide(); + } + if (_backgroundIndex < 6 && _backgroundIndex % 2 == 0) { + uint32 backgroundFileHash = kScene1105BackgroundFileHashes[3 - _backgroundIndex / 2]; // CHECKME + if (_backgroundIndex == 4) { + playSound(1); + _asTeddyBear->hide(); + } + changeBackground(backgroundFileHash); + _palette->addPalette(backgroundFileHash, 0, 256, 0); + } + if (_backgroundIndex == 0) { + SetUpdateHandler(&Scene1105::update); + _isClosePanelDone = true; + } + } +} + +void Scene1105::update() { + + // DEBUG: Show the correct code + debug("(%d, %d) (%d, %d) (%d, %d)", + getSubVar(VA_GOOD_DICE_NUMBERS, 0), getSubVar(VA_CURR_DICE_NUMBERS, 0), + getSubVar(VA_GOOD_DICE_NUMBERS, 1), getSubVar(VA_CURR_DICE_NUMBERS, 1), + getSubVar(VA_GOOD_DICE_NUMBERS, 2), getSubVar(VA_CURR_DICE_NUMBERS, 2)); + + Scene::update(); + if (_countdown != 0 && (--_countdown == 0)) + createObjects(); + if (_isClosePanelDone && !isSoundPlaying(1)) + leaveScene(_leaveResult); + if (_doMoveTeddy && !isSoundPlaying(2)) { + sendMessage(_asTeddyBear, 0x2002, 0); + _doMoveTeddy = false; + } +} + +Scene1109::Scene1109(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene1109::handleMessage); + + setBackground(0x8449E02F); + setPalette(0x8449E02F); + insertScreenMouse(0x9E02B84C); + + _sprite1 = insertStaticSprite(0x600CEF01, 1100); + + if (which < 0) { + // Restoring game + insertKlaymen(140, 436); + setMessageList(0x004B6260); + sendMessage(this, 0x2000, 0); + } else if (which == 1) { + // Klaymen teleporting in + insertKlaymen(450, 436); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B6268, false); + sendMessage(this, 0x2000, 1); + } else if (which == 2) { + // Klaymen teleporting out + insertKlaymen(450, 436); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B6318, false); + sendMessage(this, 0x2000, 1); + } else if (which == 3) { + // Klaymen returning from teleporter console + insertKlaymen(450, 436); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B6278, false); + sendMessage(this, 0x2000, 1); + } else { + // Klaymen entering from the left + insertKlaymen(0, 436); + setMessageList(0x004B6258); + sendMessage(this, 0x2000, 0); + } + + _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), 480); + +} + +uint32 Scene1109::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004B63A8); + _klaymen->setKlaymenIdleTable3(); + } else { + setRectList(0x004B6398); + _klaymen->setKlaymenIdleTable1(); + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1100.h b/engines/neverhood/modules/module1100.h new file mode 100644 index 0000000000..373f6b703f --- /dev/null +++ b/engines/neverhood/modules/module1100.h @@ -0,0 +1,130 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1100_H +#define NEVERHOOD_MODULES_MODULE1100_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1100 + +class Module1100 : public Module { +public: + Module1100(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1100(); +protected: + int _sceneNum; + int _countdown; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class SsScene1105Button : public StaticSprite { +public: + SsScene1105Button(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash, NRect &collisionBounds); +protected: + Scene *_parentScene; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene1105Symbol : public StaticSprite { +public: + SsScene1105Symbol(NeverhoodEngine *vm, uint32 fileHash, int16 x, int16 y); + void hide(); +}; + +class SsScene1105SymbolDie : public StaticSprite { +public: + SsScene1105SymbolDie(NeverhoodEngine *vm, uint dieIndex, int16 x, int16 y); + void hide(); +protected: + uint _dieIndex; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void loadSymbolSprite(); +}; + +class AsScene1105TeddyBear : public AnimatedSprite { +public: + AsScene1105TeddyBear(NeverhoodEngine *vm, Scene *parentScene); + void show(); + void hide(); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene1105OpenButton : public StaticSprite { +public: + SsScene1105OpenButton(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + int _countdown; + bool _isClicked; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1105 : public Scene { +public: + Scene1105(NeverhoodEngine *vm, Module *parentModule); +protected: + int _countdown; + int _backgroundIndex; + bool _isPanelOpen; + bool _isActionButtonClicked; + bool _doMoveTeddy; + bool _isClosePanelDone; + int _leaveResult; + AsScene1105TeddyBear *_asTeddyBear; + SsScene1105Symbol *_ssSymbols[3]; + SsScene1105SymbolDie *_ssSymbolDice[3]; + Sprite *_ssSymbol1UpButton; + Sprite *_ssSymbol1DownButton; + Sprite *_ssSymbol2UpButton; + Sprite *_ssSymbol2DownButton; + Sprite *_ssSymbol3UpButton; + Sprite *_ssSymbol3DownButton; + Sprite *_ssActionButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createObjects(); + void upOpenPanel(); + void upClosePanel(); + void update(); +}; + +class Scene1109 : public Scene { +public: + Scene1109(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1100_H */ diff --git a/engines/neverhood/modules/module1200.cpp b/engines/neverhood/modules/module1200.cpp new file mode 100644 index 0000000000..3be3635645 --- /dev/null +++ b/engines/neverhood/modules/module1200.cpp @@ -0,0 +1,1102 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1200.h" + +namespace Neverhood { + +Module1200::Module1200(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + SetMessageHandler(&Module1200::handleMessage); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 1) + createScene(0, 2); + else + createScene(0, 0); + + _vm->_soundMan->addMusic(0x00478311, 0x62222CAE); + _vm->_soundMan->startMusic(0x62222CAE, 0, 0); +} + +Module1200::~Module1200() { + _vm->_soundMan->deleteMusicGroup(0x00478311); +} + +void Module1200::createScene(int sceneNum, int which) { + debug("Module1200::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1201(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _childObject = new Scene1202(_vm, this); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->stopMusic(0x62222CAE, 0, 0); + createSmackerScene(0x31890001, true, true, false); + setGlobalVar(V_SEEN_CREATURE_EXPLODE_VID, 1); + break; + } + SetUpdateHandler(&Module1200::updateScene); + _childObject->handleUpdate(); +} + +void Module1200::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(1, 0); + else if (_moduleResult == 2) { + if (getGlobalVar(V_CREATURE_EXPLODED) && !getGlobalVar(V_SEEN_CREATURE_EXPLODE_VID)) + createScene(2, -1); + else + leaveModule(1); + } else + leaveModule(0); + break; + case 1: + createScene(0, 1); + break; + case 2: + _vm->_soundMan->startMusic(0x62222CAE, 0, 0); + createScene(0, 3); + break; + } + } +} + +// Scene1201 + +static const uint32 kScene1201InitArray[] = { + 1, 0, 2, 4, 5, 3, 6, 7, 8, 10, 9, 11, 13, 14, 12, 16, 17, 15 +}; + +static const NPoint kScene1201PointArray[] = { + {218, 193}, {410, 225}, {368, 277}, + {194, 227}, {366, 174}, {458, 224}, + {242, 228}, {512, 228}, {458, 277}, + {217, 233}, {458, 173}, {410, 276}, + {203, 280}, {371, 226}, {508, 279}, + {230, 273}, {410, 171}, {493, 174} +}; + +static const uint32 kScene1201TntFileHashList1[] = { + 0x2098212D, 0x1600437E, 0x1600437E, + 0x00A840E3, 0x1A1830F6, 0x1A1830F6, + 0x00212062, 0x384010B6, 0x384010B6, + 0x07A01080, 0xD80C2837, 0xD80C2837, + 0x03A22092, 0xD8802CB6, 0xD8802CB6, + 0x03A93831, 0xDA460476, 0xDA460476 +}; + +static const uint32 kScene1201TntFileHashList2[] = { + 0x3040C676, 0x10914448, 0x10914448, + 0x3448A066, 0x1288C049, 0x1288C049, + 0x78C0E026, 0x3098D05A, 0x3098D05A, + 0x304890E6, 0x1284E048, 0x1284E048, + 0xB140A1E6, 0x5088A068, 0x5088A068, + 0x74C4C866, 0x3192C059, 0x3192C059 +}; + +SsScene1201Tnt::SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2) + : StaticSprite(vm, 900) { + + int16 x = kScene1201PointArray[pointIndex].x; + int16 y = kScene1201PointArray[pointIndex].y; + if (x < 300) + loadSprite(kScene1201TntFileHashList1[elemIndex], kSLFDefDrawOffset | kSLFDefPosition, 50); + else + loadSprite(kScene1201TntFileHashList2[elemIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 50, x, y); + setClipRect(0, 0, 640, clipY2); +} + +AsScene1201Tape::AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash) + : AnimatedSprite(vm, fileHash, surfacePriority, x, y), _parentScene(parentScene), _nameHash(nameHash) { + + if (!getSubVar(VA_HAS_TAPE, _nameHash) && !getSubVar(VA_IS_TAPE_INSERTED, _nameHash)) { + SetMessageHandler(&AsScene1201Tape::handleMessage); + } else { + setVisible(false); + SetMessageHandler(NULL); + } +} + +uint32 AsScene1201Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4806: + setSubVar(VA_HAS_TAPE, _nameHash, 1); + setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +AsScene1201TntManRope::AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging) + : AnimatedSprite(vm, 1200) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1201TntManRope::handleMessage); + createSurface(10, 34, 149); + _x = 202; + _y = -32; + if (isDummyHanging) { + startAnimation(0x928F0C10, 15, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } else { + startAnimation(0x928F0C10, 0, -1); + _newStickFrameIndex = 0; + } +} + +uint32 AsScene1201TntManRope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02060018) + playSound(0, 0x47900E06); + break; + case 0x2006: + startAnimation(0x928F0C10, 1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + break; + } + return messageResult; +} + +AsScene1201RightDoor::AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0) { + + createSurface1(0xD088AC30, 100); + _x = 320; + _y = 240; + SetUpdateHandler(&AsScene1201RightDoor::update); + SetMessageHandler(&AsScene1201RightDoor::handleMessage); + _newStickFrameIndex = STICK_LAST_FRAME; + if (isOpen) { + startAnimation(0xD088AC30, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + _countdown = 25; + } else { + stopAnimation(); + setVisible(false); + } +} + +void AsScene1201RightDoor::update() { + if (_countdown != 0 && (--_countdown == 0)) + stCloseDoor(); + AnimatedSprite::update(); +} + +uint32 AsScene1201RightDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + case 0x4829: + stOpenDoor(); + break; + } + return messageResult; +} + +void AsScene1201RightDoor::stOpenDoor() { + startAnimation(0xD088AC30, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + setVisible(true); + playSound(0, calcHash("fxDoorOpen20")); +} + +void AsScene1201RightDoor::stCloseDoor() { + startAnimation(0xD088AC30, -1, -1); + _playBackwards = true; + setVisible(true); + playSound(0, calcHash("fxDoorClose20")); + NextState(&AsScene1201RightDoor::stCloseDoorDone); +} + +void AsScene1201RightDoor::stCloseDoorDone() { + stopAnimation(); + setVisible(false); +} + +AsScene1201KlaymenHead::AsScene1201KlaymenHead(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200) { + + createSurface(1200, 69, 98); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1201KlaymenHead::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + setVisible(false); +} + +uint32 AsScene1201KlaymenHead::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2006: + _x = 436; + _y = 339; + startAnimation(0xA060C599, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + gotoNextState(); + break; + } + return messageResult; +} + +AsScene1201TntMan::AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isComingDown) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _asTntManRope(asTntManRope), + _isMoving(false) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1201TntMan::handleMessage); + createSurface(990, 106, 181); + _x = 201; + if (isComingDown) { + _y = 297; + stComingDown(); + } else { + _y = 334; + stStanding(); + } +} + +AsScene1201TntMan::~AsScene1201TntMan() { + _vm->_soundMan->deleteSoundGroup(0x01D00560); +} + +uint32 AsScene1201TntMan::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x092870C0) + sendMessage(_asTntManRope, 0x2006, 0); + else if (param.asInteger() == 0x11CA0144) + playSound(0, 0x51800A04); + break; + case 0x1011: + sendMessage(_parentScene, 0x2002, 0); + messageResult = 1; + break; + case 0x480B: + if (!_isMoving) { + _sprite = (Sprite*)sender; + stMoving(); + } + break; + } + return messageResult; + +} + +uint32 AsScene1201TntMan::hmComingDown(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = AsScene1201TntMan::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1201TntMan::suMoving() { + _x = _sprite->getX() + 100; +} + +void AsScene1201TntMan::stStanding() { + startAnimation(0x654913D0, 0, -1); + SetMessageHandler(&AsScene1201TntMan::handleMessage); + SetSpriteUpdate(NULL); +} + +void AsScene1201TntMan::stComingDown() { + startAnimation(0x356803D0, 0, -1); + SetMessageHandler(&AsScene1201TntMan::hmComingDown); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + NextState(&AsScene1201TntMan::stStanding); +} + +void AsScene1201TntMan::stMoving() { + _vm->_soundMan->addSound(0x01D00560, 0x4B044624); + _vm->_soundMan->playSoundLooping(0x4B044624); + _isMoving = true; + startAnimation(0x85084190, 0, -1); + SetMessageHandler(&AsScene1201TntMan::handleMessage); + SetSpriteUpdate(&AsScene1201TntMan::suMoving); + _newStickFrameIndex = STICK_LAST_FRAME; +} + +AsScene1201TntManFlame::AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan) + : AnimatedSprite(vm, 1200), _asTntMan(asTntMan) { + + createSurface1(0x828C0411, 995); + SetUpdateHandler(&AsScene1201TntManFlame::update); + SetMessageHandler(&Sprite::handleMessage); + SetSpriteUpdate(&AsScene1201TntManFlame::suUpdate); + startAnimation(0x828C0411, 0, -1); + setVisible(false); +} + +AsScene1201TntManFlame::~AsScene1201TntManFlame() { + _vm->_soundMan->deleteSoundGroup(0x041080A4); +} + +void AsScene1201TntManFlame::update() { + AnimatedSprite::update(); + if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { + setVisible(true); + SetUpdateHandler(&AnimatedSprite::update); + _vm->_soundMan->addSound(0x041080A4, 0x460A1050); + _vm->_soundMan->playSoundLooping(0x460A1050); + } +} + +void AsScene1201TntManFlame::suUpdate() { + _x = _asTntMan->getX() - 18; + _y = _asTntMan->getY() - 158; +} + +AsScene1201Match::AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _countdown(0) { + + createSurface(1100, 57, 60); + SetUpdateHandler(&AsScene1201Match::update); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + switch (getGlobalVar(V_MATCH_STATUS)) { + case 0: + _x = 521; + _y = 112; + _status = 0; + stIdleOnDoorFrame(); + break; + case 1: + _x = 521; + _y = 112; + _status = 2; + stOnDoorFrameAboutToMove(); + loadSound(0, 0xD00230CD); + break; + case 2: + setDoDeltaX(1); + _x = 403; + _y = 337; + _status = 0; + stIdleOnFloor(); + break; + } +} + +void AsScene1201Match::update() { + if (_countdown != 0 && (--_countdown == 0)) + gotoNextState(); + updateAnim(); + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene1201Match::hmOnDoorFrameAboutToMove(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x86668011) + playSound(0); + break; + } + return messageResult; +} + +uint32 AsScene1201Match::hmOnDoorFrameMoving(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +uint32 AsScene1201Match::hmIdle(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmOnDoorFrameAboutToMove(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x2001, 0); + messageResult = 1; + break; + case 0x4806: + setVisible(false); + setGlobalVar(V_MATCH_STATUS, 3); + break; + } + return messageResult; +} + +void AsScene1201Match::stOnDoorFrameMoving() { + startAnimation(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving); + if (_status == 0) { + NextState(&AsScene1201Match::stFallingFromDoorFrame); + } else { + NextState(&AsScene1201Match::stOnDoorFrameAboutToMove); + } +} + +void AsScene1201Match::stFallingFromDoorFrame() { + setGlobalVar(V_MATCH_STATUS, 2); + _x -= 199; + _y += 119; + startAnimation(0x018D0240, 0, -1); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameMoving); + NextState(&AsScene1201Match::stIdleOnFloor); +} + +void AsScene1201Match::stOnDoorFrameAboutToMove() { + startAnimation(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::hmOnDoorFrameAboutToMove); + _newStickFrameIndex = 0; + if (_status != 0) { + _countdown = 36; + _status--; + NextState(&AsScene1201Match::stOnDoorFrameMoving); + } +} + +void AsScene1201Match::stIdleOnDoorFrame() { + startAnimation(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::hmIdle); + _newStickFrameIndex = 0; +} + +void AsScene1201Match::stIdleOnFloor() { + setDoDeltaX(1); + _x = 403; + _y = 337; + startAnimation(0x00842374, 0, -1); + SetMessageHandler(&AsScene1201Match::hmIdle); + _newStickFrameIndex = 0; +} + +AsScene1201Creature::AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _klaymen(klaymen), _klaymenTooClose(false) { + + // NOTE: _countdown2 and _countdown3 were unused/without effect and thus removed + + createSurface(1100, 203, 199); + SetUpdateHandler(&AsScene1201Creature::update); + SetMessageHandler(&AsScene1201Creature::hmWaiting); + _x = 540; + _y = 320; + stWaiting(); +} + +void AsScene1201Creature::update() { + bool oldKlaymenTooClose = _klaymenTooClose; + _klaymenTooClose = _klaymen->getX() >= 385; + if (_klaymenTooClose != oldKlaymenTooClose) + stWaiting(); + if (_countdown != 0 && (--_countdown == 0)) + gotoNextState(); + updateAnim(); + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene1201Creature::hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02060018) + playSound(0, 0xCD298116); + break; + case 0x2004: + GotoState(&AsScene1201Creature::stStartReachForTntDummy); + break; + case 0x2006: + GotoState(&AsScene1201Creature::stPincerSnapKlaymen); + break; + } + return messageResult; +} + +uint32 AsScene1201Creature::hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = hmWaiting(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +uint32 AsScene1201Creature::hmPincerSnapKlaymen(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02060018) { + playSound(0, 0xCD298116); + sendMessage(_parentScene, 0x4814, 0); + sendMessage(_klaymen, 0x4814, 0); + } + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1201Creature::stWaiting() { + startAnimation(0x08081513, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmWaiting); + NextState(&AsScene1201Creature::stPincerSnap); + _countdown = 36; +} + +void AsScene1201Creature::stPincerSnap() { + if (!_klaymenTooClose) { + startAnimation(0xCA287133, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmPincerSnap); + NextState(&AsScene1201Creature::stWaiting); + } +} + +void AsScene1201Creature::stStartReachForTntDummy() { + startAnimation(0x08081513, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmWaiting); + NextState(&AsScene1201Creature::stReachForTntDummy); + _countdown = 48; +} + +void AsScene1201Creature::stReachForTntDummy() { + startAnimation(0x5A201453, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmWaiting); + _countdown = 0; +} + +void AsScene1201Creature::stPincerSnapKlaymen() { + startAnimation(0xCA287133, 0, -1); + SetMessageHandler(&AsScene1201Creature::hmPincerSnapKlaymen); + NextState(&AsScene1201Creature::stWaiting); + _countdown = 0; +} + +AsScene1201LeftDoor::AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen) { + + _x = 320; + _y = 240; + createSurface(800, 55, 199); + if (_klaymen->getX() < 100) { + startAnimation(0x508A111B, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + playSound(0, calcHash("fxDoorOpen03")); + } else { + startAnimation(0x508A111B, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1201LeftDoor::handleMessage); +} + +uint32 AsScene1201LeftDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4809: + stCloseDoor(); + break; + } + return messageResult; +} + +void AsScene1201LeftDoor::stCloseDoor() { + startAnimation(0x508A111B, -1, -1); + _playBackwards = true; + _newStickFrameIndex = 0; +} + +Scene1201::Scene1201(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _creatureExploded(false), _asMatch(NULL), _asTntMan(NULL), + _asCreature(NULL), _asTntManRope(NULL), _asLeftDoor(NULL), _asRightDoor(NULL), _asTape(NULL) { + + int16 topY1, topY2, topY3, topY4; + int16 x1, x2; + Sprite *tempSprite; + + SetUpdateHandler(&Scene1201::update); + SetMessageHandler(&Scene1201::handleMessage); + + setHitRects(0x004AEBD0); + + if (!getSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52)) { + setSubVar(VA_IS_PUZZLE_INIT, 0xE8058B52, 1); + for (uint32 index = 0; index < 18; index++) + setSubVar(VA_TNT_POSITIONS, index, kScene1201InitArray[index]); + } + + insertScreenMouse(0x9A2C0409); + + _asTape = insertSprite(this, 3, 1100, 243, 340, 0x9148A011); + addCollisionSprite(_asTape); + + tempSprite = insertStaticSprite(0x03C82530, 100); + topY1 = tempSprite->getY() + tempSprite->getDrawRect().height; + + tempSprite = insertStaticSprite(0x88182069, 200); + topY2 = tempSprite->getY() + tempSprite->getDrawRect().height; + + tempSprite = insertStaticSprite(0x476014E0, 300); + topY3 = tempSprite->getY() + tempSprite->getDrawRect().height; + + tempSprite = insertStaticSprite(0x04063110, 500); + topY4 = tempSprite->getY() + 1; + + _asTntManRope = insertSprite(getGlobalVar(V_TNT_DUMMY_BUILT) && which != 1); + _asTntManRope->setClipRect(0, topY4, 640, 480); + + insertStaticSprite(0x400B04B0, 1200); + + tempSprite = insertStaticSprite(0x40295462, 1200); + x1 = tempSprite->getX(); + + tempSprite = insertStaticSprite(0xA29223FA, 1200); + x2 = tempSprite->getX() + tempSprite->getDrawRect().width; + + _asKlaymenHead = insertSprite(); + + if (which < 0) { + // Restoring game + insertKlaymen(364, 333); + setMessageList(0x004AEC08); + } else if (which == 3) { + // Klaymen standing after the weasel exploded + insertKlaymen(400, 329); + setMessageList(0x004AEC08); + } else if (which == 2) { + // Klaymen entering from the right + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { + insertKlaymen(374, 333); + setMessageList(0x004AEC08); + } else { + insertKlaymen(640, 329); + setMessageList(0x004AEC20); + } + } else if (which == 1) { + // Klaymen returning from the TNT console + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(364, 333); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen(246, 333); + } + setMessageList(0x004AEC30); + } else { + // Klaymen entering from the left + insertKlaymen(0, 336); + setMessageList(0x004AEC10); + } + + _klaymen->setClipRect(x1, 0, x2, 480); + _klaymen->setRepl(64, 0); + + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { + setBackground(0x4019A2C4); + setPalette(0x4019A2C4); + _asRightDoor = NULL; + } else { + setBackground(0x40206EC5); + setPalette(0x40206EC5); + _asRightDoor = insertSprite(_klaymen, which == 2); + } + + if (getGlobalVar(V_TNT_DUMMY_BUILT)) { + insertStaticSprite(0x10002ED8, 500); + if (!getGlobalVar(V_CREATURE_EXPLODED)) { + _asTntMan = insertSprite(this, _asTntManRope, which == 1); + _asTntMan->setClipRect(x1, 0, x2, 480); + _asTntMan->setRepl(64, 0); + addCollisionSprite(_asTntMan); + tempSprite = insertSprite(_asTntMan); + tempSprite->setClipRect(x1, 0, x2, 480); + } + + uint32 tntIndex = 1; + while (tntIndex < 18) { + uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); + int16 clipY2; + if (kScene1201PointArray[elemIndex].y < 175) + clipY2 = topY1; + else if (kScene1201PointArray[elemIndex].y < 230) + clipY2 = topY2; + else + clipY2 = topY3; + insertSprite(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); + elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex + 1); + if (kScene1201PointArray[elemIndex].y < 175) + clipY2 = topY1; + else if (kScene1201PointArray[elemIndex].y < 230) + clipY2 = topY2; + else + clipY2 = topY3; + insertSprite(tntIndex + 1, getSubVar(VA_TNT_POSITIONS, tntIndex + 1), clipY2); + tntIndex += 3; + } + + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) { + setRectList(0x004AEE58); + } else { + setRectList(0x004AEDC8); + } + + } else { + + insertStaticSprite(0x8E8A1981, 900); + + uint32 tntIndex = 0; + while (tntIndex < 18) { + uint32 elemIndex = getSubVar(VA_TNT_POSITIONS, tntIndex); + int16 clipY2; + if (kScene1201PointArray[elemIndex].x < 300) { + clipY2 = 480; + } else { + if (kScene1201PointArray[elemIndex].y < 175) + clipY2 = topY1; + else if (kScene1201PointArray[elemIndex].y < 230) + clipY2 = topY2; + else + clipY2 = topY3; + } + insertSprite(tntIndex, getSubVar(VA_TNT_POSITIONS, tntIndex), clipY2); + tntIndex++; + } + + if (getGlobalVar(V_CREATURE_ANGRY) && !getGlobalVar(V_CREATURE_EXPLODED)) + setRectList(0x004AEE18); + else + setRectList(0x004AED88); + + } + + tempSprite = insertStaticSprite(0x63D400BC, 900); + + _asLeftDoor = insertSprite(_klaymen); + _asLeftDoor->setClipRect(x1, tempSprite->getDrawRect().y, tempSprite->getDrawRect().x2(), 480); + + if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_MATCH_STATUS) == 0) + setGlobalVar(V_MATCH_STATUS, 1); + + _asMatch = NULL; + + if (getGlobalVar(V_MATCH_STATUS) < 3) { + _asMatch = insertSprite(this); + addCollisionSprite(_asMatch); + } + + if (getGlobalVar(V_CREATURE_ANGRY) && getGlobalVar(V_CREATURE_EXPLODED) == 0) { + _asCreature = insertSprite(this, _klaymen); + _asCreature->setClipRect(x1, 0, x2, 480); + } + +} + +Scene1201::~Scene1201() { + if (_creatureExploded) + setGlobalVar(V_CREATURE_EXPLODED, 1); + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +void Scene1201::update() { + Scene::update(); + if (_asMatch && getGlobalVar(V_MATCH_STATUS) == 3) + deleteSprite(&_asMatch); +} + +uint32 Scene1201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x07053000) { + _creatureExploded = true; + sendMessage(_asCreature, 0x2004, 0); + } else if (param.asInteger() == 0x140E5744) + sendMessage(_asCreature, 0x2005, 0); + else if (param.asInteger() == 0x40253C40) { + _canAcceptInput = false; + sendMessage(_asCreature, 0x2006, 0); + } else if (param.asInteger() == 0x090EB048) { + if (_klaymen->getX() < 572) + setMessageList2(0x004AEC90); + else + setMessageList2(0x004AEC20); + } + break; + case 0x2001: + if (getGlobalVar(V_MATCH_STATUS) == 0) + setMessageList2(0x004AECB0); + else { + sendEntityMessage(_klaymen, 0x1014, _asMatch); + setMessageList2(0x004AECC0); + } + break; + case 0x2002: + if (getGlobalVar(V_TNT_DUMMY_FUSE_LIT)) { + // Move the TNT dummy if the fuse is burning + sendEntityMessage(_klaymen, 0x1014, _asTntMan); + setMessageList2(0x004AECF0, false); + } else if (getGlobalVar(V_MATCH_STATUS) == 3) { + // Light the TNT dummy if we have the match + sendEntityMessage(_klaymen, 0x1014, _asTntMan); + if (_klaymen->getX() > _asTntMan->getX()) + setMessageList(0x004AECD0); + else + setMessageList(0x004AECE0); + } + break; + case 0x4814: + cancelMessageList(); + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004AED38); + } + break; + case 0x4829: + sendMessage(_asRightDoor, 0x4829, 0); + break; + case 0x8000: + sendMessage(_asKlaymenHead, 0x2006, 0); + break; + } + return messageResult; +} + +// Scene1202 + +static const uint32 kScene1202Table[] = { + 1, 2, 0, 4, 5, 3, 7, 8, 6, 10, 11, 9, 13, 14, 12, 16, 17, 15 +}; + +static const NPoint kScene1202Points[] = { + {203, 140}, {316, 212}, {277, 264}, + {176, 196}, {275, 159}, {366, 212}, + {230, 195}, {412, 212}, {368, 263}, + {204, 192}, {365, 164}, {316, 262}, + {191, 255}, {280, 213}, {406, 266}, + {214, 254}, {316, 158}, {402, 161} +}; + +static const uint32 kScene1202FileHashes[] = { + 0x1AC00B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC30B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC00B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC90B8, 0x1AC18B8, 0x1AC18B8, + 0x1AC30B8, 0x1AC14B8, 0x1AC14B8, + 0x1AC50B8, 0x1AC14B8, 0x1AC14B8 +}; + +AsScene1202TntItem::AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int itemIndex) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _itemIndex(itemIndex) { + + int positionIndex; + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1202TntItem::hmShowIdle); + positionIndex = getSubVar(VA_TNT_POSITIONS, _itemIndex); + createSurface(900, 37, 67); + _x = kScene1202Points[positionIndex].x; + _y = kScene1202Points[positionIndex].y; + stShowIdle(); +} + +uint32 AsScene1202TntItem::hmShowIdle(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x2000, _itemIndex); + messageResult = 1; + break; + case 0x2001: + _newPosition = (int)param.asInteger(); + stChangePositionFadeOut(); + break; + } + return messageResult; +} + +uint32 AsScene1202TntItem::hmChangePosition(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1202TntItem::stShowIdle() { + startAnimation(kScene1202FileHashes[_itemIndex], 0, -1); + SetMessageHandler(&AsScene1202TntItem::hmShowIdle); + _newStickFrameIndex = 0; +} + +void AsScene1202TntItem::stChangePositionFadeOut() { + startAnimation(kScene1202FileHashes[_itemIndex], 0, -1); + SetMessageHandler(&AsScene1202TntItem::hmChangePosition); + NextState(&AsScene1202TntItem::stChangePositionFadeIn); +} + +void AsScene1202TntItem::stChangePositionFadeIn() { + _x = kScene1202Points[_newPosition].x; + _y = kScene1202Points[_newPosition].y; + startAnimation(kScene1202FileHashes[_itemIndex], 6, -1); + _playBackwards = true; + SetMessageHandler(&AsScene1202TntItem::hmChangePosition); + NextState(&AsScene1202TntItem::stChangePositionDone); +} + +void AsScene1202TntItem::stChangePositionDone() { + sendMessage(_parentScene, 0x2002, _itemIndex); + stShowIdle(); +} + +Scene1202::Scene1202(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _paletteResource(vm), + _soundToggle(true), _isPuzzleSolved(false), _counter(0), _clickedIndex(-1) { + + SetMessageHandler(&Scene1202::handleMessage); + SetUpdateHandler(&Scene1202::update); + + setBackground(0x60210ED5); + setPalette(0x60210ED5); + addEntity(_palette); + + _paletteResource.load(0x60250EB5); + _paletteResource.copyPalette(_paletteData); + + insertPuzzleMouse(0x10ED160A, 20, 620); + + for (int tntIndex = 0; tntIndex < 18; tntIndex++) { + _asTntItems[tntIndex] = insertSprite(this, tntIndex); + addCollisionSprite(_asTntItems[tntIndex]); + } + + insertStaticSprite(0x8E8419C1, 1100); + + if (getGlobalVar(V_TNT_DUMMY_BUILT)) + SetMessageHandler(&Scene1202::hmSolved); + + playSound(0, 0x40106542); + loadSound(1, 0x40005446); + loadSound(2, 0x40005446); // Same sound as slot 1 + loadSound(3, 0x68E25540); + +} + +Scene1202::~Scene1202() { + if (isSolved()) + setGlobalVar(V_TNT_DUMMY_BUILT, 1); +} + +void Scene1202::update() { + Scene::update(); + if (_isPuzzleSolved) { + if (!isSoundPlaying(3)) + leaveScene(0); + } else if (_counter == 0 && isSolved()) { + _clickedIndex = 0; + SetMessageHandler(&Scene1202::hmSolved); + setGlobalVar(V_TNT_DUMMY_BUILT, 1); + _palette->copyToBasePalette(_paletteData); + _palette->startFadeToPalette(24); + playSound(3); + _isPuzzleSolved = true; + } else if (_clickedIndex >= 0 && _counter == 0) { + // Swap TNT positions + int destIndex = kScene1202Table[_clickedIndex]; + sendMessage(_asTntItems[_clickedIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, destIndex)); + sendMessage(_asTntItems[destIndex], 0x2001, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); + int temp = getSubVar(VA_TNT_POSITIONS, destIndex); + setSubVar(VA_TNT_POSITIONS, destIndex, getSubVar(VA_TNT_POSITIONS, _clickedIndex)); + setSubVar(VA_TNT_POSITIONS, _clickedIndex, temp); + _counter = 2; + _clickedIndex = -1; + playSound(_soundToggle ? 1 : 2); + _soundToggle = !_soundToggle; + } +} + +uint32 Scene1202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isPuzzleSolved) + leaveScene(0); + break; + case 0x2000: + _clickedIndex = (int)param.asInteger(); + break; + case 0x2002: + _counter--; + break; + } + return messageResult; +} + +uint32 Scene1202::hmSolved(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + } + return 0; +} + +bool Scene1202::isSolved() { + return + getSubVar(VA_TNT_POSITIONS, 0) == 0 && getSubVar(VA_TNT_POSITIONS, 3) == 3 && + getSubVar(VA_TNT_POSITIONS, 6) == 6 && getSubVar(VA_TNT_POSITIONS, 9) == 9 && + getSubVar(VA_TNT_POSITIONS, 12) == 12 && getSubVar(VA_TNT_POSITIONS, 15) == 15; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1200.h b/engines/neverhood/modules/module1200.h new file mode 100644 index 0000000000..c97dc98986 --- /dev/null +++ b/engines/neverhood/modules/module1200.h @@ -0,0 +1,216 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1200_H +#define NEVERHOOD_MODULES_MODULE1200_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1200 + +class Module1200 : public Module { +public: + Module1200(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1200(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1201 + +class AsScene1201Tape : public AnimatedSprite { +public: + AsScene1201Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 nameHash, int surfacePriority, int16 x, int16 y, uint32 fileHash); +protected: + Scene *_parentScene; + uint32 _nameHash; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1201TntManRope : public AnimatedSprite { +public: + AsScene1201TntManRope(NeverhoodEngine *vm, bool isDummyHanging); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1201RightDoor : public AnimatedSprite { +public: + AsScene1201RightDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen); +protected: + Sprite *_klaymen; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); + void stCloseDoorDone(); +}; + +class AsScene1201KlaymenHead : public AnimatedSprite { +public: + AsScene1201KlaymenHead(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1201TntMan : public AnimatedSprite { +public: + AsScene1201TntMan(NeverhoodEngine *vm, Scene *parentScene, Sprite *asTntManRope, bool isDown); + virtual ~AsScene1201TntMan(); +protected: + Scene *_parentScene; + Sprite *_asTntManRope; + Sprite *_sprite; + bool _isMoving; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmComingDown(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoving(); + void stStanding(); + void stComingDown(); + void stMoving(); +}; + +class AsScene1201TntManFlame : public AnimatedSprite { +public: + AsScene1201TntManFlame(NeverhoodEngine *vm, Sprite *asTntMan); + ~AsScene1201TntManFlame(); +protected: + Sprite *_asTntMan; + void update(); + void suUpdate(); +}; + +class AsScene1201Match : public AnimatedSprite { +public: + AsScene1201Match(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + int _countdown; + int _status; + void update(); + uint32 hmOnDoorFrameAboutToMove(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmOnDoorFrameMoving(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmIdle(int messageNum, const MessageParam ¶m, Entity *sender); + void stOnDoorFrameMoving(); + void stFallingFromDoorFrame(); + void stOnDoorFrameAboutToMove(); + void stIdleOnDoorFrame(); + void stIdleOnFloor(); +}; + +class AsScene1201Creature : public AnimatedSprite { +public: + AsScene1201Creature(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen); +protected: + Scene *_parentScene; + Sprite *_klaymen; + int _countdown; + bool _klaymenTooClose; + void update(); + uint32 hmWaiting(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPincerSnap(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPincerSnapKlaymen(int messageNum, const MessageParam ¶m, Entity *sender); + void stWaiting(); + void stPincerSnap(); + void stStartReachForTntDummy(); + void stReachForTntDummy(); + void stPincerSnapKlaymen(); +}; + +class AsScene1201LeftDoor : public AnimatedSprite { +public: + AsScene1201LeftDoor(NeverhoodEngine *vm, Sprite *klaymen); +protected: + Sprite *_klaymen; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stCloseDoor(); +}; + +class SsScene1201Tnt : public StaticSprite { +public: + SsScene1201Tnt(NeverhoodEngine *vm, uint32 elemIndex, uint32 pointIndex, int16 clipY2); +protected: + uint32 _elemIndex; +}; + +class Scene1201 : public Scene { +public: + Scene1201(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1201(); +protected: + Sprite *_asMatch; + AsScene1201TntMan *_asTntMan; + Sprite *_asCreature; + Sprite *_asTntManRope; + Sprite *_asLeftDoor; + Sprite *_asRightDoor; + Sprite *_asTape; + Sprite *_asKlaymenHead; + bool _creatureExploded; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1202 + +class AsScene1202TntItem : public AnimatedSprite { +public: + AsScene1202TntItem(NeverhoodEngine *vm, Scene *parentScene, int index); +protected: + Scene *_parentScene; + int _itemIndex, _newPosition; + uint32 hmShowIdle(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmChangePosition(int messageNum, const MessageParam ¶m, Entity *sender); + void stShowIdle(); + void stChangePositionFadeOut(); + void stChangePositionFadeIn(); + void stChangePositionDone(); +}; + +class Scene1202 : public Scene { +public: + Scene1202(NeverhoodEngine *vm, Module *parentModule); + virtual ~Scene1202(); +protected: + PaletteResource _paletteResource; + Sprite *_asTntItems[18]; + int _counter; + int _clickedIndex; + byte _paletteData[1024]; + bool _isPuzzleSolved; + bool _soundToggle; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSolved(int messageNum, const MessageParam ¶m, Entity *sender); + bool isSolved(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1200_H */ diff --git a/engines/neverhood/modules/module1300.cpp b/engines/neverhood/modules/module1300.cpp new file mode 100644 index 0000000000..8dbfcf616c --- /dev/null +++ b/engines/neverhood/modules/module1300.cpp @@ -0,0 +1,1835 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1300.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1200.h" +#include "neverhood/modules/module1400.h" +#include "neverhood/modules/module2200.h" +#include "neverhood/gamemodule.h" +#include "neverhood/diskplayerscene.h" +#include "neverhood/menumodule.h" +#include "neverhood/navigationscene.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +static const uint32 kModule1300SoundList[] = { + 0x16805648, + 0x16805C48, + 0xB4964448, + 0x96A05481, + 0xD0E14441, + 0x90815450, + 0 +}; + +Module1300::Module1300(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _vm->_soundMan->addMusic(0x61C090, 0x00203197); + _vm->_soundMan->addSoundList(0x61C090, kModule1300SoundList); + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 50, 600, 20, 150); + _vm->_soundMan->playTwoSounds(0x61C090, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); + + if (which < 0) { + if (_vm->gameState().sceneNum >= 1 && _vm->gameState().sceneNum <= 17) + createScene(_vm->gameState().sceneNum, -1); + else + createScene(11, 0); + } else { + switch (which) { + case 0: + createScene(11, 0); + break; + case 1: + createScene(13, 0); + break; + case 2: + createScene(14, 0); + break; + case 3: + createScene(15, 0); + break; + case 4: + createScene(7, 0); + break; + case 5: + createScene(5, 1); + break; + case 6: + createScene(5, 5); + break; + case 7: + createScene(3, 0); + break; + case 8: + createScene(1, 0); + break; + case 9: + createScene(2, 0); + break; + case 10: + createScene(6, 0); + break; + case 11: + createScene(4, 0); + break; + default: + createScene(12, 0); + break; + } + } + +} + +Module1300::~Module1300() { + _vm->_soundMan->deleteGroup(0x61C090); +} + +void Module1300::createScene(int sceneNum, int which) { + debug("Module1300::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 1: + _vm->gameState().sceneNum = 1; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->startMusic(0x00203197, 0, 2); + _childObject = new Scene1302(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + _childObject = new Scene1303(_vm, this); + break; + case 3: + _vm->gameState().sceneNum = 3; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + _childObject = new Scene1304(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->startMusic(0x00203197, 0, 2); + _childObject = new Scene1305(_vm, this, which); + break; + case 5: + _vm->gameState().sceneNum = 5; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->startMusic(0x00203197, 0, 2); + _childObject = new Scene1306(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->startMusic(0x00203197, 0, 2); + _childObject = new Scene1307(_vm, this); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->startMusic(0x00203197, 0, 2); + _childObject = new Scene1308(_vm, this, which); + break; + case 8: + _vm->gameState().sceneNum = 8; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 1); + break; + case 9: + _vm->gameState().sceneNum = 9; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createSmackerScene(0x20082818, true, true, false); + break; + case 10: + _vm->gameState().sceneNum = 10; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createSmackerScene(0x20082828, true, true, false); + break; + case 11: + _vm->gameState().sceneNum = 11; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createNavigationScene(0x004B27A8, which); + break; + case 12: + _vm->gameState().sceneNum = 12; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createNavigationScene(0x004B2718, which); + break; + case 13: + _vm->gameState().sceneNum = 13; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createNavigationScene(0x004B27D8, which); + break; + case 14: + _vm->gameState().sceneNum = 14; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createNavigationScene(0x004B2808, which); + break; + case 15: + _vm->gameState().sceneNum = 15; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, true, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + createNavigationScene(0x004B2838, which); + break; + case 16: + _vm->gameState().sceneNum = 16; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + _childObject = new Scene1317(_vm, this); + break; + case 17: + _vm->gameState().sceneNum = 17; + _vm->_soundMan->setSoundListParams(kModule1300SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->stopMusic(0x00203197, 0, 2); + _childObject = new CreditsScene(_vm, this, false); + break; + } + SetUpdateHandler(&Module1300::updateScene); + _childObject->handleUpdate(); +} + +void Module1300::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 1: + if (_moduleResult == 1) + createScene(4, 0); + else + createScene(7, 1); + break; + case 2: + createScene(5, 3); + break; + case 3: + createScene(15, 0); + break; + case 4: + createScene(16, -1); + break; + case 5: + if (_moduleResult == 2) + createScene(8, 0); + else if (_moduleResult == 3) + createScene(2, 0); + else if (_moduleResult == 0) + leaveModule(0); + else if (_moduleResult == 1) + createScene(10, -1); + break; + case 6: + createScene(7, 2); + break; + case 7: + if (_moduleResult == 0) + createScene(13, 0); + else if (_moduleResult == 1) + createScene(1, 0); + else if (_moduleResult == 2) + createScene(6, 0); + break; + case 8: + createScene(5, 2); + break; + case 9: + createScene(5, 0); + break; + case 10: + createScene(14, 0); + break; + case 11: + if (_moduleResult == 0) + createScene(12, 0); + else if (_moduleResult == 1) + createScene(11, 1); + break; + case 12: + if (_moduleResult == 0) + createScene(14, 1); + else if (_moduleResult == 1) + createScene(15, 1); + else if (_moduleResult == 3) + createScene(11, 1); + else if (_moduleResult == 5) + createScene(13, 1); + break; + case 13: + if (_moduleResult == 0) + createScene(12, 2); + else if (_moduleResult == 1) + createScene(7, 0); + break; + case 14: + if (_moduleResult == 0) + createScene(12, 3); + else if (_moduleResult == 1) + createScene(9, -1); + break; + case 15: + if (_moduleResult == 0) + createScene(12, 4); + else if (_moduleResult == 1) + createScene(3, 0); + break; + case 16: + createScene(17, -1); + break; + case 17: + leaveModule(1); + break; + } + } +} + +AsScene1302Bridge::AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + _x = 320; + _y = 240; + createSurface1(0x88148150, 500); + if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { + startAnimation(0x88148150, 0, -1); + _newStickFrameIndex = 0; + } else { + startAnimation(0x88148150, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } + loadSound(0, 0x68895082); + loadSound(1, 0x689BD0C1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1302Bridge::handleMessage); +} + +uint32 AsScene1302Bridge::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + case 0x4808: + stLowerBridge(); + break; + case 0x4809: + stRaiseBridge(); + break; + } + return messageResult; +} + +void AsScene1302Bridge::stLowerBridge() { + startAnimation(0x88148150, 0, -1); + playSound(1); + NextState(&AsScene1302Bridge::cbLowerBridgeEvent); +} + +void AsScene1302Bridge::stRaiseBridge() { + startAnimation(0x88148150, 7, -1); + _playBackwards = true; + _newStickFrameIndex = 0; + playSound(0); +} + +void AsScene1302Bridge::cbLowerBridgeEvent() { + sendMessage(_parentScene, 0x2032, 0); + startAnimation(0x88148150, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; +} + +SsScene1302Fence::SsScene1302Fence(NeverhoodEngine *vm) + : StaticSprite(vm, 0x11122122, 200) { + + _firstY = _y; + if (getGlobalVar(V_FLYTRAP_RING_FENCE)) + _y += 152; + loadSound(0, 0x7A00400C); + loadSound(1, 0x78184098); + SetUpdateHandler(&SsScene1302Fence::update); + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteUpdate(NULL); +} + +void SsScene1302Fence::update() { + handleSpriteUpdate(); + updatePosition(); +} + +uint32 SsScene1302Fence::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + playSound(0); + SetMessageHandler(NULL); + SetSpriteUpdate(&SsScene1302Fence::suMoveDown); + break; + case 0x4809: + playSound(1); + SetMessageHandler(NULL); + SetSpriteUpdate(&SsScene1302Fence::suMoveUp); + break; + } + return messageResult; +} + +void SsScene1302Fence::suMoveDown() { + if (_y < _firstY + 152) + _y += 8; + else { + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteUpdate(NULL); + } +} + +void SsScene1302Fence::suMoveUp() { + if (_y > _firstY) + _y -= 8; + else { + SetMessageHandler(&SsScene1302Fence::handleMessage); + SetSpriteUpdate(NULL); + } +} + +Scene1302::Scene1302(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene1302::handleMessage); + + setHitRects(0x004B0858); + setRectList(0x004B0A38); + setBackground(0x420643C4); + setPalette(0x420643C4); + insertScreenMouse(0x643C0428); + + _class595 = insertStaticSprite(0xB0420130, 1015); + _sprite1 = insertStaticSprite(0x942FC224, 300); + _sprite2 = insertStaticSprite(0x70430830, 1200); + _sprite2->setVisible(false); + _sprite3 = insertStaticSprite(0x16E01E20, 1100); + _asRing1 = insertSprite(this, false, 218, 122, _class595->getDrawRect().y, false); + _asRing2 = insertSprite(this, true, 218 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_BRIDGE)); + _asRing3 = insertSprite(this, false, 218 + 32 + 32, 122, _class595->getDrawRect().y, false); + _asRing4 = insertSprite(this, true, 218 + 32 + 32 + 32, 132, _class595->getDrawRect().y, getGlobalVar(V_FLYTRAP_RING_FENCE)); + _asRing5 = insertSprite(this, false, 218 + 32 + 32 + 32 + 32, 115, _class595->getDrawRect().y, false); + _asBridge = insertSprite(this); + _ssFence = insertSprite(); + _ssFence->setClipRect(0, 0, 640, _sprite1->getDrawRect().y2()); + + if (which < 0) { + // Restoring game + insertKlaymen(380, 364); + setMessageList(0x004B0868); + } else { + // Klaymen entering from back + insertKlaymen(293, 330); + setMessageList(0x004B0870); + } + + _klaymen->setClipRect(0, 0, _sprite3->getDrawRect().x2(), 480); + + _asVenusFlyTrap = insertSprite(this, _klaymen, true); + addCollisionSprite(_asVenusFlyTrap); + + sendEntityMessage(_klaymen, 0x2007, _asVenusFlyTrap); + +} + +uint32 Scene1302::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x4A845A00) + sendEntityMessage(_klaymen, 0x1014, _asRing1); + else if (param.asInteger() == 0x43807801) { + if (!getGlobalVar(V_FLYTRAP_RING_BRIDGE)) { + sendEntityMessage(_klaymen, 0x1014, _asRing2); + if (_asVenusFlyTrap->getX() - 10 < 218 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32) + setMessageList(0x004B0940); + else + setMessageList(0x004B0938); + } else + setMessageList(0x004B0950); + messageResult = 1; + } else if (param.asInteger() == 0x46C26A01) + sendEntityMessage(_klaymen, 0x1014, _asRing3); + else if (param.asInteger() == 0x468C7B11) { + if (!getGlobalVar(V_FLYTRAP_RING_FENCE)) { + sendEntityMessage(_klaymen, 0x1014, _asRing4); + if (_asVenusFlyTrap->getX() - 10 < 218 + 32 + 32 + 32 && _asVenusFlyTrap->getX() + 10 > 218 + 32 + 32 + 32) + setMessageList(0x004B0940); + else + setMessageList(0x004B0938); + } else + setMessageList(0x004B0950); + messageResult = 1; + } else if (param.asInteger() == 0x42845B19) + sendEntityMessage(_klaymen, 0x1014, _asRing5); + else if (param.asInteger() == 0x430A6060) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) + setMessageList2(0x004B0910); + else + cancelMessageList(); + } else if (param.asInteger() == 0x012E2070) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) + setMessageList2(0x004B0968); + else + cancelMessageList(); + } else if (param.asInteger() == 0x11C40840) { + if (_asVenusFlyTrap->getX() >= 260 && _asVenusFlyTrap->getX() <= 342) + setMessageList(0x004B0878); + else + setMessageList(0x004B0978); + } + break; + case 0x2000: + if (_klaymen->getY() > 360) { + sendEntityMessage(_klaymen, 0x1014, _asVenusFlyTrap); + setMessageList2(0x004B08F0); + } else + setMessageList2(0x004B0920); + break; + case 0x2002: + if (_klaymen->getX() > 545) + leaveScene(1); + break; + case 0x2032: + _sprite2->setVisible(true); + break; + case 0x4806: + sendMessage(_parentModule, 0x1024, 2); + if (sender == _asRing1) + playSound(0, 0x665198C0); + else if (sender == _asRing2) { + sendMessage(_asBridge, 0x4808, 0); + setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); + } else if (sender == _asRing3) + playSound(0, 0xE2D389C0); + else if (sender == _asRing4) { + sendMessage(_ssFence, 0x4808, 0); + setGlobalVar(V_FLYTRAP_RING_FENCE, 1); + } else if (sender == _asRing5) + playSound(0, 0x40428A09); + break; + case 0x4807: + if (sender == _asRing2) { + sendMessage(_asBridge, 0x4809, 0); + setGlobalVar(V_FLYTRAP_RING_BRIDGE, 0); + _sprite2->setVisible(false); + } else if (sender == _asRing4) { + sendMessage(_ssFence, 0x4809, 0); + setGlobalVar(V_FLYTRAP_RING_FENCE, 0); + } else if (sender == _asVenusFlyTrap) { + if (getGlobalVar(V_FLYTRAP_RING_BRIDGE)) + sendMessage(_asRing2, 0x4807, 0); + else + sendMessage(_asRing4, 0x4807, 0); + } + break; + case 0x480F: + if (sender == _asRing2) { + playSound(0, 0x60755842); + sendMessage(_asBridge, 0x4808, 0); + setGlobalVar(V_FLYTRAP_RING_BRIDGE, 1); + } else if (sender == _asRing4) { + playSound(0, 0x60755842); + sendMessage(_ssFence, 0x4808, 0); + setGlobalVar(V_FLYTRAP_RING_FENCE, 1); + } + break; + case 0x482A: + sendMessage(_asVenusFlyTrap, 0x482B, 0); + break; + case 0x482B: + sendMessage(_asVenusFlyTrap, 0x482A, 0); + break; + case 0x8000: + setSpriteSurfacePriority(_class595, 995); + break; + case 0x8001: + setSpriteSurfacePriority(_class595, 1015); + break; + } + return messageResult; +} + +AsScene1303Balloon::AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(200, 128, 315); + _x = 289; + _y = 390; + startAnimation(0x800278D2, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1303Balloon::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +uint32 AsScene1303Balloon::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x2000: + stPopBalloon(); + break; + } + return messageResult; +} + +uint32 AsScene1303Balloon::hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x020B0003) + playSound(0, 0x742B0055); + break; + case 0x3002: + playSound(0, 0x470007EE); + stopAnimation(); + setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +void AsScene1303Balloon::stPopBalloon() { + startAnimation(0xAC004CD0, 0, -1); + SetMessageHandler(&AsScene1303Balloon::hmBalloonPopped); +} + +Scene1303::Scene1303(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene1303::handleMessage); + + setRectList(0x004AF9E8); + setBackground(0x01581A9C); + setPalette(0x01581A9C); + insertScreenMouse(0x81A9801D); + + if (!getGlobalVar(V_BALLOON_POPPED)) { + _asBalloon = insertSprite(this); + addCollisionSprite(_asBalloon); + } + + _sprite1 = insertStaticSprite(0xA014216B, 1100); + + insertKlaymen(207, 332); + setMessageList(0x004AF9A0); + + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + +} + +uint32 Scene1303::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + setGlobalVar(V_BALLOON_POPPED, 1); + sendMessage(_asBalloon, 0x2000, 0); + break; + case 0x4826: + if (sender == _asBalloon && getGlobalVar(V_HAS_NEEDLE)) + setMessageList(0x004AF9B8); + break; + } + return 0; +} + +AsScene1304Needle::AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y) + : AnimatedSprite(vm, 0x548E9411, surfacePriority, x, y), _parentScene(parentScene) { + + // NOTE: Skipped check if Klaymen already has the needle since that's done in the scene itself + SetMessageHandler(&AsScene1304Needle::handleMessage); +} + +uint32 AsScene1304Needle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4806: + setGlobalVar(V_HAS_NEEDLE, 1); + setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene1304::Scene1304(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _asNeedle(NULL) { + + SetMessageHandler(&Scene1304::handleMessage); + + setRectList(0x004B91A8); + setBackground(0x062C0214); + setPalette(0x062C0214); + insertScreenMouse(0xC021006A); + + if (getGlobalVar(V_BALLOON_POPPED)) { + _asKey = insertSprite(this, 0, 1100, 278, 347); + addCollisionSprite(_asKey); + } else { + _asKey = insertSprite(0x80106018, 100, 279, 48); + } + + if (!getGlobalVar(V_HAS_NEEDLE)) { + _asNeedle = insertSprite(this, 1100, 278, 347); + addCollisionSprite(_asNeedle); + } + + _sprite1 = insertStaticSprite(0x0562E621, 1100); + insertStaticSprite(0x012AE033, 1100); + insertStaticSprite(0x090AF033, 1100); + + if (which < 0) { + // Restoring game + insertKlaymen(217, 347); + setMessageList(0x004B90E8); + } else { + // Klaymen entering from the left + insertKlaymen(100, 347); + setMessageList(0x004B90F0); + } + + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + +} + +uint32 Scene1304::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x415634A4) { + if (getGlobalVar(V_BALLOON_POPPED)) + cancelMessageList(); + else + setMessageList(0x004B9158); + } + break; + case 0x4826: + if (sender == _asNeedle) { + sendEntityMessage(_klaymen, 0x1014, _asNeedle); + setMessageList(0x004B9130); + } else if (sender == _asKey) { + sendEntityMessage(_klaymen, 0x1014, _asKey); + setMessageList(0x004B9140); + } + break; + } + return 0; +} + +Scene1305::Scene1305(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene1305::handleMessage); + + setRectList(0x004B6E98); + setBackground(0x28801B64); + setPalette(0x28801B64); + insertScreenMouse(0x01B60280); + + if (which < 0) { + // Restoring game + insertKlaymen(212, 441); + setMessageList(0x004B6E40); + } else { + // Klaymen enters falling + insertKlaymen(212, 441); + setMessageList(0x004B6E48); + } + +} + +uint32 Scene1305::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + return Scene::handleMessage(messageNum, param, sender); +} + +AsScene1306Elevator::AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _asElevatorDoor(asElevatorDoor), _isUp(false), _isDown(true), + _countdown(0) { + + _x = 320; + _y = 240; + createSurface1(0x043B0270, 100); + startAnimation(0x043B0270, 0, -1); + _newStickFrameIndex = 0; + loadSound(0, 0x1C100E83); + loadSound(1, 0x1C08CEC5); + loadSound(2, 0x5D011E87); + SetMessageHandler(&AsScene1306Elevator::handleMessage); +} + +void AsScene1306Elevator::update() { + if (_isUp && _countdown != 0 && (--_countdown == 0)) + stGoingDown(); + AnimatedSprite::update(); + if (_currFrameIndex == 7) { + playSound(1); + _asElevatorDoor->setVisible(false); + } +} + +void AsScene1306Elevator::upGoingDown() { + AnimatedSprite::update(); + if (_currFrameIndex == 5) + _asElevatorDoor->setVisible(true); +} + +uint32 AsScene1306Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + if (_isUp) + _countdown = 144; + messageResult = _isUp ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + if (_isDown) + stGoingUp(); + break; + } + return messageResult; +} + +void AsScene1306Elevator::stGoingUp() { + setVisible(true); + _isDown = false; + startAnimation(0x043B0270, 0, -1); + playSound(0); + SetUpdateHandler(&AsScene1306Elevator::update); + NextState(&AsScene1306Elevator::cbGoingUpEvent); +} + +void AsScene1306Elevator::cbGoingUpEvent() { + sendMessage(_parentScene, 0x4808, 0); + _isUp = true; + _countdown = 144; + stopAnimation(); + setVisible(false); + SetUpdateHandler(&AsScene1306Elevator::update); +} + +void AsScene1306Elevator::stGoingDown() { + _isUp = false; + setVisible(true); + startAnimation(0x043B0270, -1, -1); + _playBackwards = true; + playSound(1); + SetUpdateHandler(&AsScene1306Elevator::upGoingDown); + NextState(&AsScene1306Elevator::cbGoingDownEvent); +} + +void AsScene1306Elevator::cbGoingDownEvent() { + _isDown = true; + sendMessage(_parentScene, 0x4809, 0); + stopAnimation(); + SetUpdateHandler(&AsScene1306Elevator::update); +} + +Scene1306::Scene1306(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 4); + + SetMessageHandler(&Scene1306::handleMessage); + + setBackground(0x05303114); + setPalette(0x05303114); + insertScreenMouse(0x0311005B); + + if (getGlobalVar(V_KEY3_LOCATION) == 4) { + _asKey = insertSprite(this, 2, 1100, 435, 445); + addCollisionSprite(_asKey); + } + + _ssButton = insertSprite(this, 0x404A36A0, 100, 0x440C1000); + _asTape = insertSprite(this, 19, 1100, 359, 445, 0x9148A011); + _asElevatorDoor = insertSprite(0x043B0270, 90, 320, 240); + _asElevatorDoor->startAnimation(0x043B0270, 6, -1); + _asElevatorDoor->setNewHashListIndex(6); + _asElevator = insertSprite(this, _asElevatorDoor); + _sprite1 = insertStaticSprite(0x036A1EE0, 80); + insertStaticSprite(0x00042313, 1100); + + if (which < 0) { + // Resoring game + insertKlaymen(380, 440); + setMessageList(0x004AFAD0); + sendMessage(this, 0x2000, 0); + addCollisionSprite(_asTape); + } else if (which == 1) { + // Klaymen teleporting in + insertKlaymen(136, 440); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004AFAF0); + sendMessage(this, 0x2000, 1); + addCollisionSprite(_asTape); + } else if (which == 2) { + // Klaymen returning from diskplayer + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(515, 440); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen(355, 440); + } + setMessageList(0x004AFBC8); + sendMessage(this, 0x2000, 0); + addCollisionSprite(_asTape); + } else if (which == 3) { + // Klaymen returning from window + insertKlaymen(534, 440); + setMessageList(0x004AFC30); + sendMessage(this, 0x2000, 0); + addCollisionSprite(_asTape); + } else if (which == 4) { + // Klaymen teleporting out + insertKlaymen(136, 440); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004AFC38); + sendMessage(this, 0x2000, 1); + addCollisionSprite(_asTape); + } else if (which == 5) { + // Klaymen returning from teleporter + insertKlaymen(136, 440); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004AFB00); + sendMessage(this, 0x2000, 1); + addCollisionSprite(_asTape); + } else { + // Klaymen coming up in elevator + insertKlaymen(286, 408); + setSurfacePriority(_asElevator->getSurface(), 1100); + setSurfacePriority(_asElevatorDoor->getSurface(), 1090); + setSurfacePriority(_sprite1->getSurface(), 1080); + sendMessage(this, 0x2000, 0); + SetMessageHandler(&Scene1306::handleMessage416EB0); + clearRectList(); + sendMessage(_asElevator, 0x4808, 0); + } + +} + +Scene1306::~Scene1306() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene1306::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x01C66840) { + if (sendMessage(_asElevator, 0x2001, 0) != 0) + setMessageList(0x004AFBD8); + else + setMessageList(0x004AFAE0); + } else if (param.asInteger() == 0x8E646E00) { + setMessageList(0x004AFAD8); + clearRectList(); + SetMessageHandler(&Scene1306::handleMessage416EB0); + } + break; + case 0x2000: + if (param.asInteger() != 0) { + setRectList(0x004AFD28); + _klaymen->setKlaymenIdleTable3(); + } else { + setRectList(0x004AFD18); + _klaymen->setKlaymenIdleTable1(); + } + break; + case 0x480B: + if (sender == _ssButton) + sendMessage(_asElevator, 0x4808, 0); + break; + case 0x4826: + if (sender == _asKey) { + if (_klaymen->getX() >= 249) { + sendEntityMessage(_klaymen, 0x1014, _asKey); + setMessageList(0x004AFC58); + } + } else if (sender == _asTape) { + if (_klaymen->getX() >= 249) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004AFC68); + } + } + break; + case 0x482A: + setSurfacePriority(_asElevator->getSurface(), 1100); + setSurfacePriority(_asElevatorDoor->getSurface(), 1090); + setSurfacePriority(_sprite1->getSurface(), 1080); + break; + case 0x482B: + setSurfacePriority(_asElevator->getSurface(), 100); + setSurfacePriority(_asElevatorDoor->getSurface(), 90); + setSurfacePriority(_sprite1->getSurface(), 80); + sendMessage(this, 0x2000, 0); + addCollisionSprite(_asTape); + break; + } + return 0; +} + +uint32 Scene1306::handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + setMessageList(0x004AFBD0); + SetMessageHandler(&Scene1306::handleMessage); + break; + case 0x4809: + leaveScene(1); + break; + case 0x482A: + setSurfacePriority(_asElevator->getSurface(), 1100); + setSurfacePriority(_asElevatorDoor->getSurface(), 1090); + setSurfacePriority(_sprite1->getSurface(), 1080); + break; + case 0x482B: + setSurfacePriority(_asElevator->getSurface(), 100); + setSurfacePriority(_asElevatorDoor->getSurface(), 90); + setSurfacePriority(_sprite1->getSurface(), 80); + sendMessage(this, 0x2000, 0); + addCollisionSprite(_asTape); + break; + } + return 0; +} + +static const uint32 kAsScene1307KeyResourceList1[] = { + 0x0438069C, 0x45B0023C, 0x05700217 +}; + +static const uint32 kAsScene1307KeyResourceList2[] = { + 0x04441334, 0x061433F0, 0x06019390 +}; + +static const uint32 kAsScene1307KeyResourceList3[] = { + 0x11A80030, 0x178812B1, 0x1488121C +}; + +static const uint32 *kAsScene1307KeyResourceLists[] = { + kAsScene1307KeyResourceList1, + kAsScene1307KeyResourceList2, + kAsScene1307KeyResourceList3 +}; + +static const int kAsScene1307KeySurfacePriorities[] = { + 700, 500, 300, 100 +}; + +const uint kAsScene1307KeyPointsCount = 12; + +static const NPoint kAsScene1307KeyPoints[] = { + {-2, 0}, {-5, 0}, { 5, 0}, + {12, 0}, {17, 0}, {25, 0}, + {16, -2}, {10, -6}, { 0, -7}, + {-7, -3}, {-3, 4}, { 2, 2} +}; + +const uint kAsScene1307KeyFrameIndicesCount = 20; + +static const int16 kAsScene1307KeyFrameIndices[] = { + 1, 4, 8, 11, 15, 16, 17, 17, 17, 16, + 15, 14, 12, 10, 9, 7, 5, 3, 2, 1 +}; + +const int kAsScene1307KeyDivValue = 200; +const int16 kAsScene1307KeyXDelta = 70; +const int16 kAsScene1307KeyYDelta = -12; + +AsScene1307Key::AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _keyIndex(keyIndex), _clipRects(clipRects), + _isClickable(true) { + + NPoint pt; + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; + + _dataResource.load(0x22102142); + _pointList = _dataResource.getPointArray(0xAC849240); + pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; + _x = pt.x; + _y = pt.y; + createSurface(kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4], 190, 148); + startAnimation(fileHashes[0], 0, -1); + loadSound(0, 0xDC4A1280); + loadSound(1, 0xCC021233); + loadSound(2, 0xC4C23844); + loadSound(3, 0xC4523208); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1307Key::handleMessage); +} + +uint32 AsScene1307Key::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_isClickable) { + sendMessage(_parentScene, 0x4826, 0); + stRemoveKey(); + messageResult = 1; + } + break; + case 0x2000: + _isClickable = param.asInteger() != 0; + break; + case 0x2001: + setSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex, param.asInteger()); + stMoveKey(); + break; + case 0x2003: + playSound(3); + stUnlock(); + break; + case 0x2004: + playSound(2); + stInsert(); + break; + } + return messageResult; +} + +void AsScene1307Key::suRemoveKey() { + if (_pointIndex < kAsScene1307KeyPointsCount) { + _x += kAsScene1307KeyPoints[_pointIndex].x; + _y += kAsScene1307KeyPoints[_pointIndex].y; + updateBounds(); + _pointIndex++; + } else { + SetSpriteUpdate(NULL); + } +} + +void AsScene1307Key::suInsertKey() { + if (_pointIndex < kAsScene1307KeyPointsCount) { + _x -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].x; + _y -= kAsScene1307KeyPoints[kAsScene1307KeyPointsCount - _pointIndex - 1].y; + updateBounds(); + _pointIndex++; + if (_pointIndex == 7) + playSound(0); + } else { + SetSpriteUpdate(NULL); + sendMessage(_parentScene, 0x2002, 0); + } +} + +void AsScene1307Key::suMoveKey() { + if (_pointIndex < kAsScene1307KeyFrameIndicesCount) { + _frameIndex += kAsScene1307KeyFrameIndices[_pointIndex]; + _x = _prevX + (_deltaX * _frameIndex) / kAsScene1307KeyDivValue; + _y = _prevY + (_deltaY * _frameIndex) / kAsScene1307KeyDivValue; + updateBounds(); + _pointIndex++; + } else { + NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; + _x = pt.x + kAsScene1307KeyXDelta; + _y = pt.y + kAsScene1307KeyYDelta; + stInsertKey(); + } +} + +void AsScene1307Key::stRemoveKey() { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; + _pointIndex = 0; + startAnimation(fileHashes[0], 0, -1); + playSound(1); + SetSpriteUpdate(&AsScene1307Key::suRemoveKey); +} + +void AsScene1307Key::stInsertKey() { + _pointIndex = 0; + sendMessage(_parentScene, 0x1022, kAsScene1307KeySurfacePriorities[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]); + setClipRect(_clipRects[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex) % 4]); + _newStickFrameIndex = STICK_LAST_FRAME; + SetSpriteUpdate(&AsScene1307Key::suInsertKey); +} + +void AsScene1307Key::stMoveKey() { + NPoint pt = (*_pointList)[getSubVar(VA_CURR_KEY_SLOT_NUMBERS, _keyIndex)]; + int16 newX = pt.x + kAsScene1307KeyXDelta; + int16 newY = pt.y + kAsScene1307KeyYDelta; + sendMessage(_parentScene, 0x1022, 1000); + setClipRect(0, 0, 640, 480); + _prevX = _x; + _prevY = _y; + if (newX == _x && newY == _y) { + stInsertKey(); + } else { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; + _pointIndex = 0; + _frameIndex = 0; + _deltaX = newX - _x; + _deltaY = newY - _y; + startAnimation(fileHashes[0], 0, -1); + SetSpriteUpdate(&AsScene1307Key::suMoveKey); + } +} + +void AsScene1307Key::stUnlock() { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; + startAnimation(fileHashes[1], 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; +} + +void AsScene1307Key::stInsert() { + const uint32 *fileHashes = kAsScene1307KeyResourceLists[_keyIndex]; + startAnimation(fileHashes[2], 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; +} + +Scene1307::Scene1307(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _countdown(0), _asCurrKey(NULL), + _isInsertingKey(false), _doLeaveScene(false), _isPuzzleSolved(false) { + + Sprite *tempSprite; + + _vm->gameModule()->initKeySlotsPuzzle(); + + _dataResource.load(0x22102142); + _keyHolePoints = _dataResource.getPointArray(0xAC849240); + + for (uint i = 0; i < 16; i++) { + NPoint pt = (*_keyHolePoints)[i]; + _keyHoleRects[i].x1 = pt.x - 15; + _keyHoleRects[i].y1 = pt.y - 15; + _keyHoleRects[i].x2 = pt.x + 15; + _keyHoleRects[i].y2 = pt.y + 15; + } + + SetMessageHandler(&Scene1307::handleMessage); + SetUpdateHandler(&Scene1307::update); + + setBackground(0xA8006200); + setPalette(0xA8006200); + addEntity(_palette); + insertPuzzleMouse(0x06204A88, 20, 620); + + tempSprite = insertStaticSprite(0x00A3621C, 800); + _clipRects[0].set(tempSprite->getDrawRect().x, 0, 640, 480); + tempSprite = insertStaticSprite(0x00A3641C, 600); + _clipRects[1].set(tempSprite->getDrawRect().x, 0, 640, 480); + tempSprite = insertStaticSprite(0x00A3681C, 400); + _clipRects[2].set(tempSprite->getDrawRect().x, 0, 640, 480); + tempSprite = insertStaticSprite(0x00A3701C, 200); + _clipRects[3].set(tempSprite->getDrawRect().x, 0, 640, 480); + + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex)) { + _asKeys[keyIndex] = insertSprite(this, keyIndex, _clipRects); + addCollisionSprite(_asKeys[keyIndex]); + } else { + _asKeys[keyIndex] = NULL; + } + } + + loadSound(0, 0x68E25540); + +} + +void Scene1307::update() { + Scene::update(); + if (_countdown && (--_countdown == 0)) + _doLeaveScene = true; + else if (_countdown == 20) + _palette->startFadeToWhite(40); + if (_doLeaveScene && !isSoundPlaying(0)) { + leaveScene(1); + setGlobalVar(V_KEYDOOR_UNLOCKED, 1); + } +} + +uint32 Scene1307::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (!_isPuzzleSolved) { + if (param.asPoint().x > 20 && param.asPoint().x < 620) { + if (_asCurrKey && !_isInsertingKey) { + int16 mouseX = param.asPoint().x; + int16 mouseY = param.asPoint().y; + uint clickedKeyHoleIndex; + for (clickedKeyHoleIndex = 0; clickedKeyHoleIndex < 16; clickedKeyHoleIndex++) { + if (mouseX >= _keyHoleRects[clickedKeyHoleIndex].x1 && mouseX <= _keyHoleRects[clickedKeyHoleIndex].x2 && + mouseY >= _keyHoleRects[clickedKeyHoleIndex].y1 && mouseY <= _keyHoleRects[clickedKeyHoleIndex].y2) + break; + } + if (clickedKeyHoleIndex < 16) { + // Check if the clicked keyhole is already occupied with a key + bool occupied = false; + for (uint keyIndex = 0; keyIndex < 3 && !occupied; keyIndex++) { + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex] != _asCurrKey) { + if (getSubVar(VA_CURR_KEY_SLOT_NUMBERS, keyIndex) == clickedKeyHoleIndex) + occupied = true; + } + } + if (!occupied) { + // If the keyhole is free, insert the current key + sendMessage(_asCurrKey, 0x2001, clickedKeyHoleIndex); + _isInsertingKey = true; + _mouseClicked = false; + } + } + } + } else if (_countdown == 0 && !_asCurrKey && !_isInsertingKey) + leaveScene(0); + } + break; + case 0x2002: + // Check if all keys are in the correct keyholes + if (getSubVar(VA_IS_KEY_INSERTED, 0) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 0) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0) && + getSubVar(VA_IS_KEY_INSERTED, 1) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 1) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1) && + getSubVar(VA_IS_KEY_INSERTED, 2) && getSubVar(VA_CURR_KEY_SLOT_NUMBERS, 2) == getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)) { + // Play unlock animations for all keys + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) { + if (_asKeys[keyIndex]) + sendMessage(_asKeys[keyIndex], 0x2003, 1); + } + playSound(0); + _isPuzzleSolved = true; + _countdown = 47; + } else { + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex]) + sendMessage(_asKeys[keyIndex], 0x2000, 1); + sendMessage(_asCurrKey, 0x2004, 1); + } + _asCurrKey = NULL; + _isInsertingKey = false; + break; + case 0x4826: + _asCurrKey = (Sprite*)sender; + for (uint keyIndex = 0; keyIndex < 3; keyIndex++) + if (getSubVar(VA_IS_KEY_INSERTED, keyIndex) && _asKeys[keyIndex]) + sendMessage(_asKeys[keyIndex], 0x2000, 0); + break; + } + return messageResult; +} + +static const uint32 kScene1308NumberFileHashes[] = { + 0x08006320, 0x10006320, 0x20006320, + 0x40006320, 0x80006320, 0x00006321, + 0x00006322, 0x00006324, 0x00006328, + 0x08306320, 0x10306320, 0x20306320, + 0x40306320, 0x80306320, 0x00306321, + 0x00306322 +}; + +AsScene1308JaggyDoor::AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0xBA0AE050, 1100, 320, 240), _parentScene(parentScene) { + + setVisible(false); + stopAnimation(); + SetMessageHandler(&AsScene1308JaggyDoor::handleMessage); +} + +uint32 AsScene1308JaggyDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + case 0x4808: + stOpenDoor(); + break; + case 0x4809: + stCloseDoor(); + break; + } + return messageResult; +} + +void AsScene1308JaggyDoor::stOpenDoor() { + startAnimation(0xBA0AE050, 0, -1); + setVisible(true); + playSound(0, calcHash("fxDoorOpen38")); + NextState(&AsScene1308JaggyDoor::stOpenDoorDone); +} + +void AsScene1308JaggyDoor::stOpenDoorDone() { + sendMessage(_parentScene, 0x2000, 0); + stopAnimation(); + setVisible(false); +} + +void AsScene1308JaggyDoor::stCloseDoor() { + startAnimation(0xBA0AE050, -1, -1); + _playBackwards = true; + setVisible(true); + playSound(0, calcHash("fxDoorClose38")); + NextState(&AsScene1308JaggyDoor::stCloseDoorDone); +} + +void AsScene1308JaggyDoor::stCloseDoorDone() { + sendMessage(_parentScene, 0x2001, 0); + stopAnimation(); +} + +AsScene1308KeyboardDoor::AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0xA08A0851, 1100, 320, 240), _parentScene(parentScene) { + + playSound(0, 0x51456049); + SetMessageHandler(&AsScene1308KeyboardDoor::handleMessage); + NextState(&AsScene1308KeyboardDoor::stFallingKeys); +} + +uint32 AsScene1308KeyboardDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1308KeyboardDoor::stFallingKeys() { + startAnimation(0x6238B191, 0, -1); + _x = 580; + _y = 383; + NextState(&AsScene1308KeyboardDoor::stFallingKeysDone); +} + +void AsScene1308KeyboardDoor::stFallingKeysDone() { + sendMessage(_parentScene, 0x2004, 0); + stopAnimation(); + setVisible(false); +} + +AsScene1308LightWallSymbols::AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 0x80180A10, 100, 320, 240), _parentScene(parentScene) { + + setVisible(false); + stopAnimation(); + Entity::_priority = 1200; + SetMessageHandler(&AsScene1308LightWallSymbols::handleMessage); +} + +uint32 AsScene1308LightWallSymbols::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + stFadeIn(); + break; + case 0x2003: + stFadeOut(); + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1308LightWallSymbols::stFadeIn() { + startAnimation(0x80180A10, 0, -1); + setVisible(true); + _newStickFrameIndex = STICK_LAST_FRAME; +} + +void AsScene1308LightWallSymbols::stFadeOut() { + startAnimation(0x80180A10, -1, -1); + _playBackwards = true; + NextState(&AsScene1308LightWallSymbols::stFadeOutDone); +} + +void AsScene1308LightWallSymbols::stFadeOutDone() { + sendMessage(_parentScene, 0x2003, 0); + stopAnimation(); + setVisible(false); +} + +SsScene1308Number::SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index) + : StaticSprite(vm, fileHash, 100) { + + setVisible(false); + _x = _spriteResource.getPosition().x + index * 20; + updatePosition(); +} + +AsScene1308Mouse::AsScene1308Mouse(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + _x = 286; + _y = 429; + createSurface1(0xA282C472, 100); + startAnimation(0xA282C472, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1308Mouse::handleMessage); +} + +uint32 AsScene1308Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x66382026) + playSound(0, 0x0CD84468); + else if (param.asInteger() == 0x6E28061C) + playSound(0, 0x78C8402C); + else if (param.asInteger() == 0x462F0410) + playSound(0, 0x60984E28); + break; + } + return messageResult; +} + +Scene1308::Scene1308(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isProjecting(false), _asProjector(NULL) { + + _vm->gameModule()->initKeySlotsPuzzle(); + + SetMessageHandler(&Scene1308::handleMessage); + + setBackground(0x41024202); + setPalette(0x41024202); + insertScreenMouse(0x24206418); + + _asTape = insertSprite(this, 17, 1100, 502, 445, 0x9148A011); + addCollisionSprite(_asTape); + + if (getGlobalVar(V_MOUSE_SUCKED_IN)) { + insertSprite(); + insertSprite(0x461A1490, 200, 235, 429); + } + + _sprite1 = insertStaticSprite(0x0A042060, 1100); + _asJaggyDoor = insertSprite(this); + _asLightWallSymbols = insertSprite(this); + _ssNumber1 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 1)], 0); + _ssNumber2 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 0)], 1); + _ssNumber3 = insertSprite(kScene1308NumberFileHashes[getSubVar(VA_GOOD_KEY_SLOT_NUMBERS, 2)], 2); + _sprite2 = insertStaticSprite(0x40043120, 995); + _sprite3 = insertStaticSprite(0x43003100, 995); + _sprite4 = NULL; + + if (which < 0) { + // Restoring game + insertKlaymen(380, 440); + setMessageList(0x004B57C0); + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { + _sprite4 = insertStaticSprite(0x0101A624, 1100); + setRectList(0x004B5990); + } else { + _sprite5 = insertStaticSprite(0x080811A0, 100); + setRectList(0x004B5980); + } + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 440); + setMessageList(0x004B57C8); + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { + _sprite4 = insertStaticSprite(0x0101A624, 1100); + setRectList(0x004B5990); + } else { + _sprite5 = insertStaticSprite(0x080811A0, 100); + setRectList(0x004B5980); + } + } else if (which == 2) { + // Klaymen returning from keyslots panel + insertKlaymen(475, 440); + setMessageList(0x004B58B0); + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { + _sprite5 = insertSprite(this); + _sprite4 = insertStaticSprite(0x0101A624, 1100); + _sprite4->setVisible(false); + } else { + _sprite5 = insertStaticSprite(0x080811A0, 100); + setRectList(0x004B5980); + } + } else { + // Klaymen entering from the left + insertKlaymen(41, 440); + setMessageList(0x004B57D0); + sendMessage(_asJaggyDoor, 0x4808, 0); + _sprite1->setVisible(false); + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) { + _sprite4 = insertStaticSprite(0x0101A624, 1100); + _klaymen->setVisible(false); + } else { + _sprite5 = insertStaticSprite(0x080811A0, 100); + _klaymen->setVisible(false); + } + } + + if (_sprite4) + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite4->getDrawRect().x2(), 480); + else + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + + if (getGlobalVar(V_PROJECTOR_LOCATION) == 4) { + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); + addCollisionSprite(_asProjector); + _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); + _asProjector->setRepl(64, 0); + } + +} + +uint32 Scene1308::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x88C11390) { + setRectList(0x004B59A0); + _isProjecting = true; + } else if (param.asInteger() == 0x08821382) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) + setRectList(0x004B5990); + else + setRectList(0x004B5980); + _isProjecting = false; + } else if (param.asInteger() == 0x4AC68808) { + clearRectList(); + sendMessage(_asJaggyDoor, 0x4809, 0); + _sprite1->setVisible(false); + _klaymen->setVisible(false); + } + break; + case 0x1022: + if (sender == _asProjector) { + if (param.asInteger() >= 1000) + setSurfacePriority(_sprite3->getSurface(), 1100); + else + setSurfacePriority(_sprite3->getSurface(), 995); + } + break; + case 0x2000: + if (getGlobalVar(V_KEYDOOR_UNLOCKED)) + setRectList(0x004B5990); + else + setRectList(0x004B5980); + setMessageList(0x004B57E8, false); + _sprite1->setVisible(true); + _klaymen->setVisible(true); + break; + case 0x2001: + leaveScene(0); + break; + case 0x2003: + _ssNumber1->setVisible(false); + _ssNumber2->setVisible(false); + _ssNumber3->setVisible(false); + break; + case 0x2004: + _sprite4->setVisible(true); + setRectList(0x004B5990); + break; + case 0x4807: + sendMessage(_asLightWallSymbols, 0x2003, 0); + break; + case 0x480F: + sendMessage(_asLightWallSymbols, 0x2002, 0); + _ssNumber1->setVisible(true); + _ssNumber2->setVisible(true); + _ssNumber3->setVisible(true); + break; + case 0x4826: + if (sender == _asProjector) { + if (_isProjecting) + setMessageList2(0x004B5868); + else { + if (param.asInteger() == 1) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B5848); + } else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() <= _asProjector->getX() ? 0 : 1) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B5830); + } else + setMessageList2(0x004B5800); + } + } else if (sender == _asTape) { + if (_isProjecting) + setMessageList2(0x004B5868); + else if (_messageListStatus != 2) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList2(0x004B58E0); + } + } + break; + } + return 0; +} + +Scene1317::Scene1317(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene1317::handleMessage); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x08982841, true, false)); + _vm->_screen->setSmackerDecoder(_smackerPlayer->getSmackerDecoder()); + insertScreenMouse(0x08284011); + showMouse(false); + _smackerFileHash = 0; + _keepLastSmackerFrame = false; +} + +void Scene1317::update() { + if (_smackerFileHash) { + _smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame); + _smackerFileHash = 0; + } + Scene::update(); +} + +void Scene1317::upChooseKing() { + if (!_klaymenBlinks && _klaymenBlinkCountdown != 0 && (--_klaymenBlinkCountdown == 0)) + _klaymenBlinks = true; + + if (!_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 2) { + _smackerPlayer->rewind(); + } else if (_klaymenBlinks && _smackerPlayer->getFrameNumber() + 1 >= 6) { + _smackerPlayer->rewind(); + _klaymenBlinks = false; + _klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; + } + + if (!_klaymenBlinks && _decisionCountdown != 0 && (--_decisionCountdown == 0)) + stNoDecisionYet(); + + if (_smackerFileHash) { + _smackerPlayer->open(_smackerFileHash, _keepLastSmackerFrame); + _smackerFileHash = 0; + } + + Scene::update(); + +} + +uint32 Scene1317::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + stChooseKing(); + break; + } + return messageResult; +} + +uint32 Scene1317::hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x >= 21 && param.asPoint().y >= 24 && + param.asPoint().x <= 261 && param.asPoint().y <= 280) { + stHoborgAsKing(); + } else if (param.asPoint().x >= 313 && param.asPoint().y >= 184 && + param.asPoint().x <= 399 && param.asPoint().y <= 379) { + stKlaymenAsKing(); + } else if (param.asPoint().x >= 347 && param.asPoint().y >= 380 && + param.asPoint().x <= 418 && param.asPoint().y <= 474) { + stKlaymenAsKing(); + } + break; + } + return messageResult; +} + +uint32 Scene1317::hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + stEndMovie(); + break; + } + return messageResult; +} + +uint32 Scene1317::hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + leaveScene(0); + break; + } + return messageResult; +} + +void Scene1317::stChooseKing() { + showMouse(true); + _smackerFileHash = 0x10982841; + _keepLastSmackerFrame = true; + _decisionCountdown = 450; + _klaymenBlinks = false; + _klaymenBlinkCountdown = _vm->_rnd->getRandomNumber(30 - 1) + 15; + SetMessageHandler(&Scene1317::hmChooseKing); + SetUpdateHandler(&Scene1317::upChooseKing); +} + +void Scene1317::stNoDecisionYet() { + showMouse(false); + _smackerFileHash = 0x20982841; + _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::handleMessage); + SetUpdateHandler(&Scene1317::update); +} + +void Scene1317::stHoborgAsKing() { + showMouse(false); + _smackerFileHash = 0x40982841; + _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::hmHoborgAsKing); + SetUpdateHandler(&Scene1317::update); +} + +void Scene1317::stKlaymenAsKing() { + showMouse(false); + _smackerFileHash = 0x80982841; + _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::hmEndMovie); + SetUpdateHandler(&Scene1317::update); +} + +void Scene1317::stEndMovie() { + showMouse(false); + _smackerFileHash = 0x40800711; + _keepLastSmackerFrame = false; + SetMessageHandler(&Scene1317::hmEndMovie); + SetUpdateHandler(&Scene1317::update); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1300.h b/engines/neverhood/modules/module1300.h new file mode 100644 index 0000000000..501f76304f --- /dev/null +++ b/engines/neverhood/modules/module1300.h @@ -0,0 +1,295 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1300_H +#define NEVERHOOD_MODULES_MODULE1300_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/smackerplayer.h" + +namespace Neverhood { + +// Module1300 + +class Module1300 : public Module { +public: + Module1300(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1300(); +protected: + int _sceneNum; + uint32 _musicFileHash; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class AsScene1302Bridge : public AnimatedSprite { +public: + AsScene1302Bridge(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stLowerBridge(); + void stRaiseBridge(); + void cbLowerBridgeEvent(); +}; + +class SsScene1302Fence : public StaticSprite { +public: + SsScene1302Fence(NeverhoodEngine *vm); +protected: + int16 _firstY; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveDown(); + void suMoveUp(); +}; + +class Scene1302 : public Scene { +public: + Scene1302(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asVenusFlyTrap; + Sprite *_asBridge; + Sprite *_ssFence; + Sprite *_asRing1; + Sprite *_asRing2; + Sprite *_asRing3; + Sprite *_asRing4; + Sprite *_asRing5; + Sprite *_class595; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1303Balloon : public AnimatedSprite { +public: + AsScene1303Balloon(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmBalloonPopped(int messageNum, const MessageParam ¶m, Entity *sender); + void stPopBalloon(); +}; + +class Scene1303 : public Scene { +public: + Scene1303(NeverhoodEngine *vm, Module *parentModule); +protected: + Sprite *_sprite1; + Sprite *_asBalloon; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1304Needle : public AnimatedSprite { +public: + AsScene1304Needle(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, int16 x, int16 y); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1304 : public Scene { +public: + Scene1304(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_asKey; + Sprite *_asNeedle; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1305 : public Scene { +public: + Scene1305(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1306Elevator : public AnimatedSprite { +public: + AsScene1306Elevator(NeverhoodEngine *vm, Scene *parentScene, AnimatedSprite *asElevatorDoor); +protected: + Scene *_parentScene; + AnimatedSprite *_asElevatorDoor; + bool _isUp; + bool _isDown; + int _countdown; + void update(); + void upGoingDown(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stGoingUp(); + void cbGoingUpEvent(); + void stGoingDown(); + void cbGoingDownEvent(); +}; + +class Scene1306 : public Scene { +public: + Scene1306(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene1306(); +protected: + Sprite *_ssButton; + Sprite *_asTape; + AnimatedSprite *_asElevatorDoor; + Sprite *_asElevator; + Sprite *_sprite1; + Sprite *_asKey; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage416EB0(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1307Key : public AnimatedSprite { +public: + AsScene1307Key(NeverhoodEngine *vm, Scene *parentScene, uint keyIndex, NRect *clipRects); +protected: + Scene *_parentScene; + NPointArray *_pointList; + uint _pointIndex; + int _frameIndex; + uint _keyIndex; + NRect *_clipRects; + bool _isClickable; + int16 _prevX, _prevY; + int16 _deltaX, _deltaY; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suRemoveKey(); + void suInsertKey(); + void suMoveKey(); + void stRemoveKey(); + void stInsertKey(); + void stMoveKey(); + void stUnlock(); + void stInsert(); +}; + +class Scene1307 : public Scene { +public: + Scene1307(NeverhoodEngine *vm, Module *parentModule); +protected: + NPointArray *_keyHolePoints; + NRect _keyHoleRects[16]; + NRect _clipRects[4]; + Sprite *_asKeys[3]; + int _countdown; + Sprite *_asCurrKey; + bool _isInsertingKey; + bool _doLeaveScene; + bool _isPuzzleSolved; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene1308JaggyDoor : public AnimatedSprite { +public: + AsScene1308JaggyDoor(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stOpenDoorDone(); + void stCloseDoor(); + void stCloseDoorDone(); +}; + +class AsScene1308KeyboardDoor : public AnimatedSprite { +public: + AsScene1308KeyboardDoor(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stFallingKeys(); + void stFallingKeysDone(); +}; + +class AsScene1308LightWallSymbols : public AnimatedSprite { +public: + AsScene1308LightWallSymbols(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stFadeIn(); + void stFadeOut(); + void stFadeOutDone(); +}; + +class SsScene1308Number : public StaticSprite { +public: + SsScene1308Number(NeverhoodEngine *vm, uint32 fileHash, int index); +}; + +class AsScene1308Mouse : public AnimatedSprite { +public: + AsScene1308Mouse(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1308 : public Scene { +public: + Scene1308(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asTape; + Sprite *_asJaggyDoor; + Sprite *_asLightWallSymbols; + Sprite *_ssNumber1; + Sprite *_ssNumber2; + Sprite *_ssNumber3; + AnimatedSprite *_asProjector; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_sprite5; + bool _isProjecting; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1317 : public Scene { +public: + Scene1317(NeverhoodEngine *vm, Module *parentModule); +protected: + SmackerPlayer *_smackerPlayer; + bool _klaymenBlinks; + int _klaymenBlinkCountdown; + int _decisionCountdown; + uint32 _smackerFileHash; + bool _keepLastSmackerFrame; + void update(); + void upChooseKing(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmChooseKing(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmHoborgAsKing(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmEndMovie(int messageNum, const MessageParam ¶m, Entity *sender); + void stChooseKing(); + void stNoDecisionYet(); + void stHoborgAsKing(); + void stKlaymenAsKing(); + void stEndMovie(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1300_H */ diff --git a/engines/neverhood/modules/module1400.cpp b/engines/neverhood/modules/module1400.cpp new file mode 100644 index 0000000000..4f69637ee0 --- /dev/null +++ b/engines/neverhood/modules/module1400.cpp @@ -0,0 +1,1621 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1400.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module2100.h" +#include "neverhood/modules/module2200.h" +#include "neverhood/diskplayerscene.h" +#include "neverhood/gamemodule.h" + +namespace Neverhood { + +Module1400::Module1400(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _vm->_soundMan->addMusic(0x00AD0012, 0x06333232); + _vm->_soundMan->addMusic(0x00AD0012, 0x624A220E); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else + createScene(0, 0); + +} + +Module1400::~Module1400() { + _vm->_soundMan->deleteMusicGroup(0x00AD0012); +} + +void Module1400::createScene(int sceneNum, int which) { + debug("Module1400::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->_soundMan->startMusic(0x06333232, 0, 2); + _childObject = new Scene1401(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->_soundMan->stopMusic(0x06333232, 0, 2); + _vm->_soundMan->stopMusic(0x624A220E, 0, 2); + _childObject = new Scene1402(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->stopMusic(0x06333232, 0, 2); + _vm->_soundMan->startMusic(0x624A220E, 0, 2); + _childObject = new Scene1403(_vm, this, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + _vm->_soundMan->startMusic(0x06333232, 0, 2); + _childObject = new Scene1404(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->startMusic(0x06333232, 0, 2); + _childObject = new Scene1405(_vm, this); + break; + case 5: + _vm->gameState().sceneNum = 5; + _vm->_soundMan->stopMusic(0x06333232, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 2); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->_soundMan->stopMusic(0x06333232, 0, 2); + _childObject = new Scene1407(_vm, this); + break; + } + SetUpdateHandler(&Module1400::updateScene); + _childObject->handleUpdate(); +} + +void Module1400::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(1, 0); + else if (_moduleResult == 2) + createScene(3, 0); + else + leaveModule(0); + break; + case 1: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(6, -1); + else + createScene(0, 1); + break; + case 2: + createScene(1, 1); + break; + case 3: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 2) + createScene(5, -1); + else + createScene(0, 2); + break; + case 4: + createScene(3, 1); + break; + case 5: + createScene(3, 2); + break; + case 6: + createScene(1, 2); + break; + } + } +} + +// Scene1401 + +AsScene1401Pipe::AsScene1401Pipe(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100), _countdown1(0), _countdown2(0) { + + createSurface(900, 152, 147); + _x = 454; + _y = 217; + startAnimation(0x4C210500, 0, -1); + SetUpdateHandler(&AsScene1401Pipe::update); + SetMessageHandler(&AsScene1401Pipe::handleMessage); +} + +AsScene1401Pipe::~AsScene1401Pipe() { + _vm->_soundMan->deleteSoundGroup(0x01104C08); +} + +void AsScene1401Pipe::update() { + AnimatedSprite::update(); + if (_countdown1 != 0 && (--_countdown1 == 0)) + stDoneSucking(); + if (_countdown2 != 0 && (--_countdown2 == 0)) { + _vm->_soundMan->addSound(0x01104C08, 0x4A116437); + _vm->_soundMan->playSoundLooping(0x4A116437); + } +} + +void AsScene1401Pipe::upSuckInProjector() { + AnimatedSprite::update(); + if (_countdown1 != 0) + _countdown1--; +} + +uint32 AsScene1401Pipe::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0A8A1490) + playSound(1, 0x6AB6666F); + break; + case 0x2000: + _countdown1 = 70; + _countdown2 = 8; + stStartSucking(); + break; + case 0x483A: + stSuckInProjector(); + break; + } + return messageResult; +} + +uint32 AsScene1401Pipe::hmSuckInProjector(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + if (_countdown1 != 0) + stStartSucking(); + else + stDoneSucking(); + SetMessageHandler(&AsScene1401Pipe::handleMessage); + SetUpdateHandler(&AsScene1401Pipe::update); + break; + } + return messageResult; +} + +void AsScene1401Pipe::stStartSucking() { + startAnimation(0x4C240100, 0, -1); + playSound(0, 0x4A30063F); +} + +void AsScene1401Pipe::stDoneSucking() { + _vm->_soundMan->deleteSound(0x4A116437); + playSound(0, 0x4A120435); + startAnimation(0x4C210500, 0, -1); +} + +void AsScene1401Pipe::stSuckInProjector() { + startAnimation(0x6C210810, 0, -1); + SetUpdateHandler(&AsScene1401Pipe::upSuckInProjector); + SetMessageHandler(&AsScene1401Pipe::hmSuckInProjector); +} + +AsScene1401Mouse::AsScene1401Mouse(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + createSurface(100, 71, 41); + _x = 478; + _y = 433; + startAnimation(0xA282C472, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1401Mouse::handleMessage); +} + +uint32 AsScene1401Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x66382026) + playSound(0, 0x0CD84468); + else if (param.asInteger() == 0x6E28061C) + playSound(0, 0x78C8402C); + else if (param.asInteger() == 0x462F0410) + playSound(0, 0x60984E28); + break; + case 0x4839: + stSuckedIn(); + break; + } + return messageResult; +} + +void AsScene1401Mouse::suSuckedIn() { + AnimatedSprite::updateDeltaXY(); + if (_collisionBounds.y1 <= 150) { + playSound(0, 0x0E32247F); + stopAnimation(); + setVisible(false); + SetMessageHandler(NULL); + SetSpriteUpdate(NULL); + } +} + +void AsScene1401Mouse::stSuckedIn() { + startAnimation(0x34880040, 0, -1); + SetSpriteUpdate(&AsScene1401Mouse::suSuckedIn); +} + +AsScene1401Cheese::AsScene1401Cheese(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + createSurface(200, 152, 147); + _x = 427; + _y = 433; + startAnimation(0x461A1490, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1401Cheese::handleMessage); +} + +uint32 AsScene1401Cheese::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4839: + stSuckedIn(); + break; + } + return messageResult; +} + +void AsScene1401Cheese::suSuckedIn() { + AnimatedSprite::updateDeltaXY(); + if (_collisionBounds.y1 <= 150) { + playSound(0, 0x18020439); + stopAnimation(); + setVisible(false); + SetMessageHandler(NULL); + SetSpriteUpdate(NULL); + } +} + +void AsScene1401Cheese::stSuckedIn() { + startAnimation(0x103B8020, 0, -1); + SetSpriteUpdate(&AsScene1401Cheese::suSuckedIn); +} + +AsScene1401BackDoor::AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown(0), _isOpen(isOpen) { + + _x = 320; + _y = 240; + createSurface1(0x04551900, 100); + if (isOpen) { + startAnimation(0x04551900, -1, -1); + _countdown = 48; + } else { + stopAnimation(); + setVisible(false); + } + _newStickFrameIndex = STICK_LAST_FRAME; + SetUpdateHandler(&AsScene1401BackDoor::update); + SetMessageHandler(&AsScene1401BackDoor::handleMessage); +} + +void AsScene1401BackDoor::update() { + if (_countdown != 0 && (--_countdown == 0)) + stCloseDoor(); + AnimatedSprite::update(); +} + + +uint32 AsScene1401BackDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + if (_isOpen) + _countdown = 168; + messageResult = _isOpen ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + _countdown = 168; + if (!_isOpen) + stOpenDoor(); + break; + } + return messageResult; +} + +void AsScene1401BackDoor::stOpenDoor() { + _isOpen = true; + setVisible(true); + startAnimation(0x04551900, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + playSound(0, calcHash("fxDoorOpen24")); +} + +void AsScene1401BackDoor::stCloseDoor() { + _isOpen = false; + setVisible(true); + startAnimation(0x04551900, -1, -1); + playSound(0, calcHash("fxDoorClose24")); + _playBackwards = true; + NextState(&AsScene1401BackDoor::stCloseDoorDone); +} + +void AsScene1401BackDoor::stCloseDoorDone() { + stopAnimation(); + setVisible(false); +} + +static const AsCommonProjectorItem kAsCommonProjectorItems[] = { + {{154, 453}, 4, 2, 0, 0, 1}, + {{104, 391}, 4, -1, -1, 1, 1}, + {{ 22, 447}, 6, -1, -1, 1, 1}, + {{112, 406}, 2, -1, -1, 1, 0}, + {{262, 433}, 1, 1, 0, 0, 0} +}; + +AsCommonProjector::AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _klaymen(klaymen), _asPipe(asPipe) { + + _asProjectorItem = &kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)]; + createSurface(990, 101, 182); + startAnimation(0x10E3042B, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsCommonProjector::handleMessage); + _x = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; + _lockedInSlot = true; + moveProjector(); + setDoDeltaX(1); + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) + stStayLockedInSlot(); + loadSound(2, 0xC8C2507C); +} + +AsCommonProjector::~AsCommonProjector() { + _vm->_soundMan->deleteSoundGroup(0x05331081); +} + +uint32 AsCommonProjector::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4807: + setGlobalVar(V_PROJECTOR_SLOT, (_x - _asProjectorItem->point.x) / 108); + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->lockSlotIndex) + stStartLockedInSlot(); + else + stIdle(); + break; + case 0x480B: + if (param.asInteger() != 1) { + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) + incGlobalVar(V_PROJECTOR_SLOT, 1); + } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) + incGlobalVar(V_PROJECTOR_SLOT, -1); + stMoving(); + break; + case 0x480C: + // Check if the projector can be moved + if (param.asInteger() != 1) + messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; + else + messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + case 0x4839: + stStartSuckedIn(); + break; + } + return messageResult; +} + +uint32 AsCommonProjector::hmLockedInSlot(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (param.asPoint().x - _x >= 17 && param.asPoint().x - _x <= 56 && + param.asPoint().y - _y >= -120 && param.asPoint().y - _y <= -82) { + sendMessage(_parentScene, 0x4826, 1); + } else + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4807: + sendMessage(_parentScene, 0x4807, 0); + stStopProjecting(); + break; + case 0x480B: + if (param.asInteger() != 1) { + if ((int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount) + incGlobalVar(V_PROJECTOR_SLOT, 1); + } else if (getGlobalVar(V_PROJECTOR_SLOT) > 0) + incGlobalVar(V_PROJECTOR_SLOT, -1); + stTurnToFront(); + break; + case 0x480C: + // Check if the projector can be moved + if (param.asInteger() != 1) + messageResult = (int8)getGlobalVar(V_PROJECTOR_SLOT) < _asProjectorItem->maxSlotCount ? 1 : 0; + else + messageResult = getGlobalVar(V_PROJECTOR_SLOT) > 0 ? 1 : 0; + break; + case 0x480F: + stStartProjecting(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsCommonProjector::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsCommonProjector::suMoving() { + if (_x <= _klaymen->getX()) + _x = _klaymen->getX() - 100; + else + _x = _klaymen->getX() + 100; + moveProjector(); + if (_beforeMoveX == _x) { + if (getGlobalVar(V_PROJECTOR_SLOT) == 0 && _asProjectorItem->leftBorderLeaves != 0) { + sendMessage(_parentScene, 0x1019, 0); + incGlobalVar(V_PROJECTOR_LOCATION, -1); + setGlobalVar(V_PROJECTOR_SLOT, kAsCommonProjectorItems[getGlobalVar(V_PROJECTOR_LOCATION)].maxSlotCount); + } else if ((int8)getGlobalVar(V_PROJECTOR_SLOT) == _asProjectorItem->maxSlotCount && _asProjectorItem->rightBorderLeaves != 0) { + sendMessage(_parentScene, 0x1019, 1); + incGlobalVar(V_PROJECTOR_LOCATION, +1); + setGlobalVar(V_PROJECTOR_SLOT, 0); + } + } + Sprite::updateBounds(); +} + +void AsCommonProjector::moveProjector() { + + bool nowLockedInSlot = false; + + _y = _asProjectorItem->point.y; + + if (_asProjectorItem->index1 != -1) { + int16 elX = _asProjectorItem->index1 * 108 + _asProjectorItem->point.x; + if (elX - 20 < _x && elX + 20 > _x) { + nowLockedInSlot = true; + _y = _asProjectorItem->point.y + 10; + } + } + + if (_asProjectorItem->lockSlotIndex != -1) { + int16 elX = _asProjectorItem->lockSlotIndex * 108 + _asProjectorItem->point.x; + if (elX - 20 < _x && elX + 20 > _x) { + nowLockedInSlot = true; + _y = _asProjectorItem->point.y + 10; + } + } + + if (_lockedInSlot && !nowLockedInSlot) + _lockedInSlot = false; + else if (!_lockedInSlot && nowLockedInSlot) { + playSound(1, 0x5440E474); + _lockedInSlot = true; + } + +} + +void AsCommonProjector::stSuckedIn() { + AnimatedSprite::updateDeltaXY(); + if (_collisionBounds.y1 <= 150) { + sendMessage(_asPipe, 0x483A, 0); + stopAnimation(); + setVisible(false); + SetMessageHandler(&Sprite::handleMessage); + SetSpriteUpdate(NULL); + } +} + +void AsCommonProjector::stIdle() { + startAnimation(0x10E3042B, 0, -1); + SetMessageHandler(&AsCommonProjector::handleMessage); + SetSpriteUpdate(NULL); +} + +void AsCommonProjector::stMoving() { + _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; + startAnimation(0x14A10137, 0, -1); + playSound(1, 0xEC008474); + SetMessageHandler(&AsCommonProjector::handleMessage); + SetSpriteUpdate(&AsCommonProjector::suMoving); +} + +void AsCommonProjector::stStartLockedInSlot() { + startAnimation(0x80C32213, 0, -1); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(NULL); + NextState(&AsCommonProjector::stStayLockedInSlot); +} + +void AsCommonProjector::stStayLockedInSlot() { + startAnimation(0xD23B207F, 0, -1); + SetMessageHandler(&AsCommonProjector::hmLockedInSlot); + SetSpriteUpdate(NULL); +} + +void AsCommonProjector::stStartProjecting() { + startAnimation(0x50A80517, 0, -1); + setGlobalVar(V_PROJECTOR_ACTIVE, 1); + playSound(0, 0xCC4A8456); + _vm->_soundMan->addSound(0x05331081, 0xCE428854); + _vm->_soundMan->playSoundLooping(0xCE428854); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(NULL); + NextState(&AsCommonProjector::stLockedInSlot); +} + +void AsCommonProjector::stLockedInSlot() { + sendMessage(_parentScene, 0x480F, 0); + startAnimation(0xD833207F, 0, -1); + SetMessageHandler(&AsCommonProjector::hmLockedInSlot); + SetSpriteUpdate(NULL); +} + +void AsCommonProjector::stStopProjecting() { + startAnimation(0x50A94417, 0, -1); + setGlobalVar(V_PROJECTOR_ACTIVE, 0); + playSound(0, 0xCC4A8456); + _vm->_soundMan->deleteSound(0xCE428854); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(NULL); + NextState(&AsCommonProjector::stStayLockedInSlot); +} + +void AsCommonProjector::stTurnToFront() { + _beforeMoveX = getGlobalVar(V_PROJECTOR_SLOT) * 108 + _asProjectorItem->point.x; + startAnimation(0x22CB4A33, 0, -1); + SetMessageHandler(&AsCommonProjector::hmAnimation); + SetSpriteUpdate(&AsCommonProjector::suMoving); + NextState(&AsCommonProjector::stMoving); +} + +void AsCommonProjector::stStartSuckedIn() { + setGlobalVar(V_PROJECTOR_LOCATION, 4); + setGlobalVar(V_PROJECTOR_SLOT, 0); + startAnimation(0x708D4712, 0, -1); + playSound(2); + SetMessageHandler(&Sprite::handleMessage); + SetSpriteUpdate(&AsCommonProjector::stSuckedIn); +} + +Scene1401::Scene1401(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _projectorBorderFlag(false), _ssFloorButton(NULL), _asProjector(NULL), + _asPipe(NULL), _asMouse(NULL), _asCheese(NULL), _asBackDoor(NULL), + _sprite1(NULL), _sprite2(NULL), _sprite3(NULL), _ssButton(NULL) { + + SetMessageHandler(&Scene1401::handleMessage); + SetUpdateHandler(&Scene1401::update); + + setRectList(0x004B6758); + setBackground(0x08221FA5); + setPalette(0x08221FA5); + insertScreenMouse(0x21FA108A); + + _ssFloorButton = insertSprite(this, 0x980F3124, 0x12192892, 100, 0); + _asPipe = insertSprite(); + + if (!getGlobalVar(V_MOUSE_SUCKED_IN)) { + _asMouse = insertSprite(); + _asCheese = insertSprite(); + } + + _sprite3 = insertStaticSprite(0xA82BA811, 1100); + insertStaticSprite(0x0A116C60, 1100); + _ssButton = insertSprite(this, 0xB84B1100, 100, 0); + _sprite1 = insertStaticSprite(0x38EA100C, 1005); + _sprite2 = insertStaticSprite(0x98D0223C, 1200); + _sprite2->setVisible(false); + + if (which < 0) { + // Restoring game + insertKlaymen(380, 447); + setMessageList(0x004B65C8); + _sprite1->setVisible(false); + } else if (which == 1) { + // Klaymen entering from the left + insertKlaymen(0, 447); + setMessageList(0x004B65D0); + _sprite1->setVisible(false); + } else if (which == 2) { + // Klaymen entering from the right + insertKlaymen(660, 447); + setMessageList(0x004B65D8); + _sprite1->setVisible(false); + } else { + // Klaymen entering from the back + insertKlaymen(290, 413); + setMessageList(0x004B65E8); + _sprite1->setVisible(false); + } + + if (getGlobalVar(V_PROJECTOR_LOCATION) == 2) { + _asProjector = insertSprite(this, _klaymen, _asPipe); + addCollisionSprite(_asProjector); + if (getGlobalVar(V_PROJECTOR_SLOT) == 6) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() + 100); + _klaymen->updateBounds(); + setMessageList(0x004B6670); + } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() - 100); + _klaymen->updateBounds(); + setMessageList(0x004B6670); + } + _asProjector->setClipRect(_sprite3->getDrawRect().x, _sprite2->getDrawRect().y, 640, 480); + } + + _klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, 480); + + if (which == 0 && _asProjector) + sendMessage(_asProjector, 0x482B, 0); + + _asBackDoor = insertSprite(_klaymen, which == 0); + +} + +void Scene1401::update() { + Scene::update(); + if (_asProjector && !_projectorBorderFlag && _asProjector->getY() < 360) { + _sprite2->setVisible(true); + _projectorBorderFlag = true; + } else + _sprite2->setVisible(false); +} + +uint32 Scene1401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02144CB1) + sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); + else if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x01C66840) { + if (sendMessage(_asBackDoor, 0x2001, 0) != 0) + setMessageList(0x004B6690); + else + setMessageList(0x004B66B0); + } + break; + case 0x1019: + if (param.asInteger() != 0) + leaveScene(2); + else + leaveScene(1); + break; + case 0x480B: + if (sender == _ssFloorButton) { + sendMessage(_asPipe, 0x2000, 0); + if (!getGlobalVar(V_MOUSE_SUCKED_IN)) { + sendMessage(_asMouse, 0x4839, 0); + sendMessage(_asCheese, 0x4839, 0); + setGlobalVar(V_MOUSE_SUCKED_IN, 1); + } + if (_asProjector && _asProjector->getX() > 404 && _asProjector->getX() < 504) + sendMessage(_asProjector , 0x4839, 0); + } else if (sender == _ssButton) + sendMessage(_asBackDoor, 0x4808, 0); + break; + case 0x4826: + if (sender == _asProjector) { + if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B6658); + } else + setMessageList2(0x004B65F0); + } + break; + case 0x482A: + _sprite1->setVisible(true); + if (_asProjector) + sendMessage(_asProjector, 0x482B, 0); + break; + case 0x482B: + _sprite1->setVisible(false); + if (_asProjector) + sendMessage(_asProjector, 0x482A, 0); + break; + } + return 0; +} + +// Scene1402 + +SsScene1402BridgePart::SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority) + : StaticSprite(vm, fileHash, surfacePriority) { + + SetFilterY(&Sprite::defFilterY); + SetUpdateHandler(&StaticSprite::updatePosition); +} + +AsScene1402PuzzleBox::AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(900, 347, 230); + + SetFilterY(&Sprite::defFilterY); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1402PuzzleBox::handleMessage); + _x = 279; + _y = 270; + if (status == 2) { + // Puzzle box after the puzzle was solved + startAnimation(0x20060259, 0, -1); + playSound(0, 0x419014AC); + loadSound(1, 0x61901C29); + NextState(&AsScene1402PuzzleBox::stMoveDownSolvedDone); + } else if (status == 1) { + // Puzzle box appears + startAnimation(0x210A0213, 0, -1); + playSound(0, 0x41809C6C); + NextState(&AsScene1402PuzzleBox::stMoveUpDone); + } else { + // Puzzle box is here + startAnimation(0x20060259, -1, -1); + loadSound(1, 0x61901C29); + _newStickFrameIndex = STICK_LAST_FRAME; + } +} + +uint32 AsScene1402PuzzleBox::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + playSound(1); + startAnimation(0x20060259, -1, -1); + _playBackwards = true; + NextState(&AsScene1402PuzzleBox::stMoveDownDone); + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1402PuzzleBox::stMoveUpDone() { + sendMessage(_parentScene, 0x2000, 0); + stopAnimation(); + setVisible(false); +} + +void AsScene1402PuzzleBox::stMoveDownDone() { + sendMessage(_parentScene, 0x2001, 0); + stopAnimation(); + setVisible(false); +} + +void AsScene1402PuzzleBox::stMoveDownSolvedDone() { + sendMessage(_parentScene, 0x2003, 0); + stopAnimation(); +} + +Scene1402::Scene1402(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isShaking(false), _asPuzzleBox(NULL), _asProjector(NULL) { + + SetMessageHandler(&Scene1402::handleMessage); + + _vm->_screen->setYOffset(0); + + setBackground(0x231482F0); + setBackgroundY(-10); + setPalette(0x231482F0); + _palette->addPalette(0x91D3A391, 0, 64, 0); + insertScreenMouse(0x482F4239); + + _ssBridgePart1 = insertSprite(0x15402D64, 1100); + _ssBridgePart2 = insertSprite(0x10A02120, 1100); + _ssBridgePart3 = insertSprite(0x60882BE0, 1100); + + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) + setRectList(0x004B0C48); + else + setRectList(0x004B0C98); + + if (which < 0) { + // Restoring game + insertKlaymen(377, 391); + setMessageList(0x004B0B48); + if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) + _asPuzzleBox = insertSprite(this, 0); + } else if (which == 1) { + // Klaymen entering from the left + insertKlaymen(42, 391); + setMessageList(0x004B0B50); + } else if (which == 2) { + // Klaymen returning from the puzzle box + insertKlaymen(377, 391); + setMessageList(0x004B0B60); + _klaymen->setDoDeltaX(1); + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { + _asPuzzleBox = insertSprite(this, 1); + clearRectList(); + showMouse(false); + startShaking(); + } else + _asPuzzleBox = insertSprite(this, 0); + } else { + // Klaymen entering from the right + insertKlaymen(513, 391); + setMessageList(0x004B0B58); + if (!getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) { + _asPuzzleBox = insertSprite(this, 2); + startShaking(); + } + } + + if (_asPuzzleBox) + _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); + + if (getGlobalVar(V_PROJECTOR_LOCATION) == 1) { + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); + addCollisionSprite(_asProjector); + if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() + 100); + _klaymen->updateBounds(); + setMessageList(0x004B0BD0); + } else if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() - 100); + _klaymen->updateBounds(); + setMessageList(0x004B0BD0); + } + _asProjector->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x, _ssBridgePart3->getDrawRect().y2()); + } + + _klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); + +} + +void Scene1402::upShaking() { + if (_isShaking) { + setBackgroundY(_vm->_rnd->getRandomNumber(10 - 1) - 10); + _vm->_screen->setYOffset(-10 - getBackgroundY()); + } else { + setBackgroundY(-10); + _vm->_screen->setYOffset(0); + SetUpdateHandler(&Scene::update); + } + Scene::update(); + if (_asPuzzleBox) + _asPuzzleBox->setClipRect(0, 0, 640, _ssBridgePart3->getDrawRect().y2()); + _klaymen->setClipRect(_ssBridgePart1->getDrawRect().x, 0, _ssBridgePart2->getDrawRect().x2(), _ssBridgePart3->getDrawRect().y2()); +} + +uint32 Scene1402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x00F43389) { + if (getGlobalVar(V_MOUSE_PUZZLE_SOLVED)) + leaveScene(0); + else { + clearRectList(); + _klaymen->setVisible(false); + showMouse(false); + sendMessage(_asPuzzleBox, 0x2002, 0); + startShaking(); + } + } + break; + case 0x1019: + if (param.asInteger()) + leaveScene(0); + else + leaveScene(1); + break; + case 0x2000: + stopShaking(); + showMouse(true); + setRectList(0x004B0C48); + break; + case 0x2001: + stopShaking(); + leaveScene(0); + break; + case 0x2003: + stopShaking(); + break; + case 0x4826: + if (sender == _asProjector) { + if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B0BB8); + } else + setMessageList2(0x004B0B68); + } + break; + } + return 0; +} + +void Scene1402::startShaking() { + _isShaking = true; + SetUpdateHandler(&Scene1402::upShaking); +} + +void Scene1402::stopShaking() { + _isShaking = false; +} + +// Scene1407 + +static const int16 kScene1407MouseFloorY[] = { + 106, 150, 191, 230, 267, 308, 350, 395 +}; + +static const struct { + int16 x; + int16 floorIndex; + int16 sectionIndex; + int16 nextHoleIndex; +} kScene1407MouseHoles[] = { + {125, 0, 0, 7}, + {452, 7, 21, 0}, + {337, 4, 11, 4}, + {286, 6, 17, 6}, + {348, 6, 17, 39}, + {536, 6, 18, 42}, + {111, 1, 3, 18}, + {203, 1, 3, 38}, + {270, 1, 3, 9}, + {197, 5, 14, 3}, + {252, 5, 14, 35}, + {297, 5, 14, 7}, + {359, 5, 14, 8}, + {422, 4, 12, 26}, + {467, 4, 12, 2}, + {539, 4, 12, 40}, + {111, 5, 13, 17}, + {211, 0, 1, 20}, + {258, 0, 1, 11}, + {322, 0, 1, 16}, + { 99, 6, 16, 31}, + {142, 6, 16, 27}, + {194, 6, 16, 12}, + {205, 2, 6, 45}, + {264, 2, 6, 10}, + { 98, 4, 10, 2}, + {152, 4, 10, 37}, + {199, 4, 10, 13}, + {258, 4, 10, 16}, + {100, 7, 19, 43}, + {168, 7, 19, 23}, + {123, 3, 8, 14}, + {181, 3, 8, 39}, + {230, 3, 8, 28}, + {292, 3, 8, 22}, + {358, 3, 8, 36}, + {505, 3, 9, 44}, + {400, 2, 7, 34}, + {454, 2, 7, 32}, + {532, 2, 7, 46}, + {484, 5, 15, 25}, + {529, 5, 15, 30}, + {251, 7, 20, 48}, + {303, 7, 20, 21}, + {360, 7, 20, 33}, + {503, 0, 2, 5}, + {459, 1, 4, 19}, + {530, 1, 4, 42}, + {111, 2, 5, 47}, + {442, 6, 18, 1} +}; + +static const struct { + int16 x1, x2; + int16 goodHoleIndex; +} kScene1407MouseSections[] = { + {100, 149, 0}, + {182, 351, 17}, + {430, 524, 45}, + { 89, 293, 7}, + {407, 555, 47}, + { 89, 132, 48}, + {178, 303, 23}, + {367, 551, 38}, + {105, 398, 31}, + {480, 537, 36}, + { 84, 275, 27}, + {318, 359, 2}, + {402, 560, 15}, + { 91, 132, 16}, + {179, 400, 10}, + {461, 552, 41}, + { 86, 218, 21}, + {267, 376, 4}, + {420, 560, 49}, + { 77, 188, 30}, + {237, 394, 44}, + {438, 515, 5} +}; + +AsScene1407Mouse::AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _currSectionIndex(0) { + + createSurface(100, 117, 45); + _x = 108; + _y = 106; + stIdleLookAtGoodHole(); + SetUpdateHandler(&AnimatedSprite::update); +} + +void AsScene1407Mouse::suWalkTo() { + int16 xdelta = _walkDestX - _x; + if (xdelta > _deltaX) + xdelta = _deltaX; + else if (xdelta < -_deltaX) + xdelta = -_deltaX; + _deltaX = 0; + if (_walkDestX == _x) + sendMessage(this, 0x1019, 0); + else { + _x += xdelta; + updateBounds(); + } +} + +void AsScene1407Mouse::upGoThroughHole() { + if (_countdown != 0 && (--_countdown == 0)) { + SetUpdateHandler(&AnimatedSprite::update); + gotoNextState(); + } + AnimatedSprite::update(); +} + +uint32 AsScene1407Mouse::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + { + int16 mouseX = param.asPoint().x; + int16 mouseY = param.asPoint().y; + int holeIndex; + for (holeIndex = 0; holeIndex < 50; holeIndex++) { + int16 holeX = kScene1407MouseHoles[holeIndex].x; + int16 holeY = kScene1407MouseFloorY[kScene1407MouseHoles[holeIndex].floorIndex]; + if (mouseX >= holeX - 14 && mouseX <= holeX + 14 && mouseY >= holeY - 36 && mouseY <= holeY) + break; + } + if (holeIndex < 50 && kScene1407MouseHoles[holeIndex].sectionIndex == _currSectionIndex) { + _nextHoleIndex = kScene1407MouseHoles[holeIndex].nextHoleIndex; + _walkDestX = kScene1407MouseHoles[holeIndex].x; + stWalkToHole(); + } else { + if (mouseX < kScene1407MouseSections[_currSectionIndex].x1) + _walkDestX = kScene1407MouseSections[_currSectionIndex].x1; + else if (mouseX > kScene1407MouseSections[_currSectionIndex].x2) + _walkDestX = kScene1407MouseSections[_currSectionIndex].x2; + else + _walkDestX = mouseX; + stWalkToDest(); + } + } + break; + case 0x1019: + gotoNextState(); + break; + case 0x2001: + { + // Reset the position + // Find the nearest hole and go through it, and exit at the first hole + int16 distance = 640; + int matchIndex = 50; + for (int index = 0; index < 50; index++) + if (kScene1407MouseHoles[index].sectionIndex == _currSectionIndex && + ABS(kScene1407MouseHoles[index].x - _x) < distance) { + matchIndex = index; + distance = ABS(kScene1407MouseHoles[index].x - _x); + } + if (matchIndex < 50) { + _nextHoleIndex = 0; + _walkDestX = kScene1407MouseHoles[matchIndex].x; + stWalkToHole(); + } + } + break; + } + return messageResult; +} + +void AsScene1407Mouse::stIdleLookAtGoodHole() { + setDoDeltaX(kScene1407MouseHoles[kScene1407MouseSections[_currSectionIndex].goodHoleIndex].x < _x ? 1 : 0); + startAnimation(0x72215194, 0, -1); + SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetSpriteUpdate(NULL); +} + +void AsScene1407Mouse::stWalkToDest() { + if (_walkDestX != _x) { + setDoDeltaX(_walkDestX < _x ? 1 : 0); + startAnimation(0x22291510, 0, -1); + SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); + NextState(&AsScene1407Mouse::stIdleLookAtGoodHole); + } +} + +void AsScene1407Mouse::stWalkToHole() { + setDoDeltaX(_walkDestX < _x ? 1 : 0); + startAnimation(0x22291510, 0, -1); + SetMessageHandler(&AsScene1407Mouse::handleMessage); + SetSpriteUpdate(&AsScene1407Mouse::suWalkTo); + NextState(&AsScene1407Mouse::stGoThroughHole); +} + +void AsScene1407Mouse::stGoThroughHole() { + startAnimation(0x72215194, 0, -1); + setVisible(false); + _countdown = 12; + SetUpdateHandler(&AsScene1407Mouse::upGoThroughHole); + SetMessageHandler(NULL); + SetSpriteUpdate(NULL); + NextState(&AsScene1407Mouse::stArriveAtHole); +} + +void AsScene1407Mouse::stArriveAtHole() { + _currSectionIndex = kScene1407MouseHoles[_nextHoleIndex].sectionIndex; + _x = kScene1407MouseHoles[_nextHoleIndex].x; + _y = kScene1407MouseFloorY[kScene1407MouseHoles[_nextHoleIndex].floorIndex]; + if (_nextHoleIndex == 1) { + sendMessage(_parentScene, 0x2000, 0); + _walkDestX = 512; + stWalkToDest(); + setVisible(true); + } else { + _walkDestX = _x + 14; + stWalkToDest(); + setVisible(true); + } +} + +Scene1407::Scene1407(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _puzzleSolvedCountdown(0), _resetButtonCountdown(0) { + + SetMessageHandler(&Scene1407::handleMessage); + SetUpdateHandler(&Scene1407::update); + + setBackground(0x00442225); + setPalette(0x00442225); + insertPuzzleMouse(0x4222100C, 20, 620); + + _asMouse = insertSprite(this); + _ssResetButton = insertStaticSprite(0x12006600, 100); + _ssResetButton->setVisible(false); + +} + +void Scene1407::update() { + Scene::update(); + if (_puzzleSolvedCountdown != 0 && (--_puzzleSolvedCountdown == 0)) + leaveScene(1); + else if (_resetButtonCountdown != 0 && (--_resetButtonCountdown == 0)) + _ssResetButton->setVisible(false); +} + +uint32 Scene1407::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (_puzzleSolvedCountdown == 0) { + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + // Exit scene + leaveScene(0); + } else if (param.asPoint().x >= 75 && param.asPoint().x <= 104 && + param.asPoint().y >= 62 && param.asPoint().y <= 90) { + // The reset button was clicked + sendMessage(_asMouse, 0x2001, 0); + _ssResetButton->setVisible(true); + playSound(0, 0x44045000); + _resetButtonCountdown = 12; + } else { + // Handle the mouse + sendMessage(_asMouse, messageNum, param); + } + } + break; + case 0x2000: + // The mouse got the cheese (nomnom) + setGlobalVar(V_MOUSE_PUZZLE_SOLVED, 1); + playSound(0, 0x68E25540); + showMouse(false); + _puzzleSolvedCountdown = 72; + break; + } + return 0; +} + +// Scene1403 + +Scene1403::Scene1403(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _asProjector(NULL), _isProjecting(false) { + + SetMessageHandler(&Scene1403::handleMessage); + + setRectList(0x004B1FF8); + setBackground(0x2110A234); + setPalette(0x2110A234); + insertScreenMouse(0x0A230219); + + _sprite1 = insertStaticSprite(0x01102A33, 100); + _sprite1->setVisible(false); + _sprite2 = insertStaticSprite(0x04442520, 995); + _sprite3 = insertStaticSprite(0x08742271, 995); + _asTape1 = insertSprite(this, 12, 1100, 201, 468, 0x9148A011); + addCollisionSprite(_asTape1); + _asTape1->setRepl(64, 0); + _asTape2 = insertSprite(this, 16, 1100, 498, 468, 0x9048A093); + addCollisionSprite(_asTape2); + _asTape2->setRepl(64, 0); + + if (which < 0) { + // Restoring game + insertKlaymen(380, 463); + setMessageList(0x004B1F18); + } else { + // Klaymen entering from the right + insertKlaymen(640, 463); + setMessageList(0x004B1F20); + } + _klaymen->setRepl(64, 0); + + if (getGlobalVar(V_PROJECTOR_LOCATION) == 0) { + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); + addCollisionSprite(_asProjector); + if (getGlobalVar(V_PROJECTOR_SLOT) == 4) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() + 100); + _klaymen->updateBounds(); + setMessageList(0x004B1F70); + } + _asProjector->setClipRect(0, 0, 640, _sprite2->getDrawRect().y2()); + _asProjector->setRepl(64, 0); + } + +} + +uint32 Scene1403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x88C11390) { + setRectList(0x004B2008); + _isProjecting = true; + } else if (param.asInteger() == 0x08821382) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setRectList(0x004B1FF8); + _isProjecting = false; + } + break; + case 0x1019: + leaveScene(0); + break; + case 0x1022: + if (sender == _asProjector) { + if (param.asInteger() >= 1000) + setSurfacePriority(_sprite3->getSurface(), 1100); + else + setSurfacePriority(_sprite3->getSurface(), 995); + } + break; + case 0x4807: + _sprite1->setVisible(false); + break; + case 0x480F: + _sprite1->setVisible(true); + break; + case 0x4826: + if (sender == _asProjector) { + if (_isProjecting) + setMessageList2(0x004B1FA8); + else if (param.asInteger() == 1) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B1F88); + } else if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B1F58); + } else + setMessageList2(0x004B1F28); + } else if (sender == _asTape1 || sender == _asTape2) { + if (_isProjecting) + setMessageList2(0x004B1FA8); + else if (_messageListStatus != 2) { + sendEntityMessage(_klaymen, 0x1014, sender); + setMessageList2(0x004B1FB8); + } + } + break; + } + return 0; +} + +// Scene1404 + +Scene1404::Scene1404(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _asProjector(NULL), _asKey(NULL) { + + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 5); + + SetMessageHandler(&Scene1404::handleMessage); + + setRectList(0x004B8D80); + setBackground(0xAC0B006F); + setPalette(0xAC0B006F); + _palette->addPalette(0x00801510, 0, 65, 0); + insertScreenMouse(0xB006BAC8); + + if (getGlobalVar(V_KEY3_LOCATION) == 5) { + _asKey = insertSprite(this, 2, 1100, 267, 411); + addCollisionSprite(_asKey); + } + + _sprite1 = insertStaticSprite(0x1900A1F8, 1100); + _asTape = insertSprite(this, 14, 1100, 281, 411, 0x9148A011); + addCollisionSprite(_asTape); + + if (which < 0) { + // Restoring game + insertKlaymen(376, 406); + setMessageList(0x004B8C28); + } else if (which == 1) { + // Klaymen returning from the tiles puzzle + insertKlaymen(376, 406); + setMessageList(0x004B8C30); + } else if (which == 2) { + // Klaymen returning from the diskplayer + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(347, 406); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen(187, 406); + } + setMessageList(0x004B8D28); + } else { + // Klaymen entering from the left + insertKlaymen(30, 406); + setMessageList(0x004B8C38); + } + + if (getGlobalVar(V_PROJECTOR_LOCATION) == 3) { + _asProjector = insertSprite(this, _klaymen, (Sprite*)NULL); + addCollisionSprite(_asProjector); + if (getGlobalVar(V_PROJECTOR_SLOT) == 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + _klaymen->setX(_asProjector->getX() - 100); + _klaymen->updateBounds(); + setMessageList(0x004B8CB8); + } + _asProjector->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + } + + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + +} + +Scene1404::~Scene1404() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene1404::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x410650C2) { + if (_asProjector && _asProjector->getX() == 220) + setMessageList(0x004B8C40); + else + setMessageList(0x004B8CE8); + } + break; + case 0x1019: + leaveScene(0); + break; + case 0x4826: + if (sender == _asProjector) { + if (sendMessage(_asProjector, 0x480C, _klaymen->getX() > _asProjector->getX() ? 1 : 0) != 0) { + sendEntityMessage(_klaymen, 0x1014, _asProjector); + setMessageList2(0x004B8CA0); + } else + setMessageList2(0x004B8C40); + } else if (sender == _asTape && _messageListStatus != 2) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B8CD0); + } else if (sender == _asKey && _messageListStatus != 2) { + sendEntityMessage(_klaymen, 0x1014, _asKey); + setMessageList(0x004B8D18); + } + break; + } + return 0; +} + +// Scene1405 + +static const NPoint kAsScene1405TileItemPositions[] = { + {100, 80}, {162, 78}, {222, 76}, {292, 76}, + {356, 82}, {422, 84}, {488, 86}, {550, 90}, + {102, 134}, {164, 132}, {224, 136}, {294, 136}, + {360, 136}, {422, 138}, {484, 144}, {548, 146}, + { 98, 196}, {160, 200}, {228, 200}, {294, 202}, + {360, 198}, {424, 200}, {482, 202}, {548, 206}, + { 98, 260}, {160, 264}, {226, 260}, {296, 262}, + {358, 260}, {424, 262}, {486, 264}, {550, 266}, + { 94, 322}, {160, 316}, {226, 316}, {296, 320}, + {358, 322}, {422, 324}, {488, 322}, {550, 322}, + { 98, 380}, {160, 376}, {226, 376}, {294, 378}, + {356, 380}, {420, 380}, {490, 378}, {552, 376} +}; + +AsScene1405Tile::AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _tileIndex(tileIndex), _countdown(0), _isShowing(false) { + + loadSound(0, 0x05308101); + setSoundPan(0, (tileIndex % 8 * 4 + 4) * 25 / 8); + _x = kAsScene1405TileItemPositions[_tileIndex].x; + _y = kAsScene1405TileItemPositions[_tileIndex].y; + createSurface1(0x844B805C, 1100); + setVisible(false); + if (getSubVar(VA_IS_TILE_MATCH, _tileIndex)) + _countdown = _vm->_rnd->getRandomNumber(36 - 1) + 1; + startAnimation(0x844B805C, getSubVar(VA_TILE_SYMBOLS, _tileIndex), -1); + _newStickFrameIndex = (int16)getSubVar(VA_TILE_SYMBOLS, _tileIndex); + SetUpdateHandler(&AsScene1405Tile::update); + SetMessageHandler(&AsScene1405Tile::handleMessage); +} + +void AsScene1405Tile::update() { + updateAnim(); + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) + show(); +} + +uint32 AsScene1405Tile::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (getSubVar(VA_IS_TILE_MATCH, _tileIndex) == 0 && _parentScene->getCountdown() == 0) { + show(); + sendMessage(_parentScene, 0x2000, _tileIndex); + } + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene1405Tile::show() { + if (!_isShowing) { + _isShowing = true; + playSound(0); + setVisible(true); + } +} + +void AsScene1405Tile::hide() { + if (_isShowing) { + _isShowing = false; + playSound(0); + setVisible(false); + } +} + +Scene1405::Scene1405(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _selectFirstTile(true), _tilesLeft(48), _countdown(0) { + + _vm->gameModule()->initMemoryPuzzle(); + + SetUpdateHandler(&Scene1405::update); + SetMessageHandler(&Scene1405::handleMessage); + + setBackground(0x0C0C007D); + setPalette(0x0C0C007D); + insertPuzzleMouse(0xC00790C8, 20, 620); + + for (uint32 tileIndex = 0; tileIndex < 48; tileIndex++) { + _tiles[tileIndex] = insertSprite(this, tileIndex); + addCollisionSprite(_tiles[tileIndex]); + if (getSubVar(VA_IS_TILE_MATCH, tileIndex)) + _tilesLeft--; + } + + loadSound(0, 0x68E25540); +} + +void Scene1405::update() { + Scene::update(); + if (_countdown != 0 && (--_countdown == 0)) { + _tilesLeft = 48; + _tiles[_firstTileIndex]->hide(); + _tiles[_secondTileIndex]->hide(); + for (uint32 i = 0; i < 48; i++) { + if (getSubVar(VA_IS_TILE_MATCH, i)) { + _tiles[i]->hide(); + setSubVar(VA_IS_TILE_MATCH, i, 0); + } + } + } +} + +uint32 Scene1405::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + case 0x2000: + if (_selectFirstTile) { + _firstTileIndex = param.asInteger(); + _selectFirstTile = false; + } else { + _secondTileIndex = param.asInteger(); + if (_firstTileIndex != _secondTileIndex) { + _selectFirstTile = true; + if (getSubVar(VA_TILE_SYMBOLS, _secondTileIndex) == getSubVar(VA_TILE_SYMBOLS, _firstTileIndex)) { + setSubVar(VA_IS_TILE_MATCH, _firstTileIndex, 1); + setSubVar(VA_IS_TILE_MATCH, _secondTileIndex, 1); + _tilesLeft -= 2; + if (_tilesLeft == 0) + playSound(0); + } else + _countdown = 10; + } + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1400.h b/engines/neverhood/modules/module1400.h new file mode 100644 index 0000000000..9a592c2952 --- /dev/null +++ b/engines/neverhood/modules/module1400.h @@ -0,0 +1,281 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1400_H +#define NEVERHOOD_MODULES_MODULE1400_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1200.h" + +namespace Neverhood { + +class Module1400 : public Module { +public: + Module1400(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1400(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1401 + +class AsScene1401Pipe : public AnimatedSprite { +public: + AsScene1401Pipe(NeverhoodEngine *vm); + virtual ~AsScene1401Pipe(); +protected: + int _countdown1; + int _countdown2; + void update(); + void upSuckInProjector(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmSuckInProjector(int messageNum, const MessageParam ¶m, Entity *sender); + void stStartSucking(); + void stDoneSucking(); + void stSuckInProjector(); +}; + +class AsScene1401Mouse : public AnimatedSprite { +public: + AsScene1401Mouse(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suSuckedIn(); + void stSuckedIn(); +}; + +class AsScene1401Cheese : public AnimatedSprite { +public: + AsScene1401Cheese(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suSuckedIn(); + void stSuckedIn(); +}; + +class AsScene1401BackDoor : public AnimatedSprite { +public: + AsScene1401BackDoor(NeverhoodEngine *vm, Sprite *klaymen, bool isOpen); +protected: + Sprite *_klaymen; + int _countdown; + bool _isOpen; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); + void stCloseDoorDone(); +}; + +struct AsCommonProjectorItem { + NPoint point; + int8 maxSlotCount; + int8 lockSlotIndex; + int8 index1; + int8 leftBorderLeaves; + int8 rightBorderLeaves; +}; + +class AsCommonProjector : public AnimatedSprite { +public: + AsCommonProjector(NeverhoodEngine *vm, Scene *parentScene, Sprite *klaymen, Sprite *asPipe); + virtual ~AsCommonProjector(); +protected: + Scene *_parentScene; + Sprite *_klaymen; + Sprite *_asPipe; + const AsCommonProjectorItem *_asProjectorItem; + int16 _beforeMoveX; + bool _lockedInSlot; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLockedInSlot(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoving(); + void moveProjector(); + void stSuckedIn(); + void stIdle(); + void stMoving(); + void stStartLockedInSlot(); + void stStayLockedInSlot(); + void stStartProjecting(); + void stLockedInSlot(); + void stStopProjecting(); + void stTurnToFront(); + void stStartSuckedIn(); +}; + +class Scene1401 : public Scene { +public: + Scene1401(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + bool _projectorBorderFlag; + Sprite *_ssFloorButton; + AsCommonProjector *_asProjector; + Sprite *_asPipe; + Sprite *_asMouse; + Sprite *_asCheese; + Sprite *_asBackDoor; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_ssButton; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1402 + +class SsScene1402BridgePart : public StaticSprite { +public: + SsScene1402BridgePart(NeverhoodEngine *vm, uint32 fileHash, int surfacePriority); +}; + +class AsScene1402PuzzleBox : public AnimatedSprite { +public: + AsScene1402PuzzleBox(NeverhoodEngine *vm, Scene *parentScene, int status); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stMoveUpDone(); + void stMoveDownDone(); + void stMoveDownSolvedDone(); +}; + +class Scene1402 : public Scene { +public: + Scene1402(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssBridgePart1; + Sprite *_ssBridgePart2; + Sprite *_ssBridgePart3; + Sprite *_asPuzzleBox; + AsCommonProjector *_asProjector; + bool _isShaking; + void upShaking(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void startShaking(); + void stopShaking(); +}; + +// Scene1407 + +class AsScene1407Mouse : public AnimatedSprite { +public: + AsScene1407Mouse(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + int16 _walkDestX; + int16 _currSectionIndex; + int16 _nextHoleIndex; + int _countdown; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suWalkTo(); + void upGoThroughHole(); + void stIdleLookAtGoodHole(); + void stWalkToDest(); + void stWalkToHole(); + void stGoThroughHole(); + void stArriveAtHole(); +}; + +class Scene1407 : public Scene { +public: + Scene1407(NeverhoodEngine *vm, Module *parentModule); +protected: + Sprite *_asMouse; + Sprite *_ssResetButton; + int _puzzleSolvedCountdown; + int _resetButtonCountdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1403 + +class Scene1403 : public Scene { +public: + Scene1403(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + AsScene1201Tape *_asTape1; + AsScene1201Tape *_asTape2; + AsCommonProjector *_asProjector; + bool _isProjecting; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1404 + +class Scene1404 : public Scene { +public: + Scene1404(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene1404(); +protected: + Sprite *_sprite1; + Sprite *_asTape; + AsCommonProjector *_asProjector; + Sprite *_asKey; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene1405 + +class Scene1405; + +class AsScene1405Tile : public AnimatedSprite { +public: + AsScene1405Tile(NeverhoodEngine *vm, Scene1405 *parentScene, uint32 tileIndex); + void show(); + void hide(); +protected: + Scene1405 *_parentScene; + bool _isShowing; + uint32 _tileIndex; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1405 : public Scene { +public: + Scene1405(NeverhoodEngine *vm, Module *parentModule); + int getCountdown() const { return _countdown; } +protected: + bool _selectFirstTile; + int _firstTileIndex; + int _secondTileIndex; + int _tilesLeft; + int _countdown; + AsScene1405Tile *_tiles[48]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1400_H */ diff --git a/engines/neverhood/modules/module1500.cpp b/engines/neverhood/modules/module1500.cpp new file mode 100644 index 0000000000..2a9597b1fd --- /dev/null +++ b/engines/neverhood/modules/module1500.cpp @@ -0,0 +1,134 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1500.h" + +namespace Neverhood { + +Module1500::Module1500(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else + createScene(3, -1); + +} + +void Module1500::createScene(int sceneNum, int which) { + debug("Module1500::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1501(_vm, this, 0x8420221D, 0xA61024C4, 150, 48); + break; + case 1: + _vm->gameState().sceneNum = 1; + _childObject = new Scene1501(_vm, this, 0x30050A0A, 0x58B45E58, 110, 48); + break; + case 2: + _vm->gameState().sceneNum = 2; + sendMessage(_parentModule, 0x0800, 0); + createSmackerScene(0x001A0005, true, true, true); + break; + case 3: + _vm->gameState().sceneNum = 3; + _childObject = new Scene1501(_vm, this, 0x0CA04202, 0, 110, 48); + break; + } + SetUpdateHandler(&Module1500::updateScene); + _childObject->handleUpdate(); +} + +void Module1500::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + createScene(1, -1); + break; + case 1: + createScene(2, -1); + break; + case 3: + createScene(0, -1); + break; + default: + leaveModule(0); + break; + } + } +} + +// Scene1501 + +Scene1501::Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3) + : Scene(vm, parentModule), _countdown3(countdown3), _countdown2(countdown2), _countdown1(0), _skip(false) { + + SetUpdateHandler(&Scene1501::update); + SetMessageHandler(&Scene1501::handleMessage); + + setBackground(backgroundFileHash); + setPalette(); + addEntity(_palette); + _palette->addBasePalette(backgroundFileHash, 0, 256, 0); + _palette->startFadeToPalette(12); + + if (soundFileHash != 0) + playSound(0, soundFileHash); + +} + +void Scene1501::update() { + Scene::update(); + if (_countdown1 != 0) { + _countdown1--; + if (_countdown1 == 0) { + _vm->_screen->clear(); + leaveScene(0); + } + } else if ((_countdown2 != 0 && (--_countdown2 == 0)) || (_countdown2 == 0 && !isSoundPlaying(0))) { + _countdown1 = 12; + _palette->startFadeToBlack(11); + } + + if (_countdown3 != 0) + _countdown3--; + + if (_countdown3 == 0 && _skip && _countdown1 == 0) { + _countdown1 = 12; + _palette->startFadeToBlack(11); + } + +} + +uint32 Scene1501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0009: + _skip = true; + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1500.h b/engines/neverhood/modules/module1500.h new file mode 100644 index 0000000000..f244948918 --- /dev/null +++ b/engines/neverhood/modules/module1500.h @@ -0,0 +1,58 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +// TODO: I couldn't come up with a better name than 'Module' so far + +#ifndef NEVERHOOD_MODULES_MODULE1500_H +#define NEVERHOOD_MODULES_MODULE1500_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +class Module1500 : public Module { +public: + Module1500(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class Scene1501 : public Scene { +public: + Scene1501(NeverhoodEngine *vm, Module *parentModule, uint32 backgroundFileHash, uint32 soundFileHash, int countdown2, int countdown3); +protected: + int _countdown1; + int _countdown2; + int _countdown3; + bool _skip; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1500_H */ diff --git a/engines/neverhood/modules/module1600.cpp b/engines/neverhood/modules/module1600.cpp new file mode 100644 index 0000000000..f7e3c37d84 --- /dev/null +++ b/engines/neverhood/modules/module1600.cpp @@ -0,0 +1,1412 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1600.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1200.h" +#include "neverhood/modules/module2200.h" + +namespace Neverhood { + +static const uint32 kModule1600SoundList[] = { + 0x90805C50, 0x90804450, 0xB4005E60, + 0x91835066, 0x90E14440, 0 +}; + +Module1600::Module1600(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 1) + createScene(4, 1); + else if (which == 2) + createScene(5, 0); + else if (which == 3) + createScene(6, 1); + else if (which == 4) + createScene(1, 0); + else + createScene(0, 0); + + _vm->_soundMan->addSoundList(0x1A008D8, kModule1600SoundList); + _vm->_soundMan->setSoundListParams(kModule1600SoundList, true, 50, 600, 5, 150); + _vm->_soundMan->playTwoSounds(0x1A008D8, 0x41861371, 0x43A2507F, 0); + +} + +Module1600::~Module1600() { + _vm->_soundMan->deleteGroup(0x1A008D8); +} + +void Module1600::createScene(int sceneNum, int which) { + debug("Module1600::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + createNavigationScene(0x004B39D0, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + createNavigationScene(0x004B3A30, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + createNavigationScene(0x004B3A60, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + createNavigationScene(0x004B3A90, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + createNavigationScene(0x004B3B20, which); + break; + case 5: + _vm->gameState().sceneNum = 5; + createNavigationScene(0x004B3B50, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + createNavigationScene(0x004B3B80, which); + break; + case 7: + _vm->gameState().sceneNum = 7; + _childObject = new Scene1608(_vm, this, which); + break; + case 8: + _vm->gameState().sceneNum = 8; + _childObject = new Scene1609(_vm, this); + break; + case 1001: + _vm->gameState().sceneNum = 1; + if (getGlobalVar(V_TALK_COUNTING_INDEX) == 1) + createSmackerScene(0x80050200, true, true, false); + else if (getGlobalVar(V_TALK_COUNTING_INDEX) == 2) + createSmackerScene(0x80090200, true, true, false); + else + createSmackerScene(0x80000200, true, true, false); + if (getGlobalVar(V_TALK_COUNTING_INDEX) >= 2) + setGlobalVar(V_TALK_COUNTING_INDEX, 0); + else + incGlobalVar(V_TALK_COUNTING_INDEX, +1); + break; + } + SetUpdateHandler(&Module1600::updateScene); + _childObject->handleUpdate(); +} + +void Module1600::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 0) + createScene(2, 0); + else if (_moduleResult == 1) + createScene(1, 0); + else if (_moduleResult == 2) + leaveModule(4); + break; + case 1: + if (_moduleResult == 0) + createScene(1001, -1); + else if (_moduleResult == 1) + createScene(0, 3); + break; + case 2: + if (_moduleResult == 0) + createScene(3, 0); + else if (_moduleResult == 1) + createScene(0, 2); + break; + case 3: + if (_moduleResult == 0) + createScene(5, 0); + else if (_moduleResult == 2) + createScene(6, 0); + else if (_moduleResult == 3) + createScene(2, 1); + else if (_moduleResult == 4) + createScene(4, 0); + break; + case 4: + if (_moduleResult == 0) + leaveModule(1); + else if (_moduleResult == 1) + createScene(3, 1); + break; + case 5: + if (_moduleResult == 0) + leaveModule(2); + else if (_moduleResult == 1) + createScene(3, 3); + break; + case 6: + if (_moduleResult == 0) + createScene(8, -1); + else if (_moduleResult == 1) + createScene(3, 5); + break; + case 7: + createScene(6, 1); + break; + case 8: + if (_moduleResult == 0) + createScene(6, 0); + else + createScene(7, 0); + break; + case 1001: + createScene(1, 0); + break; + } + } +} + +AsCommonCar::AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y) + : AnimatedSprite(vm, 1000), _parentScene(parentScene) { + + createSurface(200, 556, 328); + _x = x; + _y = y; + + _inMainArea = false; + _exitDirection = 0; + _currPointIndex = 0; + _hasAgainDestPoint = false; + _stepError = 0; + _hasAgainDestPointIndex = false; + _steps = 0; + _isBraking = false; + _yMoveTotalSteps = 0; + _isBusy = false; + _isIdle = false; + _isMoving = true; + _rectFlag = false; + _newDeltaXType = -1; + _soundCounter = 0; + _pathPoints = NULL; + _currMoveDirection = 0; + + startAnimation(0xD4220027, 0, -1); + setDoDeltaX(getGlobalVar(V_CAR_DELTA_X)); + + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::handleMessage); + SetSpriteUpdate(NULL); +} + +AsCommonCar::~AsCommonCar() { + if (_finalizeStateCb == AnimationCallback(&AsCommonCar::evTurnCarDone)) + setGlobalVar(V_CAR_DELTA_X, !getGlobalVar(V_CAR_DELTA_X)); +} + +void AsCommonCar::setPathPoints(NPointArray *pathPoints) { + _pathPoints = pathPoints; +} + +void AsCommonCar::update() { + if (_newDeltaXType >= 0) { + setDoDeltaX(_newDeltaXType); + _newDeltaXType = -1; + } + AnimatedSprite::update(); + if (_hasAgainDestPoint && _yMoveTotalSteps == 0 && !_isBusy) { + _hasAgainDestPoint = false; + _hasAgainDestPointIndex = false; + sendPointMessage(this, 0x2004, _againDestPoint); + } else if (_hasAgainDestPointIndex && _yMoveTotalSteps == 0 && !_isBusy) { + _hasAgainDestPointIndex = false; + sendMessage(this, 0x2003, _againDestPointIndex); + } + updateMovement(); + updateSound(); +} + +void AsCommonCar::upIdle() { + update(); + if (++_idleCounter >= _idleCounterMax) + stIdleBlink(); + updateSound(); +} + +uint32 AsCommonCar::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1019: + SetSpriteUpdate(NULL); + break; + case 0x2002: + // Set the current position without moving + _currPointIndex = param.asInteger(); + _stepError = 0; + _x = pathPoint(_currPointIndex).x; + _y = pathPoint(_currPointIndex).y; + break; + case 0x2003: + // Move to a point by its index + { + int newPointIndex = param.asInteger(); + if (_yMoveTotalSteps <= 0 && !_isBusy) { + _destX = pathPoint(newPointIndex).x; + _destY = pathPoint(newPointIndex).y; + if (_currPointIndex < newPointIndex) { + moveToNextPoint(); + } else if (_currPointIndex == newPointIndex && _stepError == 0) { + if (_currPointIndex == 0) { + _yMoveTotalSteps = 0; + sendMessage(_parentScene, 0x2005, 0); + } else if (_currPointIndex == (int)_pathPoints->size()) { + _yMoveTotalSteps = 0; + sendMessage(_parentScene, 0x2006, 0); + } + } else { + moveToPrevPoint(); + } + } else { + _hasAgainDestPointIndex = true; + _againDestPointIndex = newPointIndex; + } + } + break; + case 0x2004: + // Move to the point closest to the parameter point + { + int minMatchIndex = -1; + int minMatchDistance, distance; + NPoint pt = param.asPoint(); + if (_yMoveTotalSteps <= 0 && !_isBusy) { + // Check if we're already exiting (or something) + if ((pt.x <= 20 && _exitDirection == 1) || + (pt.x >= 620 && _exitDirection == 3) || + (pt.y <= 20 && _exitDirection == 2) || + (pt.y >= 460 && _exitDirection == 4)) + break; + _destX = pt.x; + _destY = pt.y; + minMatchDistance = calcDistance(_destX, _destY, _x, _y) + 1; + for (int i = _currPointIndex + 1; i < (int)_pathPoints->size(); i++) { + distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y); + if (distance >= minMatchDistance) + break; + minMatchDistance = distance; + minMatchIndex = i; + } + for (int i = _currPointIndex; i >= 0; i--) { + distance = calcDistance(_destX, _destY, pathPoint(i).x, pathPoint(i).y); + if (distance >= minMatchDistance) + break; + minMatchDistance = distance; + minMatchIndex = i; + } + if (minMatchIndex == -1) { + if (_currPointIndex == 0) + moveToPrevPoint(); + else + SetSpriteUpdate(NULL); + } else { + if (minMatchIndex > _currPointIndex) + moveToNextPoint(); + else + moveToPrevPoint(); + } + } else { + _hasAgainDestPoint = true; + _againDestPoint = pt; + } + } + break; + case 0x2007: + _yMoveTotalSteps = param.asInteger(); + _steps = 0; + _isBraking = false; + _lastDistance = 640; + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); + break; + case 0x2008: + _yMoveTotalSteps = param.asInteger(); + _steps = 0; + _isBraking = false; + _lastDistance = 640; + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); + break; + case 0x2009: + stEnterCar(); + break; + case 0x200A: + stLeaveCar(); + break; + case 0x200E: + stTurnCar(); + break; + case 0x200F: + stCarAtHome(); + _newDeltaXType = param.asInteger(); + break; + } + return messageResult; +} + +uint32 AsCommonCar::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = AsCommonCar::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_isBusy && param.asInteger() == 0x025424A2) + gotoNextState(); + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +uint32 AsCommonCar::hmLeaveCar(int messageNum, const MessageParam ¶m, Entity *sender) { + switch (messageNum) { + case 0x2009: + stEnterCar(); + break; + case 0x3002: + sendMessage(_parentScene, 0x200A, 0); + SetMessageHandler(&AsCommonCar::handleMessage); + break; + } + return 0; +} + +void AsCommonCar::stCarAtHome() { + bool doDeltaX = _doDeltaX; + SetSpriteUpdate(NULL); + _hasAgainDestPoint = false; + _hasAgainDestPointIndex = false; + _isBraking = false; + _isBusy = false; + _isIdle = false; + _isMoving = false; + _rectFlag = false; + NextState(&AsCommonCar::stLeanForwardIdle); + startAnimation(0x35698F78, 0, -1); + setDoDeltaX(doDeltaX ? 1 : 0); + _currMoveDirection = 0; + _newMoveDirection = 0; + _steps = 0; + _idleCounter = 0; + _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + SetUpdateHandler(&AsCommonCar::upIdle); + SetMessageHandler(&AsCommonCar::handleMessage); + FinalizeState(&AsCommonCar::evIdleDone); +} + +void AsCommonCar::updateTurnMovement() { + if (_turnMoveStatus == 1) { + _lastDistance = 640; + _isIdle = false; + _isBraking = false; + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); + } else if (_turnMoveStatus == 2) { + _lastDistance = 640; + _isIdle = false; + _isBraking = false; + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); + } +} + +void AsCommonCar::updateMovement() { + if (_isBraking && !_isIdle && !_isBusy) { + gotoNextState(); + _isMoving = false; + _isIdle = true; + startAnimation(0x192ADD30, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stLeanForwardIdle); + } else if (!_isBraking && _steps && _isIdle) { + gotoNextState(); + _isIdle = false; + startAnimation(0x9966B138, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stUpdateMoveDirection); + } else if (_newMoveDirection != _currMoveDirection && _isMoving && !_isBusy) { + gotoNextState(); + _currMoveDirection = _newMoveDirection; + stUpdateMoveDirection(); + } +} + +void AsCommonCar::stEnterCar() { + startAnimation(0xA86A9538, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stLeanForwardIdle); +} + +void AsCommonCar::stLeaveCar() { + startAnimation(0xA86A9538, -1, -1); + _playBackwards = true; + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmLeaveCar); +} + +void AsCommonCar::stLeanForwardIdle() { + startAnimation(0x35698F78, 0, -1); + _currMoveDirection = 0; + _newMoveDirection = 0; + _steps = 0; + _idleCounter = 0; + _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + SetUpdateHandler(&AsCommonCar::upIdle); + SetMessageHandler(&AsCommonCar::handleMessage); + FinalizeState(&AsCommonCar::evIdleDone); +} + +void AsCommonCar::evIdleDone() { + SetUpdateHandler(&AsCommonCar::update); +} + +void AsCommonCar::stIdleBlink() { + startAnimation(0xB579A77C, 0, -1); + _idleCounter = 0; + _idleCounterMax = _vm->_rnd->getRandomNumber(64 - 1) + 24; + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stLeanForwardIdle); +} + +void AsCommonCar::stUpdateMoveDirection() { + _isMoving = true; + if (_currMoveDirection == 1) + startAnimation(0xD4AA03A4, 0, -1); + else if (_currMoveDirection == 3) + startAnimation(0xD00A1364, 0, -1); + else if ((_currMoveDirection == 2 && _doDeltaX) || (_currMoveDirection == 4 && !_doDeltaX)) + stTurnCar(); + else + startAnimation(0xD4220027, 0, -1); + setGlobalVar(V_CAR_DELTA_X, _doDeltaX ? 1 : 0); +} + +void AsCommonCar::moveToNextPoint() { + if (_currPointIndex >= (int)_pathPoints->size() - 1) { + _yMoveTotalSteps = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2006, 0); + } else { + NPoint nextPt = pathPoint(_currPointIndex + 1); + NPoint currPt = pathPoint(_currPointIndex); + if (ABS(nextPt.y - currPt.y) <= ABS(nextPt.x - currPt.x) && + ((_currMoveDirection == 2 && nextPt.x < currPt.x) || + (_currMoveDirection == 4 && nextPt.x >= currPt.x))) { + if (_currMoveDirection == 2) + _currMoveDirection = 4; + else if (_currMoveDirection == 4) + _currMoveDirection = 2; + if (_isIdle) + stTurnCarMoveToNextPoint(); + else + stBrakeMoveToNextPoint(); + } else { + if (_steps == 0) { + gotoNextState(); + _isIdle = false; + startAnimation(0x9966B138, 0, -1); + SetMessageHandler(&AsCommonCar::hmAnimation); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::stUpdateMoveDirection); + } + _isBraking = false; + SetSpriteUpdate(&AsCommonCar::suMoveToNextPoint); + _lastDistance = 640; + } + } +} + +void AsCommonCar::stBrakeMoveToNextPoint() { + gotoNextState(); + _isBusy = true; + _isBraking = true; + startAnimation(0x192ADD30, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stTurnCarMoveToNextPoint); +} + +void AsCommonCar::stTurnCar() { + // Turn to left/right #1 + gotoNextState(); + _isBusy = true; + startAnimation(0xF46A0324, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + FinalizeState(&AsCommonCar::evTurnCarDone); + _turnMoveStatus = 0; + updateTurnMovement(); +} + +void AsCommonCar::stTurnCarMoveToNextPoint() { + // Turn to left/right #2 + gotoNextState(); + _isBusy = true; + startAnimation(0xF46A0324, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + FinalizeState(&AsCommonCar::evTurnCarDone); + _turnMoveStatus = 1; + updateTurnMovement(); +} + +void AsCommonCar::stTurnCarMoveToPrevPoint() { + // Turn to left/right #3 + FinalizeState(NULL); + _isBusy = true; + startAnimation(0xF46A0324, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + FinalizeState(&AsCommonCar::evTurnCarDone); + _turnMoveStatus = 2; + updateTurnMovement(); +} + +void AsCommonCar::moveToPrevPoint() { + if (_currPointIndex == 0 && _stepError == 0) { + _yMoveTotalSteps = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2005, 0); + } else { + NPoint prevPt; + NPoint currPt; + if (_stepError == 0) { + prevPt = pathPoint(_currPointIndex - 1); + currPt = pathPoint(_currPointIndex); + } else { + prevPt = pathPoint(_currPointIndex); + currPt = pathPoint(_currPointIndex + 1); + } + if (ABS(prevPt.y - currPt.y) <= ABS(prevPt.x - currPt.x) && + ((_currMoveDirection == 2 && prevPt.x < currPt.x) || + (_currMoveDirection == 4 && prevPt.x >= currPt.x))) { + if (_currMoveDirection == 2) + _currMoveDirection = 4; + else if (_currMoveDirection == 4) + _currMoveDirection = 2; + if (_isIdle) + stTurnCarMoveToPrevPoint(); + else + stBrakeMoveToPrevPoint(); + } else { + if (_steps == 0) { + gotoNextState(); + _isIdle = false; + startAnimation(0x9966B138, 0, -1); + SetMessageHandler(&AsCommonCar::hmAnimation); + SetUpdateHandler(&AsCommonCar::update); + NextState(&AsCommonCar::stUpdateMoveDirection); + } + _isBraking = false; + SetSpriteUpdate(&AsCommonCar::suMoveToPrevPoint); + _lastDistance = 640; + } + } +} + +void AsCommonCar::stBrakeMoveToPrevPoint() { + FinalizeState(NULL); + _isBusy = true; + _isBraking = true; + startAnimation(0x192ADD30, 0, -1); + SetUpdateHandler(&AsCommonCar::update); + SetMessageHandler(&AsCommonCar::hmAnimation); + NextState(&AsCommonCar::stTurnCarMoveToPrevPoint); +} + +void AsCommonCar::evTurnCarDone() { + _isBusy = false; + setDoDeltaX(2); + _newMoveDirection = 0; + stUpdateMoveDirection(); +} + +void AsCommonCar::suMoveToNextPoint() { + int16 newX = _x, newY = _y; + + if (_currPointIndex >= (int)_pathPoints->size()) { + _yMoveTotalSteps = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2006, 0); + return; + } + + if (_isBraking) { + if (_steps <= 0) { + sendMessage(this, 0x1019, 0); + return; + } else + _steps--; + } else if (_steps < 11) + _steps++; + + bool firstTime = true; + _ySteps = _steps; + int stepsCtr = _steps; + + while (stepsCtr > 0) { + NPoint pt1; + NPoint pt2 = pathPoint(_currPointIndex); + if (_currPointIndex + 1 >= (int)_pathPoints->size()) + pt1 = pathPoint(0); + else + pt1 = pathPoint(_currPointIndex + 1); + int16 deltaX = ABS(pt1.x - pt2.x); + int16 deltaY = ABS(pt1.y - pt2.y); + if (deltaX >= deltaY) { + _newMoveDirection = 2; + if (pt1.x < pt2.x) + _newMoveDirection = 4; + if (stepsCtr + _stepError >= deltaX) { + stepsCtr -= deltaX; + stepsCtr += _stepError; + _stepError = 0; + _currPointIndex++; + if (_currPointIndex == (int)_pathPoints->size() - 1) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError += stepsCtr; + if (pt1.x >= pt2.x) + newX += stepsCtr; + else + newX -= stepsCtr; + if (pt1.y >= pt2.y) + newY = pt2.y + (deltaY * _stepError) / deltaX; + else + newY = pt2.y - (deltaY * _stepError) / deltaX; + stepsCtr = 0; + } + } else { + _newMoveDirection = 3; + if (pt1.y < pt2.y) + _newMoveDirection = 1; + if (firstTime) { + if (pt1.y >= pt2.y) + stepsCtr += 7; + else { + stepsCtr -= 4; + if (stepsCtr < 0) + stepsCtr = 0; + } + _ySteps = stepsCtr; + } + if (stepsCtr + _stepError >= deltaY) { + stepsCtr -= deltaY; + stepsCtr += _stepError; + _stepError = 0; + _currPointIndex++; + if (_currPointIndex == (int)_pathPoints->size() - 1) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError += stepsCtr; + if (pt1.x >= pt2.x) + newX = pt2.x + (deltaX * _stepError) / deltaY; + else + newX = pt2.x - (deltaX * _stepError) / deltaY; + if (pt1.y >= pt2.y) + newY += stepsCtr; + else + newY -= stepsCtr; + stepsCtr = 0; + } + } + firstTime = false; + } + + if (_yMoveTotalSteps != 0) { + _x = newX; + _y = newY; + _yMoveTotalSteps -= _ySteps; + if (_yMoveTotalSteps <= 0) { + _isBraking = true; + _yMoveTotalSteps = 0; + } + } else { + int distance = calcDistance(_destX, _destY, _x, _y); + _x = newX; + _y = newY; + if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { + _exitDirection = 0; + _inMainArea = true; + } else if (_inMainArea) { + _destX = pathPoint(_pathPoints->size() - 1).x; + _destY = pathPoint(_pathPoints->size() - 1).y; + _inMainArea = false; + if (_x <= 20) + _exitDirection = 1; + else if (_x >= 620) + _exitDirection = 3; + else if (_y <= 20) + _exitDirection = 2; + else if (_y >= 460) + _exitDirection = 4; + if (_exitDirection != 0 && _isBraking) { + _isBraking = false; + _steps = 11; + } + } + if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || + (_exitDirection == 0 && _lastDistance + 20 < distance)) + _isBraking = true; + if (distance < _lastDistance) + _lastDistance = distance; + if (_currPointIndex == (int)_pathPoints->size() - 1) { + _isBraking = true; + _yMoveTotalSteps = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2006, 0); + } + } + +} + +void AsCommonCar::suMoveToPrevPoint() { + int16 newX = _x, newY = _y; + + if (_currPointIndex == 0 && _stepError == 0) { + _yMoveTotalSteps = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2005, 0); + return; + } + + if (_isBraking) { + if (_steps <= 0) { + sendMessage(this, 0x1019, 0); + return; + } else + _steps--; + } else if (_steps < 11) + _steps++; + + bool firstTime = true; + _ySteps = _steps; + int stepsCtr = _steps; + + while (stepsCtr > 0) { + if (_stepError == 0) + _currPointIndex--; + NPoint pt1; + NPoint pt2 = pathPoint(_currPointIndex); + if (_currPointIndex + 1 >= (int)_pathPoints->size()) + pt1 = pathPoint(0); + else + pt1 = pathPoint(_currPointIndex + 1); + int16 deltaX = ABS(pt1.x - pt2.x); + int16 deltaY = ABS(pt1.y - pt2.y); + if (deltaX >= deltaY) { + _newMoveDirection = 4; + if (pt1.x < pt2.x) + _newMoveDirection = 2; + if (_stepError == 0) + _stepError = deltaX; + if (stepsCtr > _stepError) { + stepsCtr -= _stepError; + _stepError = 0; + if (_currPointIndex == 0) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError -= stepsCtr; + if (pt1.x >= pt2.x) + newX -= stepsCtr; + else + newX += stepsCtr; + if (pt1.y >= pt2.y) + newY = pt2.y + (deltaY * _stepError) / deltaX; + else + newY = pt2.y - (deltaY * _stepError) / deltaX; + stepsCtr = 0; + } + } else { + _newMoveDirection = 1; + if (pt1.y < pt2.y) + _newMoveDirection = 3; + if (firstTime) { + if (pt1.y >= pt2.y) { + stepsCtr -= 4; + if (stepsCtr < 0) + stepsCtr = 0; + } else { + stepsCtr += 7; + } + _ySteps = stepsCtr; + } + if (_stepError == 0) + _stepError = deltaY; + if (stepsCtr > _stepError) { + stepsCtr -= _stepError; + _stepError = 0; + if (_currPointIndex == 0) + stepsCtr = 0; + newX = pathPoint(_currPointIndex).x; + newY = pathPoint(_currPointIndex).y; + } else { + _stepError -= stepsCtr; + if (pt1.x >= pt2.x) + newX = pt2.x + (deltaX * _stepError) / deltaY; + else + newX = pt2.x - (deltaX * _stepError) / deltaY; + if (pt1.y >= pt2.y) + newY -= stepsCtr; + else + newY += stepsCtr; + stepsCtr = 0; + } + } + firstTime = false; + } + + if (_yMoveTotalSteps != 0) { + _x = newX; + _y = newY; + _yMoveTotalSteps -= _ySteps; + if (_yMoveTotalSteps <= 0) { + _isBraking = true; + _yMoveTotalSteps = 0; + } + } else { + int distance = calcDistance(_destX, _destY, _x, _y); + _x = newX; + _y = newY; + if (newX > 20 && newX < 620 && newY > 20 && newY < 460) { + _exitDirection = 0; + _inMainArea = true; + } else if (_inMainArea) { + _destX = pathPoint(0).x; + _destY = pathPoint(0).y; + _inMainArea = false; + if (_x <= 20) + _exitDirection = 1; + else if (_x >= 620) + _exitDirection = 3; + else if (_y <= 20) + _exitDirection = 2; + else if (_y >= 460) + _exitDirection = 4; + if (_exitDirection != 0 && _isBraking) { + _isBraking = false; + _steps = 11; + } + } + if ((distance < 20 && _exitDirection == 0 && _lastDistance < distance) || + (_exitDirection == 0 && _lastDistance + 20 < distance)) + _isBraking = true; + if (distance < _lastDistance) + _lastDistance = distance; + if (_currPointIndex == 0 && _stepError == 0) { + _isBraking = true; + _yMoveTotalSteps = 0; + sendMessage(this, 0x1019, 0); + sendMessage(_parentScene, 0x2005, 0); + } + } + +} + +void AsCommonCar::updateSound() { + int maxSoundCounter = 0; + _soundCounter++; + if (_steps != 0 && !_isIdle) { + if (_currMoveDirection == 1) + maxSoundCounter = 18 - _steps; + else if (_currMoveDirection == 3) { + maxSoundCounter = 5 - _steps; + if (maxSoundCounter < 1) + maxSoundCounter = 1; + } else + maxSoundCounter = 14 - _steps; + } else + maxSoundCounter = 21; + if (_soundCounter >= maxSoundCounter) { + sendMessage(_parentScene, 0x200D, 0); + _soundCounter = 0; + } +} + +AsCommonIdleCarLower::AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 0x1209E09F, 1100, x, y) { + + setDoDeltaX(1); + startAnimation(0x1209E09F, 1, -1); + _newStickFrameIndex = 1; +} + +AsCommonIdleCarFull::AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 0x1209E09F, 100, x, y) { + + setDoDeltaX(1); + _newStickFrameIndex = 0; +} + +AsCommonCarConnector::AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar) + : AnimatedSprite(vm, 1100), _asCar(asCar) { + + createSurface1(0x60281C10, 150); + startAnimation(0x60281C10, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + SetUpdateHandler(&AsCommonCarConnector::update); +} + +void AsCommonCarConnector::update() { + _x = _asCar->getX(); + _y = _asCar->getY(); + AnimatedSprite::update(); +} + +void Tracks::findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, + DataResource &dataResource) { + const uint trackCount = size(); + minMatchTrackIndex = -1; + minMatchDistance = 640; + for (uint trackIndex = 0; trackIndex < trackCount; trackIndex++) { + NPointArray *pointList = dataResource.getPointArray((*this)[trackIndex]->trackPointsName); + for (uint pointIndex = 0; pointIndex < pointList->size(); pointIndex++) { + NPoint testPt = (*pointList)[pointIndex]; + int distance = calcDistance(testPt.x, testPt.y, pt.x, pt.y); + if (distance < minMatchDistance) { + minMatchTrackIndex = trackIndex; + minMatchDistance = distance; + } + } + } +} + +Scene1608::Scene1608(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _asCar(NULL), _countdown1(0) { + + setGlobalVar(V_CAR_DELTA_X, 1); + + SetMessageHandler(&Scene1608::hmLowerFloor); + + _asKey = insertSprite(this, 1, 1100, 198, 220); + addCollisionSprite(_asKey); + + if (which < 0) { + // Restoring game + if (_vm->gameState().which == 1) + // Klaymen is in the car + which = 1; + else { + // Klaymen is standing around + setRectList(0x004B47D0); + insertKlaymen(380, 438); + _kmScene1608 = _klaymen; + _klaymenInCar = false; + _sprite1 = insertStaticSprite(0x7D0404E8, 1100); + setMessageList(0x004B46A8); + setBackground(0x10080E01); + setPalette(0x10080E01); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + addCollisionSprite(_asTape); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + SetUpdateHandler(&Scene1608::upLowerFloor); + insertScreenMouse(0x80E05108); + insertStaticSprite(0x4B18F868, 1200); + } + } else if (which == 0) { + // Klaymen entering from the left + _vm->gameState().which = 0; + setRectList(0x004B47D0); + insertKlaymen(0, 438); + _kmScene1608 = _klaymen; + _klaymenInCar = false; + setMessageList(0x004B46B0); + setBackground(0x10080E01); + setPalette(0x10080E01); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + addCollisionSprite(_asTape); + insertScreenMouse(0x80E05108); + _sprite1 = insertStaticSprite(0x7D0404E8, 1100); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, 640, 480); + SetUpdateHandler(&Scene1608::upLowerFloor); + insertStaticSprite(0x4B18F868, 1200); + } else if (which == 2) { + // Klaymen returning from looking through the upper window + _vm->gameState().which = 1; + _dataResource.load(0x003C0492); + _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); + setBackground(0x98001604); + setPalette(0x98001604); + _palette->addPalette("paPodRed", 65, 31, 65); + insertScreenMouse(0x01600988); + _sprite2 = insertStaticSprite(0x491F38A8, 1100); + _asCar = createSprite(this, 375, 227); // Create but don't add to the sprite list yet + _asIdleCarLower = insertSprite(375, 227); + _asIdleCarFull = insertSprite(375, 227); + _asCar->setVisible(false); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(373, 220); + _klaymen->setDoDeltaX(1); + } else + insertKlaymen(283, 220); + _kmScene1608 = _klaymen; + setMessageList(0x004B47A8); + SetMessageHandler(&Scene1608::hmUpperFloor); + SetUpdateHandler(&Scene1608::upUpperFloor); + _asCar->setPathPoints(_roomPathPoints); + sendMessage(_asCar, 0x2002, _roomPathPoints->size() - 1); + _sprite3 = insertStaticSprite(0xB47026B0, 1100); + _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect2 = _clipRect1; + _clipRect2.y2 = 215; + _klaymen->setClipRect(_clipRect1); + _asCar->setClipRect(_clipRect1); + _asIdleCarLower->setClipRect(_clipRect1); + _asIdleCarFull->setClipRect(_clipRect1); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + addCollisionSprite(_asTape); + insertSprite(_asCar)->setClipRect(_clipRect1); + _klaymenInCar = false; + _carClipFlag = false; + _carStatus = 0; + setRectList(0x004B4810); + } + + // NOTE: Not in the else because 'which' is set to 1 in the true branch + if (which == 1) { + // Klaymen riding the car + _vm->gameState().which = 1; + _dataResource.load(0x003C0492); + _roomPathPoints = _dataResource.getPointArray(calcHash("meArchroArchRoomPath")); + setBackground(0x98001604); + setPalette(0x98001604); + _palette->addPalette("paPodRed", 65, 31, 65); + insertScreenMouse(0x01600988); + _asCar = insertSprite(this, 375, 227); + _asIdleCarLower = insertSprite(375, 227); + _asIdleCarFull = insertSprite(375, 227); + _sprite2 = insertStaticSprite(0x491F38A8, 1100); + _kmScene1608 = createSprite(this, 439, 220); + sendMessage(_kmScene1608, 0x2032, 1); + _kmScene1608->setDoDeltaX(1); + SetMessageHandler(&Scene1608::hmRidingCar); + SetUpdateHandler(&Scene1608::upRidingCar); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); + _asCar->setPathPoints(_roomPathPoints); + sendMessage(_asCar, 0x2002, 0); + sendMessage(_asCar, 0x2008, 90); + _sprite3 = insertStaticSprite(0xB47026B0, 1100); + _clipRect1.set(_sprite3->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect3.set(_sprite2->getDrawRect().x, _sprite3->getDrawRect().y, 640, _sprite2->getDrawRect().y2()); + _clipRect2 = _clipRect1; + _clipRect2.y2 = 215; + _kmScene1608->setClipRect(_clipRect1); + _asCar->setClipRect(_clipRect1); + _asIdleCarLower->setClipRect(_clipRect1); + _asIdleCarFull->setClipRect(_clipRect1); + _asTape = insertSprite(this, 13, 1100, 412, 443, 0x9148A011); + // ... addCollisionSprite(_asTape); + insertSprite(_asCar)->setClipRect(_clipRect1); + _klaymenInCar = true; + _carClipFlag = true; + _carStatus = 0; + } + + _palette->addPalette("paKlayRed", 0, 64, 0); + +} + +Scene1608::~Scene1608() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _kmScene1608->isDoDeltaX() ? 1 : 0); + if (_klaymenInCar) + delete _kmScene1608; + else + delete _asCar; +} + +void Scene1608::upLowerFloor() { + Scene::update(); + if (_countdown1 != 0 && (--_countdown1 == 0)) + leaveScene(0); +} + +void Scene1608::upUpperFloor() { + Scene::update(); + if (_carStatus == 1) { + removeSurface(_klaymen->getSurface()); + removeEntity(_klaymen); + addSprite(_asCar); + _klaymenInCar = true; + clearRectList(); + SetUpdateHandler(&Scene1608::upCarAtHome); + SetMessageHandler(&Scene1608::hmCarAtHome); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); + _asCar->setVisible(true); + sendMessage(_asCar, 0x2009, 0); + _asCar->handleUpdate(); + _klaymen = NULL; + _carStatus = 0; + } + updateKlaymenCliprect(); +} + +void Scene1608::upCarAtHome() { + Scene::update(); + if (_mouseClicked) { + if (_mouseClickPos.x <= 329 && _asCar->getX() == 375 && _asCar->getY() == 227) { + sendMessage(_asCar, 0x200A, 0); + SetUpdateHandler(&Scene1608::upGettingOutOfCar); + } else { + sendPointMessage(_asCar, 0x2004, _mouseClickPos); + SetMessageHandler(&Scene1608::hmRidingCar); + SetUpdateHandler(&Scene1608::upRidingCar); + } + _mouseClicked = false; + } + updateKlaymenCliprect(); +} + +void Scene1608::upGettingOutOfCar() { + Scene::update(); + if (_carStatus == 2) { + _klaymen = _kmScene1608; + removeSurface(_asCar->getSurface()); + removeEntity(_asCar); + addSprite(_klaymen); + _klaymenInCar = false; + SetMessageHandler(&Scene1608::hmUpperFloor); + SetUpdateHandler(&Scene1608::upUpperFloor); + setRectList(0x004B4810); + _asIdleCarLower->setVisible(true); + _asIdleCarFull->setVisible(true); + _asCar->setVisible(false); + setMessageList(0x004B4748); + processMessageList(); + _klaymen->handleUpdate(); + _carStatus = 0; + } + updateKlaymenCliprect(); +} + +void Scene1608::upRidingCar() { + Scene::update(); + if (_mouseClicked) { + sendPointMessage(_asCar, 0x2004, _mouseClickPos); + _mouseClicked = false; + } + if (_asCar->getX() < 300) { + if (_carClipFlag) { + _carClipFlag = false; + _asCar->setClipRect(_clipRect1); + if (!_asCar->isDoDeltaX()) + sendMessage(_asCar, 0x200E, 0); + } + } else if (!_carClipFlag) { + _carClipFlag = true; + _asCar->setClipRect(_clipRect3); + } +} + +uint32 Scene1608::hmLowerFloor(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x20250B1A) { + clearRectList(); + _klaymen->setVisible(false); + showMouse(false); + _sprite1->setVisible(false); + //sendMessage(_asDoor, 0x4809, 0); // Play sound? + _countdown1 = 28; + } + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_kmScene1608, 0x1014, _asTape); + setMessageList(0x004B4770); + } else if (sender == _asKey) + setMessageList(0x004B46C8); + break; + } + return 0; +} + +uint32 Scene1608::hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x60842040) + _carStatus = 1; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + case 0x4826: + if (sender == _asKey) { + sendEntityMessage(_kmScene1608, 0x1014, _asKey); + setMessageList(0x004B4760); + } + break; + } + return 0; +} + +uint32 Scene1608::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + leaveScene(1); + break; + case 0x2006: + SetMessageHandler(&Scene1608::hmCarAtHome); + SetUpdateHandler(&Scene1608::upCarAtHome); + sendMessage(_asCar, 0x200F, 1); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +uint32 Scene1608::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200A: + _carStatus = 2; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +void Scene1608::updateKlaymenCliprect() { + if (_kmScene1608->getX() <= 375) + _kmScene1608->setClipRect(_clipRect1); + else + _kmScene1608->setClipRect(_clipRect2); +} + +Scene1609::Scene1609(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _countdown1(1), _currentSymbolIndex(0), _symbolPosition(0), _changeCurrentSymbol(true), _isSolved(false) { + + _vm->gameModule()->initCodeSymbolsPuzzle(); + _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); + + SetMessageHandler(&Scene1609::handleMessage); + SetUpdateHandler(&Scene1609::update); + + setBackground(0x92124A14); + setPalette(0x92124A14); + insertPuzzleMouse(0x24A10929, 20, 620); + + for (int symbolPosition = 0; symbolPosition < 12; symbolPosition++) + _asSymbols[symbolPosition] = insertSprite(symbolPosition, false); + + _ssButton = insertSprite(this, true); + addCollisionSprite(_ssButton); + loadSound(0, 0x68E25540); + +} + +void Scene1609::update() { + if (!_isSolved && _countdown1 != 0 && (--_countdown1 == 0)) { + if (_changeCurrentSymbol) { + _currentSymbolIndex++; + if (_currentSymbolIndex >= 12) + _currentSymbolIndex = 0; + _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, _currentSymbolIndex == (int)getSubVar(VA_CODE_SYMBOLS, _noisySymbolIndex)); + _changeCurrentSymbol = false; + _countdown1 = 36; + } else { + _asSymbols[_symbolPosition]->hide(); + _changeCurrentSymbol = true; + _countdown1 = 12; + } + } + if (_isSolved && !isSoundPlaying(0)) + leaveScene(1); + Scene::update(); +} + +uint32 Scene1609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + case 0x2000: + if (!_isSolved) { + if (_changeCurrentSymbol) + _asSymbols[_symbolPosition]->change(_currentSymbolIndex + 12, false); + _asSymbols[_symbolPosition]->stopSymbolSound(); + _symbolPosition++; + if (_symbolPosition >= 12) { + if (testVars()) { + playSound(0); + setGlobalVar(V_CODE_SYMBOLS_SOLVED, 1); + _isSolved = true; + } else { + _symbolPosition = 0; + for (int i = 0; i < 12; i++) + _asSymbols[i]->hide(); + } + } + _changeCurrentSymbol = true; + _countdown1 = 1; + } + break; + } + return 0; +} + +bool Scene1609::testVars() { + int cmpSymbolIndex = 0; + + // Find the position of the first symbol + while ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[0]->getSymbolIndex()) + cmpSymbolIndex++; + + // Check if the entered symbols match + for (int enteredSymbolIndex = 0; enteredSymbolIndex < 12; enteredSymbolIndex++) { + if ((int)getSubVar(VA_CODE_SYMBOLS, cmpSymbolIndex) != _asSymbols[enteredSymbolIndex]->getSymbolIndex()) + return false; + cmpSymbolIndex++; + if (cmpSymbolIndex >= 12) + cmpSymbolIndex = 0; + } + + return true; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1600.h b/engines/neverhood/modules/module1600.h new file mode 100644 index 0000000000..0bf44ff7b8 --- /dev/null +++ b/engines/neverhood/modules/module1600.h @@ -0,0 +1,183 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1600_H +#define NEVERHOOD_MODULES_MODULE1600_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module3000.h" + +namespace Neverhood { + +// Module1600 + +class Module1600 : public Module { +public: + Module1600(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1600(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class AsCommonCar : public AnimatedSprite { +public: + AsCommonCar(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y); + ~AsCommonCar(); + void setPathPoints(NPointArray *pathPoints); +protected: + Scene *_parentScene; + NPointArray *_pathPoints; + int _newMoveDirection; + int _currMoveDirection; + int _exitDirection; + int _currPointIndex; + bool _hasAgainDestPoint; + NPoint _againDestPoint; + bool _hasAgainDestPointIndex; + int _againDestPointIndex; + bool _inMainArea; + bool _isBraking; + bool _isBusy; + bool _isIdle; + bool _isMoving; + bool _rectFlag; + int _idleCounter; + int _idleCounterMax; + int _steps; + int _stepError; + int _lastDistance; + int _yMoveTotalSteps; + int _ySteps; + int _newDeltaXType; + int _soundCounter; + int _turnMoveStatus; + int16 _destX, _destY; + NPoint pathPoint(uint index) { return (*_pathPoints)[index]; } + void update(); + void upIdle(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmLeaveCar(int messageNum, const MessageParam ¶m, Entity *sender); + void stCarAtHome(); + void updateTurnMovement(); + void updateMovement(); + void stEnterCar(); + void stLeaveCar(); + void stLeanForwardIdle(); + void evIdleDone(); + void stIdleBlink(); + void stUpdateMoveDirection(); + void stTurnCar(); + void moveToNextPoint(); + void stBrakeMoveToNextPoint(); + void stTurnCarMoveToNextPoint(); + void moveToPrevPoint(); + void stBrakeMoveToPrevPoint(); + void stTurnCarMoveToPrevPoint(); + void evTurnCarDone(); + void suMoveToNextPoint(); + void suMoveToPrevPoint(); + void updateSound(); +}; + +class AsCommonIdleCarLower : public AnimatedSprite { +public: + AsCommonIdleCarLower(NeverhoodEngine *vm, int16 x, int16 y); +}; + +class AsCommonIdleCarFull : public AnimatedSprite { +public: + AsCommonIdleCarFull(NeverhoodEngine *vm, int16 x, int16 y); +}; + +class AsCommonCarConnector : public AnimatedSprite { +public: + AsCommonCarConnector(NeverhoodEngine *vm, AsCommonCar *asCar); +protected: + AsCommonCar *_asCar; + void update(); +}; + +class Tracks : public Common::Array { +public: + void findTrackPoint(NPoint pt, int &minMatchTrackIndex, int &minMatchDistance, + DataResource &dataResource); +}; + +class Scene1608 : public Scene { +public: + Scene1608(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene1608(); +protected: + AsCommonCar *_asCar; + Sprite *_asKey; + Sprite *_asIdleCarLower; + Sprite *_asIdleCarFull; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_asTape; + Klaymen *_kmScene1608; + NRect _clipRect1; + NRect _clipRect2; + NRect _clipRect3; + int _carStatus; + bool _carClipFlag; + bool _klaymenInCar; + int _countdown1; + NPointArray *_roomPathPoints; + void upLowerFloor(); + void upUpperFloor(); + void upCarAtHome(); + void upGettingOutOfCar(); + void upRidingCar(); + uint32 hmLowerFloor(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmUpperFloor(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); + void updateKlaymenCliprect(); +}; + +class Scene1609 : public Scene { +public: + Scene1609(NeverhoodEngine *vm, Module *parentModule); +protected: + Sprite *_ssButton; + AsScene3011Symbol *_asSymbols[12]; + int _currentSymbolIndex; + int _noisySymbolIndex; + int _symbolPosition; + int _countdown1; + bool _changeCurrentSymbol; + bool _isSolved; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + bool testVars(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1600_H */ diff --git a/engines/neverhood/modules/module1700.cpp b/engines/neverhood/modules/module1700.cpp new file mode 100644 index 0000000000..3a6d1f80cb --- /dev/null +++ b/engines/neverhood/modules/module1700.cpp @@ -0,0 +1,279 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1700.h" +#include "neverhood/gamemodule.h" + +namespace Neverhood { + +static const uint32 kModule1700SoundList[] = { + 0xB288D450, + 0x90804450, + 0x99801500, + 0xB288D455, + 0x93825040, + 0 +}; + +Module1700::Module1700(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _vm->_soundMan->addMusic(0x04212331, 0x31114225); + _vm->_soundMan->addSoundList(0x04212331, kModule1700SoundList); + _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 50, 600, 5, 150); + _vm->_soundMan->playTwoSounds(0x04212331, 0x41861371, 0x43A2507F, 0); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 0) + createScene(0, -1); + else if (which == 1) + createScene(4, 1); + else + createScene(4, 3); + +} + +Module1700::~Module1700() { + _vm->_soundMan->deleteGroup(0x04212331); +} + +void Module1700::createScene(int sceneNum, int which) { + debug("Module1700::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); + createSmackerScene(0x3028A005, true, true, false); + break; + case 1: + _vm->gameState().sceneNum = 1; + createNavigationScene(0x004AE8B8, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + createNavigationScene(0x004AE8E8, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); + createSmackerScene(0x01190041, true, true, false); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->setSoundListParams(kModule1700SoundList, false, 0, 0, 0, 0); + _vm->_soundMan->startMusic(0x31114225, 0, 2); + _childObject = new Scene1705(_vm, this, which); + break; + } + SetUpdateHandler(&Module1700::updateScene); + _childObject->handleUpdate(); +} + +void Module1700::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + _vm->_soundMan->setSoundListParams(kModule1700SoundList, true, 0, 0, 0, 0); + createScene(1, 0); + break; + case 1: + if (_moduleResult == 0) + createScene(2, 0); + else if (_moduleResult == 1) + createScene(1, 1); + break; + case 2: + if (_moduleResult == 0) + createScene(3, -1); + else if (_moduleResult == 1) + createScene(1, 1); + else if (_moduleResult == 2) { + if (!isSoundPlaying(0)) { + setSoundVolume(0, 60); + playSound(0, 0x58B45E58); + } + createScene(2, 2); + } + break; + case 3: + createScene(4, 0); + break; + case 4: + leaveModule(1); + break; + } + } +} + +// Scene1705 + +static const uint32 kScene1705FileHashes[] = { + 0x910EA801, 0x920EA801, 0x940EA801, + 0x980EA801, 0x800EA801, 0xB00EA801, + 0xD00EA801, 0x100EA801, 0x900EA800, + 0xD10EA801, 0x110EA801, 0x910EA800 +}; + +SsScene1705WallSymbol::SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex) + : StaticSprite(vm, fileHash, 100) { + + _x = _spriteResource.getPosition().x + symbolIndex * 30; + _y = _spriteResource.getPosition().y + 160; + updatePosition(); +} + +SsScene1705Tape::SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash) + : StaticSprite(vm, fileHash, surfacePriority, x - 24, y - 4), _parentScene(parentScene), _tapeIndex(tapeIndex) { + + if (!getSubVar(VA_HAS_TAPE, _tapeIndex) && !getSubVar(VA_IS_TAPE_INSERTED, _tapeIndex)) { + SetMessageHandler(&SsScene1705Tape::handleMessage); + } else { + setVisible(false); + SetMessageHandler(NULL); + } + _collisionBoundsOffset = _drawOffset; + _collisionBoundsOffset.x -= 4; + _collisionBoundsOffset.y -= 8; + _collisionBoundsOffset.width += 8; + _collisionBoundsOffset.height += 16; + Sprite::updateBounds(); +} + +uint32 SsScene1705Tape::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4806: + setSubVar(VA_HAS_TAPE, _tapeIndex, 1); + setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene1705::Scene1705(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _paletteArea(1) { + + Sprite *tempSprite; + + setGlobalVar(V_FELL_DOWN_HOLE, 1); + _vm->gameModule()->initCannonSymbolsPuzzle(); + + SetMessageHandler(&Scene1705::handleMessage); + SetUpdateHandler(&Scene1705::update); + + setHitRects(0x004B69D8); + setBackground(0x03118226); + setPalette(0x03118226); + _palette->addBasePalette(0x91D3A391, 0, 64, 0); + _palette->copyBasePalette(0, 256, 0); + addEntity(_palette); + insertScreenMouse(0x18222039); + + insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 0)], 0); + insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 1)], 1); + insertSprite(kScene1705FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_2, 2)], 2); + _sprite = insertStaticSprite(0x31313A22, 1100); + _ssTape = insertSprite(this, 15, 1100, 238, 439, 0x02363852); + addCollisionSprite(_ssTape); + + if (which < 0) { + // Restoring game + insertKlaymen(231, 434); + setMessageList(0x004B69E8); + sendMessage(this, 0x2000, 0); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + } else if (which == 1) { + // Klaymen teleporting in + insertKlaymen(431, 434); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B6A08, false); + sendMessage(this, 0x2000, 1); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + } else if (which == 2) { + // Klaymen teleporting out + insertKlaymen(431, 434); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B6AA0, false); + sendMessage(this, 0x2000, 1); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + } else if (which == 3) { + // Klaymen returning from teleporter console + insertKlaymen(431, 434); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B6A18, false); + sendMessage(this, 0x2000, 1); + _klaymen->setClipRect(0, 0, _sprite->getDrawRect().x2(), 480); + } else { + // Klaymen falling through the hole + insertKlaymen(231, 74); + sendMessage(_klaymen, 0x2000, 0); + setMessageList(0x004B69F0); + sendMessage(this, 0x2000, 0); + tempSprite = insertStaticSprite(0x30303822, 1100); + _klaymen->setClipRect(0, tempSprite->getDrawRect().y, _sprite->getDrawRect().x2(), 480); + } + +} + +void Scene1705::update() { + Scene::update(); + if (_klaymen->getX() < 224 && _paletteArea != 0) { + _palette->addBasePalette(0xF2210C15, 0, 64, 0); + _palette->startFadeToPalette(12); + _paletteArea = 0; + } else if (_klaymen->getX() >= 224 && _paletteArea == 0) { + _palette->addBasePalette(0x91D3A391, 0, 64, 0); + _palette->startFadeToPalette(12); + _paletteArea = 1; + } +} + +uint32 Scene1705::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004B6B40); + _klaymen->setKlaymenIdleTable3(); + } else { + setRectList(0x004B6B30); + _klaymen->setKlaymenIdleTable1(); + } + break; + case 0x4826: + if (sender == _ssTape && _klaymen->getX() <= 318) { + sendEntityMessage(_klaymen, 0x1014, sender); + setMessageList(0x004B6AC0); + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1700.h b/engines/neverhood/modules/module1700.h new file mode 100644 index 0000000000..f57c411a18 --- /dev/null +++ b/engines/neverhood/modules/module1700.h @@ -0,0 +1,72 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1700_H +#define NEVERHOOD_MODULES_MODULE1700_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/smackerscene.h" + +namespace Neverhood { + +class Module1700 : public Module { +public: + Module1700(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1700(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1705 + +class SsScene1705WallSymbol : public StaticSprite { +public: + SsScene1705WallSymbol(NeverhoodEngine *vm, uint32 fileHash, int symbolIndex); +}; + +class SsScene1705Tape : public StaticSprite { +public: + SsScene1705Tape(NeverhoodEngine *vm, Scene *parentScene, uint32 tapeIndex, int surfacePriority, int16 x, int16 y, uint32 fileHash); +protected: + Scene *_parentScene; + uint32 _tapeIndex; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1705 : public Scene { +public: + Scene1705(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite; + Sprite *_ssTape; + int _paletteArea; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1700_H */ diff --git a/engines/neverhood/modules/module1800.cpp b/engines/neverhood/modules/module1800.cpp new file mode 100644 index 0000000000..2a6057f9c8 --- /dev/null +++ b/engines/neverhood/modules/module1800.cpp @@ -0,0 +1,181 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1800.h" +#include "neverhood/navigationscene.h" +#include "neverhood/menumodule.h" + +namespace Neverhood { + +static const uint32 kModule1800SoundList[] = { + 0x16805548, + 0x16805048, + 0xD0E14441, + 0x90E090C2, + 0x90E1D0C2, + 0x90E2D0C2, + 0 +}; + +Module1800::Module1800(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _vm->_soundMan->addSoundList(0x04A14718, kModule1800SoundList); + _vm->_soundMan->setSoundListParams(kModule1800SoundList, true, 50, 600, 10, 150); + _vm->_soundMan->playTwoSounds(0x04A14718, 0x8A382B55, 0x0C242F1D, 0); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 2) + createScene(5, 0); + else if (which == 3) + createScene(0, 0); + else + createScene(3, 1); + +} + +Module1800::~Module1800() { + _vm->_soundMan->deleteGroup(0x04A14718); +} + +void Module1800::createScene(int sceneNum, int which) { + static const byte kNavigationTypes00[] = {1, 0, 2, 0}; + static const byte kNavigationTypes01[] = {5}; + debug("Module1800::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + createNavigationScene(0x004AFD38, which, kNavigationTypes00); + break; + case 1: + _vm->gameState().sceneNum = 1; + createNavigationScene(0x004AFD98, which, kNavigationTypes01); + break; + case 2: + _vm->gameState().sceneNum = 2; + createSmackerScene(0x006C0085, true, true, false); + break; + case 3: + _vm->gameState().sceneNum = 3; + createNavigationScene(0x004AFDB0, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + createNavigationScene(0x004AFDE0, which); + break; + case 5: + _vm->gameState().sceneNum = 5; + createNavigationScene(0x004AFE40, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->_soundMan->deleteGroup(0x04A14718); + createSmackerScene(0x08D84010, true, true, false); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->_soundMan->setSoundListParams(kModule1800SoundList, false, 0, 0, 0, 0); + createSmackerScene(0x0168B121, true, true, false); + break; + case 8: + _vm->gameState().sceneNum = 8; + _childObject = new CreditsScene(_vm, this, false); + break; + case 1009: + _vm->gameState().sceneNum = 3; + // NOTE: Newly introduced sceneNum 1009 (was duplicate 3 with own update handler) + createSmackerScene(0x0A840C01, true, true, false); + break; + } + SetUpdateHandler(&Module1800::updateScene); + _childObject->handleUpdate(); +} + +void Module1800::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 2) + createScene(1, -1); + else if (_moduleResult == 3) + createScene(3, 0); + break; + case 1: + if (_navigationAreaType == 3) + createScene(7, -1); + else + createScene(2, -1); + break; + case 2: + createScene(0, 2); + break; + case 3: + if (_moduleResult == 0) + createScene(1009, -1); + else if (_moduleResult == 1) + createScene(0, 1); + break; + case 4: + if (_moduleResult == 0) + createScene(6, -1); + else if (_moduleResult == 1) + createScene(5, 0); + else if (_moduleResult == 2) + createScene(0, 3); + else if (_moduleResult == 3) + createScene(4, 3); + break; + case 5: + if (_moduleResult == 0) + leaveModule(2); + else if (_moduleResult == 1) + createScene(4, 3); + break; + case 6: + createScene(8, -1); + break; + case 7: + leaveModule(3); + break; + case 8: + // NOTE: After Klaymen jumped into the hole and died... + leaveModule(1); + break; + case 1009: + leaveModule(0); + break; + } + } else { + switch (_sceneNum) { + case 0: + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 2) + _vm->_soundMan->setTwoSoundsPlayFlag(false); + break; + } + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1800.h b/engines/neverhood/modules/module1800.h new file mode 100644 index 0000000000..d3f3a635c3 --- /dev/null +++ b/engines/neverhood/modules/module1800.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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1800_H +#define NEVERHOOD_MODULES_MODULE1800_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module1800 + +class Module1800 : public Module { +public: + Module1800(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1800(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1800_H */ diff --git a/engines/neverhood/modules/module1900.cpp b/engines/neverhood/modules/module1900.cpp new file mode 100644 index 0000000000..1a9ffa127b --- /dev/null +++ b/engines/neverhood/modules/module1900.cpp @@ -0,0 +1,650 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module1900.h" +#include "neverhood/gamemodule.h" + +namespace Neverhood { + +static const uint32 kModule1900SoundList[] = { + 0xB4005E60, + 0x91835066, + 0x90E14440, + 0 +}; + +Module1900::Module1900(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + // NOTE: The original has a Scene1908 here as well but it's not used here but in another module... + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else + createScene(0, 0); + + _vm->_soundMan->addSoundList(0x04E1C09C, kModule1900SoundList); + _vm->_soundMan->setSoundListParams(kModule1900SoundList, true, 50, 600, 5, 150); + +} + +Module1900::~Module1900() { + _vm->_soundMan->deleteGroup(0x04E1C09C); +} + +void Module1900::createScene(int sceneNum, int which) { + debug("Module1900::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1901(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + _childObject = new Scene1907(_vm, this); + break; + } + SetUpdateHandler(&Module1900::updateScene); + _childObject->handleUpdate(); +} + +void Module1900::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(6, 0); + else + leaveModule(0); + break; + case 6: + createScene(0, 1); + break; + } + } +} + +// Scene1901 + +Scene1901::Scene1901(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + setRectList(0x004B34C8); + + setBackground(0x01303227); + setPalette(0x01303227); + insertScreenMouse(0x0322301B); + + insertStaticSprite(0x42213133, 1100); + + if (!getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) + insertStaticSprite(0x40A40168, 100); + else if (getGlobalVar(V_STAIRS_DOWN)) { + insertStaticSprite(0x124404C4, 100); + setGlobalVar(V_STAIRS_DOWN_ONCE, 1); + } else + insertStaticSprite(0x02840064, 100); + + if (which < 0) { + // Restoring game + insertKlaymen(120, 380); + setMessageList(0x004B3408); + } else if (which == 1) { + // Klaymen returning from the puzzle + insertKlaymen(372, 380); + setMessageList(0x004B3410); + } else { + // Klaymen entering from the left + insertKlaymen(0, 380); + setMessageList(0x004B3400); + } + + tempSprite = insertStaticSprite(0x4830A402, 1100); + _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + +} + +static const NPoint kAsScene1907SymbolGroundPositions[] = { + {160, 310}, { 90, 340}, {210, 335}, + {210, 380}, {310, 340}, {290, 400}, + {400, 375}, {370, 435}, {475, 415} +}; + +static const NPoint kAsScene1907SymbolPluggedInPositions[] = { + {275, 125}, {244, 125}, {238, 131}, + {221, 135}, {199, 136}, {168, 149}, + {145, 152}, {123, 154}, {103, 157} +}; + +static const NPoint kAsScene1907SymbolGroundHitPositions[] = { + {275, 299}, {244, 299}, {238, 305}, + {221, 309}, {199, 310}, {168, 323}, + {145, 326}, {123, 328}, {103, 331} +}; + +static const NPoint kAsScene1907SymbolPluggedInDownPositions[] = { + {275, 136}, {244, 156}, {238, 183}, + {221, 207}, {199, 228}, {168, 262}, + {145, 285}, {123, 307}, {103, 331} +}; + +static const uint32 kAsScene1907SymbolFileHashes[] = { + 0x006A1034, 0x006A1010, 0x006A1814, + 0x006A1016, 0x006A0014, 0x002A1014, + 0x00EA1014, 0x206A1014, 0x046A1414 +}; + +bool AsScene1907Symbol::_plugInFailed = false; +int AsScene1907Symbol::_plugInTryCount = 0; + +AsScene1907Symbol::AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex) + : AnimatedSprite(vm, 1000 - positionIndex), _parentScene(parentScene), _elementIndex(elementIndex), _isMoving(false) { + + _plugInFailed = false; + _plugInTryCount = 0; + + if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { + _isPluggedIn = true; + _currPositionIndex = elementIndex; + if (!getGlobalVar(V_STAIRS_DOWN)) { + _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; + } else { + _x = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolPluggedInDownPositions[_currPositionIndex].y; + } + createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } else { + _isPluggedIn = false; + _currPositionIndex = positionIndex; + loadSound(0, 0x74231924); + loadSound(1, 0x36691914); + loadSound(2, 0x5421D806); + _parentScene->setPositionFree(_currPositionIndex, false); + _x = kAsScene1907SymbolGroundPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolGroundPositions[_currPositionIndex].y; + createSurface1(kAsScene1907SymbolFileHashes[_elementIndex], 1000 + _currPositionIndex); + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + _newStickFrameIndex = 0; + } + _collisionBoundsOffset.set(0, 0, 80, 80); + Sprite::updateBounds(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + +} + +void AsScene1907Symbol::update() { + updateAnim(); + handleSpriteUpdate(); + updatePosition(); + if (_plugInFailed && _plugInTryCount == 0) + _plugInFailed = false; +} + +uint32 AsScene1907Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isPluggedIn && !_plugInFailed) { + tryToPlugIn(); + messageResult = 1; + } else + messageResult = 0; + break; + } + return messageResult; +} + +uint32 AsScene1907Symbol::hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1907Symbol::suTryToPlugIn() { + _currStep++; + _x -= _deltaX; + _y -= _deltaY; + if (_currStep == 16) { + _x -= _smallDeltaX; + _y -= _smallDeltaY; + SetSpriteUpdate(NULL); + } +} + +void AsScene1907Symbol::suFallOff() { + if (_fallOffDelay != 0) { + _fallOffDelay--; + } else { + _y += _yAccel; + _yAccel += 8; + if (_y >= kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) { + _y = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y; + stFallOffHitGround(); + } + } +} + +void AsScene1907Symbol::suFallOffHitGround() { + + if (_x == _someX - _xBreak) + _x -= _smallDeltaX; + else + _x -= _deltaX; + + if (_y == kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y) { + _y -= _someY; + } + + if (_currStep < 8) { + _y -= _yAccel; + _yAccel -= 4; + if (_yAccel < 0) + _yAccel = 0; + } else if (_currStep < 15) { + _y += _yAccel; + _yAccel += 4; + } else { + _y = kAsScene1907SymbolGroundPositions[_newPositionIndex].y; + cbFallOffHitGroundEvent(); + } + + _currStep++; +} + +void AsScene1907Symbol::suMoveDown() { + _y += _yIncr; + if (_yIncr < 11) + _yIncr++; + if (_y >= kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y) { + _y = kAsScene1907SymbolPluggedInDownPositions[_elementIndex].y; + _isMoving = false; + SetSpriteUpdate(NULL); + } +} + +void AsScene1907Symbol::suMoveUp() { + _y -= _yIncr; + if (getGlobalVar(V_WALL_BROKEN)) { + if (_y - (9 + (_elementIndex > 5 ? 31 : 0)) < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) + _yIncr--; + else + _yIncr++; + } else + _yIncr = 2; + if (_yIncr > 9) + _yIncr = 9; + else if (_yIncr < 1) + _yIncr = 1; + if (_y < kAsScene1907SymbolPluggedInPositions[_elementIndex].y) { + _y = kAsScene1907SymbolPluggedInPositions[_elementIndex].y; + _isMoving = false; + SetSpriteUpdate(NULL); + } +} + +void AsScene1907Symbol::tryToPlugIn() { + _isPluggedIn = true; + _plugInTryCount++; + _newPositionIndex = _parentScene->getNextPosition(); + _parentScene->setPositionFree(_currPositionIndex, true); + sendMessage(_parentScene, 0x1022, 1100 + _newPositionIndex); + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + SetUpdateHandler(&AsScene1907Symbol::update); + SetMessageHandler(&AsScene1907Symbol::hmTryToPlugIn); + SetSpriteUpdate(&AsScene1907Symbol::suTryToPlugIn); + _currStep = 0; + _deltaX = (_x - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x) / 16; + _smallDeltaX = _x - _deltaX * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].x; + _deltaY = (_y - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y) / 16; + _smallDeltaY = _y - _deltaY * 16 - kAsScene1907SymbolPluggedInPositions[_newPositionIndex].y; + if (_elementIndex == _newPositionIndex) { + NextState(&AsScene1907Symbol::stPlugIn); + } else { + _plugInFailed = true; + NextState(&AsScene1907Symbol::stPlugInFail); + } +} + +void AsScene1907Symbol::fallOff(int newPositionIndex, int fallOffDelay) { + _isPluggedIn = false; + _newPositionIndex = newPositionIndex; + _fallOffDelay = fallOffDelay; + _parentScene->setPositionFree(_newPositionIndex, false); + _x = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].x; + _y = kAsScene1907SymbolPluggedInPositions[_currPositionIndex].y; + _someX = _x; + _someY = _y; + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, 0); + _playBackwards = true; + _newStickFrameIndex = STICK_LAST_FRAME; + _currStep = 0; + _yAccel = 1; + SetUpdateHandler(&AsScene1907Symbol::update); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteUpdate(&AsScene1907Symbol::suFallOff); +} + +void AsScene1907Symbol::stFallOffHitGround() { + playSound(1); + sendMessage(_parentScene, 0x1022, 1000 + _newPositionIndex); + Entity::_priority = 1000 - _newPositionIndex; + _parentScene->removeCollisionSprite(this); + _parentScene->addCollisionSprite(this); + SetSpriteUpdate(&AsScene1907Symbol::suFallOffHitGround); + NextState(&AsScene1907Symbol::cbFallOffHitGroundEvent); + _newStickFrameIndex = 0; + _currStep = 0; + _yAccel = 30; + _deltaX = (_x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x) / 15; + _xBreak = _deltaX * 15; + _smallDeltaX = _x - kAsScene1907SymbolGroundPositions[_newPositionIndex].x - _xBreak; + _someY = 0; + if (kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y > kAsScene1907SymbolGroundPositions[_newPositionIndex].y) + _someY = kAsScene1907SymbolGroundHitPositions[_currPositionIndex].y - kAsScene1907SymbolGroundPositions[_newPositionIndex].y; +} + +void AsScene1907Symbol::cbFallOffHitGroundEvent() { + _currPositionIndex = _newPositionIndex; + if (_plugInTryCount > 0) + _plugInTryCount--; + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteUpdate(NULL); + updateBounds(); + playSound(2); +} + +void AsScene1907Symbol::stPlugIn() { + playSound(0); + _currPositionIndex = _newPositionIndex; + stopAnimation(); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteUpdate(NULL); + if (_elementIndex == 8) + sendMessage(_parentScene, 0x2001, 0); +} + +void AsScene1907Symbol::stPlugInFail() { + _currPositionIndex = _newPositionIndex; + stopAnimation(); + _parentScene->plugInFailed(); +} + +void AsScene1907Symbol::moveUp() { + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); + stopAnimation(); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteUpdate(&AsScene1907Symbol::suMoveUp); + _yIncr = 1; + _isMoving = true; +} + +void AsScene1907Symbol::moveDown() { + startAnimation(kAsScene1907SymbolFileHashes[_elementIndex], -1, -1); + stopAnimation(); + SetMessageHandler(&AsScene1907Symbol::handleMessage); + SetSpriteUpdate(&AsScene1907Symbol::suMoveDown); + _yIncr = 4; + _isMoving = true; +} + +SsScene1907UpDownButton::SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol) + : StaticSprite(vm, 1400), _parentScene(parentScene), _asScene1907Symbol(asScene1907Symbol), + _countdown1(0) { + + loadSprite(0x64516424, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1400); + setVisible(false); + loadSound(0, 0x44061000); + SetUpdateHandler(&SsScene1907UpDownButton::update); + SetMessageHandler(&SsScene1907UpDownButton::handleMessage); + if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { + if (getGlobalVar(V_STAIRS_DOWN)) + setToDownPosition(); + else + setToUpPosition(); + } +} + +void SsScene1907UpDownButton::update() { + updatePosition(); + if (_countdown1 != 0 && (--_countdown1 == 0)) { + setVisible(false); + sendMessage(_parentScene, 0x2000, 0); + } +} + +uint32 SsScene1907UpDownButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown1 == 0 && !_asScene1907Symbol->isMoving() && getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) { + setVisible(true); + _countdown1 = 4; + updatePosition(); + playSound(0); + } + messageResult = 1; + } + return messageResult; +} + +void SsScene1907UpDownButton::setToUpPosition() { + _y = _spriteResource.getPosition().y; + updateBounds(); + updatePosition(); +} + +void SsScene1907UpDownButton::setToDownPosition() { + _y = _spriteResource.getPosition().y + 174; + updateBounds(); + updatePosition(); +} + +AsScene1907WaterHint::AsScene1907WaterHint(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1400) { + + createSurface1(0x110A1061, 1500); + _x = 320; + _y = 240; + startAnimation(0x110A1061, 0, -1); + _newStickFrameIndex = 0; + setVisible(false); + _needRefresh = true; + AnimatedSprite::updatePosition(); + SetUpdateHandler(&AsScene1907WaterHint::update); + SetMessageHandler(&Sprite::handleMessage); +} + +void AsScene1907WaterHint::update() { + updateAnim(); + updatePosition(); +} + +uint32 AsScene1907WaterHint::hmShowing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene1907WaterHint::show() { + setVisible(true); + startAnimation(0x110A1061, 0, -1); + SetMessageHandler(&AsScene1907WaterHint::hmShowing); + NextState(&AsScene1907WaterHint::hide); +} + +void AsScene1907WaterHint::hide() { + stopAnimation(); + setVisible(false); + SetMessageHandler(&Sprite::handleMessage); +} + +Scene1907::Scene1907(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _currMovingSymbolIndex(0), _pluggedInCount(0), + _moveDownCountdown(0), _moveUpCountdown(0), _countdown3(0), _hasPlugInFailed(false) { + + setBackground(0x20628E05); + setPalette(0x20628E05); + + for (int i = 0; i < 9; i++) + _positionFree[i] = true; + + for (int i = 0; i < 9; i++) { + _asSymbols[i] = insertSprite(this, i, getRandomPositionIndex()); + addCollisionSprite(_asSymbols[i]); + } + + _ssUpDownButton = insertSprite(this, _asSymbols[8]); + addCollisionSprite(_ssUpDownButton); + + _asWaterHint = insertSprite(); + + insertPuzzleMouse(0x28E0120E, 20, 620); + + SetMessageHandler(&Scene1907::handleMessage); + SetUpdateHandler(&Scene1907::update); + + if (getGlobalVar(V_STAIRS_PUZZLE_SOLVED)) + _pluggedInCount = 9; + + loadSound(0, 0x72004A10); + loadSound(1, 0x22082A12); + loadSound(2, 0x21100A10); + loadSound(3, 0x68E25540); + +} + +void Scene1907::update() { + Scene::update(); + + if (_hasPlugInFailed) { + int fallOffDelay = 0; + _hasPlugInFailed = false; + for (int i = 0; i < 9; i++) { + AsScene1907Symbol *asSymbol = _asSymbols[8 - i]; + if (asSymbol->isPluggedIn()) { + asSymbol->fallOff(getRandomPositionIndex(), fallOffDelay); + fallOffDelay += _vm->_rnd->getRandomNumber(10 - 1) + 4; + } + } + } + + if (_moveDownCountdown != 0 && (--_moveDownCountdown == 0)) { + _asSymbols[_currMovingSymbolIndex]->moveDown(); + if (_currMovingSymbolIndex > 0) { + _moveDownCountdown = 2; + _currMovingSymbolIndex--; + } + } + + if (_moveUpCountdown != 0 && (--_moveUpCountdown == 0)) { + _moveDownCountdown = 0; + for (int i = 0; i < 9; i++) + _asSymbols[i]->moveUp(); + } + + if (_countdown3 != 0 && (--_countdown3 == 0)) { + _asWaterHint->show(); + _moveUpCountdown = 4; + } + +} + +uint32 Scene1907::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && + !_hasPlugInFailed && _moveDownCountdown == 0 && _moveUpCountdown == 0 && _countdown3 == 0) { + leaveScene(0); + } + break; + case 0x2000: + if (getGlobalVar(V_STAIRS_DOWN)) { + playSound(0); + for (int i = 0; i < 9; i++) + _asSymbols[i]->moveUp(); + _ssUpDownButton->setToUpPosition(); + setGlobalVar(V_STAIRS_DOWN, 0); + } else { + if (!getGlobalVar(V_WALL_BROKEN)) { + playSound(2); + _countdown3 = 5; + } else { + playSound(1); + _ssUpDownButton->setToDownPosition(); + setGlobalVar(V_STAIRS_DOWN, 1); + } + _moveDownCountdown = 1; + _currMovingSymbolIndex = 8; + } + break; + case 0x2001: + playSound(3); + setGlobalVar(V_STAIRS_PUZZLE_SOLVED, 1); + break; + } + return 0; +} + +void Scene1907::plugInFailed() { + _pluggedInCount = 0; + _hasPlugInFailed = true; +} + +int Scene1907::getRandomPositionIndex() { + bool found = false; + int index = 0; + // Check if any position is free + for (int i = 0; i < 9; i++) + if (_positionFree[i]) + found = true; + if (found) { + // Get a random free position + found = false; + while (!found) { + index = _vm->_rnd->getRandomNumber(9 - 1); + if (_positionFree[index]) + found = true; + } + } + return index; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module1900.h b/engines/neverhood/modules/module1900.h new file mode 100644 index 0000000000..abb5eb1d87 --- /dev/null +++ b/engines/neverhood/modules/module1900.h @@ -0,0 +1,143 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE1900_H +#define NEVERHOOD_MODULES_MODULE1900_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1200.h" + +namespace Neverhood { + +class Module1900 : public Module { +public: + Module1900(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module1900(); +protected: + int _sceneNum; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1901 + +class Scene1901 : public Scene { +public: + Scene1901(NeverhoodEngine *vm, Module *parentModule, int which); +}; + +// Scene1907 + +class Scene1907; + +class AsScene1907Symbol : public AnimatedSprite { +public: + AsScene1907Symbol(NeverhoodEngine *vm, Scene1907 *parentScene, int elementIndex, int positionIndex); + void moveUp(); + void moveDown(); + void fallOff(int newPositionIndex, int fallOffDelay); + bool isPluggedIn() { return _isPluggedIn; } + bool isMoving() { return _isMoving; } +protected: + Scene1907 *_parentScene; + int _elementIndex; + int _currPositionIndex; + int _newPositionIndex; + bool _isPluggedIn; + bool _isMoving; + int _someX, _someY; + int _xBreak; + int _currStep; + int _yAccel; + int _yIncr; + int _fallOffDelay; + int _deltaX, _smallDeltaX; + int _deltaY, _smallDeltaY; + // Dumb, change if possible + static bool _plugInFailed; + static int _plugInTryCount; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmTryToPlugIn(int messageNum, const MessageParam ¶m, Entity *sender); + void suTryToPlugIn(); + void suFallOff(); + void suFallOffHitGround(); + void suMoveDown(); + void suMoveUp(); + void tryToPlugIn(); + void stFallOffHitGround(); + void cbFallOffHitGroundEvent(); + void stPlugIn(); + void stPlugInFail(); +}; + +class AsScene1907WaterHint : public AnimatedSprite { +public: + AsScene1907WaterHint(NeverhoodEngine *vm); + void show(); +protected: + void update(); + uint32 hmShowing(int messageNum, const MessageParam ¶m, Entity *sender); + void hide(); +}; + +class SsScene1907UpDownButton : public StaticSprite { +public: + SsScene1907UpDownButton(NeverhoodEngine *vm, Scene1907 *parentScene, AsScene1907Symbol *asScene1907Symbol); + void setToUpPosition(); + void setToDownPosition(); +protected: + Scene1907 *_parentScene; + AsScene1907Symbol *_asScene1907Symbol; + int _countdown1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene1907 : public Scene { +public: + Scene1907(NeverhoodEngine *vm, Module *parentModule); + void plugInFailed(); + void setPositionFree(int index, bool value) { _positionFree[index] = value; } + int getNextPosition() { return _pluggedInCount++; } +protected: + AsScene1907Symbol *_asSymbols[9]; + SsScene1907UpDownButton *_ssUpDownButton; + AsScene1907WaterHint *_asWaterHint; + int _currMovingSymbolIndex; + int _pluggedInCount; + int _moveDownCountdown; + int _moveUpCountdown; + int _countdown3; + bool _hasPlugInFailed; + bool _positionFree[9]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + int getRandomPositionIndex(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE1900_H */ diff --git a/engines/neverhood/modules/module2000.cpp b/engines/neverhood/modules/module2000.cpp new file mode 100644 index 0000000000..5039da1b01 --- /dev/null +++ b/engines/neverhood/modules/module2000.cpp @@ -0,0 +1,160 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2000.h" +#include "neverhood/gamemodule.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +Module2000::Module2000(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 0) + createScene(0, 1); + else if (which == 1) + createScene(0, 3); + +} + +Module2000::~Module2000() { + _vm->_soundMan->deleteGroup(0x81293110); +} + +void Module2000::createScene(int sceneNum, int which) { + debug("Module2000::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2001(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + createNavigationScene(getGlobalVar(V_WORLDS_JOINED) ? 0x004B7B48 : 0x004B7B00, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + setGlobalVar(V_WORLDS_JOINED, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 1, 1); + createSmackerScene(0x204B2031, true, true, false); + break; + } + SetUpdateHandler(&Module2000::updateScene); + _childObject->handleUpdate(); +} + +void Module2000::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + leaveModule(0); + else + createScene(1, 0); + break; + case 1: + if (_moduleResult == 0) { + if (getGlobalVar(V_WORLDS_JOINED)) + createScene(1, 0); + else + createScene(2, -1); + } else if (_moduleResult == 1) + createScene(1, 1); + else if (_moduleResult == 2) + createScene(0, 0); + break; + case 2: + createScene(1, 0); + break; + } + } +} + +// Scene2001 + +Scene2001::Scene2001(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + SetMessageHandler(&Scene2001::handleMessage); + + setBackground(0xA6417244); + setPalette(0xA6417244); + insertScreenMouse(0x17240A6C); + + tempSprite = insertStaticSprite(0x0D641724, 1100); + + if (which < 0) { + // Restoring game + insertKlaymen(300, 345); + setMessageList(0x004B3538); + sendMessage(this, 0x2000, 0); + } else if (which == 1) { + // Klaymen teleporting in + insertKlaymen(116, 345); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B3540, false); + sendMessage(this, 0x2000, 1); + } else if (which == 2) { + // Klaymen teleporting out + insertKlaymen(116, 345); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B35F0, false); + sendMessage(this, 0x2000, 1); + } else if (which == 3) { + // Klaymen returning from teleporter console + insertKlaymen(116, 345); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B3550, false); + sendMessage(this, 0x2000, 1); + } else { + // Klaymen standing around + insertKlaymen(390, 345); + setMessageList(0x004B3530); + sendMessage(this, 0x2000, 0); + _klaymen->setDoDeltaX(1); + } + + _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + +} + +uint32 Scene2001::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004B3680); + _klaymen->setKlaymenIdleTable3(); + } else { + setRectList(0x004B3670); + _klaymen->setKlaymenIdleTable1(); + } + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2000.h b/engines/neverhood/modules/module2000.h new file mode 100644 index 0000000000..fa62f9a70e --- /dev/null +++ b/engines/neverhood/modules/module2000.h @@ -0,0 +1,55 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2000_H +#define NEVERHOOD_MODULES_MODULE2000_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1200.h" + +namespace Neverhood { + +class Module2000 : public Module { +public: + Module2000(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2000(); +protected: + int _sceneNum; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene2001 + +class Scene2001 : public Scene { +public: + Scene2001(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2000_H */ diff --git a/engines/neverhood/modules/module2100.cpp b/engines/neverhood/modules/module2100.cpp new file mode 100644 index 0000000000..0d7f3dd22a --- /dev/null +++ b/engines/neverhood/modules/module2100.cpp @@ -0,0 +1,336 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2100.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1200.h" + +namespace Neverhood { + +Module2100::Module2100(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _vm->_soundMan->addMusic(0x10A10C14, 0x11482B95); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 1) + createScene(0, 0); + else if (which == 2) + createScene(0, 3); + else + createScene(0, 1); + +} + +Module2100::~Module2100() { + _vm->_soundMan->deleteMusicGroup(0x10A10C14); +} + +void Module2100::createScene(int sceneNum, int which) { + debug("Module2100::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->_soundMan->startMusic(0x11482B95, 0, 1); + _childObject = new Scene2101(_vm, this, which); + break; + } + SetUpdateHandler(&Module2100::updateScene); + _childObject->handleUpdate(); +} + +void Module2100::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) { + setGlobalVar(V_DOOR_PASSED, 1); + leaveModule(0); + } else + leaveModule(1); + break; + } + } +} + +// Scene2101 + +AsScene2101Door::AsScene2101Door(NeverhoodEngine *vm, bool isOpen) + : AnimatedSprite(vm, 1100) { + + createSurface(100, 328, 347); + _x = 320; + _y = 240; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2101Door::handleMessage); + if (isOpen) { + startAnimation(0x0C202B9C, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } else + setVisible(false); +} + +uint32 AsScene2101Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + case 0x4808: + stOpenDoor(); + break; + case 0x4809: + stCloseDoor(); + break; + } + return messageResult; +} + +void AsScene2101Door::stOpenDoor() { + startAnimation(0x0C202B9C, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + setVisible(true); + playSound(0, calcHash("fxDoorOpen32")); +} + +void AsScene2101Door::stCloseDoor() { + startAnimation(0xC222A8D4, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + setVisible(true); + playSound(0, calcHash("fxDoorClose32")); + NextState(&AsScene2101Door::stCloseDoorDone); +} + +void AsScene2101Door::stCloseDoorDone() { + stopAnimation(); + setVisible(false); +} + +AsScene2101HitByDoorEffect::AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klaymen) + : AnimatedSprite(vm, 1400), _klaymen(klaymen) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2101HitByDoorEffect::handleMessage); + createSurface(1200, 88, 165); + setVisible(false); +} + +uint32 AsScene2101HitByDoorEffect::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + _x = _klaymen->getX(); + _y = _klaymen->getY() - 132; + startAnimation(0x0422255A, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +SsCommonFloorButton::SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash) + : StaticSprite(vm, 1100), _parentScene(parentScene), _countdown(0), + _fileHash1(fileHash1), _fileHash2(fileHash2), _soundFileHash(soundFileHash) { + + SetUpdateHandler(&SsCommonFloorButton::update); + SetMessageHandler(&SsCommonFloorButton::handleMessage); + if (_soundFileHash == 0) + _soundFileHash = 0x44141000; + createSurface(1010, 61, 30); + if (_fileHash1) + loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); + else + setVisible(false); +} + +void SsCommonFloorButton::update() { + if (_countdown != 0 && (--_countdown == 0)) { + sendMessage(_parentScene, 0x1022, 1010); + if (_fileHash1) + loadSprite(_fileHash1, kSLFDefDrawOffset | kSLFDefPosition); + else + setVisible(false); + } +} + +uint32 SsCommonFloorButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480B: + sendMessage(_parentScene, 0x480B, 0); + setVisible(true); + sendMessage(_parentScene, 0x1022, 990); + loadSprite(_fileHash2, kSLFDefDrawOffset | kSLFDefPosition); + _countdown = 16; + playSound(0, _soundFileHash); + break; + } + return messageResult; +} + +Scene2101::Scene2101(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + SetMessageHandler(&Scene2101::handleMessage); + SetUpdateHandler(&Scene2101::update); + + setBackground(0x44242305); + setPalette(0x44242305); + insertScreenMouse(0x4230144A); + + insertStaticSprite(0x00502330, 1100); + tempSprite = insertStaticSprite(0x78492010, 1100); + _ssFloorButton = insertSprite(this, 0x72427010, 0x32423010, 200, 0); + _asTape1 = insertSprite(this, 18, 1100, 412, 443, 0x9148A011); + addCollisionSprite(_asTape1); + _asTape2 = insertSprite(this, 11, 1100, 441, 443, 0x9148A011); + addCollisionSprite(_asTape2); + + if (which < 0) { + insertKlaymen(380, 438); + setMessageList(0x004B8E48); + sendMessage(this, 0x2000, 0); + _asDoor = insertSprite(false); + _doorStatus = 1; + _countdown1 = 0; + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 438); + setMessageList(0x004B8E50); + sendMessage(this, 0x2000, 0); + _asDoor = insertSprite(true); + _doorStatus = 2; + _countdown1 = 48; + } else if (which == 2) { + // Klaymen teleporting out + insertKlaymen(115, 438); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B8F58); + sendMessage(this, 0x2000, 1); + _asDoor = insertSprite(false); + _doorStatus = 1; + _countdown1 = 0; + } else if (which == 3) { + // Klaymen returning from the teleporter console + insertKlaymen(115, 438); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B8EB0); + sendMessage(this, 0x2000, 1); + _asDoor = insertSprite(false); + _doorStatus = 1; + _countdown1 = 0; + } else { + // Klaymen teleporting in + insertKlaymen(115, 438); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004B8EA0); + sendMessage(this, 0x2000, 1); + _asDoor = insertSprite(false); + _doorStatus = 1; + _countdown1 = 0; + } + + _asHitByDoorEffect = insertSprite(_klaymen); + _klaymen->setClipRect(0, 0, tempSprite->getDrawRect().x2(), 480); + +} + +void Scene2101::update() { + if (_countdown1 != 0) { + if (_doorStatus == 2) { + if (--_countdown1 == 0) { + sendMessage(_asDoor, 0x4809, 0); + _doorStatus = 1; + } + } else { + if (_klaymen->getX() > 575) + _canAcceptInput = false; + if (--_countdown1 == 0) { + if (_klaymen->getX() < 480) { + sendMessage(_asDoor, 0x4809, 0); + _doorStatus = 1; + } else if (_klaymen->getX() >= 480 && _klaymen->getX() <= 575) { + _klaymen->setDoDeltaX(0); + setMessageList2(0x004B8F48); + sendMessage(_asDoor, 0x4809, 0); + sendMessage(_asHitByDoorEffect, 0x2001, 0); + _doorStatus = 1; + } + } + } + } else if (_doorStatus == 1 && _messageValue >= 0 && _klaymen->getX() > 470 && !isMessageList2(0x004B8F48)) + setMessageList2(0x004B8F50); + Scene::update(); +} + +uint32 Scene2101::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x02144CB1) + sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); + else if (param.asInteger() == 0x21E64A00) { + if (_doorStatus == 0) + setMessageList(0x004B8E80); + else + setMessageList(0x004B8EC8); + } else if (param.asInteger() == 0x41442820) + cancelMessageList(); + break; + case 0x2000: + if (param.asInteger() != 0) { + setRectList(0x004B9008); + _klaymen->setKlaymenIdleTable3(); + } else { + setRectList(0x004B8FF8); + _klaymen->setKlaymenIdleTable1(); + } + break; + case 0x480B: + if (sender == _ssFloorButton && _doorStatus == 1) { + sendMessage(_asDoor, 0x4808, 0); + _doorStatus = 0; + _countdown1 = 90; + } + break; + case 0x4826: + if (sender == _asTape1 || sender == _asTape2) { + if (_klaymen->getX() >= 228 && _klaymen->getX() <= 500) { + sendEntityMessage(_klaymen, 0x1014, sender); + setMessageList(0x004B8F78); + } else if (_klaymen->getX() < 228) + setMessageList2(0x004B8F00); + } + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2100.h b/engines/neverhood/modules/module2100.h new file mode 100644 index 0000000000..369f5ac0cc --- /dev/null +++ b/engines/neverhood/modules/module2100.h @@ -0,0 +1,92 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2100_H +#define NEVERHOOD_MODULES_MODULE2100_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +class Module2100 : public Module { +public: + Module2100(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2100(); +protected: + int _sceneNum; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene1901 + +class AsScene2101Door : public AnimatedSprite { +public: + AsScene2101Door(NeverhoodEngine *vm, bool isOpen); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); + void stCloseDoorDone(); +}; + +class AsScene2101HitByDoorEffect : public AnimatedSprite { +public: + AsScene2101HitByDoorEffect(NeverhoodEngine *vm, Sprite *klaymen); +protected: + Sprite *_klaymen; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsCommonFloorButton : public StaticSprite { +public: + SsCommonFloorButton(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int surfacePriority, uint32 soundFileHash); +protected: + Scene *_parentScene; + uint32 _soundFileHash; + uint32 _fileHash1, _fileHash2; + int16 _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2101 : public Scene { +public: + Scene2101(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssFloorButton; + Sprite *_asTape1; + Sprite *_asTape2; + Sprite *_asDoor; + Sprite *_asHitByDoorEffect; + int _countdown1; + int _doorStatus; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2100_H */ diff --git a/engines/neverhood/modules/module2200.cpp b/engines/neverhood/modules/module2200.cpp new file mode 100644 index 0000000000..b8da0f64ff --- /dev/null +++ b/engines/neverhood/modules/module2200.cpp @@ -0,0 +1,2564 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2200.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1200.h" +#include "neverhood/gamemodule.h" +#include "neverhood/diskplayerscene.h" + +namespace Neverhood { + +Module2200::Module2200(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + debug("Create Module2200(%d)", which); + + _vm->_soundMan->addMusic(0x11391412, 0x601C908C); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else + createScene(0, 0); + +} + +Module2200::~Module2200() { + _vm->_soundMan->deleteGroup(0x11391412); +} + +void Module2200::createScene(int sceneNum, int which) { + debug("Module2200::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2201(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->_soundMan->startMusic(0x601C908C, 0, 2); + _childObject = new Scene2202(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->startMusic(0x601C908C, 0, 2); + _childObject = new Scene2203(_vm, this, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + _vm->_soundMan->stopMusic(0x601C908C, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 3); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->stopMusic(0x601C908C, 0, 2); + _childObject = new Scene2205(_vm, this, which); + break; + case 5: + _vm->gameState().sceneNum = 5; + _vm->_soundMan->stopMusic(0x601C908C, 0, 2); + _childObject = new Scene2206(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + _childObject = new Scene2207(_vm, this); + break; + case 7: + if (which >= 0) + _vm->gameState().which = _vm->gameState().sceneNum; + _vm->gameState().sceneNum = 7; + _childObject = new Scene2208(_vm, this, which); + break; + case 8: + _vm->gameState().sceneNum = 8; + _childObject = new Scene2208(_vm, this, which); + break; + case 9: + _vm->gameState().sceneNum = 9; + createHallOfRecordsScene(which, 0x004B7180); + break; + case 10: + _vm->gameState().sceneNum = 10; + createHallOfRecordsScene(which, 0x004B7198); + break; + case 11: + _vm->gameState().sceneNum = 11; + createHallOfRecordsScene(which, 0x004B71B0); + break; + case 12: + _vm->gameState().sceneNum = 12; + createHallOfRecordsScene(which, 0x004B71C8); + break; + case 13: + _vm->gameState().sceneNum = 13; + createHallOfRecordsScene(which, 0x004B71E0); + break; + case 14: + _vm->gameState().sceneNum = 14; + createHallOfRecordsScene(which, 0x004B71F8); + break; + case 15: + _vm->gameState().sceneNum = 15; + createHallOfRecordsScene(which, 0x004B7210); + break; + case 16: + _vm->gameState().sceneNum = 16; + createHallOfRecordsScene(which, 0x004B7228); + break; + case 17: + _vm->gameState().sceneNum = 17; + createHallOfRecordsScene(which, 0x004B7240); + break; + case 18: + _vm->gameState().sceneNum = 18; + createHallOfRecordsScene(which, 0x004B7258); + break; + case 19: + _vm->gameState().sceneNum = 19; + createHallOfRecordsScene(which, 0x004B7270); + break; + case 20: + _vm->gameState().sceneNum = 20; + createHallOfRecordsScene(which, 0x004B7288); + break; + case 21: + _vm->gameState().sceneNum = 21; + createHallOfRecordsScene(which, 0x004B72A0); + break; + case 22: + _vm->gameState().sceneNum = 22; + createHallOfRecordsScene(which, 0x004B72B8); + break; + case 23: + _vm->gameState().sceneNum = 23; + createHallOfRecordsScene(which, 0x004B72D0); + break; + case 24: + _vm->gameState().sceneNum = 24; + createHallOfRecordsScene(which, 0x004B72E8); + break; + case 25: + _vm->gameState().sceneNum = 25; + createHallOfRecordsScene(which, 0x004B7300); + break; + case 26: + _vm->gameState().sceneNum = 26; + createHallOfRecordsScene(which, 0x004B7318); + break; + case 27: + _vm->gameState().sceneNum = 27; + createHallOfRecordsScene(which, 0x004B7330); + break; + case 28: + _vm->gameState().sceneNum = 28; + createHallOfRecordsScene(which, 0x004B7348); + break; + case 29: + _vm->gameState().sceneNum = 29; + createHallOfRecordsScene(which, 0x004B7360); + break; + case 30: + _vm->gameState().sceneNum = 30; + createHallOfRecordsScene(which, 0x004B7378); + break; + case 31: + _vm->gameState().sceneNum = 31; + createHallOfRecordsScene(which, 0x004B7390); + break; + case 32: + _vm->gameState().sceneNum = 32; + createHallOfRecordsScene(which, 0x004B73A8); + break; + case 33: + _vm->gameState().sceneNum = 33; + createHallOfRecordsScene(which, 0x004B73C0); + break; + case 34: + _vm->gameState().sceneNum = 34; + createHallOfRecordsScene(which, 0x004B73D8); + break; + case 35: + _vm->gameState().sceneNum = 35; + createHallOfRecordsScene(which, 0x004B73F0); + break; + case 36: + _vm->gameState().sceneNum = 36; + createHallOfRecordsScene(which, 0x004B7408); + break; + case 37: + _vm->gameState().sceneNum = 37; + createHallOfRecordsScene(which, 0x004B7420); + break; + case 38: + _vm->gameState().sceneNum = 38; + createHallOfRecordsScene(which, 0x004B7438); + break; + case 39: + _vm->gameState().sceneNum = 39; + createHallOfRecordsScene(which, 0x004B7450); + break; + case 40: + _vm->gameState().sceneNum = 40; + createHallOfRecordsScene(which, 0x004B7468); + break; + case 41: + _vm->gameState().sceneNum = 41; + _childObject = new Scene2242(_vm, this, which); + break; + case 42: + _vm->gameState().sceneNum = 42; + createHallOfRecordsScene(which, 0x004B7480); + break; + case 43: + _vm->gameState().sceneNum = 43; + createHallOfRecordsScene(which, 0x004B7498); + break; + case 44: + _vm->gameState().sceneNum = 44; + createHallOfRecordsScene(which, 0x004B74B0); + break; + case 45: + _vm->gameState().sceneNum = 45; + createHallOfRecordsScene(which, 0x004B74C8); + break; + case 46: + _vm->gameState().sceneNum = 46; + _childObject = new Scene2247(_vm, this, which); + break; + case 47: + _vm->gameState().sceneNum = 47; + if (!getGlobalVar(V_WORLDS_JOINED)) { + if (getGlobalVar(V_LIGHTS_ON)) + createStaticScene(0x83110287, 0x10283839); + else + createStaticScene(0x83412B9D, 0x12B9983C); + } else { + if (getGlobalVar(V_LIGHTS_ON)) + createStaticScene(0x48632087, 0x3208348E); + else + createStaticScene(0x08C74886, 0x74882084); + } + break; + } + SetUpdateHandler(&Module2200::updateScene); + _childObject->handleUpdate(); +} + +#define HallOfRecordsSceneLink(nextSceneNum, prevSceneNum) \ + if (_moduleResult == 1) createScene(nextSceneNum, 0); else if (_moduleResult == 2) createScene(7, 0); else createScene(prevSceneNum, 1) + +void Module2200::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(1, 0); + else + leaveModule(0); + break; + case 1: + createScene(0, 2); + break; + case 2: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 2) + createScene(3, 0); + else + createScene(0, 1); + break; + case 3: + createScene(2, 2); + break; + case 4: + if (_moduleResult == 1) + createScene(5, 0); + else if (_moduleResult == 2) + createScene(4, 2); + else + createScene(2, 1); + break; + case 5: + if (_moduleResult == 1) + createScene(46, 0); + else if (_moduleResult == 2) + createScene(6, 0); + else if (_moduleResult == 3) + createScene(8, 0); + else + createScene(4, 1); + break; + case 6: + createScene(5, 2); + break; + case 7: + createScene(_vm->gameState().which, 2); + break; + case 8: + createScene(5, 3); + break; + case 9: + HallOfRecordsSceneLink(10, 46); + break; + case 10: + HallOfRecordsSceneLink(11, 9); + break; + case 11: + HallOfRecordsSceneLink(12, 10); + break; + case 12: + HallOfRecordsSceneLink(13, 11); + break; + case 13: + HallOfRecordsSceneLink(14, 12); + break; + case 14: + HallOfRecordsSceneLink(15, 13); + break; + case 15: + HallOfRecordsSceneLink(16, 14); + break; + case 16: + HallOfRecordsSceneLink(17, 15); + break; + case 17: + HallOfRecordsSceneLink(18, 16); + break; + case 18: + HallOfRecordsSceneLink(19, 17); + break; + case 19: + HallOfRecordsSceneLink(20, 18); + break; + case 20: + HallOfRecordsSceneLink(21, 19); + break; + case 21: + HallOfRecordsSceneLink(22, 20); + break; + case 22: + HallOfRecordsSceneLink(23, 21); + break; + case 23: + HallOfRecordsSceneLink(24, 22); + break; + case 24: + HallOfRecordsSceneLink(25, 23); + break; + case 25: + HallOfRecordsSceneLink(26, 24); + break; + case 26: + HallOfRecordsSceneLink(27, 25); + break; + case 27: + HallOfRecordsSceneLink(28, 26); + break; + case 28: + HallOfRecordsSceneLink(29, 27); + break; + case 29: + HallOfRecordsSceneLink(30, 28); + break; + case 30: + HallOfRecordsSceneLink(31, 29); + break; + case 31: + HallOfRecordsSceneLink(32, 30); + break; + case 32: + HallOfRecordsSceneLink(33, 31); + break; + case 33: + HallOfRecordsSceneLink(34, 32); + break; + case 34: + HallOfRecordsSceneLink(42, 33); + break; + case 35: + HallOfRecordsSceneLink(36, 45); + break; + case 36: + HallOfRecordsSceneLink(37, 35); + break; + case 37: + HallOfRecordsSceneLink(38, 36); + break; + case 38: + HallOfRecordsSceneLink(39, 37); + break; + case 39: + HallOfRecordsSceneLink(40, 38); + break; + case 40: + HallOfRecordsSceneLink(41, 39); + break; + case 41: + HallOfRecordsSceneLink(47, 40); + break; + case 42: + HallOfRecordsSceneLink(43, 34); + break; + case 43: + HallOfRecordsSceneLink(44, 42); + break; + case 44: + HallOfRecordsSceneLink(45, 43); + break; + case 45: + HallOfRecordsSceneLink(35, 44); + break; + case 46: + HallOfRecordsSceneLink(9, 5); + break; + case 47: + createScene(41, 1); + break; + } + } +} + +#undef HallOfRecordsSceneLink + +void Module2200::createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId) { + _childObject = new HallOfRecordsScene(_vm, this, which, hallOfRecordsInfoId); +} + +// Scene2201 + +AsScene2201CeilingFan::AsScene2201CeilingFan(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + _x = 403; + _y = 259; + createSurface(100, 233, 96); + startAnimation(0x8600866, 0, -1); + SetUpdateHandler(&AnimatedSprite::update); +} + +AsScene2201Door::AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _ssDoorLight(ssDoorLight), _countdown(0), _isOpen(isOpen) { + + _x = 408; + _y = 290; + createSurface(900, 63, 266); + SetUpdateHandler(&AsScene2201Door::update); + SetMessageHandler(&AsScene2201Door::handleMessage); + if (_isOpen) { + startAnimation(0xE2CB0412, -1, -1); + _countdown = 48; + _newStickFrameIndex = STICK_LAST_FRAME; + } else { + startAnimation(0xE2CB0412, 0, -1); + _newStickFrameIndex = 0; + _ssDoorLight->setVisible(false); + } +} + +void AsScene2201Door::update() { + if (_countdown != 0 && _isOpen && (--_countdown == 0)) + stCloseDoor(); + AnimatedSprite::update(); +} + +uint32 AsScene2201Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x11001090) { + if (_isOpen) + _ssDoorLight->setVisible(true); + } else if (param.asInteger() == 0x11283090) { + if (!_isOpen) + _ssDoorLight->setVisible(false); + } + break; + case 0x2000: + if (_isOpen) + _countdown = 144; + messageResult = _isOpen ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + _countdown = 144; + if (!_isOpen) + stOpenDoor(); + break; + } + return messageResult; +} + +void AsScene2201Door::stOpenDoor() { + _isOpen = true; + startAnimation(0xE2CB0412, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + playSound(0, calcHash("fxDoorOpen33")); +} + +void AsScene2201Door::stCloseDoor() { + _isOpen = false; + startAnimation(0xE2CB0412, -1, -1); + _playBackwards = true; + _newStickFrameIndex = 0; + playSound(0, calcHash("fxDoorClose33")); +} + +SsScene2201PuzzleCube::SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex) + : StaticSprite(vm, 900) { + + createSurface(100, 16, 16); + loadSprite(kSsScene2201PuzzleCubeFileHashes[cubeIndex], kSLFCenteredDrawOffset | kSLFSetPosition, 0, + kSsScene2201PuzzleCubePoints[positionIndex].x, kSsScene2201PuzzleCubePoints[positionIndex].y); +} + +Scene2201::Scene2201(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isSoundPlaying(false) { + + Sprite *tempSprite; + + _vm->gameModule()->initCubeSymbolsPuzzle(); + + SetMessageHandler(&Scene2201::handleMessage); + SetUpdateHandler(&Scene2201::update); + + loadDataResource(0x04104242); + loadHitRectList(); + setBackground(0x40008208); + setPalette(0x40008208); + insertScreenMouse(0x0820C408); + + _asTape = insertSprite(this, 7, 1100, 459, 432, 0x9148A011); + addCollisionSprite(_asTape); + _ssDoorButton = insertSprite(this, 0xE4A43E29, 0xE4A43E29, 100, 0); + + for (uint32 cubeIndex = 0; cubeIndex < 9; cubeIndex++) + if ((int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex) >= 0) + insertSprite(cubeIndex, (int16)getSubVar(VA_CUBE_POSITIONS, cubeIndex)); + + _clipRects[0].y1 = 0; + _clipRects[0].x2 = 640; + _clipRects[1].x2 = 640; + _clipRects[1].y2 = 480; + + if (!getGlobalVar(V_TILE_PUZZLE_SOLVED)) + insertStaticSprite(0x00026027, 900); + + tempSprite = insertStaticSprite(0x030326A0, 1100); + _clipRects[0].x1 = tempSprite->getDrawRect().x; + insertStaticSprite(0x811DA061, 1100); + tempSprite = insertStaticSprite(0x11180022, 1100); + _clipRects[1].x1 = tempSprite->getDrawRect().x; + tempSprite = insertStaticSprite(0x0D411130, 1100); + _clipRects[0].y2 = tempSprite->getDrawRect().y2(); + _clipRects[1].y1 = tempSprite->getDrawRect().y2(); + _ssDoorLight = insertStaticSprite(0xA4062212, 900); + + if (which < 0) { + // Restoring game + insertKlaymen(300, 427, _clipRects, 2); + setMessageList(0x004B8118); + _asDoor = insertSprite(_klaymen, _ssDoorLight, false); + } else if (which == 1) { + // Klaymen entering from the back + insertKlaymen(412, 393, _clipRects, 2); + setMessageList(0x004B8130); + _asDoor = insertSprite(_klaymen, _ssDoorLight, false); + } else if (which == 2) { + // Klaymen returning from the puzzle + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(379, 427, _clipRects, 2); + _klaymen->setDoDeltaX(1); + } else + insertKlaymen(261, 427, _clipRects, 2); + setMessageList(0x004B8178); + _asDoor = insertSprite(_klaymen, _ssDoorLight, false); + } else { + // Klaymen entering from the left + NPoint pt = _dataResource.getPoint(0x0304D8DC); + insertKlaymen(pt.x, pt.y, _clipRects, 2); + setMessageList(0x004B8120); + _asDoor = insertSprite(_klaymen, _ssDoorLight, true); + } + + insertSprite(); + + _vm->_soundMan->addSound(0x04106220, 0x81212040); + +} + +Scene2201::~Scene2201() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); + _vm->_soundMan->deleteSoundGroup(0x04106220); +} + +void Scene2201::update() { + Scene::update(); + if (!_isSoundPlaying) { + _vm->_soundMan->playSoundLooping(0x81212040); + _isSoundPlaying = true; + } +} + +uint32 Scene2201::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssDoorButton); + else if (param.asInteger() == 0x35803198) { + if (sendMessage(_asDoor, 0x2000, 0)) + setMessageList(0x004B81A0); + else + setMessageList(0x004B81B8); + } else if (param.asInteger() == 0x51445010) { + if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) + setMessageList(0x004B8108); + else + setMessageList(0x004B8150); + } else if (param.asInteger() == 0x1D203082) + setMessageList(0x004B8180); + else if (param.asInteger() == 0x00049091) { + if (getGlobalVar(V_TILE_PUZZLE_SOLVED)) + setMessageList(0x004B8138); + else + setMessageList(0x004B8108); + } + break; + case 0x480B: + if (sender == _ssDoorButton) + sendMessage(_asDoor, 0x4808, 0); + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B81C8); + } + break; + } + return 0; +} + +static const NPoint kSsScene2202PuzzleCubePoints[] = { + {196, 105}, {323, 102}, {445, 106}, + {192, 216}, {319, 220}, {446, 216}, + {188, 320}, {319, 319}, {443, 322} +}; + +static const uint32 kSsScene2202PuzzleCubeFileHashes1[] = { + 0xA500800C, 0x2182910C, 0x2323980C, + 0x23049084, 0x21008080, 0x2303900C, + 0x6120980C, 0x2504D808 +}; + +static const uint32 kSsScene2202PuzzleCubeFileHashes2[] = { + 0x0AAD8080, 0x0A290291, 0x0A2BA398, + 0x822B8490, 0x86298080, 0x0A2B8390, + 0x0A69A098, 0x0E2D84D8 +}; + +SsScene2202PuzzleCube::SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol) + : StaticSprite(vm, 900), _parentScene(parentScene), _cubeSymbol(cubeSymbol), _cubePosition(cubePosition), _isMoving(false) { + + int surfacePriority; + + SetUpdateHandler(&SsScene2202PuzzleCube::update); + SetMessageHandler(&SsScene2202PuzzleCube::handleMessage); + if (_cubePosition >= 0 && _cubePosition <= 2) + surfacePriority = 100; + else if (_cubePosition >= 3 && _cubePosition <= 5) + surfacePriority = 300; + else + surfacePriority = 500; + loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset | kSLFSetPosition | kSLFDefCollisionBoundsOffset, 0, + kSsScene2202PuzzleCubePoints[_cubePosition].x, kSsScene2202PuzzleCubePoints[_cubePosition].y); + loadSound(0, 0x40958621); + loadSound(1, 0x51108241); +} + +void SsScene2202PuzzleCube::update() { + handleSpriteUpdate(); + updatePosition(); +} + +uint32 SsScene2202PuzzleCube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isMoving && !getGlobalVar(V_TILE_PUZZLE_SOLVED)) + sendMessage(_parentScene, 0x2000, _cubePosition); + messageResult = 1; + break; + case 0x2001: + _isMoving = true; + moveCube(param.asInteger()); + break; + } + return messageResult; +} + +void SsScene2202PuzzleCube::suMoveCubeX() { + + bool done = false; + + if (_counterDirection) { + if (_counter > 2) + _counter -= 2; + } else { + if (_counter < 20) + _counter += 2; + } + + for (int16 i = 0; i < _counter; i++) { + _x += _xIncr; + _errValue += _yDelta; + if (_errValue >= _xDelta) { + _errValue -= _xDelta; + _y += _yIncr; + } + if (_x == _newX && _y == _newY) { + done = true; + break; + } + if (_x == _xFlagPos) + _counterDirection = true; + } + + if (done) + stopMoving(); + + updateBounds(); + +} + +void SsScene2202PuzzleCube::suMoveCubeY() { + + bool done = false; + + if (_counterDirection) { + if (_counter > 2) + _counter -= 2; + } else { + if (_counter < 20) + _counter += 2; + } + + for (int16 i = 0; i < _counter; i++) { + _y += _yIncr; + _errValue += _xDelta; + if (_errValue >= _yDelta) { + _errValue -= _yDelta; + _x += _xIncr; + } + if (_x == _newX && _y == _newY) { + done = true; + break; + } + if (_x == _xFlagPos) + _counterDirection = true; + } + + if (done) + stopMoving(); + + updateBounds(); + +} + +void SsScene2202PuzzleCube::moveCube(int16 newCubePosition) { + + loadSprite(kSsScene2202PuzzleCubeFileHashes1[_cubeSymbol], kSLFCenteredDrawOffset); + + setSubVar(VA_CUBE_POSITIONS, _cubePosition, (uint32)-1); + setSubVar(VA_CUBE_POSITIONS, newCubePosition, (uint32)_cubeSymbol); + + _cubePosition = newCubePosition; + _errValue = 0; + _counterDirection = false; + _counter = 0; + _newX = kSsScene2202PuzzleCubePoints[newCubePosition].x; + _newY = kSsScene2202PuzzleCubePoints[newCubePosition].y; + + if (_x == _newX && _y == _newY) + return; + + if (_x <= _newX) { + if (_y <= _newY) { + _xDelta = _newX - _x; + _yDelta = _newY - _y; + _xIncr = 1; + _yIncr = 1; + } else { + _xDelta = _newX - _x; + _yDelta = _y - _newY; + _xIncr = 1; + _yIncr = -1; + } + } else { + if (_y <= _newY) { + _xDelta = _x - _newX; + _yDelta = _newY - _y; + _xIncr = -1; + _yIncr = 1; + } else { + _xDelta = _x - _newX; + _yDelta = _y - _newY; + _xIncr = -1; + _yIncr = -1; + } + } + + if (_xDelta > _yDelta) { + SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeX); + if (_xIncr > 0) { + if (_newX - _x >= 180) + _xFlagPos = _newX - 90; + else + _xFlagPos = _x + _newX / 2; + } else { + if (_x - _newX >= 180) + _xFlagPos = _x + 90; + else + _xFlagPos = _x / 2 + _newX; + } + playSound(0); + } else { + SetSpriteUpdate(&SsScene2202PuzzleCube::suMoveCubeY); + if (_yIncr > 0) { + if (_newY - _y >= 180) + _xFlagPos = _newY - 90; + else + _xFlagPos = _y + _newY / 2; + } else { + if (_y - _newY >= 180) + _xFlagPos = _y + 90; + else + _xFlagPos = _y / 2 + _newY; + } + playSound(1); + } + +} + +void SsScene2202PuzzleCube::stopMoving() { + loadSprite(kSsScene2202PuzzleCubeFileHashes2[_cubeSymbol], kSLFCenteredDrawOffset); + SetSpriteUpdate(NULL); + _isMoving = false; + sendMessage(_parentScene, 0x2002, _cubePosition); +} + +Scene2202::Scene2202(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isSolved(false), _leaveScene(false), _isCubeMoving(false), + _ssMovingCube(NULL), _ssDoneMovingCube(NULL) { + + _vm->gameModule()->initCubeSymbolsPuzzle(); + + SetMessageHandler(&Scene2202::handleMessage); + SetUpdateHandler(&Scene2202::update); + + setBackground(0x08100A0C); + setPalette(0x08100A0C); + addEntity(_palette); + insertPuzzleMouse(0x00A08089, 20, 620); + + for (uint32 cubePosition = 0; cubePosition < 9; cubePosition++) { + int16 cubeSymbol = (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition); + if (cubeSymbol >= 0) { + Sprite *puzzleCubeSprite = insertSprite(this, cubePosition, cubeSymbol); + addCollisionSprite(puzzleCubeSprite); + } + } + + insertStaticSprite(0x55C043B8, 200); + insertStaticSprite(0x85500158, 400); + insertStaticSprite(0x25547028, 600); + + loadSound(0, 0x68E25540); + loadSound(1, 0x40400457); + + _vm->_soundMan->addSound(0x60400854, 0x8101A241); + _vm->_soundMan->playSoundLooping(0x8101A241); + +} + +Scene2202::~Scene2202() { + _vm->_soundMan->deleteSoundGroup(0x60400854); +} + +void Scene2202::update() { + Scene::update(); + + if (_leaveScene && !isSoundPlaying(1)) + leaveScene(0); + + if (_isSolved && !isSoundPlaying(0)) { + playSound(1); + _isSolved = false; + _leaveScene = true; + } + + if (_ssMovingCube && !_isCubeMoving) { + int16 freeCubePosition = getFreeCubePosition(_movingCubePosition); + if (freeCubePosition != -1) { + setSurfacePriority(_ssMovingCube->getSurface(), 700); + sendMessage(_ssMovingCube, 0x2001, freeCubePosition); + _ssMovingCube = NULL; + _isCubeMoving = true; + } + } + + if (_ssDoneMovingCube) { + setSurfacePriority(_ssDoneMovingCube->getSurface(), _surfacePriority); + _ssDoneMovingCube = NULL; + if (testIsSolved()) { + playSound(0); + setGlobalVar(V_TILE_PUZZLE_SOLVED, 1); + _isSolved = true; + } + } + +} + +uint32 Scene2202::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + case 0x2000: + _movingCubePosition = (int16)param.asInteger(); + _ssMovingCube = (Sprite*)sender; + break; + case 0x2002: + _isCubeMoving = false; + _ssDoneMovingCube = (Sprite*)sender; + if (param.asInteger() <= 2) + _surfacePriority = 100; + else if (param.asInteger() >= 3 && param.asInteger() <= 5) + _surfacePriority = 300; + else + _surfacePriority = 500; + break; + } + return 0; +} + +int16 Scene2202::getFreeCubePosition(int16 cubePosition) { + if (cubePosition >= 3 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 3) == -1) + return cubePosition - 3; + else if (cubePosition <= 5 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 3) == -1) + return cubePosition + 3; + else if (cubePosition != 0 && cubePosition != 3 && cubePosition != 6 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition - 1) == -1) + return cubePosition - 1; + else if (cubePosition != 2 && cubePosition != 5 && cubePosition != 8 && (int16)getSubVar(VA_CUBE_POSITIONS, cubePosition + 1) == -1) + return cubePosition + 1; + else + return -1; +} + +bool Scene2202::testIsSolved() { + return + getSubVar(VA_CUBE_POSITIONS, 0) == 0 && + getSubVar(VA_CUBE_POSITIONS, 2) == 2 && + getSubVar(VA_CUBE_POSITIONS, 3) == 3 && + getSubVar(VA_CUBE_POSITIONS, 4) == 4 && + getSubVar(VA_CUBE_POSITIONS, 5) == 5 && + getSubVar(VA_CUBE_POSITIONS, 6) == 6 && + getSubVar(VA_CUBE_POSITIONS, 8) == 7; +} + +static const uint32 kAsCommonKeyFileHashes[] = { + 0x2450D850, 0x0C9CE8D0, 0x2C58A152 +}; + +AsCommonKey::AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y) + : AnimatedSprite(vm, kAsCommonKeyFileHashes[keyIndex], surfacePriority, x, y), _parentScene(parentScene), _keyIndex(keyIndex) { + + if (!getSubVar(VA_HAS_KEY, _keyIndex) && !getSubVar(VA_IS_KEY_INSERTED, _keyIndex)) { + SetMessageHandler(&AsCommonKey::handleMessage); + } else { + // If Klaymen already has the key or it's already inserted then don't show it + setVisible(false); + SetMessageHandler(NULL); + } +} + +uint32 AsCommonKey::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4806: + setSubVar(VA_HAS_KEY, _keyIndex, 1); + setVisible(false); + SetMessageHandler(NULL); + } + return messageResult; +} + +static const uint32 kAsScene2203DoorFileHashes[] = { + 0x7868AE10, 0x1A488110 +}; + +AsScene2203Door::AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _doorIndex(doorIndex) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2203Door::handleMessage); + _x = 320; + _y = 240; + createSurface1(kAsScene2203DoorFileHashes[_doorIndex], 900); + if (getGlobalVar(V_LARGE_DOOR_NUMBER) == _doorIndex) { + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + } else { + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 0, -1); + _newStickFrameIndex = 0; + } +} + +uint32 AsScene2203Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) + sendMessage(_parentScene, 0x2002, 0); + else + sendMessage(_parentScene, 0x2001, 0); + messageResult = 1; + break; + case 0x2000: + _otherDoor = (Sprite*)param.asEntity(); + break; + case 0x3002: + if (_doorIndex == getGlobalVar(V_LARGE_DOOR_NUMBER)) + sendMessage(_parentScene, 0x4808, 0); + stopAnimation(); + break; + case 0x4808: + setGlobalVar(V_LARGE_DOOR_NUMBER, _doorIndex); + sendMessage(_otherDoor, 0x4809, 0); + openDoor(); + break; + case 0x4809: + closeDoor(); + sendMessage(_parentScene, 0x2003, 0); + break; + } + return messageResult; +} + +void AsScene2203Door::openDoor() { + playSound(0, 0x341014C4); + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], 1, -1); +} + +void AsScene2203Door::closeDoor() { + startAnimation(kAsScene2203DoorFileHashes[_doorIndex], -1, -1); + _playBackwards = true; + _newStickFrameIndex = 0; +} + +Scene2203::Scene2203(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 1); + + SetMessageHandler(&Scene2203::handleMessage); + + setBackground(0x82C80334); + setPalette(0x82C80334); + insertScreenMouse(0x80330824); + setHitRects(0x004B8320); + setRectList(0x004B8420); + + if (getGlobalVar(V_KEY3_LOCATION) == 1) { + _asKey = insertSprite(this, 2, 1100, 282, 432); + addCollisionSprite(_asKey); + } + + _asTape = insertSprite(this, 1, 1100, 435, 432, 0x9148A011); + addCollisionSprite(_asTape); + _asLeftDoor = insertSprite(this, 0); + _asRightDoor = insertSprite(this, 1); + _ssSmallLeftDoor = insertStaticSprite(0x542CC072, 1100); + _ssSmallRightDoor = insertStaticSprite(0x0A2C0432, 1100); + _leftDoorClipRect.set(_ssSmallLeftDoor->getDrawRect().x, 0, 640, 480); + _rightDoorClipRect.set(0, 0, _ssSmallRightDoor->getDrawRect().x2(), 480); + sendEntityMessage(_asLeftDoor, 0x2000, _asRightDoor); + sendEntityMessage(_asRightDoor, 0x2000, _asLeftDoor); + addCollisionSprite(_asLeftDoor); + addCollisionSprite(_asRightDoor); + + if (which < 0) { + // Restoring game + insertKlaymen(200, 427); + setMessageList(0x004B8340); + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 427); + setMessageList(0x004B8350); + } else if (which == 2) { + // Klaymen returning from the displayer + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(362, 427); + _klaymen->setDoDeltaX(1); + } else + insertKlaymen(202, 427); + setMessageList(0x004B8358); + } else { + // Klaymen entering from the left + insertKlaymen(0, 427); + setMessageList(0x004B8348); + } + + if (getGlobalVar(V_LARGE_DOOR_NUMBER)) { + _ssSmallLeftDoor->setVisible(false); + _klaymen->setClipRect(_rightDoorClipRect); + } else { + _ssSmallRightDoor->setVisible(false); + _klaymen->setClipRect(_leftDoorClipRect); + } + +} + +Scene2203::~Scene2203() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2203::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + sendEntityMessage(_klaymen, 0x1014, sender); + if (sender == _asLeftDoor) + setMessageList2(0x004B83B0); + else + setMessageList2(0x004B83C8); + break; + case 0x2002: + if (sender == _asLeftDoor) + setMessageList2(0x004B8370); + else + setMessageList2(0x004B8360); + break; + case 0x2003: + if (sender == _asLeftDoor) + _ssSmallLeftDoor->setVisible(false); + else + _ssSmallRightDoor->setVisible(false); + break; + case 0x4808: + if (sender == _asLeftDoor) { + _ssSmallLeftDoor->setVisible(true); + _klaymen->setClipRect(_leftDoorClipRect); + } else { + _ssSmallRightDoor->setVisible(true); + _klaymen->setClipRect(_rightDoorClipRect); + } + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B83E0); + } else if (sender == _asKey) { + sendEntityMessage(_klaymen, 0x1014, _asKey); + setMessageList(0x004B83F0); + } + break; + } + return messageResult; +} + +SsScene2205DoorFrame::SsScene2205DoorFrame(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + SetMessageHandler(&SsScene2205DoorFrame::handleMessage); + createSurface(1100, 45, 206); + loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); +} + +uint32 SsScene2205DoorFrame::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + loadSprite(getGlobalVar(V_LIGHTS_ON) ? 0x24306227 : 0xD90032A0, kSLFDefDrawOffset | kSLFDefPosition); + break; + } + return messageResult; +} + +Scene2205::Scene2205(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene2205::handleMessage); + SetUpdateHandler(&Scene2205::update); + + setHitRects(0x004B0620); + if (getGlobalVar(V_LIGHTS_ON)) { + _isLightOn = true; + setBackground(0x0008028D); + setPalette(0x0008028D); + addEntity(_palette); + insertScreenMouse(0x80289008); + _ssLightSwitch = insertSprite(this, 0x2D339030, 0x2D309030, 100, 0); + } else { + _isLightOn = false; + setBackground(0xD00A028D); + setPalette(0xD00A028D); + addEntity(_palette); + insertScreenMouse(0xA0289D08); + _ssLightSwitch = insertSprite(this, 0x2D339030, 0xDAC86E84, 100, 0); + } + _palette->addBasePalette(0xD00A028D, 0, 256, 0); + _ssDoorFrame = insertSprite(); + + if (which < 0) { + // Restoring game + insertKlaymen(320, 417); + setMessageList(0x004B0658); + if (!getGlobalVar(V_LIGHTS_ON)) + _palette->addPalette(0x68033B1C, 0, 65, 0); + _isKlaymenInLight = false; + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 417); + setMessageList(0x004B0648); + if (!getGlobalVar(V_LIGHTS_ON)) + _palette->addPalette(0x68033B1C, 0, 65, 0); + _isKlaymenInLight = false; + } else { + // Klaymen entering from the left + insertKlaymen(0, 417); + setMessageList(0x004B0640); + _isKlaymenInLight = true; + } + + _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 640, 480); + _klaymen->setSoundFlag(true); + + loadDataResource(0x00144822); + +} + +void Scene2205::update() { + Scene::update(); + if (!_isLightOn && getGlobalVar(V_LIGHTS_ON)) { + _palette->addPalette(0x0008028D, 0, 256, 0); + changeBackground(0x0008028D); + _ssLightSwitch->setFileHashes(0x2D339030, 0x2D309030); + sendMessage(_ssDoorFrame, 0x2000, 0); + changeMouseCursor(0x80289008); + _isLightOn = true; + } else if (_isLightOn && !getGlobalVar(V_LIGHTS_ON)) { + _palette->addPalette(0xD00A028D, 0, 256, 0); + changeBackground(0xD00A028D); + _ssLightSwitch->setFileHashes(0x2D339030, 0xDAC86E84); + sendMessage(_ssDoorFrame, 0x2000, 0); + changeMouseCursor(0xA0289D08); + _isKlaymenInLight = true; + if (_klaymen->getX() > 85) { + _palette->addPalette(0x68033B1C, 0, 65, 0); + _isKlaymenInLight = false; + } + _isLightOn = false; + } + if (!getGlobalVar(V_LIGHTS_ON)) { + if (_isKlaymenInLight && _klaymen->getX() > 85) { + _palette->addBasePalette(0x68033B1C, 0, 65, 0); + _palette->startFadeToPalette(12); + _isKlaymenInLight = false; + } else if (!_isKlaymenInLight && _klaymen->getX() <= 85) { + _palette->addBasePalette(0xD00A028D, 0, 65, 0); + _palette->startFadeToPalette(12); + _isKlaymenInLight = true; + } + } +} + +uint32 Scene2205::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x6449569A) + setMessageList(0x004B0690); + else if (param.asInteger() == 0x2841369C) + setMessageList(0x004B0630); + else if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssLightSwitch); + break; + case 0x480B: + setGlobalVar(V_LIGHTS_ON, getGlobalVar(V_LIGHTS_ON) ? 0 : 1); + break; + } + return 0; +} + +static const int16 kScene2206XPositions[] = { + 384, 480, 572 +}; + +static const uint32 kScene2206MessageIds1[] = { + 0x004B8998, 0x004B89B8, 0x004B89D8 +}; + +static const uint32 kScene2206MessageIds2[] = { + 0x004B89F8, 0x004B8A20, 0x004B8A48 +}; + +static const int16 kAsScene2206DoorSpikesXDeltasOpen[] = { + -24, -28, -18, 6, 9, -8 +}; + +static const int16 kAsScene2206DoorSpikesXDeltasClose[] = { + -8, 7, 11, 26, 13, 14 +}; + +AsScene2206DoorSpikes::AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash) + : StaticSprite(vm, fileHash, 200) { + + if (getGlobalVar(V_SPIKES_RETRACTED)) + _x -= 63; + SetUpdateHandler(&AsScene2206DoorSpikes::update); + SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); + SetSpriteUpdate(NULL); +} + +void AsScene2206DoorSpikes::update() { + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene2206DoorSpikes::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4808: + _deltaIndex = 0; + playSound(0, 0x032746E0); + SetMessageHandler(NULL); + SetSpriteUpdate(&AsScene2206DoorSpikes::suOpen); + break; + case 0x4809: + _deltaIndex = 0; + playSound(0, 0x002642C0); + SetMessageHandler(NULL); + SetSpriteUpdate(&AsScene2206DoorSpikes::suClose); + break; + } + return messageResult; +} + +void AsScene2206DoorSpikes::suOpen() { + if (_deltaIndex < 6) { + _x += kAsScene2206DoorSpikesXDeltasOpen[_deltaIndex]; + _deltaIndex++; + } else { + SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); + SetSpriteUpdate(NULL); + } +} + +void AsScene2206DoorSpikes::suClose() { + if (_deltaIndex < 6) { + _x += kAsScene2206DoorSpikesXDeltasClose[_deltaIndex]; + _deltaIndex++; + } else { + SetMessageHandler(&AsScene2206DoorSpikes::handleMessage); + SetSpriteUpdate(NULL); + } +} + +AsScene2206Platform::AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash) + : StaticSprite(vm, fileHash, 50) { + + SetUpdateHandler(&AsScene2206Platform::update); + SetMessageHandler(&AsScene2206Platform::handleMessage); + SetSpriteUpdate(NULL); +} + +void AsScene2206Platform::update() { + handleSpriteUpdate(); + updatePosition(); +} + +uint32 AsScene2206Platform::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4803: + _yDelta = 0; + SetMessageHandler(NULL); + SetSpriteUpdate(&AsScene2206Platform::suMoveDown); + break; + } + return messageResult; +} + +void AsScene2206Platform::suMoveDown() { + _yDelta++; + _y += _yDelta; +} + +SsScene2206TestTube::SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash) + : StaticSprite(vm, fileHash, surfacePriority), _parentScene(parentScene) { + + if (getGlobalVar(V_HAS_TEST_TUBE)) { + setVisible(false); + SetMessageHandler(NULL); + } else + SetMessageHandler(&SsScene2206TestTube::handleMessage); + _collisionBoundsOffset = _drawOffset; + updateBounds(); +} + +uint32 SsScene2206TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x4806: + setGlobalVar(V_HAS_TEST_TUBE, 1); + setVisible(false); + SetMessageHandler(NULL); + break; + } + return messageResult; +} + +Scene2206::Scene2206(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + uint32 fileHash; + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&Scene2206::handleMessage); + + if (getGlobalVar(V_LIGHTS_ON)) { + fileHash = 0x41983216; + _sprite1 = insertStaticSprite(0x2201266A, 100); + _sprite2 = insertStaticSprite(0x3406A333, 300); + _sprite3 = insertStaticSprite(0x24A223A2, 100); + _asDoorSpikes = insertSprite(0x26133023); + _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); + setRectList(0x004B8AF8); + _ssButton = insertSprite(this, 0x0E038022, 100, 0); + insertScreenMouse(0x83212411); + _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x5E00E262); + _asPlatform = insertSprite(0x085E25E0); + } else { + fileHash = 0xE0102A45; + _sprite1 = insertStaticSprite(0x1C1106B8, 100); + _sprite2 = insertStaticSprite(0x020462E0, 300); + _sprite3 = insertStaticSprite(0x900626A2, 100); + _asDoorSpikes = insertSprite(0x544822A8); + _asDoorSpikes->setClipRect(_sprite2->getDrawRect().x, 0, 640, 480); + setRectList(0x004B8B58); + _ssButton = insertSprite(this, 0x16882608, 100, 0); + insertScreenMouse(0x02A41E09); + _ssTestTube = insertSprite(this, 1100, /*464, 433, */0x52032563); + _asPlatform = insertSprite(0x317831A0); + } + + _asPlatform->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + setBackground(fileHash); + setPalette(fileHash); + addEntity(_palette); + _palette->addBasePalette(fileHash, 0, 256, 0); + if (!getGlobalVar(V_LIGHTS_ON)) + _palette->addPalette(0x0263D144, 0, 65, 0); + addCollisionSprite(_ssTestTube); + + if (which < 0) { + // Restoring game + insertKlaymen(200, 430); + setMessageList(0x004B88A8); + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 430); + setMessageList(0x004B88B8); + } else if (which == 2) { + // Klaymen entering from the back + insertKlaymen(205, 396); + setMessageList(0x004B88C8); + _palette->addPalette(getGlobalVar(V_LIGHTS_ON) ? 0xB103B604 : 0x0263D144, 0, 65, 0); + klaymenBehindSpikes(); + playSound(0, 0x53B8284A); + } else if (which == 3) { + // Klaymen entering from reading a text column + insertKlaymen(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)], 430); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + setMessageList(0x004B8A70); + } else { + // Klaymen entering from the left + insertKlaymen(0, 430); + setMessageList(0x004B88B0); + } + + _klaymen->setSoundFlag(true); + _klaymen->setKlaymenIdleTable2(); + +} + +Scene2206::~Scene2206() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2206::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) + readClickedColumn(); + else if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x11C40840) { + if (getGlobalVar(V_SPIKES_RETRACTED)) + setMessageList(0x004B8948); + else + setMessageList(0x004B8970); + } + break; + case 0x4803: + sendMessage(_asPlatform, 0x4803, 0); + break; + case 0x480B: + if (sender == _ssButton) { + setGlobalVar(V_SPIKES_RETRACTED, getGlobalVar(V_SPIKES_RETRACTED) ? 0 : 1); + if (getGlobalVar(V_SPIKES_RETRACTED)) + sendMessage(_asDoorSpikes, 0x4808, 0); + else + sendMessage(_asDoorSpikes, 0x4809, 0); + } + break; + case 0x4826: + sendEntityMessage(_klaymen, 0x1014, _ssTestTube); + setMessageList(0x004B8988); + break; + case 0x482A: + klaymenBehindSpikes(); + break; + case 0x482B: + klaymenInFrontSpikes(); + break; + } + return messageResult; +} + +void Scene2206::klaymenInFrontSpikes() { + if (getGlobalVar(V_LIGHTS_ON)) { + _palette->addBasePalette(0x41983216, 0, 65, 0); + _palette->startFadeToPalette(12); + } + setSurfacePriority(_sprite1->getSurface(), 100); + setSurfacePriority(_sprite2->getSurface(), 300); + setSurfacePriority(_sprite3->getSurface(), 100); + setSurfacePriority(_asDoorSpikes->getSurface(), 200); + _klaymen->setClipRect(0, 0, 640, 480); +} + +void Scene2206::klaymenBehindSpikes() { + if (!getGlobalVar(V_LIGHTS_ON)) { + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); + } + setSurfacePriority(_sprite1->getSurface(), 1100); + setSurfacePriority(_sprite2->getSurface(), 1300); + setSurfacePriority(_sprite3->getSurface(), 1100); + setSurfacePriority(_asDoorSpikes->getSurface(), 1200); + _klaymen->setClipRect(_sprite2->getDrawRect().x, 0, _sprite3->getDrawRect().x2(), _sprite1->getDrawRect().y2()); +} + +void Scene2206::readClickedColumn() { + setGlobalVar(V_CLICKED_COLUMN_INDEX, (_mouseClickPos.x - 354) / 96); + if (getGlobalVar(V_CLICKED_COLUMN_INDEX) > 2) + setGlobalVar(V_CLICKED_COLUMN_INDEX, 2); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 183) / 7); + setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); + setGlobalVar(V_COLUMN_BACK_NAME, 0); + if (ABS(kScene2206XPositions[getGlobalVar(V_CLICKED_COLUMN_INDEX)] - _klaymen->getX()) >= 144) + setMessageList2(kScene2206MessageIds1[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); + else + setMessageList2(kScene2206MessageIds2[getGlobalVar(V_CLICKED_COLUMN_INDEX)]); +} + +static const uint32 kScene2207FileHashes[] = { + 0x33B1E12E, 0x33D1E12E, 0x3311E12E, + 0x3291E12E, 0x3191E12E, 0x3791E12E, + 0x3B91E12E, 0x2391E12E, 0x1391E12E, + 0x3BB1E12E, 0x23B1E12E, 0x13B1E12E +}; + +AsScene2207Elevator::AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 900), _parentScene(parentScene), _pointIndex(0), _destPointIndex(0), _destPointIndexDelta(0) { + + NPoint pt; + + _dataResource.load(0x00524846); + _pointArray = _dataResource.getPointArray(0x005B02B7); + pt = _dataResource.getPoint(0x403A82B1); + _x = pt.x; + _y = pt.y; + createSurface(1100, 129, 103); + startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, 0, 0); + _newStickFrameIndex = 0; + SetUpdateHandler(&AsScene2207Elevator::update); + SetMessageHandler(&AsScene2207Elevator::handleMessage); + SetSpriteUpdate(&AsScene2207Elevator::suSetPosition); +} + +AsScene2207Elevator::~AsScene2207Elevator() { + _vm->_soundMan->deleteSoundGroup(0x02700413); +} + +void AsScene2207Elevator::update() { + + if (_destPointIndex + _destPointIndexDelta > _pointIndex) { + _pointIndex++; + startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + _newStickFrameIndex = _pointIndex; + if (_destPointIndex + _destPointIndexDelta == _pointIndex) { + if (_destPointIndexDelta != 0) + _destPointIndexDelta = 0; + else { + _vm->_soundMan->deleteSound(0xD3B02847); + playSound(0, 0x53B8284A); + } + } + } + + if (_destPointIndex + _destPointIndexDelta < _pointIndex) { + _pointIndex--; + if (_pointIndex == 0) + sendMessage(_parentScene, 0x2003, 0); + startAnimation(getGlobalVar(V_LIGHTS_ON) ? 0xC858CC19 : 0x294B3377, _pointIndex, _pointIndex); + _newStickFrameIndex = _pointIndex; + if (_destPointIndex + _destPointIndexDelta == _pointIndex) { + if (_destPointIndexDelta != 0) + _destPointIndexDelta = 0; + else { + _vm->_soundMan->deleteSound(0xD3B02847); + playSound(0, 0x53B8284A); + } + } + } + + if (_pointIndex > 20 && _surface->getPriority() != 900) + sendMessage(_parentScene, 0x2002, 900); + else if (_pointIndex < 20 && _surface->getPriority() != 1100) + sendMessage(_parentScene, 0x2002, 1100); + + AnimatedSprite::update(); + + if (_destPointIndex + _destPointIndexDelta == _pointIndex && _isMoving) { + sendMessage(_parentScene, 0x2004, 0); + _isMoving = false; + } + +} + +void AsScene2207Elevator::suSetPosition() { + _x = (*_pointArray)[_pointIndex].x; + _y = (*_pointArray)[_pointIndex].y - 60; + updateBounds(); +} + +uint32 AsScene2207Elevator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + moveToY(param.asInteger()); + break; + } + return messageResult; +} + +void AsScene2207Elevator::moveToY(int16 y) { + int16 minDistance = 480; + + if (!_pointArray || _pointArray->size() == 0) + return; + + for (uint i = 0; i < _pointArray->size(); i++) { + int16 distance = ABS(y - (*_pointArray)[i].y); + if (distance < minDistance) { + minDistance = distance; + _destPointIndex = i; + } + } + + if (_destPointIndex != _pointIndex) { + if (_destPointIndex == 0 || _destPointIndex == (int)_pointArray->size() - 1) + _destPointIndexDelta = 0; + else if (_destPointIndex < _pointIndex) + _destPointIndexDelta = -2; + else + _destPointIndexDelta = 2; + _vm->_soundMan->addSound(0x02700413, 0xD3B02847); + _vm->_soundMan->playSoundLooping(0xD3B02847); + } + + _isMoving = true; + +} + +AsScene2207Lever::AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + _x = x; + _y = y; + createSurface(1010, 71, 73); + setDoDeltaX(doDeltaX); + startAnimation(0x80880090, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207Lever::handleMessage); +} + +uint32 AsScene2207Lever::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x4826, 0); + messageResult = 1; + break; + case 0x3002: + gotoNextState(); + stopAnimation(); + break; + case 0x4807: + stLeverUp(); + break; + case 0x480F: + stLeverDown(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +void AsScene2207Lever::stLeverDown() { + startAnimation(0x80880090, 1, -1); + playSound(0, 0x40581882); + FinalizeState(&AsScene2207Lever::stLeverDownEvent); +} + +void AsScene2207Lever::stLeverDownEvent() { + sendMessage(_parentScene, 0x480F, 0); +} + +void AsScene2207Lever::stLeverUp() { + startAnimation(0x80880090, 6, -1); + _playBackwards = true; + playSound(0, 0x40581882); + FinalizeState(&AsScene2207Lever::stLeverUpEvent); +} + +void AsScene2207Lever::stLeverUpEvent() { + sendMessage(_parentScene, 0x4807, 0); +} + +AsScene2207WallRobotAnimation::AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1200), _idle(true) { + + _x = 309; + _y = 320; + createSurface1(0xCCFD6090, 100); + startAnimation(0xCCFD6090, 0, -1); + _newStickFrameIndex = 0; + loadSound(1, 0x40330872); + loadSound(2, 0x72A2914A); + loadSound(3, 0xD4226080); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207WallRobotAnimation::handleMessage); +} + +AsScene2207WallRobotAnimation::~AsScene2207WallRobotAnimation() { + _vm->_soundMan->deleteSoundGroup(0x80D00820); +} + +uint32 AsScene2207WallRobotAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (!_idle) { + if (param.asInteger() == 0x3423093) { + _vm->_soundMan->addSound(0x80D00820, 0x12121943); + _vm->_soundMan->playSoundLooping(0x12121943); + } else if (param.asInteger() == 0x834AB011) { + stopSound(0); + stopSound(1); + stopSound(2); + stopSound(3); + _vm->_soundMan->deleteSound(0x12121943); + } else if (param.asInteger() == 0x3A980501) + playSound(1); + else if (param.asInteger() == 0x2A2AD498) + playSound(2); + else if (param.asInteger() == 0xC4980008) + playSound(3); + else if (param.asInteger() == 0x06B84228) + playSound(0, 0xE0702146); + } + break; + case 0x2006: + stStartAnimation(); + break; + case 0x2007: + stStopAnimation(); + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2207WallRobotAnimation::stStartAnimation() { + if (!_idle) { + NextState(NULL); + } else { + startAnimation(0xCCFD6090, 0, -1); + _idle = false; + setVisible(true); + } +} + +void AsScene2207WallRobotAnimation::stStopAnimation() { + NextState(&AsScene2207WallRobotAnimation::cbStopAnimation); +} + +void AsScene2207WallRobotAnimation::cbStopAnimation() { + stopAnimation(); + stopSound(0); + stopSound(1); + stopSound(2); + stopSound(3); + _vm->_soundMan->deleteSound(0x12121943); + _idle = true; + setVisible(false); +} + +AsScene2207WallCannonAnimation::AsScene2207WallCannonAnimation(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _idle(true) { + + _x = 309; + _y = 320; + createSurface1(0x8CAA0099, 100); + startAnimation(0x8CAA0099, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2207WallCannonAnimation::handleMessage); +} + +uint32 AsScene2207WallCannonAnimation::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2006: + stStartAnimation(); + break; + case 0x2007: + stStopAnimation(); + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2207WallCannonAnimation::stStartAnimation() { + if (!_idle) { + NextState(NULL); + } else { + setVisible(true); + startAnimation(0x8CAA0099, 0, -1); + _idle = false; + } +} + +void AsScene2207WallCannonAnimation::stStopAnimation() { + NextState(&AsScene2207WallCannonAnimation::cbStopAnimation); +} + +void AsScene2207WallCannonAnimation::cbStopAnimation() { + stopAnimation(); + setVisible(false); + _idle = true; +} + +SsScene2207Symbol::SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index) + : StaticSprite(vm, fileHash, 100) { + + _x = 330; + _y = 246 + index * 50; + updatePosition(); +} + +Scene2207::Scene2207(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule), _klaymenAtElevator(true), _elevatorSurfacePriority(0) { + + _vm->gameModule()->initCannonSymbolsPuzzle(); + + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x88460852)) + setSubVar(VA_IS_PUZZLE_INIT, 0x88460852, 1); + + SetMessageHandler(&Scene2207::handleMessage); + SetUpdateHandler(&Scene2207::update); + + insertKlaymen(0, 0); + _klaymen->setRepl(64, 0); + setMessageList(0x004B38E8); + _asElevator = insertSprite(this); + + if (getGlobalVar(V_LIGHTS_ON)) { + setBackground(0x88C00241); + setPalette(0x88C00241); + insertScreenMouse(0x00245884); + _ssMaskPart1 = insertStaticSprite(0xE20A28A0, 1200); + _ssMaskPart2 = insertStaticSprite(0x688F62A5, 1100); + _ssMaskPart3 = insertStaticSprite(0x0043B038, 1100); + _asTape = insertSprite(this, 4, 1100, 277, 428, 0x9148A011); + addCollisionSprite(_asTape); + _asLever = insertSprite(this, 527, 333, 0); + addCollisionSprite(_asLever); + _asWallRobotAnimation = insertSprite(this); + _asWallCannonAnimation = insertSprite(); + _asWallRobotAnimation->setVisible(false); + _asWallCannonAnimation->setVisible(false); + _ssButton = insertSprite(this, 0x2C4061C4, 100, 0); + _asLever->setClipRect(0, 0, _ssMaskPart3->getDrawRect().x2(), 480); + _klaymen->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); + _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, _ssMaskPart2->getDrawRect().y2()); + } else { + setGlobalVar(V_SEEN_SYMBOLS_NO_LIGHT, 1); + setBackground(0x05C02A55); + setPalette(0x05C02A55); + insertScreenMouse(0x02A51054); + _ssMaskPart1 = insertStaticSprite(0x980E46A4, 1200); + insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 0)], 0); + insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 1)], 1); + insertSprite(kScene2207FileHashes[getSubVar(VA_GOOD_CANNON_SYMBOLS_1, 2)], 2); + _asTape = NULL; + _asLever = NULL; + _asWallRobotAnimation = NULL; + _asWallCannonAnimation = NULL; + _ssButton = NULL; + _klaymen->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); + _asElevator->setClipRect(0, _ssMaskPart1->getDrawRect().y, 640, 480); + } + + _dataResource.load(0x00524846); + setRectList(0x004B38B8); + + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); + sendMessage(_asElevator, 0x2000, 480); + + loadSound(1, calcHash("fxFogHornSoft")); + +} + +void Scene2207::update() { + Scene::update(); + if (_elevatorSurfacePriority != 0) { + setSurfacePriority(_asElevator->getSurface(), _elevatorSurfacePriority); + _elevatorSurfacePriority = 0; + } + if (_klaymen->getY() == 423) + _klaymenAtElevator = _klaymen->getX() > 459 && _klaymen->getX() < 525; +} + +uint32 Scene2207::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0014F275) { + if (_klaymenAtElevator) { + sendMessage(_asElevator, 0x2000, _mouseClickPos.y); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); + } else + cancelMessageList(); + } else if (param.asInteger() == 0x34569073) { + if (_klaymenAtElevator) { + _isKlaymenBusy = true; + sendMessage(_asElevator, 0x2000, 0); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); + } else + cancelMessageList(); + } else if (param.asInteger() == 0x4054C877) { + if (_klaymenAtElevator) { + sendMessage(_asElevator, 0x2000, 480); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); + } else + cancelMessageList(); + } else if (param.asInteger() == 0x0CBC6211) { + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); + setRectList(0x004B38B8); + } else if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x231DA241) { + if (_ssButton) + setMessageList(0x004B38F0); + else + setMessageList(0x004B37D8); + } + break; + case 0x2002: + _elevatorSurfacePriority = param.asInteger(); + break; + case 0x2003: + _isKlaymenBusy = false; + break; + case 0x4807: + sendMessage(_asWallRobotAnimation, 0x2007, 0); + sendMessage(_asWallCannonAnimation, 0x2007, 0); + break; + case 0x480B: + if (sender == _ssButton) { + if (getSubVar(VA_LOCKS_DISABLED, 0x40119852)) { + setSubVar(VA_LOCKS_DISABLED, 0x40119852, 0); + playSound(0, calcHash("fx3LocksDisable")); + } else { + setSubVar(VA_LOCKS_DISABLED, 0x40119852, 1); + playSound(1); + } + } + break; + case 0x480F: + sendMessage(_asWallRobotAnimation, 0x2006, 0); + sendMessage(_asWallCannonAnimation, 0x2006, 0); + _asWallRobotAnimation->setVisible(true); + _asWallCannonAnimation->setVisible(true); + break; + case 0x4826: + if (sender == _asTape) { + if (_klaymen->getY() == 423) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B3958); + } + } else if (_klaymenAtElevator) { + SetMessageHandler(&Scene2207::handleMessage2); + sendMessage(_asElevator, 0x2000, 347); + sendEntityMessage(_klaymen, 0x1014, _asElevator); + sendMessage(_klaymen, 0x2001, 0); + } + break; + } + return messageResult; +} + +uint32 Scene2207::handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + _elevatorSurfacePriority = param.asInteger(); + break; + case 0x2004: + SetMessageHandler(&Scene2207::handleMessage); + sendMessage(_klaymen, 0x2005, 0); + sendEntityMessage(_klaymen, 0x1014, _asLever); + setMessageList(0x004B3920); + setRectList(0x004B3948); + break; + } + return messageResult; +} + +static const uint32 kScene2208FileHashes1[] = { + 0x041023CB, 0x041020CB, 0x041026CB, 0x04102ACB, + 0x041032CB, 0x041002CB +}; + +static const uint32 kScene2208FileHashes2[] = { + 0x091206C9, 0x091406C9, 0x091806C9, 0x090006C9, + 0x093006C9, 0x095006C9 +}; + +Scene2208::Scene2208(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _textResource(vm) { + + SpriteResource spriteResource(_vm); + const char *textStart, *textEnd; + + if (!getGlobalVar(V_COLUMN_TEXT_NAME)) + setGlobalVar(V_COLUMN_TEXT_NAME, calcHash("stLineagex")); + + _textResource.load(getGlobalVar(V_COLUMN_TEXT_NAME)); + + textStart = _textResource.getString(getGlobalVar(V_CLICKED_COLUMN_INDEX), textEnd); + while (textStart < textEnd) { + _strings.push_back(textStart); + textStart += strlen(textStart) + 1; + } + + _maxRowIndex = 8 + 10 * (3 - (getGlobalVar(V_COLUMN_TEXT_NAME) == calcHash("stLineagex") ? 1 : 0)); + + _background = new Background(_vm, 0); + _background->createSurface(0, 640, 528); + _background->getSpriteResource().getPosition().y = 480; + addBackground(_background); + setPalette(0x08100289); + addEntity(_palette); + insertPuzzleMouse(0x0028D089, 40, 600); + + _fontSurface = FontSurface::createFontSurface(_vm, 0x0800090C); + + _backgroundSurface = new BaseSurface(_vm, 0, 640, 480); + spriteResource.load(0x08100289, true); + _backgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); + + _topBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); + spriteResource.load(!getGlobalVar(V_COLUMN_BACK_NAME) + ? kScene2208FileHashes1[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6] + : getGlobalVar(V_COLUMN_BACK_NAME), true); + _topBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); + + _bottomBackgroundSurface = new BaseSurface(_vm, 0, 640, 192); + spriteResource.load(kScene2208FileHashes2[getGlobalVar(V_CLICKED_COLUMN_INDEX) % 6], true); + _bottomBackgroundSurface->drawSpriteResourceEx(spriteResource, false, false, 0, 0); + + SetUpdateHandler(&Scene2208::update); + SetMessageHandler(&Scene2208::handleMessage); + + _visibleRowsCount = 10; + _newRowIndex = (int16)getGlobalVar(V_CLICKED_COLUMN_ROW); + if (_newRowIndex + _visibleRowsCount > _maxRowIndex) + _newRowIndex = _maxRowIndex - _visibleRowsCount; + if (_newRowIndex < 6) + _newRowIndex = 0; + _rowScrollY = 0; + _backgroundScrollY = 48 * _newRowIndex; + _currRowIndex = _newRowIndex; + + for (int16 rowIndex = 0; rowIndex < _visibleRowsCount; rowIndex++) + drawRow(_newRowIndex + rowIndex); + + _background->getSurface()->getSysRect().y = _backgroundScrollY; + +} + +Scene2208::~Scene2208() { + delete _fontSurface; + delete _backgroundSurface; + delete _topBackgroundSurface; + delete _bottomBackgroundSurface; +} + +void Scene2208::update() { + + int16 mouseY = _vm->getMouseY(); + + if (mouseY < 48) { + if (_currRowIndex > 0) + _newRowIndex = _currRowIndex - 1; + } else if (mouseY > 432) { + if (_currRowIndex < _maxRowIndex - _visibleRowsCount) + _newRowIndex = _currRowIndex + 1; + } else { + if (_currRowIndex > _newRowIndex) + _newRowIndex = _currRowIndex; + } + + if (_currRowIndex < _newRowIndex) { + if (_rowScrollY == 0) + drawRow(_currRowIndex + _visibleRowsCount); + _backgroundScrollY += 4; + _rowScrollY += 4; + if (_rowScrollY == 48) { + _rowScrollY = 0; + _currRowIndex++; + } + _background->getSurface()->getSysRect().y = _backgroundScrollY; + } else if (_currRowIndex > _newRowIndex || _rowScrollY > 0) { + if (_rowScrollY == 0) { + drawRow(_currRowIndex - 1); + _currRowIndex--; + } + _backgroundScrollY -= 4; + if (_rowScrollY == 0) + _rowScrollY = 48; + _rowScrollY -= 4; + _background->getSurface()->getSysRect().y = _backgroundScrollY; + } + + Scene::update(); + +} + +uint32 Scene2208::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 40 || param.asPoint().x >= 600) + leaveScene(0); + break; + } + return messageResult; +} + +void Scene2208::drawRow(int16 rowIndex) { + NDrawRect sourceRect; + int16 y = (rowIndex * 48) % 528; + if (rowIndex < 4) { + sourceRect.x = 0; + sourceRect.y = y; + sourceRect.width = 640; + sourceRect.height = 48; + _background->getSurface()->copyFrom(_topBackgroundSurface->getSurface(), 0, y, sourceRect); + } else if (rowIndex > _maxRowIndex - 5) { + sourceRect.x = 0; + sourceRect.y = (rowIndex - _maxRowIndex + 4) * 48; + sourceRect.width = 640; + sourceRect.height = 48; + _background->getSurface()->copyFrom(_bottomBackgroundSurface->getSurface(), 0, y, sourceRect); + } else { + rowIndex -= 4; + sourceRect.x = 0; + sourceRect.y = (rowIndex * 48) % 480; + sourceRect.width = 640; + sourceRect.height = 48; + _background->getSurface()->copyFrom(_backgroundSurface->getSurface(), 0, y, sourceRect); + if (rowIndex < (int)_strings.size()) { + const char *text = _strings[rowIndex]; + _fontSurface->drawString(_background->getSurface(), 95, y, (const byte*)text); + } + } +} + +static const int16 kScene2242XPositions[] = { + 68, 158 +}; + +static const uint32 kScene2242MessageListIds2[] = { + 0x004B3CB8, 0x004B3CD8 +}; + +static const uint32 kScene2242MessageListIds1[] = { + 0x004B3CF8, 0x004B3D20 +}; + +Scene2242::Scene2242(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isKlaymenInLight(false) { + + SetMessageHandler(&Scene2242::handleMessage); + SetUpdateHandler(&Scene2242::update); + + if (getGlobalVar(V_LIGHTS_ON)) { + setBackground(0x11840E24); + setPalette(0x11840E24); + insertScreenMouse(0x40E20110); + setRectList(0x004B3DC8); + } else { + setBackground(0x25848E24); + setPalette(0x25848E24); + addEntity(_palette); + _palette->copyBasePalette(0, 256, 0); + _palette->addPalette(0x68033B1C, 0, 65, 0); + insertScreenMouse(0x48E20250); + setRectList(0x004B3E18); + } + + _asTape = insertSprite(this, 10, 1100, 464, 435, 0x9148A011); + addCollisionSprite(_asTape); + + if (which < 0) { + // Restoring game + insertKlaymen(200, 430); + setMessageList(0x004B3C18); + } else if (which == 1) { + // Klaymen entering from looking through the window + insertKlaymen(530, 430); + setMessageList(0x004B3D60); + } else if (which == 2) { + // Klaymen returning from reading a text column + insertKlaymen(kScene2242XPositions[!getGlobalVar(V_CLICKED_COLUMN_INDEX) ? 0 : 1], 430); + setMessageList(0x004B3D48); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + } else { + // Klaymen entering from the left + insertKlaymen(0, 430); + setMessageList(0x004B3C20); + } + + _klaymen->setSoundFlag(true); + +} + +Scene2242::~Scene2242() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +void Scene2242::update() { + if (!getGlobalVar(V_LIGHTS_ON)) { + if (_isKlaymenInLight && _klaymen->getX() < 440) { + _palette->addBasePalette(0x68033B1C, 0, 65, 0); + _palette->startFadeToPalette(12); + _isKlaymenInLight = false; + } else if (!_isKlaymenInLight && _klaymen->getX() >= 440) { + _palette->addBasePalette(0x25848E24, 0, 65, 0); + _palette->startFadeToPalette(12); + _isKlaymenInLight = true; + } + } + Scene::update(); +} + +uint32 Scene2242::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) + readClickedColumn(); + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B3D50); + } + break; + } + return messageResult; +} + +void Scene2242::readClickedColumn() { + int index; + if (_mouseClickPos.x < 108) { + setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188); + setGlobalVar(V_CLICKED_COLUMN_INDEX, 42); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart1")); + index = 0; + } else { + setGlobalVar(V_COLUMN_TEXT_NAME, 0x04290188); + setGlobalVar(V_CLICKED_COLUMN_INDEX, 43); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgRecPanelStart2")); + index = 1; + } + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); + if (ABS(_klaymen->getX() - kScene2242XPositions[index]) < 133) + setMessageList2(kScene2242MessageListIds1[index]); + else + setMessageList2(kScene2242MessageListIds2[index]); +} + +static const int16 kHallOfRecordsKlaymenXPos[] = { + 68, 157, 246, 335, + 424, 513, 602 +}; + +static const uint32 kHallOfRecordsSceneMessageListIds2[] = { + 0x004B2978, 0x004B2998, 0x004B29B8, 0x004B29D8, + 0x004B29F8, 0x004B2A18, 0x004B2A38 +}; + +static const uint32 kHallOfRecordsSceneMessageListIds1[] = { + 0x004B2A58, 0x004B2A80, 0x004B2AA8, 0x004B2AD0, + 0x004B2AF8, 0x004B2B20, 0x004B2B48 +}; + +HallOfRecordsScene::HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId) + : Scene(vm, parentModule) { + + _hallOfRecordsInfo = _vm->_staticData->getHallOfRecordsInfoItem(hallOfRecordsInfoId); + + SetMessageHandler(&HallOfRecordsScene::handleMessage); + SetUpdateHandler(&Scene::update); + + if (!getGlobalVar(V_LIGHTS_ON) && _hallOfRecordsInfo->bgFilename2) { + setRectList(0x004B2BF8); + setBackground(_hallOfRecordsInfo->bgFilename2); + setPalette(_hallOfRecordsInfo->bgFilename2); + insertScreenMouse(0x14320138); + } else { + setRectList(0x004B2BB8); + setBackground(_hallOfRecordsInfo->bgFilename1); + setPalette(_hallOfRecordsInfo->bgFilename1); + insertScreenMouse(0x63A40028); + } + + if (which < 0) { + // Restoring game + insertKlaymen(200, 430); + setMessageList(0x004B2900); + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 430); + setMessageList(0x004B2910); + } else if (which == 2) { + // Klaymen returning from reading a text column + insertKlaymen(kHallOfRecordsKlaymenXPos[getGlobalVar(V_CLICKED_COLUMN_INDEX) - _hallOfRecordsInfo->xPosIndex], 430); + setMessageList(0x004B2B70); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + } else { + // Klaymen entering from the left + insertKlaymen(0, 430); + setMessageList(0x004B2908); + } + + _klaymen->setSoundFlag(true); + _klaymen->setKlaymenIdleTable2(); + +} + +HallOfRecordsScene::~HallOfRecordsScene() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 HallOfRecordsScene::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) + readClickedColumn(); + break; + } + return messageResult; +} + +void HallOfRecordsScene::readClickedColumn() { + int16 index = (_mouseClickPos.x - 23) / 89; + if (index >= _hallOfRecordsInfo->count) + setMessageList2(0x004B2920); + else { + setGlobalVar(V_CLICKED_COLUMN_INDEX, _hallOfRecordsInfo->xPosIndex + index); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); + setGlobalVar(V_COLUMN_TEXT_NAME, _hallOfRecordsInfo->txFilename); + if (index == 0 && _hallOfRecordsInfo->bgFilename3) + setGlobalVar(V_COLUMN_BACK_NAME, _hallOfRecordsInfo->bgFilename3); + else + setGlobalVar(V_COLUMN_BACK_NAME, 0); + if (ABS(_klaymen->getX() - kHallOfRecordsKlaymenXPos[index]) < 133) + setMessageList2(kHallOfRecordsSceneMessageListIds1[index]); + else + setMessageList2(kHallOfRecordsSceneMessageListIds2[index]); + } +} + +static const int16 kScene2247XPositions[] = { + 513, 602 +}; + +static const uint32 kScene2247MessageListIds2[] = { + 0x004B54A0, 0x004B54C0 +}; + +static const uint32 kScene2247MessageListIds1[] = { + 0x004B54E0, 0x004B5508 +}; + +Scene2247::Scene2247(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene2247::handleMessage); + SetUpdateHandler(&Scene::update); + + if (getGlobalVar(V_LIGHTS_ON)) { + setRectList(0x004B5588); + setBackground(0x40339414); + setPalette(0x40339414); + insertScreenMouse(0x3941040B); + } else { + setRectList(0x004B55C8); + setBackground(0x071963E5); + setPalette(0x071963E5); + insertScreenMouse(0x14320138); + } + + if (which < 0) { + // Restoring game + insertKlaymen(200, 430); + setMessageList(0x004B5428); + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(640, 430); + setMessageList(0x004B5438); + } else if (which == 2) { + // Klaymen returning from reading a text column + insertKlaymen(kScene2247XPositions[getGlobalVar(V_COLUMN_TEXT_NAME) == 0x0008E486 ? 0 : 1], 430); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + setMessageList(0x004B5530); + } else { + // Klaymen entering from the left + insertKlaymen(0, 430); + setMessageList(0x004B5430); + } + + _klaymen->setSoundFlag(true); + +} + +Scene2247::~Scene2247() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2247::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x800C6694) + readClickedColumn(); + break; + } + return messageResult; +} + +void Scene2247::readClickedColumn() { + int index; + if (_mouseClickPos.x < 553) { + setGlobalVar(V_COLUMN_TEXT_NAME, 0x0008E486); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgFatherHeader")); + index = 0; + } else { + setGlobalVar(V_COLUMN_TEXT_NAME, 0x03086004); + setGlobalVar(V_COLUMN_BACK_NAME, calcHash("bgQuaterHeader")); + index = 1; + } + setGlobalVar(V_CLICKED_COLUMN_INDEX, 0); + setGlobalVar(V_CLICKED_COLUMN_ROW, (_mouseClickPos.y - 100) / 7); + if (ABS(_klaymen->getX() - kScene2247XPositions[index]) < 133) + setMessageList2(kScene2247MessageListIds1[index]); + else + setMessageList2(kScene2247MessageListIds2[index]); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2200.h b/engines/neverhood/modules/module2200.h new file mode 100644 index 0000000000..af7171dd53 --- /dev/null +++ b/engines/neverhood/modules/module2200.h @@ -0,0 +1,375 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2200_H +#define NEVERHOOD_MODULES_MODULE2200_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/graphics.h" + +namespace Neverhood { + +// Module2200 + +class Module2200 : public Module { +public: + Module2200(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2200(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); + void createHallOfRecordsScene(int which, uint32 hallOfRecordsInfoId); +}; + +// Scene2201 + +static const NPoint kSsScene2201PuzzleCubePoints[] = { + {305, 305}, {321, 305}, {336, 305}, {305, 319}, + {321, 319}, {336, 319}, {305, 332}, {321, 332}, + {336, 333} +}; + +static const uint32 kSsScene2201PuzzleCubeFileHashes[] = { + 0x88134A44, 0xAA124340, 0xB8124602, 0xA902464C, + 0x890A4244, 0xA8124642, 0xB812C204, 0x381A4A4C +}; + +class AsScene2201CeilingFan : public AnimatedSprite { +public: + AsScene2201CeilingFan(NeverhoodEngine *vm); +}; + +class AsScene2201Door : public AnimatedSprite { +public: + AsScene2201Door(NeverhoodEngine *vm, Klaymen *klaymen, Sprite *ssDoorLight, bool isOpen); +protected: + Klaymen *_klaymen; + Sprite *_ssDoorLight; + bool _isOpen; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stOpenDoor(); + void stCloseDoor(); +}; + +class SsScene2201PuzzleCube : public StaticSprite { +public: + SsScene2201PuzzleCube(NeverhoodEngine *vm, uint32 positionIndex, uint32 cubeIndex); +}; + +class Scene2201 : public Scene { +public: + Scene2201(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2201(); +protected: + NRect _clipRects[2]; + Sprite *_ssDoorLight; + Sprite *_asDoor; + Sprite *_ssDoorButton; + Sprite *_asTape; + bool _isSoundPlaying; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2202PuzzleCube : public StaticSprite { +public: + SsScene2202PuzzleCube(NeverhoodEngine *vm, Scene *parentScene, int16 cubePosition, int16 cubeSymbol); +protected: + Scene *_parentScene; + int16 _cubeSymbol; + int16 _cubePosition; + int16 _newX, _newY; + int16 _xDelta, _yDelta; + int16 _xIncr; + int16 _yIncr; + int16 _errValue; + int16 _counter; + int16 _xFlagPos; + bool _counterDirection; + bool _isMoving; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveCubeX(); + void suMoveCubeY(); + void moveCube(int16 newCubePosition); + void stopMoving(); +}; + +class Scene2202 : public Scene { +public: + Scene2202(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2202(); +protected: + Sprite *_ssMovingCube; + Sprite *_ssDoneMovingCube; + bool _isCubeMoving; + int16 _movingCubePosition; + int _surfacePriority; + bool _leaveScene; + bool _isSolved; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + int16 getFreeCubePosition(int16 index); + bool testIsSolved(); +}; + +class AsCommonKey : public AnimatedSprite { +public: + AsCommonKey(NeverhoodEngine *vm, Scene *parentScene, int keyIndex, int surfacePriority, int16 x, int16 y); +protected: + Scene *_parentScene; + int _keyIndex; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2203Door : public AnimatedSprite { +public: + AsScene2203Door(NeverhoodEngine *vm, Scene *parentScene, uint doorIndex); +protected: + Scene *_parentScene; + Sprite *_otherDoor; + uint _doorIndex; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void openDoor(); + void closeDoor(); +}; + +class Scene2203 : public Scene { +public: + Scene2203(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2203(); +protected: + Sprite *_asLeftDoor; + Sprite *_asRightDoor; + Sprite *_ssSmallLeftDoor; + Sprite *_ssSmallRightDoor; + Sprite *_asTape; + Sprite *_asKey; + NRect _leftDoorClipRect; + NRect _rightDoorClipRect; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2205DoorFrame : public StaticSprite { +public: + SsScene2205DoorFrame(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2205 : public Scene { +public: + Scene2205(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + SsCommonPressButton *_ssLightSwitch; + Sprite *_ssDoorFrame; + bool _isKlaymenInLight; + bool _isLightOn; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2206DoorSpikes : public StaticSprite { +public: + AsScene2206DoorSpikes(NeverhoodEngine *vm, uint32 fileHash); +protected: + int _deltaIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suOpen(); + void suClose(); +}; + +class AsScene2206Platform : public StaticSprite { +public: + AsScene2206Platform(NeverhoodEngine *vm, uint32 fileHash); +protected: + int16 _yDelta; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveDown(); +}; + +class SsScene2206TestTube : public StaticSprite { +public: + SsScene2206TestTube(NeverhoodEngine *vm, Scene *parentScene, int surfacePriority, uint32 fileHash); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2206 : public Scene { +public: + Scene2206(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2206(); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_asDoorSpikes; + Sprite *_ssButton; + Sprite *_asPlatform; + Sprite *_ssTestTube; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void klaymenInFrontSpikes(); + void klaymenBehindSpikes(); + void readClickedColumn(); +}; + +class AsScene2207Elevator : public AnimatedSprite { +public: + AsScene2207Elevator(NeverhoodEngine *vm, Scene *parentScene); + ~AsScene2207Elevator(); +protected: + Scene *_parentScene; + NPointArray *_pointArray; + int16 _pointIndex; + int16 _destPointIndex, _destPointIndexDelta; + bool _isMoving; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suSetPosition(); + void moveToY(int16 y); +}; + +class AsScene2207Lever : public AnimatedSprite { +public: + AsScene2207Lever(NeverhoodEngine *vm, Scene *parentScene, int16 x, int16 y, int doDeltaX); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stLeverDown(); + void stLeverDownEvent(); + void stLeverUp(); + void stLeverUpEvent(); +}; + +class AsScene2207WallRobotAnimation : public AnimatedSprite { +public: + AsScene2207WallRobotAnimation(NeverhoodEngine *vm, Scene *parentScene); + ~AsScene2207WallRobotAnimation(); +protected: + bool _idle; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stStartAnimation(); + void stStopAnimation(); + void cbStopAnimation(); +}; + +class AsScene2207WallCannonAnimation : public AnimatedSprite { +public: + AsScene2207WallCannonAnimation(NeverhoodEngine *vm); +protected: + bool _idle; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stStartAnimation(); + void stStopAnimation(); + void cbStopAnimation(); +}; + +class SsScene2207Symbol : public StaticSprite { +public: + SsScene2207Symbol(NeverhoodEngine *vm, uint32 fileHash, int index); +}; + +class Scene2207 : public Scene { +public: + Scene2207(NeverhoodEngine *vm, Module *parentModule); +protected: + Sprite *_asElevator; + Sprite *_ssMaskPart1; + Sprite *_ssMaskPart2; + Sprite *_ssMaskPart3; + Sprite *_asTape; + Sprite *_asLever; + Sprite *_asWallRobotAnimation; + Sprite *_asWallCannonAnimation; + Sprite *_ssButton; + int _elevatorSurfacePriority; + bool _klaymenAtElevator; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 handleMessage2(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2208 : public Scene { +public: + Scene2208(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2208(); +protected: + FontSurface *_fontSurface; + BaseSurface *_backgroundSurface; + BaseSurface *_topBackgroundSurface; + BaseSurface *_bottomBackgroundSurface; + TextResource _textResource; + int16 _backgroundScrollY; + int16 _newRowIndex; + int16 _currRowIndex; + int16 _rowScrollY; + int16 _maxRowIndex; + int16 _visibleRowsCount; + Common::Array _strings; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void drawRow(int16 rowIndex); +}; + +class Scene2242 : public Scene { +public: + Scene2242(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2242(); +protected: + Sprite *_asTape; + bool _isKlaymenInLight; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void readClickedColumn(); +}; + +class HallOfRecordsScene : public Scene { +public: + HallOfRecordsScene(NeverhoodEngine *vm, Module *parentModule, int which, uint32 hallOfRecordsInfoId); + ~HallOfRecordsScene(); +protected: + HallOfRecordsInfo *_hallOfRecordsInfo; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void readClickedColumn(); +}; + +class Scene2247 : public Scene { +public: + Scene2247(NeverhoodEngine *vm, Module *parentModule, int which); + ~Scene2247(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void readClickedColumn(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2200_H */ diff --git a/engines/neverhood/modules/module2300.cpp b/engines/neverhood/modules/module2300.cpp new file mode 100644 index 0000000000..34eca14bea --- /dev/null +++ b/engines/neverhood/modules/module2300.cpp @@ -0,0 +1,186 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2300.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +static const uint32 kModule2300SoundList[] = { + 0x90805C50, 0x90804450, 0xB4005E60, 0x91835066, + 0x90E14440, 0x90F0D1C3, 0 +}; + +Module2300::Module2300(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundVolume(0) { + + _vm->_soundMan->addSoundList(0x1A214010, kModule2300SoundList); + _vm->_soundMan->setSoundListParams(kModule2300SoundList, true, 50, 600, 10, 150); + + _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; + + if (_isWallBroken) { + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); + _vm->_soundMan->playSoundLooping(0x90F0D1C3); + } else { + _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 0, 0, 0, 0); + } + + _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->playTwoSounds(0x1A214010, 0x41861371, 0x43A2507F, 0); + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 1) + createScene(2, 0); + else if (which == 2) + createScene(3, 0); + else if (which == 3) + createScene(4, -1); + else if (which == 4) + createScene(1, 3); + else + createScene(0, 1); + +} + +Module2300::~Module2300() { + _vm->_soundMan->deleteGroup(0x1A214010); +} + +void Module2300::createScene(int sceneNum, int which) { + debug("Module2300::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + createNavigationScene(0x004B67B8, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + createNavigationScene(0x004B67E8, which); + if (_isWallBroken) { + _soundVolume = 15; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 15); + } + break; + case 2: + _vm->gameState().sceneNum = 2; + createNavigationScene(0x004B6878, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + if (getGlobalVar(V_WALL_BROKEN)) + createNavigationScene(0x004B68F0, which); + else { + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); + createNavigationScene(0x004B68A8, which); + if (_isWallBroken) { + _soundVolume = 87; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 87); + } + } + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->setTwoSoundsPlayFlag(true); + createSmackerScene(0x20080A0B, true, true, false); + break; + case 9999: + createDemoScene(); + break; + } + SetUpdateHandler(&Module2300::updateScene); + _childObject->handleUpdate(); +} + +void Module2300::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(1, 4); + else + leaveModule(0); + break; + case 1: + if (_moduleResult == 1) + createScene(0, 0); + else if (_vm->isDemo()) + createScene(9999, 0); + else if (_moduleResult == 2) + createScene(2, 1); + else if (_moduleResult == 3) + createScene(1, 3); + else if (_moduleResult == 4) + createScene(3, 1); + else if (_moduleResult == 5) + leaveModule(3); + else + leaveModule(4); + break; + case 2: + if (_moduleResult == 1) + leaveModule(1); + else + createScene(1, 5); + break; + case 3: + if (_moduleResult == 1) + leaveModule(2); + else + createScene(1, 1); + break; + case 4: + _vm->_soundMan->setTwoSoundsPlayFlag(false); + createScene(1, 2); + break; + case 9999: + createScene(1, -1); + break; + } + } else { + switch (_sceneNum) { + case 1: + if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 4 && + navigationScene()->getFrameNumber() % 2) { + _soundVolume++; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); + } + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0 && + navigationScene()->getFrameNumber() == 50) { + _vm->_soundMan->playTwoSounds(0x1A214010, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); + } + break; + case 3: + if (_isWallBroken && navigationScene()->isWalkingForward() && navigationScene()->getFrameNumber() % 2) { + _soundVolume--; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); + } + break; + } + } +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2300.h b/engines/neverhood/modules/module2300.h new file mode 100644 index 0000000000..0a1e1d57a4 --- /dev/null +++ b/engines/neverhood/modules/module2300.h @@ -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 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2300_H +#define NEVERHOOD_MODULES_MODULE2300_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2300 + +class Module2300 : public Module { +public: + Module2300(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2300(); +protected: + int _sceneNum; + bool _isWallBroken; + int _soundVolume; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2300_H */ diff --git a/engines/neverhood/modules/module2400.cpp b/engines/neverhood/modules/module2400.cpp new file mode 100644 index 0000000000..450812a5f3 --- /dev/null +++ b/engines/neverhood/modules/module2400.cpp @@ -0,0 +1,992 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2400.h" + +namespace Neverhood { + +Module2400::Module2400(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + _vm->_soundMan->addMusic(0x202D1010, 0xB110382D); + + if (which < 0) + createScene(_vm->gameState().sceneNum, _vm->gameState().which); + else + createScene(0, 0); + +} + +Module2400::~Module2400() { + _vm->_soundMan->deleteMusicGroup(0x202D1010); +} + +void Module2400::createScene(int sceneNum, int which) { + debug("Module2400::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->_soundMan->stopMusic(0xB110382D, 0, 0); + _childObject = new Scene2401(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->_soundMan->startMusic(0xB110382D, 0, 2); + _childObject = new Scene2402(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->startMusic(0xB110382D, 0, 0); + _childObject = new Scene2403(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->stopMusic(0xB110382D, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 0); + break; + case 5: + _vm->gameState().sceneNum = 5; + _vm->_soundMan->startMusic(0xB110382D, 0, 2); + _childObject = new Scene2406(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->_soundMan->stopMusic(0xB110382D, 0, 2); + createSmackerScene(0x20D80001, true, true, false); + break; + case 7: + _vm->gameState().sceneNum = 7; + createStaticScene(0x81523218, 0x2321C81D); + break; + case 8: + _vm->gameState().sceneNum = 8; + createStaticScene(0x08100210, 0x00214089); + break; + case 9: + _vm->gameState().sceneNum = 9; + createStaticScene(0x8C020505, 0x205018C8); + break; + } + SetUpdateHandler(&Module2400::updateScene); + _childObject->handleUpdate(); +} + +void Module2400::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(1, 0); + else + leaveModule(0); + break; + case 1: + if (_moduleResult == 1) + createScene(5, 0); + else if (_moduleResult == 2) + createScene(7, -1); + else + createScene(0, 1); + break; + case 2: + if (_moduleResult == 1) + createScene(9, -1); + else if (_moduleResult == 2) + createScene(6, -1); + else + createScene(5, 1); + break; + case 4: + createScene(5, 2); + break; + case 5: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(4, 0); + else if (_moduleResult == 3) + createScene(8, -1); + else + createScene(1, 1); + break; + case 6: + createScene(2, 2); + break; + case 7: + createScene(1, 2); + break; + case 8: + createScene(5, 3); + break; + case 9: + createScene(2, 1); + break; + } + } +} + +static const NPoint kScene2401Points[] = { + {384, 389}, {406, 389}, {429, 389}, + {453, 389}, {477, 389} +}; + +static const uint32 kScene2401FileHashes1[] = { + 0x02842920, 0x02882920, 0x02902920, + 0x02A02920, 0x02C02920, 0x02002920, + 0x03802920, 0x00802920, 0x06802920, + 0x03842920 +}; + +static const uint32 kScene2401FileHashes2[] = { + 0xD0910020, 0xD0910038, 0xD0910008, + 0xD0910068, 0xD09100A8, 0 +}; + +static const uint32 kScene2401FileHashes3[] = { + 0xD0910020, 0xD0910038, 0xD0910008, + 0xD0910068, 0xD09100A8, 0 +}; + +static const NRect kScene2401Rects[] = { + NRect(369, 331, 394, 389), + NRect(395, 331, 419, 389), + NRect(420, 331, 441, 389), + NRect(442, 331, 464, 389), + NRect(465, 331, 491, 389) +}; + +static const uint32 kAsScene2401WaterSpitFileHashes2[] = { + 0x5C044690, 0x5C644690, 0x5CA44690, + 0x5D244690, 0x5E244690 +}; + +static const uint32 kAsScene2401WaterSpitFileHashes1[] = { + 0xF4418408, 0xF4418808, 0xF4419008, + 0xF441A008, 0xCD4F8411 +}; + +AsScene2401WaterSpit::AsScene2401WaterSpit(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200) { + + _x = 240; + _y = 447; + createSurface(100, 146, 74); + setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2401WaterSpit::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); +} + +uint32 AsScene2401WaterSpit::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x120A0013) + playSound(0, kAsScene2401WaterSpitFileHashes1[_soundIndex]); + break; + case 0x2000: + _x = 240; + _y = 447; + _soundIndex = getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()); + startAnimation(kAsScene2401WaterSpitFileHashes2[param.asInteger()], 0, -1); + setVisible(true); + playSound(0, 0x48640244); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene2401FlowingWater::AsScene2401FlowingWater(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200), _isWaterFlowing(false) { + + _x = 88; + _y = 421; + createSurface1(0x10203116, 100); + setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2401FlowingWater::handleMessage); +} + +AsScene2401FlowingWater::~AsScene2401FlowingWater() { + _vm->_soundMan->deleteSoundGroup(0x40F11C09); +} + +uint32 AsScene2401FlowingWater::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_isWaterFlowing && param.asInteger() == 0x02421405) + startAnimationByHash(0x10203116, 0x01084280, 0); + break; + case 0x2002: + if (!_isWaterFlowing) { + _vm->_soundMan->addSound(0x40F11C09, 0x980C1420); + _vm->_soundMan->playSoundLooping(0x980C1420); + startAnimation(0x10203116, 0, -1); + setVisible(true); + _isWaterFlowing = true; + } + break; + case 0x2003: + _vm->_soundMan->deleteSound(0x980C1420); + _isWaterFlowing = false; + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene2401WaterFlushing::AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y) + : AnimatedSprite(vm, 1200), _countdown(0), _flushLoopCount(0) { + + _x = x; + _y = y; + createSurface1(0xB8596884, 100); + setVisible(false); + SetUpdateHandler(&AsScene2401WaterFlushing::update); + SetMessageHandler(&AsScene2401WaterFlushing::handleMessage); +} + +void AsScene2401WaterFlushing::update() { + if (_countdown != 0 && (--_countdown) == 0) { + setDoDeltaX(_vm->_rnd->getRandomNumber(1)); + startAnimation(0xB8596884, 0, -1); + setVisible(true); + } + AnimatedSprite::update(); +} + +uint32 AsScene2401WaterFlushing::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (_flushLoopCount > 0 && param.asInteger() == 0x02421405) { + startAnimationByHash(0xB8596884, 0x01084280, 0); + _flushLoopCount--; + } + break; + case 0x2002: + if (param.asInteger() > 0) { + _flushLoopCount = param.asInteger() - 1; + _countdown = _vm->_rnd->getRandomNumber(3) + 1; + } + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +AsScene2401Door::AsScene2401Door(NeverhoodEngine *vm, bool isOpen) + : AnimatedSprite(vm, 1100), _countdown(0), _isOpen(isOpen) { + + _x = 320; + _y = 240; + createSurface1(0x44687810, 100); + _newStickFrameIndex = STICK_LAST_FRAME; + if (_isOpen) { + stopAnimation(); + setVisible(false); + _countdown = 48; + } else { + startAnimation(0x44687810, 0, -1); + _newStickFrameIndex = 0; + } + SetUpdateHandler(&AsScene2401Door::update); + SetMessageHandler(&AsScene2401Door::handleMessage); +} + +void AsScene2401Door::update() { + if (_isOpen && _countdown != 0 && (--_countdown) == 0) { + _isOpen = false; + setVisible(true); + startAnimation(0x44687810, -1, -1); + _newStickFrameIndex = 0; + _playBackwards = true; + playSound(0, calcHash("fxDoorClose38")); + } + AnimatedSprite::update(); +} + +uint32 AsScene2401Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + if (_isOpen) + _countdown = 168; + messageResult = _isOpen ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + if (!_isOpen) { + _countdown = 168; + _isOpen = true; + setVisible(true); + startAnimation(0x44687810, 0, -1); + playSound(0, calcHash("fxDoorOpen38")); + NextState(&AsScene2401Door::stDoorOpenFinished); + } + break; + } + return messageResult; +} + +void AsScene2401Door::stDoorOpenFinished() { + stopAnimation(); + setVisible(false); +} + +Scene2401::Scene2401(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _unkFlag(false), + _soundToggle(false), _asWaterSpitIndex(0) { + + _vm->gameModule()->initWaterPipesPuzzle(); + + SetMessageHandler(&Scene2401::handleMessage); + SetUpdateHandler(&Scene2401::update); + + setRectList(0x004B3140); + setBackground(0x8C030206); + setPalette(0x8C030206); + addEntity(_palette); + _palette->addBasePalette(0x8C030206, 0, 256, 0); + _palette->addPalette(0x91D3A391, 0, 65, 0); + insertScreenMouse(0x302028C8); + + _sprite1 = insertStaticSprite(0x2E068A23, 200); + insertStaticSprite(0x401410A6, 200); + _asFlowingWater = insertSprite(); + insertStaticSprite(0x90C0A4B4, 200); + _ssButton = insertSprite(this, 0x0092916A, 100, 0); + _ssFloorButton = insertSprite(this, 0x28001120, 0x00911068, 100, 0); + + for (uint i = 0; i < 5; i++) + _asWaterFlushing[i] = insertSprite(kScene2401Points[i].x, kScene2401Points[i].y); + + for (uint i = 0; i < 10; i++) { + _ssWaterPipes[i] = insertStaticSprite(kScene2401FileHashes1[i], 300); + _ssWaterPipes[i]->setVisible(false); + } + + _asWaterSpit[0] = insertSprite(); + _asWaterSpit[1] = insertSprite(); + + if (which < 0) { + // Restoring game + insertKlaymen(200, 447); + setMessageList(0x004B2F70); + _asDoor = insertSprite(false); + } else if (which == 1) { + // Klaymen entering from the back + insertKlaymen(280, 413); + setMessageList(0x004B2F80); + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->addPalette(0xB103B604, 0, 65, 0); + _asDoor = insertSprite(true); + } else { + // Klaymen entering from the left + insertKlaymen(-20, 447); + setMessageList(0x004B2F78); + _asDoor = insertSprite(false); + } + +} + +void Scene2401::update() { + + if (_countdown1 != 0 && (--_countdown1) == 0) { + if (_pipeStatus > 0 && _pipeStatus <= 10) + _ssWaterPipes[_pipeStatus - 1]->setVisible(false); + if (_pipeStatus >= 10) { + bool puzzleSolved = true, waterInside = false; + for (uint pipeIndex = 0; pipeIndex < 5; pipeIndex++) { + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != getSubVar(VA_GOOD_WATER_PIPES_LEVEL, pipeIndex)) + puzzleSolved = false; + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, pipeIndex) != 0) + waterInside = true; + } + if (puzzleSolved) { + setGlobalVar(V_NOTES_DOOR_UNLOCKED, 1); + setGlobalVar(V_NOTES_PUZZLE_SOLVED, 1); + sendMessage(_asDoor, 0x4808, 0); + } else if (waterInside) { + playPipeSound(0xD0431020); + for (uint i = 0; i < 5; i++) { + sendMessage(_asWaterFlushing[i], 0x2002, getSubVar(VA_CURR_WATER_PIPES_LEVEL, i)); + setSubVar(VA_CURR_WATER_PIPES_LEVEL, i, 0); + } + } + } else if (_pipeStatus >= 5) { + _ssWaterPipes[_pipeStatus]->setVisible(true); + _countdown1 = 8; + playPipeSound(kScene2401FileHashes3[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); + } else { + _ssWaterPipes[_pipeStatus]->setVisible(true); + _countdown1 = _pipeStatus == 4 ? 16 : 8; + playPipeSound(kScene2401FileHashes3[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]); + } + _pipeStatus++; + } + + if (_countdown2 != 0 && (--_countdown2) == 0) + sendMessage(_asFlowingWater, 0x2003, 0); + + Scene::update(); + +} + +uint32 Scene2401::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x02144CB1) + sendEntityMessage(_klaymen, 0x1014, _ssFloorButton); + else if (param.asInteger() == 0x11C40840) { + if (getGlobalVar(V_NOTES_DOOR_UNLOCKED) && sendMessage(_asDoor, 0x2004, 0)) + setMessageList(0x004B3090); + else + setMessageList(0x004B30B0); + } else if (param.asInteger() == 0x412722C0) { + if (_countdown2 > 0 && getGlobalVar(V_HAS_TEST_TUBE)) { + _countdown2 = 144; + setMessageList(0x004B3020); + } else + setMessageList(0x004B3050); + } else if (param.asInteger() == 0x21142050) { + if (_unkFlag && _countdown1 == 0 && !getGlobalVar(V_NOTES_PUZZLE_SOLVED)) + setMessageList(0x004B2FA8); + else + setMessageList(0x004B2FC8); + } else if (param.asInteger() == 0x87441031) + setSurfacePriority(_sprite1->getSurface(), 1100); + else if (param.asInteger() == 0x80C40322) { + setSurfacePriority(_sprite1->getSurface(), 200); + cancelMessageList(); + _unkFlag = true; + } else if (param.asInteger() == 0x09C4B40A && _countdown2 > 12) + _countdown2 = 12; + break; + case 0x2000: + messageResult = 0; + for (uint32 i = 0; i < 5; i++) + if (kScene2401Rects[i].contains(_mouseClickPos.x, _mouseClickPos.y)) { + messageResult = i; + break; + } + break; + case 0x2001: + sendMessage(_asWaterSpit[_asWaterSpitIndex], 0x2000, param.asInteger()); + _asWaterSpitIndex = (_asWaterSpitIndex + 1) & 1; + incSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 1); + if (getSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger()) >= 5) + setSubVar(VA_CURR_WATER_PIPES_LEVEL, param.asInteger(), 4); + break; + case 0x480B: + if (sender == _ssButton) { + _pipeStatus = 0; + _countdown1 = 8; + } else if (sender == _ssFloorButton && getGlobalVar(V_WATER_RUNNING)) { + _countdown2 = 144; + sendMessage(_asFlowingWater, 0x2002, 0); + playSound(0, 0xE1130324); + } + break; + case 0x482A: + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + case 0x482B: + _palette->addBasePalette(0x91D3A391, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + } + return messageResult; +} + +void Scene2401::playPipeSound(uint32 fileHash) { + playSound(_soundToggle ? 0 : 1, fileHash); + _soundToggle = !_soundToggle; +} + +static const uint32 kScene2402FileHashes[] = { + 0xD0910020, 0xD0910038, 0xD0910008, + 0xD0910068, 0xD09100A8 +}; + +AsScene2402Door::AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _isOpen(isOpen), _countdown(0) { + + _x = 320; + _y = 240; + createSurface1(0x80495831, 100); + if (_isOpen) { + startAnimation(0x80495831, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + _countdown = 48; + } else { + stopAnimation(); + setVisible(false); + } + SetUpdateHandler(&AsScene2402Door::update); + SetMessageHandler(&AsScene2402Door::handleMessage); +} + +void AsScene2402Door::update() { + if (_isOpen && _countdown != 0 && (--_countdown) == 0) { + _isOpen = false; + setVisible(true); + startAnimation(0x80495831, -1, -1); + _playBackwards = true; + playSound(0, calcHash("fxDoorClose38")); + NextState(&AsScene2402Door::stDoorClosingFinished); + } + AnimatedSprite::update(); +} + +uint32 AsScene2402Door::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (_isOpen) + _countdown = 144; + messageResult = _isOpen ? 1 : 0; + break; + case 0x3002: + gotoNextState(); + break; + case 0x4808: + _countdown = 144; + _isOpen = true; + setVisible(true); + startAnimation(0x80495831, 0, -1); + _newStickFrameIndex = STICK_LAST_FRAME; + playSound(0, calcHash("fxDoorOpen38")); + break; + } + return messageResult; +} + +void AsScene2402Door::stDoorClosingFinished() { + sendMessage(_parentScene, 0x2001, 0); + setVisible(false); +} + +AsScene2402TV::AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen) + : AnimatedSprite(vm, 1100), _klaymen(klaymen), _countdown1(0), _countdown2(0) { + + _x = 260; + _y = 210; + createSurface(100, 127, 90); + setDoDeltaX(1); + SetMessageHandler(&Sprite::handleMessage); + if (!getGlobalVar(V_TV_JOKE_TOLD)) { + loadSound(0, 0x58208810); + _countdown1 = 48; + startAnimation(0x4919397A, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AsScene2402TV::upWait); + } else { + int16 frameIndex; + if (_klaymen->getX() > 320) + _currFrameIndex = 29; + frameIndex = CLIP((_klaymen->getX() - _x + 150) / 10, 0, 29); + startAnimation(0x050A0103, frameIndex, -1); + _newStickFrameIndex = frameIndex; + _countdown1 = 0; + SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); + } +} + +AsScene2402TV::~AsScene2402TV() { + _vm->_soundMan->deleteSoundGroup(0x01520123); +} + +void AsScene2402TV::upWait() { + if (_countdown1 != 0 && (--_countdown1) == 0) { + startAnimation(0x4919397A, 0, -1); + SetMessageHandler(&AsScene2402TV::hmJoke); + NextState(&AsScene2402TV::stJokeFinished); + } + AnimatedSprite::update(); +} + +void AsScene2402TV::upFocusKlaymen() { + int16 frameIndex = CLIP((_klaymen->getX() - _x + 150) / 10, 0, 29); + if (frameIndex != _currFrameIndex) { + if (frameIndex > _currFrameIndex) + _currFrameIndex++; + else if (frameIndex < _currFrameIndex) + _currFrameIndex--; + startAnimation(0x050A0103, _currFrameIndex, -1); + _newStickFrameIndex = _currFrameIndex; + if (_countdown2 == 0) { + _vm->_soundMan->addSound(0x01520123, 0xC42D4528); + _vm->_soundMan->playSoundLooping(0xC42D4528); + } + _countdown2 = 5; + } else if (_countdown2 != 0 && (--_countdown2 == 0)) + _vm->_soundMan->deleteSound(0xC42D4528); + AnimatedSprite::update(); +} + +void AsScene2402TV::stJokeFinished() { + setGlobalVar(V_TV_JOKE_TOLD, 1); + startAnimation(0x050A0103, 0, -1); + _newStickFrameIndex = 0; + SetUpdateHandler(&AsScene2402TV::upFocusKlaymen); +} + +uint32 AsScene2402TV::hmJoke(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x431EA0B0) + playSound(0); + break; + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +Scene2402::Scene2402(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _countdown(0), _soundToggle(false) { + + Sprite *tempSprite; + + SetMessageHandler(&Scene2402::handleMessage); + SetUpdateHandler(&Scene2402::update); + + setRectList(0x004AF900); + setBackground(0x81660220); + setPalette(0x81660220); + insertScreenMouse(0x6022481E); + _asTape = insertSprite(this, 9, 1100, 286, 409, 0x9148A011); + addCollisionSprite(_asTape); + _ssButton = insertSprite(this, 0x15288120, 100, 0); + + if (which < 0) { + // Restoring game + insertKlaymen(198, 404); + setMessageList(0x004AF7C8); + } else if (which == 1) { + // Klaymen entering from the right + insertKlaymen(660, 404); + setMessageList(0x004AF7D8); + } else if (which == 2) { + // Klaymen returning from looking through the window + insertKlaymen(409, 404); + _klaymen->setDoDeltaX(getGlobalVar(V_KLAYMEN_IS_DELTA_X) ? 1 : 0); + setMessageList(0x004AF888); + } else { + // Klaymen entering from the left + insertKlaymen(0, 404); + setMessageList(0x004AF7D0); + } + + tempSprite = insertStaticSprite(0x081A60A8, 1100); + _ssDoorFrame = (StaticSprite*)insertStaticSprite(0x406C0AE0, 1100); + _klaymen->setClipRect(_ssDoorFrame->getDrawRect().x, 0, 639, tempSprite->getDrawRect().y2()); + _asDoor = insertSprite(this, which == 0); + insertSprite(_klaymen); + insertStaticSprite(0x3A01A020, 200); + +} + +Scene2402::~Scene2402() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +void Scene2402::update() { + if (_countdown != 0 && (--_countdown) == 0) { + if (_pipeStatus >= 10) { + sendMessage(_asDoor, 0x4808, 0); + _ssDoorFrame->loadSprite(0x00B415E0, kSLFDefDrawOffset | kSLFDefPosition); + } else if (_pipeStatus >= 5) { + _countdown = 8; + playPipeSound(kScene2402FileHashes[getSubVar(VA_CURR_WATER_PIPES_LEVEL, _pipeStatus - 5)]); + } else { + _countdown = _pipeStatus == 4 ? 16 : 8; + playPipeSound(kScene2402FileHashes[getSubVar(VA_GOOD_WATER_PIPES_LEVEL, _pipeStatus)]); + } + _pipeStatus++; + } + Scene::update(); +} + +uint32 Scene2402::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x402064D8) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x01C66840) { + if (sendMessage(_asDoor, 0x2000, 0)) + setMessageList(0x004AF800); + else + setMessageList(0x004AF818); + } + break; + case 0x2001: + _ssDoorFrame->loadSprite(0x406C0AE0, kSLFDefDrawOffset | kSLFDefPosition); + break; + case 0x480B: + if (sender == _ssButton) { + _pipeStatus = 0; + _countdown = 8; + } + break; + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004AF890); + } + break; + } + return messageResult; +} + +void Scene2402::playPipeSound(uint32 fileHash) { + playSound(_soundToggle ? 0 : 1, fileHash); + _soundToggle = !_soundToggle; +} + +Scene2403::Scene2403(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite1, *tempSprite2, *tempSprite3; + + SetMessageHandler(&Scene2403::handleMessage); + setBackground(0x0C05060C); + setPalette(0x0C05060C); + _palette->addPalette(0x414364B0, 0, 65, 0); + insertScreenMouse(0x506080C8); + _asTape = insertSprite(this, 2, 1100, 480, 454, 0x9148A011); + addCollisionSprite(_asTape); + _asLightCord = insertSprite(this, 0xA1095A10, 0x836D3813, 368, 200); + _asLightCord->setClipRect(0, 25, 640, 480); + + if (which < 0) { + // Restoring game + _isClimbingLadder = false; + insertKlaymen(220, 449); + setMessageList(0x004B5C98); + setRectList(0x004B5E18); + } else if (which == 1) { + // Klaymen returning from looking through the window + _isClimbingLadder = false; + insertKlaymen(433, 449); + setMessageList(0x004B5D70); + setRectList(0x004B5E18); + } else if (which == 2) { + // Klaymen standing around after the critter video + _isClimbingLadder = false; + insertKlaymen(440, 449); + _klaymen->setDoDeltaX(1); + setMessageList(0x004B5C98); + setRectList(0x004B5E18); + } else { + // Klaymen coming up from ladder + _isClimbingLadder = true; + insertKlaymen(122, 599); + setMessageList(0x004B5CA0); + setRectList(0x004B5E28); + } + + _ssButton = insertSprite(this, 0x3130B0EB, 100, 0); + tempSprite1 = insertStaticSprite(0x20C24220, 1100); + tempSprite2 = insertStaticSprite(0x03080900, 1300); + tempSprite3 = insertSprite(_klaymen); + tempSprite3->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); + _klaymen->setClipRect(tempSprite1->getDrawRect().x, 0, 640, tempSprite2->getDrawRect().y2()); + loadSound(1, calcHash("fxFogHornSoft")); +} + +uint32 Scene2403::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x040424D0) + sendEntityMessage(_klaymen, 0x1014, _ssButton); + else if (param.asInteger() == 0x180CE614) + sendEntityMessage(_klaymen, 0x1014, _asLightCord); + break; + case 0x2000: + _isClimbingLadder = true; + setRectList(0x004B5E28); + break; + case 0x2001: + _isClimbingLadder = false; + setRectList(0x004B5E18); + break; + case 0x480B: + if (sender == _ssButton) { + if (getSubVar(VA_LOCKS_DISABLED, 0x304008D2)) { + setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 0); + playSound(0, calcHash("fx3LocksDisable")); + } else { + setSubVar(VA_LOCKS_DISABLED, 0x304008D2, 1); + playSound(1); + } + } + break; + case 0x480F: + if (sender == _asLightCord) + leaveScene(2); + break; + case 0x4826: + if (sender == _asTape && !_isClimbingLadder) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B5D98); + } + break; + } + return messageResult; +} + +Scene2406::Scene2406(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite1, *tempSprite2; + + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 2); + + SetMessageHandler(&Scene2406::handleMessage); + + setRectList(0x004B78C8); + insertScreenMouse(0xB03001A8); + + if (getGlobalVar(V_KEY3_LOCATION) == 2) { + _asKey = insertSprite(this, 2, 1100, 560, 409); + addCollisionSprite(_asKey); + } + + _asTape = insertSprite(this, 5, 1100, 456, 409, 0x9148A011); + addCollisionSprite(_asTape); + tempSprite2 = insertStaticSprite(0x19625293, 1100); + _clipRects[0].x1 = 0; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = tempSprite2->getDrawRect().x2(); + _clipRects[0].y2 = 480; + + if (getGlobalVar(V_SPIKES_RETRACTED)) { + setBackground(0x1A0B0304); + setPalette(0x1A0B0304); + tempSprite1 = insertStaticSprite(0x32923922, 1100); + } else { + setBackground(0x0A038595); + setPalette(0x0A038595); + tempSprite1 = insertStaticSprite(0x1712112A, 1100); + } + + tempSprite2 = insertStaticSprite(0x22300924, 1300); + _clipRects[1].x1 = tempSprite1->getDrawRect().x; + _clipRects[1].y1 = tempSprite2->getDrawRect().y; + _clipRects[1].x2 = 640; + _clipRects[1].y2 = 480; + + if (which < 0) { + // Restoring game + _isClimbingLadder = false; + insertKlaymen(307, 404, _clipRects, 2); + setMessageList(0x004B76C8); + setRectList(0x004B78C8); + } else if (which == 1) { + // Klaymen coming down the ladder + _isClimbingLadder = true; + insertKlaymen(253, -16, _clipRects, 2); + setMessageList(0x004B76D8); + setRectList(0x004B78D8); + } else if (which == 2) { + // Klaymen returning from the diskplayer + _isClimbingLadder = false; + insertKlaymen(480, 404, _clipRects, 2); + setMessageList(0x004B77C0); + setRectList(0x004B78C8); + } else if (which == 3) { + // Klaymen returning from looking through the window + _isClimbingLadder = false; + insertKlaymen(387, 404, _clipRects, 2); + setMessageList(0x004B7810); + setRectList(0x004B78C8); + } else { + // Klaymen entering from the left + _isClimbingLadder = false; + insertKlaymen(0, 404, _clipRects, 2); + setMessageList(0x004B76D0); + setRectList(0x004B78C8); + } + + tempSprite2 = insertSprite(_klaymen); + tempSprite2->setClipRect(_clipRects[1]); + +} + +uint32 Scene2406::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x41062804) { + if (getGlobalVar(V_SPIKES_RETRACTED)) + setMessageList(0x004B7758); + else + setMessageList(0x004B7738); + } + break; + case 0x2000: + _isClimbingLadder = true; + setRectList(0x004B78D8); + break; + case 0x2001: + _isClimbingLadder = false; + setRectList(0x004B78C8); + break; + case 0x4826: + if (sender == _asTape && !_isClimbingLadder) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B77C8); + } else if (sender == _asKey && !_isClimbingLadder) { + sendEntityMessage(_klaymen, 0x1014, _asKey); + setMessageList(0x004B77D8); + } + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2400.h b/engines/neverhood/modules/module2400.h new file mode 100644 index 0000000000..b50fff91c4 --- /dev/null +++ b/engines/neverhood/modules/module2400.h @@ -0,0 +1,182 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2400_H +#define NEVERHOOD_MODULES_MODULE2400_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1100.h" +#include "neverhood/modules/module1200.h" +#include "neverhood/modules/module2100.h" +#include "neverhood/modules/module2200.h" +#include "neverhood/modules/module2800.h" +#include "neverhood/diskplayerscene.h" + +namespace Neverhood { + +// Module2400 + +class Module2400 : public Module { +public: + Module2400(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2400(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401WaterSpit : public AnimatedSprite { +public: + AsScene2401WaterSpit(NeverhoodEngine *vm); +protected: + int _soundIndex; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401FlowingWater : public AnimatedSprite { +public: + AsScene2401FlowingWater(NeverhoodEngine *vm); + virtual ~AsScene2401FlowingWater(); +protected: + bool _isWaterFlowing; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401WaterFlushing : public AnimatedSprite { +public: + AsScene2401WaterFlushing(NeverhoodEngine *vm, int16 x, int16 y); +protected: + int _countdown; + int _flushLoopCount; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2401Door : public AnimatedSprite { +public: + AsScene2401Door(NeverhoodEngine *vm, bool isOpen); +protected: + int _countdown; + bool _isOpen; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoorOpenFinished(); +}; + +class Scene2401 : public Scene { +public: + Scene2401(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_asFlowingWater; + Sprite *_ssButton; + Sprite *_ssFloorButton; + Sprite *_asWaterSpit[2]; + Sprite *_ssWaterPipes[10]; + Sprite *_asWaterFlushing[5]; + Sprite *_asDoor; + bool _soundToggle; + bool _unkFlag; + int _countdown1; + int _countdown2; + int _pipeStatus; + int _asWaterSpitIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void playPipeSound(uint32 fileHash); +}; + +class AsScene2402Door : public AnimatedSprite { +public: + AsScene2402Door(NeverhoodEngine *vm, Scene *parentScene, bool isOpen); +protected: + Scene *_parentScene; + int _countdown; + bool _isOpen; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void stDoorClosingFinished(); +}; + +class AsScene2402TV : public AnimatedSprite { +public: + AsScene2402TV(NeverhoodEngine *vm, Klaymen *klaymen); + virtual ~AsScene2402TV(); +protected: + Klaymen *_klaymen; + int _countdown1; + int _countdown2; + void upWait(); + void upFocusKlaymen(); + void stJokeFinished(); + uint32 hmJoke(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2402 : public Scene { +public: + Scene2402(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2402(); +protected: + Sprite *_asDoor; + Sprite *_ssButton; + Sprite *_asTape; + StaticSprite *_ssDoorFrame; + int _pipeStatus; + int _countdown; + bool _soundToggle; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void playPipeSound(uint32 fileHash); +}; + +class Scene2403 : public Scene { +public: + Scene2403(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssButton; + Sprite *_asTape; + Sprite *_asKey; + Sprite *_asLightCord; + bool _isClimbingLadder; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2406 : public Scene { +public: + Scene2406(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asTape; + Sprite *_asKey; + NRect _clipRects[2]; + bool _isClimbingLadder; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2400_H */ diff --git a/engines/neverhood/modules/module2500.cpp b/engines/neverhood/modules/module2500.cpp new file mode 100644 index 0000000000..a997b5aab1 --- /dev/null +++ b/engines/neverhood/modules/module2500.cpp @@ -0,0 +1,546 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2500.h" +#include "neverhood/modules/module1600.h" + +namespace Neverhood { + +static const uint32 kScene2505StaticSprites[] = { + 0x4000A226, 0 +}; + +static const NRect kScene2505ClipRect = NRect(0, 0, 564, 480); + +static const uint32 kScene2506StaticSprites[] = { + 0x4027AF02, 0 +}; + +static const NRect kScene2506ClipRect = NRect(0, 0, 640, 441); + +static const uint32 kScene2508StaticSprites1[] = { + 0x2F08E610, 0xD844E6A0, 0 +}; + +static const NRect kScene2508ClipRect1 = NRect(0, 0, 594, 448); + +static const uint32 kScene2508StaticSprites2[] = { + 0x2F08E610, 0 +}; + +static const NRect kScene2508ClipRect2 = NRect(0, 0, 594, 448); + +Module2500::Module2500(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundIndex(0) { + + _vm->_soundMan->addMusic(0x29220120, 0x05343184); + _vm->_soundMan->startMusic(0x05343184, 0, 0); + SetMessageHandler(&Module2500::handleMessage); + + if (which < 0) + createScene(_vm->gameState().sceneNum, _vm->gameState().which); + else + createScene(0, 0); + + loadSound(0, 0x00880CCC); + loadSound(1, 0x00880CC0); + loadSound(2, 0x00880CCC); + loadSound(3, 0x00880CC0); + +} + +Module2500::~Module2500() { + _vm->_soundMan->deleteMusicGroup(0x29220120); +} + +void Module2500::createScene(int sceneNum, int which) { + debug("Module2500::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2501(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->gameState().which = which; + createScene2704(which, 0x004B01B8, 220); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->gameState().which = which; + if (getGlobalVar(V_WORLDS_JOINED)) + createScene2704(which, 0x004B01E0, 150); + else + createScene2704(which, 0x004B0208, 150); + break; + case 3: + _vm->gameState().sceneNum = 3; + _childObject = new Scene2504(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->gameState().which = which; + createScene2704(which, 0x004B0230, 150, kScene2505StaticSprites, &kScene2505ClipRect); + break; + case 5: + setGlobalVar(V_CAR_DELTA_X, 1); + _vm->gameState().sceneNum = 5; + _vm->gameState().which = which; + createScene2704(which, 0x004B0268, 150, kScene2506StaticSprites, &kScene2506ClipRect); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->gameState().which = which; + createScene2704(which, 0x004B02A0, 150); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->gameState().which = which; + if (getGlobalVar(V_ENTRANCE_OPEN)) + createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites1, &kScene2508ClipRect1); + else + createScene2704(which, 0x004B02C8, 150, kScene2508StaticSprites2, &kScene2508ClipRect2); + break; + case 8: + _vm->gameState().sceneNum = 8; + _childObject = new Scene1608(_vm, this, which); + break; + case 9: + _vm->gameState().sceneNum = 9; + if (getGlobalVar(V_ENTRANCE_OPEN)) + createStaticScene(0xC62A0645, 0xA0641C6A); + else + createStaticScene(0x7A343546, 0x435427AB); + break; + } + SetUpdateHandler(&Module2500::updateScene); + _childObject->handleUpdate(); +} + +void Module2500::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(2, 0); + else if (_moduleResult == 2) + createScene(1, 0); + else + leaveModule(0); + break; + case 1: + if (_moduleResult == 1) + createScene(3, -1); + else + createScene(0, 2); + break; + case 2: + if (_moduleResult == 1) + createScene(4, 0); + else + createScene(0, 1); + break; + case 3: + createScene(1, 1); + break; + case 4: + if (_moduleResult == 1) + createScene(5, 0); + else + createScene(2, 1); + break; + case 5: + if (_moduleResult == 1) + createScene(6, 0); + else + createScene(4, 1); + break; + case 6: + if (_moduleResult == 1) + createScene(7, 0); + else + createScene(5, 1); + break; + case 7: + if (_moduleResult == 1) + createScene(8, 1); + else + createScene(6, 1); + break; + case 8: + if (_moduleResult == 2) + createScene(9, -1); + else + createScene(7, 1); + break; + case 9: + createScene(8, 2); + break; + } + } +} + +uint32 Module2500::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200D: + playSound(_soundIndex); + _soundIndex++; + if (_soundIndex >= 4) + _soundIndex = 0; + break; + } + return messageResult; +} + +void Module2500::createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { + _childObject = new Scene2704(_vm, this, which, sceneInfoId, value, staticSprites, clipRect); +} + +Scene2501::Scene2501(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2628)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B264C)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B2670)); + + setGlobalVar(V_CAR_DELTA_X, 1); + SetUpdateHandler(&Scene2501::update); + setBackground(0x1B8E8115); + setPalette(0x1B8E8115); + _palette->addPalette(0x00128842, 65, 31, 65); + _palette->addPalette("paKlayRed", 0, 64, 0); + insertScreenMouse(0xE81111B0); + + _ssTrackShadowBackground = createSprite(0x99BE9015); // Don't add this to the sprite list + addEntity(_ssTrackShadowBackground); + _asCar = createSprite(this, 211, 400); // Create but don't add to the sprite list yet + _asIdleCarLower = insertSprite(211, 400); + _asIdleCarFull = insertSprite(211, 400); + insertStaticSprite(0xC42AC521, 1500); + + if (which < 0) { + // Restoring game + insertKlaymen(162, 393); + _kmScene2501 = _klaymen; + _klaymenInCar = false; + setMessageList(0x004B2538); + setRectList(0x004B2608); + SetMessageHandler(&Scene2501::handleMessage); + SetUpdateHandler(&Scene2501::update); + sendMessage(_asCar, 0x2009, 0); + _asCar->setVisible(false); + _currTrackIndex = 0; + } else if (which == 1 || which == 2) { + // 1: Klaymen entering riding the car on the left track + // 2: Klaymen entering riding the car on the bottom track + addSprite(_asCar); + _kmScene2501 = (Klaymen*)new KmScene2501(_vm, this, 275, 393); + _klaymenInCar = true; + sendMessage(_kmScene2501, 0x2000, 1); + _kmScene2501->setDoDeltaX(1); + SetMessageHandler(&Scene2501::hmRidingCar); + SetUpdateHandler(&Scene2501::upRidingCar); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); + _currTrackIndex = which; + } else { + // Klaymen entering the car + insertKlaymen(162, 393); + _kmScene2501 = _klaymen; + _klaymenInCar = false; + setMessageList(0x004B2538); + setRectList(0x004B2608); + SetMessageHandler(&Scene2501::handleMessage); + SetUpdateHandler(&Scene2501::update); + sendMessage(_asCar, 0x2009, 0); + _asCar->setVisible(false); + _currTrackIndex = 0; + } + + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + insertSprite(_asCar); + + _newTrackIndex = -1; + _dataResource.load(calcHash("Ashooded")); + + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + + if (which >= 0 && _tracks[_currTrackIndex]->which2 == which) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_asCar, 0x2007, 150); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_asCar, 0x2002, 0); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_asCar, 0x2008, 150); + } + + _carStatus = 0; + +} + +Scene2501::~Scene2501() { + // Free sprites not currently in the sprite list + if (_klaymenInCar) + delete _kmScene2501; + else + delete _asCar; +} + +void Scene2501::update() { + Scene::update(); + if (_carStatus == 1) { + removeSprite(_klaymen); + addSprite(_asCar); + clearRectList(); + _klaymenInCar = true; + SetMessageHandler(&Scene2501::hmCarAtHome); + SetUpdateHandler(&Scene2501::upCarAtHome); + _asIdleCarLower->setVisible(false); + _asIdleCarFull->setVisible(false); + _asCar->setVisible(true); + sendMessage(_asCar, 0x2009, 0); + _asCar->handleUpdate(); + _klaymen = NULL; + _carStatus = 0; + } + updateKlaymenClipRect(); +} + +void Scene2501::upCarAtHome() { + Scene::update(); + if (_mouseClicked) { + if (_mouseClickPos.x <= 210 && _asCar->getX() == 211 && _asCar->getY() == 400) { + sendMessage(_asCar, 0x200A, 0); + SetUpdateHandler(&Scene2501::upGettingOutOfCar); + } else { + moveCarToPoint(_mouseClickPos); + SetMessageHandler(&Scene2501::hmRidingCar); + SetUpdateHandler(&Scene2501::upRidingCar); + } + _mouseClicked = false; + } + updateKlaymenClipRect(); +} + +void Scene2501::upGettingOutOfCar() { + Scene::update(); + if (_carStatus == 2) { + _klaymen = _kmScene2501; + removeSprite(_asCar); + addSprite(_klaymen); + _klaymenInCar = false; + SetMessageHandler(&Scene2501::handleMessage); + SetUpdateHandler(&Scene2501::update); + setRectList(0x004B2608); + _asIdleCarLower->setVisible(true); + _asIdleCarFull->setVisible(true); + _asCar->setVisible(false); + setMessageList(0x004B2570); + processMessageList(); + _klaymen->handleUpdate(); + _carStatus = 0; + } + updateKlaymenClipRect(); +} + +void Scene2501::upRidingCar() { + Scene::update(); + if (_mouseClicked) { + moveCarToPoint(_mouseClickPos); + _mouseClicked = false; + } +} + +uint32 Scene2501::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x60842040) + _carStatus = 1; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return messageResult; +} + +uint32 Scene2501::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (_tracks[_currTrackIndex]->which1 < 0 && _newTrackIndex >= 0) + changeTrack(); + else if (_tracks[_currTrackIndex]->which1 == 0) { + SetMessageHandler(&Scene2501::hmCarAtHome); + SetUpdateHandler(&Scene2501::upCarAtHome); + sendMessage(_asCar, 0x200F, 1); + } else if (_tracks[_currTrackIndex]->which1 > 0) + leaveScene(_tracks[_currTrackIndex]->which1); + break; + case 0x2006: + if (_tracks[_currTrackIndex]->which2 < 0 && _newTrackIndex >= 0) + changeTrack(); + else if (_tracks[_currTrackIndex]->which2 == 0) { + SetMessageHandler(&Scene2501::hmCarAtHome); + SetUpdateHandler(&Scene2501::upCarAtHome); + sendMessage(_asCar, 0x200F, 1); + } else if (_tracks[_currTrackIndex]->which2 > 0) + leaveScene(_tracks[_currTrackIndex]->which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return messageResult; +} + +uint32 Scene2501::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200A: + _carStatus = 2; + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return messageResult; +} + +void Scene2501::moveCarToPoint(NPoint &pt) { + int minMatchTrackIndex, minMatchDistance; + _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); + if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { + _newTrackIndex = minMatchTrackIndex; + _clickPoint = pt; + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2003, 0); + } else { + _newTrackIndex = -1; + sendMessage(_asCar, 0x2004, pt); + } +} + +void Scene2501::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2002, 0); + sendPointMessage(_asCar, 0x2004, _clickPoint); + _newTrackIndex = -1; +} + +void Scene2501::updateKlaymenClipRect() { + if (_kmScene2501->getX() <= 211) + _kmScene2501->setClipRect(0, 0, 640, 480); + else + _kmScene2501->setClipRect(0, 0, 640, 388); +} + +SsScene2504Button::SsScene2504Button(NeverhoodEngine *vm) + : StaticSprite(vm, 1400), _countdown(0), _isSoundPlaying(false) { + + loadSprite(0x070220D9, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); + loadSound(0, 0x4600204C); + loadSound(1, 0x408C0034); + loadSound(2, 0x44043000); + loadSound(3, 0x44045000); + SetMessageHandler(&SsScene2504Button::handleMessage); + SetUpdateHandler(&SsScene2504Button::update); +} + +void SsScene2504Button::update() { + updatePosition(); + if (_isSoundPlaying && !isSoundPlaying(0) && !isSoundPlaying(1)) { + playSound(3); + setVisible(false); + _isSoundPlaying = false; + } + if (_countdown != 0 && (--_countdown) == 0) { + if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) + playSound(0); + else + playSound(1); + _isSoundPlaying = true; + } +} + +uint32 SsScene2504Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_isSoundPlaying) { + setVisible(true); + _countdown = 2; + if (getSubVar(VA_LOCKS_DISABLED, 0x01180951)) + setSubVar(VA_LOCKS_DISABLED, 0x01180951, 0); + else + setSubVar(VA_LOCKS_DISABLED, 0x01180951, 1); + playSound(2); + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene2504::Scene2504(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *ssButton; + + setBackground(0x90791B80); + setPalette(0x90791B80); + ssButton = insertSprite(); + addCollisionSprite(ssButton); + insertPuzzleMouse(0x91B8490F, 20, 620); + SetMessageHandler(&Scene2504::handleMessage); + SetUpdateHandler(&Scene::update); +} + +uint32 Scene2504::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene(0); + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2500.h b/engines/neverhood/modules/module2500.h new file mode 100644 index 0000000000..07db7907d5 --- /dev/null +++ b/engines/neverhood/modules/module2500.h @@ -0,0 +1,101 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2500_H +#define NEVERHOOD_MODULES_MODULE2500_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1600.h" +#include "neverhood/modules/module2700.h" + +namespace Neverhood { + +// Module2500 + +class Module2500 : public Module { +public: + Module2500(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2500(); +protected: + int _sceneNum; + int _soundIndex; + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene2704(int which, uint32 sceneInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); +}; + +class Scene2501 : public Scene { +public: + Scene2501(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2501(); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarConnectorShadow; + Sprite *_asCarTrackShadow; + Sprite *_asIdleCarLower; + Sprite *_asIdleCarFull; + Klaymen *_kmScene2501; + Tracks _tracks; + NPointArray *_trackPoints; + int _currTrackIndex; + NPoint _clickPoint; + int _newTrackIndex; + int _carStatus; + bool _klaymenInCar; + void update(); + void upCarAtHome(); + void upGettingOutOfCar(); + void upRidingCar(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); + void moveCarToPoint(NPoint &pt); + void changeTrack(); + void updateKlaymenClipRect(); +}; + +class SsScene2504Button : public StaticSprite { +public: + SsScene2504Button(NeverhoodEngine *vm); +protected: + int _countdown; + bool _isSoundPlaying; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2504 : public Scene { +public: + Scene2504(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2500_H */ diff --git a/engines/neverhood/modules/module2600.cpp b/engines/neverhood/modules/module2600.cpp new file mode 100644 index 0000000000..b8dbf7bff1 --- /dev/null +++ b/engines/neverhood/modules/module2600.cpp @@ -0,0 +1,348 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2600.h" + +namespace Neverhood { + +static const uint32 kModule2600SoundList[] = { + 0xB288D450, + 0x90804450, + 0x99801500, + 0xB288D455, + 0x93825040, + 0 +}; + +Module2600::Module2600(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which < 0) + createScene(_vm->gameState().sceneNum, -1); + else if (which == 1) + createScene(4, 1); + else + createScene(0, 1); + + _vm->_soundMan->addSoundList(0x40271018, kModule2600SoundList); + _vm->_soundMan->setSoundListParams(kModule2600SoundList, true, 50, 600, 5, 150); + _vm->_soundMan->playTwoSounds(0x40271018, 0x41861371, 0x43A2507F, 0); + +} + +Module2600::~Module2600() { + _vm->_soundMan->deleteGroup(0x40271018); +} + +void Module2600::createScene(int sceneNum, int which) { + debug("Module2600::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + createNavigationScene(0x004B8608, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + createNavigationScene(0x004B8638, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + createNavigationScene(0x004B86C8, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + if (getGlobalVar(V_CREATURE_ANGRY)) + createNavigationScene(0x004B8758, which); + else + createNavigationScene(0x004B86F8, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + createNavigationScene(0x004B87B8, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + createNavigationScene(0x004B8698, which); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->_soundMan->deleteGroup(0x40271018); + createSmackerScene(0x30090001, true, true, false); + break; + case 8: + _vm->gameState().sceneNum = 8; + _childObject = new Scene2609(_vm, this, which); + break; + case 1002: + _vm->gameState().sceneNum = 2; + if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 1) + createSmackerScene(0x018C0404, true, true, false); + else if (getGlobalVar(V_FRUIT_COUNTING_INDEX) == 2) + createSmackerScene(0x018C0407, true, true, false); + else + createSmackerScene(0x818C0405, true, true, false); + if (getGlobalVar(V_FRUIT_COUNTING_INDEX) >= 2) + setGlobalVar(V_FRUIT_COUNTING_INDEX, 0); + else + incGlobalVar(V_FRUIT_COUNTING_INDEX, +1); + break; + case 1003: + _vm->gameState().sceneNum = 3; + createSmackerScene(0x001C0007, true, true, false); + break; + case 1006: + _vm->gameState().sceneNum = 6; + if (getGlobalVar(V_WATER_RUNNING)) + createSmackerScene(0x049A1181, true, true, false); + else + createSmackerScene(0x04981181, true, true, false); + break; + case 1008: + _vm->gameState().sceneNum = 8; + if (getGlobalVar(V_WATER_RUNNING)) + createSmackerScene(0x42B80941, true, true, false); + else + createSmackerScene(0x42980941, true, true, false); + break; + case 9999: + createDemoScene(); + break; + } + SetUpdateHandler(&Module2600::updateScene); + _childObject->handleUpdate(); +} + +void Module2600::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == 1) + createScene(1, 3); + else + leaveModule(0); + break; + case 1: + if (_moduleResult == 0) + createScene(6, 0); + else if (_moduleResult == 1) + createScene(0, 0); + else if (_moduleResult == 2) + createScene(2, 1); + else if (_moduleResult == 3) + createScene(3, 0); + break; + case 2: + if (_moduleResult == 0) + createScene(1, 0); + else if (_moduleResult == 1) { + if (_vm->isDemo()) + createScene(9999, -1); + else + createScene(1002, -1); + } + break; + case 3: + if (_moduleResult == 0) { + if (getGlobalVar(V_CREATURE_ANGRY)) + createScene(4, 0); + else + createScene(1003, -1); + } else if (_moduleResult == 2) + createScene(1, 1); + else if (_moduleResult == 3) { + if (getGlobalVar(V_CREATURE_ANGRY)) + createScene(4, 0); + else { + setGlobalVar(V_CREATURE_ANGRY, 1); + createScene(7, -1); + } + } + break; + case 4: + if (_moduleResult == 0) + leaveModule(1); + else + createScene(3, 1); + break; + case 6: + if (_moduleResult == 0) { + if (_vm->isDemo()) + createScene(9999, -1); + else + createScene(1006, -1); + } + else if (_moduleResult == 1) + createScene(1, 2); + break; + case 7: + leaveModule(0); + break; + case 8: + createScene(1008, -1); + break; + case 1002: + createScene(2, 1); + break; + case 1003: + createScene(3, 0); + break; + case 1006: + createScene(8, -1); + break; + case 1008: + createScene(6, 0); + break; + case 9999: + createScene(_vm->gameState().sceneNum, -1); + break; + } + } +} + +SsScene2609Button::SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene) + : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { + + SetUpdateHandler(&SsScene2609Button::update); + SetMessageHandler(&SsScene2609Button::handleMessage); + + loadSprite(0x825A6923, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + if (!getGlobalVar(V_WATER_RUNNING)) + setVisible(false); + loadSound(0, 0x10267160); + loadSound(1, 0x7027FD64); + loadSound(2, 0x44043000); + loadSound(3, 0x44045000); +} + +void SsScene2609Button::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + if (getGlobalVar(V_WATER_RUNNING)) { + setGlobalVar(V_WATER_RUNNING, 0); + sendMessage(_parentScene, 0x2001, 0); + } else { + setGlobalVar(V_WATER_RUNNING, 1); + sendMessage(_parentScene, 0x2002, 0); + } + } +} + +uint32 SsScene2609Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + sendMessage(_parentScene, 0x2000, 0); + if (getGlobalVar(V_WATER_RUNNING)) { + setVisible(false); + playSound(3); + playSound(1); + _countdown = 12; + } else { + setVisible(true); + playSound(2); + playSound(0); + _countdown = 96; + } + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene2609Water::AsScene2609Water(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1000) { + + _x = 240; + _y = 420; + setDoDeltaX(1); + createSurface1(0x9C210C90, 1200); + setClipRect(260, 260, 400, 368); + _vm->_soundMan->addSound(0x08526C36, 0xDC2769B0); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2609Water::handleMessage); + if (getGlobalVar(V_WATER_RUNNING)) + sendMessage(this, 0x2002, 0); +} + +AsScene2609Water::~AsScene2609Water() { + _vm->_soundMan->deleteSoundGroup(0x08526C36); +} + +uint32 AsScene2609Water::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2001: + stopAnimation(); + setVisible(false); + _vm->_soundMan->stopSound(0xDC2769B0); + break; + case 0x2002: + startAnimation(0x9C210C90, 0, -1); + setVisible(true); + _vm->_soundMan->playSoundLooping(0xDC2769B0); + break; + } + return messageResult; +} + +Scene2609::Scene2609(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isBusy(false) { + + SetUpdateHandler(&Scene::update); + SetMessageHandler(&Scene2609::handleMessage); + + setBackground(0x51409A16); + setPalette(0x51409A16); + _asWater = insertSprite(); + _ssButton = insertSprite(this); + addCollisionSprite(_ssButton); + insertPuzzleMouse(0x09A1251C, 20, 620); + insertStaticSprite(0x02138002, 1200); + insertStaticSprite(0x825E2827, 1200); +} + +uint32 Scene2609::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !_isBusy) + leaveScene(0); + break; + case 0x2000: + _isBusy = true; + break; + case 0x2001: + _isBusy = false; + sendMessage(_asWater, 0x2001, 0); + break; + case 0x2002: + _isBusy = false; + sendMessage(_asWater, 0x2002, 0); + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2600.h b/engines/neverhood/modules/module2600.h new file mode 100644 index 0000000000..d972e0fb0d --- /dev/null +++ b/engines/neverhood/modules/module2600.h @@ -0,0 +1,74 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2600_H +#define NEVERHOOD_MODULES_MODULE2600_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2600 + +class Module2600 : public Module { +public: + Module2600(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2600(); +protected: + int _sceneNum; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +class SsScene2609Button : public StaticSprite { +public: + SsScene2609Button(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2609Water : public AnimatedSprite { +public: + AsScene2609Water(NeverhoodEngine *vm); + virtual ~AsScene2609Water(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2609 : public Scene { +public: + Scene2609(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + bool _isBusy; + Sprite *_asWater; + Sprite *_ssButton; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2600_H */ diff --git a/engines/neverhood/modules/module2700.cpp b/engines/neverhood/modules/module2700.cpp new file mode 100644 index 0000000000..8b69bc050e --- /dev/null +++ b/engines/neverhood/modules/module2700.cpp @@ -0,0 +1,1211 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2700.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1000.h" + +namespace Neverhood { + +static const NRect kScene2710ClipRect = NRect(0, 0, 626, 480); + +static const uint32 kScene2710StaticSprites[] = { + 0x0D2016C0, + 0 +}; + +static const NRect kScene2711ClipRect = NRect(0, 0, 521, 480); + +static const uint32 kScene2711FileHashes1[] = { + 0, + 0x100801A1, + 0x201081A0, + 0x006800A4, + 0x40390120, + 0x000001B1, + 0x001000A1, + 0 +}; + +static const uint32 kScene2711FileHashes2[] = { + 0, + 0x40403308, + 0x71403168, + 0x80423928, + 0x224131A8, + 0x50401328, + 0x70423328, + 0 +}; + +static const uint32 kScene2711FileHashes3[] = { + 0, + 0x1088A021, + 0x108120E5, + 0x18A02321, + 0x148221A9, + 0x10082061, + 0x188820E1, + 0 +}; + +static const NRect kScene2724ClipRect = NRect(0, 141, 640, 480); + +static const uint32 kScene2724StaticSprites[] = { + 0xC20D00A5, + 0 +}; + +static const NRect kScene2725ClipRect = NRect(0, 0, 640, 413); + +static const uint32 kScene2725StaticSprites[] = { + 0xC20E00A5, + 0 +}; + +Module2700::Module2700(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundIndex(0), _raidoMusicInitialized(false) { + + _vm->_soundMan->addMusic(0x42212411, 0x04020210); + _vm->_soundMan->startMusic(0x04020210, 24, 2); + SetMessageHandler(&Module2700::handleMessage); + + if (which < 0) { + which = _vm->gameState().which; + // Scenes 0, 30 and 31 are "normal" scenes, whereas the other scenes are tracks. + // "gameState().which" indicates which track the car is at. + if (_vm->gameState().sceneNum == 0 || _vm->gameState().sceneNum == 30 || _vm->gameState().sceneNum == 31) + which = -1; + createScene(_vm->gameState().sceneNum, which); + } else + createScene(0, 0); + + loadSound(0, 0x00880CCC); + loadSound(1, 0x00880CC0); + loadSound(2, 0x00880CCC); + loadSound(3, 0x00880CC0); + +} + +Module2700::~Module2700() { + _vm->_soundMan->deleteGroup(0x42212411); +} + +void Module2700::createScene(int sceneNum, int which) { + debug("Module2700::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->gameState().which = which; + _childObject = new Scene2701(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->gameState().which = which; + _childObject = new Scene2702(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->gameState().which = which; + if (which == 6 || which == 7) + createScene2703(which, 0x004B1710); + else if (which == 4 || which == 5) + createScene2703(which, 0x004B1738); + else if (which == 2 || which == 3) + createScene2703(which, 0x004B1760); + else + createScene2703(which, 0x004B1788); + break; + case 3: + _vm->gameState().sceneNum = 3; + _vm->gameState().which = which; + createScene2704(which, 0x004B17B0, 150); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->gameState().which = which; + createScene2704(which, 0x004B17D8, 150); + break; + case 5: + _vm->gameState().sceneNum = 5; + _vm->gameState().which = which; + if (which >= 4) + _childObject = new Scene2706(_vm, this, which); + else if (which == 2 || which == 3) + createScene2704(which, 0x004B1828, 150); + else + createScene2704(which, 0x004B1800, 150); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->gameState().which = which; + createScene2704(which, 0x004B1850, 150); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->gameState().which = which; + if (which == 2 || which == 3) + createScene2704(which, 0x004B1878, 150); + else + createScene2704(which, 0x004B18A0, 150); + break; + case 8: + _vm->gameState().sceneNum = 8; + _vm->gameState().which = which; + if (which == 2 || which == 3) + createScene2704(which, 0x004B18C8, 150); + else + createScene2704(which, 0x004B18F0, 150); + break; + case 9: + _vm->gameState().sceneNum = 9; + _vm->gameState().which = which; + createScene2704(which, 0x004B1918, 150, kScene2710StaticSprites, &kScene2710ClipRect); + break; + case 10: + _vm->gameState().sceneNum = 10; + _vm->gameState().which = which; + _vm->gameModule()->initTestTubes2Puzzle(); + _scene2711StaticSprites[0] = kScene2711FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)]; + _scene2711StaticSprites[1] = kScene2711FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1)]; + _scene2711StaticSprites[2] = kScene2711FileHashes3[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0)]; + _scene2711StaticSprites[3] = 0x0261282E; + _scene2711StaticSprites[4] = 0x9608E5A0; + _scene2711StaticSprites[5] = 0; + createScene2704(which, 0x004B1950, 150, _scene2711StaticSprites, &kScene2711ClipRect); + break; + case 11: + _vm->gameState().sceneNum = 11; + _vm->gameState().which = which; + createScene2704(which, 0x004B19E0, 150); + break; + case 12: + _vm->gameState().sceneNum = 12; + _vm->gameState().which = which; + createScene2704(which, 0x004B1A08, 150); + break; + case 13: + _vm->gameState().sceneNum = 13; + _vm->gameState().which = which; + createScene2704(which, 0x004B1A30, 150); + break; + case 14: + _vm->gameState().sceneNum = 14; + _vm->gameState().which = which; + if (which == 4 || which == 5) + createScene2704(which, 0x004B1A58, 150); + else if (which == 2 || which == 3) + createScene2704(which, 0x004B1A80, 150); + else + createScene2704(which, 0x004B1AA8, 150); + break; + case 15: + _vm->gameState().sceneNum = 15; + _vm->gameState().which = which; + if (which == 4 || which == 5) + createScene2704(which, 0x004B1AD0, 150); + else if (which == 2 || which == 3) + createScene2704(which, 0x004B1AF8, 150); + else + createScene2704(which, 0x004B1B20, 150); + break; + case 16: + _vm->gameState().sceneNum = 16; + _vm->gameState().which = which; + if (which == 4 || which == 5) + createScene2704(which, 0x004B1B48, 150); + else if (which == 2 || which == 3) + createScene2704(which, 0x004B1B70, 150); + else + createScene2704(which, 0x004B1B98, 150); + break; + case 17: + _vm->gameState().sceneNum = 17; + _vm->gameState().which = which; + if (which == 4 || which == 5) + createScene2704(which, 0x004B1BC0, 150); + else if (which == 2 || which == 3) + createScene2704(which, 0x004B1BE8, 150); + else + createScene2704(which, 0x004B1C10, 150); + break; + case 18: + _vm->gameState().sceneNum = 18; + _vm->gameState().which = which; + if (which == 2 || which == 3) + createScene2704(which, 0x004B1C38, 150); + else + createScene2704(which, 0x004B1C60, 150); + break; + case 19: + _vm->gameState().sceneNum = 19; + _vm->gameState().which = which; + if (which == 2 || which == 3) + createScene2704(which, 0x004B1CB0, 150); + else + createScene2704(which, 0x004B1C88, 150); + break; + case 20: + _vm->gameState().sceneNum = 20; + _vm->gameState().which = which; + if (which == 2 || which == 3) + createScene2704(which, 0x004B1CD8, 150); + else + createScene2704(which, 0x004B1D00, 150); + break; + case 21: + _vm->gameState().sceneNum = 21; + _vm->gameState().which = which; + createScene2704(which, 0x004B1D28, 150); + break; + case 22: + _vm->gameState().sceneNum = 22; + _vm->gameState().which = which; + createScene2704(which, 0x004B1D50, 150); + break; + case 23: + _vm->gameState().sceneNum = 23; + _vm->gameState().which = which; + createScene2704(which, 0x004B1D78, 150, kScene2724StaticSprites, &kScene2724ClipRect); + break; + case 24: + _vm->gameState().sceneNum = 24; + _vm->gameState().which = which; + createScene2704(which, 0x004B1DB0, 150, kScene2725StaticSprites, &kScene2725ClipRect); + break; + case 25: + _vm->gameState().sceneNum = 25; + _vm->gameState().which = which; + createScene2704(which, 0x004B1DE8, 150); + break; + case 26: + _vm->gameState().sceneNum = 26; + _vm->gameState().which = which; + createScene2704(which, 0x004B1E10, 150); + break; + case 27: + _vm->gameState().sceneNum = 27; + _vm->gameState().which = which; + createScene2704(which, 0x004B1E38, 150); + break; + case 28: + _vm->gameState().sceneNum = 28; + _vm->gameState().which = which; + createScene2704(which, 0x004B1E60, 150); + break; + case 30: + _vm->gameState().sceneNum = 30; + createStaticScene(0x09507248, 0x0724C09D); + break; + case 31: + _vm->gameState().sceneNum = 31; + _childObject = new Scene2732(_vm, this); + break; + } + SetUpdateHandler(&Module2700::updateScene); + _childObject->handleUpdate(); +} + +#define SceneLinkIf(moduleResult, sceneNum, which) \ + if (_moduleResult == moduleResult) { createScene(sceneNum, which); break; } + +void Module2700::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + SceneLinkIf(1, 1, 0); + leaveModule(0); + break; + case 1: + SceneLinkIf(1, 14, 1); + SceneLinkIf(2, 2, 2); + SceneLinkIf(3, 14, 3); + SceneLinkIf(4, 2, 6); + SceneLinkIf(5, 2, 4); + createScene(0, 1); + break; + case 2: + SceneLinkIf(1, 5, 0); + SceneLinkIf(2, 1, 2); + SceneLinkIf(3, 5, 2); + SceneLinkIf(4, 1, 5); + SceneLinkIf(5, 5, 4); + SceneLinkIf(6, 1, 4); + SceneLinkIf(7, 11, 0); + createScene(3, 0); + break; + case 3: + createScene(2, 0); + break; + case 4: + SceneLinkIf(1, 7, 2); + createScene(5, 5); + break; + case 5: + SceneLinkIf(1, 6, 0); + SceneLinkIf(2, 2, 3); + SceneLinkIf(3, 8, 2); + SceneLinkIf(4, 2, 5); + SceneLinkIf(5, 4, 0); + SceneLinkIf(6, 7, 0); + createScene(2, 1); + break; + case 6: + SceneLinkIf(1, 8, 0); + createScene(5, 1); + break; + case 7: + SceneLinkIf(1, 8, 3); + SceneLinkIf(2, 4, 1); + SceneLinkIf(3, 9, 0); + createScene(5, 6); + break; + case 8: + SceneLinkIf(1, 10, 0); + SceneLinkIf(2, 5, 3); + SceneLinkIf(3, 7, 1); + createScene(6, 1); + break; + case 9: + SceneLinkIf(1, 10, 1); + createScene(7, 3); + break; + case 10: + SceneLinkIf(1, 9, 1); + createScene(8, 1); + break; + case 11: + SceneLinkIf(1, 12, 0); + createScene(2, 7); + break; + case 12: + SceneLinkIf(1, 13, 0); + createScene(11, 1); + break; + case 13: + SceneLinkIf(1, 30, 0); + createScene(12, 1); + break; + case 14: + SceneLinkIf(1, 1, 1); + SceneLinkIf(2, 15, 3); + SceneLinkIf(3, 1, 3); + SceneLinkIf(4, 15, 5); + SceneLinkIf(5, 22, 0); + createScene(15, 1); + break; + case 15: + SceneLinkIf(1, 14, 0); + SceneLinkIf(2, 16, 3); + SceneLinkIf(3, 14, 2); + SceneLinkIf(4, 16, 5); + SceneLinkIf(5, 14, 4); + createScene(16, 1); + break; + case 16: + SceneLinkIf(1, 15, 0); + SceneLinkIf(2, 17, 3); + SceneLinkIf(3, 15, 2); + SceneLinkIf(4, 17, 5); + SceneLinkIf(5, 15, 4); + createScene(17, 1); + break; + case 17: + SceneLinkIf(1, 16, 0); + SceneLinkIf(2, 18, 3); + SceneLinkIf(3, 16, 2); + SceneLinkIf(4, 20, 1); + SceneLinkIf(5, 16, 4); + createScene(18, 1); + break; + case 18: + SceneLinkIf(1, 17, 0); + SceneLinkIf(2, 19, 2); + SceneLinkIf(3, 17, 2); + createScene(19, 0); + break; + case 19: + SceneLinkIf(1, 20, 2); + SceneLinkIf(2, 18, 2); + SceneLinkIf(3, 20, 0); + createScene(18, 0); + break; + case 20: + SceneLinkIf(1, 17, 4); + SceneLinkIf(2, 19, 1); + SceneLinkIf(3, 21, 0); + createScene(19, 3); + break; + case 21: + _vm->_soundMan->deleteMusic(_musicFileHash); + _vm->_soundMan->startMusic(0x04020210, 0, 2); + _vm->_soundMan->deleteSoundGroup(0x42212411); + createScene(20, 3); + break; + case 22: + SceneLinkIf(1, 23, 0); + createScene(14, 5); + break; + case 23: + SceneLinkIf(1, 24, 0); + createScene(22, 1); + break; + case 24: + SceneLinkIf(1, 25, 0); + createScene(23, 1); + break; + case 25: + SceneLinkIf(1, 26, 0); + createScene(24, 1); + break; + case 26: + SceneLinkIf(1, 27, 0); + createScene(25, 1); + break; + case 27: + SceneLinkIf(1, 28, 0); + createScene(26, 1); + break; + case 28: + SceneLinkIf(1, 31, 0); + createScene(27, 1); + break; + case 30: + createScene(13, 1); + break; + case 31: + createScene(28, 1); + break; + } + } else { + switch (_sceneNum) { + case 21: + if (!_raidoMusicInitialized) { + _vm->_soundMan->stopMusic(0x04020210, 0, 1); + _vm->gameModule()->initRadioPuzzle(); + _musicFileHash = getGlobalVar(V_GOOD_RADIO_MUSIC_NAME); + _vm->_soundMan->addMusic(0x42212411, _musicFileHash); + _vm->_soundMan->startMusic(_musicFileHash, 0, 2); + _vm->_soundMan->addSound(0x42212411, 0x44014282); + _vm->_soundMan->setSoundParams(0x44014282, true, 120, 360, 72, 0); + _raidoMusicInitialized = true; + } + break; + } + } +} + +uint32 Module2700::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Module::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x200D: + playSound(_soundIndex); + _soundIndex++; + if (_soundIndex >= 4) + _soundIndex = 0; + break; + } + return messageResult; +} + +void Module2700::createScene2703(int which, uint32 trackInfoId) { + _childObject = new Scene2703(_vm, this, which, trackInfoId); +} + +void Module2700::createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites, const NRect *clipRect) { + _childObject = new Scene2704(_vm, this, which, trackInfoId, value, staticSprites, clipRect); +} + +static const NPoint kCarShadowOffsets[] = { + {-63, 3}, {-48, 40}, {-33, 58}, + { 0, 65}, { 40, 53}, { 56, 27}, + { 63, 0}, {-30, 26}, { 0, 30}, + { 26, 25} +}; + +SsCommonTrackShadowBackground::SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash) + : StaticSprite(vm, 0) { + + loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition, 0); +} + +AsCommonCarShadow::AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index) + : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index), _animFileHash(0) { + + SetUpdateHandler(&AsCommonCarShadow::update); + createShadowSurface(shadowSurface, 211, 147, 100); + updateShadow(); +} + +void AsCommonCarShadow::update() { + updateShadow(); + AnimatedSprite::update(); +} + +void AsCommonCarShadow::updateShadow() { + if (_asCar->getFrameIndex() != _currFrameIndex || _asCar->getCurrAnimFileHash() != _animFileHash) { + uint32 fileHash = _asCar->getCurrAnimFileHash(); + if (fileHash == 0x35698F78 || fileHash == 0x192ADD30 || fileHash == 0x9C220DA4 || + fileHash == 0x9966B138 || fileHash == 0xB579A77C || fileHash == 0xA86A9538 || + fileHash == 0xD4220027 || fileHash == 0xD00A1364 || fileHash == 0xD4AA03A4 || + fileHash == 0xF46A0324) { + startAnimation(fileHash, _asCar->getFrameIndex(), -1); + _newStickFrameIndex = _asCar->getFrameIndex(); + } + _animFileHash = fileHash; + } + _x = _asCar->getX() + kCarShadowOffsets[_index].x; + _y = _asCar->getY() + kCarShadowOffsets[_index].y; + if (!_asCar->getVisible()) { + startAnimation(0x1209E09F, 0, -1); + _newStickFrameIndex = 0; + } + setDoDeltaX(_asCar->isDoDeltaX() ? 1 : 0); +} + +AsCommonCarConnectorShadow::AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index) + : AnimatedSprite(vm, 1100), _asCar(asCar), _index(index) { + + SetUpdateHandler(&AsCommonCarConnectorShadow::update); + createShadowSurface1(shadowSurface, 0x60281C10, 150); + startAnimation(0x60281C10, -1, -1); + _newStickFrameIndex = STICK_LAST_FRAME; +} + +void AsCommonCarConnectorShadow::update() { + _x = _asCar->getX() + kCarShadowOffsets[_index].x; + _y = _asCar->getY() + kCarShadowOffsets[_index].y; + AnimatedSprite::update(); +} + +AsCommonCarTrackShadow::AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex) + : AnimatedSprite(vm, 1100), _asCar(asCar) { + + SetUpdateHandler(&AsCommonCarTrackShadow::update); + createShadowSurface1(shadowSurface, 0x0759129C, 100); + startAnimation(0x0759129C, frameIndex, -1); + _newStickFrameIndex = frameIndex; +} + +void AsCommonCarTrackShadow::update() { + _x = _asCar->getX(); + _y = _asCar->getY(); + AnimatedSprite::update(); +} + +Scene2701::Scene2701(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + NRect clipRect; + TrackInfo *tracks = _vm->_staticData->getTrackInfo(0x004B2240); + setGlobalVar(V_CAR_DELTA_X, 1); + + setBackground(tracks->bgFilename); + setPalette(tracks->bgFilename); + _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); + insertScreenMouse(0x08B08180); + + tempSprite = insertStaticSprite(0x1E086325, 1200); + clipRect.set(0, 0, 640, tempSprite->getDrawRect().y2()); + + if (tracks->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); + addEntity(_ssTrackShadowBackground); + _asCar = insertSprite(this, 320, 240); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + } else { + _ssTrackShadowBackground = NULL; + _asCar = insertSprite(this, 320, 240); + } + + _asCarConnector = insertSprite(_asCar); + _which1 = tracks->which1; + _which2 = tracks->which2; + _dataResource.load(tracks->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); + _asCar->setPathPoints(_trackPoints); + + if (which == _which2) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_asCar, 0x2007, 150); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_asCar, 0x2002, 0); + if (testPoint.x < 0 || testPoint.x >= 640 || testPoint.y < 0 || testPoint.y >= 480) + sendMessage(_asCar, 0x2008, 150); + } + + _asCar->setClipRect(clipRect); + _asCarConnector->setClipRect(clipRect); + + if (which == 1) { + SetMessageHandler(&Scene2701::hmRidingCar); + } else { + sendMessage(_asCar, 0x2009, 0); + SetMessageHandler(&Scene2701::hmCarAtHome); + } + +} + +uint32 Scene2701::hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + sendPointMessage(_asCar, 0x2004, param.asPoint()); + break; + case 0x2005: + if (_which1 >= 0) + SetMessageHandler(&Scene2701::hmCarAtHome); + break; + case 0x2006: + if (_which2 >= 0) + leaveScene(_which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +uint32 Scene2701::hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x >= 385) + leaveScene(0); + else { + sendPointMessage(_asCar, 0x2004, param.asPoint()); + SetMessageHandler(&Scene2701::hmRidingCar); + } + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +Scene2702::Scene2702(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _isInLight(true), _newTrackIndex(-1) { + + SetMessageHandler(&Scene2702::handleMessage); + SetUpdateHandler(&Scene2702::update); + + setBackground(0x18808B00); + setPalette(0x18808B00); + _palette->addPalette(calcHash("paPodFloor"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayFloor"), 0, 65, 0); + addEntity(_palette); + insertScreenMouse(0x08B04180); + + _ssTrackShadowBackground = createSprite(0x12002035); + addEntity(_ssTrackShadowBackground); + _asCar = insertSprite(this, 320, 240); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + insertSprite(_asCar); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _dataResource.load(0x04310014); + + if (which == 1) { + _isUpperTrack = false; + _currTrackIndex = 1; + } else if (which == 2) { + _isUpperTrack = false; + _currTrackIndex = 2; + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _isInLight = false; + } else if (which == 3) { + _isUpperTrack = true; + _currTrackIndex = 0; + } else if (which == 4) { + _isUpperTrack = true; + _currTrackIndex = 2; + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _isInLight = false; + } else if (which == 5) { + _isUpperTrack = true; + _currTrackIndex = 1; + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _isInLight = false; + } else { + _isUpperTrack = false; + _currTrackIndex = 0; + } + + if (_isUpperTrack) { + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F68)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5F8C)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FB0)); + } else { + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FD8)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B5FFC)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B6020)); + } + + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + + if (which == _tracks[_currTrackIndex]->which2) { + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2007, 150); + } else { + sendMessage(_asCar, 0x2002, 0); + sendMessage(_asCar, 0x2008, 150); + } + + _palette->copyBasePalette(0, 256, 0); + +} + +void Scene2702::update() { + Scene::update(); + if (_isInLight && _asCar->getX() > 422) { + _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); + _palette->startFadeToPalette(12); + _isInLight = false; + } else if (!_isInLight && _asCar->getX() <= 422) { + _palette->addBasePalette(calcHash("paPodFloor"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayFloor"), 0, 65, 0); + _palette->startFadeToPalette(12); + _isInLight = true; + } +} + +uint32 Scene2702::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + moveCarToPoint(param.asPoint()); + break; + case 0x2005: + if (_newTrackIndex >= 0) { + if (_tracks[_currTrackIndex]->which1 < 0) + changeTrack(); + } else if (_tracks[_currTrackIndex]->which1 >= 0) + leaveScene(_tracks[_currTrackIndex]->which1); + break; + case 0x2006: + if (_newTrackIndex >= 0) { + if (_tracks[_currTrackIndex]->which2 < 0) + changeTrack(); + } else if (_tracks[_currTrackIndex]->which2 >= 0) + leaveScene(_tracks[_currTrackIndex]->which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +void Scene2702::moveCarToPoint(NPoint pt) { + int minMatchTrackIndex, minMatchDistance; + _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); + if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { + _newTrackIndex = minMatchTrackIndex; + _newTrackDestX = pt.x; + if (_isUpperTrack) { + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2003, 0); + } else if (_currTrackIndex == 2) + sendMessage(_asCar, 0x2003, 0); + else + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); + } else { + _newTrackIndex = -1; + sendMessage(_asCar, 0x2004, pt.x); + } +} + +void Scene2702::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + if (_isUpperTrack) { + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2002, 0); + } else if (_currTrackIndex == 2) + sendMessage(_asCar, 0x2002, 0); + else + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + sendMessage(_asCar, 0x2004, _newTrackDestX); + _newTrackIndex = -1; +} + +Scene2703::Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId) + : Scene(vm, parentModule) { + + TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId); + + SetMessageHandler(&Scene2703::handleMessage); + SetUpdateHandler(&Scene2703::update); + + setBackground(tracks->bgFilename); + setPalette(tracks->bgFilename); + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + addEntity(_palette); + insertScreenMouse(tracks->mouseCursorFilename); + + _palStatus = 2; + + if (tracks->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); + addEntity(_ssTrackShadowBackground); + _asCar = insertSprite(this, 320, 240); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + } else { + _ssTrackShadowBackground = NULL; + _asCarShadow = NULL; + _asCar = insertSprite(this, 320, 240); + } + + _asCarConnector = insertSprite(_asCar); + _which1 = tracks->which1; + _which2 = tracks->which2; + _dataResource.load(tracks->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); + _asCar->setPathPoints(_trackPoints); + + if (which == _which2) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_asCar, 0x2009, 0); + else + sendMessage(_asCar, 0x2007, 150); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_asCar, 0x2002, 0); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_asCar, 0x2009, 0); + else + sendMessage(_asCar, 0x2008, 150); + } + + if (which == 0) { + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + _palStatus = 1; + } else if (which == 2 || which == 4 || which == 6) { + _palette->addPalette(calcHash("paPodBlack"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayBlack"), 0, 65, 0); + _palStatus = 0; + } + + _palette->copyBasePalette(0, 256, 0); + +} + +void Scene2703::update() { + Scene::update(); + if (_mouseClicked) { + sendPointMessage(_asCar, 0x2004, _mouseClickPos); + _mouseClicked = false; + } + if (_asCar->getX() > 469) { + if (_palStatus != 2) { + _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); + _palette->startFadeToPalette(12); + _palStatus = 2; + } + } else if (_asCar->getX() > 181) { + if (_palStatus != 1) { + _palette->addBasePalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayShade"), 0, 65, 0); + _palette->startFadeToPalette(12); + _palStatus = 1; + } + } else if (_palStatus != 0) { + _palette->addBasePalette(calcHash("paPodBlack"), 65, 31, 65); + _palette->addBasePalette(calcHash("paKlayBlack"), 0, 65, 0); + _palette->startFadeToPalette(12); + _palStatus = 0; + } +} + +uint32 Scene2703::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (_which1 >= 0) + leaveScene(_which1); + break; + case 0x2006: + if (_which2 >= 0) + leaveScene(_which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +Scene2704::Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value, + const uint32 *staticSprites, const NRect *clipRect) + : Scene(vm, parentModule) { + + TrackInfo *tracks = _vm->_staticData->getTrackInfo(trackInfoId); + + SetMessageHandler(&Scene2704::handleMessage); + SetUpdateHandler(&Scene2704::update); + + setBackground(tracks->bgFilename); + setPalette(tracks->bgFilename); + + if (tracks->exPaletteFilename1) + _palette->addPalette(tracks->exPaletteFilename1, 0, 65, 0); + + if (tracks->exPaletteFilename2) + _palette->addPalette(tracks->exPaletteFilename2, 65, 31, 65); + + while (staticSprites && *staticSprites) + insertStaticSprite(*staticSprites++, 1100); + + insertScreenMouse(tracks->mouseCursorFilename); + + if (tracks->bgShadowFilename) { + _ssTrackShadowBackground = createSprite(tracks->bgShadowFilename); + addEntity(_ssTrackShadowBackground); + _asCar = insertSprite(this, 320, 240); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + } else { + _ssTrackShadowBackground = NULL; + _asCarShadow = NULL; + _asCar = insertSprite(this, 320, 240); + } + + _asCarConnector = insertSprite(_asCar); + _which1 = tracks->which1; + _which2 = tracks->which2; + _dataResource.load(tracks->dataResourceFilename); + _trackPoints = _dataResource.getPointArray(tracks->trackPointsName); + _asCar->setPathPoints(_trackPoints); + + if (which == _which2) { + NPoint testPoint = (*_trackPoints)[_trackPoints->size() - 1]; + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_asCar, 0x2009, 0); + else + sendMessage(_asCar, 0x2007, 0); + } else { + NPoint testPoint = (*_trackPoints)[0]; + sendMessage(_asCar, 0x2002, 0); + if (testPoint.x > 0 && testPoint.x < 640 && testPoint.y > 0 && testPoint.y < 480) + sendMessage(_asCar, 0x2009, 0); + else + sendMessage(_asCar, 0x2008, 0); + } + + if (clipRect) { + _asCar->getClipRect() = *clipRect; + if (_asCarShadow) + _asCarShadow->getClipRect() = *clipRect; + if (_asCarTrackShadow) + _asCarTrackShadow->getClipRect() = *clipRect; + if (_asCarConnectorShadow) + _asCarConnectorShadow->getClipRect() = *clipRect; + if (_asCarConnector) + _asCarConnector->getClipRect() = *clipRect; + } + +} + +void Scene2704::update() { + Scene::update(); + if (_mouseClicked) { + sendPointMessage(_asCar, 0x2004, _mouseClickPos); + _mouseClicked = false; + } +} + +uint32 Scene2704::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (_which1 >= 0) + leaveScene(_which1); + break; + case 0x2006: + if (_which2 >= 0) + leaveScene(_which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +Scene2706::Scene2706(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _newTrackIndex(-1) { + + SetMessageHandler(&Scene2706::handleMessage); + + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22A0)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22C4)); + _tracks.push_back(_vm->_staticData->getTrackInfo(0x004B22E8)); + + setBackground(0x18808B88); + setPalette(0x18808B88); + + _palette->addPalette(calcHash("paPodShade"), 65, 31, 65); + _palette->addPalette(calcHash("paKlayShade"), 0, 65, 0); + + insertScreenMouse(0x08B8C180); + + _ssTrackShadowBackground = createSprite(0x18808B88); + addEntity(_ssTrackShadowBackground); + + _asCar = insertSprite(this, 320, 240); + _asCarShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnector = insertSprite(_asCar); + _asCarTrackShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + _asCarConnectorShadow = insertSprite(_asCar, _ssTrackShadowBackground->getSurface(), 4); + + _dataResource.load(0x06000162); + + if (which == 5) + _currTrackIndex = 2; + else if (which == 6) + _currTrackIndex = 1; + else + _currTrackIndex = 0; + + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + + if (which == _tracks[_currTrackIndex]->which2) { + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + if (which == 5) + sendMessage(_asCar, 0x2007, 50); + else + sendMessage(_asCar, 0x2007, 150); + } else { + sendMessage(_asCar, 0x2002, 0); + if (which == 5) + sendMessage(_asCar, 0x2008, 50); + else + sendMessage(_asCar, 0x2008, 150); + } + +} + +uint32 Scene2706::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + moveCarToPoint(param.asPoint()); + break; + case 0x2005: + if (_newTrackIndex >= 0) { + if (_tracks[_currTrackIndex]->which1 < 0) + changeTrack(); + } else if (_tracks[_currTrackIndex]->which1 >= 0) + leaveScene(_tracks[_currTrackIndex]->which1); + break; + case 0x2006: + if (_newTrackIndex >= 0) { + if (_tracks[_currTrackIndex]->which2 < 0) + changeTrack(); + } else if (_tracks[_currTrackIndex]->which2 >= 0) + leaveScene(_tracks[_currTrackIndex]->which2); + break; + case 0x200D: + sendMessage(_parentModule, 0x200D, 0); + break; + } + return 0; +} + +void Scene2706::moveCarToPoint(NPoint pt) { + int minMatchTrackIndex, minMatchDistance; + _tracks.findTrackPoint(pt, minMatchTrackIndex, minMatchDistance, _dataResource); + if (minMatchTrackIndex >= 0 && minMatchTrackIndex != _currTrackIndex) { + _newTrackIndex = minMatchTrackIndex; + _newTrackDestX = pt.x; + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2003, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2003, 0); + } else { + _newTrackIndex = -1; + sendMessage(_asCar, 0x2004, pt.x); + } +} + +void Scene2706::changeTrack() { + _currTrackIndex = _newTrackIndex; + _trackPoints = _dataResource.getPointArray(_tracks[_currTrackIndex]->trackPointsName); + _asCar->setPathPoints(_trackPoints); + if (_currTrackIndex == 0) + sendMessage(_asCar, 0x2002, _trackPoints->size() - 1); + else + sendMessage(_asCar, 0x2002, 0); + sendMessage(_asCar, 0x2004, _newTrackDestX); + _newTrackIndex = -1; +} + +Scene2732::Scene2732(NeverhoodEngine *vm, Module *parentModule) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + setBackground(0x0220C041); + setPalette(0x0220C041); + insertScreenMouse(0x0C04502A); + setRectList(0x004AE360); + + insertKlaymen(108, 331); + setMessageList(0x004AE328); + + tempSprite = insertStaticSprite(0x50C22C48, 1100); + _klaymen->setClipRect(tempSprite->getDrawRect().x, 0, 640, 480); + +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2700.h b/engines/neverhood/modules/module2700.h new file mode 100644 index 0000000000..003666bb7f --- /dev/null +++ b/engines/neverhood/modules/module2700.h @@ -0,0 +1,182 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2700_H +#define NEVERHOOD_MODULES_MODULE2700_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1600.h" + +namespace Neverhood { + +// Module2700 + +class Module2700 : public Module { +public: + Module2700(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2700(); +protected: + int _sceneNum; + int _soundIndex; + bool _raidoMusicInitialized; + uint32 _scene2711StaticSprites[6]; + uint32 _musicFileHash; + void createScene(int sceneNum, int which); + void updateScene(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void createScene2703(int which, uint32 trackInfoId); + void createScene2704(int which, uint32 trackInfoId, int16 value, const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); +}; + +class SsCommonTrackShadowBackground : public StaticSprite { +public: + SsCommonTrackShadowBackground(NeverhoodEngine *vm, uint32 fileHash); +}; + +class AsCommonCarShadow : public AnimatedSprite { +public: + AsCommonCarShadow(NeverhoodEngine *vm, AnimatedSprite *asCar, BaseSurface *shadowSurface, uint index); +protected: + uint _index; + AnimatedSprite *_asCar; + uint32 _animFileHash; + void update(); + void updateShadow(); +}; + +class AsCommonCarConnectorShadow : public AnimatedSprite { +public: + AsCommonCarConnectorShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, uint index); +protected: + uint _index; + Sprite *_asCar; + void update(); +}; + +class AsCommonCarTrackShadow : public AnimatedSprite { +public: + AsCommonCarTrackShadow(NeverhoodEngine *vm, Sprite *asCar, BaseSurface *shadowSurface, int16 frameIndex); +protected: + Sprite *_asCar; + void update(); +}; + +class Scene2701 : public Scene { +public: + Scene2701(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; + Sprite *_asCarConnector; + int _which1, _which2; + NPointArray *_trackPoints; + uint32 hmRidingCar(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmCarAtHome(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2702 : public Scene { +public: + Scene2702(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; + int16 _newTrackDestX; + bool _isInLight; + int _currTrackIndex, _newTrackIndex; + bool _isUpperTrack; + Tracks _tracks; + NPointArray *_trackPoints; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void moveCarToPoint(NPoint pt); + void changeTrack(); +}; + +class Scene2703 : public Scene { +public: + Scene2703(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarConnector; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; + int _palStatus; + int _which1, _which2; + NPointArray *_trackPoints; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2704 : public Scene { +public: + Scene2704(NeverhoodEngine *vm, Module *parentModule, int which, uint32 trackInfoId, int16 value, + const uint32 *staticSprites = NULL, const NRect *clipRect = NULL); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarConnector; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; + int _which1, _which2; + NPointArray *_trackPoints; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2706 : public Scene { +public: + Scene2706(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + AsCommonCar *_asCar; + Sprite *_ssTrackShadowBackground; + Sprite *_asCarShadow; + Sprite *_asCarConnector; + Sprite *_asCarTrackShadow; + Sprite *_asCarConnectorShadow; + int16 _newTrackDestX; + int _currTrackIndex, _newTrackIndex; + Tracks _tracks; + NPointArray *_trackPoints; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void moveCarToPoint(NPoint pt); + void changeTrack(); +}; + +class Scene2732 : public Scene { +public: + Scene2732(NeverhoodEngine *vm, Module *parentModule); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2700_H */ diff --git a/engines/neverhood/modules/module2800.cpp b/engines/neverhood/modules/module2800.cpp new file mode 100644 index 0000000000..183de8e6b2 --- /dev/null +++ b/engines/neverhood/modules/module2800.cpp @@ -0,0 +1,3205 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2800.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1000.h" +#include "neverhood/modules/module1200.h" +#include "neverhood/modules/module1700.h" +#include "neverhood/modules/module2200.h" +#include "neverhood/diskplayerscene.h" + +namespace Neverhood { + +Module2800::Module2800(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _musicResource(NULL) { + + _currentMusicFileHash = 0; + _vm->_soundMan->addMusic(0x64210814, 0xD2FA4D14); + setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 1); + + if (which < 0) { + createScene(_vm->gameState().sceneNum, which); + } else if (which == 2) { + createScene(4, 3); + } else if (which == 1) { + createScene(4, 1); + } else { + createScene(0, 0); + } + +} + +Module2800::~Module2800() { + if (_musicResource) { + _musicResource->unload(); + delete _musicResource; + } + _vm->_soundMan->deleteGroup(0x64210814); +} + +void Module2800::createScene(int sceneNum, int which) { + debug("Module2800::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); + _childObject = new Scene2801(_vm, this, which); + break; + case 1: + _vm->gameState().sceneNum = 1; + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); + if (getGlobalVar(V_RADIO_ENABLED)) + _childObject = new Scene2802(_vm, this, which); + else + createStaticScene(0x000C6444, 0xC6440008); + break; + case 2: + _vm->gameState().sceneNum = 2; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + if (getGlobalVar(V_KLAYMEN_SMALL)) + _childObject = new Scene2803Small(_vm, this, which); + else + _childObject = new Scene2803(_vm, this, which); + break; + case 3: + _vm->gameState().sceneNum = 3; + _childObject = new Scene2804(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 4; + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2805(_vm, this, which); + break; + case 5: + _vm->gameState().sceneNum = 5; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2806(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 6; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2807(_vm, this, which); + break; + case 7: + _vm->gameState().sceneNum = 7; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2808(_vm, this, 0); + break; + case 8: + _vm->gameState().sceneNum = 8; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2809(_vm, this, which); + break; + case 9: + _vm->gameState().sceneNum = 9; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2810(_vm, this, which); + break; + case 10: + _vm->gameState().sceneNum = 10; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2808(_vm, this, 1); + break; + case 11: + _vm->gameState().sceneNum = 11; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2812(_vm, this, which); + break; + case 12: + _vm->gameState().sceneNum = 12; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x0000A245, 0x0A241008); + break; + case 13: + _vm->gameState().sceneNum = 13; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x81C60635, 0x60631814); + break; + case 14: + _vm->gameState().sceneNum = 14; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0xCA811204, 0x11200CA0); + break; + case 15: + _vm->gameState().sceneNum = 15; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x2D438A00, 0x38A042DC); + break; + case 16: + _vm->gameState().sceneNum = 16; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x0A806204, 0x062000A0); + break; + case 17: + _vm->gameState().sceneNum = 17; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x010F9284, 0xF9280018); + break; + case 18: + _vm->gameState().sceneNum = 18; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x0100022B, 0x0022F018); + break; + case 19: + _vm->gameState().sceneNum = 19; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x10866205, 0x66201100); + break; + case 20: + _vm->gameState().sceneNum = 20; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x01C58000, 0x58004014); + break; + case 21: + _vm->gameState().sceneNum = 21; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new Scene2822(_vm, this, which); + break; + case 22: + _vm->gameState().sceneNum = 22; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x9408121E, 0x8121A948); + break; + case 23: + _vm->gameState().sceneNum = 23; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x048C0600, 0xC0604040); + break; + case 24: + _vm->gameState().sceneNum = 24; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + createStaticScene(0x04270A94, 0x70A9004A); + break; + case 25: + _vm->gameState().sceneNum = 25; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) + createStaticScene(0x01600204, 0x0020001E); + else + createStaticScene(0x08611204, 0x1120008E); + break; + case 26: + _vm->gameState().sceneNum = 26; + _vm->_soundMan->startMusic(0xD2FA4D14, 0, 2); + _childObject = new DiskplayerScene(_vm, this, 4); + break; + case 1001: + _vm->_soundMan->stopMusic(0xD2FA4D14, 0, 0); + createSmackerScene(0x00800801, true, true, false); + break; + } + SetUpdateHandler(&Module2800::updateScene); + _childObject->handleUpdate(); +} + +void Module2800::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult != 2) { + if (_musicResource) { + _musicResource->unload(); + delete _musicResource; + _musicResource = NULL; + } + _currentMusicFileHash = 0; + } + if (_moduleResult == 1) { + createScene(2, 0); + } else if (_moduleResult == 2) { + createScene(1, 0); + } else { + leaveModule(0); + } + break; + case 1: + if (_moduleResult == 0) { + createScene(0, 2); + } else { + createScene(1001, -1); + } + break; + case 2: + if (_moduleResult == 1) + createScene(3, 0); + else if (_moduleResult == 2) + createScene(5, 0); + else if (_moduleResult == 3) + createScene(6, 0); + else if (_moduleResult == 4) + createScene(9, 0); + else if (_moduleResult == 5) + createScene(25, 0); + else + createScene(0, 1); + break; + case 3: + createScene(2, 1); + break; + case 4: + if (_moduleResult == 1) { + leaveModule(1); + } else { + createScene(11, 1); + } + break; + case 5: + if (_moduleResult == 1) { + createScene(7, 0); + } else { + createScene(2, 2); + } + break; + case 6: + createScene(2, 3); + break; + case 7: + createScene(5, _moduleResult); + break; + case 8: + if (_moduleResult == 1) + createScene(10, 0); + else + createScene(9, 4); + break; + case 9: + if (_moduleResult == 1) + createScene(11, 0); + else if (_moduleResult == 2) + createScene(2, 0); + else if (_moduleResult == 3) + createScene(24, 0); + else if (_moduleResult == 4) + createScene(8, 0); + else if (_moduleResult == 6) + createScene(2, 6); + else if (_moduleResult == 11) + createScene(12, 0); + else if (_moduleResult == 12) + createScene(13, 0); + else if (_moduleResult == 13) + createScene(14, 0); + else if (_moduleResult == 14) + createScene(15, 0); + else if (_moduleResult == 15) + createScene(16, 0); + else if (_moduleResult == 16) + createScene(17, 0); + else if (_moduleResult == 17) + createScene(18, 0); + else if (_moduleResult == 18) + createScene(19, 0); + else if (_moduleResult == 19) + createScene(20, 0); + else if (_moduleResult == 20) + createScene(21, 0); + else if (_moduleResult == 21) + createScene(22, 0); + else if (_moduleResult == 22) + createScene(23, 0); + else + createScene(2, 4); + break; + case 10: + createScene(8, _moduleResult); + break; + case 11: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 2) + createScene(26, 0); + else if (_moduleResult == 3) + createScene(9, 5); + else + createScene(9, 1); + break; + case 12: + createScene(9, 11); + break; + case 13: + createScene(9, 12); + break; + case 14: + createScene(9, 13); + break; + case 15: + createScene(9, 14); + break; + case 16: + createScene(9, 15); + break; + case 17: + createScene(9, 16); + break; + case 18: + createScene(9, 17); + break; + case 19: + createScene(9, 18); + break; + case 20: + createScene(9, 19); + break; + case 21: + createScene(9, 20); + break; + case 22: + createScene(9, 21); + break; + case 23: + createScene(9, 22); + break; + case 24: + createScene(9, 3); + break; + case 25: + createScene(2, 5); + break; + case 26: + createScene(11, 2); + break; + case 1001: + createScene(1, -1); + break; + } + } else { + switch (_sceneNum) { + case 0: + updateMusic(true); + break; + case 1: + updateMusic(false); + break; + } + } +} + +void Module2800::updateMusic(bool halfVolume) { + + uint32 newMusicFileHash = _vm->_gameModule->getCurrRadioMusicFileHash(); + + if (!_musicResource) + _musicResource = new MusicResource(_vm); + + if (newMusicFileHash != _currentMusicFileHash) { + _currentMusicFileHash = newMusicFileHash; + if (_currentMusicFileHash != 0) { + _musicResource->load(_currentMusicFileHash); + _musicResource->setVolume(halfVolume ? 60 : 100); + _musicResource->play(0); + } else { + _musicResource->stop(0); + } + } else if (_currentMusicFileHash != 0) { + if (!_musicResource->isPlaying()) { + _musicResource->setVolume(halfVolume ? 60 : 100); + _musicResource->play(0); + } else { + _musicResource->setVolume(halfVolume ? 60 : 100); + } + } else { + _musicResource->stop(0); + } + +} + +Scene2801::Scene2801(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *_sprite1; + Sprite *_sprite2; + + _vm->gameModule()->initRadioPuzzle(); + + SetMessageHandler(&Scene2801::handleMessage); + SetUpdateHandler(&Scene::update); + + // Display the disabled radio; only possible when the left door is open + if (!getGlobalVar(V_RADIO_ENABLED)) + insertStaticSprite(0x0001264C, 100); + + if (which < 0) { + insertKlaymen(194, 430); + setMessageList(0x004B6BB8); + } else if (which == 1) { + insertKlaymen(443, 398); + setMessageList(0x004B6BC0); + } else if (which == 2) { + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(312, 432); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen(194, 432); + } + setMessageList(0x004B6C10); + } else { + insertKlaymen(0, 432); + setMessageList(0x004B6BB0); + } + + if (getGlobalVar(V_RADIO_ROOM_LEFT_DOOR)) { + setRectList(0x004B6CE0); + setBackground(0x01400666); + setPalette(0x01400666); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x01400666, 0, 256, 0); + _sprite1 = insertStaticSprite(0x100CA0A8, 1100); + _sprite2 = insertStaticSprite(0x287C21A4, 1100); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + insertScreenMouse(0x0066201C); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); + addCollisionSprite(_asTape); + } else if (getGlobalVar(V_RADIO_ROOM_RIGHT_DOOR)) { + setRectList(0x004B6CD0); + setBackground(0x11E00684); + setPalette(0x11E00684); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x11E00684, 0, 256, 0); + _sprite2 = insertStaticSprite(0x061601C8, 1100); + _klaymen->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + insertScreenMouse(0x00680116); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x01142428); + addCollisionSprite(_asTape); + } else { + setRectList(0x004B6CF0); + setBackground(0x030006E6); + setPalette(0x030006E6); + _paletteHash = 0x15021024; + _palette->addBasePalette(0x030006E6, 0, 256, 0); + _sprite2 = insertStaticSprite(0x273801CE, 1100); + _klaymen->setClipRect(0, 0, _sprite2->getDrawRect().x2(), 480); + insertScreenMouse(0x006E2038); + _asTape = insertSprite(this, 8, 1100, 302, 437, 0x9148A011); + addCollisionSprite(_asTape); + } + + addEntity(_palette); + + if (which == 1) { + _palette->addPalette(0xB103B604, 0, 65, 0); + _palette->addBasePalette(0xB103B604, 0, 65, 0); + } else { + _palette->addPalette(_paletteHash, 0, 65, 0); + _palette->addBasePalette(_paletteHash, 0, 65, 0); + } + +} + +Scene2801::~Scene2801() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); +} + +uint32 Scene2801::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4826: + if (sender == _asTape) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004B6C40); + } + break; + case 0x482A: + _palette->addBasePalette(0xB103B604, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + case 0x482B: + _palette->addBasePalette(_paletteHash, 0, 65, 0); + _palette->startFadeToPalette(12); + break; + } + return messageResult; +} + +Scene2802::Scene2802(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _currTuneStatus(0), _countdown1(0), _countdown2(0) { + + SetMessageHandler(&Scene2802::handleMessage); + SetUpdateHandler(&Scene2802::update); + insertPuzzleMouse(0x008810A8, 20, 620); + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, 0x8284C100, true, true, true)); + _currRadioMusicIndex = getGlobalVar(V_CURR_RADIO_MUSIC_INDEX); + // Need to go to the first frame first to load up the palette + _smackerPlayer->gotoFrame(0); + // Now we can actually set the current radio frame + _smackerPlayer->gotoFrame(_currRadioMusicIndex); + _vm->_soundMan->addSound(0x04360A18, 0x422630C2); + _vm->_soundMan->addSound(0x04360A18, 0x00632252); + _vm->_soundMan->addSound(0x04360A18, 0x00372241); + _vm->_soundMan->setSoundVolume(0x00372241, 60); + changeTuneStatus(0, 0); + _vm->_soundMan->playSoundLooping(0x00372241); +} + +Scene2802::~Scene2802() { + _vm->_soundMan->deleteSoundGroup(0x04360A18); + if (_currRadioMusicIndex == 0) { + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 1); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); + } else if (_currRadioMusicIndex == getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)) { + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 1); + } else { + setGlobalVar(V_RADIO_ROOM_LEFT_DOOR, 0); + setGlobalVar(V_RADIO_ROOM_RIGHT_DOOR, 0); + } + setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex); +} + +void Scene2802::update() { + int prevTuneStatus = _currTuneStatus; + uint prevRadioMusicIndex = _currRadioMusicIndex; + + Scene::update(); + if (_countdown1 > 0) + --_countdown1; + else if (_currTuneStatus == 1) + _currTuneStatus = 3; + else if (_currTuneStatus == 4) + _currTuneStatus = 6; + + switch (_currTuneStatus) { + case 2: + if (_currRadioMusicIndex < 90) + incRadioMusicIndex(+1); + _currTuneStatus = 0; + break; + case 3: + if (_countdown2 > 0) + --_countdown2; + else if (_currRadioMusicIndex < 90) { + incRadioMusicIndex(+1); + _countdown2 = 1; + } else + _currTuneStatus = 0; + break; + case 5: + if (_currRadioMusicIndex > 0) + incRadioMusicIndex(-1); + _currTuneStatus = 0; + break; + case 6: + if (_countdown2 > 0) + --_countdown2; + else if (_currRadioMusicIndex > 0) { + incRadioMusicIndex(-1); + _countdown2 = 1; + } else + _currTuneStatus = 0; + break; + + } + + if (prevRadioMusicIndex != _currRadioMusicIndex) + _smackerPlayer->gotoFrame(_currRadioMusicIndex); + + if (prevTuneStatus != _currTuneStatus) + changeTuneStatus(prevTuneStatus, _currTuneStatus); + + //DEBUG>>> + //debug("_currRadioMusicIndex = %d; V_GOOD_RADIO_MUSIC_INDEX = %d", _currRadioMusicIndex, getGlobalVar(V_GOOD_RADIO_MUSIC_INDEX)); + //DEBUG<<< + + if (getGlobalVar(V_RADIO_MOVE_DISH_VIDEO) && prevTuneStatus != _currTuneStatus && _currRadioMusicIndex != 0) { + setGlobalVar(V_RADIO_MOVE_DISH_VIDEO, 0); + leaveScene(1); + } + +} + +uint32 Scene2802::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + int prevTuneStatus = _currTuneStatus; + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } else if (_currTuneStatus == 0) { + if (param.asPoint().x > 180 && param.asPoint().x < 300 && + param.asPoint().y > 130 && param.asPoint().y < 310) { + _currTuneStatus = 4; + } else if (param.asPoint().x > 300 && param.asPoint().x < 400 && + param.asPoint().y > 130 && param.asPoint().y < 310) { + _currTuneStatus = 1; + } + if (_currTuneStatus == 1 || _currTuneStatus == 4) { + _countdown1 = 8; + changeTuneStatus(0, _currTuneStatus); + } + } + break; + case 0x0002: + if (_countdown1 == 0) + _currTuneStatus = 0; + else { + if (_currTuneStatus == 1) + _currTuneStatus = 2; + else if (_currTuneStatus == 4) + _currTuneStatus = 5; + else + _currTuneStatus = 0; + _countdown1 = 0; + } + if (prevTuneStatus != _currTuneStatus) + changeTuneStatus(prevTuneStatus, _currTuneStatus); + break; + } + return 0; +} + +void Scene2802::incRadioMusicIndex(int delta) { + _currRadioMusicIndex += delta; + setGlobalVar(V_CURR_RADIO_MUSIC_INDEX, _currRadioMusicIndex); +} + +void Scene2802::changeTuneStatus(int prevTuneStatus, int newTuneStatus) { + + if (prevTuneStatus == 3 || prevTuneStatus == 6) { + _vm->_soundMan->stopSound(0x422630C2); + _vm->_soundMan->stopSound(0x00632252); + } + + if (newTuneStatus == 0) { + if (_vm->_gameModule->getCurrRadioMusicFileHash() != 0) + _vm->_soundMan->stopSound(0x00632252); + else + _vm->_soundMan->playSoundLooping(0x00632252); + } else if (newTuneStatus == 3 || newTuneStatus == 6) { + _vm->_soundMan->playSoundLooping(0x422630C2); + _vm->_soundMan->playSoundLooping(0x00632252); + } + +} + +AsScene2803LightCord::AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _fileHash1(fileHash1), _fileHash2(fileHash2), + _isPulled(false), _isBusy(false) { + + createSurface(1010, 28, 379); + SetUpdateHandler(&AnimatedSprite::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + _x = x; + _y = y; + stIdle(); +} + +uint32 AsScene2803LightCord::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (!_isBusy && param.asInteger() == calcHash("ClickSwitch")) { + sendMessage(_parentScene, 0x480F, 0); + playSound(0, 0x4E1CA4A0); + } + break; + case 0x480F: + stPulled(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene2803LightCord::hmPulled(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2803LightCord::stPulled() { + _isBusy = false; + _isPulled = true; + startAnimation(_fileHash2, 0, -1); + SetMessageHandler(&AsScene2803LightCord::hmPulled); + NextState(&AsScene2803LightCord::stIdle); +} + +void AsScene2803LightCord::stIdle() { + _isPulled = false; + startAnimation(_fileHash1, 0, -1); + SetMessageHandler(&AsScene2803LightCord::handleMessage); +} + +void AsScene2803LightCord::setFileHashes(uint32 fileHash1, uint32 fileHash2) { + _fileHash1 = fileHash1; + _fileHash2 = fileHash2; + if (_isPulled) { + startAnimation(_fileHash2, _currFrameIndex, -1); + _isBusy = true; + } else { + startAnimation(_fileHash1, 0, -1); + } +} + +AsScene2803TestTubeOne::AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2) + : AnimatedSprite(vm, 1200), _fileHash1(fileHash1), _fileHash2(fileHash2) { + + createSurface1(fileHash1, 100); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2803TestTubeOne::handleMessage); + _x = 529; + _y = 326; +} + +uint32 AsScene2803TestTubeOne::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) + startAnimation(_fileHash2, 0, -1); + else + startAnimation(_fileHash1, 0, -1); + break; + } + return messageResult; +} + +AsScene2803Rope::AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(990, 68, 476); + SetUpdateHandler(&AnimatedSprite::update); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + SetMessageHandler(&AsScene2803Rope::handleMessage); + startAnimation(0x9D098C23, 35, 53); + NextState(&AsScene2803Rope::stReleased); + _x = x; + _y = -276; +} + +uint32 AsScene2803Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + startAnimation(0x9D098C23, 50, -1); + SetMessageHandler(&AsScene2803Rope::hmReleased); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene2803Rope::hmReleased(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +void AsScene2803Rope::stReleased() { + startAnimation(0x8258A030, 0, 1); + NextState(&AsScene2803Rope::stHide); +} + +void AsScene2803Rope::stHide() { + stopAnimation(); + setVisible(false); +} + +Scene2803::Scene2803(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _paletteArea(0) { + + static const uint32 kScene2803FileHashes1[] = { + 0, + 0x081000F1, + 0x08100171, + 0x08100271 + }; + + static const uint32 kScene2803FileHashes2[] = { + 0, + 0x286800D4, + 0x286806D4, + 0x28680AD4 + }; + + setGlobalVar(V_BEEN_SHRINKING_ROOM, 1); + _vm->gameModule()->initTestTubes1Puzzle(); + + SetMessageHandler(&Scene2803::handleMessage); + + loadDataResource(0x00900849); + + _background = new Background(_vm, 0); + _background->createSurface(0, 640, 480); + addBackground(_background); + + setPalette(0x412A423E); + addEntity(_palette); + + insertScreenMouse(0xA423A41A); + + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) { + _asTestTubeOne = (StaticSprite*)insertStaticSprite(0x66121222, 100); + } else { + _asTestTubeOne = (StaticSprite*)insertSprite( + kScene2803FileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], + kScene2803FileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)]); + } + + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) + _asTestTubeTwo = (StaticSprite*)insertStaticSprite(0x64330236, 100); + + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) + _asTestTubeThree = (StaticSprite*)insertStaticSprite(0x2E4A22A2, 100); + + _asLightCord = insertSprite(this, 0x8FAD5932, 0x276E1A3D, 578, 200); + _sprite3 = (StaticSprite*)insertStaticSprite(0xA40EF2FB, 1100); + _sprite4 = (StaticSprite*)insertStaticSprite(0x0C03AA23, 1100); + _sprite5 = (StaticSprite*)insertStaticSprite(0x2A822E2E, 1100); + _sprite6 = (StaticSprite*)insertStaticSprite(0x2603A202, 1100); + _sprite7 = (StaticSprite*)insertStaticSprite(0x24320220, 1100); + _sprite8 = (StaticSprite*)insertStaticSprite(0x3C42022F, 1100); + _sprite9 = (StaticSprite*)insertStaticSprite(0x341A0237, 1100); + _sprite10 = insertStaticSprite(0x855820A3, 1200); + + _clipRectsFloor[0].x1 = 0; + _clipRectsFloor[0].y1 = 0; + _clipRectsFloor[0].x2 = 640; + _clipRectsFloor[0].y2 = _sprite8->getDrawRect().y2(); + + _clipRectsFloor[1].x1 = _sprite8->getDrawRect().x2(); + _clipRectsFloor[1].y1 = _sprite8->getDrawRect().y2(); + _clipRectsFloor[1].x2 = 640; + _clipRectsFloor[1].y2 = 480; + + _clipRectsStairs[0].x1 = _sprite5->getDrawRect().x; + _clipRectsStairs[0].y1 = 0; + _clipRectsStairs[0].x2 = _sprite5->getDrawRect().x2(); + _clipRectsStairs[0].y2 = _sprite5->getDrawRect().y2(); + + _clipRectsStairs[1].x1 = _sprite6->getDrawRect().x; + _clipRectsStairs[1].y1 = 0; + _clipRectsStairs[1].x2 = _sprite3->getDrawRect().x; + _clipRectsStairs[1].y2 = _sprite6->getDrawRect().y2(); + + _clipRectsStairs[2].x1 = _sprite3->getDrawRect().x; + _clipRectsStairs[2].y1 = 0; + _clipRectsStairs[2].x2 = _sprite4->getDrawRect().x2(); + _clipRectsStairs[2].y2 = 480; + + if (which < 0) { + insertKlaymen(302, 445, _clipRectsFloor, 2); + setMessageList(0x004B79F0); + klaymenFloor(); + } else if (which == 1) { + insertKlaymen(200, 445, _clipRectsFloor, 2); + setMessageList(0x004B79C8); + klaymenFloor(); + } else if (which == 3) { + NPoint pt = _dataResource.getPoint(0xC2A08694); + insertKlaymen(pt.x, pt.y, _clipRectsStairs, 3); + setMessageList(0x004B7A00); + klaymenStairs(); + } else if (which == 5) { + insertKlaymen(253, 298, _clipRectsStairs, 3); + setMessageList(0x004B7A00); + klaymenStairs(); + } else if (which == 6) { + _asRope = insertSprite(this, 384); + _asRope->setClipRect(0, 25, 640, 480); + insertKlaymen(384, 0, _clipRectsFloor, 2); + sendEntityMessage(_klaymen, 0x1014, _asRope); + _klaymen->setClipRect(0, 25, 640, 480); + setMessageList(0x004B7A78); + klaymenFloor(); + } else if (which == 2) { + insertKlaymen(400, 445, _clipRectsFloor, 2); + setMessageList(0x004B79F8); + klaymenFloor(); + } else { + insertKlaymen(50, 231, _clipRectsStairs, 3); + setMessageList(0x004B79C0); + klaymenStairs(); + } + + changeBackground(); + +} + +void Scene2803::upKlaymenStairs() { + if (_klaymen->getX() < 350) { + setPaletteArea0(); + } else { + setPaletteArea1(); + } + Scene::update(); +} + +uint32 Scene2803::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x480F: + toggleBackground(); + // NOTE Intentional fall-through + case 0x100D: + if (param.asInteger() == 0x84251F82) + setMessageList(0x004B7A50); + else if (param.asInteger() == 0x4254A2D2) + setMessageList(0x004B7A58); + else if (param.asInteger() == 0xE90A40A0) + setMessageList(0x004B7A08); + else if (param.asInteger() == 0x482D1210) + setMessageList(0x004B7A30); + else if (param.asInteger() == 0x802402B2) { + sendEntityMessage(_klaymen, 0x1014, _asLightCord); + setMessageList(0x004B7A68); + } else if (param.asInteger() == 0x9626F390) + setMessageList(0x004B7A88); + break; + case 0x482A: + klaymenStairs(); + setPaletteArea1(); + break; + case 0x482B: + klaymenFloor(); + setPaletteArea0(); + break; + } + return messageResult; +} + +void Scene2803::klaymenStairs() { + SetUpdateHandler(&Scene2803::upKlaymenStairs); + _klaymen->getSurface()->setClipRects(_clipRectsStairs, 3); + sendMessage(_klaymen, 0x482C, 0xE5A48297); + _sprite3->setVisible(true); + _sprite4->setVisible(true); + _sprite5->setVisible(true); + _sprite6->setVisible(true); + _sprite7->setVisible(true); + _sprite8->setVisible(false); + _sprite9->setVisible(false); +} + +void Scene2803::klaymenFloor() { + SetUpdateHandler(&Scene::update); + _klaymen->getSurface()->setClipRects(_clipRectsFloor, 2); + sendMessage(_klaymen, 0x482C, 0); + _sprite3->setVisible(false); + _sprite4->setVisible(false); + _sprite5->setVisible(false); + _sprite6->setVisible(false); + _sprite7->setVisible(false); + _sprite8->setVisible(true); + _sprite9->setVisible(true); +} + +void Scene2803::toggleBackground() { + setGlobalVar(V_SHRINK_LIGHTS_ON, getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0 : 1); + changeBackground(); +} + +void Scene2803::changeBackground() { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { + _asLightCord->setFileHashes(0x8FAD5932, 0x276E1A3D); + _background->load(0x412A423E); + _palette->addPalette(0x412A423E, 0, 256, 0); + _palette->addBasePalette(0x412A423E, 0, 256, 0); + _sprite3->loadSprite(0xA40EF2FB); + _sprite4->loadSprite(0x0C03AA23); + _sprite5->loadSprite(0x2A822E2E); + _sprite6->loadSprite(0x2603A202); + _sprite7->loadSprite(0x24320220); + _mouseCursor->load(0xA423A41A); + _mouseCursor->updateCursor(); + _sprite8->loadSprite(0x3C42022F); + _sprite9->loadSprite(0x341A0237); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) + _asTestTubeOne->loadSprite(0x66121222); + else + sendMessage(_asTestTubeOne, 0x2000, 0); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) + _asTestTubeTwo->loadSprite(0x64330236); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) + _asTestTubeThree->loadSprite(0x2E4A22A2); + _sprite10->setVisible(true); + } else { + _asLightCord->setFileHashes(0xAFAD591A, 0x276E321D); + _background->load(0x29800A01); + _palette->addPalette(0x29800A01, 0, 256, 0); + _palette->addBasePalette(0x29800A01, 0, 256, 0); + _sprite3->loadSprite(0x234340A0); + _sprite4->loadSprite(0x16202200); + _sprite5->loadSprite(0x1030169A); + _sprite6->loadSprite(0x1600A6A8); + _sprite7->loadSprite(0xD0802EA0); + _mouseCursor->load(0x00A05290); + _mouseCursor->updateCursor(); + _sprite8->loadSprite(0x108012C1); + _sprite9->loadSprite(0x708072E0); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0) + sendMessage(_asTestTubeOne, 0x2000, 1); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) + _asTestTubeTwo->loadSprite(0xD48077A0); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) + _asTestTubeThree->loadSprite(0x30022689); + _sprite10->setVisible(false); + } + updatePaletteArea(); +} + +void Scene2803::setPaletteArea0() { + if (_paletteArea != 0) { + _paletteArea = 0; + updatePaletteArea(); + } +} + +void Scene2803::setPaletteArea1() { + if (_paletteArea != 1) { + _paletteArea = 1; + updatePaletteArea(); + } +} + +void Scene2803::updatePaletteArea() { + uint32 fadePaletteHash; + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) + fadePaletteHash = (_paletteArea == 1) ? 0xB103B604 : 0x412A423E; + else + fadePaletteHash = (_paletteArea == 1) ? 0x0263D144 : 0x29800A01; + _palette->addBasePalette(fadePaletteHash, 0, 64, 0); + _palette->startFadeToPalette(12); +} + +Scene2803Small::Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _paletteArea(0) { + + static const uint32 kScene2803SmallFileHashes1[] = { + 0, 0x081000F1, 0x08100171, 0x08100271 + }; + + static const uint32 kScene2803SmallFileHashes2[] = { + 0, 0x286800D4, 0x286806D4, 0x28680AD4 + }; + + SetMessageHandler(&Scene2803Small::handleMessage); + + loadDataResource(0x81120132); + insertScreenMouse(0x00A05290); + + insertSprite(this, 0xAFAD591A, 0x276E321D, 578, 200); + + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { + setBackground(0x412A423E); + setPalette(0x412A423E); + _palette->addBasePalette(0x412A423E, 0, 256, 0); + addEntity(_palette); + _sprite1 = insertStaticSprite(0x0C03AA23, 1100); + _sprite2 = insertStaticSprite(0x24320220, 1100); + _sprite3 = insertStaticSprite(0x1A032204, 1100); + _sprite4 = insertStaticSprite(0x18032204, 1100); + _sprite5 = insertStaticSprite(0x34422912, 1100); + _sprite6 = insertStaticSprite(0x3C42022F, 1100); + _sprite7 = insertStaticSprite(0x341A0237, 1100); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 0) + insertStaticSprite(0x66121222, 100); + else + insertSprite(kScene2803SmallFileHashes1[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) + insertStaticSprite(0x64330236, 100); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) + insertStaticSprite(0x2E4A22A2, 100); + } else { + setBackground(0x29800A01); + setPalette(0x29800A01); + _palette->addBasePalette(0x29800A01, 0, 256, 0); + addEntity(_palette); + _sprite1 = insertStaticSprite(0x16202200, 1100); + _sprite2 = insertStaticSprite(0xD0802EA0, 1100); + _sprite3 = insertStaticSprite(0x780C2E30, 1100); + _sprite4 = insertStaticSprite(0x700C2E30, 1100); + _sprite5 = insertStaticSprite(0x102CE6E1, 900); + _sprite6 = insertStaticSprite(0x108012C1, 1100); + _sprite7 = insertStaticSprite(0x708072E0, 1100); + insertStaticSprite(0x90582EA4, 100); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) != 0) + insertSprite(kScene2803SmallFileHashes2[getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0)], 100, 529, 326); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) + insertStaticSprite(0xD48077A0, 100); + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) + insertStaticSprite(0x30022689, 100); + } + + _sprite6->setVisible(false); + _sprite7->setVisible(false); + + if (which < 0) { + insertKlaymen(479, 435); + klaymenFloor(); + setMessageList(0x004B60D8); + } else if (which == 3) { + NPoint pt = _dataResource.getPoint(0x096520ED); + insertKlaymen(pt.x, pt.y); + klaymenSlope(); + setMessageList(0x004B6100); + _klaymen->setRepl(64, 0); + } else if (which == 4) { + NPoint pt = _dataResource.getPoint(0x20C6238D); + insertKlaymen(pt.x, pt.y); + klaymenSlope(); + setMessageList(0x004B60F8); + _klaymen->setRepl(64, 0); + } else if (which == 5) { + NPoint pt = _dataResource.getPoint(0x2146690D); + insertKlaymen(pt.x, pt.y); + klaymenSlope(); + setMessageList(0x004B6100); + _klaymen->setRepl(64, 0); + } else if (which == 2) { + NPoint pt = _dataResource.getPoint(0x104C03ED); + insertKlaymen(pt.x, pt.y); + klaymenFloor(); + setMessageList(0x004B6138); + } else { + insertKlaymen(135, 444); + klaymenFloor(); + setMessageList(0x004B60E0, false); + _sprite6->setVisible(true); + _sprite7->setVisible(true); + } + +} + +uint32 Scene2803Small::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xB4E4884C) { + setMessageList(0x004B6180); + } else if (param.asInteger() == 0xB1FDAB2E) { + NPoint pt = _dataResource.getPoint(0x0D84A1AD); + _klaymen->setX(pt.x); + _klaymen->setY(pt.y); + _klaymen->updateBounds(); + klaymenFloor(); + _klaymen->setClipRect(517, 401, 536, 480); + setMessageList(0x004B6198); + } else if (param.asInteger() == 0xB00C7C48) { + setMessageList(0x004B6108); + } else if (param.asInteger() == 0x61F64346) { + setMessageList(0x004B6150); + } else if (param.asInteger() == 0xAC69A28D) { + setMessageList(0x004B6168); + } else if (param.asInteger() == 0x00086212) { + _klaymen->setClipRect(0, 0, 560, 315); + _klaymen->setX(560); + _klaymen->setY(315); + _klaymen->updateBounds(); + klaymenSlope(); + setMessageList(0x004B61A0); + } else if (param.asInteger() == 0x002CAA68) { + setMessageList(0x004B61A8); + } + break; + case 0x482A: + if (_klaymen->getX() < 200) { + setPaletteArea3(); + } else if (_klaymen->getX() < 500) { + setSurfacePriority(_sprite5->getSurface(), 1100); + sendMessage(_klaymen, 0x482C, 0); + setPaletteArea2(); + } else { + _klaymen->setClipRect(517, 401, 536, 480); + setPaletteArea2(); + } + break; + case 0x482B: + _sprite6->setVisible(false); + _sprite7->setVisible(false); + _klaymen->setClipRect(0, 0, 640, 480); + setSurfacePriority(_sprite5->getSurface(), 900); + sendMessage(_klaymen, 0x482C, 0x2086222D); + break; + } + return 0; +} + +void Scene2803Small::upKlaymenSlope() { + if (_klaymen->getX() < 388) { + _klaymen->setClipRect(_sprite3->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + setPaletteArea0(); + } else if (_klaymen->getX() < 500) { + _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + setPaletteArea1(); + } + Scene::update(); +} + +void Scene2803Small::upKlaymenFloor() { + if (_klaymen->getX() > 194 && _klaymen->getX() < 273) + setPaletteArea2(); + else if (_klaymen->getX() > 155 && _klaymen->getX() < 300) + setPaletteArea0(); + Scene::update(); +} + +void Scene2803Small::klaymenSlope() { + SetUpdateHandler(&Scene2803Small::upKlaymenSlope); + sendMessage(_klaymen, 0x482C, 0x23C630D9); + _klaymen->setClipRect(0, 0, _sprite1->getDrawRect().x2(), _sprite1->getDrawRect().y2()); + _klaymen->setRepl(64, 0); + _sprite1->setVisible(true); +} + +void Scene2803Small::klaymenFloor() { + SetUpdateHandler(&Scene2803Small::upKlaymenFloor); + sendMessage(_klaymen, 0x482C, 0x2086222D); + _klaymen->setClipRect(0, 0, 640, 480); + _klaymen->clearRepl(); + _sprite1->setVisible(false); +} + +void Scene2803Small::setPaletteArea0() { + if (_paletteArea != 0) { + _paletteArea = 0; + updatePaletteArea(false); + } +} + +void Scene2803Small::setPaletteArea1() { + if (_paletteArea != 1) { + _paletteArea = 1; + updatePaletteArea(false); + } +} + +void Scene2803Small::setPaletteArea2() { + if (_paletteArea != 2) { + _paletteArea = 2; + updatePaletteArea(false); + } +} + +void Scene2803Small::setPaletteArea3() { + if (_paletteArea != 3) { + _paletteArea = 3; + updatePaletteArea(true); + } +} + +void Scene2803Small::updatePaletteArea(bool instantly) { + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { + switch (_paletteArea) { + case 1: + _palette->addBasePalette(0x0A938204, 0, 64, 0); + break; + case 2: + _palette->addBasePalette(0xB103B604, 0, 64, 0); + break; + case 3: + _palette->fillBaseBlack(0, 64); + break; + default: + _palette->addBasePalette(0x412A423E, 0, 64, 0); + break; + } + } else { + switch (_paletteArea) { + case 2: + _palette->addBasePalette(0x0263D144, 0, 64, 0); + break; + case 3: + _palette->fillBaseBlack(0, 64); + break; + default: + _palette->addBasePalette(0x29800A01, 0, 64, 0); + break; + } + } + _palette->startFadeToPalette(instantly ? 0 : 12); +} + +SsScene2804RedButton::SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene) + : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene) { + + loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? 0x51A10202 : 0x11814A21, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); + SetUpdateHandler(&SsScene2804RedButton::update); + SetMessageHandler(&SsScene2804RedButton::handleMessage); + loadSound(0, 0x44241240); +} + +void SsScene2804RedButton::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + } +} + +uint32 SsScene2804RedButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_parentScene->isWorking()) { + playSound(0); + setVisible(true); + _countdown = 4; + sendMessage(_parentScene, 0x2000, 0); + } + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2804LightCoil::SsScene2804LightCoil(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + loadSprite(0x8889B008, kSLFDefDrawOffset | kSLFDefPosition, 400); + setVisible(false); + SetMessageHandler(&SsScene2804LightCoil::handleMessage); +} + +uint32 SsScene2804LightCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + setVisible(true); + updatePosition(); + messageResult = 1; + break; + case 0x2003: + setVisible(false); + updatePosition(); + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2804LightTarget::SsScene2804LightTarget(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + loadSprite(0x06092132, kSLFDefDrawOffset | kSLFDefPosition, 400); + setVisible(false); + SetMessageHandler(&SsScene2804LightTarget::handleMessage); +} + +uint32 SsScene2804LightTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + setVisible(true); + updatePosition(); + messageResult = 1; + break; + case 0x2005: + setVisible(false); + updatePosition(); + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2804Flash::SsScene2804Flash(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + loadSprite(0x211003A0, kSLFDefDrawOffset | kSLFDefPosition, 400); + setVisible(false); + loadSound(0, 0xCB36BA54); +} + +void SsScene2804Flash::show() { + setVisible(true); + updatePosition(); + playSound(0); +} + +SsScene2804BeamCoilBody::SsScene2804BeamCoilBody(NeverhoodEngine *vm) + : StaticSprite(vm, 900) { + + loadSprite(0x9A816000, kSLFDefDrawOffset | kSLFDefPosition, 400); + setVisible(false); +} + +AsScene2804CrystalWaves::AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex) + : AnimatedSprite(vm, 1100), _crystalIndex(crystalIndex) { + + static const NPoint kAsScene2804CrystalWavesPoints[] = { + {323, 245}, + {387, 76}, + {454, 260}, + {527, 70} + }; + + _x = kAsScene2804CrystalWavesPoints[crystalIndex].x; + _y = kAsScene2804CrystalWavesPoints[crystalIndex].y; + createSurface1(0x840C41F0, 1200); + if (crystalIndex & 1) + setDoDeltaY(1); + setVisible(false); + _needRefresh = true; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&Sprite::handleMessage); +} + +void AsScene2804CrystalWaves::show() { + setVisible(true); + startAnimation(0x840C41F0, 0, -1); +} + +void AsScene2804CrystalWaves::hide() { + setVisible(false); + stopAnimation(); +} + +static const int16 kAsScene2804CrystalFrameNums[] = { + 0, 6, 2, 8, 1, 10, 0, 0 +}; + +static const uint32 kAsScene2804CrystalFileHashes[] = { + 0x000540B0, + 0x001280D0, + 0x003D0010, + 0x00620190, + 0x00DC0290 +}; + +AsScene2804Crystal::AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex) + : AnimatedSprite(vm, 1100), _asCrystalWaves(asCrystalWaves), _crystalIndex(crystalIndex), _isShowing(false) { + + static const NPoint kAsScene2804CrystalPoints[] = { + {204, 196}, + {272, 316}, + {334, 206}, + {410, 334}, + {470, 180} + }; + + _colorNum = (int16)getSubVar(VA_CURR_CRYSTAL_COLORS, crystalIndex); + _isLightOn = getGlobalVar(V_SHRINK_LIGHTS_ON) != 0; + if (_isLightOn) { + _x = kAsScene2804CrystalPoints[crystalIndex].x; + _y = kAsScene2804CrystalPoints[crystalIndex].y; + createSurface1(0x108DFB12, 1200); + startAnimation(0x108DFB12, kAsScene2804CrystalFrameNums[_colorNum], -1); + _needRefresh = true; + _newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum]; + } else { + _x = 320; + _y = 240; + createSurface1(kAsScene2804CrystalFileHashes[crystalIndex], 1200); + startAnimation(kAsScene2804CrystalFileHashes[crystalIndex], _colorNum, -1); + setVisible(false); + _needRefresh = true; + _newStickFrameIndex = _colorNum; + } + loadSound(0, 0x725294D4); + SetUpdateHandler(&AnimatedSprite::update); +} + +void AsScene2804Crystal::show() { + if (!_isLightOn) { + setVisible(true); + _isShowing = true; + if (_asCrystalWaves) + _asCrystalWaves->show(); + playSound(0); + } +} + +void AsScene2804Crystal::hide() { + if (!_isLightOn) { + setVisible(false); + _isShowing = false; + if (_asCrystalWaves) + _asCrystalWaves->hide(); + } +} + +void AsScene2804Crystal::activate() { + if (!_isShowing) { + int16 frameNum = kAsScene2804CrystalFrameNums[_colorNum]; + _colorNum++; + if (_colorNum >= 6) + _colorNum = 0; + if (_isLightOn) { + startAnimation(0x108DFB12, frameNum, kAsScene2804CrystalFrameNums[_colorNum]); + _playBackwards = kAsScene2804CrystalFrameNums[_colorNum] < _colorNum; + _newStickFrameIndex = kAsScene2804CrystalFrameNums[_colorNum]; + } else { + startAnimation(kAsScene2804CrystalFileHashes[_crystalIndex], _colorNum, -1); + _newStickFrameIndex = _colorNum; + } + setSubVar(VA_CURR_CRYSTAL_COLORS, _crystalIndex, _colorNum); + } +} + +SsScene2804CrystalButton::SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex) + : StaticSprite(vm, 900), _countdown(0), _parentScene(parentScene), _asCrystal(asCrystal), _crystalIndex(crystalIndex) { + + static const uint32 kSsScene2804CrystalButtonFileHashes1[] = { + 0x911101B0, + 0x22226001, + 0x4444A362, + 0x888925A4, + 0x11122829 + }; + + static const uint32 kSsScene2804CrystalButtonFileHashes2[] = { + 0xB500A1A0, + 0x6A012021, + 0xD4022322, + 0xA8042525, + 0x5008292B + }; + + loadSprite(getGlobalVar(V_SHRINK_LIGHTS_ON) ? kSsScene2804CrystalButtonFileHashes1[crystalIndex] : kSsScene2804CrystalButtonFileHashes2[crystalIndex], + kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); + loadSound(0, 0x44045140); + SetUpdateHandler(&SsScene2804CrystalButton::update); + SetMessageHandler(&SsScene2804CrystalButton::handleMessage); +} + +void SsScene2804CrystalButton::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + } +} + +uint32 SsScene2804CrystalButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0 && !_parentScene->isWorking()) { + playSound(0); + setVisible(true); + _countdown = 4; + _asCrystal->activate(); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene2804BeamCoil::AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody) + : AnimatedSprite(vm, 1400), _parentScene(parentScene), _ssBeamCoilBody(ssBeamCoilBody), _countdown(0) { + + createSurface1(0x00494891, 1000); + _x = 125; + _y = 184; + setVisible(false); + _needRefresh = true; + AnimatedSprite::updatePosition(); + loadSound(0, 0x6352F051); + _vm->_soundMan->addSound(0xC5EA0B28, 0xEF56B094); + SetUpdateHandler(&AsScene2804BeamCoil::update); + SetMessageHandler(&AsScene2804BeamCoil::handleMessage); +} + +AsScene2804BeamCoil::~AsScene2804BeamCoil() { + _vm->_soundMan->deleteSoundGroup(0xC5EA0B28); +} + +void AsScene2804BeamCoil::update() { + updateAnim(); + updatePosition(); + if (_countdown != 0 && (--_countdown) == 0) { + sendMessage(_parentScene, 0x2001, 0); + } +} + +uint32 AsScene2804BeamCoil::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2002: + show(); + _countdown = 92; + messageResult = 1; + break; + case 0x2003: + hide(); + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene2804BeamCoil::show() { + _ssBeamCoilBody->setVisible(true); + setVisible(true); + startAnimation(0x00494891, 0, -1); + playSound(0); + SetMessageHandler(&AsScene2804BeamCoil::hmBeaming); + NextState(&AsScene2804BeamCoil::stBeaming); +} + +void AsScene2804BeamCoil::hide() { + stopAnimation(); + SetMessageHandler(&AsScene2804BeamCoil::handleMessage); + setVisible(false); + _ssBeamCoilBody->setVisible(false); + _vm->_soundMan->stopSound(0xEF56B094); +} + +void AsScene2804BeamCoil::stBeaming() { + startAnimation(0x00494891, 93, -1); + NextState(&AsScene2804BeamCoil::stBeaming); + _vm->_soundMan->playSoundLooping(0xEF56B094); +} + +uint32 AsScene2804BeamCoil::hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +AsScene2804BeamTarget::AsScene2804BeamTarget(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1400) { + + createSurface1(0x03842000, 1000); + _x = 475; + _y = 278; + setVisible(false); + _needRefresh = true; + updatePosition(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2804BeamTarget::handleMessage); +} + +uint32 AsScene2804BeamTarget::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2004: + setVisible(true); + startAnimation(0x03842000, 0, -1); + messageResult = 1; + break; + case 0x2005: + setVisible(false); + stopAnimation(); + messageResult = 1; + break; + } + return messageResult; +} + +Scene2804::Scene2804(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _countdown1(0), _countdown2(0), _countdown3(0), + _beamStatus(0), _isSolved(false), _isWorking(false) { + + _vm->gameModule()->initCrystalColorsPuzzle(); + + SetMessageHandler(&Scene2804::handleMessage); + SetUpdateHandler(&Scene2804::update); + + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { + setBackground(0xA1D03005); + setPalette(0xA1D03005); + addEntity(_palette); + insertPuzzleMouse(0x03001A15, 20, 620); + _asCoil = insertSprite(); + _asTarget = insertSprite(); + } else { + SsScene2804BeamCoilBody *ssBeamCoilBody; + setBackground(0x01C01414); + setPalette(0x01C01414); + addEntity(_palette); + insertPuzzleMouse(0x01410014, 20, 620); + ssBeamCoilBody = insertSprite(); + _asCoil = insertSprite(this, ssBeamCoilBody); + _asTarget = insertSprite(); + _ssFlash = insertSprite(); + } + + _ssRedButton = insertSprite(this); + addCollisionSprite(_ssRedButton); + + for (uint crystalIndex = 0; crystalIndex < 5; crystalIndex++) { + AsScene2804CrystalWaves *asCrystalWaves = NULL; + if (crystalIndex < 4 && getGlobalVar(V_SHRINK_LIGHTS_ON) == 0) + asCrystalWaves = insertSprite(crystalIndex); + _asCrystals[crystalIndex] = insertSprite(asCrystalWaves, crystalIndex); + _ssCrystalButtons[crystalIndex] = insertSprite(this, _asCrystals[crystalIndex], crystalIndex); + addCollisionSprite(_ssCrystalButtons[crystalIndex]); + } + +} + +uint32 Scene2804::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } + break; + case 0x2000: + _isWorking = true; + sendMessage(_asCoil, 0x2002, 0); + if (getGlobalVar(V_SHRINK_LIGHTS_ON)) { + sendMessage(_asTarget, 0x2004, 0); + _countdown2 = 48; + } + break; + case 0x2001: + _countdown3 = 2; + _isSolved = true; + _beamStatus = 0; + for (uint index = 0; index < 5; index++) + if (_asCrystals[index]->getColorNum() != (int16)getSubVar(VA_GOOD_CRYSTAL_COLORS, index)) + _isSolved = false; + _countdown2 = 48; + break; + } + return 0; +} + +void Scene2804::update() { + + Scene::update(); + + if (_countdown1 != 0 && (--_countdown1) == 0) { + leaveScene(0); + } + + if (_countdown2 != 0 && (--_countdown2) == 0) { + _isWorking = false; + sendMessage(_asCoil, 0x2003, 0); + sendMessage(_asTarget, 0x2005, 0); + for (uint index = 0; index < 5; index++) + _asCrystals[index]->hide(); + } + + if (_countdown3 != 0 && (--_countdown3) == 0) { + if (_beamStatus == 5) { + sendMessage(_asTarget, 0x2004, 0); + if (_isSolved) { + _palette->fillBaseWhite(0, 256); + _palette->startFadeToPalette(18); + setGlobalVar(V_KLAYMEN_SMALL, 1); + _countdown1 = 48; + } + } else if (_beamStatus == 6) { + if (_isSolved) + _ssFlash->show(); + } else { + _asCrystals[_beamStatus]->show(); + } + _beamStatus++; + if (_beamStatus < 6) + _countdown3 = 2; + else if (_beamStatus < 7) + _countdown3 = 4; + } + +} + +Scene2805::Scene2805(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene2805::handleMessage); + + setBackground(0x08021E04); + setPalette(0x08021E04); + _palette->addPalette(0x8A6B1F91, 0, 65, 0); + insertScreenMouse(0x21E00088); + + _sprite1 = insertStaticSprite(0x008261E7, 1100); + _sprite2 = insertStaticSprite(0x020CE421, 1100); + + if (which < 0) { + insertKlaymen(380, 338); + setMessageList(0x004AE1C8); + sendMessage(this, 0x2000, 0); + } else if (which == 1) { + insertKlaymen(493, 338); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004AE1D0, false); + sendMessage(this, 0x2000, 1); + } else if (which == 2) { + insertKlaymen(493, 338); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004AE288, false); + sendMessage(this, 0x2000, 1); + } else if (which == 3) { + insertKlaymen(493, 338); + sendMessage(_klaymen, 0x2000, 1); + setMessageList(0x004AE1E0, false); + sendMessage(this, 0x2000, 1); + } else { + insertKlaymen(340, 338); + setMessageList(0x004AE1C0); + sendMessage(this, 0x2000, 0); + } + + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite2->getDrawRect().x2(), 480); + +} + +uint32 Scene2805::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + if (param.asInteger()) { + setRectList(0x004AE318); + _klaymen->setKlaymenIdleTable3(); + } else { + setRectList(0x004AE308); + _klaymen->setKlaymenIdleTable1(); + } + break; + } + return 0; +} + +AsScene2806Spew::AsScene2806Spew(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200) { + + createSurface1(0x04211490, 1200); + _x = 378; + _y = 423; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2806Spew::handleMessage); + setDoDeltaX(1); + setVisible(false); +} + +uint32 AsScene2806Spew::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + playSound(0, 0x48640244); + startAnimation(0x04211490, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +Scene2806::Scene2806(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + which = 3; + + SetMessageHandler(&Scene2806::handleMessage); + SetUpdateHandler(&Scene2806::update); + + loadDataResource(0x98182003); + loadHitRectList(); + + _pointList = _dataResource.getPointArray(0x3606A422); + + insertScreenMouse(0x22114C13); + setBackground(0xC1B22110); + setPalette(0xC1B22110); + + _sprite1 = insertStaticSprite(0xA21F82CB, 1100); + _clipRects[0].x1 = _sprite1->getDrawRect().x; + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _clipRects[0].x2 = _sprite1->getDrawRect().x2(); + _clipRects[0].y2 = _sprite1->getDrawRect().y2(); + + _sprite2 = insertStaticSprite(0x92035301, 1100); + _clipRects[1].y2 = _sprite2->getDrawRect().y2(); + + _sprite3 = insertStaticSprite(0x3182220E, 1100); + + _sprite4 = insertStaticSprite(0x72090342, 1100); + _clipRects[1].x1 = _sprite4->getDrawRect().x; + _clipRects[1].y1 = _sprite4->getDrawRect().y; + + tempSprite = insertStaticSprite(0xD2012C02, 1100); + _clipRects[2].x1 = tempSprite->getDrawRect().x; + _clipRects[2].y2 = tempSprite->getDrawRect().y2(); + _clipRects[3].y1 = tempSprite->getDrawRect().y2(); + _clipRects[1].x2 = tempSprite->getDrawRect().x; + + tempSprite = insertStaticSprite(0x72875F42, 1100); + _clipRects[3].x1 = tempSprite->getDrawRect().x; + + insertStaticSprite(0x0201410A, 1100); + insertStaticSprite(0x72875F42, 1100); + + _asSpew = insertSprite(); + + _clipRects[2].y1 = 0; + _clipRects[3].y2 = 480; + _clipRects[2].x2 = 640; + _clipRects[3].x2 = 640; + + if (which < 0) { + insertKlaymen(441, 423, false, _clipRects, 4); + setMessageList(0x004AF098); + } else if (which == 1) { + insertKlaymen(378, 423, false, _clipRects, 4); + setMessageList(0x004AF098); + } else if (which == 2) { + insertKlaymen(378, 423, false, _clipRects, 4); + setMessageList(0x004AF0C8, false); + } else if (which == 3) { + insertKlaymen(378, 423, true, _clipRects, 4); + setMessageList(0x004AF0A0, false); + setGlobalVar(V_KLAYMEN_SMALL, 0); + } else { + insertKlaymen(670, 423, false, _clipRects, 4); + setMessageList(0x004AF090); + } + + _pointIndex = -1; + findClosestPoint(); + +} + +uint32 Scene2806::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x44262B12) { + setMessageList(0x004AF0E0); + } + break; + case 0x2000: + sendMessage(_asSpew, 0x2000, 0); + break; + } + return 0; +} + +void Scene2806::update() { + Scene::update(); + findClosestPoint(); +} + +void Scene2806::findClosestPoint() { + + static const uint32 kScene2806PaletteFileHashes[] = { + 0x48052508, + 0x01139404, + 0x01138C04, + 0x01138004, + 0x01138604, + 0x086B8890 + }; + + int16 x = MIN(_klaymen->getX(), 639); + int index = 1; + + while (index < (int)_pointList->size() && (*_pointList)[index].x < x) + ++index; + --index; + + if (_pointIndex != index) { + _pointIndex = index; + _palette->addPalette(kScene2806PaletteFileHashes[index], 0, 64, 0); + } + +} + +Scene2807::Scene2807(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + SetMessageHandler(&Scene2807::handleMessage); + + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 1) { + insertStaticSprite(0x103021E2, 300); + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 2) { + insertStaticSprite(0x103022E2, 300); + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) == 3) { + insertStaticSprite(0x103024E2, 300); + } + + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 1) { + insertStaticSprite(0x4800A52A, 200); + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 2) { + insertStaticSprite(0x4800A62A, 200); + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) == 3) { + insertStaticSprite(0x4800A02A, 200); + } + + if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 1) { + insertStaticSprite(0x31203430, 100); + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 2) { + insertStaticSprite(0x31203400, 100); + } else if (getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2) == 3) { + insertStaticSprite(0x31203460, 100); + } + + setBackground(0x3E049A95); + setPalette(0x3E049A95); + insertPuzzleMouse(0x49A913E8, 20, 620); + +} + +uint32 Scene2807::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } + break; + } + return 0; +} + +static const uint32 kScene2808FileHashes1[] = { + 0x90B0392, + 0x90B0192 +}; + +static const uint32 kScene2808FileHashes2[] = { + 0xB0396098, + 0xB0196098 +}; + +static const uint32 kClass428FileHashes[] = { + 0x140022CA, + 0x4C30A602, + 0xB1633402, + 0x12982135, + 0x0540B728, + 0x002A81E3, + 0x08982841, + 0x10982841, + 0x20982841, + 0x40982841, + 0x80982841, + 0x40800711 +}; + +static const int kClass428Countdowns1[] = { + 18, 16, 10, 0 +}; + +static const int kClass428Countdowns2[] = { + 9, 9, 8, 8, 5, 5, 0, 0 +}; + +static const uint32 kClass490FileHashes[] = { + 0x08100071, + 0x24084215, + 0x18980A10 +}; + +static const int16 kClass490FrameIndices1[] = { + 0, 8, 15, 19 +}; + +static const int16 kClass490FrameIndices2[] = { + 0, 4, 8, 11, 15, 17, 19, 0 +}; + +SsScene2808Dispenser::SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex) + : StaticSprite(vm, 900), _parentScene(parentScene), _countdown(0), _testTubeSetNum(testTubeSetNum), + _testTubeIndex(testTubeIndex) { + + loadSprite(kClass428FileHashes[testTubeSetNum * 3 + testTubeIndex], kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 1500); + setVisible(false); + SetUpdateHandler(&SsScene2808Dispenser::update); + SetMessageHandler(&SsScene2808Dispenser::handleMessage); +} + +void SsScene2808Dispenser::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown) == 0) { + setVisible(false); + } +} + +uint32 SsScene2808Dispenser::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + sendMessage(_parentScene, 0x2000, _testTubeIndex); + messageResult = 1; + break; + } + return messageResult; +} + +void SsScene2808Dispenser::startCountdown(int index) { + setVisible(true); + updatePosition(); + if (_testTubeSetNum == 0) { + _countdown = kClass428Countdowns1[index]; + } else { + _countdown = kClass428Countdowns2[index]; + } +} + +AsScene2808TestTube::AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser) + : AnimatedSprite(vm, 1100), _testTubeSetNum(testTubeSetNum), _testTubeIndex(testTubeIndex), _ssDispenser(ssDispenser), _fillLevel(0) { + + if (testTubeSetNum == 0) { + _x = 504; + _y = 278; + } else { + setDoDeltaX(1); + _x = 136; + _y = 278; + } + + createSurface1(kClass490FileHashes[testTubeIndex], 1100); + + if (testTubeSetNum == 0) { + loadSound(0, 0x30809E2D); + loadSound(1, 0x72811E2D); + loadSound(2, 0x78B01625); + } else { + loadSound(3, 0x70A41E0C); + loadSound(4, 0x50205E2D); + loadSound(5, 0xF8621E2D); + loadSound(6, 0xF1A03C2D); + loadSound(7, 0x70A43D2D); + loadSound(8, 0xF0601E2D); + } + + startAnimation(kClass490FileHashes[testTubeIndex], 0, -1); + _newStickFrameIndex = 0; + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2808TestTube::handleMessage); + + if (_fillLevel == 0) + setVisible(false); + +} + +uint32 AsScene2808TestTube::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + fill(); + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene2808TestTube::fill() { + if ((int)_fillLevel < _testTubeSetNum * 3 + 3) { + if (_testTubeSetNum == 0) { + playSound(_fillLevel); + setVisible(true); + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], kClass490FrameIndices1[_fillLevel + 1]); + _newStickFrameIndex = kClass490FrameIndices1[_fillLevel + 1]; + } else { + playSound(3 + _fillLevel); + setVisible(true); + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], kClass490FrameIndices2[_fillLevel + 1]); + _newStickFrameIndex = kClass490FrameIndices2[_fillLevel + 1]; + } + _ssDispenser->startCountdown(_fillLevel); + _fillLevel++; + } +} + +void AsScene2808TestTube::flush() { + if (_fillLevel != 0) { + if (_testTubeSetNum == 0) { + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices1[_fillLevel], -1); + } else { + startAnimation(kClass490FileHashes[_testTubeIndex], kClass490FrameIndices2[_fillLevel], -1); + } + _newStickFrameIndex = 0; + _playBackwards = true; + setVisible(true); + } +} + +AsScene2808Handle::AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) + : AnimatedSprite(vm, 1300), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum), _isActivated(false) { + + loadSound(0, 0xE18D1F30); + _x = 320; + _y = 240; + if (_testTubeSetNum == 1) + setDoDeltaX(1); + createSurface1(0x040900D0, 1300); + startAnimation(0x040900D0, 0, -1); + _needRefresh = true; + _newStickFrameIndex = 0; + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2808Handle::handleMessage); + AnimatedSprite::updatePosition(); +} + +uint32 AsScene2808Handle::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isActivated) { + sendMessage(_parentScene, 0x2001, 0); + playSound(0); + activate(); + } + messageResult = 1; + break; + } + return messageResult; +} + +uint32 AsScene2808Handle::hmActivating(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2808Handle::activate() { + startAnimation(0x040900D0, 0, -1); + SetMessageHandler(&AsScene2808Handle::hmActivating); + NextState(&AsScene2808Handle::stActivated); + _isActivated = true; + _newStickFrameIndex = -1; +} + +void AsScene2808Handle::stActivated() { + stopAnimation(); + sendMessage(_parentScene, 0x2002, 0); +} + +AsScene2808Flow::AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _testTubeSetNum(testTubeSetNum) { + + if (testTubeSetNum == 0) { + _x = 312; + _y = 444; + } else { + _x = 328; + _y = 444; + } + createSurface1(0xB8414818, 1200); + startAnimation(0xB8414818, 0, -1); + setVisible(false); + _newStickFrameIndex = 0; + _needRefresh = true; + loadSound(0, 0x6389B652); + SetUpdateHandler(&AnimatedSprite::update); + AnimatedSprite::updatePosition(); +} + +uint32 AsScene2808Flow::hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2808Flow::start() { + startAnimation(0xB8414818, 0, -1); + setVisible(true); + SetMessageHandler(&AsScene2808Flow::hmFlowing); + NextState(&AsScene2808Flow::stKeepFlowing); + playSound(0); +} + +void AsScene2808Flow::stKeepFlowing() { + startAnimation(0xB8414818, 1, -1); + NextState(&AsScene2808Flow::stKeepFlowing); +} + +AsScene2808LightEffect::AsScene2808LightEffect(NeverhoodEngine *vm, int testTubeSetNum) + : AnimatedSprite(vm, 800), _countdown(1) { + + _x = 320; + _y = 240; + if (testTubeSetNum == 1) + setDoDeltaX(1); + createSurface1(0x804C2404, 800); + SetUpdateHandler(&AsScene2808LightEffect::update); + _needRefresh = true; + AnimatedSprite::updatePosition(); +} + +void AsScene2808LightEffect::update() { + if (_countdown != 0 && (--_countdown) == 0) { + int16 frameIndex = _vm->_rnd->getRandomNumber(3 - 1); + startAnimation(0x804C2404, frameIndex, frameIndex); + updateAnim(); + updatePosition(); + _countdown = _vm->_rnd->getRandomNumber(3 - 1) + 1; + } +} + +Scene2808::Scene2808(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _countdown(0), _testTubeSetNum(which), _leaveResult(0), _isFlowing(false) { + + Sprite *asHandle; + + if (which == 0) + _vm->gameModule()->initTestTubes1Puzzle(); + else + _vm->gameModule()->initTestTubes2Puzzle(); + + SetMessageHandler(&Scene2808::handleMessage); + SetUpdateHandler(&Scene2808::update); + + setBackground(kScene2808FileHashes1[which]); + setPalette(kScene2808FileHashes1[which]); + + asHandle = insertSprite(this, which); + addCollisionSprite(asHandle); + + _asFlow = insertSprite(this, which); + insertSprite(which); + + for (int testTubeIndex = 0; testTubeIndex < 3; testTubeIndex++) { + SsScene2808Dispenser *ssDispenser = insertSprite(this, which, testTubeIndex); + addCollisionSprite(ssDispenser); + _asTestTubes[testTubeIndex] = insertSprite(which, testTubeIndex, ssDispenser); + addCollisionSprite(_asTestTubes[testTubeIndex]); + } + + insertScreenMouse(kScene2808FileHashes2[which]); + +} + +uint32 Scene2808::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !isAnyTestTubeFilled()) { + leaveScene(1); + } + break; + case 0x2000: + if (!_isFlowing) + _asTestTubes[param.asInteger()]->fill(); + break; + case 0x2001: + _isFlowing = true; + break; + case 0x2002: + if (isAnyTestTubeFilled()) { + _leaveResult = 3; + if (!isMixtureGood()) + _leaveResult = 2; + _asFlow->start(); + for (int i = 0; i < 3; i++) + _asTestTubes[i]->flush(); + _mouseCursor->setVisible(false); + _countdown = 16; + } else { + leaveScene(1); + } + break; + } + return 0; +} + +void Scene2808::update() { + + // DEBUG>>> Show correct values + #if 1 + debug("---------------"); + if (_testTubeSetNum == 0) + debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2)); + else + debug("%03d %03d %03d", getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1), getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2)); + debug("%03d %03d %03d", _asTestTubes[0]->getFillLevel(), _asTestTubes[1]->getFillLevel(), _asTestTubes[2]->getFillLevel()); + #endif + // DEBUG<<< + + Scene::update(); + if (_countdown != 0 && (--_countdown) == 0) { + leaveScene(_leaveResult); + } +} + +bool Scene2808::isMixtureGood() { + if (_testTubeSetNum == 0) { + return + _asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 0) && + _asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 1) && + _asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_1, 2); + } else { + return + _asTestTubes[0]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 0) && + _asTestTubes[1]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 1) && + _asTestTubes[2]->getFillLevel() == getSubVar(VA_GOOD_TEST_TUBES_LEVEL_2, 2); + } +} + +bool Scene2808::isAnyTestTubeFilled() { + return + _asTestTubes[0]->getFillLevel() > 0 || + _asTestTubes[1]->getFillLevel() > 0 || + _asTestTubes[2]->getFillLevel() > 0; +} + +AsScene2809Spew::AsScene2809Spew(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1200) { + + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2809Spew::handleMessage); + createSurface1(0x04211490, 1200); + _x = 262; + _y = 423; + setDoDeltaX(0); + setVisible(false); +} + +uint32 AsScene2809Spew::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + playSound(0, 0x48640244); + startAnimation(0x04211490, 0, -1); + setVisible(true); + break; + case 0x3002: + stopAnimation(); + setVisible(false); + break; + } + return messageResult; +} + +Scene2809::Scene2809(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + SetMessageHandler(&Scene2809::handleMessage); + SetUpdateHandler(&Scene2809::update); + + loadDataResource(0x1830009A); + loadHitRectList(); + + _pointList = _dataResource.getPointArray(0x064A310E); + + setBackground(0xB22116C5); + setPalette(0xB22116C5); + insertScreenMouse(0x116C1B2A); + + _sprite1 = insertStaticSprite(0x1FA2EB82, 1100); + + _clipRects[0].x1 = _sprite1->getDrawRect().x; + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _clipRects[0].x2 = _sprite1->getDrawRect().x2(); + _clipRects[0].y2 = _sprite1->getDrawRect().y2(); + + _sprite2 = insertStaticSprite(0x037321B2, 1100); + _clipRects[1].y2 = _sprite2->getDrawRect().y2(); + + _sprite3 = insertStaticSprite(0x82022E11, 1100); + + _sprite4 = insertStaticSprite(0x09236252, 1100); + _clipRects[1].x2 = _sprite4->getDrawRect().x2(); + _clipRects[1].y1 = _sprite4->getDrawRect().y; + + tempSprite = insertStaticSprite(0x010C22F2, 1100); + _clipRects[2].x2 = tempSprite->getDrawRect().x2(); + _clipRects[2].y2 = tempSprite->getDrawRect().y2(); + _clipRects[3].y1 = tempSprite->getDrawRect().y2(); + _clipRects[1].x1 = tempSprite->getDrawRect().x2(); + + tempSprite = insertStaticSprite(0x877F6252, 1100); + _clipRects[3].x2 = tempSprite->getDrawRect().x2(); + + insertStaticSprite(0x01612A22, 1100); + insertStaticSprite(0x877F6252, 1100); + + _asSpew = insertSprite(); + _clipRects[2].y1 = 0; + _clipRects[3].y2 = 480; + _clipRects[2].x1 = 0; + _clipRects[3].x1 = 0; + + if (which < 0) { + insertKlaymen(226, 423, false, _clipRects, 4); + setMessageList(0x004B5B90); + } else if (which == 1) { + insertKlaymen(262, 423, false, _clipRects, 4); + setMessageList(0x004B5B90); + } else if (which == 2) { + insertKlaymen(262, 423, false, _clipRects, 4); + setMessageList(0x004B5BD0); + } else if (which == 3) { + insertKlaymen(262, 423, true, _clipRects, 4); + setMessageList(0x004B5BA8, false); + setGlobalVar(V_KLAYMEN_SMALL, 0); + } else { + insertKlaymen(-30, 423, false, _clipRects, 4); + setMessageList(0x004B5B88); + } + + _pointIndex = -1; + findClosestPoint(); + +} + +void Scene2809::update() { + Scene::update(); + findClosestPoint(); +} + +uint32 Scene2809::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x160DA937) { + setMessageList(0x004B5B98); + } + break; + case 0x2000: + sendMessage(_asSpew, 0x2000, 0); + break; + } + return 0; +} + +void Scene2809::findClosestPoint() { + + static const uint32 kScene2809PaletteFileHashes[] = { + 0x04260848, + 0x12970401, + 0x128F0401, + 0x12830401, + 0x12850401, + 0x6A8B9008 + }; + + int16 x = MAX(_klaymen->getX(), 2); + int index = 1; + + while (index < (int)_pointList->size() && (*_pointList)[index].x >= x) + ++index; + --index; + + if (_pointIndex != index) { + _pointIndex = index; + _palette->addPalette(kScene2809PaletteFileHashes[index], 0, 64, 0); + } + +} + +AsScene2810Rope::AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x) + : AnimatedSprite(vm, 1100) { + + createSurface(990, 68, 476); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2810Rope::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + _x = x; + _y = -276; + startAnimation(0x9D098C23, 35, 53); +} + +uint32 AsScene2810Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + startAnimation(0x9D098C23, 35, 53); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +Scene2810::Scene2810(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule) { + + Sprite *tempSprite; + + SetMessageHandler(&Scene2810::handleMessage); + + setBackground(0x26508804); + setPalette(0x26508804); + insertScreenMouse(0x0880026D); + + _sprite6 = insertStaticSprite(0x03615227, 1100); + _sprite5 = insertStaticSprite(0xE059A224, 1100); + + _clipRects[0].x1 = 0; + _clipRects[0].y1 = 0; + _clipRects[0].x2 = 640; + _clipRects[0].y2 = 400; + _clipRects[1].x1 = _sprite5->getDrawRect().x; + _clipRects[1].y1 = 400; + _clipRects[1].x2 = _sprite6->getDrawRect().x2(); + _clipRects[1].y2 = 480; + + if (getGlobalVar(V_KLAYMEN_SMALL)) { + _asTape = insertSprite(this, 0, 900, 245, 429, 0x9148A011); + addCollisionSprite(_asTape); + } else { + _asTape = insertSprite(this, 0, 1100, 245, 429, 0x9148A011); + addCollisionSprite(_asTape); + } + + _sprite1 = insertStaticSprite(0x430001C4, 1200); + + if (getGlobalVar(V_LADDER_DOWN)) { + setGlobalVar(V_BEEN_STATUE_ROOM, 1); + if (getGlobalVar(V_KLAYMEN_SMALL)) { + _sprite4 = insertStaticSprite(0x82653808, 100); + } else { + _sprite4 = insertStaticSprite(0x82653808, 1100); + } + _sprite4->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + } + + if (which < 0) { + if (getGlobalVar(V_KLAYMEN_SMALL)) { + insertKlaymen(240, 448); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE438); + setRectList(0x004AE810); + _isRopingDown = false; + removeCollisionSprite(_asTape); + } else { + insertKlaymen(300, 424, _clipRects, 2); + setMessageList(0x004AE438); + if (getGlobalVar(V_LADDER_DOWN)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + tempSprite = insertSprite(_klaymen); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _isRopingDown = false; + } + } else if (which == 1) { + insertKlaymen(186, 64, _clipRects, 2); + setMessageList(0x004AE440); + loadDataResource(0x84130112); + tempSprite = insertSprite(_klaymen); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _isRopingDown = true; + _clipRects[0].y1 = _sprite1->getDrawRect().y; + } else if (which == 5) { + insertStaticSprite(0xC3007EA0, 100); + _sprite2 = insertStaticSprite(0x02780936, 1100); + _sprite3 = insertStaticSprite(0x1CA02160, 1100); + _asRope = insertSprite(this, 384); + insertKlaymen(384, 0, _clipRects, 0); + sendEntityMessage(_klaymen, 0x1014, _asRope); + setMessageList(0x004AE738); + _klaymen->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + _vm->_soundMan->addSound(0x84400112, 0xC874EE6C); + _vm->_soundMan->playSoundLooping(0xC874EE6C); + _vm->_soundMan->setSoundVolume(0xC874EE6C, 50); + _isRopingDown = false; + } else if ((which >= 11 && which <= 14) || (which >= 19 && which <= 22) || which == 3) { + if (getGlobalVar(V_KLAYMEN_SMALL)) { + insertKlaymen((int16)getGlobalVar(V_KLAYMEN_SAVED_X), 448); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE6D8); + setRectList(0x004AE810); + _isRopingDown = false; + removeCollisionSprite(_asTape); + } else { + insertKlaymenLadder(); + if (getGlobalVar(V_LADDER_DOWN_ACTION)) { + setMessageList(0x004AE6E8); + setGlobalVar(V_LADDER_DOWN_ACTION, 0); + _isRopingDown = false; + } else { + setMessageList(0x004AE6D8); + _isRopingDown = false; + } + } + } else if (which >= 15 && which <= 18) { + insertKlaymenLadder(); + setMessageList(0x004AE6E0); + _isRopingDown = false; + } else if (which == 4) { + if (getGlobalVar(V_KLAYMEN_SMALL)) { + insertKlaymen(473, 448); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE428); + setRectList(0x004AE810); + _isRopingDown = false; + removeCollisionSprite(_asTape); + } else { + insertKlaymen(450, 424, _clipRects, 2); + setMessageList(0x004AE418); + if (getGlobalVar(V_LADDER_DOWN)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + tempSprite = insertSprite(_klaymen); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _clipRects[0].y1 = _sprite1->getDrawRect().y; + _isRopingDown = false; + } + } else { + insertKlaymen(120, 448); + _klaymen->setClipRect(_sprite5->getDrawRect().x, 0, 640, 480); + setMessageList(0x004AE410); + setRectList(0x004AE810); + _isRopingDown = false; + removeCollisionSprite(_asTape); + } + +} + +Scene2810::~Scene2810() { + setGlobalVar(V_KLAYMEN_IS_DELTA_X, _klaymen->isDoDeltaX() ? 1 : 0); + setGlobalVar(V_KLAYMEN_SAVED_X, _klaymen->getX()); + _vm->_soundMan->deleteSoundGroup(0x84400112); +} + +void Scene2810::insertKlaymenLadder() { + Sprite *tempSprite; + + if (getGlobalVar(V_LADDER_DOWN_ACTION)) { + insertKlaymen(430, 424, _clipRects, 2); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen((int16)getGlobalVar(V_KLAYMEN_SAVED_X), 424, _clipRects, 2); + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) + _klaymen->setDoDeltaX(1); + } + if (getGlobalVar(V_LADDER_DOWN)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + tempSprite = insertSprite(_klaymen); + tempSprite->setClipRect(0, _sprite1->getDrawRect().y, 640, 480); + _clipRects[0].y1 = _sprite1->getDrawRect().y; +} + +uint32 Scene2810::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0xE574F14C) + setMessageList(0x004AE458); + else if (param.asInteger() == 0x7214A05C || param.asInteger() == 0x2905E574) + setMessageList(0x004AE4A8); + else if (param.asInteger() == 0x7274E24C || param.asInteger() == 0x2D24E572) + setMessageList(0x004AE4D0); + else if (param.asInteger() == 0x4A07A040 || param.asInteger() == 0x190426F5) + setMessageList(0x004AE4F8); + else if (param.asInteger() == 0x6604200C || param.asInteger() == 0x2100E435) + setMessageList(0x004AE520); + else if (param.asInteger() == 0xE216A05C || param.asInteger() == 0x0905EC74) + setMessageList(0x004AE548); + else if (param.asInteger() == 0x721DA05C || param.asInteger() == 0xB905E574) + setMessageList(0x004AE570); + else if (param.asInteger() == 0x6214E09C || param.asInteger() == 0x2D09E474) + setMessageList(0x004AE598); + else if (param.asInteger() == 0x6276A04C || param.asInteger() == 0x0904E472) + setMessageList(0x004AE5C0); + else if (param.asInteger() == 0x6E14A00C || param.asInteger() == 0x2900E4B4) + setMessageList(0x004AE5E8); + else if (param.asInteger() == 0x6014A04D || param.asInteger() == 0x2904F454) + setMessageList(0x004AE610); + else if (param.asInteger() == 0x6215A3C4 || param.asInteger() == 0x393C6474) + setMessageList(0x004AE638); + else if (param.asInteger() == 0x6A54E24D || param.asInteger() == 0x2D24F4F0) + setMessageList(0x004AE660); + else if (param.asInteger() == 0x2064294C || param.asInteger() == 0x2194E053) + setMessageList(0x004AE688); + break; + case 0x2000: + setRectList(0x004AE800); + _isRopingDown = true; + break; + case 0x2001: + if (getGlobalVar(V_LADDER_DOWN)) + loadDataResource(0x84130112); + else + loadDataResource(0x84500132); + _isRopingDown = false; + break; + case 0x4826: + if (sender == _asTape && getGlobalVar(V_KLAYMEN_SMALL) == 0 && !_isRopingDown) { + sendEntityMessage(_klaymen, 0x1014, _asTape); + setMessageList(0x004AE750); + } + break; + } + return messageResult; +} + +AsScene2812Winch::AsScene2812Winch(NeverhoodEngine *vm) + : AnimatedSprite(vm, 1100) { + + createSurface1(0x20DA08A0, 1200); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2812Winch::handleMessage); + setVisible(false); + _x = 280; + _y = 184; +} + +AsScene2812Winch::~AsScene2812Winch() { + _vm->_soundMan->deleteSoundGroup(0x00B000E2); +} + +uint32 AsScene2812Winch::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + startAnimation(0x20DA08A0, 0, -1); + setVisible(true); + _vm->_soundMan->addSound(0x00B000E2, 0xC874EE6C); + _vm->_soundMan->playSoundLooping(0xC874EE6C); + break; + case 0x3002: + startAnimation(0x20DA08A0, 7, -1); + break; + } + return messageResult; +} + +AsScene2812Rope::AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene) + : AnimatedSprite(vm, 1100), _parentScene(parentScene) { + + createSurface(990, 68, 476); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene2812Rope::handleMessage); + SetSpriteUpdate(&AnimatedSprite::updateDeltaXY); + startAnimation(0xAE080551, 0, -1); + _x = 334; + _y = 201; +} + +uint32 AsScene2812Rope::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x4806: + setDoDeltaX(((Sprite*)sender)->isDoDeltaX() ? 1 : 0); + stRopingDown(); + break; + case 0x482A: + sendMessage(_parentScene, 0x1022, 990); + break; + case 0x482B: + sendMessage(_parentScene, 0x1022, 1010); + break; + } + return messageResult; +} + +uint32 AsScene2812Rope::hmRopingDown(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene2812Rope::stRopingDown() { + sendMessage(_parentScene, 0x4806, 0); + startAnimation(0x9D098C23, 0, -1); + SetMessageHandler(&AsScene2812Rope::hmRopingDown); +} + +AsScene2812TrapDoor::AsScene2812TrapDoor(NeverhoodEngine *vm) + : AnimatedSprite(vm, 0x805D0029, 100, 320, 240) { + + SetMessageHandler(&AsScene2812TrapDoor::handleMessage); + _newStickFrameIndex = 0; +} + +uint32 AsScene2812TrapDoor::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2000: + startAnimation(0x805D0029, 0, -1); + playSound(0, 0xEA005F40); + _newStickFrameIndex = STICK_LAST_FRAME; + break; + } + return messageResult; +} + +Scene2812::Scene2812(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _paletteArea(0) { + + if (getGlobalVar(V_HAS_FINAL_KEY) && getGlobalVar(V_KEY3_LOCATION) == 0) + setGlobalVar(V_KEY3_LOCATION, 3); + + SetMessageHandler(&Scene2812::handleMessage); + SetUpdateHandler(&Scene2812::update); + + setRectList(0x004AF700); + + setBackground(0x03600606); + setPalette(0x03600606); + addEntity(_palette); + _palette->addBasePalette(0x03600606, 0, 256, 0); + + _sprite1 = insertStaticSprite(0x0C06C860, 1100); + insertScreenMouse(0x0060203E); + + if (getGlobalVar(V_KEY3_LOCATION) == 3) { + _asKey = insertSprite(this, 2, 1100, 474, 437); + addCollisionSprite(_asKey); + } + + _ssTape = insertSprite(this, 6, 1100, 513, 437, 0xA1361863); + addCollisionSprite(_ssTape); + + _asWinch = insertSprite(); + _asTrapDoor = insertSprite(); + _asRope = insertSprite(this); + + _sprite2 = insertStaticSprite(0x08478078, 1100); + _sprite3 = insertStaticSprite(0x2203B821, 1100); + _sprite4 = insertStaticSprite(0x08592134, 1100); + + if (which < 0) { + _isRopingDown = false; + insertKlaymen(272, 432); + setMessageList(0x004AF560); + _sprite1->setVisible(false); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + } else if (which == 1) { + _isRopingDown = false; + insertKlaymen(338, 398); + setMessageList(0x004AF588); + setPaletteArea1(true); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); + } else if (which == 2) { + _isRopingDown = false; + if (getGlobalVar(V_KLAYMEN_IS_DELTA_X)) { + insertKlaymen(554, 432); + _klaymen->setDoDeltaX(1); + } else { + insertKlaymen(394, 432); + } + setMessageList(0x004AF5F0); + _sprite1->setVisible(false); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + } else { + _isRopingDown = true; + insertKlaymen(150, 582); + setMessageList(0x004AF568); + setPaletteArea2(true); + _sprite1->setVisible(false); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + } + + _asRope->setClipRect(0, _sprite2->getDrawRect().y, 640, _sprite3->getDrawRect().y2()); + +} + +void Scene2812::update() { + if (_klaymen->getX() < 220) + setPaletteArea2(false); + else if (_klaymen->getX() < 240) + setPaletteArea0(false); + Scene::update(); +} + +uint32 Scene2812::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x100D: + if (param.asInteger() == 0x0004269B) + sendEntityMessage(_klaymen, 0x1014, _asRope); + break; + case 0x2001: + _isRopingDown = true; + setRectList(0x004AF710); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite4->getDrawRect().y2()); + break; + case 0x2002: + _isRopingDown = false; + setRectList(0x004AF700); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + break; + case 0x4806: + sendMessage(_asWinch, 0x2000, 0); + sendMessage(_asTrapDoor, 0x2000, 0); + break; + case 0x4826: + if (sender == _ssTape && !_isRopingDown) { + sendEntityMessage(_klaymen, 0x1014, _ssTape); + setMessageList(0x004AF658); + } else if (sender == _asKey && !_isRopingDown) { + sendEntityMessage(_klaymen, 0x1014, _asKey); + setMessageList(0x004AF668); + } + break; + case 0x482A: + setPaletteArea1(false); + _sprite1->setVisible(true); + _klaymen->setClipRect(_sprite1->getDrawRect().x, 0, _sprite1->getDrawRect().x2(), _sprite3->getDrawRect().y2()); + break; + case 0x482B: + setPaletteArea0(false); + _sprite1->setVisible(false); + _klaymen->setClipRect(_sprite4->getDrawRect().x, 0, 640, _sprite3->getDrawRect().y2()); + break; + } + return messageResult; +} + +void Scene2812::setPaletteArea0(bool instantly) { + if (_paletteArea != 0) { + _paletteArea = 0; + updatePaletteArea(instantly); + } +} + +void Scene2812::setPaletteArea1(bool instantly) { + if (_paletteArea != 1) { + _paletteArea = 1; + updatePaletteArea(instantly); + } +} + +void Scene2812::setPaletteArea2(bool instantly) { + if (_paletteArea != 2) { + _paletteArea = 2; + updatePaletteArea(instantly); + } +} + +void Scene2812::updatePaletteArea(bool instantly) { + if (_paletteArea == 0) + _palette->addBasePalette(0x05D30F11, 0, 64, 0); + else if (_paletteArea == 1) + _palette->addBasePalette(0x92CA2C9B, 0, 64, 0); + else if (_paletteArea == 2) + _palette->addBasePalette(0x381F92C5, 0, 64, 0); + _palette->startFadeToPalette(instantly ? 0 : 12); +} + +Scene2822::Scene2822(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _countdown(0), _scrollIndex(0) { + + SetMessageHandler(&Scene2822::handleMessage); + SetUpdateHandler(&Scene2822::update); + _background = new Background(_vm, 0xD542022E, 0, 0); + addBackground(_background); + _background->getSurface()->getDrawRect().y = -10; + setPalette(0xD542022E); + insertPuzzleMouse(0x0028D089, 20, 620); + _ssButton = insertStaticSprite(0x1A4D4120, 1100); + _ssButton->setVisible(false); + loadSound(2, 0x19044E72); +} + +void Scene2822::update() { + + static const int16 kScene2822BackgroundYPositions[] = { + 0, -20, -5, -15, -8, -12, -9, -11, -10, 0 + }; + + Scene::update(); + + if (_countdown != 0) { + if ((--_countdown) == 0) { + if (_countdownStatus == 0) { + _ssButton->setVisible(false); + _countdownStatus = 1; + _countdown = 48; + } else if (_countdownStatus == 1) { + playSound(0, 0x1384CB60); + _countdownStatus = 2; + _countdown = 12; + } else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) { + leaveScene(0); + } + } else if (_countdownStatus == 2 && getGlobalVar(V_LADDER_DOWN_ACTION)) { + if (_scrollIndex < 9) { + _background->getSurface()->getDrawRect().y = kScene2822BackgroundYPositions[_scrollIndex]; + _scrollIndex++; + } else { + _background->getSurface()->getDrawRect().y = -10; + } + } + } + +} + +uint32 Scene2822::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } else if (param.asPoint().x >= 257 && param.asPoint().y >= 235 && + param.asPoint().x <= 293 && param.asPoint().y <= 273) { + _ssButton->setVisible(true); + _countdownStatus = 0; + _countdown = 12; + playSound(1, 0x44061000); + if (getGlobalVar(V_LADDER_DOWN) == 0) { + setGlobalVar(V_LADDER_DOWN, 1); + setGlobalVar(V_LADDER_DOWN_ACTION, 1); + SetMessageHandler(NULL); + playSound(2); + _mouseCursor->setVisible(false); + } + } + break; + } + return messageResult; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2800.h b/engines/neverhood/modules/module2800.h new file mode 100644 index 0000000000..fe62f11307 --- /dev/null +++ b/engines/neverhood/modules/module2800.h @@ -0,0 +1,505 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2800_H +#define NEVERHOOD_MODULES_MODULE2800_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2800 + +class Module2800 : public Module { +public: + Module2800(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module2800(); +protected: + int _sceneNum; + uint32 _currentMusicFileHash; + MusicResource *_musicResource; + void createScene(int sceneNum, int which); + void updateScene(); + void updateMusic(bool halfVolume); +}; + +class Scene2801 : public Scene { +public: + Scene2801(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2801(); +protected: + Sprite *_asTape; + uint32 _paletteHash; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2802 : public Scene { +public: + Scene2802(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2802(); +protected: + SmackerPlayer *_smackerPlayer; + uint _currRadioMusicIndex; + int _currTuneStatus; + int _countdown1; + int _countdown2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void incRadioMusicIndex(int delta); + void changeTuneStatus(int prevTuneStatus, int newTuneStatus); +}; + +class AsScene2803LightCord : public AnimatedSprite { +public: + AsScene2803LightCord(NeverhoodEngine *vm, Scene *parentScene, uint32 fileHash1, uint32 fileHash2, int16 x, int16 y); + void stPulled(); + void stIdle(); + void setFileHashes(uint32 fileHash1, uint32 fileHash2); +protected: + Scene *_parentScene; + uint32 _fileHash1, _fileHash2; + bool _isPulled, _isBusy; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmPulled(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2803TestTubeOne : public AnimatedSprite { +public: + AsScene2803TestTubeOne(NeverhoodEngine *vm, uint32 fileHash1, uint32 fileHash2); +protected: + uint32 _fileHash1, _fileHash2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2803Rope : public AnimatedSprite { +public: + AsScene2803Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmReleased(int messageNum, const MessageParam ¶m, Entity *sender); + void stReleased(); + void stHide(); +}; + +class Scene2803 : public Scene { +public: + Scene2803(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + StaticSprite *_asTestTubeOne; + StaticSprite *_asTestTubeTwo; + StaticSprite *_asTestTubeThree; + Sprite *_asRope; + AsScene2803LightCord *_asLightCord; + StaticSprite *_sprite3; + StaticSprite *_sprite4; + StaticSprite *_sprite5; + StaticSprite *_sprite6; + StaticSprite *_sprite7; + StaticSprite *_sprite8; + StaticSprite *_sprite9; + Sprite *_sprite10; + NRect _clipRectsFloor[2]; + NRect _clipRectsStairs[3]; + int _paletteArea; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void upKlaymenStairs(); + void klaymenStairs(); + void klaymenFloor(); + void toggleBackground(); + void changeBackground(); + void setPaletteArea0(); + void setPaletteArea1(); + void updatePaletteArea(); +}; + +class Scene2803Small : public Scene { +public: + Scene2803Small(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _paletteArea; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_sprite5; + Sprite *_sprite6; + Sprite *_sprite7; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void upKlaymenSlope(); + void upKlaymenFloor(); + void klaymenSlope(); + void klaymenFloor(); + void setPaletteArea0(); + void setPaletteArea1(); + void setPaletteArea2(); + void setPaletteArea3(); + void updatePaletteArea(bool instantly); +}; + +class Scene2804; + +class SsScene2804RedButton : public StaticSprite { +public: + SsScene2804RedButton(NeverhoodEngine *vm, Scene2804 *parentScene); +protected: + Scene2804 *_parentScene; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2804LightCoil : public StaticSprite { +public: + SsScene2804LightCoil(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2804BeamCoilBody : public StaticSprite { +public: + SsScene2804BeamCoilBody(NeverhoodEngine *vm); +}; + +class SsScene2804LightTarget : public StaticSprite { +public: + SsScene2804LightTarget(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2804Flash : public StaticSprite { +public: + SsScene2804Flash(NeverhoodEngine *vm); + void show(); +}; + +class AsScene2804CrystalWaves : public AnimatedSprite { +public: + AsScene2804CrystalWaves(NeverhoodEngine *vm, uint crystalIndex); + void show(); + void hide(); +protected: + uint _crystalIndex; +}; + +class AsScene2804Crystal : public AnimatedSprite { +public: + AsScene2804Crystal(NeverhoodEngine *vm, AsScene2804CrystalWaves *asCrystalWaves, uint crystalIndex); + void show(); + void hide(); + void activate(); + int16 getColorNum() const { return _colorNum; } +protected: + AsScene2804CrystalWaves *_asCrystalWaves; + uint _crystalIndex; + int16 _colorNum; + bool _isLightOn; + bool _isShowing; +}; + +class SsScene2804CrystalButton : public StaticSprite { +public: + SsScene2804CrystalButton(NeverhoodEngine *vm, Scene2804 *parentScene, AsScene2804Crystal *asCrystal, uint crystalIndex); +protected: + Scene2804 *_parentScene; + AsScene2804Crystal *_asCrystal; + uint _crystalIndex; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2804BeamCoil : public AnimatedSprite { +public: + AsScene2804BeamCoil(NeverhoodEngine *vm, Scene *parentScene, SsScene2804BeamCoilBody *ssBeamCoilBody); + virtual ~AsScene2804BeamCoil(); +protected: + Scene *_parentScene; + SsScene2804BeamCoilBody *_ssBeamCoilBody; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void show(); + void hide(); + void stBeaming(); + uint32 hmBeaming(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2804BeamTarget : public AnimatedSprite { +public: + AsScene2804BeamTarget(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2804 : public Scene { +public: + Scene2804(NeverhoodEngine *vm, Module *parentModule, int which); + bool isWorking() const { return _isWorking; } +protected: + int _countdown1; + int _countdown2; + int _countdown3; + int _beamStatus; + bool _isSolved; + bool _isWorking; + Sprite *_ssRedButton; + Sprite *_asCoil; + Sprite *_asTarget; + SsScene2804Flash *_ssFlash; + AsScene2804Crystal *_asCrystals[5]; + Sprite *_ssCrystalButtons[5]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2805 : public Scene { +public: + Scene2805(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2806Spew : public AnimatedSprite { +public: + AsScene2806Spew(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2806 : public Scene { +public: + Scene2806(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + NPointArray *_pointList; + int _pointIndex; + NRect _clipRects[4]; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_asSpew; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void update(); + void findClosestPoint(); +}; + +class Scene2807 : public Scene { +public: + Scene2807(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2808Dispenser : public StaticSprite { +public: + SsScene2808Dispenser(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum, int testTubeIndex); + void startCountdown(int index); +protected: + Scene *_parentScene; + int _countdown; + int _testTubeSetNum, _testTubeIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808TestTube : public AnimatedSprite { +public: + AsScene2808TestTube(NeverhoodEngine *vm, int testTubeSetNum, int testTubeIndex, SsScene2808Dispenser *ssDispenser); + void fill(); + void flush(); + uint32 getFillLevel() const { return _fillLevel; } +protected: + SsScene2808Dispenser *_ssDispenser; + int _testTubeSetNum; + uint32 _fillLevel; + int _testTubeIndex; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808Handle : public AnimatedSprite { +public: + AsScene2808Handle(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum); + void activate(); + void stActivated(); +protected: + Scene *_parentScene; + int _testTubeSetNum; + bool _isActivated; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmActivating(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808Flow : public AnimatedSprite { +public: + AsScene2808Flow(NeverhoodEngine *vm, Scene *parentScene, int testTubeSetNum); + void start(); + void stKeepFlowing(); +protected: + Scene *_parentScene; + int _testTubeSetNum; + uint32 hmFlowing(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2808LightEffect : public AnimatedSprite { +public: + AsScene2808LightEffect(NeverhoodEngine *vm, int which); +protected: + int _countdown; + void update(); +}; + +class Scene2808 : public Scene { +public: + Scene2808(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _countdown; + int _testTubeSetNum; + AsScene2808Flow *_asFlow; + int _leaveResult; + bool _isFlowing; + AsScene2808TestTube *_asTestTubes[3]; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void update(); + bool isMixtureGood(); + bool isAnyTestTubeFilled(); +}; + +class AsScene2809Spew : public AnimatedSprite { +public: + AsScene2809Spew(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2809 : public Scene { +public: + Scene2809(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + NPointArray *_pointList; + int _pointIndex; + NRect _clipRects[4]; + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_sprite4; + Sprite *_asSpew; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void findClosestPoint(); +}; + +class AsScene2810Rope : public AnimatedSprite { +public: + AsScene2810Rope(NeverhoodEngine *vm, Scene *parentScene, int16 x); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2810 : public Scene { +public: + Scene2810(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Scene2810(); +protected: + Sprite *_sprite1; + Sprite *_sprite2; + Sprite *_sprite3; + Sprite *_asRope; + Sprite *_sprite4; + Sprite *_asTape; + Sprite *_sprite5; + Sprite *_sprite6; + bool _isRopingDown; + NRect _clipRects[2]; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void insertKlaymenLadder(); +}; + +class AsScene2812Winch : public AnimatedSprite { +public: + AsScene2812Winch(NeverhoodEngine *vm); + virtual ~AsScene2812Winch(); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene2812Rope : public AnimatedSprite { +public: + AsScene2812Rope(NeverhoodEngine *vm, Scene *parentScene); +protected: + Scene *_parentScene; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + uint32 hmRopingDown(int messageNum, const MessageParam ¶m, Entity *sender); + void stRopingDown(); +}; + +class AsScene2812TrapDoor : public AnimatedSprite { +public: + AsScene2812TrapDoor(NeverhoodEngine *vm); +protected: + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2812 : public Scene { +public: + Scene2812(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_asWinch; + Sprite *_asTrapDoor; + Sprite *_asRope; + Sprite *_sprite3; + Sprite *_sprite2; + Sprite *_sprite4; + Sprite *_ssTape; + Sprite *_asKey; + Sprite *_sprite1; + bool _isRopingDown; + int _paletteArea; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void setPaletteArea0(bool instantly); + void setPaletteArea1(bool instantly); + void setPaletteArea2(bool instantly); + void updatePaletteArea(bool instantly); +}; + +class Scene2822 : public Scene { +public: + Scene2822(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssButton; + int _scrollIndex; + int _countdown; + int _countdownStatus; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2800_H */ diff --git a/engines/neverhood/modules/module2900.cpp b/engines/neverhood/modules/module2900.cpp new file mode 100644 index 0000000000..bd95b82f4c --- /dev/null +++ b/engines/neverhood/modules/module2900.cpp @@ -0,0 +1,439 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module2900.h" +#include "neverhood/gamemodule.h" +#include "neverhood/modules/module1100.h" +#include "neverhood/modules/module1300.h" +#include "neverhood/modules/module1700.h" +#include "neverhood/modules/module2000.h" +#include "neverhood/modules/module2100.h" +#include "neverhood/modules/module2800.h" + +namespace Neverhood { + +Module2900::Module2900(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule) { + + if (which >= 0) + setGlobalVar(V_TELEPORTER_WHICH, which); + + createScene(0, 0); + +} + +void Module2900::createScene(int sceneNum, int which) { + debug("Module2900::createScene(%d, %d)", sceneNum, which); + _sceneNum = sceneNum; + switch (_sceneNum) { + case 0: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2901(_vm, this, getGlobalVar(V_TELEPORTER_WHICH)); + break; + case 1: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2805(_vm, this, which); + break; + case 2: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2101(_vm, this, which); + break; + case 3: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1306(_vm, this, which); + break; + case 4: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1705(_vm, this, which); + break; + case 5: + _vm->gameState().sceneNum = 0; + _childObject = new Scene1109(_vm, this, which); + break; + case 6: + _vm->gameState().sceneNum = 0; + _childObject = new Scene2001(_vm, this, which); + break; + } + SetUpdateHandler(&Module2900::updateScene); + _childObject->handleUpdate(); +} + +void Module2900::updateScene() { + if (!updateChild()) { + switch (_sceneNum) { + case 0: + if (_moduleResult == (uint32)-1) { + leaveModule((uint32)-1); + } else { + _teleporterModuleResult = _moduleResult; + switch (getGlobalVar(V_TELEPORTER_WHICH)) { + case 0: + createScene(3, 4); + break; + case 1: + createScene(2, 2); + break; + case 2: + createScene(5, 2); + break; + case 3: + createScene(4, 2); + break; + case 4: + createScene(6, 2); + break; + case 5: + createScene(1, 2); + break; + default: + leaveModule(_moduleResult); + break; + } + } + break; + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + leaveModule(_teleporterModuleResult); + break; + } + } +} + +static const uint32 kScene2901FileHashes1[] = { + 0x023023B4, + 0x36204507, + 0x046CF08E, + 0x9313A237, + 0xA651F246, + 0x02108034 +}; + +static const uint32 kScene2901FileHashes2[] = { + 0x023B002B, + 0x0450336A, + 0xCF08A04E, + 0x3A233939, + 0x1F242A6D, + 0x08030029 +}; + +static const uint32 kSsScene2901LocationButtonFileHashes[] = { + 0x2311326A, + 0x212323AC, + 0x10098138, + 0x25213167, + 0x1119A363, + 0x94452612, + 0x39464212, + 0x01860450, + 0x53002104, + 0x58E68412, + 0x18600300, + 0xB650A890, + 0x2452A7C4, + 0xA0232748, + 0x08862B02, + 0x2491E648, + 0x0010EB46, + 0x214C8A11, + 0x16A31921, + 0x0AC33A00, + 0x238028AA, + 0x26737A21, + 0x063039A8, + 0x51286C60, + 0x464006B4, + 0x42242538, + 0x20716010, + 0x4A2000AE, + 0x225124A6, + 0x28E82E45, + 0x58652C04, + 0xC82210A4, + 0x62A84060, + 0xC0693CB4, + 0x22212C64, + 0x5034EA71 +}; + +static const NPoint kSsScene2901LocationButtonPoints[] = { + {525, 120}, {576, 149}, {587, 205}, + {538, 232}, {484, 205}, {479, 153} +}; + +static const uint32 kSsScene2901LocationButtonLightFileHashes1[] = { + 0x03136246, + 0x2106216E, + 0x4025A13A, + 0x21816927, + 0x110B2202, + 0xCC0522B2, + 0x3CC24258, + 0x59C600F0, + 0x534A2480, + 0x50E61019, + 0x34400150, + 0x225BA090, + 0xB059AFC4, + 0xE093A741, + 0x0086BF09, + 0x3281E760, + 0xA048AB42, + 0x20649C01, + 0x14611904, + 0x26E33850, + 0x23A52A68, + 0xA2733024, + 0x10203880, + 0x1B2DE860, + 0x0644A6EC, + 0x426E20BC, + 0x80292014, + 0x4360B02E, + 0x22742664, + 0x98682705, + 0x0925B82C, + 0x5C2918A4, + 0xD2284920, + 0x41083CA6, + 0x6824A864, + 0x50266B10 +}; + +static const uint32 kSsScene2901LocationButtonLightFileHashes2[] = { + 0x43C46D4C, + 0x43C4AD4C, + 0x43C52D4C, + 0x43C62D4C, + 0x43C02D4C, + 0x43CC2D4C +}; + +static const uint32 kSsScene2901BrokenButtonFileHashes[] = { + 0x3081BD3A, + 0xD3443003, + 0x0786A320, + 0xE3A22029, + 0x61611814, + 0x425848E2 +}; + +static const uint32 kSsScene2901BigButtonFileHashes[] = { + 0x010D7748, + 0x9D02019A, + 0x351A2F43, + 0x448138E5, + 0x02788CF0, + 0x71718024 +}; + +SsScene2901LocationButton::SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index) + : StaticSprite(vm, 900), _parentScene(parentScene), _index(index), _countdown1(0) { + + const NPoint &pt = kSsScene2901LocationButtonPoints[_index]; + + loadSprite(kSsScene2901LocationButtonFileHashes[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 800); + _collisionBounds.set(pt.x - 25, pt.y - 25, pt.x + 25, pt.y + 25); + setVisible(false); + loadSound(0, 0x440430C0); + SetUpdateHandler(&SsScene2901LocationButton::update); + SetMessageHandler(&SsScene2901LocationButton::handleMessage); +} + +void SsScene2901LocationButton::update() { + updatePosition(); + if (_countdown1 != 0 && (--_countdown1) == 0) { + setVisible(false); + } +} + +uint32 SsScene2901LocationButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown1 == 0) { + playSound(0); + setVisible(true); + _countdown1 = 4; + sendMessage(_parentScene, 0x2001, _index); + } + messageResult = 1; + break; + } + return messageResult; +} + +SsScene2901LocationButtonLight::SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index) + : StaticSprite(vm, 900), _index(index) { + + loadSprite(kSsScene2901LocationButtonLightFileHashes1[which * 6 + index], kSLFDefDrawOffset | kSLFDefPosition, 900); + setVisible(false); + loadSound(0, kSsScene2901LocationButtonLightFileHashes2[_index]); +} + +void SsScene2901LocationButtonLight::show() { + playSound(0); + setVisible(true); + updatePosition(); +} + +void SsScene2901LocationButtonLight::hide() { + setVisible(false); + updatePosition(); +} + +SsScene2901BrokenButton::SsScene2901BrokenButton(NeverhoodEngine *vm, int which) + : StaticSprite(vm, 900) { + + loadSprite(kSsScene2901BrokenButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 900); +} + +SsScene2901BigButton::SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which) + : StaticSprite(vm, 900), _parentScene(parentScene), _which(which), _countdown1(0) { + + loadSprite(kSsScene2901BigButtonFileHashes[which], kSLFDefDrawOffset | kSLFDefPosition, 400); + _collisionBounds.set(62, 94, 322, 350); + setVisible(false); + loadSound(0, 0xF3D420C8); + SetUpdateHandler(&SsScene2901BigButton::update); + SetMessageHandler(&SsScene2901BigButton::handleMessage); +} + +void SsScene2901BigButton::update() { + updatePosition(); + if (_countdown1 != 0 && (--_countdown1) == 0) { + setVisible(false); + sendMessage(_parentScene, 0x2000, 0); + } +} + +uint32 SsScene2901BigButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown1 == 0) { + playSound(0); + setVisible(true); + _countdown1 = 4; + } + messageResult = 1; + break; + } + return messageResult; +} + +Scene2901::Scene2901(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _currLocationButtonNum(which), _selectedButtonNum(which), + _currWhirlButtonNum(0), _prevWhirlButtonNum(0), _countdown1(1), _skipCountdown(0), _blinkOn(0) { + + _isButton2Broken = getGlobalVar(V_ENTRANCE_OPEN) != 0; + + setSubVar(V_TELEPORTER_DEST_AVAILABLE, which, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 5, 1); + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 4, 1); + + if (_currLocationButtonNum == 3) + setSubVar(V_TELEPORTER_DEST_AVAILABLE, 2, 1); + + setBackground(kScene2901FileHashes1[_currLocationButtonNum]); + setPalette(kScene2901FileHashes1[_currLocationButtonNum]); + + for (uint i = 0; i < 6; ++i) { + if (i != 2 || !_isButton2Broken) { + _ssLocationButtons[i] = insertSprite(this, _currLocationButtonNum, i); + addCollisionSprite(_ssLocationButtons[i]); + _ssLocationButtonLights[i] = insertSprite(_currLocationButtonNum, i); + } + } + + if (_isButton2Broken) + insertSprite(_currLocationButtonNum); + + _ssBigButton = insertSprite(this, _currLocationButtonNum); + addCollisionSprite(_ssBigButton); + + insertPuzzleMouse(kScene2901FileHashes2[_currLocationButtonNum], 20, 620); + + SetUpdateHandler(&Scene2901::update); + SetMessageHandler(&Scene2901::handleMessage); + +} + +void Scene2901::update() { + Scene::update(); + if (_countdown1 != 0 && (--_countdown1) == 0) { + if (_currLocationButtonNum == _selectedButtonNum) { + _ssLocationButtonLights[_currWhirlButtonNum]->hide(); + ++_currWhirlButtonNum; + while (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _currWhirlButtonNum) || (_currWhirlButtonNum == 2 && _isButton2Broken) || _currLocationButtonNum == _currWhirlButtonNum) { + ++_currWhirlButtonNum; + if (_currWhirlButtonNum >= 6) + _currWhirlButtonNum = 0; + } + if (_currWhirlButtonNum != _prevWhirlButtonNum || _skipCountdown == 0) { + _ssLocationButtonLights[_currWhirlButtonNum]->show(); + _skipCountdown = 4; + } + _countdown1 = 2; + --_skipCountdown; + _prevWhirlButtonNum = _currWhirlButtonNum; + } else if (_blinkOn) { + _blinkOn = false; + _ssLocationButtonLights[_selectedButtonNum]->hide(); + _countdown1 = 16; + } else { + _blinkOn = true; + _ssLocationButtonLights[_selectedButtonNum]->show(); + _countdown1 = 4; + } + } +} + +uint32 Scene2901::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) + leaveScene((uint32)-1); + break; + case 0x2000: + if (_currLocationButtonNum != _selectedButtonNum) + leaveScene(_selectedButtonNum); + break; + case 0x2001: + if (_currLocationButtonNum == _selectedButtonNum) + _selectedButtonNum = _currWhirlButtonNum; + _ssLocationButtonLights[_selectedButtonNum]->hide(); + _selectedButtonNum = param.asInteger(); + if (!getSubVar(V_TELEPORTER_DEST_AVAILABLE, _selectedButtonNum)) + _selectedButtonNum = _currLocationButtonNum; + break; + } + return 0; +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module2900.h b/engines/neverhood/modules/module2900.h new file mode 100644 index 0000000000..75b29567f6 --- /dev/null +++ b/engines/neverhood/modules/module2900.h @@ -0,0 +1,102 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE2900_H +#define NEVERHOOD_MODULES_MODULE2900_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" + +namespace Neverhood { + +// Module2900 + +class Module2900 : public Module { +public: + Module2900(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _sceneNum; + int _teleporterModuleResult; + void createScene(int sceneNum, int which); + void updateScene(); + void updateMusic(bool halfVolume); +}; + +class SsScene2901LocationButton : public StaticSprite { +public: + SsScene2901LocationButton(NeverhoodEngine *vm, Scene *parentScene, int which, uint index); +protected: + Scene *_parentScene; + uint _index; + int _countdown1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene2901LocationButtonLight : public StaticSprite { +public: + SsScene2901LocationButtonLight(NeverhoodEngine *vm, int which, uint index); + void show(); + void hide(); +protected: + uint _index; +}; + +class SsScene2901BrokenButton : public StaticSprite { +public: + SsScene2901BrokenButton(NeverhoodEngine *vm, int which); +}; + +class SsScene2901BigButton : public StaticSprite { +public: + SsScene2901BigButton(NeverhoodEngine *vm, Scene *parentScene, int which); +protected: + Scene *_parentScene; + int _which; + int _countdown1; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene2901 : public Scene { +public: + Scene2901(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssLocationButtons[6]; + SsScene2901LocationButtonLight *_ssLocationButtonLights[6]; + Sprite *_ssBigButton; + int _currWhirlButtonNum; + int _prevWhirlButtonNum; + int _countdown1; + int _currLocationButtonNum; + int _selectedButtonNum; + int _skipCountdown; + int _blinkOn; + bool _isButton2Broken; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE2900_H */ diff --git a/engines/neverhood/modules/module3000.cpp b/engines/neverhood/modules/module3000.cpp new file mode 100644 index 0000000000..2bdb9f0497 --- /dev/null +++ b/engines/neverhood/modules/module3000.cpp @@ -0,0 +1,1548 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "neverhood/modules/module3000.h" +#include "neverhood/gamemodule.h" +#include "neverhood/navigationscene.h" + +namespace Neverhood { + +static const uint32 kModule3000SoundList[] = { + 0x92025040, + 0x90035066, + 0x90815450, + 0x99801500, + 0x90E14440, + 0x16805048, + 0x90F0D1C3, + 0 +}; + +Module3000::Module3000(NeverhoodEngine *vm, Module *parentModule, int which) + : Module(vm, parentModule), _soundVolume(0) { + + _vm->_soundMan->addSoundList(0x81293110, kModule3000SoundList); + _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 50, 600, 5, 150); + _vm->_soundMan->setSoundParams(0x90F0D1C3, false, 20000, 30000, 20000, 30000); + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + + _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; + + if (_isWallBroken) { + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); + _vm->_soundMan->playSoundLooping(0x90F0D1C3); + } + + if (which < 0) { + createScene(_vm->gameState().sceneNum, -1); + } else if (which == 0) { + createScene(1, 0); + } else if (which == 1) { + createScene(4, 2); + } else if (which == 2) { + createScene(4, 1); + } else if (which == 3) { + createScene(5, 1); + } + +} + +Module3000::~Module3000() { + _vm->_soundMan->deleteGroup(0x81293110); +} + +void Module3000::createScene(int sceneNum, int which) { + static const byte kNavigationTypes05[] = {3, 0}; + static const byte kNavigationTypes06[] = {5}; + debug("Module3000::createScene(%d, %d)", sceneNum, which); + _vm->gameState().sceneNum = sceneNum; + switch (_vm->gameState().sceneNum) { + case 1: + if (!getGlobalVar(V_BOLT_DOOR_OPEN)) { + createNavigationScene(0x004B7C80, which); + } else if (getGlobalVar(V_WALL_BROKEN)) { + createNavigationScene(0x004B7CE0, which); + } else { + createNavigationScene(0x004B7CB0, which); + } + break; + case 2: + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + if (_isWallBroken) { + _soundVolume = 90; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 90); + } + if (getGlobalVar(V_WALL_BROKEN)) { + createNavigationScene(0x004B7D58, which); + } else { + createNavigationScene(0x004B7D10, which); + } + break; + case 3: + if (getGlobalVar(V_STAIRS_DOWN)) + createNavigationScene(0x004B7E60, which); + else if (getGlobalVar(V_WALL_BROKEN)) + createNavigationScene(0x004B7DA0, which); + else + createNavigationScene(0x004B7E00, which); + break; + case 4: + if (getGlobalVar(V_STAIRS_DOWN)) + createNavigationScene(0x004B7F20, which); + else + createNavigationScene(0x004B7EC0, which); + break; + case 5: + createNavigationScene(0x004B7F80, which, kNavigationTypes05); + break; + case 6: + createNavigationScene(0x004B7FB0, which, kNavigationTypes06); + break; + case 7: + _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x089809C2)) { + setSubVar(VA_IS_PUZZLE_INIT, 0x089809C2, 1); + createSmackerScene(0x90022001, true, true, false); + } else + createSmackerScene(0x98022001, true, true, false); + break; + case 8: + _childObject = new Scene3009(_vm, this, which); + break; + case 9: + _childObject = new Scene3010(_vm, this, 0); + break; + case 10: + _childObject = new Scene3011(_vm, this, 0); + break; + case 11: + _vm->_soundMan->setSoundListParams(kModule3000SoundList, false, 0, 0, 0, 0); + if (!getSubVar(VA_IS_PUZZLE_INIT, 0x10130993)) { + setSubVar(VA_IS_PUZZLE_INIT, 0x10130993, 1); + createSmackerScene(0x31093019, true, true, false); + } else + createSmackerScene(0x20093019, true, true, false); + break; + case 12: + _childObject = new Scene3010(_vm, this, 1); + break; + // NOTE: Newly introduced sceneNums + case 1001: + if (!getGlobalVar(V_BOLT_DOOR_OPEN)) + if (getGlobalVar(V_WALL_BROKEN)) + createSmackerScene(0x00940021, true, true, false); + else + createSmackerScene(0x01140021, true, true, false); + else + if (getGlobalVar(V_WALL_BROKEN)) + createSmackerScene(0x001011B1, true, true, false); + else + createSmackerScene(0x001021B1, true, true, false); + setGlobalVar(V_BOLT_DOOR_OPEN, getGlobalVar(V_BOLT_DOOR_OPEN) ? 0 : 1); + break; + case 1006: + createSmackerScene(0x080810C5, true, true, false); + break; + case 1008: + createSmackerScene(getGlobalVar(V_CANNON_SMACKER_NAME), true, true, false); + break; + } + SetUpdateHandler(&Module3000::updateScene); + _childObject->handleUpdate(); +} + +void Module3000::updateScene() { + if (!updateChild()) { + switch (_vm->gameState().sceneNum) { + case 1: + if (!getGlobalVar(V_BOLT_DOOR_OPEN)) { + if (_moduleResult == 0) + createScene(9, -1); + else if (_moduleResult == 1) + leaveModule(0); + } else { + if (_moduleResult == 0) + if (_navigationAreaType == 2) + createScene(2, 0); + else + createScene(1001, -1); + else if (_moduleResult == 1) + leaveModule(0); + } + break; + case 2: + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + if (_isWallBroken) { + _soundVolume = 0; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, 0); + } + if (_moduleResult == 0) { + createScene(3, 0); + } else if (_moduleResult == 1) { + setGlobalVar(V_BOLT_DOOR_OPEN, 0); + createScene(1, 1); + } + break; + case 3: + if (_moduleResult == 1) + createScene(4, 0); + else if (_moduleResult == 3) + createScene(10, -1); + else if (getGlobalVar(V_STAIRS_DOWN)) + createScene(5, 0); + else + createScene(2, 1); + break; + case 4: + if (_moduleResult == 0) + leaveModule(1); + else if (_moduleResult == 1) + createScene(7, -1); + else if (_moduleResult == 2) + createScene(3, 3); + break; + case 5: + if (_moduleResult == 0) + createScene(6, 0); + else if (_moduleResult == 1) + createScene(3, 0); + break; + case 6: + if (_navigationAreaType == 4) + createScene(11, -1); + else + createScene(1006, -1); + break; + case 7: + createScene(8, -1); + break; + case 8: + _isWallBroken = getGlobalVar(V_WALL_BROKEN) != 0; + if (_moduleResult != 1) { + _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); + createScene(4, 1); + } else if (getGlobalVar(V_CANNON_SMACKER_NAME)) { + createScene(1008, -1); + } else { + _vm->_soundMan->setSoundListParams(kModule3000SoundList, true, 0, 0, 0, 0); + createScene(4, 1); + } + break; + case 9: + if (_moduleResult == 0 || _moduleResult == 2) + createScene(1, 0); + else if (_moduleResult == 1) + createScene(1001, -1); + break; + case 10: + createScene(3, 3); + break; + case 11: + leaveModule(3); + break; + case 12: + createScene(1, 0); + break; + case 1001: + if (getGlobalVar(V_BOLT_DOOR_OPEN)) + createScene(1, 0); + else + createScene(12, -1); + break; + case 1006: + createScene(5, 0); + break; + case 1008: + createScene(8, -1); + break; + } + } else { + switch (_vm->gameState().sceneNum) { + case 1: + if (navigationScene()->isWalkingForward()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getNavigationIndex(); + if (navigationIndex == 1) { + if (frameNumber == 0) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); + } else if (frameNumber == 100) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 0) { + if (frameNumber == 0) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); + } else if (frameNumber == 10) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); + } + } + } + break; + case 2: + if (navigationScene()->isWalkingForward()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getNavigationIndex(); + if (_isWallBroken && _soundVolume > 1 && frameNumber % 2) { + _soundVolume--; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); + } + if (navigationIndex == 0) { + if (frameNumber == 35) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x41861371, 0x43A2507F, 0); + } + } else if (navigationIndex == 1) { + if (frameNumber == 55) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x48498E46, 0x50399F64, 0); + _vm->_soundMan->setSoundVolume(0x48498E46, 70); + _vm->_soundMan->setSoundVolume(0x50399F64, 70); + } + } + } + break; + case 3: + if (navigationScene()->isWalkingForward()) { + uint32 frameNumber = navigationScene()->getFrameNumber(); + int navigationIndex = navigationScene()->getNavigationIndex(); + if (navigationIndex == 2) { + if (frameNumber == 40) { + _vm->_soundMan->playTwoSounds(0x81293110, 0x40030A51, 0xC862CA15, 0); + } + if (_isWallBroken && _soundVolume < 90 && frameNumber % 2) { + if (frameNumber == 0) + _soundVolume = 40; + else + _soundVolume++; + _vm->_soundMan->setSoundVolume(0x90F0D1C3, _soundVolume); + } + } + } + break; + case 5: + if (navigationScene()->isWalkingForward() && navigationScene()->getNavigationIndex() == 0) { + _vm->_soundMan->setTwoSoundsPlayFlag(false); + } + break; + } + } +} + +// Scene3009 + +enum { + kCTSNull = 0, + kCTSBreakWall = 1, + kCTSWall = 2, + kCTSEmptyness = 3, + kCTSFireRobotNoTarget = 4, + kCTSFireRobotIsTarget = 5, + kCTSFireNoRobot = 6, + kCTSRaiseCannon = 7, + kCTSRightRobotNoTarget = 8, + kCTSRightRobotIsTarget = 9, + kCTSRightNoRobot = 10, + kCTSLeftRobotNoTarget = 11, + kCTSLeftRobotIsTarget = 12, + kCTSLeftNoRobot = 13, + kCTSLowerCannon = 14, + kCTSCount = 14 +}; + +static const uint32 kScene3009CannonScopeVideos[] = { + 0x1010000D, + 0x340A0049, + 0x340A0049, + 0x0282081D, + 0x0082080D, + 0x0882080D, + 0x0882080D, + 0x0282081D, + 0x004B000B, + 0x014B000B, + 0x044B000B, + 0x0282081D, + 0x0282081D, + 0x0282081D, + 0x340A0049 +}; + +static const uint32 kScene3009CannonActionVideos[] = { + 0x00000000, + 0x8004001B, // 1 Fire cannon at wall, it breaks (lowered) + 0x0004001A, // 2 Fire cannon at wall, nothing happens (lowered) + 0x1048404B, // 3 Fire cannon at emptyness (raised) + 0x50200109, // 4 Fire cannon, robot missed (raised) + 0x12032109, // 5 Fire cannon, robot hit (raised) + 0x10201109, // 6 Fire cannon, no robot (raised) + 0x000A2030, // 7 Raise the cannon + 0x000A0028, // 8 + 0x000A0028, // 9 + 0x000A0028, // 10 + 0x040A1069, // 11 + 0x040A1069, // 12 + 0x040A1069, // 13 + 0x240A1101 // 14 Lower the cannon +}; + +static const uint32 kSsScene3009SymbolEdgesFileHashes[] = { + 0x618827A0, + 0xB1A92322 +}; + +static const uint32 kSsScene3009TargetLineFileHashes[] = { + 0x4011018C, + 0x15086623 +}; + +static const NPoint kAsScene3009SymbolPoints[] = { + {289, 338}, + {285, 375}, + {284, 419}, + {456, 372}, + {498, 372}, + {541, 372} +}; + +static const uint32 kAsScene3009SymbolFileHashes[] = { + 0x24542582, + 0x1CD61D96 +}; + +static const uint32 kSsScene3009SymbolArrowFileHashes1[] = { + 0x24016060, + 0x21216221, + 0x486160A0, + 0x42216422, + 0x90A16120, + 0x84216824, + 0x08017029, + 0x08217029, + 0x10014032, + 0x10214032, + 0x20012004, + 0x20212004 +}; + +static const uint32 kSsScene3009SymbolArrowFileHashes2[] = { + 0x40092024, + 0x01636002, + 0x8071E028, + 0x02A56064, + 0x00806031, + 0x052960A8, + 0x0A116130, + 0x0A316130, + 0x14216200, + 0x14016200, + 0x28416460, + 0x28616460 +}; + +SsScene3009FireCannonButton::SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene) + : StaticSprite(vm, 1400), _parentScene(parentScene), _isClicked(false) { + + loadSprite(0x120B24B0, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); + SetUpdateHandler(&SsScene3009FireCannonButton::update); + SetMessageHandler(&SsScene3009FireCannonButton::handleMessage); + loadSound(0, 0x3901B44F); +} + +void SsScene3009FireCannonButton::update() { + updatePosition(); + if (_isClicked && !isSoundPlaying(0)) { + sendMessage(_parentScene, 0x2000, 0); + setVisible(false); + } +} + +uint32 SsScene3009FireCannonButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_isClicked && !_parentScene->isTurning()) { + _isClicked = true; + setVisible(true); + playSound(0); + } + messageResult = 1; + break; + } + return messageResult; +} + +SsScene3009SymbolEdges::SsScene3009SymbolEdges(NeverhoodEngine *vm, int index) + : StaticSprite(vm, 1400), _blinkCountdown(0) { + + loadSprite(kSsScene3009SymbolEdgesFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600); + if (getGlobalVar(V_ROBOT_HIT)) + hide(); + else + startBlinking(); + SetUpdateHandler(&SsScene3009SymbolEdges::update); +} + +void SsScene3009SymbolEdges::update() { + if (_blinkCountdown != 0 && (--_blinkCountdown == 0)) { + if (_blinkToggle) { + setVisible(true); + } else { + setVisible(false); + } + updatePosition(); + _blinkCountdown = 3; + _blinkToggle = !_blinkToggle; + } +} + +void SsScene3009SymbolEdges::show() { + setVisible(true); + updatePosition(); + _blinkCountdown = 0; +} + +void SsScene3009SymbolEdges::hide() { + setVisible(false); + updatePosition(); + _blinkCountdown = 0; +} + +void SsScene3009SymbolEdges::startBlinking() { + setVisible(true); + updatePosition(); + _blinkCountdown = 3; + _blinkToggle = true; +} + +SsScene3009TargetLine::SsScene3009TargetLine(NeverhoodEngine *vm, int index) + : StaticSprite(vm, 1400) { + + loadSprite(kSsScene3009TargetLineFileHashes[index], kSLFDefDrawOffset | kSLFDefPosition, 600); + setVisible(false); +} + +void SsScene3009TargetLine::show() { + setVisible(true); + updatePosition(); +} + +SsScene3009SymbolArrow::SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index) + : StaticSprite(vm, 1400), _asSymbol(asSymbol), _index(index), _enabled(true), _countdown(0) { + + _incrDecr = _index % 2; + + createSurface(1200, 33, 31); + loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefPosition); + _drawOffset.set(0, 0, 33, 31); + _collisionBoundsOffset = _drawOffset; + updateBounds(); + _needRefresh = true; + + SetUpdateHandler(&SsScene3009SymbolArrow::update); + SetMessageHandler(&SsScene3009SymbolArrow::handleMessage); + loadSound(0, 0x2C852206); +} + +void SsScene3009SymbolArrow::hide() { + _enabled = false; + setVisible(false); +} + +void SsScene3009SymbolArrow::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + loadSprite(kSsScene3009SymbolArrowFileHashes2[_index], kSLFDefDrawOffset); + } +} + +uint32 SsScene3009SymbolArrow::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_enabled && _countdown == 0) { + _countdown = 2; + loadSprite(kSsScene3009SymbolArrowFileHashes1[_index], kSLFDefDrawOffset); + playSound(0); + sendMessage(_asSymbol, 0x2005, _incrDecr); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene3009VerticalIndicator::AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index) + : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { + + _x = 300; + _y = getGlobalVar(V_CANNON_RAISED) ? 52 : 266; + createSurface1(0xC2463913, 1200); + _needRefresh = true; + updatePosition(); + setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene3009VerticalIndicator::handleMessage); +} + +void AsScene3009VerticalIndicator::show() { + startAnimation(0xC2463913, 0, -1); + setVisible(true); + updatePosition(); + _enabled = true; +} + +uint32 AsScene3009VerticalIndicator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_enabled) { + sendMessage(_parentScene, 0x2002, 0); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene3009HorizontalIndicator::AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus) + : AnimatedSprite(vm, 1000), _parentScene(parentScene), _enabled(false) { + + _x = getGlobalVar(V_CANNON_TURNED) ? 533 : 92; + _y = 150; + createSurface1(0xC0C12954, 1200); + _needRefresh = true; + updatePosition(); + setVisible(false); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene3009HorizontalIndicator::handleMessage); + if (cannonTargetStatus == kCTSRightRobotNoTarget || cannonTargetStatus == kCTSRightRobotIsTarget || cannonTargetStatus == kCTSRightNoRobot) { + SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); + _x = 280; + } +} + +uint32 AsScene3009HorizontalIndicator::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_enabled) { + sendMessage(_parentScene, 0x2004, 0); + } + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene3009HorizontalIndicator::suMoveLeft() { + _x -= 6; + if (_x < 92) { + SetSpriteUpdate(NULL); + _x = 92; + } +} + +void AsScene3009HorizontalIndicator::suMoveRight() { + _x += 6; + if (_x > 533) { + SetSpriteUpdate(NULL); + _x = 533; + } +} + +void AsScene3009HorizontalIndicator::show() { + startAnimation(0xC0C12954, 0, -1); + setVisible(true); + updatePosition(); + _enabled = true; +} + +void AsScene3009HorizontalIndicator::stMoveLeft() { + _x = 533; + SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveLeft); +} + +void AsScene3009HorizontalIndicator::stMoveRight() { + _x = 330; + SetSpriteUpdate(&AsScene3009HorizontalIndicator::suMoveRight); +} + +AsScene3009Symbol::AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _symbolPosition(symbolPosition) { + + _symbolIndex = getSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition); + + _x = kAsScene3009SymbolPoints[_symbolPosition].x; + _y = kAsScene3009SymbolPoints[_symbolPosition].y; + createSurface1(kAsScene3009SymbolFileHashes[_symbolPosition / 3], 1200); + startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); + _newStickFrameIndex = _symbolIndex; + _needRefresh = true; + updatePosition(); + SetUpdateHandler(&AnimatedSprite::update); + SetMessageHandler(&AsScene3009Symbol::handleMessage); + _ssArrowPrev = _parentScene->insertSprite(this, _symbolPosition * 2 + 0); + _parentScene->addCollisionSprite(_ssArrowPrev); + _ssArrowNext = _parentScene->insertSprite(this, _symbolPosition * 2 + 1); + _parentScene->addCollisionSprite(_ssArrowNext); +} + +uint32 AsScene3009Symbol::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x2005: + if (param.asInteger()) { + if (_symbolIndex == 11) + _symbolIndex = 0; + else + _symbolIndex++; + } else { + if (_symbolIndex == 0) + _symbolIndex = 11; + else + _symbolIndex--; + } + startAnimation(kAsScene3009SymbolFileHashes[_symbolPosition / 3], _symbolIndex, -1); + _newStickFrameIndex = _symbolIndex; + setSubVar(VA_CURR_CANNON_SYMBOLS, _symbolPosition, _symbolIndex); + if (_symbolPosition / 3 == 0) { + sendMessage(_parentScene, 0x2001, 0); + } else { + sendMessage(_parentScene, 0x2003, 0); + } + messageResult = 1; + break; + } + return messageResult; +} + +void AsScene3009Symbol::hide() { + _ssArrowPrev->hide(); + _ssArrowNext->hide(); +} + +Scene3009::Scene3009(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _keepVideo(false), _moveCannonLeftFirst(false), + _isTurning(false), _lockSymbolsPart1Countdown(1), _lockSymbolsPart2Countdown(1) { + + _cannonTargetStatus = getGlobalVar(V_CANNON_TARGET_STATUS); + + _vm->gameModule()->initCannonSymbolsPuzzle(); + + setGlobalVar(V_CANNON_SMACKER_NAME, 0); + + _vm->_screen->clear(); + + setBackground(0xD000420C); + setPalette(0xD000420C); + insertPuzzleMouse(0x04208D08, 20, 620); + + _ssFireCannonButton = insertSprite(this); + addCollisionSprite(_ssFireCannonButton); + + _asVerticalIndicator = insertSprite(this, _cannonTargetStatus); + addCollisionSprite(_asVerticalIndicator); + + _asHorizontalIndicator = insertSprite(this, _cannonTargetStatus); + addCollisionSprite(_asHorizontalIndicator); + + if (_cannonTargetStatus != kCTSNull && _cannonTargetStatus != kCTSRightRobotNoTarget && _cannonTargetStatus != kCTSRightRobotIsTarget && _cannonTargetStatus != kCTSRightNoRobot) { + _keepVideo = true; + } else { + _keepVideo = false; + if (_cannonTargetStatus != kCTSNull) { + _asHorizontalIndicator->stMoveRight(); + _isTurning = true; + } + } + + _smackerPlayer = addSmackerPlayer(new SmackerPlayer(_vm, this, kScene3009CannonScopeVideos[_cannonTargetStatus], false, _keepVideo)); + _smackerPlayer->setDrawPos(89, 37); + _palette->usePalette(); // Use it again since the SmackerPlayer overrides the usage + + insertStaticSprite(0x8540252C, 400); + + for (int i = 0; i < 2; i++) { + _ssSymbolEdges[i] = insertSprite(i); + _ssTargetLines[i] = insertSprite(i); + } + + for (int symbolPosition = 0; symbolPosition < 6; symbolPosition++) { + _asSymbols[symbolPosition] = insertSprite(this, symbolPosition); + if (symbolPosition < 3) + _correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_1, symbolPosition); + else + _correctSymbols[symbolPosition] = getSubVar(VA_GOOD_CANNON_SYMBOLS_2, symbolPosition - 3); + } + + SetMessageHandler(&Scene3009::handleMessage); + SetUpdateHandler(&Scene3009::update); + + // DEBUG Enable to set the correct code +#if 0 + for (int i = 0; i < 6; i++) + setSubVar(VA_CURR_CANNON_SYMBOLS, i, _correctSymbols[i]); + sendMessage(this, 0x2003, 0); +#endif + +} + +void Scene3009::update() { + Scene::update(); + + if (!_keepVideo && _smackerPlayer->isDone() && _cannonTargetStatus <= kCTSCount) { + switch (_cannonTargetStatus) { + case kCTSNull: + case kCTSLowerCannon: + _smackerPlayer->open(0x340A0049, true); + _palette->usePalette(); + _keepVideo = true; + break; + case kCTSRightRobotNoTarget: + _smackerPlayer->open(0x0082080D, true); + _palette->usePalette(); + _keepVideo = true; + _isTurning = false; + break; + case kCTSRightRobotIsTarget: + _smackerPlayer->open(0x0282080D, true); + _palette->usePalette(); + _keepVideo = true; + _isTurning = false; + break; + case kCTSRightNoRobot: + _smackerPlayer->open(0x0882080D, true); + _palette->usePalette(); + _keepVideo = true; + _isTurning = false; + break; + case kCTSLeftRobotNoTarget: + case kCTSLeftRobotIsTarget: + case kCTSLeftNoRobot: + if (_moveCannonLeftFirst) { + if (_cannonTargetStatus == kCTSLeftRobotNoTarget) + _smackerPlayer->open(0x110A000F, false); + else if (_cannonTargetStatus == kCTSLeftRobotIsTarget) + _smackerPlayer->open(0x500B004F, false); + else if (_cannonTargetStatus == kCTSLeftNoRobot) + _smackerPlayer->open(0x100B010E, false); + _palette->usePalette(); + _moveCannonLeftFirst = false; + _asHorizontalIndicator->stMoveLeft(); + } else { + playActionVideo(); + } + break; + } + } + + if (_lockSymbolsPart1Countdown != 0 && (--_lockSymbolsPart1Countdown == 0) && isSymbolsPart1Solved()) { + for (int i = 0; i < 3; i++) + _asSymbols[i]->hide(); + if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) { + _ssSymbolEdges[0]->show(); + _ssTargetLines[0]->show(); + _asVerticalIndicator->show(); + } + } + + if (_lockSymbolsPart2Countdown != 0 && (--_lockSymbolsPart2Countdown == 0) && isSymbolsPart2Solved()) { + for (int i = 3; i < 6; i++) + _asSymbols[i]->hide(); + if (!getGlobalVar(V_ROBOT_HIT) || getGlobalVar(V_CANNON_RAISED) || getGlobalVar(V_CANNON_TURNED)) { + _ssSymbolEdges[1]->show(); + _ssTargetLines[1]->show(); + _asHorizontalIndicator->show(); + } + } + +} + +uint32 Scene3009::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && !getGlobalVar(V_CANNON_RAISED)) { + setGlobalVar(V_CANNON_TARGET_STATUS, 0); + leaveScene(0); + } + break; + case 0x2000: + if (!getGlobalVar(V_CANNON_RAISED)) { + if (!getGlobalVar(V_WALL_BROKEN)) { + _cannonTargetStatus = kCTSBreakWall; + setGlobalVar(V_WALL_BROKEN, 1); + } else { + _cannonTargetStatus = kCTSWall; + } + } else if (!getGlobalVar(V_CANNON_TURNED)) { + _cannonTargetStatus = kCTSEmptyness; + } else if (!getGlobalVar(V_ROBOT_TARGET)) { + _cannonTargetStatus = kCTSFireRobotNoTarget; + } else if (!getGlobalVar(V_ROBOT_HIT)) { + setGlobalVar(V_ROBOT_HIT, 1); + _cannonTargetStatus = kCTSFireRobotIsTarget; + } else { + _cannonTargetStatus = kCTSFireNoRobot; + } + playActionVideo(); + break; + case 0x2001: + _lockSymbolsPart1Countdown = 24; + break; + case 0x2002: + // Raise/lower the cannon + if (!getGlobalVar(V_CANNON_TURNED) && !_isTurning) { + if (getGlobalVar(V_CANNON_RAISED)) { + _cannonTargetStatus = kCTSLowerCannon; + setGlobalVar(V_CANNON_RAISED, 0); + } else { + _cannonTargetStatus = kCTSRaiseCannon; + setGlobalVar(V_CANNON_RAISED, 1); + } + playActionVideo(); + } + break; + case 0x2003: + _lockSymbolsPart2Countdown = 24; + break; + case 0x2004: + // Turn the cannon if it's raised + if (getGlobalVar(V_CANNON_RAISED)) { + if (!getGlobalVar(V_CANNON_TURNED)) { + // Cannon is at the left position + if (!getGlobalVar(V_ROBOT_TARGET)) { + _cannonTargetStatus = kCTSRightRobotNoTarget; + } else if (!getGlobalVar(V_ROBOT_HIT)) { + _cannonTargetStatus = kCTSRightRobotIsTarget; + } else { + _cannonTargetStatus = kCTSRightNoRobot; + } + setGlobalVar(V_CANNON_TURNED, 1); + _isTurning = true; + playActionVideo(); + } else { + // Cannon is at the right position + if (!getGlobalVar(V_ROBOT_TARGET)) { + _cannonTargetStatus = kCTSLeftRobotNoTarget; + _smackerPlayer->open(0x108A000F, false); + } else if (!getGlobalVar(V_ROBOT_HIT)) { + _cannonTargetStatus = kCTSLeftRobotIsTarget; + _smackerPlayer->open(0x500B002F, false); + } else { + _cannonTargetStatus = kCTSLeftNoRobot; + _smackerPlayer->open(0x100B008E, false); + } + _palette->usePalette(); + _moveCannonLeftFirst = true; + _isTurning = true; + _keepVideo = false; + setGlobalVar(V_CANNON_TURNED, 0); + } + } + break; + } + return 0; +} + +void Scene3009::playActionVideo() { + setGlobalVar(V_CANNON_TARGET_STATUS, _cannonTargetStatus); + setGlobalVar(V_CANNON_SMACKER_NAME, kScene3009CannonActionVideos[_cannonTargetStatus]); + leaveScene(1); +} + +bool Scene3009::isSymbolsPart1Solved() { + for (int i = 0; i < 3; i++) + if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i)) + return false; + return true; +} + +bool Scene3009::isSymbolsPart2Solved() { + for (int i = 3; i < 6; i++) + if (_correctSymbols[i] != getSubVar(VA_CURR_CANNON_SYMBOLS, i)) + return false; + return true; +} + +bool Scene3009::isTurning() { + return _isTurning; +} + +// Scene3010 + +static const uint32 kScene3010ButtonNameHashes[] = { + 0x304008D2, + 0x40119852, + 0x01180951 +}; + +static const uint32 kScene3010DeadBoltButtonFileHashes1[] = { + 0x301024C2, + 0x20280580, + 0x30200452 +}; + +static const uint32 kScene3010DeadBoltButtonFileHashes2[] = { + 0x50C025A8, + 0x1020A0A0, + 0x5000A7E8 +}; + +static const NPoint kAsScene3010DeadBoltPoints[] = { + {550, 307}, + {564, 415}, + {560, 514} +}; + +static const uint32 kAsScene3010DeadBoltFileHashes2[] = { + 0x181A0042, + 0x580A08F2, + 0x18420076 +}; + +static const uint32 kAsScene3010DeadBoltFileHashes1[] = { + 0x300E105A, + 0x804E0052, + 0x040E485A +}; + +SsScene3010DeadBoltButton::SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled) + : StaticSprite(vm, 900), _parentScene(parentScene), _buttonLocked(false), _countdown1(0), _countdown2(0), _buttonIndex(buttonIndex) { + + _buttonEnabled = getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_buttonIndex]) != 0; + createSurface(400, 88, 95); + setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); + if (initDisabled) + disableButton(); + else if (_buttonEnabled) + _countdown1 = initCountdown * 12 + 1; + loadSound(0, 0xF4217243); + loadSound(1, 0x44049000); + loadSound(2, 0x6408107E); + SetUpdateHandler(&SsScene3010DeadBoltButton::update); + SetMessageHandler(&SsScene3010DeadBoltButton::handleMessage); +} + +void SsScene3010DeadBoltButton::update() { + + if (_countdown1 != 0 && (--_countdown1 == 0)) { + playSound(0); + setVisible(false); + setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); + } + + if (_countdown2 != 0 && (--_countdown2 == 0)) { + setVisible(true); + setSprite(kScene3010DeadBoltButtonFileHashes2[_buttonIndex]); + } + +} + +uint32 SsScene3010DeadBoltButton::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (!_buttonLocked && _countdown1 == 0) { + if (_buttonEnabled) { + playSound(1); + playSound(2); + setVisible(true); + _buttonLocked = true; + sendMessage(_parentScene, 0x2000, _buttonIndex); + } else { + sendMessage(_parentScene, 0x2002, _buttonIndex); + } + _needRefresh = true; + updatePosition(); + } + messageResult = 1; + break; + } + return messageResult; +} + +void SsScene3010DeadBoltButton::disableButton() { + _buttonLocked = true; + setSprite(kScene3010DeadBoltButtonFileHashes1[_buttonIndex]); + setVisible(true); +} + +void SsScene3010DeadBoltButton::setSprite(uint32 fileHash) { + loadSprite(fileHash, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset); +} + +void SsScene3010DeadBoltButton::setCountdown(int count) { + _countdown2 = count * 18 + 1; +} + +AsScene3010DeadBolt::AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked) + : AnimatedSprite(vm, 1100), _parentScene(parentScene), _boltIndex(boltIndex), _soundToggle(true), + _unlocked(false), _locked(false), _countdown(0) { + + _x = kAsScene3010DeadBoltPoints[_boltIndex].x; + _y = kAsScene3010DeadBoltPoints[_boltIndex].y; + + if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[_boltIndex])) { + createSurface1(kAsScene3010DeadBoltFileHashes1[_boltIndex], 1200); + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + loadSound(0, 0x46005BC4); + } else { + createSurface1(kAsScene3010DeadBoltFileHashes2[_boltIndex], 1200); + startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); + loadSound(0, 0x420073DC); + loadSound(1, 0x420073DC); + } + + setVisible(false); + stIdle(); + if (initUnlocked) + unlock(true); + + _needRefresh = true; + AnimatedSprite::updatePosition(); + +} + +void AsScene3010DeadBolt::update() { + updateAnim(); + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + stDisabled(); + } +} + +uint32 AsScene3010DeadBolt::hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = Sprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x3002: + gotoNextState(); + break; + } + return messageResult; +} + +void AsScene3010DeadBolt::stIdle() { + stopAnimation(); + SetUpdateHandler(&AsScene3010DeadBolt::update); + SetMessageHandler(&Sprite::handleMessage); + _locked = false; +} + +void AsScene3010DeadBolt::unlock(bool skipAnim) { + if (!_unlocked) { + setVisible(true); + if (skipAnim) { + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], -1, 0); + _newStickFrameIndex = STICK_LAST_FRAME; + } else { + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); + FinalizeState(&AsScene3010DeadBolt::stIdleMessage); + NextState(&AsScene3010DeadBolt::stIdle); + playSound(0); + } + _unlocked = true; + loadSound(2, 0x4010C345); + } +} + +void AsScene3010DeadBolt::stIdleMessage() { + stopAnimation(); + SetMessageHandler(&Sprite::handleMessage); + sendMessage(_parentScene, 0x2001, _boltIndex); +} + +void AsScene3010DeadBolt::lock() { + if (!_locked) { + _locked = true; + setVisible(true); + startAnimation(kAsScene3010DeadBoltFileHashes2[_boltIndex], 0, -1); + SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); + FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); + NextState(&AsScene3010DeadBolt::stIdle); + if (_soundToggle) { + playSound(0); + } else { + playSound(1); + } + _soundToggle = !_soundToggle; + } +} + +void AsScene3010DeadBolt::setCountdown(int count) { + _countdown = count * 18 + 1; +} + +void AsScene3010DeadBolt::stDisabled() { + setVisible(true); + startAnimation(kAsScene3010DeadBoltFileHashes1[_boltIndex], 0, -1); + SetMessageHandler(&AsScene3010DeadBolt::hmAnimation); + FinalizeState(&AsScene3010DeadBolt::stDisabledMessage); + NextState(&AsScene3010DeadBolt::stIdle); + _playBackwards = true; + playSound(2); +} + +void AsScene3010DeadBolt::stDisabledMessage() { + setVisible(false); + sendMessage(_parentScene, 0x2003, _boltIndex); +} + +Scene3010::Scene3010(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _countdown(0), _doorUnlocked(false), _checkUnlocked(false) { + + int initCountdown = 0; + + // DEBUG Enable to activate all buttons +#if 0 + setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[0], 1); + setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[1], 1); + setSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[2], 1); +#endif + + setBackground(0x80802626); + setPalette(0x80802626); + + for (int i = 0; i < 3; i++) { + _asDeadBolts[i] = insertSprite(this, i, which == 1);//CHECKME + _ssDeadBoltButtons[i] = insertSprite(this, i, initCountdown, which == 1);//CHECKME + addCollisionSprite(_ssDeadBoltButtons[i]); + if (getSubVar(VA_LOCKS_DISABLED, kScene3010ButtonNameHashes[i])) + initCountdown++; + _boltUnlocking[i] = false; + _boltUnlocked[i] = false; + } + + if (which == 0) { + insertPuzzleMouse(0x02622800, 20, 620); + } + + loadSound(0, 0x68E25540); + + SetMessageHandler(&Scene3010::handleMessage); + SetUpdateHandler(&Scene3010::update); + + if (which == 1) { + _checkUnlocked = true; + for (int i = 0; i < 3; i++) { + _boltUnlocked[i] = true; + _ssDeadBoltButtons[i]->setCountdown(i + 1); + _asDeadBolts[i]->setCountdown(i + 1); + } + } + +} + +void Scene3010::update() { + Scene::update(); + if (_checkUnlocked && !_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { + _countdown = 24; + _checkUnlocked = false; + } + if (_countdown != 0 && (--_countdown == 0)) { + leaveScene(_doorUnlocked ? 1 : 0); + } +} + +uint32 Scene3010::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if ((param.asPoint().x <= 20 || param.asPoint().x >= 620) && _countdown == 0 && !_checkUnlocked) { + if (!_boltUnlocking[0] && !_boltUnlocking[1] && !_boltUnlocking[2]) { + showMouse(false); + if (!_boltUnlocked[0] && !_boltUnlocked[1] && !_boltUnlocked[2]) { + _countdown = 1; + } else { + _checkUnlocked = true; + for (int i = 0; i < 3; i++) { + _ssDeadBoltButtons[i]->setCountdown(i); + if (_boltUnlocked[i]) { + _asDeadBolts[i]->setCountdown(i); + } + } + } + } + } + break; + case 0x2000: + if (!_boltUnlocked[param.asInteger()] && !_checkUnlocked && _countdown == 0) { + _asDeadBolts[param.asInteger()]->unlock(false); + _boltUnlocking[param.asInteger()] = true; + } + break; + case 0x2001: + _boltUnlocked[param.asInteger()] = true; + _boltUnlocking[param.asInteger()] = false; + if (_boltUnlocked[0] && _boltUnlocked[1] && _boltUnlocked[2]) { + if (!getGlobalVar(V_BOLT_DOOR_UNLOCKED)) { + setGlobalVar(V_BOLT_DOOR_UNLOCKED, 1); + playSound(0); + _countdown = 60; + } else { + _countdown = 48; + } + _doorUnlocked = true; + } + break; + case 0x2002: + if (!_checkUnlocked && _countdown == 0) { + _asDeadBolts[param.asInteger()]->lock(); + } + break; + case 0x2003: + _boltUnlocked[param.asInteger()] = false; + break; + } + return 0; +} + +// Scene3011 + +static const uint32 kAsScene3011SymbolFileHashes[] = { + 0x00C88050, + 0x01488050, + 0x02488050, + 0x04488050, + 0x08488050, + 0x10488050, + 0x20488050, + 0x40488050, + 0x80488050, + 0x00488051, + 0x00488052, + 0x00488054, + 0x008B0000, + 0x008D0000, + 0x00810000, + 0x00990000, + 0x00A90000, + 0x00C90000, + 0x00090000, + 0x01890000, + 0x02890000, + 0x04890000, + 0x08890000, + 0x10890000 +}; + +SsScene3011Button::SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag) + : StaticSprite(vm, 1400), _parentScene(parentScene), _countdown(0) { + + loadSprite(flag ? 0x11282020 : 0x994D0433, kSLFDefDrawOffset | kSLFDefPosition | kSLFDefCollisionBoundsOffset, 400); + setVisible(false); + loadSound(0, 0x44061000); + SetUpdateHandler(&SsScene3011Button::update); + SetMessageHandler(&SsScene3011Button::handleMessage); +} + +void SsScene3011Button::update() { + updatePosition(); + if (_countdown != 0 && (--_countdown == 0)) { + setVisible(false); + } +} + +uint32 SsScene3011Button::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + uint32 messageResult = 0; + StaticSprite::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x1011: + if (_countdown == 0) { + setVisible(true); + _countdown = 4; + sendMessage(_parentScene, 0x2000, 0); + playSound(0); + } + messageResult = 1; + break; + } + return messageResult; +} + +AsScene3011Symbol::AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol) + : AnimatedSprite(vm, 1000), _symbolIndex(symbolIndex), _largeSymbol(largeSymbol), _isNoisy(false) { + + if (_largeSymbol) { + _x = 310; + _y = 200; + createSurface1(kAsScene3011SymbolFileHashes[_symbolIndex], 1200); + loadSound(0, 0x6052C60F); + loadSound(1, 0x6890433B); + } else { + _symbolIndex = 12; + _x = symbolIndex * 39 + 96; + _y = 225; + createSurface(1200, 41, 48); + loadSound(0, 0x64428609); + loadSound(1, 0x7080023B); + } + setVisible(false); + _needRefresh = true; + SetUpdateHandler(&AnimatedSprite::update); +} + +void AsScene3011Symbol::show(bool isNoisy) { + _isNoisy = isNoisy; + startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1); + setVisible(true); + if (_isNoisy) { + playSound(1); + } else { + playSound(0); + } +} + +void AsScene3011Symbol::hide() { + stopAnimation(); + setVisible(false); +} + +void AsScene3011Symbol::stopSymbolSound() { + if (_isNoisy) { + stopSound(1); + } else { + stopSound(0); + } +} + +void AsScene3011Symbol::change(int symbolIndex, bool isNoisy) { + _symbolIndex = symbolIndex; + _isNoisy = isNoisy; + startAnimation(kAsScene3011SymbolFileHashes[_symbolIndex], 0, -1); + setVisible(true); + if (_isNoisy) { + playSound(1); + } else { + playSound(0); + } +} + +Scene3011::Scene3011(NeverhoodEngine *vm, Module *parentModule, int which) + : Scene(vm, parentModule), _updateStatus(0), _buttonClicked(false), _currentSymbolIndex(0), _countdown(0) { + + _vm->gameModule()->initCodeSymbolsPuzzle(); + _noisySymbolIndex = getGlobalVar(V_NOISY_SYMBOL_INDEX); + + SetMessageHandler(&Scene3011::handleMessage); + SetUpdateHandler(&Scene3011::update); + + setBackground(0x92124A04); + setPalette(0xA4070114); + addEntity(_palette); + + insertPuzzleMouse(0x24A00929, 20, 620); + + for (int symbolIndex = 0; symbolIndex < 12; symbolIndex++) + _asSymbols[symbolIndex] = insertSprite(symbolIndex, true); + + _ssButton = insertSprite(this, true); + addCollisionSprite(_ssButton); + +} + +void Scene3011::update() { + Scene::update(); + + if (_countdown != 0 && (--_countdown == 0)) { + switch (_updateStatus) { + case 0: + if (_buttonClicked) { + if (_noisySymbolIndex == _currentSymbolIndex) { + do { + _noisyRandomSymbolIndex = _vm->_rnd->getRandomNumber(12 - 1); + } while (_noisySymbolIndex == _noisyRandomSymbolIndex); + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->show(true); + } else { + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->show(false); + } + _updateStatus = 1; + _countdown = 24; + fadeIn(); + _buttonClicked = false; + } + break; + case 1: + _updateStatus = 2; + _countdown = 24; + break; + case 2: + fadeOut(); + _updateStatus = 3; + _countdown = 24; + break; + case 3: + _updateStatus = 0; + _countdown = 1; + if (_noisySymbolIndex == _currentSymbolIndex) { + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _noisyRandomSymbolIndex)]->hide(); + } else { + _asSymbols[getSubVar(VA_CODE_SYMBOLS, _currentSymbolIndex)]->hide(); + } + _currentSymbolIndex++; + if (_currentSymbolIndex >= 12) + _currentSymbolIndex = 0; + break; + } + } +} + +uint32 Scene3011::handleMessage(int messageNum, const MessageParam ¶m, Entity *sender) { + Scene::handleMessage(messageNum, param, sender); + switch (messageNum) { + case 0x0001: + if (param.asPoint().x <= 20 || param.asPoint().x >= 620) { + leaveScene(0); + } + break; + case 0x2000: + _buttonClicked = true; + if (_countdown == 0) + _countdown = 1; + break; + } + return 0; +} + +void Scene3011::fadeIn() { + _palette->addBasePalette(0x92124A04, 0, 256, 0); + _palette->startFadeToPalette(24); +} + +void Scene3011::fadeOut() { + _palette->addBasePalette(0xA4070114, 0, 256, 0); + _palette->startFadeToPalette(24); +} + +} // End of namespace Neverhood diff --git a/engines/neverhood/modules/module3000.h b/engines/neverhood/modules/module3000.h new file mode 100644 index 0000000000..7634360d7c --- /dev/null +++ b/engines/neverhood/modules/module3000.h @@ -0,0 +1,255 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef NEVERHOOD_MODULES_MODULE3000_H +#define NEVERHOOD_MODULES_MODULE3000_H + +#include "neverhood/neverhood.h" +#include "neverhood/module.h" +#include "neverhood/scene.h" +#include "neverhood/modules/module1200.h" + +namespace Neverhood { + +class Module3000 : public Module { +public: + Module3000(NeverhoodEngine *vm, Module *parentModule, int which); + virtual ~Module3000(); +protected: + int _soundVolume; + bool _isWallBroken; + void createScene(int sceneNum, int which); + void updateScene(); +}; + +// Scene3009 + +class Scene3009; + +class SsScene3009FireCannonButton : public StaticSprite { +public: + SsScene3009FireCannonButton(NeverhoodEngine *vm, Scene3009 *parentScene); +protected: + Scene3009 *_parentScene; + bool _isClicked; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene3009SymbolEdges : public StaticSprite { +public: + SsScene3009SymbolEdges(NeverhoodEngine *vm, int index); + void show(); + void hide(); + void startBlinking(); +protected: + int _blinkCountdown; + bool _blinkToggle; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class SsScene3009TargetLine : public StaticSprite { +public: + SsScene3009TargetLine(NeverhoodEngine *vm, int index); + void show(); +}; + +class SsScene3009SymbolArrow : public StaticSprite { +public: + SsScene3009SymbolArrow(NeverhoodEngine *vm, Sprite *asSymbol, int index); + void hide(); +protected: + Sprite *_asSymbol; + int _index; + int _incrDecr; + bool _enabled; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene3009VerticalIndicator : public AnimatedSprite { +public: + AsScene3009VerticalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, int index); + void show(); +protected: + Scene3009 *_parentScene; + bool _enabled; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene3009HorizontalIndicator : public AnimatedSprite { +public: + AsScene3009HorizontalIndicator(NeverhoodEngine *vm, Scene3009 *parentScene, uint32 cannonTargetStatus); + void show(); + void stMoveLeft(); + void stMoveRight(); +protected: + Scene3009 *_parentScene; + bool _enabled; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void suMoveLeft(); + void suMoveRight(); +}; + +class AsScene3009Symbol : public AnimatedSprite { +public: + AsScene3009Symbol(NeverhoodEngine *vm, Scene3009 *parentScene, int symbolPosition); + void hide(); +protected: + Scene3009 *_parentScene; + int _symbolPosition; + uint32 _symbolIndex; + SsScene3009SymbolArrow *_ssArrowPrev; + SsScene3009SymbolArrow *_ssArrowNext; + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class Scene3009 : public Scene { +public: + Scene3009(NeverhoodEngine *vm, Module *parentModule, int which); + bool isTurning(); +protected: + int _lockSymbolsPart1Countdown; + int _lockSymbolsPart2Countdown; + SmackerPlayer *_smackerPlayer; + Sprite *_ssFireCannonButton; + SsScene3009SymbolEdges *_ssSymbolEdges[2]; + SsScene3009TargetLine *_ssTargetLines[2]; + AsScene3009VerticalIndicator *_asVerticalIndicator; + AsScene3009HorizontalIndicator *_asHorizontalIndicator; + AsScene3009Symbol *_asSymbols[6]; + uint32 _cannonTargetStatus; + uint32 _correctSymbols[6]; + bool _keepVideo; + bool _moveCannonLeftFirst; + bool _isTurning; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void playActionVideo(); + bool isSymbolsPart1Solved(); + bool isSymbolsPart2Solved(); +}; + +// Scene3010 + +class SsScene3010DeadBoltButton : public StaticSprite { +public: + SsScene3010DeadBoltButton(NeverhoodEngine *vm, Scene *parentScene, int buttonIndex, int initCountdown, bool initDisabled); + void setCountdown(int count); +protected: + Scene *_parentScene; + int _buttonIndex; + bool _buttonEnabled; + bool _buttonLocked; + int _countdown1; + int _countdown2; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void disableButton(); + void setSprite(uint32 fileHash); +}; + +class AsScene3010DeadBolt : public AnimatedSprite { +public: + AsScene3010DeadBolt(NeverhoodEngine *vm, Scene *parentScene, int boltIndex, bool initUnlocked); + void setCountdown(int count); + void lock(); + void unlock(bool skipAnim); +protected: + Scene *_parentScene; + int _boltIndex; + int _countdown; + bool _soundToggle; + bool _unlocked; + bool _locked; + void update(); + uint32 hmAnimation(int messageNum, const MessageParam ¶m, Entity *sender); + void stIdle(); + void stIdleMessage(); + void stDisabled(); + void stDisabledMessage(); +}; + +class Scene3010 : public Scene { +public: + Scene3010(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + int _countdown; + bool _doorUnlocked; + bool _checkUnlocked; + SsScene3010DeadBoltButton *_ssDeadBoltButtons[3]; + AsScene3010DeadBolt *_asDeadBolts[3]; + bool _boltUnlocked[3]; + bool _boltUnlocking[3]; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +// Scene3011 + +class SsScene3011Button : public StaticSprite { +public: + SsScene3011Button(NeverhoodEngine *vm, Scene *parentScene, bool flag); +protected: + Scene *_parentScene; + int _countdown; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); +}; + +class AsScene3011Symbol : public AnimatedSprite { +public: + AsScene3011Symbol(NeverhoodEngine *vm, int symbolIndex, bool largeSymbol); + void show(bool isNoisy); + void hide(); + void stopSymbolSound(); + void change(int symbolIndex, bool isNoisy); + int getSymbolIndex() { return _largeSymbol ? _symbolIndex : _symbolIndex - 12; } +protected: + bool _largeSymbol; + bool _isNoisy; + int _symbolIndex; +}; + +class Scene3011 : public Scene { +public: + Scene3011(NeverhoodEngine *vm, Module *parentModule, int which); +protected: + Sprite *_ssButton; + AsScene3011Symbol *_asSymbols[12]; + int _updateStatus; + bool _buttonClicked; + int _countdown; + int _noisySymbolIndex; + int _currentSymbolIndex; + int _noisyRandomSymbolIndex; + void update(); + uint32 handleMessage(int messageNum, const MessageParam ¶m, Entity *sender); + void fadeIn(); + void fadeOut(); +}; + +} // End of namespace Neverhood + +#endif /* NEVERHOOD_MODULES_MODULE3000_H */ -- cgit v1.2.3 From 163023a8ed85b68ed877e1f3bf2e16cb1ef86862 Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 5 May 2013 12:04:57 +0200 Subject: NEVERHOOD: Fix issues in the save/load screens - Add virtual keyboard support in save/load screens --- engines/neverhood/menumodule.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/engines/neverhood/menumodule.cpp b/engines/neverhood/menumodule.cpp index d4882c395a..a8631cb0d6 100644 --- a/engines/neverhood/menumodule.cpp +++ b/engines/neverhood/menumodule.cpp @@ -253,7 +253,7 @@ void MenuModule::handleDeleteGameMenuAction(bool doDelete) { void MenuModule::loadSavegameList() { - Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::SaveFileManager *saveFileMan = _vm->_system->getSavefileManager(); Neverhood::NeverhoodEngine::SaveHeader header; Common::String pattern = _vm->getTargetName(); pattern += ".???"; @@ -606,22 +606,28 @@ void TextEditWidget::initialize() { _parentScene, _baseObjectPriority + 1, _baseSurfacePriority + 1, (const byte*)_entryString.c_str(), _entryString.size(), _surface, _x, _y, _fontSurface); _textLabelWidget->initialize(); - cursorSpriteResource.load(_cursorFileHash, true); - _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); - _cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); - _cursorSurface->setVisible(!_readOnly); + if (_cursorFileHash != 0) { + cursorSpriteResource.load(_cursorFileHash, true); + _cursorSurface = new BaseSurface(_vm, 0, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); + _cursorSurface->drawSpriteResourceEx(cursorSpriteResource, false, false, cursorSpriteResource.getDimensions().width, cursorSpriteResource.getDimensions().height); + _cursorSurface->setVisible(!_readOnly); + } refresh(); } void TextEditWidget::enterWidget() { - if (!_readOnly) + if (!_readOnly) { _cursorSurface->setVisible(true); + _vm->_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, true); + } refresh(); } void TextEditWidget::exitWidget() { - if (!_readOnly) + if (!_readOnly) { _cursorSurface->setVisible(false); + _vm->_system->setFeatureState(OSystem::kFeatureVirtualKeyboard, false); + } refresh(); } @@ -709,7 +715,8 @@ void TextEditWidget::handleKeyDown(Common::KeyCode keyCode) { void TextEditWidget::refresh() { refreshPosition(); updateString(); - drawCursor(); + if (_cursorFileHash != 0) + drawCursor(); } void TextEditWidget::update() { @@ -750,7 +757,9 @@ void SavegameListBox::onClick() { mousePos.y -= _y + _rect.y1; if (mousePos.x >= 0 && mousePos.x <= _rect.x2 - _rect.x1 && mousePos.y >= 0 && mousePos.y <= _rect.y2 - _rect.y1) { - int newIndex = _firstVisibleItem + mousePos.y / _fontSurface->getCharHeight(); + // We add 1 to the char height to ensure that the correct entry is chosen if the + // user clicks at the bottom the text entry + int newIndex = _firstVisibleItem + mousePos.y / (_fontSurface->getCharHeight() + 1); if (newIndex <= _lastVisibleItem) { _currIndex = newIndex; refresh(); @@ -769,7 +778,7 @@ void SavegameListBox::initialize() { _surface->setVisible(true); buildItems(); _firstVisibleItem = 0; - _lastVisibleItem = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size()); + _lastVisibleItem = MIN(_maxVisibleItemsCount, (int)_textLabelItems.size()) - 1; refresh(); } @@ -789,7 +798,7 @@ void SavegameListBox::buildItems() { void SavegameListBox::drawItems() { for (int i = 0; i < (int)_textLabelItems.size(); ++i) { TextLabelWidget *label = _textLabelItems[i]; - if (i >= _firstVisibleItem && i < _lastVisibleItem) { + if (i >= _firstVisibleItem && i <= _lastVisibleItem) { label->setY(_rect.y1 + (i - _firstVisibleItem) * _fontSurface->getCharHeight()); label->updateBounds(); label->drawString(_maxStringLength); -- cgit v1.2.3 From fb0332d8842d7a87435f80a54c91a3a8b324bc8e Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 5 May 2013 12:07:49 +0200 Subject: NEVERHOOD: Fix deletes in SpriteResource::unload() and ResourceMan::purgeResources() --- engines/neverhood/resource.cpp | 1 - engines/neverhood/resourceman.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/engines/neverhood/resource.cpp b/engines/neverhood/resource.cpp index 22a802807b..442713196e 100644 --- a/engines/neverhood/resource.cpp +++ b/engines/neverhood/resource.cpp @@ -63,7 +63,6 @@ bool SpriteResource::load(uint32 fileHash, bool doLoadPosition) { void SpriteResource::unload() { _vm->_res->unloadResource(_resourceHandle); - delete[] _pixels; _pixels = NULL; _rle = false; } diff --git a/engines/neverhood/resourceman.cpp b/engines/neverhood/resourceman.cpp index f662130ea8..d5e7786c17 100644 --- a/engines/neverhood/resourceman.cpp +++ b/engines/neverhood/resourceman.cpp @@ -119,7 +119,7 @@ void ResourceMan::purgeResources() { for (Common::HashMap::iterator it = _data.begin(); it != _data.end(); ++it) { ResourceData *resourceData = (*it)._value; if (resourceData->dataRefCount == 0) { - delete resourceData->data; + delete[] resourceData->data; resourceData->data = NULL; } } -- cgit v1.2.3 From 32c21754e20afd589556ea862876c6e304b3326b Mon Sep 17 00:00:00 2001 From: johndoe123 Date: Sun, 5 May 2013 12:09:13 +0200 Subject: NEVERHOOD: Fix member var initializations --- engines/neverhood/scene.cpp | 3 ++- engines/neverhood/screen.cpp | 2 +- engines/neverhood/sound.cpp | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/engines/neverhood/scene.cpp b/engines/neverhood/scene.cpp index 2705668c00..07d41754c9 100644 --- a/engines/neverhood/scene.cpp +++ b/engines/neverhood/scene.cpp @@ -25,7 +25,8 @@ namespace Neverhood { Scene::Scene(NeverhoodEngine *vm, Module *parentModule) - : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL) { + : Entity(vm, 0), _parentModule(parentModule), _dataResource(vm), _hitRects(NULL), + _mouseCursorWasVisible(true) { _isKlaymenBusy = false; _doConvertMessages = false; diff --git a/engines/neverhood/screen.cpp b/engines/neverhood/screen.cpp index 25b4109980..5a748cfab4 100644 --- a/engines/neverhood/screen.cpp +++ b/engines/neverhood/screen.cpp @@ -27,7 +27,7 @@ namespace Neverhood { Screen::Screen(NeverhoodEngine *vm) : _vm(vm), _paletteData(NULL), _paletteChanged(false), _smackerDecoder(NULL), - _yOffset(0) { + _yOffset(0), _fullRefresh(false) { _ticks = _vm->_system->getMillis(); diff --git a/engines/neverhood/sound.cpp b/engines/neverhood/sound.cpp index a479bf26f9..c84b751e44 100644 --- a/engines/neverhood/sound.cpp +++ b/engines/neverhood/sound.cpp @@ -185,7 +185,7 @@ SoundItem::SoundItem(NeverhoodEngine *vm, uint32 groupNameHash, uint32 soundFile bool playOnceAfterCountdown, int16 initialCountdown, bool playLooping, int16 currCountdown) : _vm(vm), _soundResource(NULL), _groupNameHash(groupNameHash), _fileHash(soundFileHash), _playOnceAfterRandomCountdown(false), _minCountdown(0), _maxCountdown(0), - _playOnceAfterCountdown(_playOnceAfterCountdown), _initialCountdown(initialCountdown), + _playOnceAfterCountdown(playOnceAfterCountdown), _initialCountdown(initialCountdown), _playLooping(false), _currCountdown(currCountdown) { _soundResource = new SoundResource(vm); @@ -607,7 +607,7 @@ bool AudioResourceManSoundItem::isPlaying() { AudioResourceManMusicItem::AudioResourceManMusicItem(NeverhoodEngine *vm, uint32 fileHash) : _vm(vm), _fileHash(fileHash), _terminate(false), _canRestart(false), - _volume(100), _panning(50), _start(false), _isFadingIn(false), _isFadingOut(false) { + _volume(100), _panning(50), _start(false), _isFadingIn(false), _isFadingOut(false), _isPlaying(false) { } -- cgit v1.2.3